@metamask/ramps-controller 17.0.0 → 17.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/dist/RampsController-method-action-types.cjs.map +1 -1
  3. package/dist/RampsController-method-action-types.d.cts +15 -1
  4. package/dist/RampsController-method-action-types.d.cts.map +1 -1
  5. package/dist/RampsController-method-action-types.d.mts +15 -1
  6. package/dist/RampsController-method-action-types.d.mts.map +1 -1
  7. package/dist/RampsController-method-action-types.mjs.map +1 -1
  8. package/dist/RampsController.cjs +74 -38
  9. package/dist/RampsController.cjs.map +1 -1
  10. package/dist/RampsController.d.cts +14 -3
  11. package/dist/RampsController.d.cts.map +1 -1
  12. package/dist/RampsController.d.mts +14 -3
  13. package/dist/RampsController.d.mts.map +1 -1
  14. package/dist/RampsController.mjs +44 -8
  15. package/dist/RampsController.mjs.map +1 -1
  16. package/dist/RampsService-method-action-types.cjs.map +1 -1
  17. package/dist/RampsService-method-action-types.d.cts.map +1 -1
  18. package/dist/RampsService-method-action-types.d.mts.map +1 -1
  19. package/dist/RampsService-method-action-types.mjs.map +1 -1
  20. package/dist/RampsService.cjs.map +1 -1
  21. package/dist/RampsService.d.cts.map +1 -1
  22. package/dist/RampsService.d.mts.map +1 -1
  23. package/dist/RampsService.mjs.map +1 -1
  24. package/dist/RequestCache.cjs.map +1 -1
  25. package/dist/RequestCache.d.cts.map +1 -1
  26. package/dist/RequestCache.d.mts.map +1 -1
  27. package/dist/RequestCache.mjs.map +1 -1
  28. package/dist/TransakService-method-action-types.cjs.map +1 -1
  29. package/dist/TransakService-method-action-types.d.cts +35 -1
  30. package/dist/TransakService-method-action-types.d.cts.map +1 -1
  31. package/dist/TransakService-method-action-types.d.mts +35 -1
  32. package/dist/TransakService-method-action-types.d.mts.map +1 -1
  33. package/dist/TransakService-method-action-types.mjs.map +1 -1
  34. package/dist/TransakService.cjs +128 -12
  35. package/dist/TransakService.cjs.map +1 -1
  36. package/dist/TransakService.d.cts +41 -3
  37. package/dist/TransakService.d.cts.map +1 -1
  38. package/dist/TransakService.d.mts +41 -3
  39. package/dist/TransakService.d.mts.map +1 -1
  40. package/dist/TransakService.mjs +123 -10
  41. package/dist/TransakService.mjs.map +1 -1
  42. package/dist/featureFlags.cjs +144 -17
  43. package/dist/featureFlags.cjs.map +1 -1
  44. package/dist/featureFlags.d.cts +65 -11
  45. package/dist/featureFlags.d.cts.map +1 -1
  46. package/dist/featureFlags.d.mts +65 -11
  47. package/dist/featureFlags.d.mts.map +1 -1
  48. package/dist/featureFlags.mjs +140 -16
  49. package/dist/featureFlags.mjs.map +1 -1
  50. package/dist/index.cjs +52 -49
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.d.cts +2 -2
  53. package/dist/index.d.cts.map +1 -1
  54. package/dist/index.d.mts +2 -2
  55. package/dist/index.d.mts.map +1 -1
  56. package/dist/index.mjs +1 -1
  57. package/dist/index.mjs.map +1 -1
  58. package/dist/providerAvailability.cjs.map +1 -1
  59. package/dist/providerAvailability.d.cts.map +1 -1
  60. package/dist/providerAvailability.d.mts.map +1 -1
  61. package/dist/providerAvailability.mjs.map +1 -1
  62. package/dist/quoteClassification.cjs.map +1 -1
  63. package/dist/quoteClassification.d.cts.map +1 -1
  64. package/dist/quoteClassification.d.mts.map +1 -1
  65. package/dist/quoteClassification.mjs.map +1 -1
  66. package/dist/selectors.cjs +3 -3
  67. package/dist/selectors.cjs.map +1 -1
  68. package/dist/selectors.d.cts.map +1 -1
  69. package/dist/selectors.d.mts.map +1 -1
  70. package/dist/selectors.mjs.map +1 -1
  71. package/dist/transakApiErrorUtils.cjs +5 -5
  72. package/dist/transakApiErrorUtils.cjs.map +1 -1
  73. package/dist/transakApiErrorUtils.mjs.map +1 -1
  74. package/package.json +8 -6
@@ -10,16 +10,16 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
11
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
12
  };
13
- var _RampsController_instances, _RampsController_requestCacheTTL, _RampsController_requestCacheMaxSize, _RampsController_getDefaultRedirectUrl, _RampsController_pendingRequests, _RampsController_pendingResourceCount, _RampsController_pendingResourceGeneration, _RampsController_orderPollingMeta, _RampsController_orderPollingTimer, _RampsController_isPolling, _RampsController_initPromise, _RampsController_clearPendingResourceCountForDependentResources, _RampsController_abortDependentRequests, _RampsController_isAllProvidersEnabled, _RampsController_mutateRequests, _RampsController_removeRequestState, _RampsController_cleanupState, _RampsController_requireRegion, _RampsController_isRegionCurrent, _RampsController_isTokenCurrent, _RampsController_isProviderCurrent, _RampsController_updateResourceField, _RampsController_setResourceLoading, _RampsController_setResourceError, _RampsController_updateRequestState, _RampsController_runInit, _RampsController_syncUserRegionFromCountriesCatalog, _RampsController_pickWidenedQuote, _RampsController_getSupportingProvidersForRegion, _RampsController_filterProviderIdsBySupport, _RampsController_resolveProviderIdsForQuote, _RampsController_getPreferredProviderIdsFromOrders, _RampsController_refreshOrder, _RampsController_pollPendingOrders, _RampsController_syncTransakAuthOnError, _RampsController_getNormalizedTransakError;
13
+ var _RampsController_instances, _RampsController_requestCacheTTL, _RampsController_requestCacheMaxSize, _RampsController_getDefaultRedirectUrl, _RampsController_pendingRequests, _RampsController_pendingResourceCount, _RampsController_pendingResourceGeneration, _RampsController_orderPollingMeta, _RampsController_orderPollingTimer, _RampsController_isPolling, _RampsController_initPromise, _RampsController_clearPendingResourceCountForDependentResources, _RampsController_abortDependentRequests, _RampsController_resolveAllProvidersFlag, _RampsController_mutateRequests, _RampsController_removeRequestState, _RampsController_cleanupState, _RampsController_requireRegion, _RampsController_isRegionCurrent, _RampsController_isTokenCurrent, _RampsController_isProviderCurrent, _RampsController_updateResourceField, _RampsController_setResourceLoading, _RampsController_setResourceError, _RampsController_updateRequestState, _RampsController_runInit, _RampsController_syncUserRegionFromCountriesCatalog, _RampsController_pickWidenedQuote, _RampsController_getSupportingProvidersForRegion, _RampsController_filterProviderIdsBySupport, _RampsController_resolveProviderIdsForQuote, _RampsController_getPreferredProviderIdsFromOrders, _RampsController_refreshOrder, _RampsController_pollPendingOrders, _RampsController_syncTransakAuthOnError, _RampsController_getNormalizedTransakError;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.RampsController = exports.getInternalOrderCode = exports.getDefaultRampsControllerState = exports.RAMPS_CONTROLLER_REQUIRED_SERVICE_ACTIONS = exports.controllerName = void 0;
16
16
  const base_controller_1 = require("@metamask/base-controller");
17
17
  const controller_utils_1 = require("@metamask/controller-utils");
18
- const featureFlags_1 = require("./featureFlags.cjs");
19
- const providerAvailability_1 = require("./providerAvailability.cjs");
20
- const rampsErrorCodes_1 = require("./rampsErrorCodes.cjs");
21
- const RampsService_1 = require("./RampsService.cjs");
22
- const RequestCache_1 = require("./RequestCache.cjs");
18
+ const featureFlags_js_1 = require("./featureFlags.cjs");
19
+ const providerAvailability_js_1 = require("./providerAvailability.cjs");
20
+ const rampsErrorCodes_js_1 = require("./rampsErrorCodes.cjs");
21
+ const RampsService_js_1 = require("./RampsService.cjs");
22
+ const RequestCache_js_1 = require("./RequestCache.cjs");
23
23
  // === GENERAL ===
24
24
  /**
25
25
  * The name of the {@link RampsController}, used to namespace the
@@ -57,6 +57,7 @@ exports.RAMPS_CONTROLLER_REQUIRED_SERVICE_ACTIONS = [
57
57
  'TransakService:getUserLimits',
58
58
  'TransakService:requestOtt',
59
59
  'TransakService:generatePaymentWidgetUrl',
60
+ 'TransakService:createWidgetUrl',
60
61
  'TransakService:submitPurposeOfUsageForm',
61
62
  'TransakService:patchUser',
62
63
  'TransakService:submitSsnDetails',
@@ -85,7 +86,7 @@ function hasHttpStatus(error) {
85
86
  function getRampsErrorInfo(error) {
86
87
  if (error instanceof controller_utils_1.BrokenCircuitError && hasStringMessage(error)) {
87
88
  return {
88
- errorKey: rampsErrorCodes_1.RAMPS_ERROR_CODES.CIRCUIT_BREAKER_OPEN,
89
+ errorKey: rampsErrorCodes_js_1.RAMPS_ERROR_CODES.CIRCUIT_BREAKER_OPEN,
89
90
  message: error.message,
90
91
  };
91
92
  }
@@ -98,7 +99,7 @@ function getRampsErrorInfo(error) {
98
99
  }
99
100
  if (rawMessage?.includes(CIRCUIT_BREAKER_OPEN_ERROR)) {
100
101
  return {
101
- errorKey: rampsErrorCodes_1.RAMPS_ERROR_CODES.CIRCUIT_BREAKER_OPEN,
102
+ errorKey: rampsErrorCodes_js_1.RAMPS_ERROR_CODES.CIRCUIT_BREAKER_OPEN,
102
103
  message: rawMessage,
103
104
  };
104
105
  }
@@ -354,16 +355,16 @@ function getInternalOrderCode(orderOrId) {
354
355
  exports.getInternalOrderCode = getInternalOrderCode;
355
356
  // === ORDER POLLING CONSTANTS ===
356
357
  const TERMINAL_ORDER_STATUSES = new Set([
357
- RampsService_1.RampsOrderStatus.Completed,
358
- RampsService_1.RampsOrderStatus.Failed,
359
- RampsService_1.RampsOrderStatus.Cancelled,
360
- RampsService_1.RampsOrderStatus.IdExpired,
358
+ RampsService_js_1.RampsOrderStatus.Completed,
359
+ RampsService_js_1.RampsOrderStatus.Failed,
360
+ RampsService_js_1.RampsOrderStatus.Cancelled,
361
+ RampsService_js_1.RampsOrderStatus.IdExpired,
361
362
  ]);
362
363
  const PENDING_ORDER_STATUSES = new Set([
363
- RampsService_1.RampsOrderStatus.Pending,
364
- RampsService_1.RampsOrderStatus.Created,
365
- RampsService_1.RampsOrderStatus.Unknown,
366
- RampsService_1.RampsOrderStatus.Precreated,
364
+ RampsService_js_1.RampsOrderStatus.Pending,
365
+ RampsService_js_1.RampsOrderStatus.Created,
366
+ RampsService_js_1.RampsOrderStatus.Unknown,
367
+ RampsService_js_1.RampsOrderStatus.Precreated,
367
368
  ]);
368
369
  const DEFAULT_POLLING_INTERVAL_MS = 30000;
369
370
  const MAX_ERROR_COUNT = 5;
@@ -407,6 +408,7 @@ const MESSENGER_EXPOSED_METHODS = [
407
408
  'transakGetUserLimits',
408
409
  'transakRequestOtt',
409
410
  'transakGeneratePaymentWidgetUrl',
411
+ 'transakCreateWidgetUrl',
410
412
  'transakSubmitPurposeOfUsageForm',
411
413
  'transakPatchUser',
412
414
  'transakSubmitSsnDetails',
@@ -443,7 +445,7 @@ class RampsController extends base_controller_1.BaseController {
443
445
  * redirect URL used for the widened quote fetch when the caller omits
444
446
  * `redirectUrl`. Defaults to a callback returning `undefined`.
445
447
  */
446
- constructor({ messenger, state = {}, requestCacheTTL = RequestCache_1.DEFAULT_REQUEST_CACHE_TTL, requestCacheMaxSize = RequestCache_1.DEFAULT_REQUEST_CACHE_MAX_SIZE, getDefaultRedirectUrl, }) {
448
+ constructor({ messenger, state = {}, requestCacheTTL = RequestCache_js_1.DEFAULT_REQUEST_CACHE_TTL, requestCacheMaxSize = RequestCache_js_1.DEFAULT_REQUEST_CACHE_MAX_SIZE, getDefaultRedirectUrl, }) {
447
449
  super({
448
450
  messenger,
449
451
  metadata: rampsControllerMetadata,
@@ -532,7 +534,7 @@ class RampsController extends base_controller_1.BaseController {
532
534
  // If cache is not expired, return the cached data
533
535
  if (!options?.forceRefresh) {
534
536
  const cached = this.state.requests[cacheKey];
535
- if (cached && !(0, RequestCache_1.isCacheExpired)(cached, ttl)) {
537
+ if (cached && !(0, RequestCache_js_1.isCacheExpired)(cached, ttl)) {
536
538
  return cached.data;
537
539
  }
538
540
  }
@@ -545,7 +547,7 @@ class RampsController extends base_controller_1.BaseController {
545
547
  ? (__classPrivateFieldGet(this, _RampsController_pendingResourceGeneration, "f").get(resourceType) ?? 0)
546
548
  : undefined;
547
549
  // Update state to loading
548
- __classPrivateFieldGet(this, _RampsController_instances, "m", _RampsController_updateRequestState).call(this, cacheKey, (0, RequestCache_1.createLoadingState)());
550
+ __classPrivateFieldGet(this, _RampsController_instances, "m", _RampsController_updateRequestState).call(this, cacheKey, (0, RequestCache_js_1.createLoadingState)());
549
551
  // Set resource-level loading state (only on cache miss). Ref-count so concurrent
550
552
  // requests for the same resource type (different cache keys) keep isLoading true.
551
553
  if (resourceType) {
@@ -562,7 +564,7 @@ class RampsController extends base_controller_1.BaseController {
562
564
  if (abortController.signal.aborted) {
563
565
  throw new Error('Request was aborted');
564
566
  }
565
- __classPrivateFieldGet(this, _RampsController_instances, "m", _RampsController_updateRequestState).call(this, cacheKey, (0, RequestCache_1.createSuccessState)(data, lastFetchedAt));
567
+ __classPrivateFieldGet(this, _RampsController_instances, "m", _RampsController_updateRequestState).call(this, cacheKey, (0, RequestCache_js_1.createSuccessState)(data, lastFetchedAt));
566
568
  if (resourceType) {
567
569
  const isCurrent = !options?.isResultCurrent || options.isResultCurrent();
568
570
  if (isCurrent) {
@@ -576,7 +578,7 @@ class RampsController extends base_controller_1.BaseController {
576
578
  throw error;
577
579
  }
578
580
  const { errorInfo, normalizedError } = getNormalizedRampsError(error);
579
- __classPrivateFieldGet(this, _RampsController_instances, "m", _RampsController_updateRequestState).call(this, cacheKey, (0, RequestCache_1.createErrorState)(errorInfo.message, lastFetchedAt, errorInfo.errorKey));
581
+ __classPrivateFieldGet(this, _RampsController_instances, "m", _RampsController_updateRequestState).call(this, cacheKey, (0, RequestCache_js_1.createErrorState)(errorInfo.message, lastFetchedAt, errorInfo.errorKey));
580
582
  if (resourceType) {
581
583
  const isCurrent = !options?.isResultCurrent || options.isResultCurrent();
582
584
  if (isCurrent) {
@@ -762,7 +764,7 @@ class RampsController extends base_controller_1.BaseController {
762
764
  * @returns An array of countries.
763
765
  */
764
766
  async getCountries(options) {
765
- const cacheKey = (0, RequestCache_1.createCacheKey)('getCountries', []);
767
+ const cacheKey = (0, RequestCache_js_1.createCacheKey)('getCountries', []);
766
768
  const countries = await this.executeRequest(cacheKey, async () => {
767
769
  return this.messenger.call('RampsService:getCountries');
768
770
  }, { ...options, resourceType: 'countries' });
@@ -785,7 +787,7 @@ class RampsController extends base_controller_1.BaseController {
785
787
  async getTokens(region, action = 'buy', options) {
786
788
  const regionToUse = region ?? __classPrivateFieldGet(this, _RampsController_instances, "m", _RampsController_requireRegion).call(this);
787
789
  const normalizedRegion = regionToUse.toLowerCase().trim();
788
- const cacheKey = (0, RequestCache_1.createCacheKey)('getTokens', [
790
+ const cacheKey = (0, RequestCache_js_1.createCacheKey)('getTokens', [
789
791
  normalizedRegion,
790
792
  action,
791
793
  options?.provider,
@@ -850,7 +852,7 @@ class RampsController extends base_controller_1.BaseController {
850
852
  async getProviders(region, options) {
851
853
  const regionToUse = region ?? __classPrivateFieldGet(this, _RampsController_instances, "m", _RampsController_requireRegion).call(this);
852
854
  const normalizedRegion = regionToUse.toLowerCase().trim();
853
- const cacheKey = (0, RequestCache_1.createCacheKey)('getProviders', [
855
+ const cacheKey = (0, RequestCache_js_1.createCacheKey)('getProviders', [
854
856
  normalizedRegion,
855
857
  options?.provider,
856
858
  options?.crypto,
@@ -890,7 +892,7 @@ class RampsController extends base_controller_1.BaseController {
890
892
  const assetIdToUse = options?.assetId ?? this.state.tokens.selected?.assetId ?? '';
891
893
  const providerToUse = options?.provider ?? this.state.providers.selected?.id ?? '';
892
894
  const normalizedRegion = regionCode.toLowerCase().trim();
893
- const cacheKey = (0, RequestCache_1.createCacheKey)('getPaymentMethods', [
895
+ const cacheKey = (0, RequestCache_js_1.createCacheKey)('getPaymentMethods', [
894
896
  normalizedRegion,
895
897
  assetIdToUse,
896
898
  providerToUse,
@@ -1014,7 +1016,13 @@ class RampsController extends base_controller_1.BaseController {
1014
1016
  const wantsAutoSelection = !options.providers &&
1015
1017
  (options.autoSelectProvider === true ||
1016
1018
  options.restrictToKnownOrNativeProviders === true);
1017
- const widenToAllProviders = wantsAutoSelection && __classPrivateFieldGet(this, _RampsController_instances, "m", _RampsController_isAllProvidersEnabled).call(this);
1019
+ // Single flag read per call: the enabled bit and the allowlist come from
1020
+ // the same `RemoteFeatureFlagController` state snapshot, so a flag edit
1021
+ // during the awaited quote fetch cannot produce a mixed read.
1022
+ const { enabled: allProvidersEnabled, allowlist: providerAllowlist } = wantsAutoSelection
1023
+ ? __classPrivateFieldGet(this, _RampsController_instances, "m", _RampsController_resolveAllProvidersFlag).call(this)
1024
+ : { enabled: false, allowlist: undefined };
1025
+ const widenToAllProviders = wantsAutoSelection && allProvidersEnabled;
1018
1026
  let providersToUse;
1019
1027
  let widenedProviderCatalog = this.state.providers.data;
1020
1028
  if (options.providers) {
@@ -1086,7 +1094,7 @@ class RampsController extends base_controller_1.BaseController {
1086
1094
  // (flag off) never injects.
1087
1095
  const effectiveRedirectUrl = options.redirectUrl ??
1088
1096
  (widenToAllProviders ? __classPrivateFieldGet(this, _RampsController_getDefaultRedirectUrl, "f").call(this) : undefined);
1089
- const cacheKey = (0, RequestCache_1.createCacheKey)('getQuotes', [
1097
+ const cacheKey = (0, RequestCache_js_1.createCacheKey)('getQuotes', [
1090
1098
  normalizedRegion,
1091
1099
  normalizedFiat,
1092
1100
  normalizedAssetId,
@@ -1125,6 +1133,7 @@ class RampsController extends base_controller_1.BaseController {
1125
1133
  amount: options.amount,
1126
1134
  fiat: normalizedFiat,
1127
1135
  providers: widenedProviderCatalog,
1136
+ allowlist: providerAllowlist,
1128
1137
  });
1129
1138
  if (!selectedQuote) {
1130
1139
  // No quote fits the published provider limits: surface "no quote"
@@ -1263,7 +1272,7 @@ class RampsController extends base_controller_1.BaseController {
1263
1272
  logos: { light: '', dark: '', height: 0, width: 0 },
1264
1273
  },
1265
1274
  walletAddress,
1266
- status: RampsService_1.RampsOrderStatus.Precreated,
1275
+ status: RampsService_js_1.RampsOrderStatus.Precreated,
1267
1276
  orderType: 'buy',
1268
1277
  createdAt: Date.now(),
1269
1278
  isOnlyLink: false,
@@ -1621,6 +1630,25 @@ class RampsController extends base_controller_1.BaseController {
1621
1630
  transakGeneratePaymentWidgetUrl(ottToken, quote, walletAddress, extraParams) {
1622
1631
  return this.messenger.call('TransakService:generatePaymentWidgetUrl', ottToken, quote, walletAddress, extraParams);
1623
1632
  }
1633
+ /**
1634
+ * Creates a Transak payment widget URL via the ramps API proxy, which
1635
+ * injects the partner API key server-side. Replaces the OTT flow
1636
+ * ({@link transakRequestOtt} + {@link transakGeneratePaymentWidgetUrl}).
1637
+ *
1638
+ * @param quote - The buy quote to pre-fill in the widget.
1639
+ * @param walletAddress - The destination wallet address.
1640
+ * @param extraParams - Optional additional widget parameters (e.g. theming).
1641
+ * @returns The single-use widget URL.
1642
+ */
1643
+ async transakCreateWidgetUrl(quote, walletAddress, extraParams) {
1644
+ try {
1645
+ return await this.messenger.call('TransakService:createWidgetUrl', quote, walletAddress, extraParams);
1646
+ }
1647
+ catch (error) {
1648
+ throw __classPrivateFieldGet(this, _RampsController_instances, "m", _RampsController_getNormalizedTransakError).call(this, error, { syncAuth: true })
1649
+ .normalizedError;
1650
+ }
1651
+ }
1624
1652
  /**
1625
1653
  * Submits the user's purpose of usage form for KYC compliance.
1626
1654
  *
@@ -1773,13 +1801,16 @@ _RampsController_requestCacheTTL = new WeakMap(), _RampsController_requestCacheM
1773
1801
  __classPrivateFieldGet(this, _RampsController_instances, "m", _RampsController_removeRequestState).call(this, cacheKey);
1774
1802
  }
1775
1803
  }
1776
- }, _RampsController_isAllProvidersEnabled = function _RampsController_isAllProvidersEnabled() {
1804
+ }, _RampsController_resolveAllProvidersFlag = function _RampsController_resolveAllProvidersFlag() {
1777
1805
  try {
1778
1806
  const remoteFeatureFlagState = this.messenger.call('RemoteFeatureFlagController:getState');
1779
- return (0, featureFlags_1.isHeadlessAllProvidersEnabled)(remoteFeatureFlagState);
1807
+ return {
1808
+ enabled: (0, featureFlags_js_1.isHeadlessAllProvidersEnabled)(remoteFeatureFlagState),
1809
+ allowlist: (0, featureFlags_js_1.getHeadlessProviderAllowlist)(remoteFeatureFlagState),
1810
+ };
1780
1811
  }
1781
1812
  catch {
1782
- return false;
1813
+ return { enabled: false };
1783
1814
  }
1784
1815
  }, _RampsController_mutateRequests = function _RampsController_mutateRequests(fn) {
1785
1816
  this.update((state) => {
@@ -1830,8 +1861,8 @@ _RampsController_requestCacheTTL = new WeakMap(), _RampsController_requestCacheM
1830
1861
  const keys = Object.keys(requests);
1831
1862
  for (const key of keys) {
1832
1863
  const entry = requests[key];
1833
- if (entry?.status === RequestCache_1.RequestStatus.SUCCESS &&
1834
- (0, RequestCache_1.isCacheExpired)(entry, ttl)) {
1864
+ if (entry?.status === RequestCache_js_1.RequestStatus.SUCCESS &&
1865
+ (0, RequestCache_js_1.isCacheExpired)(entry, ttl)) {
1835
1866
  delete requests[key];
1836
1867
  }
1837
1868
  }
@@ -1892,8 +1923,13 @@ _RampsController_requestCacheTTL = new WeakMap(), _RampsController_requestCacheM
1892
1923
  this.update((state) => {
1893
1924
  state.userRegion = userRegion;
1894
1925
  });
1895
- }, _RampsController_pickWidenedQuote = function _RampsController_pickWidenedQuote(response, { amount, fiat, providers, }) {
1926
+ }, _RampsController_pickWidenedQuote = function _RampsController_pickWidenedQuote(response, { amount, fiat, providers, allowlist, }) {
1896
1927
  const providerByCode = new Map(providers.map((provider) => [provider.id, provider]));
1928
+ const allowedProviderIds = allowlist && allowlist.length > 0
1929
+ ? new Set(allowlist.map(featureFlags_js_1.normalizeHeadlessProviderId))
1930
+ : undefined;
1931
+ const isAllowedProvider = (quote) => !allowedProviderIds ||
1932
+ allowedProviderIds.has((0, featureFlags_js_1.normalizeHeadlessProviderId)(quote.provider));
1897
1933
  const fitsProviderLimits = (quote) => {
1898
1934
  const provider = providerByCode.get(quote.provider);
1899
1935
  const limit = provider?.limits?.fiat?.[fiat]?.[quote.quote.paymentMethod];
@@ -1904,7 +1940,7 @@ _RampsController_requestCacheTTL = new WeakMap(), _RampsController_requestCacheM
1904
1940
  }
1905
1941
  return amount >= limit.minAmount && amount <= limit.maxAmount;
1906
1942
  };
1907
- const candidates = response.success.filter(fitsProviderLimits);
1943
+ const candidates = response.success.filter((quote) => isAllowedProvider(quote) && fitsProviderLimits(quote));
1908
1944
  if (candidates.length === 0) {
1909
1945
  return undefined;
1910
1946
  }
@@ -1952,7 +1988,7 @@ async function _RampsController_getSupportingProvidersForRegion({ assetId, regio
1952
1988
  // Case-insensitive CAIP-19 matching is shared with headless-buy consumers
1953
1989
  // via `getProvidersServingAsset`, so the controller and the UI region gate
1954
1990
  // cannot disagree about which providers serve the asset.
1955
- const supporting = (0, providerAvailability_1.getProvidersServingAsset)(providers, assetId);
1991
+ const supporting = (0, providerAvailability_js_1.getProvidersServingAsset)(providers, assetId);
1956
1992
  return { supporting, all: providers };
1957
1993
  }, _RampsController_filterProviderIdsBySupport =
1958
1994
  /**
@@ -2045,7 +2081,7 @@ async function _RampsController_resolveProviderIdsForQuote({ assetId, region, pr
2045
2081
  }, _RampsController_getPreferredProviderIdsFromOrders = function _RampsController_getPreferredProviderIdsFromOrders() {
2046
2082
  const orderedIds = [];
2047
2083
  const completedOrders = this.state.orders
2048
- .filter((order) => order.status === RampsService_1.RampsOrderStatus.Completed && order.provider?.id)
2084
+ .filter((order) => order.status === RampsService_js_1.RampsOrderStatus.Completed && order.provider?.id)
2049
2085
  .sort((orderA, orderB) => orderB.createdAt - orderA.createdAt);
2050
2086
  for (const order of completedOrders) {
2051
2087
  const id = order.provider?.id;
@@ -2073,7 +2109,7 @@ async function _RampsController_refreshOrder(order) {
2073
2109
  lastTimeFetched: 0,
2074
2110
  errorCount: 0,
2075
2111
  };
2076
- if (updatedOrder.status === RampsService_1.RampsOrderStatus.Unknown) {
2112
+ if (updatedOrder.status === RampsService_js_1.RampsOrderStatus.Unknown) {
2077
2113
  meta.errorCount = Math.min(meta.errorCount + 1, MAX_ERROR_COUNT);
2078
2114
  }
2079
2115
  else {