@metamask/bridge-controller 56.0.0 → 56.0.1
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.
- package/CHANGELOG.md +12 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/utils/fetch-server-events.cjs +10 -1
- package/dist/utils/fetch-server-events.cjs.map +1 -1
- package/dist/utils/fetch-server-events.d.cts.map +1 -1
- package/dist/utils/fetch-server-events.d.mts.map +1 -1
- package/dist/utils/fetch-server-events.mjs +10 -1
- package/dist/utils/fetch-server-events.mjs.map +1 -1
- package/dist/utils/quote-fees.cjs +26 -6
- package/dist/utils/quote-fees.cjs.map +1 -1
- package/dist/utils/quote-fees.d.cts.map +1 -1
- package/dist/utils/quote-fees.d.mts.map +1 -1
- package/dist/utils/quote-fees.mjs +26 -6
- package/dist/utils/quote-fees.mjs.map +1 -1
- package/package.json +1 -1
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
|
+
## [56.0.1]
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Clean up SSE stream reader after use ([#6965](https://github.com/MetaMask/core/pull/6965))
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- Fix Bitcoin network fee computation by extracting `unsignedPsbtBase64` from Bitcoin trade objects and supporting `'priority'` fee type from Bitcoin snap ([#6932](https://github.com/MetaMask/core/pull/6932))
|
|
19
|
+
|
|
10
20
|
## [56.0.0]
|
|
11
21
|
|
|
12
22
|
### Added
|
|
@@ -784,7 +794,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
784
794
|
|
|
785
795
|
- Initial release ([#5317](https://github.com/MetaMask/core/pull/5317))
|
|
786
796
|
|
|
787
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@56.0.
|
|
797
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@56.0.1...HEAD
|
|
798
|
+
[56.0.1]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@56.0.0...@metamask/bridge-controller@56.0.1
|
|
788
799
|
[56.0.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@55.0.0...@metamask/bridge-controller@56.0.0
|
|
789
800
|
[55.0.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@54.0.0...@metamask/bridge-controller@55.0.0
|
|
790
801
|
[54.0.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@53.1.0...@metamask/bridge-controller@54.0.0
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,6DAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AAEzB,2DAGmC;AAFjC,uHAAA,0BAA0B,OAAA;AAC1B,+HAAA,kCAAkC,OAAA;AAapC,6DAMoC;AALlC,iHAAA,mBAAmB,OAAA;AACnB,8GAAA,gBAAgB,OAAA;AAChB,yGAAA,WAAW,OAAA;AACX,8GAAA,gBAAgB,OAAA;AAChB,8GAAA,gBAAgB,OAAA;
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,6DAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AAEzB,2DAGmC;AAFjC,uHAAA,0BAA0B,OAAA;AAC1B,+HAAA,kCAAkC,OAAA;AAapC,6DAMoC;AALlC,iHAAA,mBAAmB,OAAA;AACnB,8GAAA,gBAAgB,OAAA;AAChB,yGAAA,WAAW,OAAA;AACX,8GAAA,gBAAgB,OAAA;AAChB,8GAAA,gBAAgB,OAAA;AA6BlB,qCAAsC;AAA7B,oGAAA,WAAW,OAAA;AAEpB,qCASiB;AARf,kGAAA,SAAS,OAAA;AACT,kGAAA,SAAS,OAAA;AACT,gGAAA,OAAO,OAAA;AACP,sGAAA,aAAa,OAAA;AACb,yGAAA,gBAAgB,OAAA;AAChB,+GAAA,sBAAsB,OAAA;AAKxB,qDAK4B;AAJ1B,qGAAA,OAAO,OAAA;AACP,yGAAA,WAAW,OAAA;AACX,+GAAA,iBAAiB,OAAA;AACjB,uGAAA,SAAS,OAAA;AAGX,iDAc4B;AAb1B,kHAAA,wBAAwB,OAAA;AACxB,wGAAA,cAAc,OAAA;AACd,gHAAA,sBAAsB,OAAA;AACtB,sHAAA,4BAA4B,OAAA;AAC5B,uIAAA,6CAA6C,OAAA;AAC7C,uHAAA,6BAA6B,OAAA;AAC7B,4GAAA,kBAAkB,OAAA;AAClB,6GAAA,mBAAmB,OAAA;AACnB,mHAAA,yBAAyB,OAAA;AACzB,yHAAA,+BAA+B,OAAA;AAC/B,yHAAA,+BAA+B,OAAA;AAC/B,iHAAA,uBAAuB,OAAA;AACvB,kHAAA,wBAAwB,OAAA;AAK1B,iDAS4B;AAJ1B;;GAEG;AACH,yHAAA,+BAA+B,OAAA;AAGjC,+CAA0D;AAAjD,8GAAA,qBAAqB,OAAA;AAE9B,2DAA+E;AAAtE,8GAAA,iBAAiB,OAAA;AAAE,4GAAA,eAAe,OAAA;AAE3C,6CAUwB;AATtB,6GAAA,mBAAmB,OAAA;AACnB,mGAAA,SAAS,OAAA;AACT,yGAAA,eAAe,OAAA;AACf,yGAAA,eAAe,OAAA;AACf,0GAAA,gBAAgB,OAAA;AAChB,yGAAA,eAAe,OAAA;AACf,kHAAA,wBAAwB,OAAA;AACxB,yHAAA,+BAA+B,OAAA;AAC/B,sGAAA,YAAY,OAAA;AAGd,2CAIuB;AAHrB,4GAAA,mBAAmB,OAAA;AACnB,2GAAA,kBAAkB,OAAA;AAClB,+GAAA,sBAAsB,OAAA;AAGxB,+CAAuD;AAA9C,+GAAA,oBAAoB,OAAA;AAE7B,2CAAoE;AAA3D,0GAAA,iBAAiB,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAE5C,+DAKiC;AAJ/B,sHAAA,mBAAmB,OAAA;AACnB,qHAAA,kBAAkB,OAAA;AAClB,+HAAA,4BAA4B,OAAA;AAC5B,yHAAA,sBAAsB,OAAA;AAGxB,6CAQqB;AAPnB,+GAAA,kBAAkB,OAAA;AAClB,4HAAA,+BAA+B,OAAA;AAE/B,kIAAA,qCAAqC,OAAA;AACrC,iHAAA,oBAAoB,OAAA;AACpB,qHAAA,wBAAwB,OAAA;AACxB,sIAAA,yCAAyC,OAAA;AAG3C,iDAAiE;AAAxD,qHAAA,2BAA2B,OAAA;AAEpC,2DAA8D;AAArD,sHAAA,qBAAqB,OAAA;AAE9B,iDAA2D;AAAlD,mHAAA,uBAAuB,OAAA","sourcesContent":["export { BridgeController } from './bridge-controller';\n\nexport {\n UnifiedSwapBridgeEventName,\n UNIFIED_SWAP_BRIDGE_EVENT_CATEGORY,\n} from './utils/metrics/constants';\n\nexport type {\n RequiredEventContextFromClient,\n CrossChainSwapsEventProperties,\n TradeData,\n RequestParams,\n RequestMetadata,\n TxStatusData,\n QuoteFetchData,\n} from './utils/metrics/types';\n\nexport {\n formatProviderLabel,\n getRequestParams,\n getSwapType,\n isHardwareWallet,\n isCustomSlippage,\n} from './utils/metrics/properties';\n\nexport type {\n ChainConfiguration,\n L1GasFees,\n NonEvmFees,\n QuoteMetadata,\n GasMultiplierByChainId,\n FeatureFlagResponse,\n BridgeAsset,\n GenericQuoteRequest,\n Protocol,\n TokenAmountValues,\n Step,\n RefuelData,\n Quote,\n QuoteResponse,\n FeeData,\n TxData,\n BitcoinTradeData,\n BridgeControllerState,\n BridgeControllerAction,\n BridgeControllerActions,\n BridgeControllerEvents,\n BridgeControllerMessenger,\n FeatureFlagsPlatformConfig,\n} from './types';\n\nexport { StatusTypes } from './types';\n\nexport {\n AssetType,\n SortOrder,\n ChainId,\n RequestStatus,\n BridgeUserAction,\n BridgeBackgroundAction,\n type BridgeControllerGetStateAction,\n type BridgeControllerStateChangeEvent,\n} from './types';\n\nexport {\n FeeType,\n ActionTypes,\n BridgeAssetSchema,\n FeatureId,\n} from './utils/validators';\n\nexport {\n ALLOWED_BRIDGE_CHAIN_IDS,\n BridgeClientId,\n BRIDGE_CONTROLLER_NAME,\n BRIDGE_QUOTE_MAX_ETA_SECONDS,\n BRIDGE_QUOTE_MAX_RETURN_DIFFERENCE_PERCENTAGE,\n BRIDGE_PREFERRED_GAS_ESTIMATE,\n BRIDGE_MM_FEE_RATE,\n REFRESH_INTERVAL_MS,\n DEFAULT_MAX_REFRESH_COUNT,\n DEFAULT_BRIDGE_CONTROLLER_STATE,\n METABRIDGE_CHAIN_TO_ADDRESS_MAP,\n BRIDGE_DEV_API_BASE_URL,\n BRIDGE_PROD_API_BASE_URL,\n} from './constants/bridge';\n\nexport type { AllowedBridgeChainIds } from './constants/bridge';\n\nexport {\n /**\n * @deprecated This type should not be used. Use {@link BridgeAsset} instead.\n */\n type SwapsTokenObject,\n /**\n * @deprecated This map should not be used. Use getNativeAssetForChainId\" } instead.\n */\n SWAPS_CHAINID_DEFAULT_TOKEN_MAP,\n} from './constants/tokens';\n\nexport { SWAPS_API_V2_BASE_URL } from './constants/swaps';\n\nexport { MetricsActionType, MetricsSwapType } from './utils/metrics/constants';\n\nexport {\n getEthUsdtResetData,\n isEthUsdt,\n isNativeAddress,\n isSolanaChainId,\n isBitcoinChainId,\n isNonEvmChainId,\n getNativeAssetForChainId,\n getDefaultBridgeControllerState,\n isCrossChain,\n} from './utils/bridge';\n\nexport {\n isValidQuoteRequest,\n formatEtaInMinutes,\n calcSlippagePercentage,\n} from './utils/quote';\n\nexport { calcLatestSrcBalance } from './utils/balance';\n\nexport { fetchBridgeTokens, getClientHeaders } from './utils/fetch';\n\nexport {\n formatChainIdToCaip,\n formatChainIdToHex,\n formatAddressToCaipReference,\n formatAddressToAssetId,\n} from './utils/caip-formatters';\n\nexport {\n selectBridgeQuotes,\n selectDefaultSlippagePercentage,\n type BridgeAppState,\n selectExchangeRateByChainIdAndAddress,\n selectIsQuoteExpired,\n selectBridgeFeatureFlags,\n selectMinimumBalanceForRentExemptionInSOL,\n} from './selectors';\n\nexport { DEFAULT_FEATURE_FLAG_CONFIG } from './constants/bridge';\n\nexport { getBridgeFeatureFlags } from './utils/feature-flags';\n\nexport { BRIDGE_DEFAULT_SLIPPAGE } from './utils/slippage';\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -2,7 +2,7 @@ export { BridgeController } from "./bridge-controller.cjs";
|
|
|
2
2
|
export { UnifiedSwapBridgeEventName, UNIFIED_SWAP_BRIDGE_EVENT_CATEGORY, } from "./utils/metrics/constants.cjs";
|
|
3
3
|
export type { RequiredEventContextFromClient, CrossChainSwapsEventProperties, TradeData, RequestParams, RequestMetadata, TxStatusData, QuoteFetchData, } from "./utils/metrics/types.cjs";
|
|
4
4
|
export { formatProviderLabel, getRequestParams, getSwapType, isHardwareWallet, isCustomSlippage, } from "./utils/metrics/properties.cjs";
|
|
5
|
-
export type { ChainConfiguration, L1GasFees, NonEvmFees, QuoteMetadata, GasMultiplierByChainId, FeatureFlagResponse, BridgeAsset, GenericQuoteRequest, Protocol, TokenAmountValues, Step, RefuelData, Quote, QuoteResponse, FeeData, TxData, BridgeControllerState, BridgeControllerAction, BridgeControllerActions, BridgeControllerEvents, BridgeControllerMessenger, FeatureFlagsPlatformConfig, } from "./types.cjs";
|
|
5
|
+
export type { ChainConfiguration, L1GasFees, NonEvmFees, QuoteMetadata, GasMultiplierByChainId, FeatureFlagResponse, BridgeAsset, GenericQuoteRequest, Protocol, TokenAmountValues, Step, RefuelData, Quote, QuoteResponse, FeeData, TxData, BitcoinTradeData, BridgeControllerState, BridgeControllerAction, BridgeControllerActions, BridgeControllerEvents, BridgeControllerMessenger, FeatureFlagsPlatformConfig, } from "./types.cjs";
|
|
6
6
|
export { StatusTypes } from "./types.cjs";
|
|
7
7
|
export { AssetType, SortOrder, ChainId, RequestStatus, BridgeUserAction, BridgeBackgroundAction, type BridgeControllerGetStateAction, type BridgeControllerStateChangeEvent, } from "./types.cjs";
|
|
8
8
|
export { FeeType, ActionTypes, BridgeAssetSchema, FeatureId, } from "./utils/validators.cjs";
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gCAA4B;AAEvD,OAAO,EACL,0BAA0B,EAC1B,kCAAkC,GACnC,sCAAkC;AAEnC,YAAY,EACV,8BAA8B,EAC9B,8BAA8B,EAC9B,SAAS,EACT,aAAa,EACb,eAAe,EACf,YAAY,EACZ,cAAc,GACf,kCAA8B;AAE/B,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,gBAAgB,GACjB,uCAAmC;AAEpC,YAAY,EACV,kBAAkB,EAClB,SAAS,EACT,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,QAAQ,EACR,iBAAiB,EACjB,IAAI,EACJ,UAAU,EACV,KAAK,EACL,aAAa,EACb,OAAO,EACP,MAAM,EACN,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,GAC3B,oBAAgB;AAEjB,OAAO,EAAE,WAAW,EAAE,oBAAgB;AAEtC,OAAO,EACL,SAAS,EACT,SAAS,EACT,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,8BAA8B,EACnC,KAAK,gCAAgC,GACtC,oBAAgB;AAEjB,OAAO,EACL,OAAO,EACP,WAAW,EACX,iBAAiB,EACjB,SAAS,GACV,+BAA2B;AAE5B,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,sBAAsB,EACtB,4BAA4B,EAC5B,6CAA6C,EAC7C,6BAA6B,EAC7B,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,+BAA+B,EAC/B,+BAA+B,EAC/B,uBAAuB,EACvB,wBAAwB,GACzB,+BAA2B;AAE5B,YAAY,EAAE,qBAAqB,EAAE,+BAA2B;AAEhE,OAAO;AACL;;GAEG;AACH,KAAK,gBAAgB;AACrB;;GAEG;AACH,+BAA+B,GAChC,+BAA2B;AAE5B,OAAO,EAAE,qBAAqB,EAAE,8BAA0B;AAE1D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,sCAAkC;AAE/E,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,+BAA+B,EAC/B,YAAY,GACb,2BAAuB;AAExB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,GACvB,0BAAsB;AAEvB,OAAO,EAAE,oBAAoB,EAAE,4BAAwB;AAEvD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,0BAAsB;AAEpE,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,EAC5B,sBAAsB,GACvB,oCAAgC;AAEjC,OAAO,EACL,kBAAkB,EAClB,+BAA+B,EAC/B,KAAK,cAAc,EACnB,qCAAqC,EACrC,oBAAoB,EACpB,wBAAwB,EACxB,yCAAyC,GAC1C,wBAAoB;AAErB,OAAO,EAAE,2BAA2B,EAAE,+BAA2B;AAEjE,OAAO,EAAE,qBAAqB,EAAE,kCAA8B;AAE9D,OAAO,EAAE,uBAAuB,EAAE,6BAAyB"}
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gCAA4B;AAEvD,OAAO,EACL,0BAA0B,EAC1B,kCAAkC,GACnC,sCAAkC;AAEnC,YAAY,EACV,8BAA8B,EAC9B,8BAA8B,EAC9B,SAAS,EACT,aAAa,EACb,eAAe,EACf,YAAY,EACZ,cAAc,GACf,kCAA8B;AAE/B,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,gBAAgB,GACjB,uCAAmC;AAEpC,YAAY,EACV,kBAAkB,EAClB,SAAS,EACT,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,QAAQ,EACR,iBAAiB,EACjB,IAAI,EACJ,UAAU,EACV,KAAK,EACL,aAAa,EACb,OAAO,EACP,MAAM,EACN,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,GAC3B,oBAAgB;AAEjB,OAAO,EAAE,WAAW,EAAE,oBAAgB;AAEtC,OAAO,EACL,SAAS,EACT,SAAS,EACT,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,8BAA8B,EACnC,KAAK,gCAAgC,GACtC,oBAAgB;AAEjB,OAAO,EACL,OAAO,EACP,WAAW,EACX,iBAAiB,EACjB,SAAS,GACV,+BAA2B;AAE5B,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,sBAAsB,EACtB,4BAA4B,EAC5B,6CAA6C,EAC7C,6BAA6B,EAC7B,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,+BAA+B,EAC/B,+BAA+B,EAC/B,uBAAuB,EACvB,wBAAwB,GACzB,+BAA2B;AAE5B,YAAY,EAAE,qBAAqB,EAAE,+BAA2B;AAEhE,OAAO;AACL;;GAEG;AACH,KAAK,gBAAgB;AACrB;;GAEG;AACH,+BAA+B,GAChC,+BAA2B;AAE5B,OAAO,EAAE,qBAAqB,EAAE,8BAA0B;AAE1D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,sCAAkC;AAE/E,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,+BAA+B,EAC/B,YAAY,GACb,2BAAuB;AAExB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,GACvB,0BAAsB;AAEvB,OAAO,EAAE,oBAAoB,EAAE,4BAAwB;AAEvD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,0BAAsB;AAEpE,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,EAC5B,sBAAsB,GACvB,oCAAgC;AAEjC,OAAO,EACL,kBAAkB,EAClB,+BAA+B,EAC/B,KAAK,cAAc,EACnB,qCAAqC,EACrC,oBAAoB,EACpB,wBAAwB,EACxB,yCAAyC,GAC1C,wBAAoB;AAErB,OAAO,EAAE,2BAA2B,EAAE,+BAA2B;AAEjE,OAAO,EAAE,qBAAqB,EAAE,kCAA8B;AAE9D,OAAO,EAAE,uBAAuB,EAAE,6BAAyB"}
|
package/dist/index.d.mts
CHANGED
|
@@ -2,7 +2,7 @@ export { BridgeController } from "./bridge-controller.mjs";
|
|
|
2
2
|
export { UnifiedSwapBridgeEventName, UNIFIED_SWAP_BRIDGE_EVENT_CATEGORY, } from "./utils/metrics/constants.mjs";
|
|
3
3
|
export type { RequiredEventContextFromClient, CrossChainSwapsEventProperties, TradeData, RequestParams, RequestMetadata, TxStatusData, QuoteFetchData, } from "./utils/metrics/types.mjs";
|
|
4
4
|
export { formatProviderLabel, getRequestParams, getSwapType, isHardwareWallet, isCustomSlippage, } from "./utils/metrics/properties.mjs";
|
|
5
|
-
export type { ChainConfiguration, L1GasFees, NonEvmFees, QuoteMetadata, GasMultiplierByChainId, FeatureFlagResponse, BridgeAsset, GenericQuoteRequest, Protocol, TokenAmountValues, Step, RefuelData, Quote, QuoteResponse, FeeData, TxData, BridgeControllerState, BridgeControllerAction, BridgeControllerActions, BridgeControllerEvents, BridgeControllerMessenger, FeatureFlagsPlatformConfig, } from "./types.mjs";
|
|
5
|
+
export type { ChainConfiguration, L1GasFees, NonEvmFees, QuoteMetadata, GasMultiplierByChainId, FeatureFlagResponse, BridgeAsset, GenericQuoteRequest, Protocol, TokenAmountValues, Step, RefuelData, Quote, QuoteResponse, FeeData, TxData, BitcoinTradeData, BridgeControllerState, BridgeControllerAction, BridgeControllerActions, BridgeControllerEvents, BridgeControllerMessenger, FeatureFlagsPlatformConfig, } from "./types.mjs";
|
|
6
6
|
export { StatusTypes } from "./types.mjs";
|
|
7
7
|
export { AssetType, SortOrder, ChainId, RequestStatus, BridgeUserAction, BridgeBackgroundAction, type BridgeControllerGetStateAction, type BridgeControllerStateChangeEvent, } from "./types.mjs";
|
|
8
8
|
export { FeeType, ActionTypes, BridgeAssetSchema, FeatureId, } from "./utils/validators.mjs";
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gCAA4B;AAEvD,OAAO,EACL,0BAA0B,EAC1B,kCAAkC,GACnC,sCAAkC;AAEnC,YAAY,EACV,8BAA8B,EAC9B,8BAA8B,EAC9B,SAAS,EACT,aAAa,EACb,eAAe,EACf,YAAY,EACZ,cAAc,GACf,kCAA8B;AAE/B,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,gBAAgB,GACjB,uCAAmC;AAEpC,YAAY,EACV,kBAAkB,EAClB,SAAS,EACT,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,QAAQ,EACR,iBAAiB,EACjB,IAAI,EACJ,UAAU,EACV,KAAK,EACL,aAAa,EACb,OAAO,EACP,MAAM,EACN,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,GAC3B,oBAAgB;AAEjB,OAAO,EAAE,WAAW,EAAE,oBAAgB;AAEtC,OAAO,EACL,SAAS,EACT,SAAS,EACT,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,8BAA8B,EACnC,KAAK,gCAAgC,GACtC,oBAAgB;AAEjB,OAAO,EACL,OAAO,EACP,WAAW,EACX,iBAAiB,EACjB,SAAS,GACV,+BAA2B;AAE5B,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,sBAAsB,EACtB,4BAA4B,EAC5B,6CAA6C,EAC7C,6BAA6B,EAC7B,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,+BAA+B,EAC/B,+BAA+B,EAC/B,uBAAuB,EACvB,wBAAwB,GACzB,+BAA2B;AAE5B,YAAY,EAAE,qBAAqB,EAAE,+BAA2B;AAEhE,OAAO;AACL;;GAEG;AACH,KAAK,gBAAgB;AACrB;;GAEG;AACH,+BAA+B,GAChC,+BAA2B;AAE5B,OAAO,EAAE,qBAAqB,EAAE,8BAA0B;AAE1D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,sCAAkC;AAE/E,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,+BAA+B,EAC/B,YAAY,GACb,2BAAuB;AAExB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,GACvB,0BAAsB;AAEvB,OAAO,EAAE,oBAAoB,EAAE,4BAAwB;AAEvD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,0BAAsB;AAEpE,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,EAC5B,sBAAsB,GACvB,oCAAgC;AAEjC,OAAO,EACL,kBAAkB,EAClB,+BAA+B,EAC/B,KAAK,cAAc,EACnB,qCAAqC,EACrC,oBAAoB,EACpB,wBAAwB,EACxB,yCAAyC,GAC1C,wBAAoB;AAErB,OAAO,EAAE,2BAA2B,EAAE,+BAA2B;AAEjE,OAAO,EAAE,qBAAqB,EAAE,kCAA8B;AAE9D,OAAO,EAAE,uBAAuB,EAAE,6BAAyB"}
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gCAA4B;AAEvD,OAAO,EACL,0BAA0B,EAC1B,kCAAkC,GACnC,sCAAkC;AAEnC,YAAY,EACV,8BAA8B,EAC9B,8BAA8B,EAC9B,SAAS,EACT,aAAa,EACb,eAAe,EACf,YAAY,EACZ,cAAc,GACf,kCAA8B;AAE/B,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,gBAAgB,GACjB,uCAAmC;AAEpC,YAAY,EACV,kBAAkB,EAClB,SAAS,EACT,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,QAAQ,EACR,iBAAiB,EACjB,IAAI,EACJ,UAAU,EACV,KAAK,EACL,aAAa,EACb,OAAO,EACP,MAAM,EACN,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,GAC3B,oBAAgB;AAEjB,OAAO,EAAE,WAAW,EAAE,oBAAgB;AAEtC,OAAO,EACL,SAAS,EACT,SAAS,EACT,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,8BAA8B,EACnC,KAAK,gCAAgC,GACtC,oBAAgB;AAEjB,OAAO,EACL,OAAO,EACP,WAAW,EACX,iBAAiB,EACjB,SAAS,GACV,+BAA2B;AAE5B,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,sBAAsB,EACtB,4BAA4B,EAC5B,6CAA6C,EAC7C,6BAA6B,EAC7B,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,+BAA+B,EAC/B,+BAA+B,EAC/B,uBAAuB,EACvB,wBAAwB,GACzB,+BAA2B;AAE5B,YAAY,EAAE,qBAAqB,EAAE,+BAA2B;AAEhE,OAAO;AACL;;GAEG;AACH,KAAK,gBAAgB;AACrB;;GAEG;AACH,+BAA+B,GAChC,+BAA2B;AAE5B,OAAO,EAAE,qBAAqB,EAAE,8BAA0B;AAE1D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,sCAAkC;AAE/E,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,+BAA+B,EAC/B,YAAY,GACb,2BAAuB;AAExB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,GACvB,0BAAsB;AAEvB,OAAO,EAAE,oBAAoB,EAAE,4BAAwB;AAEvD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,0BAAsB;AAEpE,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,EAC5B,sBAAsB,GACvB,oCAAgC;AAEjC,OAAO,EACL,kBAAkB,EAClB,+BAA+B,EAC/B,KAAK,cAAc,EACnB,qCAAqC,EACrC,oBAAoB,EACpB,wBAAwB,EACxB,yCAAyC,GAC1C,wBAAoB;AAErB,OAAO,EAAE,2BAA2B,EAAE,+BAA2B;AAEjE,OAAO,EAAE,qBAAqB,EAAE,kCAA8B;AAE9D,OAAO,EAAE,uBAAuB,EAAE,6BAAyB"}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gCAA4B;AAEvD,OAAO,EACL,0BAA0B,EAC1B,kCAAkC,EACnC,sCAAkC;AAYnC,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EACjB,uCAAmC;
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gCAA4B;AAEvD,OAAO,EACL,0BAA0B,EAC1B,kCAAkC,EACnC,sCAAkC;AAYnC,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EACjB,uCAAmC;AA4BpC,OAAO,EAAE,WAAW,EAAE,oBAAgB;AAEtC,OAAO,EACL,SAAS,EACT,SAAS,EACT,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EAGvB,oBAAgB;AAEjB,OAAO,EACL,OAAO,EACP,WAAW,EACX,iBAAiB,EACjB,SAAS,EACV,+BAA2B;AAE5B,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,sBAAsB,EACtB,4BAA4B,EAC5B,6CAA6C,EAC7C,6BAA6B,EAC7B,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,+BAA+B,EAC/B,+BAA+B,EAC/B,uBAAuB,EACvB,wBAAwB,EACzB,+BAA2B;AAI5B,OAAO;AAKL;;GAEG;AACH,+BAA+B,EAChC,+BAA2B;AAE5B,OAAO,EAAE,qBAAqB,EAAE,8BAA0B;AAE1D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,sCAAkC;AAE/E,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,+BAA+B,EAC/B,YAAY,EACb,2BAAuB;AAExB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACvB,0BAAsB;AAEvB,OAAO,EAAE,oBAAoB,EAAE,4BAAwB;AAEvD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,0BAAsB;AAEpE,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,EAC5B,sBAAsB,EACvB,oCAAgC;AAEjC,OAAO,EACL,kBAAkB,EAClB,+BAA+B,EAE/B,qCAAqC,EACrC,oBAAoB,EACpB,wBAAwB,EACxB,yCAAyC,EAC1C,wBAAoB;AAErB,OAAO,EAAE,2BAA2B,EAAE,+BAA2B;AAEjE,OAAO,EAAE,qBAAqB,EAAE,kCAA8B;AAE9D,OAAO,EAAE,uBAAuB,EAAE,6BAAyB","sourcesContent":["export { BridgeController } from './bridge-controller';\n\nexport {\n UnifiedSwapBridgeEventName,\n UNIFIED_SWAP_BRIDGE_EVENT_CATEGORY,\n} from './utils/metrics/constants';\n\nexport type {\n RequiredEventContextFromClient,\n CrossChainSwapsEventProperties,\n TradeData,\n RequestParams,\n RequestMetadata,\n TxStatusData,\n QuoteFetchData,\n} from './utils/metrics/types';\n\nexport {\n formatProviderLabel,\n getRequestParams,\n getSwapType,\n isHardwareWallet,\n isCustomSlippage,\n} from './utils/metrics/properties';\n\nexport type {\n ChainConfiguration,\n L1GasFees,\n NonEvmFees,\n QuoteMetadata,\n GasMultiplierByChainId,\n FeatureFlagResponse,\n BridgeAsset,\n GenericQuoteRequest,\n Protocol,\n TokenAmountValues,\n Step,\n RefuelData,\n Quote,\n QuoteResponse,\n FeeData,\n TxData,\n BitcoinTradeData,\n BridgeControllerState,\n BridgeControllerAction,\n BridgeControllerActions,\n BridgeControllerEvents,\n BridgeControllerMessenger,\n FeatureFlagsPlatformConfig,\n} from './types';\n\nexport { StatusTypes } from './types';\n\nexport {\n AssetType,\n SortOrder,\n ChainId,\n RequestStatus,\n BridgeUserAction,\n BridgeBackgroundAction,\n type BridgeControllerGetStateAction,\n type BridgeControllerStateChangeEvent,\n} from './types';\n\nexport {\n FeeType,\n ActionTypes,\n BridgeAssetSchema,\n FeatureId,\n} from './utils/validators';\n\nexport {\n ALLOWED_BRIDGE_CHAIN_IDS,\n BridgeClientId,\n BRIDGE_CONTROLLER_NAME,\n BRIDGE_QUOTE_MAX_ETA_SECONDS,\n BRIDGE_QUOTE_MAX_RETURN_DIFFERENCE_PERCENTAGE,\n BRIDGE_PREFERRED_GAS_ESTIMATE,\n BRIDGE_MM_FEE_RATE,\n REFRESH_INTERVAL_MS,\n DEFAULT_MAX_REFRESH_COUNT,\n DEFAULT_BRIDGE_CONTROLLER_STATE,\n METABRIDGE_CHAIN_TO_ADDRESS_MAP,\n BRIDGE_DEV_API_BASE_URL,\n BRIDGE_PROD_API_BASE_URL,\n} from './constants/bridge';\n\nexport type { AllowedBridgeChainIds } from './constants/bridge';\n\nexport {\n /**\n * @deprecated This type should not be used. Use {@link BridgeAsset} instead.\n */\n type SwapsTokenObject,\n /**\n * @deprecated This map should not be used. Use getNativeAssetForChainId\" } instead.\n */\n SWAPS_CHAINID_DEFAULT_TOKEN_MAP,\n} from './constants/tokens';\n\nexport { SWAPS_API_V2_BASE_URL } from './constants/swaps';\n\nexport { MetricsActionType, MetricsSwapType } from './utils/metrics/constants';\n\nexport {\n getEthUsdtResetData,\n isEthUsdt,\n isNativeAddress,\n isSolanaChainId,\n isBitcoinChainId,\n isNonEvmChainId,\n getNativeAssetForChainId,\n getDefaultBridgeControllerState,\n isCrossChain,\n} from './utils/bridge';\n\nexport {\n isValidQuoteRequest,\n formatEtaInMinutes,\n calcSlippagePercentage,\n} from './utils/quote';\n\nexport { calcLatestSrcBalance } from './utils/balance';\n\nexport { fetchBridgeTokens, getClientHeaders } from './utils/fetch';\n\nexport {\n formatChainIdToCaip,\n formatChainIdToHex,\n formatAddressToCaipReference,\n formatAddressToAssetId,\n} from './utils/caip-formatters';\n\nexport {\n selectBridgeQuotes,\n selectDefaultSlippagePercentage,\n type BridgeAppState,\n selectExchangeRateByChainIdAndAddress,\n selectIsQuoteExpired,\n selectBridgeFeatureFlags,\n selectMinimumBalanceForRentExemptionInSOL,\n} from './selectors';\n\nexport { DEFAULT_FEATURE_FLAG_CONFIG } from './constants/bridge';\n\nexport { getBridgeFeatureFlags } from './utils/feature-flags';\n\nexport { BRIDGE_DEFAULT_SLIPPAGE } from './utils/slippage';\n"]}
|
|
@@ -12,12 +12,13 @@ exports.fetchServerEvents = void 0;
|
|
|
12
12
|
* @param options.fetchFn - The function to use to fetch the events. Consumers need to provide a fetch function that supports server-sent events.
|
|
13
13
|
*/
|
|
14
14
|
const fetchServerEvents = async (url, { onMessage, onError, onClose, fetchFn, ...requestOptions }) => {
|
|
15
|
+
let reader;
|
|
15
16
|
try {
|
|
16
17
|
const response = await fetchFn(url, requestOptions);
|
|
17
18
|
if (!response.ok || !response.body) {
|
|
18
19
|
throw new Error(`${response.status}`);
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
+
reader = response.body.getReader();
|
|
21
22
|
const decoder = new TextDecoder('utf-8');
|
|
22
23
|
let buffer = '';
|
|
23
24
|
while (true) {
|
|
@@ -56,6 +57,14 @@ const fetchServerEvents = async (url, { onMessage, onError, onClose, fetchFn, ..
|
|
|
56
57
|
catch (error) {
|
|
57
58
|
onError?.(error);
|
|
58
59
|
}
|
|
60
|
+
finally {
|
|
61
|
+
try {
|
|
62
|
+
await reader?.cancel();
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
console.error('Error cleaning up stream reader', error);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
59
68
|
};
|
|
60
69
|
exports.fetchServerEvents = fetchServerEvents;
|
|
61
70
|
//# sourceMappingURL=fetch-server-events.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-server-events.cjs","sourceRoot":"","sources":["../../src/utils/fetch-server-events.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;GASG;AACI,MAAM,iBAAiB,GAAG,KAAK,EACpC,GAAW,EACX,EACE,SAAS,EACT,OAAO,EACP,OAAO,EACP,OAAO,EACP,GAAG,cAAc,EAMlB,EACD,EAAE;IACF,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAClC,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;SACvC;QAED,MAAM,
|
|
1
|
+
{"version":3,"file":"fetch-server-events.cjs","sourceRoot":"","sources":["../../src/utils/fetch-server-events.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;GASG;AACI,MAAM,iBAAiB,GAAG,KAAK,EACpC,GAAW,EACX,EACE,SAAS,EACT,OAAO,EACP,OAAO,EACP,OAAO,EACP,GAAG,cAAc,EAMlB,EACD,EAAE;IACF,IAAI,MAA2D,CAAC;IAChE,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAClC,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;SACvC;QAED,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,OAAO,IAAI,EAAE;YACX,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAE5C,IAAI,IAAI,EAAE;gBACR,MAAM;aACP;YAED,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAElD,wCAAwC;YACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAE3B,6CAA6C;YAC7C,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE;gBACzB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,SAA6B,CAAC;gBAClC,MAAM,SAAS,GAAa,EAAE,CAAC;gBAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;oBACxB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;wBAC7B,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBAClC;yBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;wBACnC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;qBACtC;iBACF;gBAED,IAAI,SAAS,KAAK,OAAO,EAAE;oBACzB,MAAM,IAAI,KAAK,CAAC,qBAAqB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;iBAC9D;gBACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oBACxB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBACxD,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;iBACtC;aACF;SACF;QACD,OAAO,EAAE,EAAE,CAAC;KACb;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;KAClB;YAAS;QACR,IAAI;YACF,MAAM,MAAM,EAAE,MAAM,EAAE,CAAC;SACxB;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;SACzD;KACF;AACH,CAAC,CAAC;AAxEW,QAAA,iBAAiB,qBAwE5B","sourcesContent":["/**\n * Streams server-sent events from the given URL\n *\n * @param url - The URL to stream events from\n * @param options - The options for the SSE stream\n * @param options.onMessage - The function to call when a message is received\n * @param options.onError - The function to call when an error occurs\n * @param options.onClose - The function to call when the stream finishes successfully\n * @param options.fetchFn - The function to use to fetch the events. Consumers need to provide a fetch function that supports server-sent events.\n */\nexport const fetchServerEvents = async (\n url: string,\n {\n onMessage,\n onError,\n onClose,\n fetchFn,\n ...requestOptions\n }: RequestInit & {\n onMessage: (data: Record<string, unknown>, eventName?: string) => void;\n onError?: (err: unknown) => void;\n onClose?: () => void;\n fetchFn: typeof fetch;\n },\n) => {\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined;\n try {\n const response = await fetchFn(url, requestOptions);\n if (!response.ok || !response.body) {\n throw new Error(`${response.status}`);\n }\n\n reader = response.body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Split SSE messages at double newlines\n const parts = buffer.split('\\n\\n');\n buffer = parts.pop() || '';\n\n // Split chunks into lines and parse the data\n for (const chunk of parts) {\n const lines = chunk.split('\\n');\n let eventName: string | undefined;\n const dataLines: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith('event:')) {\n eventName = line.slice(6).trim();\n } else if (line.startsWith('data:')) {\n dataLines.push(line.slice(5).trim());\n }\n }\n\n if (eventName === 'error') {\n throw new Error(`Bridge-api error: ${dataLines.join('\\n')}`);\n }\n if (dataLines.length > 0) {\n const parsedJSONData = JSON.parse(dataLines.join('\\n'));\n onMessage(parsedJSONData, eventName);\n }\n }\n }\n onClose?.();\n } catch (error) {\n onError?.(error);\n } finally {\n try {\n await reader?.cancel();\n } catch (error) {\n console.error('Error cleaning up stream reader', error);\n }\n }\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-server-events.d.cts","sourceRoot":"","sources":["../../src/utils/fetch-server-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,QACvB,MAAM;sBAQS,OAAO,MAAM,EAAE,OAAO,CAAC,cAAc,MAAM,KAAK,IAAI;qBACtD,OAAO,KAAK,IAAI;qBAChB,IAAI;aACX,YAAY;
|
|
1
|
+
{"version":3,"file":"fetch-server-events.d.cts","sourceRoot":"","sources":["../../src/utils/fetch-server-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,QACvB,MAAM;sBAQS,OAAO,MAAM,EAAE,OAAO,CAAC,cAAc,MAAM,KAAK,IAAI;qBACtD,OAAO,KAAK,IAAI;qBAChB,IAAI;aACX,YAAY;mBA4DxB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-server-events.d.mts","sourceRoot":"","sources":["../../src/utils/fetch-server-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,QACvB,MAAM;sBAQS,OAAO,MAAM,EAAE,OAAO,CAAC,cAAc,MAAM,KAAK,IAAI;qBACtD,OAAO,KAAK,IAAI;qBAChB,IAAI;aACX,YAAY;
|
|
1
|
+
{"version":3,"file":"fetch-server-events.d.mts","sourceRoot":"","sources":["../../src/utils/fetch-server-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,QACvB,MAAM;sBAQS,OAAO,MAAM,EAAE,OAAO,CAAC,cAAc,MAAM,KAAK,IAAI;qBACtD,OAAO,KAAK,IAAI;qBAChB,IAAI;aACX,YAAY;mBA4DxB,CAAC"}
|
|
@@ -9,12 +9,13 @@
|
|
|
9
9
|
* @param options.fetchFn - The function to use to fetch the events. Consumers need to provide a fetch function that supports server-sent events.
|
|
10
10
|
*/
|
|
11
11
|
export const fetchServerEvents = async (url, { onMessage, onError, onClose, fetchFn, ...requestOptions }) => {
|
|
12
|
+
let reader;
|
|
12
13
|
try {
|
|
13
14
|
const response = await fetchFn(url, requestOptions);
|
|
14
15
|
if (!response.ok || !response.body) {
|
|
15
16
|
throw new Error(`${response.status}`);
|
|
16
17
|
}
|
|
17
|
-
|
|
18
|
+
reader = response.body.getReader();
|
|
18
19
|
const decoder = new TextDecoder('utf-8');
|
|
19
20
|
let buffer = '';
|
|
20
21
|
while (true) {
|
|
@@ -53,5 +54,13 @@ export const fetchServerEvents = async (url, { onMessage, onError, onClose, fetc
|
|
|
53
54
|
catch (error) {
|
|
54
55
|
onError?.(error);
|
|
55
56
|
}
|
|
57
|
+
finally {
|
|
58
|
+
try {
|
|
59
|
+
await reader?.cancel();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error('Error cleaning up stream reader', error);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
56
65
|
};
|
|
57
66
|
//# sourceMappingURL=fetch-server-events.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-server-events.mjs","sourceRoot":"","sources":["../../src/utils/fetch-server-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,GAAW,EACX,EACE,SAAS,EACT,OAAO,EACP,OAAO,EACP,OAAO,EACP,GAAG,cAAc,EAMlB,EACD,EAAE;IACF,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAClC,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;SACvC;QAED,MAAM,
|
|
1
|
+
{"version":3,"file":"fetch-server-events.mjs","sourceRoot":"","sources":["../../src/utils/fetch-server-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,GAAW,EACX,EACE,SAAS,EACT,OAAO,EACP,OAAO,EACP,OAAO,EACP,GAAG,cAAc,EAMlB,EACD,EAAE;IACF,IAAI,MAA2D,CAAC;IAChE,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAClC,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;SACvC;QAED,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,OAAO,IAAI,EAAE;YACX,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAE5C,IAAI,IAAI,EAAE;gBACR,MAAM;aACP;YAED,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAElD,wCAAwC;YACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAE3B,6CAA6C;YAC7C,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE;gBACzB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,SAA6B,CAAC;gBAClC,MAAM,SAAS,GAAa,EAAE,CAAC;gBAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;oBACxB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;wBAC7B,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBAClC;yBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;wBACnC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;qBACtC;iBACF;gBAED,IAAI,SAAS,KAAK,OAAO,EAAE;oBACzB,MAAM,IAAI,KAAK,CAAC,qBAAqB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;iBAC9D;gBACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oBACxB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBACxD,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;iBACtC;aACF;SACF;QACD,OAAO,EAAE,EAAE,CAAC;KACb;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;KAClB;YAAS;QACR,IAAI;YACF,MAAM,MAAM,EAAE,MAAM,EAAE,CAAC;SACxB;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;SACzD;KACF;AACH,CAAC,CAAC","sourcesContent":["/**\n * Streams server-sent events from the given URL\n *\n * @param url - The URL to stream events from\n * @param options - The options for the SSE stream\n * @param options.onMessage - The function to call when a message is received\n * @param options.onError - The function to call when an error occurs\n * @param options.onClose - The function to call when the stream finishes successfully\n * @param options.fetchFn - The function to use to fetch the events. Consumers need to provide a fetch function that supports server-sent events.\n */\nexport const fetchServerEvents = async (\n url: string,\n {\n onMessage,\n onError,\n onClose,\n fetchFn,\n ...requestOptions\n }: RequestInit & {\n onMessage: (data: Record<string, unknown>, eventName?: string) => void;\n onError?: (err: unknown) => void;\n onClose?: () => void;\n fetchFn: typeof fetch;\n },\n) => {\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined;\n try {\n const response = await fetchFn(url, requestOptions);\n if (!response.ok || !response.body) {\n throw new Error(`${response.status}`);\n }\n\n reader = response.body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Split SSE messages at double newlines\n const parts = buffer.split('\\n\\n');\n buffer = parts.pop() || '';\n\n // Split chunks into lines and parse the data\n for (const chunk of parts) {\n const lines = chunk.split('\\n');\n let eventName: string | undefined;\n const dataLines: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith('event:')) {\n eventName = line.slice(6).trim();\n } else if (line.startsWith('data:')) {\n dataLines.push(line.slice(5).trim());\n }\n }\n\n if (eventName === 'error') {\n throw new Error(`Bridge-api error: ${dataLines.join('\\n')}`);\n }\n if (dataLines.length > 0) {\n const parsedJSONData = JSON.parse(dataLines.join('\\n'));\n onMessage(parsedJSONData, eventName);\n }\n }\n }\n onClose?.();\n } catch (error) {\n onError?.(error);\n } finally {\n try {\n await reader?.cancel();\n } catch (error) {\n console.error('Error cleaning up stream reader', error);\n }\n }\n};\n"]}
|
|
@@ -78,18 +78,38 @@ const appendNonEvmFees = async (quotes, messenger, selectedAccount) => {
|
|
|
78
78
|
}
|
|
79
79
|
const nonEvmFeePromises = Promise.allSettled(quotes.map(async (quoteResponse) => {
|
|
80
80
|
const { trade, quote } = quoteResponse;
|
|
81
|
-
if
|
|
81
|
+
// Skip fee computation if no snap account or trade data
|
|
82
|
+
if (!selectedAccount?.metadata?.snap?.id || !trade) {
|
|
83
|
+
return quoteResponse;
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
82
86
|
const scope = (0, caip_formatters_1.formatChainIdToCaip)(quote.srcChainId);
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
//
|
|
86
|
-
const
|
|
87
|
+
// Normalize trade data to string format expected by snap
|
|
88
|
+
// Solana: trade is already a base64 transaction string
|
|
89
|
+
// Bitcoin: extract unsignedPsbtBase64 from trade object
|
|
90
|
+
const transaction = typeof trade === 'string'
|
|
91
|
+
? trade
|
|
92
|
+
: trade.unsignedPsbtBase64;
|
|
93
|
+
const response = (await messenger.call('SnapController:handleRequest', (0, snaps_1.computeFeeRequest)(selectedAccount.metadata.snap?.id, transaction, selectedAccount.id, scope)));
|
|
94
|
+
// Bitcoin snap returns 'priority' fee, Solana returns 'base' fee
|
|
95
|
+
const fee = response?.find((f) => f.type === 'base') ||
|
|
96
|
+
response?.find((f) => f.type === 'priority') ||
|
|
97
|
+
response?.[0];
|
|
98
|
+
const feeInNative = fee?.asset?.amount || '0';
|
|
87
99
|
return {
|
|
88
100
|
...quoteResponse,
|
|
89
101
|
nonEvmFeesInNative: feeInNative,
|
|
90
102
|
};
|
|
91
103
|
}
|
|
92
|
-
|
|
104
|
+
catch (error) {
|
|
105
|
+
// Return quote with undefined fee if snap fails (e.g., insufficient UTXO funds)
|
|
106
|
+
// Client can render special UI or skip the quote card row for quotes with missing fee data
|
|
107
|
+
console.error(`Failed to compute non-EVM fees for quote ${quote.requestId}:`, error);
|
|
108
|
+
return {
|
|
109
|
+
...quoteResponse,
|
|
110
|
+
nonEvmFeesInNative: undefined,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
93
113
|
}));
|
|
94
114
|
const quotesWithNonEvmFees = (await nonEvmFeePromises).reduce((acc, result) => {
|
|
95
115
|
if (result.status === 'fulfilled' && result.value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quote-fees.cjs","sourceRoot":"","sources":["../../src/utils/quote-fees.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { TransactionController } from '@metamask/transaction-controller';\nimport { numberToHex } from '@metamask/utils';\n\nimport { isNonEvmChainId, sumHexes } from './bridge';\nimport { formatChainIdToCaip } from './caip-formatters';\nimport { computeFeeRequest } from './snaps';\nimport { CHAIN_IDS } from '../constants/chains';\nimport type {\n QuoteResponse,\n L1GasFees,\n NonEvmFees,\n TxData,\n BridgeControllerMessenger,\n} from '../types';\n\n/**\n * Appends transaction fees for EVM chains to quotes\n *\n * @param quotes - Array of quote responses to append fees to\n * @param getLayer1GasFee - The function to use to get the layer 1 gas fee\n * @returns Array of quotes with fees appended, or undefined if quotes are for non-EVM chains\n */\nconst appendL1GasFees = async (\n quotes: QuoteResponse[],\n getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee,\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 undefined;\n }\n\n const l1GasFeePromises = Promise.allSettled(\n quotes.map(async (quoteResponse) => {\n const { quote, trade, approval } = quoteResponse;\n const chainId = numberToHex(quote.srcChainId);\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 getLayer1GasFee({\n transactionParams: getTxParams(approval),\n chainId,\n })\n : '0x0';\n const tradeL1GasFees = await getLayer1GasFee({\n transactionParams: getTxParams(trade as TxData),\n chainId,\n });\n\n if (approvalL1GasFees === undefined || tradeL1GasFees === undefined) {\n return undefined;\n }\n\n return {\n ...quoteResponse,\n l1GasFeesInHexWei: sumHexes(approvalL1GasFees, tradeL1GasFees),\n };\n }),\n );\n\n const quotesWithL1GasFees = (await l1GasFeePromises).reduce<\n (QuoteResponse & L1GasFees)[]\n >((acc, result) => {\n if (result.status === 'fulfilled' && result.value) {\n acc.push(result.value);\n } else if (result.status === 'rejected') {\n console.error('Error calculating L1 gas fees for quote', result.reason);\n }\n return acc;\n }, []);\n\n return quotesWithL1GasFees;\n};\n\n/**\n * Appends transaction fees for non-EVM chains to quotes\n *\n * @param quotes - Array of quote responses to append fees to\n * @param messenger - The messaging system to use to call the snap controller\n * @param selectedAccount - The selected account for which the quotes were requested\n * @returns Array of quotes with fees appended, or undefined if quotes are for EVM chains\n */\nconst appendNonEvmFees = async (\n quotes: QuoteResponse[],\n messenger: BridgeControllerMessenger,\n selectedAccount: InternalAccount,\n): Promise<(QuoteResponse & NonEvmFees)[] | undefined> => {\n if (\n quotes.some(({ quote: { srcChainId } }) => !isNonEvmChainId(srcChainId))\n ) {\n return undefined;\n }\n\n const nonEvmFeePromises = Promise.allSettled(\n quotes.map(async (quoteResponse) => {\n const { trade, quote } = quoteResponse;\n\n if (selectedAccount?.metadata?.snap?.id && typeof trade === 'string') {\n const scope = formatChainIdToCaip(quote.srcChainId);\n\n const response = (await messenger.call(\n 'SnapController:handleRequest',\n computeFeeRequest(\n selectedAccount.metadata.snap?.id,\n trade,\n selectedAccount.id,\n scope,\n ),\n )) as {\n type: 'base' | 'priority';\n asset: {\n unit: string;\n type: string;\n amount: string;\n fungible: true;\n };\n }[];\n\n const baseFee = response?.find((fee) => fee.type === 'base');\n // Store fees in native units as returned by the snap (e.g., SOL, BTC)\n const feeInNative = baseFee?.asset?.amount || '0';\n\n return {\n ...quoteResponse,\n nonEvmFeesInNative: feeInNative,\n };\n }\n return quoteResponse;\n }),\n );\n\n const quotesWithNonEvmFees = (await nonEvmFeePromises).reduce<\n (QuoteResponse & NonEvmFees)[]\n >((acc, result) => {\n if (result.status === 'fulfilled' && result.value) {\n acc.push(result.value);\n } else if (result.status === 'rejected') {\n console.error('Error calculating non-EVM fees for quote', result.reason);\n }\n return acc;\n }, []);\n\n return quotesWithNonEvmFees;\n};\n\n/**\n * Appends transaction fees to quotes\n *\n * @param quotes - Array of quote responses to append fees to\n * @param messenger - The bridge controller to use to call the snap controller\n * @param getLayer1GasFee - The function to use to get the layer 1 gas fee\n * @param selectedAccount - The selected account for which the quotes were requested\n * @returns Array of quotes with fees appended, or undefined if quotes are for EVM chains\n */\nexport const appendFeesToQuotes = async (\n quotes: QuoteResponse[],\n messenger: BridgeControllerMessenger,\n getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee,\n selectedAccount: InternalAccount,\n): Promise<(QuoteResponse & L1GasFees & NonEvmFees)[]> => {\n const quotesWithL1GasFees = await appendL1GasFees(quotes, getLayer1GasFee);\n const quotesWithNonEvmFees = await appendNonEvmFees(\n quotes,\n messenger,\n selectedAccount,\n );\n\n return quotesWithL1GasFees ?? quotesWithNonEvmFees ?? quotes;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"quote-fees.cjs","sourceRoot":"","sources":["../../src/utils/quote-fees.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { TransactionController } from '@metamask/transaction-controller';\nimport { numberToHex } from '@metamask/utils';\n\nimport { isNonEvmChainId, sumHexes } from './bridge';\nimport { formatChainIdToCaip } from './caip-formatters';\nimport { computeFeeRequest } from './snaps';\nimport { CHAIN_IDS } from '../constants/chains';\nimport type {\n QuoteResponse,\n L1GasFees,\n NonEvmFees,\n TxData,\n BridgeControllerMessenger,\n BitcoinTradeData,\n} from '../types';\n\n/**\n * Appends transaction fees for EVM chains to quotes\n *\n * @param quotes - Array of quote responses to append fees to\n * @param getLayer1GasFee - The function to use to get the layer 1 gas fee\n * @returns Array of quotes with fees appended, or undefined if quotes are for non-EVM chains\n */\nconst appendL1GasFees = async (\n quotes: QuoteResponse[],\n getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee,\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 undefined;\n }\n\n const l1GasFeePromises = Promise.allSettled(\n quotes.map(async (quoteResponse) => {\n const { quote, trade, approval } = quoteResponse;\n const chainId = numberToHex(quote.srcChainId);\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 getLayer1GasFee({\n transactionParams: getTxParams(approval),\n chainId,\n })\n : '0x0';\n const tradeL1GasFees = await getLayer1GasFee({\n transactionParams: getTxParams(trade as TxData),\n chainId,\n });\n\n if (approvalL1GasFees === undefined || tradeL1GasFees === undefined) {\n return undefined;\n }\n\n return {\n ...quoteResponse,\n l1GasFeesInHexWei: sumHexes(approvalL1GasFees, tradeL1GasFees),\n };\n }),\n );\n\n const quotesWithL1GasFees = (await l1GasFeePromises).reduce<\n (QuoteResponse & L1GasFees)[]\n >((acc, result) => {\n if (result.status === 'fulfilled' && result.value) {\n acc.push(result.value);\n } else if (result.status === 'rejected') {\n console.error('Error calculating L1 gas fees for quote', result.reason);\n }\n return acc;\n }, []);\n\n return quotesWithL1GasFees;\n};\n\n/**\n * Appends transaction fees for non-EVM chains to quotes\n *\n * @param quotes - Array of quote responses to append fees to\n * @param messenger - The messaging system to use to call the snap controller\n * @param selectedAccount - The selected account for which the quotes were requested\n * @returns Array of quotes with fees appended, or undefined if quotes are for EVM chains\n */\nconst appendNonEvmFees = async (\n quotes: QuoteResponse[],\n messenger: BridgeControllerMessenger,\n selectedAccount: InternalAccount,\n): Promise<(QuoteResponse & NonEvmFees)[] | undefined> => {\n if (\n quotes.some(({ quote: { srcChainId } }) => !isNonEvmChainId(srcChainId))\n ) {\n return undefined;\n }\n\n const nonEvmFeePromises = Promise.allSettled(\n quotes.map(async (quoteResponse) => {\n const { trade, quote } = quoteResponse;\n\n // Skip fee computation if no snap account or trade data\n if (!selectedAccount?.metadata?.snap?.id || !trade) {\n return quoteResponse;\n }\n\n try {\n const scope = formatChainIdToCaip(quote.srcChainId);\n\n // Normalize trade data to string format expected by snap\n // Solana: trade is already a base64 transaction string\n // Bitcoin: extract unsignedPsbtBase64 from trade object\n const transaction =\n typeof trade === 'string'\n ? trade\n : (trade as BitcoinTradeData).unsignedPsbtBase64;\n\n const response = (await messenger.call(\n 'SnapController:handleRequest',\n computeFeeRequest(\n selectedAccount.metadata.snap?.id,\n transaction,\n selectedAccount.id,\n scope,\n ),\n )) as {\n type: 'base' | 'priority';\n asset: {\n unit: string;\n type: string;\n amount: string;\n fungible: true;\n };\n }[];\n\n // Bitcoin snap returns 'priority' fee, Solana returns 'base' fee\n const fee =\n response?.find((f) => f.type === 'base') ||\n response?.find((f) => f.type === 'priority') ||\n response?.[0];\n const feeInNative = fee?.asset?.amount || '0';\n\n return {\n ...quoteResponse,\n nonEvmFeesInNative: feeInNative,\n };\n } catch (error) {\n // Return quote with undefined fee if snap fails (e.g., insufficient UTXO funds)\n // Client can render special UI or skip the quote card row for quotes with missing fee data\n console.error(\n `Failed to compute non-EVM fees for quote ${quote.requestId}:`,\n error,\n );\n return {\n ...quoteResponse,\n nonEvmFeesInNative: undefined,\n };\n }\n }),\n );\n\n const quotesWithNonEvmFees = (await nonEvmFeePromises).reduce<\n (QuoteResponse & NonEvmFees)[]\n >((acc, result) => {\n if (result.status === 'fulfilled' && result.value) {\n acc.push(result.value);\n } else if (result.status === 'rejected') {\n console.error('Error calculating non-EVM fees for quote', result.reason);\n }\n return acc;\n }, []);\n\n return quotesWithNonEvmFees;\n};\n\n/**\n * Appends transaction fees to quotes\n *\n * @param quotes - Array of quote responses to append fees to\n * @param messenger - The bridge controller to use to call the snap controller\n * @param getLayer1GasFee - The function to use to get the layer 1 gas fee\n * @param selectedAccount - The selected account for which the quotes were requested\n * @returns Array of quotes with fees appended, or undefined if quotes are for EVM chains\n */\nexport const appendFeesToQuotes = async (\n quotes: QuoteResponse[],\n messenger: BridgeControllerMessenger,\n getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee,\n selectedAccount: InternalAccount,\n): Promise<(QuoteResponse & L1GasFees & NonEvmFees)[]> => {\n const quotesWithL1GasFees = await appendL1GasFees(quotes, getLayer1GasFee);\n const quotesWithNonEvmFees = await appendNonEvmFees(\n quotes,\n messenger,\n selectedAccount,\n );\n\n return quotesWithL1GasFees ?? quotesWithNonEvmFees ?? quotes;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quote-fees.d.cts","sourceRoot":"","sources":["../../src/utils/quote-fees.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,yCAAyC;AAO9E,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,UAAU,EAEV,yBAAyB,
|
|
1
|
+
{"version":3,"file":"quote-fees.d.cts","sourceRoot":"","sources":["../../src/utils/quote-fees.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,yCAAyC;AAO9E,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,UAAU,EAEV,yBAAyB,EAE1B,qBAAiB;AA2KlB;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,WACrB,aAAa,EAAE;;;;2DAGN,eAAe,KAC/B,QAAQ,CAAC,aAAa,GAAG,SAAS,GAAG,UAAU,CAAC,EAAE,CASpD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quote-fees.d.mts","sourceRoot":"","sources":["../../src/utils/quote-fees.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,yCAAyC;AAO9E,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,UAAU,EAEV,yBAAyB,
|
|
1
|
+
{"version":3,"file":"quote-fees.d.mts","sourceRoot":"","sources":["../../src/utils/quote-fees.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,yCAAyC;AAO9E,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,UAAU,EAEV,yBAAyB,EAE1B,qBAAiB;AA2KlB;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,WACrB,aAAa,EAAE;;;;2DAGN,eAAe,KAC/B,QAAQ,CAAC,aAAa,GAAG,SAAS,GAAG,UAAU,CAAC,EAAE,CASpD,CAAC"}
|
|
@@ -75,18 +75,38 @@ const appendNonEvmFees = async (quotes, messenger, selectedAccount) => {
|
|
|
75
75
|
}
|
|
76
76
|
const nonEvmFeePromises = Promise.allSettled(quotes.map(async (quoteResponse) => {
|
|
77
77
|
const { trade, quote } = quoteResponse;
|
|
78
|
-
if
|
|
78
|
+
// Skip fee computation if no snap account or trade data
|
|
79
|
+
if (!selectedAccount?.metadata?.snap?.id || !trade) {
|
|
80
|
+
return quoteResponse;
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
79
83
|
const scope = formatChainIdToCaip(quote.srcChainId);
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
//
|
|
83
|
-
const
|
|
84
|
+
// Normalize trade data to string format expected by snap
|
|
85
|
+
// Solana: trade is already a base64 transaction string
|
|
86
|
+
// Bitcoin: extract unsignedPsbtBase64 from trade object
|
|
87
|
+
const transaction = typeof trade === 'string'
|
|
88
|
+
? trade
|
|
89
|
+
: trade.unsignedPsbtBase64;
|
|
90
|
+
const response = (await messenger.call('SnapController:handleRequest', computeFeeRequest(selectedAccount.metadata.snap?.id, transaction, selectedAccount.id, scope)));
|
|
91
|
+
// Bitcoin snap returns 'priority' fee, Solana returns 'base' fee
|
|
92
|
+
const fee = response?.find((f) => f.type === 'base') ||
|
|
93
|
+
response?.find((f) => f.type === 'priority') ||
|
|
94
|
+
response?.[0];
|
|
95
|
+
const feeInNative = fee?.asset?.amount || '0';
|
|
84
96
|
return {
|
|
85
97
|
...quoteResponse,
|
|
86
98
|
nonEvmFeesInNative: feeInNative,
|
|
87
99
|
};
|
|
88
100
|
}
|
|
89
|
-
|
|
101
|
+
catch (error) {
|
|
102
|
+
// Return quote with undefined fee if snap fails (e.g., insufficient UTXO funds)
|
|
103
|
+
// Client can render special UI or skip the quote card row for quotes with missing fee data
|
|
104
|
+
console.error(`Failed to compute non-EVM fees for quote ${quote.requestId}:`, error);
|
|
105
|
+
return {
|
|
106
|
+
...quoteResponse,
|
|
107
|
+
nonEvmFeesInNative: undefined,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
90
110
|
}));
|
|
91
111
|
const quotesWithNonEvmFees = (await nonEvmFeePromises).reduce((acc, result) => {
|
|
92
112
|
if (result.status === 'fulfilled' && result.value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quote-fees.mjs","sourceRoot":"","sources":["../../src/utils/quote-fees.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { TransactionController } from '@metamask/transaction-controller';\nimport { numberToHex } from '@metamask/utils';\n\nimport { isNonEvmChainId, sumHexes } from './bridge';\nimport { formatChainIdToCaip } from './caip-formatters';\nimport { computeFeeRequest } from './snaps';\nimport { CHAIN_IDS } from '../constants/chains';\nimport type {\n QuoteResponse,\n L1GasFees,\n NonEvmFees,\n TxData,\n BridgeControllerMessenger,\n} from '../types';\n\n/**\n * Appends transaction fees for EVM chains to quotes\n *\n * @param quotes - Array of quote responses to append fees to\n * @param getLayer1GasFee - The function to use to get the layer 1 gas fee\n * @returns Array of quotes with fees appended, or undefined if quotes are for non-EVM chains\n */\nconst appendL1GasFees = async (\n quotes: QuoteResponse[],\n getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee,\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 undefined;\n }\n\n const l1GasFeePromises = Promise.allSettled(\n quotes.map(async (quoteResponse) => {\n const { quote, trade, approval } = quoteResponse;\n const chainId = numberToHex(quote.srcChainId);\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 getLayer1GasFee({\n transactionParams: getTxParams(approval),\n chainId,\n })\n : '0x0';\n const tradeL1GasFees = await getLayer1GasFee({\n transactionParams: getTxParams(trade as TxData),\n chainId,\n });\n\n if (approvalL1GasFees === undefined || tradeL1GasFees === undefined) {\n return undefined;\n }\n\n return {\n ...quoteResponse,\n l1GasFeesInHexWei: sumHexes(approvalL1GasFees, tradeL1GasFees),\n };\n }),\n );\n\n const quotesWithL1GasFees = (await l1GasFeePromises).reduce<\n (QuoteResponse & L1GasFees)[]\n >((acc, result) => {\n if (result.status === 'fulfilled' && result.value) {\n acc.push(result.value);\n } else if (result.status === 'rejected') {\n console.error('Error calculating L1 gas fees for quote', result.reason);\n }\n return acc;\n }, []);\n\n return quotesWithL1GasFees;\n};\n\n/**\n * Appends transaction fees for non-EVM chains to quotes\n *\n * @param quotes - Array of quote responses to append fees to\n * @param messenger - The messaging system to use to call the snap controller\n * @param selectedAccount - The selected account for which the quotes were requested\n * @returns Array of quotes with fees appended, or undefined if quotes are for EVM chains\n */\nconst appendNonEvmFees = async (\n quotes: QuoteResponse[],\n messenger: BridgeControllerMessenger,\n selectedAccount: InternalAccount,\n): Promise<(QuoteResponse & NonEvmFees)[] | undefined> => {\n if (\n quotes.some(({ quote: { srcChainId } }) => !isNonEvmChainId(srcChainId))\n ) {\n return undefined;\n }\n\n const nonEvmFeePromises = Promise.allSettled(\n quotes.map(async (quoteResponse) => {\n const { trade, quote } = quoteResponse;\n\n if (selectedAccount?.metadata?.snap?.id && typeof trade === 'string') {\n const scope = formatChainIdToCaip(quote.srcChainId);\n\n const response = (await messenger.call(\n 'SnapController:handleRequest',\n computeFeeRequest(\n selectedAccount.metadata.snap?.id,\n trade,\n selectedAccount.id,\n scope,\n ),\n )) as {\n type: 'base' | 'priority';\n asset: {\n unit: string;\n type: string;\n amount: string;\n fungible: true;\n };\n }[];\n\n const baseFee = response?.find((fee) => fee.type === 'base');\n // Store fees in native units as returned by the snap (e.g., SOL, BTC)\n const feeInNative = baseFee?.asset?.amount || '0';\n\n return {\n ...quoteResponse,\n nonEvmFeesInNative: feeInNative,\n };\n }\n return quoteResponse;\n }),\n );\n\n const quotesWithNonEvmFees = (await nonEvmFeePromises).reduce<\n (QuoteResponse & NonEvmFees)[]\n >((acc, result) => {\n if (result.status === 'fulfilled' && result.value) {\n acc.push(result.value);\n } else if (result.status === 'rejected') {\n console.error('Error calculating non-EVM fees for quote', result.reason);\n }\n return acc;\n }, []);\n\n return quotesWithNonEvmFees;\n};\n\n/**\n * Appends transaction fees to quotes\n *\n * @param quotes - Array of quote responses to append fees to\n * @param messenger - The bridge controller to use to call the snap controller\n * @param getLayer1GasFee - The function to use to get the layer 1 gas fee\n * @param selectedAccount - The selected account for which the quotes were requested\n * @returns Array of quotes with fees appended, or undefined if quotes are for EVM chains\n */\nexport const appendFeesToQuotes = async (\n quotes: QuoteResponse[],\n messenger: BridgeControllerMessenger,\n getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee,\n selectedAccount: InternalAccount,\n): Promise<(QuoteResponse & L1GasFees & NonEvmFees)[]> => {\n const quotesWithL1GasFees = await appendL1GasFees(quotes, getLayer1GasFee);\n const quotesWithNonEvmFees = await appendNonEvmFees(\n quotes,\n messenger,\n selectedAccount,\n );\n\n return quotesWithL1GasFees ?? quotesWithNonEvmFees ?? quotes;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"quote-fees.mjs","sourceRoot":"","sources":["../../src/utils/quote-fees.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { TransactionController } from '@metamask/transaction-controller';\nimport { numberToHex } from '@metamask/utils';\n\nimport { isNonEvmChainId, sumHexes } from './bridge';\nimport { formatChainIdToCaip } from './caip-formatters';\nimport { computeFeeRequest } from './snaps';\nimport { CHAIN_IDS } from '../constants/chains';\nimport type {\n QuoteResponse,\n L1GasFees,\n NonEvmFees,\n TxData,\n BridgeControllerMessenger,\n BitcoinTradeData,\n} from '../types';\n\n/**\n * Appends transaction fees for EVM chains to quotes\n *\n * @param quotes - Array of quote responses to append fees to\n * @param getLayer1GasFee - The function to use to get the layer 1 gas fee\n * @returns Array of quotes with fees appended, or undefined if quotes are for non-EVM chains\n */\nconst appendL1GasFees = async (\n quotes: QuoteResponse[],\n getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee,\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 undefined;\n }\n\n const l1GasFeePromises = Promise.allSettled(\n quotes.map(async (quoteResponse) => {\n const { quote, trade, approval } = quoteResponse;\n const chainId = numberToHex(quote.srcChainId);\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 getLayer1GasFee({\n transactionParams: getTxParams(approval),\n chainId,\n })\n : '0x0';\n const tradeL1GasFees = await getLayer1GasFee({\n transactionParams: getTxParams(trade as TxData),\n chainId,\n });\n\n if (approvalL1GasFees === undefined || tradeL1GasFees === undefined) {\n return undefined;\n }\n\n return {\n ...quoteResponse,\n l1GasFeesInHexWei: sumHexes(approvalL1GasFees, tradeL1GasFees),\n };\n }),\n );\n\n const quotesWithL1GasFees = (await l1GasFeePromises).reduce<\n (QuoteResponse & L1GasFees)[]\n >((acc, result) => {\n if (result.status === 'fulfilled' && result.value) {\n acc.push(result.value);\n } else if (result.status === 'rejected') {\n console.error('Error calculating L1 gas fees for quote', result.reason);\n }\n return acc;\n }, []);\n\n return quotesWithL1GasFees;\n};\n\n/**\n * Appends transaction fees for non-EVM chains to quotes\n *\n * @param quotes - Array of quote responses to append fees to\n * @param messenger - The messaging system to use to call the snap controller\n * @param selectedAccount - The selected account for which the quotes were requested\n * @returns Array of quotes with fees appended, or undefined if quotes are for EVM chains\n */\nconst appendNonEvmFees = async (\n quotes: QuoteResponse[],\n messenger: BridgeControllerMessenger,\n selectedAccount: InternalAccount,\n): Promise<(QuoteResponse & NonEvmFees)[] | undefined> => {\n if (\n quotes.some(({ quote: { srcChainId } }) => !isNonEvmChainId(srcChainId))\n ) {\n return undefined;\n }\n\n const nonEvmFeePromises = Promise.allSettled(\n quotes.map(async (quoteResponse) => {\n const { trade, quote } = quoteResponse;\n\n // Skip fee computation if no snap account or trade data\n if (!selectedAccount?.metadata?.snap?.id || !trade) {\n return quoteResponse;\n }\n\n try {\n const scope = formatChainIdToCaip(quote.srcChainId);\n\n // Normalize trade data to string format expected by snap\n // Solana: trade is already a base64 transaction string\n // Bitcoin: extract unsignedPsbtBase64 from trade object\n const transaction =\n typeof trade === 'string'\n ? trade\n : (trade as BitcoinTradeData).unsignedPsbtBase64;\n\n const response = (await messenger.call(\n 'SnapController:handleRequest',\n computeFeeRequest(\n selectedAccount.metadata.snap?.id,\n transaction,\n selectedAccount.id,\n scope,\n ),\n )) as {\n type: 'base' | 'priority';\n asset: {\n unit: string;\n type: string;\n amount: string;\n fungible: true;\n };\n }[];\n\n // Bitcoin snap returns 'priority' fee, Solana returns 'base' fee\n const fee =\n response?.find((f) => f.type === 'base') ||\n response?.find((f) => f.type === 'priority') ||\n response?.[0];\n const feeInNative = fee?.asset?.amount || '0';\n\n return {\n ...quoteResponse,\n nonEvmFeesInNative: feeInNative,\n };\n } catch (error) {\n // Return quote with undefined fee if snap fails (e.g., insufficient UTXO funds)\n // Client can render special UI or skip the quote card row for quotes with missing fee data\n console.error(\n `Failed to compute non-EVM fees for quote ${quote.requestId}:`,\n error,\n );\n return {\n ...quoteResponse,\n nonEvmFeesInNative: undefined,\n };\n }\n }),\n );\n\n const quotesWithNonEvmFees = (await nonEvmFeePromises).reduce<\n (QuoteResponse & NonEvmFees)[]\n >((acc, result) => {\n if (result.status === 'fulfilled' && result.value) {\n acc.push(result.value);\n } else if (result.status === 'rejected') {\n console.error('Error calculating non-EVM fees for quote', result.reason);\n }\n return acc;\n }, []);\n\n return quotesWithNonEvmFees;\n};\n\n/**\n * Appends transaction fees to quotes\n *\n * @param quotes - Array of quote responses to append fees to\n * @param messenger - The bridge controller to use to call the snap controller\n * @param getLayer1GasFee - The function to use to get the layer 1 gas fee\n * @param selectedAccount - The selected account for which the quotes were requested\n * @returns Array of quotes with fees appended, or undefined if quotes are for EVM chains\n */\nexport const appendFeesToQuotes = async (\n quotes: QuoteResponse[],\n messenger: BridgeControllerMessenger,\n getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee,\n selectedAccount: InternalAccount,\n): Promise<(QuoteResponse & L1GasFees & NonEvmFees)[]> => {\n const quotesWithL1GasFees = await appendL1GasFees(quotes, getLayer1GasFee);\n const quotesWithNonEvmFees = await appendNonEvmFees(\n quotes,\n messenger,\n selectedAccount,\n );\n\n return quotesWithL1GasFees ?? quotesWithNonEvmFees ?? quotes;\n};\n"]}
|