@metamask-previews/bridge-controller 18.0.0-preview-83a6970d → 19.0.0-preview-836a8df

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 (64) hide show
  1. package/CHANGELOG.md +12 -1
  2. package/dist/bridge-controller.cjs +13 -25
  3. package/dist/bridge-controller.cjs.map +1 -1
  4. package/dist/bridge-controller.d.cts +4 -1
  5. package/dist/bridge-controller.d.cts.map +1 -1
  6. package/dist/bridge-controller.d.mts +4 -1
  7. package/dist/bridge-controller.d.mts.map +1 -1
  8. package/dist/bridge-controller.mjs +15 -27
  9. package/dist/bridge-controller.mjs.map +1 -1
  10. package/dist/constants/bridge.cjs +0 -5
  11. package/dist/constants/bridge.cjs.map +1 -1
  12. package/dist/constants/bridge.d.cts.map +1 -1
  13. package/dist/constants/bridge.d.mts.map +1 -1
  14. package/dist/constants/bridge.mjs +0 -5
  15. package/dist/constants/bridge.mjs.map +1 -1
  16. package/dist/index.cjs +3 -4
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +3 -3
  19. package/dist/index.d.cts.map +1 -1
  20. package/dist/index.d.mts +3 -3
  21. package/dist/index.d.mts.map +1 -1
  22. package/dist/index.mjs +2 -2
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/selectors.cjs +32 -12
  25. package/dist/selectors.cjs.map +1 -1
  26. package/dist/selectors.d.cts +239 -26
  27. package/dist/selectors.d.cts.map +1 -1
  28. package/dist/selectors.d.mts +239 -26
  29. package/dist/selectors.d.mts.map +1 -1
  30. package/dist/selectors.mjs +31 -11
  31. package/dist/selectors.mjs.map +1 -1
  32. package/dist/types.cjs +2 -12
  33. package/dist/types.cjs.map +1 -1
  34. package/dist/types.d.cts +6 -21
  35. package/dist/types.d.cts.map +1 -1
  36. package/dist/types.d.mts +6 -21
  37. package/dist/types.d.mts.map +1 -1
  38. package/dist/types.mjs +1 -11
  39. package/dist/types.mjs.map +1 -1
  40. package/dist/utils/feature-flags.cjs +38 -0
  41. package/dist/utils/feature-flags.cjs.map +1 -0
  42. package/dist/utils/feature-flags.d.cts +16 -0
  43. package/dist/utils/feature-flags.d.cts.map +1 -0
  44. package/dist/utils/feature-flags.d.mts +16 -0
  45. package/dist/utils/feature-flags.d.mts.map +1 -0
  46. package/dist/utils/feature-flags.mjs +32 -0
  47. package/dist/utils/feature-flags.mjs.map +1 -0
  48. package/dist/utils/fetch.cjs +1 -40
  49. package/dist/utils/fetch.cjs.map +1 -1
  50. package/dist/utils/fetch.d.cts +1 -10
  51. package/dist/utils/fetch.d.cts.map +1 -1
  52. package/dist/utils/fetch.d.mts +1 -10
  53. package/dist/utils/fetch.d.mts.map +1 -1
  54. package/dist/utils/fetch.mjs +2 -40
  55. package/dist/utils/fetch.mjs.map +1 -1
  56. package/dist/utils/validators.cjs +2 -6
  57. package/dist/utils/validators.cjs.map +1 -1
  58. package/dist/utils/validators.d.cts +2 -2
  59. package/dist/utils/validators.d.cts.map +1 -1
  60. package/dist/utils/validators.d.mts +2 -2
  61. package/dist/utils/validators.d.mts.map +1 -1
  62. package/dist/utils/validators.mjs +3 -7
  63. package/dist/utils/validators.mjs.map +1 -1
  64. package/package.json +5 -3
package/CHANGELOG.md CHANGED
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Changed
11
+
12
+ - **BREAKING:** Use `RemoteFeatureFlagController` to fetch feature flags, removed client specific feature flag keys. The feature flags you receive are now client specific based on the `RemoteFeatureFlagController` state. ([#5708](https://github.com/MetaMask/core/pull/5708))
13
+
14
+ ## [19.0.0]
15
+
16
+ ### Changed
17
+
18
+ - **BREAKING:** Bump `@metamask/assets-controllers` peer dependency to `^60.0.0` ([#5717](https://github.com/MetaMask/core/pull/5717))
19
+
10
20
  ## [18.0.0]
11
21
 
12
22
  ### Changed
@@ -176,7 +186,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
176
186
 
177
187
  - Initial release ([#5317](https://github.com/MetaMask/core/pull/5317))
178
188
 
179
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@18.0.0...HEAD
189
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@19.0.0...HEAD
190
+ [19.0.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@18.0.0...@metamask/bridge-controller@19.0.0
180
191
  [18.0.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@17.0.0...@metamask/bridge-controller@18.0.0
181
192
  [17.0.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@16.0.0...@metamask/bridge-controller@17.0.0
182
193
  [16.0.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@15.0.0...@metamask/bridge-controller@16.0.0
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _BridgeController_instances, _BridgeController_abortController, _BridgeController_quotesFirstFetched, _BridgeController_clientId, _BridgeController_getLayer1GasFee, _BridgeController_fetchFn, _BridgeController_trackMetaMetricsFn, _BridgeController_config, _BridgeController_getExchangeRateSources, _BridgeController_fetchAssetExchangeRates, _BridgeController_hasSufficientBalance, _BridgeController_setIntervalLength, _BridgeController_fetchBridgeQuotes, _BridgeController_appendL1GasFees, _BridgeController_appendSolanaFees, _BridgeController_getMultichainSelectedAccount, _BridgeController_getSelectedNetworkClientId, _BridgeController_getSelectedNetworkClient, _BridgeController_getRequestParams, _BridgeController_getRequestMetadata, _BridgeController_getQuoteFetchData, _BridgeController_getEventProperties, _BridgeController_trackInputChangedEvents;
13
+ var _BridgeController_instances, _BridgeController_abortController, _BridgeController_quotesFirstFetched, _BridgeController_clientId, _BridgeController_getLayer1GasFee, _BridgeController_fetchFn, _BridgeController_trackMetaMetricsFn, _BridgeController_config, _BridgeController_getExchangeRateSources, _BridgeController_fetchAssetExchangeRates, _BridgeController_hasSufficientBalance, _BridgeController_fetchBridgeQuotes, _BridgeController_appendL1GasFees, _BridgeController_appendSolanaFees, _BridgeController_getMultichainSelectedAccount, _BridgeController_getSelectedNetworkClientId, _BridgeController_getSelectedNetworkClient, _BridgeController_getRequestParams, _BridgeController_getRequestMetadata, _BridgeController_getQuoteFetchData, _BridgeController_getEventProperties, _BridgeController_trackInputChangedEvents;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.BridgeController = void 0;
16
16
  const contracts_1 = require("@ethersproject/contracts");
@@ -27,15 +27,12 @@ const assets_1 = require("./utils/assets.cjs");
27
27
  const balance_1 = require("./utils/balance.cjs");
28
28
  const bridge_2 = require("./utils/bridge.cjs");
29
29
  const caip_formatters_1 = require("./utils/caip-formatters.cjs");
30
+ const feature_flags_1 = require("./utils/feature-flags.cjs");
30
31
  const fetch_1 = require("./utils/fetch.cjs");
31
32
  const constants_1 = require("./utils/metrics/constants.cjs");
32
33
  const properties_1 = require("./utils/metrics/properties.cjs");
33
34
  const quote_1 = require("./utils/quote.cjs");
34
35
  const metadata = {
35
- bridgeFeatureFlags: {
36
- persist: false,
37
- anonymous: false,
38
- },
39
36
  quoteRequest: {
40
37
  persist: false,
41
38
  anonymous: false,
@@ -135,7 +132,7 @@ class BridgeController extends (0, polling_controller_1.StaticIntervalPollingCon
135
132
  }
136
133
  const networkClientId = __classPrivateFieldGet(this, _BridgeController_instances, "m", _BridgeController_getSelectedNetworkClientId).call(this);
137
134
  // Set refresh rate based on the source chain before starting polling
138
- __classPrivateFieldGet(this, _BridgeController_setIntervalLength, "f").call(this);
135
+ this.setChainIntervalLength();
139
136
  this.startPolling({
140
137
  networkClientId,
141
138
  updatedQuoteRequest: {
@@ -225,33 +222,23 @@ class BridgeController extends (0, polling_controller_1.StaticIntervalPollingCon
225
222
  bridge_1.DEFAULT_BRIDGE_CONTROLLER_STATE.quotesRefreshCount;
226
223
  state.assetExchangeRates =
227
224
  bridge_1.DEFAULT_BRIDGE_CONTROLLER_STATE.assetExchangeRates;
228
- // Keep feature flags
229
- const originalFeatureFlags = state.bridgeFeatureFlags;
230
- state.bridgeFeatureFlags = originalFeatureFlags;
231
- });
232
- };
233
- this.setBridgeFeatureFlags = async () => {
234
- const bridgeFeatureFlags = await (0, fetch_1.fetchBridgeFeatureFlags)(__classPrivateFieldGet(this, _BridgeController_clientId, "f"), __classPrivateFieldGet(this, _BridgeController_fetchFn, "f"), __classPrivateFieldGet(this, _BridgeController_config, "f").customBridgeApiBaseUrl ?? bridge_1.BRIDGE_PROD_API_BASE_URL);
235
- this.update((state) => {
236
- state.bridgeFeatureFlags = bridgeFeatureFlags;
237
225
  });
238
- __classPrivateFieldGet(this, _BridgeController_setIntervalLength, "f").call(this);
239
226
  };
240
227
  /**
241
228
  * Sets the interval length based on the source chain
242
229
  */
243
- _BridgeController_setIntervalLength.set(this, () => {
230
+ this.setChainIntervalLength = () => {
244
231
  const { state } = this;
245
232
  const { srcChainId } = state.quoteRequest;
233
+ const bridgeFeatureFlags = (0, feature_flags_1.getBridgeFeatureFlags)(this.messagingSystem);
246
234
  const refreshRateOverride = srcChainId
247
- ? state.bridgeFeatureFlags[types_1.BridgeFeatureFlagsKey.EXTENSION_CONFIG].chains[(0, caip_formatters_1.formatChainIdToCaip)(srcChainId)]?.refreshRate
235
+ ? bridgeFeatureFlags.chains[(0, caip_formatters_1.formatChainIdToCaip)(srcChainId)]?.refreshRate
248
236
  : undefined;
249
- const defaultRefreshRate = state.bridgeFeatureFlags[types_1.BridgeFeatureFlagsKey.EXTENSION_CONFIG]
250
- .refreshRate;
237
+ const defaultRefreshRate = bridgeFeatureFlags.refreshRate;
251
238
  this.setIntervalLength(refreshRateOverride ?? defaultRefreshRate);
252
- });
239
+ };
253
240
  _BridgeController_fetchBridgeQuotes.set(this, async ({ networkClientId: _networkClientId, updatedQuoteRequest, context, }) => {
254
- const { bridgeFeatureFlags, quotesInitialLoadTime, quotesRefreshCount } = this.state;
241
+ const { quotesInitialLoadTime, quotesRefreshCount } = this.state;
255
242
  __classPrivateFieldGet(this, _BridgeController_abortController, "f")?.abort('New quote request');
256
243
  __classPrivateFieldSet(this, _BridgeController_abortController, new AbortController(), "f");
257
244
  this.trackUnifiedSwapBridgeEvent(constants_1.UnifiedSwapBridgeEventName.QuotesRequested, context);
@@ -290,7 +277,8 @@ class BridgeController extends (0, polling_controller_1.StaticIntervalPollingCon
290
277
  console.log('Failed to fetch bridge quotes', error);
291
278
  }
292
279
  finally {
293
- const { maxRefreshCount } = bridgeFeatureFlags[types_1.BridgeFeatureFlagsKey.EXTENSION_CONFIG];
280
+ const bridgeFeatureFlags = (0, feature_flags_1.getBridgeFeatureFlags)(this.messagingSystem);
281
+ const { maxRefreshCount } = bridgeFeatureFlags;
294
282
  const updatedQuotesRefreshCount = quotesRefreshCount + 1;
295
283
  // Stop polling if the maximum number of refreshes has been reached
296
284
  if (updatedQuoteRequest.insufficientBal ||
@@ -510,7 +498,7 @@ class BridgeController extends (0, polling_controller_1.StaticIntervalPollingCon
510
498
  __classPrivateFieldSet(this, _BridgeController_trackMetaMetricsFn, trackMetaMetricsFn, "f");
511
499
  __classPrivateFieldSet(this, _BridgeController_config, config ?? {}, "f");
512
500
  // Register action handlers
513
- this.messagingSystem.registerActionHandler(`${bridge_1.BRIDGE_CONTROLLER_NAME}:setBridgeFeatureFlags`, this.setBridgeFeatureFlags.bind(this));
501
+ this.messagingSystem.registerActionHandler(`${bridge_1.BRIDGE_CONTROLLER_NAME}:setChainIntervalLength`, this.setChainIntervalLength.bind(this));
514
502
  this.messagingSystem.registerActionHandler(`${bridge_1.BRIDGE_CONTROLLER_NAME}:updateBridgeQuoteRequestParams`, this.updateBridgeQuoteRequestParams.bind(this));
515
503
  this.messagingSystem.registerActionHandler(`${bridge_1.BRIDGE_CONTROLLER_NAME}:resetState`, this.resetState.bind(this));
516
504
  this.messagingSystem.registerActionHandler(`${bridge_1.BRIDGE_CONTROLLER_NAME}:getBridgeERC20Allowance`, this.getBridgeERC20Allowance.bind(this));
@@ -518,7 +506,7 @@ class BridgeController extends (0, polling_controller_1.StaticIntervalPollingCon
518
506
  }
519
507
  }
520
508
  exports.BridgeController = BridgeController;
521
- _BridgeController_abortController = new WeakMap(), _BridgeController_quotesFirstFetched = new WeakMap(), _BridgeController_clientId = new WeakMap(), _BridgeController_getLayer1GasFee = new WeakMap(), _BridgeController_fetchFn = new WeakMap(), _BridgeController_trackMetaMetricsFn = new WeakMap(), _BridgeController_config = new WeakMap(), _BridgeController_getExchangeRateSources = new WeakMap(), _BridgeController_fetchAssetExchangeRates = new WeakMap(), _BridgeController_hasSufficientBalance = new WeakMap(), _BridgeController_setIntervalLength = new WeakMap(), _BridgeController_fetchBridgeQuotes = new WeakMap(), _BridgeController_appendL1GasFees = new WeakMap(), _BridgeController_appendSolanaFees = new WeakMap(), _BridgeController_getRequestParams = new WeakMap(), _BridgeController_getRequestMetadata = new WeakMap(), _BridgeController_getQuoteFetchData = new WeakMap(), _BridgeController_getEventProperties = new WeakMap(), _BridgeController_trackInputChangedEvents = new WeakMap(), _BridgeController_instances = new WeakSet(), _BridgeController_getMultichainSelectedAccount = function _BridgeController_getMultichainSelectedAccount() {
509
+ _BridgeController_abortController = new WeakMap(), _BridgeController_quotesFirstFetched = new WeakMap(), _BridgeController_clientId = new WeakMap(), _BridgeController_getLayer1GasFee = new WeakMap(), _BridgeController_fetchFn = new WeakMap(), _BridgeController_trackMetaMetricsFn = new WeakMap(), _BridgeController_config = new WeakMap(), _BridgeController_getExchangeRateSources = new WeakMap(), _BridgeController_fetchAssetExchangeRates = new WeakMap(), _BridgeController_hasSufficientBalance = new WeakMap(), _BridgeController_fetchBridgeQuotes = new WeakMap(), _BridgeController_appendL1GasFees = new WeakMap(), _BridgeController_appendSolanaFees = new WeakMap(), _BridgeController_getRequestParams = new WeakMap(), _BridgeController_getRequestMetadata = new WeakMap(), _BridgeController_getQuoteFetchData = new WeakMap(), _BridgeController_getEventProperties = new WeakMap(), _BridgeController_trackInputChangedEvents = new WeakMap(), _BridgeController_instances = new WeakSet(), _BridgeController_getMultichainSelectedAccount = function _BridgeController_getMultichainSelectedAccount() {
522
510
  return this.messagingSystem.call('AccountsController:getSelectedMultichainAccount');
523
511
  }, _BridgeController_getSelectedNetworkClientId = function _BridgeController_getSelectedNetworkClientId() {
524
512
  const { selectedNetworkClientId } = this.messagingSystem.call('NetworkController:getState');
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-controller.cjs","sourceRoot":"","sources":["../src/bridge-controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,wDAAoD;AACpD,wDAAwD;AAGxD,uDAAiD;AACjD,mEAAuD;AAEvD,qEAA+E;AAG/E,2CAAwD;AAExD,mDAO4B;AAC5B,mDAA+C;AAC/C,+CAA+D;AAE/D,uCAWiB;AACjB,+CAAsE;AACtE,iDAAuD;AACvD,+CAIwB;AACxB,iEAIiC;AACjC,6CAIuB;AACvB,6DAAuE;AACvE,+DASoC;AAQpC,6CAAoD;AAEpD,MAAM,QAAQ,GAAyC;IACrD,kBAAkB,EAAE;QAClB,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,KAAK;KACjB;IACD,YAAY,EAAE;QACZ,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,KAAK;KACjB;IACD,MAAM,EAAE;QACN,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,KAAK;KACjB;IACD,qBAAqB,EAAE;QACrB,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,KAAK;KACjB;IACD,iBAAiB,EAAE;QACjB,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,KAAK;KACjB;IACD,mBAAmB,EAAE;QACnB,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,KAAK;KACjB;IACD,eAAe,EAAE;QACf,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,KAAK;KACjB;IACD,kBAAkB,EAAE;QAClB,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,KAAK;KACjB;IACD,kBAAkB,EAAE;QAClB,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,KAAK;KACjB;CACF,CAAC;AAEF,MAAM,yBAAyB,GAAG,wBAAwB,CAAC;AAuB3D,MAAa,gBAAiB,SAAQ,IAAA,oDAA+B,GAIpE;IA0BC,YAAY,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,eAAe,EACf,OAAO,EACP,MAAM,EACN,kBAAkB,GAoBnB;QACC,KAAK,CAAC;YACJ,IAAI,EAAE,+BAAsB;YAC5B,QAAQ;YACR,SAAS;YACT,KAAK,EAAE;gBACL,GAAG,IAAA,wCAA+B,GAAE;gBACpC,GAAG,KAAK;aACT;SACF,CAAC,CAAC;;QA7DL,oDAA8C;QAE9C,uDAAwC;QAE/B,6CAAkB;QAElB,oDAGa;QAEb,4CAAwB;QAExB,uDAMC;QAED,2CAEP;QAwEF,iBAAY,GAAG,KAAK,EAAE,YAAgC,EAAE,EAAE;YACxD,MAAM,uBAAA,IAAI,2CAAmB,MAAvB,IAAI,EAAoB,YAAY,CAAC,CAAC;QAC9C,CAAC,CAAC;QAEF,mCAA8B,GAAG,KAAK,EACpC,cAA4C,EAC5C,OAAsC,EACtC,EAAE;YACF,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,uBAAA,IAAI,yCAAiB,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAEtD,uBAAA,IAAI,iDAAyB,MAA7B,IAAI,EAA0B,cAAc,CAAC,CAAC;YAE9C,MAAM,mBAAmB,GAAG;gBAC1B,GAAG,wCAA+B,CAAC,YAAY;gBAC/C,GAAG,cAAc;aAClB,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,YAAY,GAAG,mBAAmB,CAAC;gBACzC,KAAK,CAAC,MAAM,GAAG,wCAA+B,CAAC,MAAM,CAAC;gBACtD,KAAK,CAAC,iBAAiB;oBACrB,wCAA+B,CAAC,iBAAiB,CAAC;gBACpD,KAAK,CAAC,mBAAmB;oBACvB,wCAA+B,CAAC,mBAAmB,CAAC;gBACtD,KAAK,CAAC,eAAe,GAAG,wCAA+B,CAAC,eAAe,CAAC;gBACxE,KAAK,CAAC,kBAAkB;oBACtB,wCAA+B,CAAC,kBAAkB,CAAC;gBACrD,KAAK,CAAC,qBAAqB;oBACzB,wCAA+B,CAAC,qBAAqB,CAAC;YAC1D,CAAC,CAAC,CAAC;YAEH,MAAM,uBAAA,IAAI,iDAAyB,MAA7B,IAAI,EAA0B,mBAAmB,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CACvE,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAC5D,CAAC;YAEF,IAAI,IAAA,2BAAmB,EAAC,mBAAmB,CAAC,EAAE;gBAC5C,uBAAA,IAAI,wCAAuB,IAAI,CAAC,GAAG,EAAE,MAAA,CAAC;gBACtC,MAAM,cAAc,GAAG,uBAAA,IAAI,+EAA0B,MAA9B,IAAI,CAA4B,EAAE,aAAa,CAAC;gBAEvE,IAAI,eAAoC,CAAC;gBACzC,IAAI,IAAA,wBAAe,EAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE;oBACnD,mEAAmE;oBACnE,eAAe,GAAG,cAAc,CAAC,eAAe,CAAC;iBAClD;qBAAM,IAAI,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE;oBACvD,yEAAyE;oBACzE,mIAAmI;oBACnI,eAAe,GAAG,IAAI,CAAC;iBACxB;qBAAM;oBACL,8DAA8D;oBAC9D,eAAe;wBACb,cAAc,CAAC,eAAe;4BAC9B,CAAC,CAAC,MAAM,uBAAA,IAAI,8CAAsB,MAA1B,IAAI,EAAuB,mBAAmB,CAAC,CAAC,CAAC;iBAC5D;gBAED,MAAM,eAAe,GAAG,uBAAA,IAAI,iFAA4B,MAAhC,IAAI,CAA8B,CAAC;gBAC3D,qEAAqE;gBACrE,uBAAA,IAAI,2CAAmB,MAAvB,IAAI,CAAqB,CAAC;gBAC1B,IAAI,CAAC,YAAY,CAAC;oBAChB,eAAe;oBACf,mBAAmB,EAAE;wBACnB,GAAG,mBAAmB;wBACtB,eAAe;qBAChB;oBACD,OAAO;iBACR,CAAC,CAAC;aACJ;QACH,CAAC,CAAC;QAEO,mDAA0B,GAAG,EAAE;YACtC,OAAO;gBACL,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,0CAA0C,CAAC;gBACxE,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,iCAAiC,CAAC;gBAC/D,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,+BAA+B,CAAC;gBAC7D,GAAG,IAAI,CAAC,KAAK;aACd,CAAC;QACJ,CAAC,EAAC;QAEF;;;;;;;;;WASG;QACM,oDAA2B,KAAK,EAAE,EACzC,UAAU,EACV,eAAe,EACf,WAAW,EACX,gBAAgB,GACa,EAAE,EAAE;YACjC,MAAM,QAAQ,GAAuB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;YACjD,MAAM,mBAAmB,GAAG,uBAAA,IAAI,gDAAwB,MAA5B,IAAI,CAA0B,CAAC;YAC3D,IACE,eAAe;gBACf,UAAU;gBACV,CAAC,IAAA,4CAAgC,EAC/B,mBAAmB,EACnB,UAAU,EACV,eAAe,CAChB,EACD;gBACA,IAAA,4BAAmB,EAAC,eAAe,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACnE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CACtB,CAAC;aACH;YACD,IACE,gBAAgB;gBAChB,WAAW;gBACX,CAAC,IAAA,4CAAgC,EAC/B,mBAAmB,EACnB,WAAW,EACX,gBAAgB,CACjB,EACD;gBACA,IAAA,4BAAmB,EAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACrE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CACtB,CAAC;aACH;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CACxC,iCAAiC,CAClC,CAAC,eAAe,CAAC;YAElB,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE;gBACvB,OAAO;aACR;YAED,MAAM,eAAe,GAAG,MAAM,IAAA,wBAAgB,EAAC;gBAC7C,QAAQ;gBACR,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC/B,QAAQ,EAAE,uBAAA,IAAI,kCAAU;gBACxB,OAAO,EAAE,uBAAA,IAAI,iCAAS;aACvB,CAAC,CAAC;YACH,MAAM,aAAa,GAAG,IAAA,wBAAe,EAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;YACjE,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,kBAAkB,GAAG;oBACzB,GAAG,KAAK,CAAC,kBAAkB;oBAC3B,GAAG,aAAa;iBACjB,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAEO,iDAAwB,KAAK,EACpC,YAAiC,EACjC,EAAE;YACF,MAAM,aAAa,GAAG,uBAAA,IAAI,mFAA8B,MAAlC,IAAI,CAAgC,EAAE,OAAO,CAAC;YACpE,MAAM,eAAe,GAAG,IAAA,oCAAkB,EAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACpE,MAAM,QAAQ,GAAG,uBAAA,IAAI,+EAA0B,MAA9B,IAAI,CAA4B,EAAE,QAAQ,CAAC;YAC5D,MAAM,yBAAyB,GAAG,IAAA,8CAA4B,EAC5D,YAAY,CAAC,eAAe,CAC7B,CAAC;YAEF,OAAO,CACL,QAAQ;gBACR,aAAa;gBACb,yBAAyB;gBACzB,YAAY,CAAC,cAAc;gBAC3B,eAAe;gBACf,CAAC,MAAM,IAAA,8BAAoB,EACzB,QAAQ,EACR,aAAa,EACb,yBAAyB,EACzB,YAAY,CAAC,cAAc,EAC3B,eAAe,CAChB,CAAC,CACH,CAAC;QACJ,CAAC,EAAC;QAEF,eAAU,GAAG,GAAG,EAAE;YAChB,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,uBAAA,IAAI,yCAAiB,EAAE,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAExD,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,gGAAgG;gBAChG,KAAK,CAAC,YAAY,GAAG,wCAA+B,CAAC,YAAY,CAAC;gBAClE,KAAK,CAAC,qBAAqB;oBACzB,wCAA+B,CAAC,qBAAqB,CAAC;gBACxD,KAAK,CAAC,MAAM,GAAG,wCAA+B,CAAC,MAAM,CAAC;gBACtD,KAAK,CAAC,iBAAiB;oBACrB,wCAA+B,CAAC,iBAAiB,CAAC;gBACpD,KAAK,CAAC,mBAAmB;oBACvB,wCAA+B,CAAC,mBAAmB,CAAC;gBACtD,KAAK,CAAC,eAAe,GAAG,wCAA+B,CAAC,eAAe,CAAC;gBACxE,KAAK,CAAC,kBAAkB;oBACtB,wCAA+B,CAAC,kBAAkB,CAAC;gBACrD,KAAK,CAAC,kBAAkB;oBACtB,wCAA+B,CAAC,kBAAkB,CAAC;gBAErD,qBAAqB;gBACrB,MAAM,oBAAoB,GAAG,KAAK,CAAC,kBAAkB,CAAC;gBACtD,KAAK,CAAC,kBAAkB,GAAG,oBAAoB,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,0BAAqB,GAAG,KAAK,IAAI,EAAE;YACjC,MAAM,kBAAkB,GAAG,MAAM,IAAA,+BAAuB,EACtD,uBAAA,IAAI,kCAAU,EACd,uBAAA,IAAI,iCAAS,EACb,uBAAA,IAAI,gCAAQ,CAAC,sBAAsB,IAAI,iCAAwB,CAChE,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;YAChD,CAAC,CAAC,CAAC;YACH,uBAAA,IAAI,2CAAmB,MAAvB,IAAI,CAAqB,CAAC;QAC5B,CAAC,CAAC;QAEF;;WAEG;QACM,8CAAqB,GAAG,EAAE;YACjC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;YACvB,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC;YAC1C,MAAM,mBAAmB,GAAG,UAAU;gBACpC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,6BAAqB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CACrE,IAAA,qCAAmB,EAAC,UAAU,CAAC,CAChC,EAAE,WAAW;gBAChB,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,kBAAkB,GACtB,KAAK,CAAC,kBAAkB,CAAC,6BAAqB,CAAC,gBAAgB,CAAC;iBAC7D,WAAW,CAAC;YACjB,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,IAAI,kBAAkB,CAAC,CAAC;QACpE,CAAC,EAAC;QAEO,8CAAqB,KAAK,EAAE,EACnC,eAAe,EAAE,gBAAgB,EACjC,mBAAmB,EACnB,OAAO,GACY,EAAE,EAAE;YACvB,MAAM,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,GACrE,IAAI,CAAC,KAAK,CAAC;YACb,uBAAA,IAAI,yCAAiB,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAClD,uBAAA,IAAI,qCAAoB,IAAI,eAAe,EAAE,MAAA,CAAC;YAE9C,IAAI,CAAC,2BAA2B,CAC9B,sCAA0B,CAAC,eAAe,EAC1C,OAAO,CACR,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,mBAAmB,GAAG,qBAAa,CAAC,OAAO,CAAC;gBAClD,KAAK,CAAC,YAAY,GAAG,mBAAmB,CAAC;gBACzC,KAAK,CAAC,eAAe,GAAG,wCAA+B,CAAC,eAAe,CAAC;YAC1E,CAAC,CAAC,CAAC;YAEH,IAAI;gBACF,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAiB,EACpC,mBAAmB;gBACnB,0FAA0F;gBAC1F,oCAAoC;gBACpC,2CAA2C;gBAC3C,oEAAoE;gBACpE,uBAAA,IAAI,yCAAkB,CAAC,MAAqB,EAC5C,uBAAA,IAAI,kCAAU,EACd,uBAAA,IAAI,iCAAS,EACb,uBAAA,IAAI,gCAAQ,CAAC,sBAAsB,IAAI,iCAAwB,CAChE,CAAC;gBAEF,MAAM,mBAAmB,GAAG,MAAM,uBAAA,IAAI,yCAAiB,MAArB,IAAI,EAAkB,MAAM,CAAC,CAAC;gBAChE,MAAM,oBAAoB,GAAG,MAAM,uBAAA,IAAI,0CAAkB,MAAtB,IAAI,EAAmB,MAAM,CAAC,CAAC;gBAElE,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,KAAK,CAAC,MAAM,GAAG,mBAAmB,IAAI,oBAAoB,IAAI,MAAM,CAAC;oBACrE,KAAK,CAAC,mBAAmB,GAAG,qBAAa,CAAC,OAAO,CAAC;gBACpD,CAAC,CAAC,CAAC;aACJ;YAAC,OAAO,KAAK,EAAE;gBACd,MAAM,YAAY,GAAI,KAAe,CAAC,IAAI,KAAK,YAAY,CAAC;gBAC5D,MAAM,mBAAmB,GAAG,KAAK,KAAK,yBAAyB,CAAC;gBAChE,IAAI,mBAAmB,IAAI,YAAY,EAAE;oBACvC,OAAO;iBACR;gBAED,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,KAAK,CAAC,eAAe;wBACnB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;oBAC3D,KAAK,CAAC,mBAAmB,GAAG,qBAAa,CAAC,KAAK,CAAC;oBAChD,KAAK,CAAC,MAAM,GAAG,wCAA+B,CAAC,MAAM,CAAC;gBACxD,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,2BAA2B,CAC9B,sCAA0B,CAAC,UAAU,EACrC,OAAO,CACR,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;aACrD;oBAAS;gBACR,MAAM,EAAE,eAAe,EAAE,GACvB,kBAAkB,CAAC,6BAAqB,CAAC,gBAAgB,CAAC,CAAC;gBAE7D,MAAM,yBAAyB,GAAG,kBAAkB,GAAG,CAAC,CAAC;gBACzD,mEAAmE;gBACnE,IACE,mBAAmB,CAAC,eAAe;oBACnC,CAAC,CAAC,mBAAmB,CAAC,eAAe;wBACnC,yBAAyB,IAAI,eAAe,CAAC,EAC/C;oBACA,IAAI,CAAC,cAAc,EAAE,CAAC;iBACvB;gBAED,8BAA8B;gBAC9B,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACrC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,KAAK,CAAC,qBAAqB;wBACzB,yBAAyB,KAAK,CAAC,IAAI,uBAAA,IAAI,4CAAoB;4BACzD,CAAC,CAAC,iBAAiB,GAAG,uBAAA,IAAI,4CAAoB;4BAC9C,CAAC,CAAC,qBAAqB,CAAC;oBAC5B,KAAK,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;oBAC5C,KAAK,CAAC,kBAAkB,GAAG,yBAAyB,CAAC;gBACvD,CAAC,CAAC,CAAC;aACJ;QACH,CAAC,EAAC;QAEO,4CAAmB,KAAK,EAC/B,MAAuB,EAC6B,EAAE;YACtD,oEAAoE;YACpE,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;gBACjD,MAAM,OAAO,GAAG,IAAA,qCAAmB,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACtD,OAAO,CAAC,CAAC,kBAAS,CAAC,QAAQ,EAAE,kBAAS,CAAC,IAAI,CAAC;qBACzC,GAAG,CAAC,qCAAmB,CAAC;qBACxB,QAAQ,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,wEAAwE;YACxE,IAAI,CAAC,gBAAgB,EAAE;gBACrB,OAAO,MAAM,OAAO,CAAC,GAAG,CACtB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;oBACjC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC;oBACjD,MAAM,OAAO,GAAG,IAAA,mBAAW,EAAC,KAAK,CAAC,UAAU,CAAY,CAAC;oBAEzD,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;wBACvC,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,EAAE,EAAE,MAAM,CAAC,EAAE;wBACb,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE;qBACtC,CAAC,CAAC;oBACH,MAAM,iBAAiB,GAAG,QAAQ;wBAChC,CAAC,CAAC,MAAM,uBAAA,IAAI,yCAAiB,MAArB,IAAI,EAAkB;4BAC1B,iBAAiB,EAAE,WAAW,CAAC,QAAQ,CAAC;4BACxC,OAAO;yBACR,CAAC;wBACJ,CAAC,CAAC,GAAG,CAAC;oBACR,MAAM,cAAc,GAAG,MAAM,uBAAA,IAAI,yCAAiB,MAArB,IAAI,EAAkB;wBACjD,iBAAiB,EAAE,WAAW,CAAC,KAAK,CAAC;wBACrC,OAAO;qBACR,CAAC,CAAC;oBACH,OAAO;wBACL,GAAG,aAAa;wBAChB,iBAAiB,EAAE,IAAA,iBAAQ,EAAC,iBAAiB,EAAE,cAAc,CAAC;qBAC/D,CAAC;gBACJ,CAAC,CAAC,CACH,CAAC;aACH;YAED,OAAO,SAAS,CAAC;QACnB,CAAC,EAAC;QAEO,6CAAoB,KAAK,EAChC,MAAuB,EAC8B,EAAE;YACvD,wDAAwD;YACxD,IACE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,IAAA,wBAAe,EAAC,UAAU,CAAC,CAAC,EACxE;gBACA,OAAO,SAAS,CAAC;aAClB;YAED,OAAO,MAAM,OAAO,CAAC,GAAG,CACtB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;gBACjC,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC;gBAChC,MAAM,eAAe,GAAG,uBAAA,IAAI,mFAA8B,MAAlC,IAAI,CAAgC,CAAC;gBAE7D,IAAI,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;oBACpE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CACtD,8BAA8B,EAC9B;wBACE,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAW;wBAClD,MAAM,EAAE,UAAU;wBAClB,OAAO,EAAE,cAAuB;wBAChC,OAAO,EAAE;4BACP,MAAM,EAAE,sBAAsB;4BAC9B,MAAM,EAAE;gCACN,WAAW,EAAE,KAAK;gCAClB,KAAK,EAAE,sBAAQ,CAAC,OAAO;6BACxB;yBACF;qBACF,CACF,CAAsB,CAAC;oBAExB,OAAO;wBACL,GAAG,aAAa;wBAChB,oBAAoB,EAAE,IAAI;qBAC3B,CAAC;iBACH;gBACD,OAAO,aAAa,CAAC;YACvB,CAAC,CAAC,CACH,CAAC;QACJ,CAAC,EAAC;QAwBO,6CAAoB,GAG3B,EAAE;YACF,MAAM,cAAc,GAAG,IAAA,qCAAmB,EACxC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU;gBAChC,uBAAA,IAAI,+EAA0B,MAA9B,IAAI,CAA4B,CAAC,aAAa,CAAC,OAAO,CACzD,CAAC;YACF,OAAO,IAAA,6BAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QACnE,CAAC,EAAC;QAEO,+CAAsB,GAG7B,EAAE;YACF,OAAO;gBACL,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ;gBAChD,SAAS,EAAE,IAAA,iCAAoB,EAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;gBACxD,kBAAkB,EAAE,IAAA,6BAAgB,EAClC,uBAAA,IAAI,mFAA8B,MAAlC,IAAI,CAAgC,CACrC;gBACD,eAAe,EAAE,IAAA,6BAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC;aACpE,CAAC;QACJ,CAAC,EAAC;QAEO,8CAAqB,GAG5B,EAAE;YACF,OAAO;gBACL,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,CAAC;gBAC5D,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM;gBACtC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAC/C,IAAA,gCAAmB,EAAC,KAAK,CAAC,CAC3B;gBACD,4BAA4B,EAAE,IAAI,CAAC,KAAK,CAAC,qBAAqB,IAAI,CAAC;aACpE,CAAC;QACJ,CAAC,EAAC;QAEO,+CAAsB,CAI7B,SAAY,EACZ,oBAAgE,EAC7B,EAAE;YACrC,MAAM,cAAc,GAAG;gBACrB,WAAW,EAAE,IAAA,0CAA6B,EAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;gBACnE,GAAG,oBAAoB;aACxB,CAAC;YACF,QAAQ,SAAS,EAAE;gBACjB,KAAK,sCAA0B,CAAC,aAAa,CAAC;gBAC9C,KAAK,sCAA0B,CAAC,UAAU;oBACxC,OAAO;wBACL,GAAG,uBAAA,IAAI,0CAAkB,MAAtB,IAAI,CAAoB;wBAC3B,GAAG,cAAc;qBAClB,CAAC;gBACJ,KAAK,sCAA0B,CAAC,cAAc;oBAC5C,OAAO;wBACL,GAAG,uBAAA,IAAI,0CAAkB,MAAtB,IAAI,CAAoB;wBAC3B,GAAG,uBAAA,IAAI,4CAAoB,MAAxB,IAAI,CAAsB;wBAC7B,GAAG,uBAAA,IAAI,2CAAmB,MAAvB,IAAI,CAAqB;wBAC5B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB;wBAC5C,GAAG,cAAc;qBAClB,CAAC;gBACJ,KAAK,sCAA0B,CAAC,eAAe,CAAC;gBAChD,KAAK,sCAA0B,CAAC,UAAU;oBACxC,OAAO;wBACL,GAAG,uBAAA,IAAI,0CAAkB,MAAtB,IAAI,CAAoB;wBAC3B,GAAG,uBAAA,IAAI,4CAAoB,MAAxB,IAAI,CAAsB;wBAC7B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe;wBACzC,oBAAoB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe;wBAC9D,GAAG,cAAc;qBAClB,CAAC;gBACJ,KAAK,sCAA0B,CAAC,eAAe,CAAC;gBAChD,KAAK,sCAA0B,CAAC,eAAe,CAAC;gBAChD,KAAK,sCAA0B,CAAC,aAAa;oBAC3C,OAAO;wBACL,GAAG,uBAAA,IAAI,0CAAkB,MAAtB,IAAI,CAAoB;wBAC3B,GAAG,uBAAA,IAAI,4CAAoB,MAAxB,IAAI,CAAsB;wBAC7B,GAAG,uBAAA,IAAI,2CAAmB,MAAvB,IAAI,CAAqB;wBAC5B,GAAG,cAAc;qBAClB,CAAC;gBACJ,KAAK,sCAA0B,CAAC,sBAAsB;oBACpD,OAAO;wBACL,GAAG,cAAc;wBACjB,GAAG,uBAAA,IAAI,0CAAkB,MAAtB,IAAI,CAAoB;wBAC3B,GAAG,uBAAA,IAAI,4CAAoB,MAAxB,IAAI,CAAsB;qBAC9B,CAAC;gBACJ,gDAAgD;gBAChD,KAAK,sCAA0B,CAAC,SAAS,CAAC;gBAC1C,KAAK,sCAA0B,CAAC,SAAS,CAAC;gBAC1C,KAAK,sCAA0B,CAAC,MAAM;oBACpC,OAAO,oBAAoB,CAAC;gBAC9B,KAAK,sCAA0B,CAAC,YAAY,CAAC;gBAC7C;oBACE,OAAO,cAAc,CAAC;aACzB;QACH,CAAC,EAAC;QAEO,oDAA2B,CAClC,cAA4C,EAC5C,EAAE;YACF,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;gBACtD,MAAM,QAAQ,GAAG,sCAAyB,CAAC,GAAyB,CAAC,CAAC;gBACtE,MAAM,UAAU,GACd,wCAA2B,CAAC,GAAyB,CAAC,EAAE,CACtD,cAAc,CACf,CAAC;gBACJ,IACE,QAAQ;oBACR,UAAU,KAAK,SAAS;oBACxB,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAgC,CAAC,EACnE;oBACA,IAAI,CAAC,2BAA2B,CAC9B,sCAA0B,CAAC,YAAY,EACvC;wBACE,KAAK,EAAE,QAAQ;wBACf,KAAK,EAAE,UAAU;qBAClB,CACF,CAAC;iBACH;YACH,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAEF;;;;;;;;;WASG;QACH,gCAA2B,GAAG,CAI5B,SAAY,EACZ,oBAAgE,EAChE,EAAE;YACF,IAAI;gBACF,MAAM,0BAA0B,GAAG,uBAAA,IAAI,4CAAoB,MAAxB,IAAI,EACrC,SAAS,EACT,oBAAoB,CACrB,CAAC;gBAEF,uBAAA,IAAI,4CAAoB,MAAxB,IAAI,EAAqB,SAAS,EAAE,0BAA0B,CAAC,CAAC;aACjE;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CACX,oDAAoD,EACpD,KAAK,CACN,CAAC;aACH;QACH,CAAC,CAAC;QAEF;;;;;WAKG;QACH,4BAAuB,GAAG,KAAK,EAC7B,eAAuB,EACvB,OAAY,EACK,EAAE;YACnB,MAAM,QAAQ,GAAG,uBAAA,IAAI,+EAA0B,MAA9B,IAAI,CAA4B,EAAE,QAAQ,CAAC;YAC5D,IAAI,CAAC,QAAQ,EAAE;gBACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;aACtC;YAED,MAAM,cAAc,GAAG,IAAI,wBAAY,CAAC,QAAQ,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,IAAI,oBAAQ,CAAC,eAAe,EAAE,4BAAQ,EAAE,cAAc,CAAC,CAAC;YACzE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAC9B,uBAAA,IAAI,mFAA8B,MAAlC,IAAI,CAAgC,IAAI,EAAE,CAAC;YAC7C,MAAM,SAAS,GAAc,MAAM,QAAQ,CAAC,SAAS,CACnD,aAAa,EACb,wCAA+B,CAAC,OAAO,CAAC,CACzC,CAAC;YACF,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC9B,CAAC,CAAC;QA3nBA,IAAI,CAAC,iBAAiB,CAAC,4BAAmB,CAAC,CAAC;QAE5C,uBAAA,IAAI,qCAAoB,IAAI,eAAe,EAAE,MAAA,CAAC;QAC9C,uBAAA,IAAI,qCAAoB,eAAe,MAAA,CAAC;QACxC,uBAAA,IAAI,8BAAa,QAAQ,MAAA,CAAC;QAC1B,uBAAA,IAAI,6BAAY,OAAO,MAAA,CAAC;QACxB,uBAAA,IAAI,wCAAuB,kBAAkB,MAAA,CAAC;QAC9C,uBAAA,IAAI,4BAAW,MAAM,IAAI,EAAE,MAAA,CAAC;QAE5B,2BAA2B;QAC3B,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,+BAAsB,wBAAwB,EACjD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CACtC,CAAC;QACF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,+BAAsB,iCAAiC,EAC1D,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/C,CAAC;QACF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,+BAAsB,aAAa,EACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3B,CAAC;QACF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,+BAAsB,0BAA0B,EACnD,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CACxC,CAAC;QACF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,+BAAsB,8BAA8B,EACvD,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC5C,CAAC;IACJ,CAAC;CA8lBF;AAhsBD,4CAgsBC;;IA3MG,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAC9B,iDAAiD,CAClD,CAAC;AACJ,CAAC;IAGC,MAAM,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAC3D,4BAA4B,CAC7B,CAAC;IACF,OAAO,uBAAuB,CAAC;AACjC,CAAC;IAGC,MAAM,uBAAuB,GAAG,uBAAA,IAAI,iFAA4B,MAAhC,IAAI,CAA8B,CAAC;IACnE,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAC7C,wCAAwC,EACxC,uBAAuB,CACxB,CAAC;IACF,OAAO,aAAa,CAAC;AACvB,CAAC","sourcesContent":["import type { BigNumber } from '@ethersproject/bignumber';\nimport { Contract } from '@ethersproject/contracts';\nimport { Web3Provider } from '@ethersproject/providers';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport type { ChainId } from '@metamask/controller-utils';\nimport { SolScope } from '@metamask/keyring-api';\nimport { abiERC20 } from '@metamask/metamask-eth-abis';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { TransactionParams } from '@metamask/transaction-controller';\nimport type { CaipAssetType } from '@metamask/utils';\nimport { numberToHex, type Hex } from '@metamask/utils';\n\nimport {\n type BridgeClientId,\n BRIDGE_CONTROLLER_NAME,\n BRIDGE_PROD_API_BASE_URL,\n DEFAULT_BRIDGE_CONTROLLER_STATE,\n METABRIDGE_CHAIN_TO_ADDRESS_MAP,\n REFRESH_INTERVAL_MS,\n} from './constants/bridge';\nimport { CHAIN_IDS } from './constants/chains';\nimport { selectIsAssetExchangeRateInState } from './selectors';\nimport type { QuoteRequest } from './types';\nimport {\n type L1GasFees,\n type GenericQuoteRequest,\n type SolanaFees,\n type QuoteResponse,\n type TxData,\n type BridgeControllerState,\n type BridgeControllerMessenger,\n type FetchFunction,\n BridgeFeatureFlagsKey,\n RequestStatus,\n} from './types';\nimport { getAssetIdsForToken, toExchangeRates } from './utils/assets';\nimport { hasSufficientBalance } from './utils/balance';\nimport {\n getDefaultBridgeControllerState,\n isSolanaChainId,\n sumHexes,\n} from './utils/bridge';\nimport {\n formatAddressToCaipReference,\n formatChainIdToCaip,\n formatChainIdToHex,\n} from './utils/caip-formatters';\nimport {\n fetchAssetPrices,\n fetchBridgeFeatureFlags,\n fetchBridgeQuotes,\n} from './utils/fetch';\nimport { UnifiedSwapBridgeEventName } from './utils/metrics/constants';\nimport {\n formatProviderLabel,\n getActionTypeFromQuoteRequest,\n getRequestParams,\n getSwapTypeFromQuote,\n isCustomSlippage,\n isHardwareWallet,\n toInputChangedPropertyKey,\n toInputChangedPropertyValue,\n} from './utils/metrics/properties';\nimport type {\n QuoteFetchData,\n RequestMetadata,\n RequestParams,\n RequiredEventContextFromClient,\n} from './utils/metrics/types';\nimport { type CrossChainSwapsEventProperties } from './utils/metrics/types';\nimport { isValidQuoteRequest } from './utils/quote';\n\nconst metadata: StateMetadata<BridgeControllerState> = {\n bridgeFeatureFlags: {\n persist: false,\n anonymous: false,\n },\n quoteRequest: {\n persist: false,\n anonymous: false,\n },\n quotes: {\n persist: false,\n anonymous: false,\n },\n quotesInitialLoadTime: {\n persist: false,\n anonymous: false,\n },\n quotesLastFetched: {\n persist: false,\n anonymous: false,\n },\n quotesLoadingStatus: {\n persist: false,\n anonymous: false,\n },\n quoteFetchError: {\n persist: false,\n anonymous: false,\n },\n quotesRefreshCount: {\n persist: false,\n anonymous: false,\n },\n assetExchangeRates: {\n persist: false,\n anonymous: false,\n },\n};\n\nconst RESET_STATE_ABORT_MESSAGE = 'Reset controller state';\n\n/**\n * The input to start polling for the {@link BridgeController}\n *\n * @param networkClientId - The network client ID of the selected network\n * @param updatedQuoteRequest - The updated quote request\n * @param context - The context contains properties that can't be populated by the\n * controller and need to be provided by the client for analytics\n */\ntype BridgePollingInput = {\n networkClientId: NetworkClientId;\n updatedQuoteRequest: GenericQuoteRequest;\n context: Pick<\n RequiredEventContextFromClient,\n UnifiedSwapBridgeEventName.QuoteError\n >[UnifiedSwapBridgeEventName.QuoteError] &\n Pick<\n RequiredEventContextFromClient,\n UnifiedSwapBridgeEventName.QuotesRequested\n >[UnifiedSwapBridgeEventName.QuotesRequested];\n};\n\nexport class BridgeController extends StaticIntervalPollingController<BridgePollingInput>()<\n typeof BRIDGE_CONTROLLER_NAME,\n BridgeControllerState,\n BridgeControllerMessenger\n> {\n #abortController: AbortController | undefined;\n\n #quotesFirstFetched: number | undefined;\n\n readonly #clientId: string;\n\n readonly #getLayer1GasFee: (params: {\n transactionParams: TransactionParams;\n chainId: ChainId;\n }) => Promise<string>;\n\n readonly #fetchFn: FetchFunction;\n\n readonly #trackMetaMetricsFn: <\n T extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: T,\n properties: CrossChainSwapsEventProperties<T>,\n ) => void;\n\n readonly #config: {\n customBridgeApiBaseUrl?: string;\n };\n\n constructor({\n messenger,\n state,\n clientId,\n getLayer1GasFee,\n fetchFn,\n config,\n trackMetaMetricsFn,\n }: {\n messenger: BridgeControllerMessenger;\n state?: Partial<BridgeControllerState>;\n clientId: BridgeClientId;\n getLayer1GasFee: (params: {\n transactionParams: TransactionParams;\n chainId: ChainId;\n }) => Promise<string>;\n fetchFn: FetchFunction;\n config?: {\n customBridgeApiBaseUrl?: string;\n };\n trackMetaMetricsFn: <\n T extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: T,\n properties: CrossChainSwapsEventProperties<T>,\n ) => void;\n }) {\n super({\n name: BRIDGE_CONTROLLER_NAME,\n metadata,\n messenger,\n state: {\n ...getDefaultBridgeControllerState(),\n ...state,\n },\n });\n\n this.setIntervalLength(REFRESH_INTERVAL_MS);\n\n this.#abortController = new AbortController();\n this.#getLayer1GasFee = getLayer1GasFee;\n this.#clientId = clientId;\n this.#fetchFn = fetchFn;\n this.#trackMetaMetricsFn = trackMetaMetricsFn;\n this.#config = config ?? {};\n\n // Register action handlers\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_CONTROLLER_NAME}:setBridgeFeatureFlags`,\n this.setBridgeFeatureFlags.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_CONTROLLER_NAME}:updateBridgeQuoteRequestParams`,\n this.updateBridgeQuoteRequestParams.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_CONTROLLER_NAME}:resetState`,\n this.resetState.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_CONTROLLER_NAME}:getBridgeERC20Allowance`,\n this.getBridgeERC20Allowance.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_CONTROLLER_NAME}:trackUnifiedSwapBridgeEvent`,\n this.trackUnifiedSwapBridgeEvent.bind(this),\n );\n }\n\n _executePoll = async (pollingInput: BridgePollingInput) => {\n await this.#fetchBridgeQuotes(pollingInput);\n };\n\n updateBridgeQuoteRequestParams = async (\n paramsToUpdate: Partial<GenericQuoteRequest>,\n context: BridgePollingInput['context'],\n ) => {\n this.stopAllPolling();\n this.#abortController?.abort('Quote request updated');\n\n this.#trackInputChangedEvents(paramsToUpdate);\n\n const updatedQuoteRequest = {\n ...DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest,\n ...paramsToUpdate,\n };\n\n this.update((state) => {\n state.quoteRequest = updatedQuoteRequest;\n state.quotes = DEFAULT_BRIDGE_CONTROLLER_STATE.quotes;\n state.quotesLastFetched =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesLastFetched;\n state.quotesLoadingStatus =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesLoadingStatus;\n state.quoteFetchError = DEFAULT_BRIDGE_CONTROLLER_STATE.quoteFetchError;\n state.quotesRefreshCount =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesRefreshCount;\n state.quotesInitialLoadTime =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesInitialLoadTime;\n });\n\n await this.#fetchAssetExchangeRates(updatedQuoteRequest).catch((error) =>\n console.warn('Failed to fetch asset exchange rates', error),\n );\n\n if (isValidQuoteRequest(updatedQuoteRequest)) {\n this.#quotesFirstFetched = Date.now();\n const providerConfig = this.#getSelectedNetworkClient()?.configuration;\n\n let insufficientBal: boolean | undefined;\n if (isSolanaChainId(updatedQuoteRequest.srcChainId)) {\n // If the source chain is not an EVM network, use value from params\n insufficientBal = paramsToUpdate.insufficientBal;\n } else if (providerConfig?.rpcUrl?.includes('tenderly')) {\n // If the rpcUrl is a tenderly fork (e2e tests), set insufficientBal=true\n // The bridge-api filters out quotes if the balance on mainnet is insufficient so this override allows quotes to always be returned\n insufficientBal = true;\n } else {\n // Otherwise query the src token balance from the RPC provider\n insufficientBal =\n paramsToUpdate.insufficientBal ??\n !(await this.#hasSufficientBalance(updatedQuoteRequest));\n }\n\n const networkClientId = this.#getSelectedNetworkClientId();\n // Set refresh rate based on the source chain before starting polling\n this.#setIntervalLength();\n this.startPolling({\n networkClientId,\n updatedQuoteRequest: {\n ...updatedQuoteRequest,\n insufficientBal,\n },\n context,\n });\n }\n };\n\n readonly #getExchangeRateSources = () => {\n return {\n ...this.messagingSystem.call('MultichainAssetsRatesController:getState'),\n ...this.messagingSystem.call('CurrencyRateController:getState'),\n ...this.messagingSystem.call('TokenRatesController:getState'),\n ...this.state,\n };\n };\n\n /**\n * Fetches the exchange rates for the assets in the quote request if they are not already in the state\n * In addition to the selected tokens, this also fetches the native asset for the source and destination chains\n *\n * @param quoteRequest - The quote request\n * @param quoteRequest.srcChainId - The source chain ID\n * @param quoteRequest.srcTokenAddress - The source token address\n * @param quoteRequest.destChainId - The destination chain ID\n * @param quoteRequest.destTokenAddress - The destination token address\n */\n readonly #fetchAssetExchangeRates = async ({\n srcChainId,\n srcTokenAddress,\n destChainId,\n destTokenAddress,\n }: Partial<GenericQuoteRequest>) => {\n const assetIds: Set<CaipAssetType> = new Set([]);\n const exchangeRateSources = this.#getExchangeRateSources();\n if (\n srcTokenAddress &&\n srcChainId &&\n !selectIsAssetExchangeRateInState(\n exchangeRateSources,\n srcChainId,\n srcTokenAddress,\n )\n ) {\n getAssetIdsForToken(srcTokenAddress, srcChainId).forEach((assetId) =>\n assetIds.add(assetId),\n );\n }\n if (\n destTokenAddress &&\n destChainId &&\n !selectIsAssetExchangeRateInState(\n exchangeRateSources,\n destChainId,\n destTokenAddress,\n )\n ) {\n getAssetIdsForToken(destTokenAddress, destChainId).forEach((assetId) =>\n assetIds.add(assetId),\n );\n }\n\n const currency = this.messagingSystem.call(\n 'CurrencyRateController:getState',\n ).currentCurrency;\n\n if (assetIds.size === 0) {\n return;\n }\n\n const pricesByAssetId = await fetchAssetPrices({\n assetIds,\n currencies: new Set([currency]),\n clientId: this.#clientId,\n fetchFn: this.#fetchFn,\n });\n const exchangeRates = toExchangeRates(currency, pricesByAssetId);\n this.update((state) => {\n state.assetExchangeRates = {\n ...state.assetExchangeRates,\n ...exchangeRates,\n };\n });\n };\n\n readonly #hasSufficientBalance = async (\n quoteRequest: GenericQuoteRequest,\n ) => {\n const walletAddress = this.#getMultichainSelectedAccount()?.address;\n const srcChainIdInHex = formatChainIdToHex(quoteRequest.srcChainId);\n const provider = this.#getSelectedNetworkClient()?.provider;\n const normalizedSrcTokenAddress = formatAddressToCaipReference(\n quoteRequest.srcTokenAddress,\n );\n\n return (\n provider &&\n walletAddress &&\n normalizedSrcTokenAddress &&\n quoteRequest.srcTokenAmount &&\n srcChainIdInHex &&\n (await hasSufficientBalance(\n provider,\n walletAddress,\n normalizedSrcTokenAddress,\n quoteRequest.srcTokenAmount,\n srcChainIdInHex,\n ))\n );\n };\n\n resetState = () => {\n this.stopAllPolling();\n this.#abortController?.abort(RESET_STATE_ABORT_MESSAGE);\n\n this.update((state) => {\n // Cannot do direct assignment to state, i.e. state = {... }, need to manually assign each field\n state.quoteRequest = DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest;\n state.quotesInitialLoadTime =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesInitialLoadTime;\n state.quotes = DEFAULT_BRIDGE_CONTROLLER_STATE.quotes;\n state.quotesLastFetched =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesLastFetched;\n state.quotesLoadingStatus =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesLoadingStatus;\n state.quoteFetchError = DEFAULT_BRIDGE_CONTROLLER_STATE.quoteFetchError;\n state.quotesRefreshCount =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesRefreshCount;\n state.assetExchangeRates =\n DEFAULT_BRIDGE_CONTROLLER_STATE.assetExchangeRates;\n\n // Keep feature flags\n const originalFeatureFlags = state.bridgeFeatureFlags;\n state.bridgeFeatureFlags = originalFeatureFlags;\n });\n };\n\n setBridgeFeatureFlags = async () => {\n const bridgeFeatureFlags = await fetchBridgeFeatureFlags(\n this.#clientId,\n this.#fetchFn,\n this.#config.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL,\n );\n this.update((state) => {\n state.bridgeFeatureFlags = bridgeFeatureFlags;\n });\n this.#setIntervalLength();\n };\n\n /**\n * Sets the interval length based on the source chain\n */\n readonly #setIntervalLength = () => {\n const { state } = this;\n const { srcChainId } = state.quoteRequest;\n const refreshRateOverride = srcChainId\n ? state.bridgeFeatureFlags[BridgeFeatureFlagsKey.EXTENSION_CONFIG].chains[\n formatChainIdToCaip(srcChainId)\n ]?.refreshRate\n : undefined;\n const defaultRefreshRate =\n state.bridgeFeatureFlags[BridgeFeatureFlagsKey.EXTENSION_CONFIG]\n .refreshRate;\n this.setIntervalLength(refreshRateOverride ?? defaultRefreshRate);\n };\n\n readonly #fetchBridgeQuotes = async ({\n networkClientId: _networkClientId,\n updatedQuoteRequest,\n context,\n }: BridgePollingInput) => {\n const { bridgeFeatureFlags, quotesInitialLoadTime, quotesRefreshCount } =\n this.state;\n this.#abortController?.abort('New quote request');\n this.#abortController = new AbortController();\n\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.QuotesRequested,\n context,\n );\n this.update((state) => {\n state.quotesLoadingStatus = RequestStatus.LOADING;\n state.quoteRequest = updatedQuoteRequest;\n state.quoteFetchError = DEFAULT_BRIDGE_CONTROLLER_STATE.quoteFetchError;\n });\n\n try {\n const quotes = await fetchBridgeQuotes(\n updatedQuoteRequest,\n // AbortController is always defined by this line, because we assign it a few lines above,\n // not sure why Jest thinks it's not\n // Linters accurately say that it's defined\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#abortController!.signal as AbortSignal,\n this.#clientId,\n this.#fetchFn,\n this.#config.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL,\n );\n\n const quotesWithL1GasFees = await this.#appendL1GasFees(quotes);\n const quotesWithSolanaFees = await this.#appendSolanaFees(quotes);\n\n this.update((state) => {\n state.quotes = quotesWithL1GasFees ?? quotesWithSolanaFees ?? quotes;\n state.quotesLoadingStatus = RequestStatus.FETCHED;\n });\n } catch (error) {\n const isAbortError = (error as Error).name === 'AbortError';\n const isAbortedDueToReset = error === RESET_STATE_ABORT_MESSAGE;\n if (isAbortedDueToReset || isAbortError) {\n return;\n }\n\n this.update((state) => {\n state.quoteFetchError =\n error instanceof Error ? error.message : 'Unknown error';\n state.quotesLoadingStatus = RequestStatus.ERROR;\n state.quotes = DEFAULT_BRIDGE_CONTROLLER_STATE.quotes;\n });\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.QuoteError,\n context,\n );\n console.log('Failed to fetch bridge quotes', error);\n } finally {\n const { maxRefreshCount } =\n bridgeFeatureFlags[BridgeFeatureFlagsKey.EXTENSION_CONFIG];\n\n const updatedQuotesRefreshCount = quotesRefreshCount + 1;\n // Stop polling if the maximum number of refreshes has been reached\n if (\n updatedQuoteRequest.insufficientBal ||\n (!updatedQuoteRequest.insufficientBal &&\n updatedQuotesRefreshCount >= maxRefreshCount)\n ) {\n this.stopAllPolling();\n }\n\n // Update quote fetching stats\n const quotesLastFetched = Date.now();\n this.update((state) => {\n state.quotesInitialLoadTime =\n updatedQuotesRefreshCount === 1 && this.#quotesFirstFetched\n ? quotesLastFetched - this.#quotesFirstFetched\n : quotesInitialLoadTime;\n state.quotesLastFetched = quotesLastFetched;\n state.quotesRefreshCount = updatedQuotesRefreshCount;\n });\n }\n };\n\n readonly #appendL1GasFees = async (\n quotes: QuoteResponse[],\n ): Promise<(QuoteResponse & L1GasFees)[] | undefined> => {\n // Indicates whether some of the quotes are not for optimism or base\n const hasInvalidQuotes = quotes.some(({ quote }) => {\n const chainId = formatChainIdToCaip(quote.srcChainId);\n return ![CHAIN_IDS.OPTIMISM, CHAIN_IDS.BASE]\n .map(formatChainIdToCaip)\n .includes(chainId);\n });\n\n // Only append L1 gas fees if all quotes are for either optimism or base\n if (!hasInvalidQuotes) {\n return await Promise.all(\n quotes.map(async (quoteResponse) => {\n const { quote, trade, approval } = quoteResponse;\n const chainId = numberToHex(quote.srcChainId) as ChainId;\n\n const getTxParams = (txData: TxData) => ({\n from: txData.from,\n to: txData.to,\n value: txData.value,\n data: txData.data,\n gasLimit: txData.gasLimit?.toString(),\n });\n const approvalL1GasFees = approval\n ? await this.#getLayer1GasFee({\n transactionParams: getTxParams(approval),\n chainId,\n })\n : '0';\n const tradeL1GasFees = await this.#getLayer1GasFee({\n transactionParams: getTxParams(trade),\n chainId,\n });\n return {\n ...quoteResponse,\n l1GasFeesInHexWei: sumHexes(approvalL1GasFees, tradeL1GasFees),\n };\n }),\n );\n }\n\n return undefined;\n };\n\n readonly #appendSolanaFees = async (\n quotes: QuoteResponse[],\n ): Promise<(QuoteResponse & SolanaFees)[] | undefined> => {\n // Return early if some of the quotes are not for solana\n if (\n quotes.some(({ quote: { srcChainId } }) => !isSolanaChainId(srcChainId))\n ) {\n return undefined;\n }\n\n return await Promise.all(\n quotes.map(async (quoteResponse) => {\n const { trade } = quoteResponse;\n const selectedAccount = this.#getMultichainSelectedAccount();\n\n if (selectedAccount?.metadata?.snap?.id && typeof trade === 'string') {\n const { value: fees } = (await this.messagingSystem.call(\n 'SnapController:handleRequest',\n {\n snapId: selectedAccount.metadata.snap?.id as never,\n origin: 'metamask',\n handler: 'onRpcRequest' as never,\n request: {\n method: 'getFeeForTransaction',\n params: {\n transaction: trade,\n scope: SolScope.Mainnet,\n },\n },\n },\n )) as { value: string };\n\n return {\n ...quoteResponse,\n solanaFeesInLamports: fees,\n };\n }\n return quoteResponse;\n }),\n );\n };\n\n #getMultichainSelectedAccount() {\n return this.messagingSystem.call(\n 'AccountsController:getSelectedMultichainAccount',\n );\n }\n\n #getSelectedNetworkClientId() {\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n return selectedNetworkClientId;\n }\n\n #getSelectedNetworkClient() {\n const selectedNetworkClientId = this.#getSelectedNetworkClientId();\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n return networkClient;\n }\n\n readonly #getRequestParams = (): Omit<\n RequestParams,\n 'token_symbol_source' | 'token_symbol_destination'\n > => {\n const srcChainIdCaip = formatChainIdToCaip(\n this.state.quoteRequest.srcChainId ||\n this.#getSelectedNetworkClient().configuration.chainId,\n );\n return getRequestParams(this.state.quoteRequest, srcChainIdCaip);\n };\n\n readonly #getRequestMetadata = (): Omit<\n RequestMetadata,\n 'stx_enabled' | 'usd_amount_source'\n > => {\n return {\n slippage_limit: this.state.quoteRequest.slippage,\n swap_type: getSwapTypeFromQuote(this.state.quoteRequest),\n is_hardware_wallet: isHardwareWallet(\n this.#getMultichainSelectedAccount(),\n ),\n custom_slippage: isCustomSlippage(this.state.quoteRequest.slippage),\n };\n };\n\n readonly #getQuoteFetchData = (): Omit<\n QuoteFetchData,\n 'best_quote_provider'\n > => {\n return {\n can_submit: Boolean(this.state.quoteRequest.insufficientBal), // TODO check if balance is sufficient for network fees\n quotes_count: this.state.quotes.length,\n quotes_list: this.state.quotes.map(({ quote }) =>\n formatProviderLabel(quote),\n ),\n initial_load_time_all_quotes: this.state.quotesInitialLoadTime ?? 0,\n };\n };\n\n readonly #getEventProperties = <\n T extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: T,\n propertiesFromClient: Pick<RequiredEventContextFromClient, T>[T],\n ): CrossChainSwapsEventProperties<T> => {\n const baseProperties = {\n action_type: getActionTypeFromQuoteRequest(this.state.quoteRequest),\n ...propertiesFromClient,\n };\n switch (eventName) {\n case UnifiedSwapBridgeEventName.ButtonClicked:\n case UnifiedSwapBridgeEventName.PageViewed:\n return {\n ...this.#getRequestParams(),\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.QuotesReceived:\n return {\n ...this.#getRequestParams(),\n ...this.#getRequestMetadata(),\n ...this.#getQuoteFetchData(),\n refresh_count: this.state.quotesRefreshCount,\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.QuotesRequested:\n case UnifiedSwapBridgeEventName.QuoteError:\n return {\n ...this.#getRequestParams(),\n ...this.#getRequestMetadata(),\n error_message: this.state.quoteFetchError,\n has_sufficient_funds: !this.state.quoteRequest.insufficientBal,\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.AllQuotesOpened:\n case UnifiedSwapBridgeEventName.AllQuotesSorted:\n case UnifiedSwapBridgeEventName.QuoteSelected:\n return {\n ...this.#getRequestParams(),\n ...this.#getRequestMetadata(),\n ...this.#getQuoteFetchData(),\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.SnapConfirmationViewed:\n return {\n ...baseProperties,\n ...this.#getRequestParams(),\n ...this.#getRequestMetadata(),\n };\n // These are populated by BridgeStatusController\n case UnifiedSwapBridgeEventName.Submitted:\n case UnifiedSwapBridgeEventName.Completed:\n case UnifiedSwapBridgeEventName.Failed:\n return propertiesFromClient;\n case UnifiedSwapBridgeEventName.InputChanged:\n default:\n return baseProperties;\n }\n };\n\n readonly #trackInputChangedEvents = (\n paramsToUpdate: Partial<GenericQuoteRequest>,\n ) => {\n Object.entries(paramsToUpdate).forEach(([key, value]) => {\n const inputKey = toInputChangedPropertyKey[key as keyof QuoteRequest];\n const inputValue =\n toInputChangedPropertyValue[key as keyof QuoteRequest]?.(\n paramsToUpdate,\n );\n if (\n inputKey &&\n inputValue !== undefined &&\n value !== this.state.quoteRequest[key as keyof GenericQuoteRequest]\n ) {\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.InputChanged,\n {\n input: inputKey,\n value: inputValue,\n },\n );\n }\n });\n };\n\n /**\n * This method tracks cross-chain swaps events\n *\n * @param eventName - The name of the event to track\n * @param propertiesFromClient - Properties that can't be calculated from the event name and need to be provided by the client\n * @example\n * this.trackUnifiedSwapBridgeEvent(UnifiedSwapBridgeEventName.ActionOpened, {\n * location: MetaMetricsSwapsEventSource.MainView,\n * });\n */\n trackUnifiedSwapBridgeEvent = <\n T extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: T,\n propertiesFromClient: Pick<RequiredEventContextFromClient, T>[T],\n ) => {\n try {\n const combinedPropertiesForEvent = this.#getEventProperties<T>(\n eventName,\n propertiesFromClient,\n );\n\n this.#trackMetaMetricsFn(eventName, combinedPropertiesForEvent);\n } catch (error) {\n console.error(\n 'Error tracking cross-chain swaps MetaMetrics event',\n error,\n );\n }\n };\n\n /**\n *\n * @param contractAddress - The address of the ERC20 token contract\n * @param chainId - The hex chain ID of the bridge network\n * @returns The atomic allowance of the ERC20 token contract\n */\n getBridgeERC20Allowance = async (\n contractAddress: string,\n chainId: Hex,\n ): Promise<string> => {\n const provider = this.#getSelectedNetworkClient()?.provider;\n if (!provider) {\n throw new Error('No provider found');\n }\n\n const ethersProvider = new Web3Provider(provider);\n const contract = new Contract(contractAddress, abiERC20, ethersProvider);\n const { address: walletAddress } =\n this.#getMultichainSelectedAccount() ?? {};\n const allowance: BigNumber = await contract.allowance(\n walletAddress,\n METABRIDGE_CHAIN_TO_ADDRESS_MAP[chainId],\n );\n return allowance.toString();\n };\n}\n"]}
1
+ {"version":3,"file":"bridge-controller.cjs","sourceRoot":"","sources":["../src/bridge-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BigNumber } from '@ethersproject/bignumber';\nimport { Contract } from '@ethersproject/contracts';\nimport { Web3Provider } from '@ethersproject/providers';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport type { ChainId } from '@metamask/controller-utils';\nimport { SolScope } from '@metamask/keyring-api';\nimport { abiERC20 } from '@metamask/metamask-eth-abis';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { TransactionParams } from '@metamask/transaction-controller';\nimport type { CaipAssetType } from '@metamask/utils';\nimport { numberToHex, type Hex } from '@metamask/utils';\n\nimport {\n type BridgeClientId,\n BRIDGE_CONTROLLER_NAME,\n BRIDGE_PROD_API_BASE_URL,\n DEFAULT_BRIDGE_CONTROLLER_STATE,\n METABRIDGE_CHAIN_TO_ADDRESS_MAP,\n REFRESH_INTERVAL_MS,\n} from './constants/bridge';\nimport { CHAIN_IDS } from './constants/chains';\nimport { selectIsAssetExchangeRateInState } from './selectors';\nimport type { QuoteRequest } from './types';\nimport {\n type L1GasFees,\n type GenericQuoteRequest,\n type SolanaFees,\n type QuoteResponse,\n type TxData,\n type BridgeControllerState,\n type BridgeControllerMessenger,\n type FetchFunction,\n RequestStatus,\n} from './types';\nimport { getAssetIdsForToken, toExchangeRates } from './utils/assets';\nimport { hasSufficientBalance } from './utils/balance';\nimport {\n getDefaultBridgeControllerState,\n isSolanaChainId,\n sumHexes,\n} from './utils/bridge';\nimport {\n formatAddressToCaipReference,\n formatChainIdToCaip,\n formatChainIdToHex,\n} from './utils/caip-formatters';\nimport { getBridgeFeatureFlags } from './utils/feature-flags';\nimport { fetchAssetPrices, fetchBridgeQuotes } from './utils/fetch';\nimport { UnifiedSwapBridgeEventName } from './utils/metrics/constants';\nimport {\n formatProviderLabel,\n getActionTypeFromQuoteRequest,\n getRequestParams,\n getSwapTypeFromQuote,\n isCustomSlippage,\n isHardwareWallet,\n toInputChangedPropertyKey,\n toInputChangedPropertyValue,\n} from './utils/metrics/properties';\nimport type {\n QuoteFetchData,\n RequestMetadata,\n RequestParams,\n RequiredEventContextFromClient,\n} from './utils/metrics/types';\nimport { type CrossChainSwapsEventProperties } from './utils/metrics/types';\nimport { isValidQuoteRequest } from './utils/quote';\n\nconst metadata: StateMetadata<BridgeControllerState> = {\n quoteRequest: {\n persist: false,\n anonymous: false,\n },\n quotes: {\n persist: false,\n anonymous: false,\n },\n quotesInitialLoadTime: {\n persist: false,\n anonymous: false,\n },\n quotesLastFetched: {\n persist: false,\n anonymous: false,\n },\n quotesLoadingStatus: {\n persist: false,\n anonymous: false,\n },\n quoteFetchError: {\n persist: false,\n anonymous: false,\n },\n quotesRefreshCount: {\n persist: false,\n anonymous: false,\n },\n assetExchangeRates: {\n persist: false,\n anonymous: false,\n },\n};\n\nconst RESET_STATE_ABORT_MESSAGE = 'Reset controller state';\n\n/**\n * The input to start polling for the {@link BridgeController}\n *\n * @param networkClientId - The network client ID of the selected network\n * @param updatedQuoteRequest - The updated quote request\n * @param context - The context contains properties that can't be populated by the\n * controller and need to be provided by the client for analytics\n */\ntype BridgePollingInput = {\n networkClientId: NetworkClientId;\n updatedQuoteRequest: GenericQuoteRequest;\n context: Pick<\n RequiredEventContextFromClient,\n UnifiedSwapBridgeEventName.QuoteError\n >[UnifiedSwapBridgeEventName.QuoteError] &\n Pick<\n RequiredEventContextFromClient,\n UnifiedSwapBridgeEventName.QuotesRequested\n >[UnifiedSwapBridgeEventName.QuotesRequested];\n};\n\nexport class BridgeController extends StaticIntervalPollingController<BridgePollingInput>()<\n typeof BRIDGE_CONTROLLER_NAME,\n BridgeControllerState,\n BridgeControllerMessenger\n> {\n #abortController: AbortController | undefined;\n\n #quotesFirstFetched: number | undefined;\n\n readonly #clientId: string;\n\n readonly #getLayer1GasFee: (params: {\n transactionParams: TransactionParams;\n chainId: ChainId;\n }) => Promise<string>;\n\n readonly #fetchFn: FetchFunction;\n\n readonly #trackMetaMetricsFn: <\n T extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: T,\n properties: CrossChainSwapsEventProperties<T>,\n ) => void;\n\n readonly #config: {\n customBridgeApiBaseUrl?: string;\n };\n\n constructor({\n messenger,\n state,\n clientId,\n getLayer1GasFee,\n fetchFn,\n config,\n trackMetaMetricsFn,\n }: {\n messenger: BridgeControllerMessenger;\n state?: Partial<BridgeControllerState>;\n clientId: BridgeClientId;\n getLayer1GasFee: (params: {\n transactionParams: TransactionParams;\n chainId: ChainId;\n }) => Promise<string>;\n fetchFn: FetchFunction;\n config?: {\n customBridgeApiBaseUrl?: string;\n };\n trackMetaMetricsFn: <\n T extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: T,\n properties: CrossChainSwapsEventProperties<T>,\n ) => void;\n }) {\n super({\n name: BRIDGE_CONTROLLER_NAME,\n metadata,\n messenger,\n state: {\n ...getDefaultBridgeControllerState(),\n ...state,\n },\n });\n\n this.setIntervalLength(REFRESH_INTERVAL_MS);\n\n this.#abortController = new AbortController();\n this.#getLayer1GasFee = getLayer1GasFee;\n this.#clientId = clientId;\n this.#fetchFn = fetchFn;\n this.#trackMetaMetricsFn = trackMetaMetricsFn;\n this.#config = config ?? {};\n\n // Register action handlers\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_CONTROLLER_NAME}:setChainIntervalLength`,\n this.setChainIntervalLength.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_CONTROLLER_NAME}:updateBridgeQuoteRequestParams`,\n this.updateBridgeQuoteRequestParams.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_CONTROLLER_NAME}:resetState`,\n this.resetState.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_CONTROLLER_NAME}:getBridgeERC20Allowance`,\n this.getBridgeERC20Allowance.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_CONTROLLER_NAME}:trackUnifiedSwapBridgeEvent`,\n this.trackUnifiedSwapBridgeEvent.bind(this),\n );\n }\n\n _executePoll = async (pollingInput: BridgePollingInput) => {\n await this.#fetchBridgeQuotes(pollingInput);\n };\n\n updateBridgeQuoteRequestParams = async (\n paramsToUpdate: Partial<GenericQuoteRequest>,\n context: BridgePollingInput['context'],\n ) => {\n this.stopAllPolling();\n this.#abortController?.abort('Quote request updated');\n\n this.#trackInputChangedEvents(paramsToUpdate);\n\n const updatedQuoteRequest = {\n ...DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest,\n ...paramsToUpdate,\n };\n\n this.update((state) => {\n state.quoteRequest = updatedQuoteRequest;\n state.quotes = DEFAULT_BRIDGE_CONTROLLER_STATE.quotes;\n state.quotesLastFetched =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesLastFetched;\n state.quotesLoadingStatus =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesLoadingStatus;\n state.quoteFetchError = DEFAULT_BRIDGE_CONTROLLER_STATE.quoteFetchError;\n state.quotesRefreshCount =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesRefreshCount;\n state.quotesInitialLoadTime =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesInitialLoadTime;\n });\n\n await this.#fetchAssetExchangeRates(updatedQuoteRequest).catch((error) =>\n console.warn('Failed to fetch asset exchange rates', error),\n );\n\n if (isValidQuoteRequest(updatedQuoteRequest)) {\n this.#quotesFirstFetched = Date.now();\n const providerConfig = this.#getSelectedNetworkClient()?.configuration;\n\n let insufficientBal: boolean | undefined;\n if (isSolanaChainId(updatedQuoteRequest.srcChainId)) {\n // If the source chain is not an EVM network, use value from params\n insufficientBal = paramsToUpdate.insufficientBal;\n } else if (providerConfig?.rpcUrl?.includes('tenderly')) {\n // If the rpcUrl is a tenderly fork (e2e tests), set insufficientBal=true\n // The bridge-api filters out quotes if the balance on mainnet is insufficient so this override allows quotes to always be returned\n insufficientBal = true;\n } else {\n // Otherwise query the src token balance from the RPC provider\n insufficientBal =\n paramsToUpdate.insufficientBal ??\n !(await this.#hasSufficientBalance(updatedQuoteRequest));\n }\n\n const networkClientId = this.#getSelectedNetworkClientId();\n // Set refresh rate based on the source chain before starting polling\n this.setChainIntervalLength();\n this.startPolling({\n networkClientId,\n updatedQuoteRequest: {\n ...updatedQuoteRequest,\n insufficientBal,\n },\n context,\n });\n }\n };\n\n readonly #getExchangeRateSources = () => {\n return {\n ...this.messagingSystem.call('MultichainAssetsRatesController:getState'),\n ...this.messagingSystem.call('CurrencyRateController:getState'),\n ...this.messagingSystem.call('TokenRatesController:getState'),\n ...this.state,\n };\n };\n\n /**\n * Fetches the exchange rates for the assets in the quote request if they are not already in the state\n * In addition to the selected tokens, this also fetches the native asset for the source and destination chains\n *\n * @param quoteRequest - The quote request\n * @param quoteRequest.srcChainId - The source chain ID\n * @param quoteRequest.srcTokenAddress - The source token address\n * @param quoteRequest.destChainId - The destination chain ID\n * @param quoteRequest.destTokenAddress - The destination token address\n */\n readonly #fetchAssetExchangeRates = async ({\n srcChainId,\n srcTokenAddress,\n destChainId,\n destTokenAddress,\n }: Partial<GenericQuoteRequest>) => {\n const assetIds: Set<CaipAssetType> = new Set([]);\n const exchangeRateSources = this.#getExchangeRateSources();\n if (\n srcTokenAddress &&\n srcChainId &&\n !selectIsAssetExchangeRateInState(\n exchangeRateSources,\n srcChainId,\n srcTokenAddress,\n )\n ) {\n getAssetIdsForToken(srcTokenAddress, srcChainId).forEach((assetId) =>\n assetIds.add(assetId),\n );\n }\n if (\n destTokenAddress &&\n destChainId &&\n !selectIsAssetExchangeRateInState(\n exchangeRateSources,\n destChainId,\n destTokenAddress,\n )\n ) {\n getAssetIdsForToken(destTokenAddress, destChainId).forEach((assetId) =>\n assetIds.add(assetId),\n );\n }\n\n const currency = this.messagingSystem.call(\n 'CurrencyRateController:getState',\n ).currentCurrency;\n\n if (assetIds.size === 0) {\n return;\n }\n\n const pricesByAssetId = await fetchAssetPrices({\n assetIds,\n currencies: new Set([currency]),\n clientId: this.#clientId,\n fetchFn: this.#fetchFn,\n });\n const exchangeRates = toExchangeRates(currency, pricesByAssetId);\n this.update((state) => {\n state.assetExchangeRates = {\n ...state.assetExchangeRates,\n ...exchangeRates,\n };\n });\n };\n\n readonly #hasSufficientBalance = async (\n quoteRequest: GenericQuoteRequest,\n ) => {\n const walletAddress = this.#getMultichainSelectedAccount()?.address;\n const srcChainIdInHex = formatChainIdToHex(quoteRequest.srcChainId);\n const provider = this.#getSelectedNetworkClient()?.provider;\n const normalizedSrcTokenAddress = formatAddressToCaipReference(\n quoteRequest.srcTokenAddress,\n );\n\n return (\n provider &&\n walletAddress &&\n normalizedSrcTokenAddress &&\n quoteRequest.srcTokenAmount &&\n srcChainIdInHex &&\n (await hasSufficientBalance(\n provider,\n walletAddress,\n normalizedSrcTokenAddress,\n quoteRequest.srcTokenAmount,\n srcChainIdInHex,\n ))\n );\n };\n\n resetState = () => {\n this.stopAllPolling();\n this.#abortController?.abort(RESET_STATE_ABORT_MESSAGE);\n\n this.update((state) => {\n // Cannot do direct assignment to state, i.e. state = {... }, need to manually assign each field\n state.quoteRequest = DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest;\n state.quotesInitialLoadTime =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesInitialLoadTime;\n state.quotes = DEFAULT_BRIDGE_CONTROLLER_STATE.quotes;\n state.quotesLastFetched =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesLastFetched;\n state.quotesLoadingStatus =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesLoadingStatus;\n state.quoteFetchError = DEFAULT_BRIDGE_CONTROLLER_STATE.quoteFetchError;\n state.quotesRefreshCount =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesRefreshCount;\n state.assetExchangeRates =\n DEFAULT_BRIDGE_CONTROLLER_STATE.assetExchangeRates;\n });\n };\n\n /**\n * Sets the interval length based on the source chain\n */\n setChainIntervalLength = () => {\n const { state } = this;\n const { srcChainId } = state.quoteRequest;\n const bridgeFeatureFlags = getBridgeFeatureFlags(this.messagingSystem);\n\n const refreshRateOverride = srcChainId\n ? bridgeFeatureFlags.chains[formatChainIdToCaip(srcChainId)]?.refreshRate\n : undefined;\n const defaultRefreshRate = bridgeFeatureFlags.refreshRate;\n this.setIntervalLength(refreshRateOverride ?? defaultRefreshRate);\n };\n\n readonly #fetchBridgeQuotes = async ({\n networkClientId: _networkClientId,\n updatedQuoteRequest,\n context,\n }: BridgePollingInput) => {\n const { quotesInitialLoadTime, quotesRefreshCount } = this.state;\n this.#abortController?.abort('New quote request');\n this.#abortController = new AbortController();\n\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.QuotesRequested,\n context,\n );\n this.update((state) => {\n state.quotesLoadingStatus = RequestStatus.LOADING;\n state.quoteRequest = updatedQuoteRequest;\n state.quoteFetchError = DEFAULT_BRIDGE_CONTROLLER_STATE.quoteFetchError;\n });\n\n try {\n const quotes = await fetchBridgeQuotes(\n updatedQuoteRequest,\n // AbortController is always defined by this line, because we assign it a few lines above,\n // not sure why Jest thinks it's not\n // Linters accurately say that it's defined\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#abortController!.signal as AbortSignal,\n this.#clientId,\n this.#fetchFn,\n this.#config.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL,\n );\n\n const quotesWithL1GasFees = await this.#appendL1GasFees(quotes);\n const quotesWithSolanaFees = await this.#appendSolanaFees(quotes);\n\n this.update((state) => {\n state.quotes = quotesWithL1GasFees ?? quotesWithSolanaFees ?? quotes;\n state.quotesLoadingStatus = RequestStatus.FETCHED;\n });\n } catch (error) {\n const isAbortError = (error as Error).name === 'AbortError';\n const isAbortedDueToReset = error === RESET_STATE_ABORT_MESSAGE;\n if (isAbortedDueToReset || isAbortError) {\n return;\n }\n\n this.update((state) => {\n state.quoteFetchError =\n error instanceof Error ? error.message : 'Unknown error';\n state.quotesLoadingStatus = RequestStatus.ERROR;\n state.quotes = DEFAULT_BRIDGE_CONTROLLER_STATE.quotes;\n });\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.QuoteError,\n context,\n );\n console.log('Failed to fetch bridge quotes', error);\n } finally {\n const bridgeFeatureFlags = getBridgeFeatureFlags(this.messagingSystem);\n const { maxRefreshCount } = bridgeFeatureFlags;\n\n const updatedQuotesRefreshCount = quotesRefreshCount + 1;\n // Stop polling if the maximum number of refreshes has been reached\n if (\n updatedQuoteRequest.insufficientBal ||\n (!updatedQuoteRequest.insufficientBal &&\n updatedQuotesRefreshCount >= maxRefreshCount)\n ) {\n this.stopAllPolling();\n }\n\n // Update quote fetching stats\n const quotesLastFetched = Date.now();\n this.update((state) => {\n state.quotesInitialLoadTime =\n updatedQuotesRefreshCount === 1 && this.#quotesFirstFetched\n ? quotesLastFetched - this.#quotesFirstFetched\n : quotesInitialLoadTime;\n state.quotesLastFetched = quotesLastFetched;\n state.quotesRefreshCount = updatedQuotesRefreshCount;\n });\n }\n };\n\n readonly #appendL1GasFees = async (\n quotes: QuoteResponse[],\n ): Promise<(QuoteResponse & L1GasFees)[] | undefined> => {\n // Indicates whether some of the quotes are not for optimism or base\n const hasInvalidQuotes = quotes.some(({ quote }) => {\n const chainId = formatChainIdToCaip(quote.srcChainId);\n return ![CHAIN_IDS.OPTIMISM, CHAIN_IDS.BASE]\n .map(formatChainIdToCaip)\n .includes(chainId);\n });\n\n // Only append L1 gas fees if all quotes are for either optimism or base\n if (!hasInvalidQuotes) {\n return await Promise.all(\n quotes.map(async (quoteResponse) => {\n const { quote, trade, approval } = quoteResponse;\n const chainId = numberToHex(quote.srcChainId) as ChainId;\n\n const getTxParams = (txData: TxData) => ({\n from: txData.from,\n to: txData.to,\n value: txData.value,\n data: txData.data,\n gasLimit: txData.gasLimit?.toString(),\n });\n const approvalL1GasFees = approval\n ? await this.#getLayer1GasFee({\n transactionParams: getTxParams(approval),\n chainId,\n })\n : '0';\n const tradeL1GasFees = await this.#getLayer1GasFee({\n transactionParams: getTxParams(trade),\n chainId,\n });\n return {\n ...quoteResponse,\n l1GasFeesInHexWei: sumHexes(approvalL1GasFees, tradeL1GasFees),\n };\n }),\n );\n }\n\n return undefined;\n };\n\n readonly #appendSolanaFees = async (\n quotes: QuoteResponse[],\n ): Promise<(QuoteResponse & SolanaFees)[] | undefined> => {\n // Return early if some of the quotes are not for solana\n if (\n quotes.some(({ quote: { srcChainId } }) => !isSolanaChainId(srcChainId))\n ) {\n return undefined;\n }\n\n return await Promise.all(\n quotes.map(async (quoteResponse) => {\n const { trade } = quoteResponse;\n const selectedAccount = this.#getMultichainSelectedAccount();\n\n if (selectedAccount?.metadata?.snap?.id && typeof trade === 'string') {\n const { value: fees } = (await this.messagingSystem.call(\n 'SnapController:handleRequest',\n {\n snapId: selectedAccount.metadata.snap?.id as never,\n origin: 'metamask',\n handler: 'onRpcRequest' as never,\n request: {\n method: 'getFeeForTransaction',\n params: {\n transaction: trade,\n scope: SolScope.Mainnet,\n },\n },\n },\n )) as { value: string };\n\n return {\n ...quoteResponse,\n solanaFeesInLamports: fees,\n };\n }\n return quoteResponse;\n }),\n );\n };\n\n #getMultichainSelectedAccount() {\n return this.messagingSystem.call(\n 'AccountsController:getSelectedMultichainAccount',\n );\n }\n\n #getSelectedNetworkClientId() {\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n return selectedNetworkClientId;\n }\n\n #getSelectedNetworkClient() {\n const selectedNetworkClientId = this.#getSelectedNetworkClientId();\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n return networkClient;\n }\n\n readonly #getRequestParams = (): Omit<\n RequestParams,\n 'token_symbol_source' | 'token_symbol_destination'\n > => {\n const srcChainIdCaip = formatChainIdToCaip(\n this.state.quoteRequest.srcChainId ||\n this.#getSelectedNetworkClient().configuration.chainId,\n );\n return getRequestParams(this.state.quoteRequest, srcChainIdCaip);\n };\n\n readonly #getRequestMetadata = (): Omit<\n RequestMetadata,\n 'stx_enabled' | 'usd_amount_source'\n > => {\n return {\n slippage_limit: this.state.quoteRequest.slippage,\n swap_type: getSwapTypeFromQuote(this.state.quoteRequest),\n is_hardware_wallet: isHardwareWallet(\n this.#getMultichainSelectedAccount(),\n ),\n custom_slippage: isCustomSlippage(this.state.quoteRequest.slippage),\n };\n };\n\n readonly #getQuoteFetchData = (): Omit<\n QuoteFetchData,\n 'best_quote_provider'\n > => {\n return {\n can_submit: Boolean(this.state.quoteRequest.insufficientBal), // TODO check if balance is sufficient for network fees\n quotes_count: this.state.quotes.length,\n quotes_list: this.state.quotes.map(({ quote }) =>\n formatProviderLabel(quote),\n ),\n initial_load_time_all_quotes: this.state.quotesInitialLoadTime ?? 0,\n };\n };\n\n readonly #getEventProperties = <\n T extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: T,\n propertiesFromClient: Pick<RequiredEventContextFromClient, T>[T],\n ): CrossChainSwapsEventProperties<T> => {\n const baseProperties = {\n action_type: getActionTypeFromQuoteRequest(this.state.quoteRequest),\n ...propertiesFromClient,\n };\n switch (eventName) {\n case UnifiedSwapBridgeEventName.ButtonClicked:\n case UnifiedSwapBridgeEventName.PageViewed:\n return {\n ...this.#getRequestParams(),\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.QuotesReceived:\n return {\n ...this.#getRequestParams(),\n ...this.#getRequestMetadata(),\n ...this.#getQuoteFetchData(),\n refresh_count: this.state.quotesRefreshCount,\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.QuotesRequested:\n case UnifiedSwapBridgeEventName.QuoteError:\n return {\n ...this.#getRequestParams(),\n ...this.#getRequestMetadata(),\n error_message: this.state.quoteFetchError,\n has_sufficient_funds: !this.state.quoteRequest.insufficientBal,\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.AllQuotesOpened:\n case UnifiedSwapBridgeEventName.AllQuotesSorted:\n case UnifiedSwapBridgeEventName.QuoteSelected:\n return {\n ...this.#getRequestParams(),\n ...this.#getRequestMetadata(),\n ...this.#getQuoteFetchData(),\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.SnapConfirmationViewed:\n return {\n ...baseProperties,\n ...this.#getRequestParams(),\n ...this.#getRequestMetadata(),\n };\n // These are populated by BridgeStatusController\n case UnifiedSwapBridgeEventName.Submitted:\n case UnifiedSwapBridgeEventName.Completed:\n case UnifiedSwapBridgeEventName.Failed:\n return propertiesFromClient;\n case UnifiedSwapBridgeEventName.InputChanged:\n default:\n return baseProperties;\n }\n };\n\n readonly #trackInputChangedEvents = (\n paramsToUpdate: Partial<GenericQuoteRequest>,\n ) => {\n Object.entries(paramsToUpdate).forEach(([key, value]) => {\n const inputKey = toInputChangedPropertyKey[key as keyof QuoteRequest];\n const inputValue =\n toInputChangedPropertyValue[key as keyof QuoteRequest]?.(\n paramsToUpdate,\n );\n if (\n inputKey &&\n inputValue !== undefined &&\n value !== this.state.quoteRequest[key as keyof GenericQuoteRequest]\n ) {\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.InputChanged,\n {\n input: inputKey,\n value: inputValue,\n },\n );\n }\n });\n };\n\n /**\n * This method tracks cross-chain swaps events\n *\n * @param eventName - The name of the event to track\n * @param propertiesFromClient - Properties that can't be calculated from the event name and need to be provided by the client\n * @example\n * this.trackUnifiedSwapBridgeEvent(UnifiedSwapBridgeEventName.ActionOpened, {\n * location: MetaMetricsSwapsEventSource.MainView,\n * });\n */\n trackUnifiedSwapBridgeEvent = <\n T extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: T,\n propertiesFromClient: Pick<RequiredEventContextFromClient, T>[T],\n ) => {\n try {\n const combinedPropertiesForEvent = this.#getEventProperties<T>(\n eventName,\n propertiesFromClient,\n );\n\n this.#trackMetaMetricsFn(eventName, combinedPropertiesForEvent);\n } catch (error) {\n console.error(\n 'Error tracking cross-chain swaps MetaMetrics event',\n error,\n );\n }\n };\n\n /**\n *\n * @param contractAddress - The address of the ERC20 token contract\n * @param chainId - The hex chain ID of the bridge network\n * @returns The atomic allowance of the ERC20 token contract\n */\n getBridgeERC20Allowance = async (\n contractAddress: string,\n chainId: Hex,\n ): Promise<string> => {\n const provider = this.#getSelectedNetworkClient()?.provider;\n if (!provider) {\n throw new Error('No provider found');\n }\n\n const ethersProvider = new Web3Provider(provider);\n const contract = new Contract(contractAddress, abiERC20, ethersProvider);\n const { address: walletAddress } =\n this.#getMultichainSelectedAccount() ?? {};\n const allowance: BigNumber = await contract.allowance(\n walletAddress,\n METABRIDGE_CHAIN_TO_ADDRESS_MAP[chainId],\n );\n return allowance.toString();\n };\n}\n"]}
@@ -54,7 +54,10 @@ export declare class BridgeController extends BridgeController_base<typeof BRIDG
54
54
  _executePoll: (pollingInput: BridgePollingInput) => Promise<void>;
55
55
  updateBridgeQuoteRequestParams: (paramsToUpdate: Partial<GenericQuoteRequest>, context: BridgePollingInput['context']) => Promise<void>;
56
56
  resetState: () => void;
57
- setBridgeFeatureFlags: () => Promise<void>;
57
+ /**
58
+ * Sets the interval length based on the source chain
59
+ */
60
+ setChainIntervalLength: () => void;
58
61
  /**
59
62
  * This method tracks cross-chain swaps events
60
63
  *
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-controller.d.cts","sourceRoot":"","sources":["../src/bridge-controller.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,mCAAmC;AAG1D,OAAO,KAAK,EAAE,eAAe,EAAE,qCAAqC;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,yCAAyC;AAE1E,OAAO,EAAe,KAAK,GAAG,EAAE,wBAAwB;AAExD,OAAO,EACL,KAAK,cAAc,EACnB,sBAAsB,EAKvB,+BAA2B;AAI5B,OAAO,EAEL,KAAK,mBAAmB,EAIxB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,aAAa,EAGnB,oBAAgB;AAkBjB,OAAO,EAAE,0BAA0B,EAAE,sCAAkC;AAWvE,OAAO,KAAK,EAIV,8BAA8B,EAC/B,kCAA8B;AAC/B,OAAO,EAAE,KAAK,8BAA8B,EAAE,kCAA8B;AA4C5E;;;;;;;GAOG;AACH,KAAK,kBAAkB,GAAG;IACxB,eAAe,EAAE,eAAe,CAAC;IACjC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,OAAO,EAAE,IAAI,CACX,8BAA8B,EAC9B,0BAA0B,CAAC,UAAU,CACtC,CAAC,0BAA0B,CAAC,UAAU,CAAC,GACtC,IAAI,CACF,8BAA8B,EAC9B,0BAA0B,CAAC,eAAe,CAC3C,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;CACjD,CAAC;;;;;;;;;;;;;;;;AAEF,qBAAa,gBAAiB,SAAQ,sBACpC,OAAO,sBAAsB,EAC7B,qBAAqB,EACrB,yBAAyB,CAC1B;;gBA0Ba,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,eAAe,EACf,OAAO,EACP,MAAM,EACN,kBAAkB,GACnB,EAAE;QACD,SAAS,EAAE,yBAAyB,CAAC;QACrC,KAAK,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACvC,QAAQ,EAAE,cAAc,CAAC;QACzB,eAAe,EAAE,CAAC,MAAM,EAAE;YACxB,iBAAiB,EAAE,iBAAiB,CAAC;YACrC,OAAO,EAAE,OAAO,CAAC;SAClB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO,EAAE,aAAa,CAAC;QACvB,MAAM,CAAC,EAAE;YACP,sBAAsB,CAAC,EAAE,MAAM,CAAC;SACjC,CAAC;QACF,kBAAkB,EAAE,CAClB,CAAC,SACC,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,OAAO,0BAA0B,CAAC,EAE9E,SAAS,EAAE,CAAC,EACZ,UAAU,EAAE,8BAA8B,CAAC,CAAC,CAAC,KAC1C,IAAI,CAAC;KACX;IA2CD,YAAY,iBAAwB,kBAAkB,mBAEpD;IAEF,8BAA8B,mBACZ,QAAQ,mBAAmB,CAAC,WACnC,kBAAkB,CAAC,SAAS,CAAC,mBA6DtC;IAyGF,UAAU,aAwBR;IAEF,qBAAqB,sBAUnB;IAmVF;;;;;;;;;OASG;IACH,2BAA2B,iIAoBzB;IAEF;;;;;OAKG;IACH,uBAAuB,oBACJ,MAAM,WACd,GAAG,KACX,QAAQ,MAAM,CAAC,CAehB;CACH"}
1
+ {"version":3,"file":"bridge-controller.d.cts","sourceRoot":"","sources":["../src/bridge-controller.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,mCAAmC;AAG1D,OAAO,KAAK,EAAE,eAAe,EAAE,qCAAqC;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,yCAAyC;AAE1E,OAAO,EAAe,KAAK,GAAG,EAAE,wBAAwB;AAExD,OAAO,EACL,KAAK,cAAc,EACnB,sBAAsB,EAKvB,+BAA2B;AAI5B,OAAO,EAEL,KAAK,mBAAmB,EAIxB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,aAAa,EAEnB,oBAAgB;AAejB,OAAO,EAAE,0BAA0B,EAAE,sCAAkC;AAWvE,OAAO,KAAK,EAIV,8BAA8B,EAC/B,kCAA8B;AAC/B,OAAO,EAAE,KAAK,8BAA8B,EAAE,kCAA8B;AAwC5E;;;;;;;GAOG;AACH,KAAK,kBAAkB,GAAG;IACxB,eAAe,EAAE,eAAe,CAAC;IACjC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,OAAO,EAAE,IAAI,CACX,8BAA8B,EAC9B,0BAA0B,CAAC,UAAU,CACtC,CAAC,0BAA0B,CAAC,UAAU,CAAC,GACtC,IAAI,CACF,8BAA8B,EAC9B,0BAA0B,CAAC,eAAe,CAC3C,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;CACjD,CAAC;;;;;;;;;;;;;;;;AAEF,qBAAa,gBAAiB,SAAQ,sBACpC,OAAO,sBAAsB,EAC7B,qBAAqB,EACrB,yBAAyB,CAC1B;;gBA0Ba,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,eAAe,EACf,OAAO,EACP,MAAM,EACN,kBAAkB,GACnB,EAAE;QACD,SAAS,EAAE,yBAAyB,CAAC;QACrC,KAAK,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACvC,QAAQ,EAAE,cAAc,CAAC;QACzB,eAAe,EAAE,CAAC,MAAM,EAAE;YACxB,iBAAiB,EAAE,iBAAiB,CAAC;YACrC,OAAO,EAAE,OAAO,CAAC;SAClB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO,EAAE,aAAa,CAAC;QACvB,MAAM,CAAC,EAAE;YACP,sBAAsB,CAAC,EAAE,MAAM,CAAC;SACjC,CAAC;QACF,kBAAkB,EAAE,CAClB,CAAC,SACC,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,OAAO,0BAA0B,CAAC,EAE9E,SAAS,EAAE,CAAC,EACZ,UAAU,EAAE,8BAA8B,CAAC,CAAC,CAAC,KAC1C,IAAI,CAAC;KACX;IA2CD,YAAY,iBAAwB,kBAAkB,mBAEpD;IAEF,8BAA8B,mBACZ,QAAQ,mBAAmB,CAAC,WACnC,kBAAkB,CAAC,SAAS,CAAC,mBA6DtC;IAyGF,UAAU,aAoBR;IAEF;;OAEG;IACH,sBAAsB,aAUpB;IAiUF;;;;;;;;;OASG;IACH,2BAA2B,iIAoBzB;IAEF;;;;;OAKG;IACH,uBAAuB,oBACJ,MAAM,WACd,GAAG,KACX,QAAQ,MAAM,CAAC,CAehB;CACH"}
@@ -54,7 +54,10 @@ export declare class BridgeController extends BridgeController_base<typeof BRIDG
54
54
  _executePoll: (pollingInput: BridgePollingInput) => Promise<void>;
55
55
  updateBridgeQuoteRequestParams: (paramsToUpdate: Partial<GenericQuoteRequest>, context: BridgePollingInput['context']) => Promise<void>;
56
56
  resetState: () => void;
57
- setBridgeFeatureFlags: () => Promise<void>;
57
+ /**
58
+ * Sets the interval length based on the source chain
59
+ */
60
+ setChainIntervalLength: () => void;
58
61
  /**
59
62
  * This method tracks cross-chain swaps events
60
63
  *
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-controller.d.mts","sourceRoot":"","sources":["../src/bridge-controller.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,mCAAmC;AAG1D,OAAO,KAAK,EAAE,eAAe,EAAE,qCAAqC;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,yCAAyC;AAE1E,OAAO,EAAe,KAAK,GAAG,EAAE,wBAAwB;AAExD,OAAO,EACL,KAAK,cAAc,EACnB,sBAAsB,EAKvB,+BAA2B;AAI5B,OAAO,EAEL,KAAK,mBAAmB,EAIxB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,aAAa,EAGnB,oBAAgB;AAkBjB,OAAO,EAAE,0BAA0B,EAAE,sCAAkC;AAWvE,OAAO,KAAK,EAIV,8BAA8B,EAC/B,kCAA8B;AAC/B,OAAO,EAAE,KAAK,8BAA8B,EAAE,kCAA8B;AA4C5E;;;;;;;GAOG;AACH,KAAK,kBAAkB,GAAG;IACxB,eAAe,EAAE,eAAe,CAAC;IACjC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,OAAO,EAAE,IAAI,CACX,8BAA8B,EAC9B,0BAA0B,CAAC,UAAU,CACtC,CAAC,0BAA0B,CAAC,UAAU,CAAC,GACtC,IAAI,CACF,8BAA8B,EAC9B,0BAA0B,CAAC,eAAe,CAC3C,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;CACjD,CAAC;;;;;;;;;;;;;;;;AAEF,qBAAa,gBAAiB,SAAQ,sBACpC,OAAO,sBAAsB,EAC7B,qBAAqB,EACrB,yBAAyB,CAC1B;;gBA0Ba,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,eAAe,EACf,OAAO,EACP,MAAM,EACN,kBAAkB,GACnB,EAAE;QACD,SAAS,EAAE,yBAAyB,CAAC;QACrC,KAAK,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACvC,QAAQ,EAAE,cAAc,CAAC;QACzB,eAAe,EAAE,CAAC,MAAM,EAAE;YACxB,iBAAiB,EAAE,iBAAiB,CAAC;YACrC,OAAO,EAAE,OAAO,CAAC;SAClB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO,EAAE,aAAa,CAAC;QACvB,MAAM,CAAC,EAAE;YACP,sBAAsB,CAAC,EAAE,MAAM,CAAC;SACjC,CAAC;QACF,kBAAkB,EAAE,CAClB,CAAC,SACC,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,OAAO,0BAA0B,CAAC,EAE9E,SAAS,EAAE,CAAC,EACZ,UAAU,EAAE,8BAA8B,CAAC,CAAC,CAAC,KAC1C,IAAI,CAAC;KACX;IA2CD,YAAY,iBAAwB,kBAAkB,mBAEpD;IAEF,8BAA8B,mBACZ,QAAQ,mBAAmB,CAAC,WACnC,kBAAkB,CAAC,SAAS,CAAC,mBA6DtC;IAyGF,UAAU,aAwBR;IAEF,qBAAqB,sBAUnB;IAmVF;;;;;;;;;OASG;IACH,2BAA2B,iIAoBzB;IAEF;;;;;OAKG;IACH,uBAAuB,oBACJ,MAAM,WACd,GAAG,KACX,QAAQ,MAAM,CAAC,CAehB;CACH"}
1
+ {"version":3,"file":"bridge-controller.d.mts","sourceRoot":"","sources":["../src/bridge-controller.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,mCAAmC;AAG1D,OAAO,KAAK,EAAE,eAAe,EAAE,qCAAqC;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,yCAAyC;AAE1E,OAAO,EAAe,KAAK,GAAG,EAAE,wBAAwB;AAExD,OAAO,EACL,KAAK,cAAc,EACnB,sBAAsB,EAKvB,+BAA2B;AAI5B,OAAO,EAEL,KAAK,mBAAmB,EAIxB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,aAAa,EAEnB,oBAAgB;AAejB,OAAO,EAAE,0BAA0B,EAAE,sCAAkC;AAWvE,OAAO,KAAK,EAIV,8BAA8B,EAC/B,kCAA8B;AAC/B,OAAO,EAAE,KAAK,8BAA8B,EAAE,kCAA8B;AAwC5E;;;;;;;GAOG;AACH,KAAK,kBAAkB,GAAG;IACxB,eAAe,EAAE,eAAe,CAAC;IACjC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,OAAO,EAAE,IAAI,CACX,8BAA8B,EAC9B,0BAA0B,CAAC,UAAU,CACtC,CAAC,0BAA0B,CAAC,UAAU,CAAC,GACtC,IAAI,CACF,8BAA8B,EAC9B,0BAA0B,CAAC,eAAe,CAC3C,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;CACjD,CAAC;;;;;;;;;;;;;;;;AAEF,qBAAa,gBAAiB,SAAQ,sBACpC,OAAO,sBAAsB,EAC7B,qBAAqB,EACrB,yBAAyB,CAC1B;;gBA0Ba,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,eAAe,EACf,OAAO,EACP,MAAM,EACN,kBAAkB,GACnB,EAAE;QACD,SAAS,EAAE,yBAAyB,CAAC;QACrC,KAAK,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACvC,QAAQ,EAAE,cAAc,CAAC;QACzB,eAAe,EAAE,CAAC,MAAM,EAAE;YACxB,iBAAiB,EAAE,iBAAiB,CAAC;YACrC,OAAO,EAAE,OAAO,CAAC;SAClB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO,EAAE,aAAa,CAAC;QACvB,MAAM,CAAC,EAAE;YACP,sBAAsB,CAAC,EAAE,MAAM,CAAC;SACjC,CAAC;QACF,kBAAkB,EAAE,CAClB,CAAC,SACC,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,OAAO,0BAA0B,CAAC,EAE9E,SAAS,EAAE,CAAC,EACZ,UAAU,EAAE,8BAA8B,CAAC,CAAC,CAAC,KAC1C,IAAI,CAAC;KACX;IA2CD,YAAY,iBAAwB,kBAAkB,mBAEpD;IAEF,8BAA8B,mBACZ,QAAQ,mBAAmB,CAAC,WACnC,kBAAkB,CAAC,SAAS,CAAC,mBA6DtC;IAyGF,UAAU,aAoBR;IAEF;;OAEG;IACH,sBAAsB,aAUpB;IAiUF;;;;;;;;;OASG;IACH,2BAA2B,iIAoBzB;IAEF;;;;;OAKG;IACH,uBAAuB,oBACJ,MAAM,WACd,GAAG,KACX,QAAQ,MAAM,CAAC,CAehB;CACH"}
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _BridgeController_instances, _BridgeController_abortController, _BridgeController_quotesFirstFetched, _BridgeController_clientId, _BridgeController_getLayer1GasFee, _BridgeController_fetchFn, _BridgeController_trackMetaMetricsFn, _BridgeController_config, _BridgeController_getExchangeRateSources, _BridgeController_fetchAssetExchangeRates, _BridgeController_hasSufficientBalance, _BridgeController_setIntervalLength, _BridgeController_fetchBridgeQuotes, _BridgeController_appendL1GasFees, _BridgeController_appendSolanaFees, _BridgeController_getMultichainSelectedAccount, _BridgeController_getSelectedNetworkClientId, _BridgeController_getSelectedNetworkClient, _BridgeController_getRequestParams, _BridgeController_getRequestMetadata, _BridgeController_getQuoteFetchData, _BridgeController_getEventProperties, _BridgeController_trackInputChangedEvents;
12
+ var _BridgeController_instances, _BridgeController_abortController, _BridgeController_quotesFirstFetched, _BridgeController_clientId, _BridgeController_getLayer1GasFee, _BridgeController_fetchFn, _BridgeController_trackMetaMetricsFn, _BridgeController_config, _BridgeController_getExchangeRateSources, _BridgeController_fetchAssetExchangeRates, _BridgeController_hasSufficientBalance, _BridgeController_fetchBridgeQuotes, _BridgeController_appendL1GasFees, _BridgeController_appendSolanaFees, _BridgeController_getMultichainSelectedAccount, _BridgeController_getSelectedNetworkClientId, _BridgeController_getSelectedNetworkClient, _BridgeController_getRequestParams, _BridgeController_getRequestMetadata, _BridgeController_getQuoteFetchData, _BridgeController_getEventProperties, _BridgeController_trackInputChangedEvents;
13
13
  import { Contract } from "@ethersproject/contracts";
14
14
  import { Web3Provider } from "@ethersproject/providers";
15
15
  import { SolScope } from "@metamask/keyring-api";
@@ -19,20 +19,17 @@ import { numberToHex } from "@metamask/utils";
19
19
  import { BRIDGE_CONTROLLER_NAME, BRIDGE_PROD_API_BASE_URL, DEFAULT_BRIDGE_CONTROLLER_STATE, METABRIDGE_CHAIN_TO_ADDRESS_MAP, REFRESH_INTERVAL_MS } from "./constants/bridge.mjs";
20
20
  import { CHAIN_IDS } from "./constants/chains.mjs";
21
21
  import { selectIsAssetExchangeRateInState } from "./selectors.mjs";
22
- import { BridgeFeatureFlagsKey, RequestStatus } from "./types.mjs";
22
+ import { RequestStatus } from "./types.mjs";
23
23
  import { getAssetIdsForToken, toExchangeRates } from "./utils/assets.mjs";
24
24
  import { hasSufficientBalance } from "./utils/balance.mjs";
25
25
  import { getDefaultBridgeControllerState, isSolanaChainId, sumHexes } from "./utils/bridge.mjs";
26
26
  import { formatAddressToCaipReference, formatChainIdToCaip, formatChainIdToHex } from "./utils/caip-formatters.mjs";
27
- import { fetchAssetPrices, fetchBridgeFeatureFlags, fetchBridgeQuotes } from "./utils/fetch.mjs";
27
+ import { getBridgeFeatureFlags } from "./utils/feature-flags.mjs";
28
+ import { fetchAssetPrices, fetchBridgeQuotes } from "./utils/fetch.mjs";
28
29
  import { UnifiedSwapBridgeEventName } from "./utils/metrics/constants.mjs";
29
30
  import { formatProviderLabel, getActionTypeFromQuoteRequest, getRequestParams, getSwapTypeFromQuote, isCustomSlippage, isHardwareWallet, toInputChangedPropertyKey, toInputChangedPropertyValue } from "./utils/metrics/properties.mjs";
30
31
  import { isValidQuoteRequest } from "./utils/quote.mjs";
31
32
  const metadata = {
32
- bridgeFeatureFlags: {
33
- persist: false,
34
- anonymous: false,
35
- },
36
33
  quoteRequest: {
37
34
  persist: false,
38
35
  anonymous: false,
@@ -132,7 +129,7 @@ export class BridgeController extends StaticIntervalPollingController() {
132
129
  }
133
130
  const networkClientId = __classPrivateFieldGet(this, _BridgeController_instances, "m", _BridgeController_getSelectedNetworkClientId).call(this);
134
131
  // Set refresh rate based on the source chain before starting polling
135
- __classPrivateFieldGet(this, _BridgeController_setIntervalLength, "f").call(this);
132
+ this.setChainIntervalLength();
136
133
  this.startPolling({
137
134
  networkClientId,
138
135
  updatedQuoteRequest: {
@@ -222,33 +219,23 @@ export class BridgeController extends StaticIntervalPollingController() {
222
219
  DEFAULT_BRIDGE_CONTROLLER_STATE.quotesRefreshCount;
223
220
  state.assetExchangeRates =
224
221
  DEFAULT_BRIDGE_CONTROLLER_STATE.assetExchangeRates;
225
- // Keep feature flags
226
- const originalFeatureFlags = state.bridgeFeatureFlags;
227
- state.bridgeFeatureFlags = originalFeatureFlags;
228
- });
229
- };
230
- this.setBridgeFeatureFlags = async () => {
231
- const bridgeFeatureFlags = await fetchBridgeFeatureFlags(__classPrivateFieldGet(this, _BridgeController_clientId, "f"), __classPrivateFieldGet(this, _BridgeController_fetchFn, "f"), __classPrivateFieldGet(this, _BridgeController_config, "f").customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL);
232
- this.update((state) => {
233
- state.bridgeFeatureFlags = bridgeFeatureFlags;
234
222
  });
235
- __classPrivateFieldGet(this, _BridgeController_setIntervalLength, "f").call(this);
236
223
  };
237
224
  /**
238
225
  * Sets the interval length based on the source chain
239
226
  */
240
- _BridgeController_setIntervalLength.set(this, () => {
227
+ this.setChainIntervalLength = () => {
241
228
  const { state } = this;
242
229
  const { srcChainId } = state.quoteRequest;
230
+ const bridgeFeatureFlags = getBridgeFeatureFlags(this.messagingSystem);
243
231
  const refreshRateOverride = srcChainId
244
- ? state.bridgeFeatureFlags[BridgeFeatureFlagsKey.EXTENSION_CONFIG].chains[formatChainIdToCaip(srcChainId)]?.refreshRate
232
+ ? bridgeFeatureFlags.chains[formatChainIdToCaip(srcChainId)]?.refreshRate
245
233
  : undefined;
246
- const defaultRefreshRate = state.bridgeFeatureFlags[BridgeFeatureFlagsKey.EXTENSION_CONFIG]
247
- .refreshRate;
234
+ const defaultRefreshRate = bridgeFeatureFlags.refreshRate;
248
235
  this.setIntervalLength(refreshRateOverride ?? defaultRefreshRate);
249
- });
236
+ };
250
237
  _BridgeController_fetchBridgeQuotes.set(this, async ({ networkClientId: _networkClientId, updatedQuoteRequest, context, }) => {
251
- const { bridgeFeatureFlags, quotesInitialLoadTime, quotesRefreshCount } = this.state;
238
+ const { quotesInitialLoadTime, quotesRefreshCount } = this.state;
252
239
  __classPrivateFieldGet(this, _BridgeController_abortController, "f")?.abort('New quote request');
253
240
  __classPrivateFieldSet(this, _BridgeController_abortController, new AbortController(), "f");
254
241
  this.trackUnifiedSwapBridgeEvent(UnifiedSwapBridgeEventName.QuotesRequested, context);
@@ -287,7 +274,8 @@ export class BridgeController extends StaticIntervalPollingController() {
287
274
  console.log('Failed to fetch bridge quotes', error);
288
275
  }
289
276
  finally {
290
- const { maxRefreshCount } = bridgeFeatureFlags[BridgeFeatureFlagsKey.EXTENSION_CONFIG];
277
+ const bridgeFeatureFlags = getBridgeFeatureFlags(this.messagingSystem);
278
+ const { maxRefreshCount } = bridgeFeatureFlags;
291
279
  const updatedQuotesRefreshCount = quotesRefreshCount + 1;
292
280
  // Stop polling if the maximum number of refreshes has been reached
293
281
  if (updatedQuoteRequest.insufficientBal ||
@@ -507,14 +495,14 @@ export class BridgeController extends StaticIntervalPollingController() {
507
495
  __classPrivateFieldSet(this, _BridgeController_trackMetaMetricsFn, trackMetaMetricsFn, "f");
508
496
  __classPrivateFieldSet(this, _BridgeController_config, config ?? {}, "f");
509
497
  // Register action handlers
510
- this.messagingSystem.registerActionHandler(`${BRIDGE_CONTROLLER_NAME}:setBridgeFeatureFlags`, this.setBridgeFeatureFlags.bind(this));
498
+ this.messagingSystem.registerActionHandler(`${BRIDGE_CONTROLLER_NAME}:setChainIntervalLength`, this.setChainIntervalLength.bind(this));
511
499
  this.messagingSystem.registerActionHandler(`${BRIDGE_CONTROLLER_NAME}:updateBridgeQuoteRequestParams`, this.updateBridgeQuoteRequestParams.bind(this));
512
500
  this.messagingSystem.registerActionHandler(`${BRIDGE_CONTROLLER_NAME}:resetState`, this.resetState.bind(this));
513
501
  this.messagingSystem.registerActionHandler(`${BRIDGE_CONTROLLER_NAME}:getBridgeERC20Allowance`, this.getBridgeERC20Allowance.bind(this));
514
502
  this.messagingSystem.registerActionHandler(`${BRIDGE_CONTROLLER_NAME}:trackUnifiedSwapBridgeEvent`, this.trackUnifiedSwapBridgeEvent.bind(this));
515
503
  }
516
504
  }
517
- _BridgeController_abortController = new WeakMap(), _BridgeController_quotesFirstFetched = new WeakMap(), _BridgeController_clientId = new WeakMap(), _BridgeController_getLayer1GasFee = new WeakMap(), _BridgeController_fetchFn = new WeakMap(), _BridgeController_trackMetaMetricsFn = new WeakMap(), _BridgeController_config = new WeakMap(), _BridgeController_getExchangeRateSources = new WeakMap(), _BridgeController_fetchAssetExchangeRates = new WeakMap(), _BridgeController_hasSufficientBalance = new WeakMap(), _BridgeController_setIntervalLength = new WeakMap(), _BridgeController_fetchBridgeQuotes = new WeakMap(), _BridgeController_appendL1GasFees = new WeakMap(), _BridgeController_appendSolanaFees = new WeakMap(), _BridgeController_getRequestParams = new WeakMap(), _BridgeController_getRequestMetadata = new WeakMap(), _BridgeController_getQuoteFetchData = new WeakMap(), _BridgeController_getEventProperties = new WeakMap(), _BridgeController_trackInputChangedEvents = new WeakMap(), _BridgeController_instances = new WeakSet(), _BridgeController_getMultichainSelectedAccount = function _BridgeController_getMultichainSelectedAccount() {
505
+ _BridgeController_abortController = new WeakMap(), _BridgeController_quotesFirstFetched = new WeakMap(), _BridgeController_clientId = new WeakMap(), _BridgeController_getLayer1GasFee = new WeakMap(), _BridgeController_fetchFn = new WeakMap(), _BridgeController_trackMetaMetricsFn = new WeakMap(), _BridgeController_config = new WeakMap(), _BridgeController_getExchangeRateSources = new WeakMap(), _BridgeController_fetchAssetExchangeRates = new WeakMap(), _BridgeController_hasSufficientBalance = new WeakMap(), _BridgeController_fetchBridgeQuotes = new WeakMap(), _BridgeController_appendL1GasFees = new WeakMap(), _BridgeController_appendSolanaFees = new WeakMap(), _BridgeController_getRequestParams = new WeakMap(), _BridgeController_getRequestMetadata = new WeakMap(), _BridgeController_getQuoteFetchData = new WeakMap(), _BridgeController_getEventProperties = new WeakMap(), _BridgeController_trackInputChangedEvents = new WeakMap(), _BridgeController_instances = new WeakSet(), _BridgeController_getMultichainSelectedAccount = function _BridgeController_getMultichainSelectedAccount() {
518
506
  return this.messagingSystem.call('AccountsController:getSelectedMultichainAccount');
519
507
  }, _BridgeController_getSelectedNetworkClientId = function _BridgeController_getSelectedNetworkClientId() {
520
508
  const { selectedNetworkClientId } = this.messagingSystem.call('NetworkController:getState');