@metamask-previews/bridge-controller 77.8.0-preview-5959fe813 → 77.8.0-preview-0d2cbf546
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 +0 -12
- package/dist/bridge-controller.cjs +3 -8
- package/dist/bridge-controller.cjs.map +1 -1
- package/dist/bridge-controller.d.cts +3 -4
- package/dist/bridge-controller.d.cts.map +1 -1
- package/dist/bridge-controller.d.mts +3 -4
- package/dist/bridge-controller.d.mts.map +1 -1
- package/dist/bridge-controller.mjs +3 -8
- package/dist/bridge-controller.mjs.map +1 -1
- package/dist/index.cjs +2 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -12
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +4 -12
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -7
- package/dist/index.mjs.map +1 -1
- package/dist/selectors.cjs +29 -31
- package/dist/selectors.cjs.map +1 -1
- package/dist/selectors.d.cts +36410 -5110
- package/dist/selectors.d.cts.map +1 -1
- package/dist/selectors.d.mts +36410 -5110
- package/dist/selectors.d.mts.map +1 -1
- package/dist/selectors.mjs +29 -31
- package/dist/selectors.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +7 -2
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +7 -2
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/bridge.cjs +5 -1
- package/dist/utils/bridge.cjs.map +1 -1
- package/dist/utils/bridge.d.cts +19 -2
- package/dist/utils/bridge.d.cts.map +1 -1
- package/dist/utils/bridge.d.mts +19 -2
- package/dist/utils/bridge.d.mts.map +1 -1
- package/dist/utils/bridge.mjs +3 -0
- package/dist/utils/bridge.mjs.map +1 -1
- package/dist/utils/caip-formatters.cjs +3 -0
- package/dist/utils/caip-formatters.cjs.map +1 -1
- package/dist/utils/caip-formatters.d.cts.map +1 -1
- package/dist/utils/caip-formatters.d.mts.map +1 -1
- package/dist/utils/caip-formatters.mjs +3 -0
- package/dist/utils/caip-formatters.mjs.map +1 -1
- package/dist/utils/feature-flags.d.cts +2 -2
- package/dist/utils/feature-flags.d.mts +2 -2
- package/dist/utils/fetch.cjs +40 -37
- package/dist/utils/fetch.cjs.map +1 -1
- package/dist/utils/fetch.d.cts +4 -10
- package/dist/utils/fetch.d.cts.map +1 -1
- package/dist/utils/fetch.d.mts +4 -10
- package/dist/utils/fetch.d.mts.map +1 -1
- package/dist/utils/fetch.mjs +40 -37
- package/dist/utils/fetch.mjs.map +1 -1
- package/dist/utils/metrics/properties.cjs +6 -6
- package/dist/utils/metrics/properties.cjs.map +1 -1
- package/dist/utils/metrics/properties.d.cts +5 -8
- package/dist/utils/metrics/properties.d.cts.map +1 -1
- package/dist/utils/metrics/properties.d.mts +5 -8
- package/dist/utils/metrics/properties.d.mts.map +1 -1
- package/dist/utils/metrics/properties.mjs +6 -6
- package/dist/utils/metrics/properties.mjs.map +1 -1
- package/dist/utils/metrics/types.cjs.map +1 -1
- package/dist/utils/metrics/types.d.cts +1 -1
- package/dist/utils/metrics/types.d.cts.map +1 -1
- package/dist/utils/metrics/types.d.mts +1 -1
- package/dist/utils/metrics/types.d.mts.map +1 -1
- package/dist/utils/metrics/types.mjs.map +1 -1
- package/dist/utils/number-formatters.cjs +1 -74
- package/dist/utils/number-formatters.cjs.map +1 -1
- package/dist/utils/number-formatters.d.cts +0 -18
- package/dist/utils/number-formatters.d.cts.map +1 -1
- package/dist/utils/number-formatters.d.mts +0 -18
- package/dist/utils/number-formatters.d.mts.map +1 -1
- package/dist/utils/number-formatters.mjs +0 -71
- package/dist/utils/number-formatters.mjs.map +1 -1
- package/dist/utils/quote-fees.cjs +22 -23
- package/dist/utils/quote-fees.cjs.map +1 -1
- package/dist/utils/quote-fees.d.cts +2 -4
- package/dist/utils/quote-fees.d.cts.map +1 -1
- package/dist/utils/quote-fees.d.mts +2 -4
- package/dist/utils/quote-fees.d.mts.map +1 -1
- package/dist/utils/quote-fees.mjs +23 -24
- package/dist/utils/quote-fees.mjs.map +1 -1
- package/dist/utils/quote-metadata/calculators.cjs +35 -33
- package/dist/utils/quote-metadata/calculators.cjs.map +1 -1
- package/dist/utils/quote-metadata/calculators.d.cts +14 -20
- package/dist/utils/quote-metadata/calculators.d.cts.map +1 -1
- package/dist/utils/quote-metadata/calculators.d.mts +14 -20
- package/dist/utils/quote-metadata/calculators.d.mts.map +1 -1
- package/dist/utils/quote-metadata/calculators.mjs +36 -34
- package/dist/utils/quote-metadata/calculators.mjs.map +1 -1
- package/dist/utils/quote-metadata/merge.cjs +2 -24
- package/dist/utils/quote-metadata/merge.cjs.map +1 -1
- package/dist/utils/quote-metadata/merge.d.cts +2 -3
- package/dist/utils/quote-metadata/merge.d.cts.map +1 -1
- package/dist/utils/quote-metadata/merge.d.mts +2 -3
- package/dist/utils/quote-metadata/merge.d.mts.map +1 -1
- package/dist/utils/quote-metadata/merge.mjs +2 -24
- package/dist/utils/quote-metadata/merge.mjs.map +1 -1
- package/dist/utils/slippage.d.cts +1 -1
- package/dist/utils/slippage.d.mts +1 -1
- package/dist/validators/batch-sell.d.cts +8 -8
- package/dist/validators/batch-sell.d.mts +8 -8
- package/dist/validators/bridge-asset.cjs +1 -65
- package/dist/validators/bridge-asset.cjs.map +1 -1
- package/dist/validators/bridge-asset.d.cts +5 -99
- package/dist/validators/bridge-asset.d.cts.map +1 -1
- package/dist/validators/bridge-asset.d.mts +5 -99
- package/dist/validators/bridge-asset.d.mts.map +1 -1
- package/dist/validators/bridge-asset.mjs +1 -64
- package/dist/validators/bridge-asset.mjs.map +1 -1
- package/dist/validators/feature-flags.d.cts +5 -5
- package/dist/validators/feature-flags.d.mts +5 -5
- package/dist/validators/intent.d.cts +3 -3
- package/dist/validators/intent.d.mts +3 -3
- package/dist/validators/quote-response-v1.d.cts +179 -179
- package/dist/validators/quote-response-v1.d.mts +179 -179
- package/dist/validators/quote.cjs +3 -73
- package/dist/validators/quote.cjs.map +1 -1
- package/dist/validators/quote.d.cts +45 -407
- package/dist/validators/quote.d.cts.map +1 -1
- package/dist/validators/quote.d.mts +45 -407
- package/dist/validators/quote.d.mts.map +1 -1
- package/dist/validators/quote.mjs +4 -74
- package/dist/validators/quote.mjs.map +1 -1
- package/dist/validators/step.cjs +1 -7
- package/dist/validators/step.cjs.map +1 -1
- package/dist/validators/step.d.cts +26 -197
- package/dist/validators/step.d.cts.map +1 -1
- package/dist/validators/step.d.mts +26 -197
- package/dist/validators/step.d.mts.map +1 -1
- package/dist/validators/step.mjs +1 -7
- package/dist/validators/step.mjs.map +1 -1
- package/dist/validators/token-feature.d.cts +2 -2
- package/dist/validators/token-feature.d.mts +2 -2
- package/dist/validators/trade.d.cts +2 -2
- package/dist/validators/trade.d.mts +2 -2
- package/package.json +1 -1
- package/dist/coercers/quote-response-v1-to-v2.cjs +0 -137
- package/dist/coercers/quote-response-v1-to-v2.cjs.map +0 -1
- package/dist/coercers/quote-response-v1-to-v2.d.cts +0 -13
- package/dist/coercers/quote-response-v1-to-v2.d.cts.map +0 -1
- package/dist/coercers/quote-response-v1-to-v2.d.mts +0 -13
- package/dist/coercers/quote-response-v1-to-v2.d.mts.map +0 -1
- package/dist/coercers/quote-response-v1-to-v2.mjs +0 -132
- package/dist/coercers/quote-response-v1-to-v2.mjs.map +0 -1
- package/dist/coercers/quote-response-v2-to-v1.cjs +0 -173
- package/dist/coercers/quote-response-v2-to-v1.cjs.map +0 -1
- package/dist/coercers/quote-response-v2-to-v1.d.cts +0 -13
- package/dist/coercers/quote-response-v2-to-v1.d.cts.map +0 -1
- package/dist/coercers/quote-response-v2-to-v1.d.mts +0 -13
- package/dist/coercers/quote-response-v2-to-v1.d.mts.map +0 -1
- package/dist/coercers/quote-response-v2-to-v1.mjs +0 -169
- package/dist/coercers/quote-response-v2-to-v1.mjs.map +0 -1
- package/dist/utils/quote-metadata/to-normalized-amounts.cjs +0 -38
- package/dist/utils/quote-metadata/to-normalized-amounts.cjs.map +0 -1
- package/dist/utils/quote-metadata/to-normalized-amounts.d.cts +0 -10
- package/dist/utils/quote-metadata/to-normalized-amounts.d.cts.map +0 -1
- package/dist/utils/quote-metadata/to-normalized-amounts.d.mts +0 -10
- package/dist/utils/quote-metadata/to-normalized-amounts.d.mts.map +0 -1
- package/dist/utils/quote-metadata/to-normalized-amounts.mjs +0 -34
- package/dist/utils/quote-metadata/to-normalized-amounts.mjs.map +0 -1
- package/dist/utils/quote-metadata/to-quote-metadata-v1.cjs +0 -39
- package/dist/utils/quote-metadata/to-quote-metadata-v1.cjs.map +0 -1
- package/dist/utils/quote-metadata/to-quote-metadata-v1.d.cts +0 -13
- package/dist/utils/quote-metadata/to-quote-metadata-v1.d.cts.map +0 -1
- package/dist/utils/quote-metadata/to-quote-metadata-v1.d.mts +0 -13
- package/dist/utils/quote-metadata/to-quote-metadata-v1.d.mts.map +0 -1
- package/dist/utils/quote-metadata/to-quote-metadata-v1.mjs +0 -36
- package/dist/utils/quote-metadata/to-quote-metadata-v1.mjs.map +0 -1
- package/dist/utils/quote-metadata/to-quote-metadata-v2.cjs +0 -94
- package/dist/utils/quote-metadata/to-quote-metadata-v2.cjs.map +0 -1
- package/dist/utils/quote-metadata/to-quote-metadata-v2.d.cts +0 -12
- package/dist/utils/quote-metadata/to-quote-metadata-v2.d.cts.map +0 -1
- package/dist/utils/quote-metadata/to-quote-metadata-v2.d.mts +0 -12
- package/dist/utils/quote-metadata/to-quote-metadata-v2.d.mts.map +0 -1
- package/dist/utils/quote-metadata/to-quote-metadata-v2.mjs +0 -90
- package/dist/utils/quote-metadata/to-quote-metadata-v2.mjs.map +0 -1
- package/dist/validators/amount-and-asset.cjs +0 -27
- package/dist/validators/amount-and-asset.cjs.map +0 -1
- package/dist/validators/amount-and-asset.d.cts +0 -62
- package/dist/validators/amount-and-asset.d.cts.map +0 -1
- package/dist/validators/amount-and-asset.d.mts +0 -62
- package/dist/validators/amount-and-asset.d.mts.map +0 -1
- package/dist/validators/amount-and-asset.mjs +0 -24
- package/dist/validators/amount-and-asset.mjs.map +0 -1
- package/dist/validators/quote-response.cjs +0 -116
- package/dist/validators/quote-response.cjs.map +0 -1
- package/dist/validators/quote-response.d.cts +0 -1979
- package/dist/validators/quote-response.d.cts.map +0 -1
- package/dist/validators/quote-response.d.mts +0 -1979
- package/dist/validators/quote-response.d.mts.map +0 -1
- package/dist/validators/quote-response.mjs +0 -112
- package/dist/validators/quote-response.mjs.map +0 -1
package/dist/utils/fetch.cjs
CHANGED
|
@@ -3,9 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.fetchBatchSellTrades = exports.formatBatchSellTradesRequest = exports.fetchBridgeQuoteStream = exports.fetchAssetPrices = exports.fetchBridgeQuotes = exports.fetchBridgeTokens = exports.getClientHeaders = void 0;
|
|
4
4
|
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
|
5
5
|
const superstruct_1 = require("@metamask/superstruct");
|
|
6
|
-
const utils_1 = require("@metamask/utils");
|
|
7
|
-
const quote_response_v1_to_v2_1 = require("../coercers/quote-response-v1-to-v2.cjs");
|
|
8
|
-
const quote_response_v2_to_v1_1 = require("../coercers/quote-response-v2-to-v1.cjs");
|
|
9
6
|
const batch_sell_1 = require("../validators/batch-sell.cjs");
|
|
10
7
|
const bridge_asset_1 = require("../validators/bridge-asset.cjs");
|
|
11
8
|
const quote_response_v1_1 = require("../validators/quote-response-v1.cjs");
|
|
@@ -224,8 +221,8 @@ const fetchAssetPrices = async (request) => {
|
|
|
224
221
|
return combinedPrices;
|
|
225
222
|
};
|
|
226
223
|
exports.fetchAssetPrices = fetchAssetPrices;
|
|
227
|
-
const getQuoteRequestId = ({ srcChainId, destChainId, srcTokenAddress, destTokenAddress, }) => `${(0, caip_formatters_1.formatAddressToAssetId)(srcTokenAddress, srcChainId)}-${(0, caip_formatters_1.formatAddressToAssetId)(destTokenAddress, destChainId)}
|
|
228
|
-
const getQuoteResponseId = ({
|
|
224
|
+
const getQuoteRequestId = ({ srcChainId, destChainId, srcTokenAddress, destTokenAddress, }) => `${(0, caip_formatters_1.formatAddressToAssetId)(srcTokenAddress, srcChainId)}-${(0, caip_formatters_1.formatAddressToAssetId)(destTokenAddress, destChainId)}`;
|
|
225
|
+
const getQuoteResponseId = ({ srcAsset: { address: srcTokenAddress, chainId: srcChainId }, destAsset: { address: destTokenAddress, chainId: destChainId }, }) => `${(0, caip_formatters_1.formatAddressToAssetId)(srcTokenAddress, srcChainId)}-${(0, caip_formatters_1.formatAddressToAssetId)(destTokenAddress, destChainId)}`;
|
|
229
226
|
/**
|
|
230
227
|
* Fetches quotes from the bridge-api
|
|
231
228
|
*
|
|
@@ -255,43 +252,42 @@ async function fetchBridgeQuoteStream(fetchFn, quoteRequests, signal, featureId,
|
|
|
255
252
|
const quoteRequestIds = isBatchSellRequest
|
|
256
253
|
? normalizedQuoteRequests.map(getQuoteRequestId)
|
|
257
254
|
: undefined;
|
|
258
|
-
const onQuoteReceived = async (
|
|
255
|
+
const onQuoteReceived = async (quoteResponse) => {
|
|
259
256
|
const uniqueValidationFailures = new Set([]);
|
|
260
257
|
try {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
258
|
+
if ((0, quote_response_v1_1.validateQuoteResponseV1)(quoteResponse)) {
|
|
259
|
+
// Fallback to 0 if the quote doesn't match any requests
|
|
260
|
+
const matchedQuoteRequestIdx = Math.max(quoteRequestIds?.findIndex((id) => {
|
|
261
|
+
return id === getQuoteResponseId(quoteResponse.quote);
|
|
262
|
+
}) ?? 0, 0);
|
|
263
|
+
const matchingQuoteRequest = normalizedQuoteRequests[matchedQuoteRequestIdx];
|
|
264
|
+
return await serverEventHandlers.onValidQuoteReceived({
|
|
265
|
+
...quoteResponse,
|
|
266
|
+
featureId,
|
|
267
|
+
// Append the reset approval data to the quote response if the request has resetApproval set to true and the quote has an approval
|
|
268
|
+
resetApproval: matchingQuoteRequest.resetApproval &&
|
|
269
|
+
quoteResponse.approval &&
|
|
270
|
+
(0, trade_1.isEvmTxData)(quoteResponse.approval)
|
|
271
|
+
? {
|
|
272
|
+
...quoteResponse.approval,
|
|
273
|
+
data: (0, bridge_1.getEthUsdtResetData)(matchingQuoteRequest.destChainId),
|
|
274
|
+
}
|
|
275
|
+
: undefined,
|
|
276
|
+
...(isBatchSellRequest && {
|
|
277
|
+
quoteRequestIndex: matchedQuoteRequestIdx,
|
|
278
|
+
}),
|
|
279
|
+
});
|
|
280
|
+
}
|
|
283
281
|
}
|
|
284
282
|
catch (error) {
|
|
285
283
|
if (error instanceof superstruct_1.StructError) {
|
|
286
284
|
console.warn('Quote validation failed', (0, struct_error_1.formatStructErrors)(error));
|
|
287
285
|
error.failures().forEach(({ branch, path }) => {
|
|
288
|
-
const aggregatorId = branch?.[0]?.quote?.
|
|
289
|
-
branch?.[0]?.quote?.
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
quoteResponseV1OrV2?.quote?.aggregator ??
|
|
294
|
-
'unknown';
|
|
286
|
+
const aggregatorId = branch?.[0]?.quote?.bridgeId ??
|
|
287
|
+
branch?.[0]?.quote?.bridges?.[0] ??
|
|
288
|
+
quoteResponse?.quote?.bridgeId ??
|
|
289
|
+
(quoteResponse?.quote?.bridges?.[0] ||
|
|
290
|
+
'unknown');
|
|
295
291
|
const pathString = path?.join('.') || 'unknown';
|
|
296
292
|
uniqueValidationFailures.add([aggregatorId, pathString].join('|'));
|
|
297
293
|
});
|
|
@@ -303,6 +299,7 @@ async function fetchBridgeQuoteStream(fetchFn, quoteRequests, signal, featureId,
|
|
|
303
299
|
// Rethrow any unexpected errors
|
|
304
300
|
throw error;
|
|
305
301
|
}
|
|
302
|
+
return undefined;
|
|
306
303
|
};
|
|
307
304
|
const onTokenWarningReceived = (data) => {
|
|
308
305
|
try {
|
|
@@ -374,8 +371,14 @@ async function fetchBridgeQuoteStream(fetchFn, quoteRequests, signal, featureId,
|
|
|
374
371
|
exports.fetchBridgeQuoteStream = fetchBridgeQuoteStream;
|
|
375
372
|
const formatBatchSellTradesRequest = (quotes, stxEnabled) => ({
|
|
376
373
|
quotes: quotes
|
|
377
|
-
.filter((quote) => quote !== null
|
|
378
|
-
.map(
|
|
374
|
+
.filter((quote) => quote !== null)
|
|
375
|
+
.map(({ trade, approval, quote, estimatedProcessingTimeInSeconds, quoteId, }) => ({
|
|
376
|
+
trade,
|
|
377
|
+
approval,
|
|
378
|
+
quote,
|
|
379
|
+
estimatedProcessingTimeInSeconds,
|
|
380
|
+
quoteId,
|
|
381
|
+
})),
|
|
379
382
|
stxEnabled,
|
|
380
383
|
});
|
|
381
384
|
exports.formatBatchSellTradesRequest = formatBatchSellTradesRequest;
|
package/dist/utils/fetch.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.cjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":";;;AAAA,qEAAqE;AACrE,uDAAoD;AACpD,2CAAqD;AAGrD,qFAAwE;AACxE,qFAAwE;AAUxE,6DAA2E;AAC3E,iEAAiE;AAKjE,2EAA0E;AAC1E,mFAAkF;AAClF,mEAAmE;AACnE,mDAAkD;AAElD,yCAA+C;AAC/C,2DAI2B;AAC3B,mEAA0D;AAE1D,qDAAoD;AAE7C,MAAM,gBAAgB,GAAG,CAAC,EAC/B,QAAQ,EACR,aAAa,EACb,GAAG,GAKJ,EAAE,EAAE,CAAC,CAAC;IACL,aAAa,EAAE,QAAQ;IACvB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CAC9D,CAAC,CAAC;AAZU,QAAA,gBAAgB,oBAY1B;AAEH;;;;;;;;;;;;GAYG;AACI,KAAK,UAAU,iBAAiB,CACrC,OAA0B,EAC1B,QAAgB,EAChB,GAAuB,EACvB,OAAsB,EACtB,gBAAwB,EACxB,aAAsB;IAEtB,MAAM,GAAG,GAAG,GAAG,gBAAgB,sBAAsB,IAAA,oCAAkB,EAAC,OAAO,CAAC,EAAE,CAAC;IAEnF,uGAAuG;IACvG,uEAAuE;IACvE,6IAA6I;IAC7I,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE,IAAA,wBAAgB,EAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC;KAC5D,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAgC,EAAE,CAAC;IAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,KAAc,EAAE,EAAE;QAChC,IAAI,IAAA,kCAAmB,EAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAxBD,8CAwBC;AAED;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,CAAC,OAA4B,EAAgB,EAAE;IACxE,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC;IAC7E,wDAAwD;IACxD,MAAM,iBAAiB,GAAiB;QACtC,aAAa,EAAE,IAAA,8CAA4B,EAAC,OAAO,CAAC,aAAa,CAAC;QAClE,iBAAiB,EAAE,IAAA,8CAA4B,EAAC,iBAAiB,CAAC;QAClE,UAAU,EAAE,IAAA,oCAAkB,EAAC,OAAO,CAAC,UAAU,CAAC;QAClD,WAAW,EAAE,IAAA,oCAAkB,EAAC,OAAO,CAAC,WAAW,CAAC;QACpD,eAAe,EAAE,IAAA,8CAA4B,EAAC,OAAO,CAAC,eAAe,CAAC;QACtE,gBAAgB,EAAE,IAAA,8CAA4B,EAAC,OAAO,CAAC,gBAAgB,CAAC;QACxE,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;QACjD,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QAC7C,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;QACzC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;KAClD,CAAC;IACF,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,iBAAiB,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAChD,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC9B,iBAAiB,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,iBAAiB,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5C,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,iBAAiB,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAClD,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG,CACxB,iBAA+B,EACd,EAAE;IACnB,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;IAC1C,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACzD,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IACH,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACI,KAAK,UAAU,iBAAiB,CACrC,OAA4B,EAC5B,MAA0B,EAC1B,QAAgB,EAChB,GAAuB,EACvB,OAAsB,EACtB,gBAAwB,EACxB,SAA2B,EAC3B,aAAsB;IAKtB,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IAEzD,MAAM,GAAG,GAAG,GAAG,gBAAgB,aAAa,WAAW,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAc,MAAM,OAAO,CAAC,GAAG,EAAE;QAC3C,OAAO,EAAE,IAAA,wBAAgB,EAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC;QAC3D,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,wBAAwB,GAAgB,IAAI,GAAG,CAAS,EAAE,CAAC,CAAC;IAClE,MAAM,cAAc,GAAG,MAAM;SAC1B,MAAM,CAAC,CAAC,aAAsB,EAAoC,EAAE;QACnE,IAAI,CAAC;YACH,OAAO,IAAA,2CAAuB,EAAC,aAAa,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,yBAAW,EAAE,CAAC;gBACjC,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;oBAC5C,MAAM,YAAY,GAChB,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ;wBAC5B,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;wBAC/B,aAAiC,EAAE,KAAK,EAAE,QAAQ;wBAClD,aAAiC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;wBACvD,SAAS,CAAC;oBACZ,MAAM,UAAU,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;oBAChD,wBAAwB,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrE,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACf,GAAG,KAAK;QACR,SAAS,EAAE,SAAS,IAAI,SAAS;QACjC,sEAAsE;QACtE,8DAA8D;QAC9D,aAAa,EACX,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAA,mBAAW,EAAC,KAAK,CAAC,QAAQ,CAAC;YACpE,CAAC,CAAC;gBACE,GAAG,KAAK,CAAC,QAAQ;gBACjB,IAAI,EAAE,IAAA,4BAAmB,EAAC,OAAO,CAAC,WAAW,CAAC;aAC/C;YACH,CAAC,CAAC,SAAS;KAChB,CAAC,CAAC,CAAC;IAEN,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAChE,IAAI,wBAAwB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,kBAAkB,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO;QACL,MAAM,EAAE,cAAc;QACtB,kBAAkB;KACnB,CAAC;AACJ,CAAC;AAlED,8CAkEC;AAED,MAAM,2BAA2B,GAAG,KAAK,EAAE,OAO1C,EAAkE,EAAE;IACnE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,GACpE,OAAO,CAAC;IACV,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;QACtC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QACjD,UAAU,EAAE,QAAQ;KACrB,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,mDAAmD,WAAW,EAAE,CAAC;IAC7E,MAAM,gBAAgB,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE;QAC3C,OAAO,EAAE,IAAA,wBAAgB,EAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QACtD,MAAM;KACP,CAAC,CAAqE,CAAC;IACxE,IAAI,CAAC,gBAAgB,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QAC9D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAE5C,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,EAAE;QACpC,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,GAAG,CAAC;QACb,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,OAAwB,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,OAAwB,CAAC,GAAG,EAAE,CAAC;QACrC,CAAC;QACD,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,OAAwB,CAAC,CAAC,QAAQ,CAAC;gBACrC,eAAe,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC;AAEF;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,KAAK,EACnC,OAEuE,EAGvE,EAAE;IACF,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAExC,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,UAAU,CAC7C,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CACxB,KAAK,EAAE,QAAQ,EAAE,EAAE,CACjB,MAAM,2BAA2B,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,CAC3D,CACF,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,EAAE;QAC1B,OAAO,gBAAgB,CAAC,MAAM,CAE5B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;YAChB,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,EAAE;oBAClE,MAAM,cAAc,GAAG,GAAG,CAAC,OAAwB,CAAC,CAAC;oBACrD,IAAI,CAAC,cAAc,EAAE,CAAC;wBACpB,GAAG,CAAC,OAAwB,CAAC,GAAG,EAAE,CAAC;oBACrC,CAAC;oBACD,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE;wBAC5D,GAAG,CAAC,OAAwB,CAAC,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;oBAClD,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC;AAlCW,QAAA,gBAAgB,oBAkC3B;AAEF,MAAM,iBAAiB,GAAG,CAAC,EACzB,UAAU,EACV,WAAW,EACX,eAAe,EACf,gBAAgB,GACH,EAAU,EAAE,CACzB,GAAG,IAAA,wCAAsB,EAAC,eAAe,EAAE,UAAU,CAAC,IAAI,IAAA,wCAAsB,EAAC,gBAAgB,EAAE,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;AAElI,MAAM,kBAAkB,GAAG,CAAC,EAC1B,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EACxB,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GACH,EAAU,EAAE,CACnC,GAAG,QAAQ,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC;AAE3D;;;;;;;;;;;;;;;;;;GAkBG;AACI,KAAK,UAAU,sBAAsB,CAC1C,OAAsB,EACtB,aAAoC,EACpC,MAA+B,EAC/B,SAAoB,EACpB,QAAgB,EAChB,GAAuB,EACvB,gBAAwB,EACxB,mBAQC,EACD,aAAsB;IAEtB;;;OAGG;IACH,MAAM,kBAAkB,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IACpD,MAAM,uBAAuB,GAAG,aAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACtE,MAAM,eAAe,GAAG,kBAAkB;QACxC,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAChD,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,eAAe,GAAG,KAAK,EAC3B,mBAA4B,EACb,EAAE;QACjB,MAAM,wBAAwB,GAAgB,IAAI,GAAG,CAAS,EAAE,CAAC,CAAC;QAElE,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAA,2CAAiB,EAAC,mBAAmB,CAAC,CAAC;YAC7D,wDAAwD;YACxD,MAAM,sBAAsB,GAAG,IAAI,CAAC,GAAG,CACrC,eAAe,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE;gBAChC,OAAO,EAAE,KAAK,kBAAkB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACxD,CAAC,CAAC,IAAI,CAAC,EACP,CAAC,CACF,CAAC;YACF,MAAM,oBAAoB,GACxB,uBAAuB,CAAC,sBAAsB,CAAC,CAAC;YAElD,OAAO,MAAM,mBAAmB,CAAC,oBAAoB,CAAC;gBACpD,GAAG,aAAa;gBAChB,SAAS;gBACT,kIAAkI;gBAClI,aAAa,EACX,aAAa,CAAC,SAAS,KAAK,0BAAkB,CAAC,MAAM;oBACrD,oBAAoB,CAAC,aAAa;oBAClC,aAAa,CAAC,QAAQ;oBACpB,CAAC,CAAC;wBACE,GAAG,aAAa,CAAC,QAAQ;wBACzB,IAAI,EAAE,IAAA,4BAAmB,EAAC,oBAAoB,CAAC,WAAW,CAAC;qBAC5D;oBACH,CAAC,CAAC,SAAS;gBACf,GAAG,CAAC,kBAAkB,IAAI;oBACxB,iBAAiB,EAAE,sBAAsB;iBAC1C,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,yBAAW,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,IAAA,iCAAkB,EAAC,KAAK,CAAC,CAAC,CAAC;gBACnE,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;oBAC5C,MAAM,YAAY,GAChB,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU;wBAC9B,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;wBACjC,mBAAuC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;wBAC9D,mBAAuC,EAAE,KAAK,EAAE,QAAQ;wBACxD,mBAAuC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;wBAC5D,mBAAqC,EAAE,KAAK,EAAE,UAAU;wBACzD,SAAS,CAAC;oBACZ,MAAM,UAAU,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;oBAChD,wBAAwB,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrE,CAAC,CAAC,CAAC;YACL,CAAC;YACD,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAChE,IAAI,wBAAwB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACtC,OAAO,mBAAmB,CAAC,wBAAwB,CAAC,kBAAkB,CAAC,CAAC;YAC1E,CAAC;YACD,gCAAgC;YAChC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,sBAAsB,GAAG,CAAC,IAAa,EAAQ,EAAE;QACrD,IAAI,CAAC;YACH,IAAI,IAAA,oCAAoB,EAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,IAAa,EAAQ,EAAE;QACjD,IAAI,CAAC;YACH,IAAI,IAAA,mDAA2B,EAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,EACrB,IAA6B,EAC7B,SAAkB,EACH,EAAE;QACjB,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,OAAO;gBACV,OAAO,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YACrC,KAAK,eAAe;gBAClB,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC;YACtC,KAAK,UAAU;gBACb,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAClC;gBACE,OAAO,SAAS,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG;QACzB,MAAM;QACN,SAAS;QACT,OAAO,EAAE,CAAC,KAAc,EAAE,EAAE;YAC1B,iDAAiD;YACjD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,mBAAmB,CAAC,OAAO,EAAE,CAAC;QACtC,CAAC;QACD,OAAO;KACR,CAAC;IAEF,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,GAAG,gBAAgB,sBAAsB,CAAC;QAC5D,MAAM,IAAA,uCAAiB,EAAC,SAAS,EAAE;YACjC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,uBAAuB,EAAE,CAAC;YAC3D,OAAO,EAAE;gBACP,GAAG,IAAA,wBAAgB,EAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC;gBACrD,cAAc,EAAE,kBAAkB;aACnC;YACD,GAAG,kBAAkB;SACtB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,GAAG,gBAAgB,mBAAmB,WAAW,EAAE,CAAC;IACtE,MAAM,IAAA,uCAAiB,EAAC,SAAS,EAAE;QACjC,OAAO,EAAE;YACP,GAAG,IAAA,wBAAgB,EAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC;YACrD,cAAc,EAAE,mBAAmB;SACpC;QACD,GAAG,kBAAkB;KACtB,CAAC,CAAC;AACL,CAAC;AAhKD,wDAgKC;AAEM,MAAM,4BAA4B,GAAG,CAC1C,MAAoE,EACpE,UAAmB,EACK,EAAE,CAAC,CAAC;IAC5B,MAAM,EAAE,MAAM;SACX,MAAM,CACL,CAAC,KAAK,EAA8D,EAAE,CACpE,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CACnC;SACA,GAAG,CAAC,2CAAiB,CAAC;IACzB,UAAU;CACX,CAAC,CAAC;AAXU,QAAA,4BAA4B,gCAWtC;AAEH;;;;;;;;;;;;GAYG;AACI,KAAK,UAAU,oBAAoB,CACxC,MAAgC,EAChC,UAAmB,EACnB,MAA0B,EAC1B,QAAgB,EAChB,GAAuB,EACvB,OAAsB,EACtB,gBAAwB,EACxB,aAAsB;IAEtB,MAAM,GAAG,GAAG,GAAG,gBAAgB,qBAAqB,CAAC;IACrD,MAAM,OAAO,GAA2B,IAAA,oCAA4B,EAClE,MAAM,EACN,UAAU,CACX,CAAC;IACF,MAAM,uBAAuB,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;QACjD,OAAO,EAAE;YACP,GAAG,IAAA,wBAAgB,EAAC;gBAClB,QAAQ;gBACR,aAAa;gBACb,GAAG;aACJ,CAAC;YACF,cAAc,EAAE,kBAAkB;SACnC;QACD,MAAM;QACN,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAC;IAEH,IAAI,CAAC,uBAAuB,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,sCAAsC,uBAAuB,CAAC,UAAU,EAAE,CAC3E,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,IAAI,EAAE,CAAC;QAClD,IAAA,4CAA+B,EAAC,IAAI,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,gCAAgC;QAChC,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AA3CD,oDA2CC","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { StructError } from '@metamask/superstruct';\nimport { KnownCaipNamespace } from '@metamask/utils';\nimport type { CaipAssetType, CaipChainId, Hex } from '@metamask/utils';\n\nimport { toQuoteResponseV2 } from '../coercers/quote-response-v1-to-v2';\nimport { toQuoteResponseV1 } from '../coercers/quote-response-v2-to-v1';\nimport type {\n FetchFunction,\n GenericQuoteRequest,\n QuoteRequest,\n TokenFeature,\n QuoteStreamCompleteData,\n BatchSellTradesRequest,\n BatchSellTradesResponse,\n} from '../types';\nimport { validateBatchSellTradesResponse } from '../validators/batch-sell';\nimport { validateBridgeAsset } from '../validators/bridge-asset';\nimport type { BridgeAsset } from '../validators/bridge-asset';\nimport type { FeatureId } from '../validators/feature-flags';\nimport type { QuoteResponse } from '../validators/quote-response';\nimport type { QuoteResponseV1 } from '../validators/quote-response-v1';\nimport { validateQuoteResponseV1 } from '../validators/quote-response-v1';\nimport { validateQuoteStreamComplete } from '../validators/quote-stream-complete';\nimport { validateTokenFeature } from '../validators/token-feature';\nimport { isEvmTxData } from '../validators/trade';\nimport type { TxData } from '../validators/trade';\nimport { getEthUsdtResetData } from './bridge';\nimport {\n formatAddressToAssetId,\n formatAddressToCaipReference,\n formatChainIdToDec,\n} from './caip-formatters';\nimport { fetchServerEvents } from './fetch-server-events';\nimport type { QuoteMetadata } from './quote-metadata/types';\nimport { formatStructErrors } from './struct-error';\n\nexport const getClientHeaders = ({\n clientId,\n clientVersion,\n jwt,\n}: {\n clientId: string;\n clientVersion?: string;\n jwt?: string;\n}) => ({\n 'X-Client-Id': clientId,\n ...(jwt ? { Authorization: `Bearer ${jwt}` } : {}),\n ...(clientVersion ? { 'Client-Version': clientVersion } : {}),\n});\n\n/**\n * Returns a list of enabled (unblocked) tokens\n *\n * @deprecated Use the popular and search bridge-api endpoints instead\n *\n * @param chainId - The chain ID to fetch tokens for\n * @param clientId - The client ID for metrics\n * @param jwt - The JWT token for authentication\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @param clientVersion - The client version for metrics (optional)\n * @returns A list of enabled (unblocked) tokens\n */\nexport async function fetchBridgeTokens(\n chainId: Hex | CaipChainId,\n clientId: string,\n jwt: string | undefined,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n clientVersion?: string,\n): Promise<Record<string, BridgeAsset>> {\n const url = `${bridgeApiBaseUrl}/getTokens?chainId=${formatChainIdToDec(chainId)}`;\n\n // TODO we will need to cache these. In Extension fetchWithCache is used. This is due to the following:\n // If we allow selecting dest networks which the user has not imported,\n // note that the Assets controller won't be able to provide tokens. In extension we fetch+cache the token list from bridge-api to handle this\n const tokens = await fetchFn(url, {\n headers: getClientHeaders({ clientId, clientVersion, jwt }),\n });\n\n const transformedTokens: Record<string, BridgeAsset> = {};\n tokens.forEach((token: unknown) => {\n if (validateBridgeAsset(token)) {\n transformedTokens[token.address] = token;\n }\n });\n return transformedTokens;\n}\n\n/**\n * Converts the generic quote request to QuoteRequest\n *\n * @param request - The quote request\n * @returns A QuoteRequest object\n */\nconst formatQuoteRequest = (request: GenericQuoteRequest): QuoteRequest => {\n const destWalletAddress = request.destWalletAddress ?? request.walletAddress;\n // Transform the generic quote request into QuoteRequest\n const normalizedRequest: QuoteRequest = {\n walletAddress: formatAddressToCaipReference(request.walletAddress),\n destWalletAddress: formatAddressToCaipReference(destWalletAddress),\n srcChainId: formatChainIdToDec(request.srcChainId),\n destChainId: formatChainIdToDec(request.destChainId),\n srcTokenAddress: formatAddressToCaipReference(request.srcTokenAddress),\n destTokenAddress: formatAddressToCaipReference(request.destTokenAddress),\n srcTokenAmount: request.srcTokenAmount,\n insufficientBal: Boolean(request.insufficientBal),\n resetApproval: Boolean(request.resetApproval),\n gasIncluded: Boolean(request.gasIncluded),\n gasIncluded7702: Boolean(request.gasIncluded7702),\n };\n if (request.slippage !== undefined) {\n normalizedRequest.slippage = request.slippage;\n }\n if (request.fee !== undefined) {\n normalizedRequest.fee = request.fee;\n }\n if (request.aggIds && request.aggIds.length > 0) {\n normalizedRequest.aggIds = request.aggIds;\n }\n if (request.bridgeIds && request.bridgeIds.length > 0) {\n normalizedRequest.bridgeIds = request.bridgeIds;\n }\n\n return normalizedRequest;\n};\n\n/**\n * Converts the generic quote request to the type that the bridge-api expects\n *\n * @param normalizedRequest - The normalized quote request\n * @returns A URLSearchParams object with the query parameters\n */\nconst formatQueryParams = (\n normalizedRequest: QuoteRequest,\n): URLSearchParams => {\n const queryParams = new URLSearchParams();\n Object.entries(normalizedRequest).forEach(([key, value]) => {\n queryParams.append(key, value.toString());\n });\n return queryParams;\n};\n\n/**\n * Fetches quotes from the bridge-api's getQuote endpoint\n *\n * @param request - The quote request\n * @param signal - The abort signal\n * @param clientId - The client ID for metrics\n * @param jwt - The JWT token for authentication\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @param featureId - The feature ID to append to each quote\n * @param clientVersion - The client version for metrics (optional)\n * @returns A list of bridge tx quotes\n */\nexport async function fetchBridgeQuotes(\n request: GenericQuoteRequest,\n signal: AbortSignal | null,\n clientId: string,\n jwt: string | undefined,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n featureId: FeatureId | null,\n clientVersion?: string,\n): Promise<{\n quotes: QuoteResponseV1[];\n validationFailures: string[];\n}> {\n const normalizedRequest = formatQuoteRequest(request);\n const queryParams = formatQueryParams(normalizedRequest);\n\n const url = `${bridgeApiBaseUrl}/getQuote?${queryParams}`;\n const quotes: unknown[] = await fetchFn(url, {\n headers: getClientHeaders({ clientId, clientVersion, jwt }),\n signal,\n });\n\n const uniqueValidationFailures: Set<string> = new Set<string>([]);\n const filteredQuotes = quotes\n .filter((quoteResponse: unknown): quoteResponse is QuoteResponseV1 => {\n try {\n return validateQuoteResponseV1(quoteResponse);\n } catch (error) {\n if (error instanceof StructError) {\n error.failures().forEach(({ branch, path }) => {\n const aggregatorId =\n branch?.[0]?.quote?.bridgeId ??\n branch?.[0]?.quote?.bridges?.[0] ??\n (quoteResponse as QuoteResponseV1)?.quote?.bridgeId ??\n (quoteResponse as QuoteResponseV1)?.quote?.bridges?.[0] ??\n 'unknown';\n const pathString = path?.join('.') || 'unknown';\n uniqueValidationFailures.add([aggregatorId, pathString].join('|'));\n });\n }\n return false;\n }\n })\n .map((quote) => ({\n ...quote,\n featureId: featureId ?? undefined,\n // Append the reset approval data to the quote response if the request\n // has resetApproval set to true and the quote has an approval\n resetApproval:\n request.resetApproval && quote.approval && isEvmTxData(quote.approval)\n ? {\n ...quote.approval,\n data: getEthUsdtResetData(request.destChainId),\n }\n : undefined,\n }));\n\n const validationFailures = Array.from(uniqueValidationFailures);\n if (uniqueValidationFailures.size > 0) {\n console.warn('Quote validation failed', validationFailures);\n }\n\n return {\n quotes: filteredQuotes,\n validationFailures,\n };\n}\n\nconst fetchAssetPricesForCurrency = async (request: {\n currency: string;\n assetIds: Set<CaipAssetType>;\n clientId: string;\n clientVersion?: string;\n fetchFn: FetchFunction;\n signal?: AbortSignal;\n}): Promise<Record<CaipAssetType, { [currency: string]: string }>> => {\n const { currency, assetIds, clientId, clientVersion, fetchFn, signal } =\n request;\n const validAssetIds = Array.from(assetIds).filter(Boolean);\n if (validAssetIds.length === 0) {\n return {};\n }\n\n const queryParams = new URLSearchParams({\n assetIds: validAssetIds.filter(Boolean).join(','),\n vsCurrency: currency,\n });\n const url = `https://price.api.cx.metamask.io/v3/spot-prices?${queryParams}`;\n const priceApiResponse = (await fetchFn(url, {\n headers: getClientHeaders({ clientId, clientVersion }),\n signal,\n })) as unknown as Record<CaipAssetType, { [currency: string]: number }>;\n if (!priceApiResponse || typeof priceApiResponse !== 'object') {\n return {};\n }\n\n return Object.entries(priceApiResponse).reduce<\n Record<CaipAssetType, { [currency: string]: string }>\n >((acc, [assetId, currencyToPrice]) => {\n if (!currencyToPrice) {\n return acc;\n }\n if (!acc[assetId as CaipAssetType]) {\n acc[assetId as CaipAssetType] = {};\n }\n if (currencyToPrice[currency]) {\n acc[assetId as CaipAssetType][currency] =\n currencyToPrice[currency].toString();\n }\n return acc;\n }, {});\n};\n\n/**\n * Fetches the asset prices from the price API for multiple currencies\n *\n * @param request - The request object\n * @returns The asset prices by assetId\n */\nexport const fetchAssetPrices = async (\n request: {\n currencies: Set<string>;\n } & Omit<Parameters<typeof fetchAssetPricesForCurrency>[0], 'currency'>,\n): Promise<\n Record<CaipAssetType, { [currency: string]: string } | undefined>\n> => {\n const { currencies, ...args } = request;\n\n const combinedPrices = await Promise.allSettled(\n Array.from(currencies).map(\n async (currency) =>\n await fetchAssetPricesForCurrency({ ...args, currency }),\n ),\n ).then((priceApiResponse) => {\n return priceApiResponse.reduce<\n Record<CaipAssetType, { [currency: string]: string }>\n >((acc, result) => {\n if (result.status === 'fulfilled') {\n Object.entries(result.value).forEach(([assetId, currencyToPrice]) => {\n const existingPrices = acc[assetId as CaipAssetType];\n if (!existingPrices) {\n acc[assetId as CaipAssetType] = {};\n }\n Object.entries(currencyToPrice).forEach(([currency, price]) => {\n acc[assetId as CaipAssetType][currency] = price;\n });\n });\n }\n return acc;\n }, {});\n });\n\n return combinedPrices;\n};\n\nconst getQuoteRequestId = ({\n srcChainId,\n destChainId,\n srcTokenAddress,\n destTokenAddress,\n}: QuoteRequest): string =>\n `${formatAddressToAssetId(srcTokenAddress, srcChainId)}-${formatAddressToAssetId(destTokenAddress, destChainId)}`.toLowerCase();\n\nconst getQuoteResponseId = ({\n src: { asset: srcAsset },\n dest: { asset: destAsset },\n}: QuoteResponse['quote']): string =>\n `${srcAsset.assetId}-${destAsset.assetId}`.toLowerCase();\n\n/**\n * Fetches quotes from the bridge-api\n *\n * @param fetchFn - The fetch function to use\n * @param quoteRequests - An array of GenericQuoteRequest objects\n * @param signal - The abort signal\n * @param featureId - The {@link FeatureId} for the experience that's requesting the quotes\n * @param clientId - The client ID for metrics\n * @param jwt - The JWT token for authentication\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @param serverEventHandlers - The server event handlers\n * @param serverEventHandlers.onQuoteValidationFailure - The function to handle quote validation failures\n * @param serverEventHandlers.onValidQuoteReceived - The function to handle valid quotes\n * @param serverEventHandlers.onTokenWarning - The function to handle token warning events\n * @param serverEventHandlers.onComplete - The function to handle the complete event emitted when the stream finishes\n * @param serverEventHandlers.onClose - The function to run when the stream is closed and there are no thrown errors\n * @param clientVersion - The client version for metrics (optional)\n * @returns A list of bridge tx quote promises\n */\nexport async function fetchBridgeQuoteStream(\n fetchFn: FetchFunction,\n quoteRequests: GenericQuoteRequest[],\n signal: AbortSignal | undefined,\n featureId: FeatureId,\n clientId: string,\n jwt: string | undefined,\n bridgeApiBaseUrl: string,\n serverEventHandlers: {\n onClose: () => void | Promise<void>;\n onQuoteValidationFailure: (validationFailures: string[]) => void;\n onValidQuoteReceived: (\n quotes: QuoteResponse & { resetApproval?: TxData },\n ) => Promise<void>;\n onTokenWarning: (warning: TokenFeature) => void;\n onComplete: (data: QuoteStreamCompleteData) => void;\n },\n clientVersion?: string,\n): Promise<void> {\n /**\n * If the request includes multiple quote requests, it is a batch sell request.\n * A batch sell consists of multiple swaps that are executed in a single tx submission.\n */\n const isBatchSellRequest = quoteRequests.length > 1;\n const normalizedQuoteRequests = quoteRequests.map(formatQuoteRequest);\n const quoteRequestIds = isBatchSellRequest\n ? normalizedQuoteRequests.map(getQuoteRequestId)\n : undefined;\n\n const onQuoteReceived = async (\n quoteResponseV1OrV2: unknown,\n ): Promise<void> => {\n const uniqueValidationFailures: Set<string> = new Set<string>([]);\n\n try {\n const quoteResponse = toQuoteResponseV2(quoteResponseV1OrV2);\n // Fallback to 0 if the quote doesn't match any requests\n const matchedQuoteRequestIdx = Math.max(\n quoteRequestIds?.findIndex((id) => {\n return id === getQuoteResponseId(quoteResponse.quote);\n }) ?? 0,\n 0,\n );\n const matchingQuoteRequest =\n normalizedQuoteRequests[matchedQuoteRequestIdx];\n\n return await serverEventHandlers.onValidQuoteReceived({\n ...quoteResponse,\n featureId,\n // Append the reset approval data to the quote response if the request has resetApproval set to true and the quote has an approval\n resetApproval:\n quoteResponse.namespace === KnownCaipNamespace.Eip155 &&\n matchingQuoteRequest.resetApproval &&\n quoteResponse.approval\n ? {\n ...quoteResponse.approval,\n data: getEthUsdtResetData(matchingQuoteRequest.destChainId),\n }\n : undefined,\n ...(isBatchSellRequest && {\n quoteRequestIndex: matchedQuoteRequestIdx,\n }),\n });\n } catch (error) {\n if (error instanceof StructError) {\n console.warn('Quote validation failed', formatStructErrors(error));\n error.failures().forEach(({ branch, path }) => {\n const aggregatorId =\n branch?.[0]?.quote?.aggregator ??\n branch?.[0]?.quote?.protocols?.[0] ??\n (quoteResponseV1OrV2 as QuoteResponseV1)?.quote?.protocols?.[0] ??\n (quoteResponseV1OrV2 as QuoteResponseV1)?.quote?.bridgeId ??\n (quoteResponseV1OrV2 as QuoteResponseV1)?.quote?.bridges?.[0] ??\n (quoteResponseV1OrV2 as QuoteResponse)?.quote?.aggregator ??\n 'unknown';\n const pathString = path?.join('.') || 'unknown';\n uniqueValidationFailures.add([aggregatorId, pathString].join('|'));\n });\n }\n const validationFailures = Array.from(uniqueValidationFailures);\n if (uniqueValidationFailures.size > 0) {\n return serverEventHandlers.onQuoteValidationFailure(validationFailures);\n }\n // Rethrow any unexpected errors\n throw error;\n }\n };\n\n const onTokenWarningReceived = (data: unknown): void => {\n try {\n if (validateTokenFeature(data)) {\n serverEventHandlers.onTokenWarning(data);\n }\n } catch (error) {\n console.warn('Token warning validation failed', error);\n }\n };\n\n const onCompleteReceived = (data: unknown): void => {\n try {\n if (validateQuoteStreamComplete(data)) {\n serverEventHandlers.onComplete(data);\n }\n } catch (error) {\n console.warn('Quote stream complete validation failed', error);\n }\n };\n\n const onMessage = async (\n data: Record<string, unknown>,\n eventName?: string,\n ): Promise<void> => {\n switch (eventName) {\n case 'quote':\n return await onQuoteReceived(data);\n case 'token_warning':\n return onTokenWarningReceived(data);\n case 'complete':\n return onCompleteReceived(data);\n default:\n return undefined;\n }\n };\n\n const sharedFetchOptions = {\n signal,\n onMessage,\n onError: (error: unknown) => {\n // Rethrow error to prevent silent fetch failures\n throw error;\n },\n onClose: async () => {\n await serverEventHandlers.onClose();\n },\n fetchFn,\n };\n\n if (isBatchSellRequest) {\n const urlStream = `${bridgeApiBaseUrl}/getBatchQuoteStream`;\n await fetchServerEvents(urlStream, {\n method: 'POST',\n body: JSON.stringify({ requests: normalizedQuoteRequests }),\n headers: {\n ...getClientHeaders({ clientId, clientVersion, jwt }),\n 'Content-Type': 'application/json',\n },\n ...sharedFetchOptions,\n });\n return;\n }\n\n const queryParams = formatQueryParams(normalizedQuoteRequests[0]);\n const urlStream = `${bridgeApiBaseUrl}/getQuoteStream?${queryParams}`;\n await fetchServerEvents(urlStream, {\n headers: {\n ...getClientHeaders({ clientId, clientVersion, jwt }),\n 'Content-Type': 'text/event-stream',\n },\n ...sharedFetchOptions,\n });\n}\n\nexport const formatBatchSellTradesRequest = (\n quotes: (QuoteResponse | (QuoteResponseV1 & QuoteMetadata) | null)[],\n stxEnabled: boolean,\n): BatchSellTradesRequest => ({\n quotes: quotes\n .filter(\n (quote): quote is QuoteResponse | (QuoteResponseV1 & QuoteMetadata) =>\n quote !== null && Boolean(quote),\n )\n .map(toQuoteResponseV1),\n stxEnabled,\n});\n\n/**\n * Fetches quotes from the bridge-api's getQuote endpoint\n *\n * @param quotes - The quotes to fetch the gasless transaction data and fees for. May contain null values if a quote is not available for a swap\n * @param stxEnabled - Flag to estimate gas cost more precisely for the batch sell feature.\n * @param signal - The abort signal\n * @param clientId - The client ID for metrics\n * @param jwt - The JWT token for authentication\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @param clientVersion - The client version for metrics (optional)\n * @returns The batch sell trades and the total network fee\n */\nexport async function fetchBatchSellTrades(\n quotes: (QuoteResponse | null)[],\n stxEnabled: boolean,\n signal: AbortSignal | null,\n clientId: string,\n jwt: string | undefined,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n clientVersion?: string,\n): Promise<BatchSellTradesResponse> {\n const url = `${bridgeApiBaseUrl}/obtainGaslessBatch`;\n const request: BatchSellTradesRequest = formatBatchSellTradesRequest(\n quotes,\n stxEnabled,\n );\n const batchSellTradesResponse = await fetchFn(url, {\n headers: {\n ...getClientHeaders({\n clientId,\n clientVersion,\n jwt,\n }),\n 'Content-Type': 'application/json',\n },\n signal,\n method: 'POST',\n body: JSON.stringify(request),\n });\n\n if (!batchSellTradesResponse.ok) {\n throw new Error(\n `Failed to fetch batch sell trades. ${batchSellTradesResponse.statusText}`,\n );\n }\n\n try {\n const data = await batchSellTradesResponse.json();\n validateBatchSellTradesResponse(data);\n return data;\n } catch (error: unknown) {\n // TODO validation failure event\n throw new Error(`Invalid batch simulation response. ${error?.toString()}`);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fetch.cjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { StructError } from '@metamask/superstruct';\nimport type { CaipAssetType, CaipChainId, Hex } from '@metamask/utils';\n\nimport type {\n FetchFunction,\n GenericQuoteRequest,\n QuoteRequest,\n BridgeAsset,\n TokenFeature,\n QuoteStreamCompleteData,\n BatchSellTradesRequest,\n BatchSellTradesResponse,\n} from '../types';\nimport { validateBatchSellTradesResponse } from '../validators/batch-sell';\nimport { validateBridgeAsset } from '../validators/bridge-asset';\nimport type { FeatureId } from '../validators/feature-flags';\nimport type { QuoteResponseV1 } from '../validators/quote-response-v1';\nimport { validateQuoteResponseV1 } from '../validators/quote-response-v1';\nimport { validateQuoteStreamComplete } from '../validators/quote-stream-complete';\nimport { validateTokenFeature } from '../validators/token-feature';\nimport { isEvmTxData } from '../validators/trade';\nimport { getEthUsdtResetData } from './bridge';\nimport {\n formatAddressToAssetId,\n formatAddressToCaipReference,\n formatChainIdToDec,\n} from './caip-formatters';\nimport { fetchServerEvents } from './fetch-server-events';\nimport { formatStructErrors } from './struct-error';\n\nexport const getClientHeaders = ({\n clientId,\n clientVersion,\n jwt,\n}: {\n clientId: string;\n clientVersion?: string;\n jwt?: string;\n}) => ({\n 'X-Client-Id': clientId,\n ...(jwt ? { Authorization: `Bearer ${jwt}` } : {}),\n ...(clientVersion ? { 'Client-Version': clientVersion } : {}),\n});\n\n/**\n * Returns a list of enabled (unblocked) tokens\n *\n * @deprecated Use the popular and search bridge-api endpoints instead\n *\n * @param chainId - The chain ID to fetch tokens for\n * @param clientId - The client ID for metrics\n * @param jwt - The JWT token for authentication\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @param clientVersion - The client version for metrics (optional)\n * @returns A list of enabled (unblocked) tokens\n */\nexport async function fetchBridgeTokens(\n chainId: Hex | CaipChainId,\n clientId: string,\n jwt: string | undefined,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n clientVersion?: string,\n): Promise<Record<string, BridgeAsset>> {\n const url = `${bridgeApiBaseUrl}/getTokens?chainId=${formatChainIdToDec(chainId)}`;\n\n // TODO we will need to cache these. In Extension fetchWithCache is used. This is due to the following:\n // If we allow selecting dest networks which the user has not imported,\n // note that the Assets controller won't be able to provide tokens. In extension we fetch+cache the token list from bridge-api to handle this\n const tokens = await fetchFn(url, {\n headers: getClientHeaders({ clientId, clientVersion, jwt }),\n });\n\n const transformedTokens: Record<string, BridgeAsset> = {};\n tokens.forEach((token: unknown) => {\n if (validateBridgeAsset(token)) {\n transformedTokens[token.address] = token;\n }\n });\n return transformedTokens;\n}\n\n/**\n * Converts the generic quote request to QuoteRequest\n *\n * @param request - The quote request\n * @returns A QuoteRequest object\n */\nconst formatQuoteRequest = (request: GenericQuoteRequest): QuoteRequest => {\n const destWalletAddress = request.destWalletAddress ?? request.walletAddress;\n // Transform the generic quote request into QuoteRequest\n const normalizedRequest: QuoteRequest = {\n walletAddress: formatAddressToCaipReference(request.walletAddress),\n destWalletAddress: formatAddressToCaipReference(destWalletAddress),\n srcChainId: formatChainIdToDec(request.srcChainId),\n destChainId: formatChainIdToDec(request.destChainId),\n srcTokenAddress: formatAddressToCaipReference(request.srcTokenAddress),\n destTokenAddress: formatAddressToCaipReference(request.destTokenAddress),\n srcTokenAmount: request.srcTokenAmount,\n insufficientBal: Boolean(request.insufficientBal),\n resetApproval: Boolean(request.resetApproval),\n gasIncluded: Boolean(request.gasIncluded),\n gasIncluded7702: Boolean(request.gasIncluded7702),\n };\n if (request.slippage !== undefined) {\n normalizedRequest.slippage = request.slippage;\n }\n if (request.fee !== undefined) {\n normalizedRequest.fee = request.fee;\n }\n if (request.aggIds && request.aggIds.length > 0) {\n normalizedRequest.aggIds = request.aggIds;\n }\n if (request.bridgeIds && request.bridgeIds.length > 0) {\n normalizedRequest.bridgeIds = request.bridgeIds;\n }\n\n return normalizedRequest;\n};\n\n/**\n * Converts the generic quote request to the type that the bridge-api expects\n *\n * @param normalizedRequest - The normalized quote request\n * @returns A URLSearchParams object with the query parameters\n */\nconst formatQueryParams = (\n normalizedRequest: QuoteRequest,\n): URLSearchParams => {\n const queryParams = new URLSearchParams();\n Object.entries(normalizedRequest).forEach(([key, value]) => {\n queryParams.append(key, value.toString());\n });\n return queryParams;\n};\n\n/**\n * Fetches quotes from the bridge-api's getQuote endpoint\n *\n * @param request - The quote request\n * @param signal - The abort signal\n * @param clientId - The client ID for metrics\n * @param jwt - The JWT token for authentication\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @param featureId - The feature ID to append to each quote\n * @param clientVersion - The client version for metrics (optional)\n * @returns A list of bridge tx quotes\n */\nexport async function fetchBridgeQuotes(\n request: GenericQuoteRequest,\n signal: AbortSignal | null,\n clientId: string,\n jwt: string | undefined,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n featureId: FeatureId | null,\n clientVersion?: string,\n): Promise<{\n quotes: QuoteResponseV1[];\n validationFailures: string[];\n}> {\n const normalizedRequest = formatQuoteRequest(request);\n const queryParams = formatQueryParams(normalizedRequest);\n\n const url = `${bridgeApiBaseUrl}/getQuote?${queryParams}`;\n const quotes: unknown[] = await fetchFn(url, {\n headers: getClientHeaders({ clientId, clientVersion, jwt }),\n signal,\n });\n\n const uniqueValidationFailures: Set<string> = new Set<string>([]);\n const filteredQuotes = quotes\n .filter((quoteResponse: unknown): quoteResponse is QuoteResponseV1 => {\n try {\n return validateQuoteResponseV1(quoteResponse);\n } catch (error) {\n if (error instanceof StructError) {\n error.failures().forEach(({ branch, path }) => {\n const aggregatorId =\n branch?.[0]?.quote?.bridgeId ??\n branch?.[0]?.quote?.bridges?.[0] ??\n (quoteResponse as QuoteResponseV1)?.quote?.bridgeId ??\n (quoteResponse as QuoteResponseV1)?.quote?.bridges?.[0] ??\n 'unknown';\n const pathString = path?.join('.') || 'unknown';\n uniqueValidationFailures.add([aggregatorId, pathString].join('|'));\n });\n }\n return false;\n }\n })\n .map((quote) => ({\n ...quote,\n featureId: featureId ?? undefined,\n // Append the reset approval data to the quote response if the request\n // has resetApproval set to true and the quote has an approval\n resetApproval:\n request.resetApproval && quote.approval && isEvmTxData(quote.approval)\n ? {\n ...quote.approval,\n data: getEthUsdtResetData(request.destChainId),\n }\n : undefined,\n }));\n\n const validationFailures = Array.from(uniqueValidationFailures);\n if (uniqueValidationFailures.size > 0) {\n console.warn('Quote validation failed', validationFailures);\n }\n\n return {\n quotes: filteredQuotes,\n validationFailures,\n };\n}\n\nconst fetchAssetPricesForCurrency = async (request: {\n currency: string;\n assetIds: Set<CaipAssetType>;\n clientId: string;\n clientVersion?: string;\n fetchFn: FetchFunction;\n signal?: AbortSignal;\n}): Promise<Record<CaipAssetType, { [currency: string]: string }>> => {\n const { currency, assetIds, clientId, clientVersion, fetchFn, signal } =\n request;\n const validAssetIds = Array.from(assetIds).filter(Boolean);\n if (validAssetIds.length === 0) {\n return {};\n }\n\n const queryParams = new URLSearchParams({\n assetIds: validAssetIds.filter(Boolean).join(','),\n vsCurrency: currency,\n });\n const url = `https://price.api.cx.metamask.io/v3/spot-prices?${queryParams}`;\n const priceApiResponse = (await fetchFn(url, {\n headers: getClientHeaders({ clientId, clientVersion }),\n signal,\n })) as unknown as Record<CaipAssetType, { [currency: string]: number }>;\n if (!priceApiResponse || typeof priceApiResponse !== 'object') {\n return {};\n }\n\n return Object.entries(priceApiResponse).reduce<\n Record<CaipAssetType, { [currency: string]: string }>\n >((acc, [assetId, currencyToPrice]) => {\n if (!currencyToPrice) {\n return acc;\n }\n if (!acc[assetId as CaipAssetType]) {\n acc[assetId as CaipAssetType] = {};\n }\n if (currencyToPrice[currency]) {\n acc[assetId as CaipAssetType][currency] =\n currencyToPrice[currency].toString();\n }\n return acc;\n }, {});\n};\n\n/**\n * Fetches the asset prices from the price API for multiple currencies\n *\n * @param request - The request object\n * @returns The asset prices by assetId\n */\nexport const fetchAssetPrices = async (\n request: {\n currencies: Set<string>;\n } & Omit<Parameters<typeof fetchAssetPricesForCurrency>[0], 'currency'>,\n): Promise<\n Record<CaipAssetType, { [currency: string]: string } | undefined>\n> => {\n const { currencies, ...args } = request;\n\n const combinedPrices = await Promise.allSettled(\n Array.from(currencies).map(\n async (currency) =>\n await fetchAssetPricesForCurrency({ ...args, currency }),\n ),\n ).then((priceApiResponse) => {\n return priceApiResponse.reduce<\n Record<CaipAssetType, { [currency: string]: string }>\n >((acc, result) => {\n if (result.status === 'fulfilled') {\n Object.entries(result.value).forEach(([assetId, currencyToPrice]) => {\n const existingPrices = acc[assetId as CaipAssetType];\n if (!existingPrices) {\n acc[assetId as CaipAssetType] = {};\n }\n Object.entries(currencyToPrice).forEach(([currency, price]) => {\n acc[assetId as CaipAssetType][currency] = price;\n });\n });\n }\n return acc;\n }, {});\n });\n\n return combinedPrices;\n};\n\nconst getQuoteRequestId = ({\n srcChainId,\n destChainId,\n srcTokenAddress,\n destTokenAddress,\n}: QuoteRequest): string =>\n `${formatAddressToAssetId(srcTokenAddress, srcChainId)}-${formatAddressToAssetId(destTokenAddress, destChainId)}`;\n\nconst getQuoteResponseId = ({\n srcAsset: { address: srcTokenAddress, chainId: srcChainId },\n destAsset: { address: destTokenAddress, chainId: destChainId },\n}: QuoteResponseV1['quote']): string =>\n `${formatAddressToAssetId(srcTokenAddress, srcChainId)}-${formatAddressToAssetId(destTokenAddress, destChainId)}`;\n\n/**\n * Fetches quotes from the bridge-api\n *\n * @param fetchFn - The fetch function to use\n * @param quoteRequests - An array of GenericQuoteRequest objects\n * @param signal - The abort signal\n * @param featureId - The {@link FeatureId} for the experience that's requesting the quotes\n * @param clientId - The client ID for metrics\n * @param jwt - The JWT token for authentication\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @param serverEventHandlers - The server event handlers\n * @param serverEventHandlers.onQuoteValidationFailure - The function to handle quote validation failures\n * @param serverEventHandlers.onValidQuoteReceived - The function to handle valid quotes\n * @param serverEventHandlers.onTokenWarning - The function to handle token warning events\n * @param serverEventHandlers.onComplete - The function to handle the complete event emitted when the stream finishes\n * @param serverEventHandlers.onClose - The function to run when the stream is closed and there are no thrown errors\n * @param clientVersion - The client version for metrics (optional)\n * @returns A list of bridge tx quote promises\n */\nexport async function fetchBridgeQuoteStream(\n fetchFn: FetchFunction,\n quoteRequests: GenericQuoteRequest[],\n signal: AbortSignal | undefined,\n featureId: FeatureId,\n clientId: string,\n jwt: string | undefined,\n bridgeApiBaseUrl: string,\n serverEventHandlers: {\n onClose: () => void | Promise<void>;\n onQuoteValidationFailure: (validationFailures: string[]) => void;\n onValidQuoteReceived: (quotes: QuoteResponseV1) => Promise<void>;\n onTokenWarning: (warning: TokenFeature) => void;\n onComplete: (data: QuoteStreamCompleteData) => void;\n },\n clientVersion?: string,\n): Promise<void> {\n /**\n * If the request includes multiple quote requests, it is a batch sell request.\n * A batch sell consists of multiple swaps that are executed in a single tx submission.\n */\n const isBatchSellRequest = quoteRequests.length > 1;\n const normalizedQuoteRequests = quoteRequests.map(formatQuoteRequest);\n const quoteRequestIds = isBatchSellRequest\n ? normalizedQuoteRequests.map(getQuoteRequestId)\n : undefined;\n\n const onQuoteReceived = async (quoteResponse: unknown): Promise<void> => {\n const uniqueValidationFailures: Set<string> = new Set<string>([]);\n\n try {\n if (validateQuoteResponseV1(quoteResponse)) {\n // Fallback to 0 if the quote doesn't match any requests\n const matchedQuoteRequestIdx = Math.max(\n quoteRequestIds?.findIndex((id) => {\n return id === getQuoteResponseId(quoteResponse.quote);\n }) ?? 0,\n 0,\n );\n const matchingQuoteRequest =\n normalizedQuoteRequests[matchedQuoteRequestIdx];\n\n return await serverEventHandlers.onValidQuoteReceived({\n ...quoteResponse,\n featureId,\n // Append the reset approval data to the quote response if the request has resetApproval set to true and the quote has an approval\n resetApproval:\n matchingQuoteRequest.resetApproval &&\n quoteResponse.approval &&\n isEvmTxData(quoteResponse.approval)\n ? {\n ...quoteResponse.approval,\n data: getEthUsdtResetData(matchingQuoteRequest.destChainId),\n }\n : undefined,\n ...(isBatchSellRequest && {\n quoteRequestIndex: matchedQuoteRequestIdx,\n }),\n });\n }\n } catch (error) {\n if (error instanceof StructError) {\n console.warn('Quote validation failed', formatStructErrors(error));\n error.failures().forEach(({ branch, path }) => {\n const aggregatorId =\n branch?.[0]?.quote?.bridgeId ??\n branch?.[0]?.quote?.bridges?.[0] ??\n (quoteResponse as QuoteResponseV1)?.quote?.bridgeId ??\n ((quoteResponse as QuoteResponseV1)?.quote?.bridges?.[0] ||\n ('unknown' as string));\n const pathString = path?.join('.') || 'unknown';\n uniqueValidationFailures.add([aggregatorId, pathString].join('|'));\n });\n }\n const validationFailures = Array.from(uniqueValidationFailures);\n if (uniqueValidationFailures.size > 0) {\n return serverEventHandlers.onQuoteValidationFailure(validationFailures);\n }\n // Rethrow any unexpected errors\n throw error;\n }\n return undefined;\n };\n\n const onTokenWarningReceived = (data: unknown): void => {\n try {\n if (validateTokenFeature(data)) {\n serverEventHandlers.onTokenWarning(data);\n }\n } catch (error) {\n console.warn('Token warning validation failed', error);\n }\n };\n\n const onCompleteReceived = (data: unknown): void => {\n try {\n if (validateQuoteStreamComplete(data)) {\n serverEventHandlers.onComplete(data);\n }\n } catch (error) {\n console.warn('Quote stream complete validation failed', error);\n }\n };\n\n const onMessage = async (\n data: Record<string, unknown>,\n eventName?: string,\n ): Promise<void> => {\n switch (eventName) {\n case 'quote':\n return await onQuoteReceived(data);\n case 'token_warning':\n return onTokenWarningReceived(data);\n case 'complete':\n return onCompleteReceived(data);\n default:\n return undefined;\n }\n };\n\n const sharedFetchOptions = {\n signal,\n onMessage,\n onError: (error: unknown) => {\n // Rethrow error to prevent silent fetch failures\n throw error;\n },\n onClose: async () => {\n await serverEventHandlers.onClose();\n },\n fetchFn,\n };\n\n if (isBatchSellRequest) {\n const urlStream = `${bridgeApiBaseUrl}/getBatchQuoteStream`;\n await fetchServerEvents(urlStream, {\n method: 'POST',\n body: JSON.stringify({ requests: normalizedQuoteRequests }),\n headers: {\n ...getClientHeaders({ clientId, clientVersion, jwt }),\n 'Content-Type': 'application/json',\n },\n ...sharedFetchOptions,\n });\n return;\n }\n\n const queryParams = formatQueryParams(normalizedQuoteRequests[0]);\n const urlStream = `${bridgeApiBaseUrl}/getQuoteStream?${queryParams}`;\n await fetchServerEvents(urlStream, {\n headers: {\n ...getClientHeaders({ clientId, clientVersion, jwt }),\n 'Content-Type': 'text/event-stream',\n },\n ...sharedFetchOptions,\n });\n}\n\nexport const formatBatchSellTradesRequest = (\n quotes: (QuoteResponseV1 | null)[],\n stxEnabled: boolean,\n): BatchSellTradesRequest => ({\n quotes: quotes\n .filter((quote): quote is QuoteResponseV1 => quote !== null)\n .map(\n ({\n trade,\n approval,\n quote,\n estimatedProcessingTimeInSeconds,\n quoteId,\n }) => ({\n trade,\n approval,\n quote,\n estimatedProcessingTimeInSeconds,\n quoteId,\n }),\n ),\n stxEnabled,\n});\n\n/**\n * Fetches quotes from the bridge-api's getQuote endpoint\n *\n * @param quotes - The quotes to fetch the gasless transaction data and fees for. May contain null values if a quote is not available for a swap\n * @param stxEnabled - Flag to estimate gas cost more precisely for the batch sell feature.\n * @param signal - The abort signal\n * @param clientId - The client ID for metrics\n * @param jwt - The JWT token for authentication\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @param clientVersion - The client version for metrics (optional)\n * @returns The batch sell trades and the total network fee\n */\nexport async function fetchBatchSellTrades(\n quotes: (QuoteResponseV1 | null)[],\n stxEnabled: boolean,\n signal: AbortSignal | null,\n clientId: string,\n jwt: string | undefined,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n clientVersion?: string,\n): Promise<BatchSellTradesResponse> {\n const url = `${bridgeApiBaseUrl}/obtainGaslessBatch`;\n const request: BatchSellTradesRequest = formatBatchSellTradesRequest(\n quotes,\n stxEnabled,\n );\n const batchSellTradesResponse = await fetchFn(url, {\n headers: {\n ...getClientHeaders({\n clientId,\n clientVersion,\n jwt,\n }),\n 'Content-Type': 'application/json',\n },\n signal,\n method: 'POST',\n body: JSON.stringify(request),\n });\n\n if (!batchSellTradesResponse.ok) {\n throw new Error(\n `Failed to fetch batch sell trades. ${batchSellTradesResponse.statusText}`,\n );\n }\n\n try {\n const data = await batchSellTradesResponse.json();\n validateBatchSellTradesResponse(data);\n return data;\n } catch (error: unknown) {\n // TODO validation failure event\n throw new Error(`Invalid batch simulation response. ${error?.toString()}`);\n }\n}\n"]}
|
package/dist/utils/fetch.d.cts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import type { CaipAssetType, CaipChainId, Hex } from "@metamask/utils";
|
|
2
|
-
import type { FetchFunction, GenericQuoteRequest, TokenFeature, QuoteStreamCompleteData, BatchSellTradesRequest, BatchSellTradesResponse } from "../types.cjs";
|
|
3
|
-
import type { BridgeAsset } from "../validators/bridge-asset.cjs";
|
|
2
|
+
import type { FetchFunction, GenericQuoteRequest, BridgeAsset, TokenFeature, QuoteStreamCompleteData, BatchSellTradesRequest, BatchSellTradesResponse } from "../types.cjs";
|
|
4
3
|
import type { FeatureId } from "../validators/feature-flags.cjs";
|
|
5
|
-
import type { QuoteResponse } from "../validators/quote-response.cjs";
|
|
6
4
|
import type { QuoteResponseV1 } from "../validators/quote-response-v1.cjs";
|
|
7
|
-
import type { TxData } from "../validators/trade.cjs";
|
|
8
|
-
import type { QuoteMetadata } from "./quote-metadata/types.cjs";
|
|
9
5
|
export declare const getClientHeaders: ({ clientId, clientVersion, jwt, }: {
|
|
10
6
|
clientId: string;
|
|
11
7
|
clientVersion?: string | undefined;
|
|
@@ -89,13 +85,11 @@ export declare const fetchAssetPrices: (request: {
|
|
|
89
85
|
export declare function fetchBridgeQuoteStream(fetchFn: FetchFunction, quoteRequests: GenericQuoteRequest[], signal: AbortSignal | undefined, featureId: FeatureId, clientId: string, jwt: string | undefined, bridgeApiBaseUrl: string, serverEventHandlers: {
|
|
90
86
|
onClose: () => void | Promise<void>;
|
|
91
87
|
onQuoteValidationFailure: (validationFailures: string[]) => void;
|
|
92
|
-
onValidQuoteReceived: (quotes:
|
|
93
|
-
resetApproval?: TxData;
|
|
94
|
-
}) => Promise<void>;
|
|
88
|
+
onValidQuoteReceived: (quotes: QuoteResponseV1) => Promise<void>;
|
|
95
89
|
onTokenWarning: (warning: TokenFeature) => void;
|
|
96
90
|
onComplete: (data: QuoteStreamCompleteData) => void;
|
|
97
91
|
}, clientVersion?: string): Promise<void>;
|
|
98
|
-
export declare const formatBatchSellTradesRequest: (quotes: (
|
|
92
|
+
export declare const formatBatchSellTradesRequest: (quotes: (QuoteResponseV1 | null)[], stxEnabled: boolean) => BatchSellTradesRequest;
|
|
99
93
|
/**
|
|
100
94
|
* Fetches quotes from the bridge-api's getQuote endpoint
|
|
101
95
|
*
|
|
@@ -109,6 +103,6 @@ export declare const formatBatchSellTradesRequest: (quotes: (QuoteResponse | (Qu
|
|
|
109
103
|
* @param clientVersion - The client version for metrics (optional)
|
|
110
104
|
* @returns The batch sell trades and the total network fee
|
|
111
105
|
*/
|
|
112
|
-
export declare function fetchBatchSellTrades(quotes: (
|
|
106
|
+
export declare function fetchBatchSellTrades(quotes: (QuoteResponseV1 | null)[], stxEnabled: boolean, signal: AbortSignal | null, clientId: string, jwt: string | undefined, fetchFn: FetchFunction, bridgeApiBaseUrl: string, clientVersion?: string): Promise<BatchSellTradesResponse>;
|
|
113
107
|
export {};
|
|
114
108
|
//# sourceMappingURL=fetch.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.cts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetch.d.cts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/fetch.d.mts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import type { CaipAssetType, CaipChainId, Hex } from "@metamask/utils";
|
|
2
|
-
import type { FetchFunction, GenericQuoteRequest, TokenFeature, QuoteStreamCompleteData, BatchSellTradesRequest, BatchSellTradesResponse } from "../types.mjs";
|
|
3
|
-
import type { BridgeAsset } from "../validators/bridge-asset.mjs";
|
|
2
|
+
import type { FetchFunction, GenericQuoteRequest, BridgeAsset, TokenFeature, QuoteStreamCompleteData, BatchSellTradesRequest, BatchSellTradesResponse } from "../types.mjs";
|
|
4
3
|
import type { FeatureId } from "../validators/feature-flags.mjs";
|
|
5
|
-
import type { QuoteResponse } from "../validators/quote-response.mjs";
|
|
6
4
|
import type { QuoteResponseV1 } from "../validators/quote-response-v1.mjs";
|
|
7
|
-
import type { TxData } from "../validators/trade.mjs";
|
|
8
|
-
import type { QuoteMetadata } from "./quote-metadata/types.mjs";
|
|
9
5
|
export declare const getClientHeaders: ({ clientId, clientVersion, jwt, }: {
|
|
10
6
|
clientId: string;
|
|
11
7
|
clientVersion?: string | undefined;
|
|
@@ -89,13 +85,11 @@ export declare const fetchAssetPrices: (request: {
|
|
|
89
85
|
export declare function fetchBridgeQuoteStream(fetchFn: FetchFunction, quoteRequests: GenericQuoteRequest[], signal: AbortSignal | undefined, featureId: FeatureId, clientId: string, jwt: string | undefined, bridgeApiBaseUrl: string, serverEventHandlers: {
|
|
90
86
|
onClose: () => void | Promise<void>;
|
|
91
87
|
onQuoteValidationFailure: (validationFailures: string[]) => void;
|
|
92
|
-
onValidQuoteReceived: (quotes:
|
|
93
|
-
resetApproval?: TxData;
|
|
94
|
-
}) => Promise<void>;
|
|
88
|
+
onValidQuoteReceived: (quotes: QuoteResponseV1) => Promise<void>;
|
|
95
89
|
onTokenWarning: (warning: TokenFeature) => void;
|
|
96
90
|
onComplete: (data: QuoteStreamCompleteData) => void;
|
|
97
91
|
}, clientVersion?: string): Promise<void>;
|
|
98
|
-
export declare const formatBatchSellTradesRequest: (quotes: (
|
|
92
|
+
export declare const formatBatchSellTradesRequest: (quotes: (QuoteResponseV1 | null)[], stxEnabled: boolean) => BatchSellTradesRequest;
|
|
99
93
|
/**
|
|
100
94
|
* Fetches quotes from the bridge-api's getQuote endpoint
|
|
101
95
|
*
|
|
@@ -109,6 +103,6 @@ export declare const formatBatchSellTradesRequest: (quotes: (QuoteResponse | (Qu
|
|
|
109
103
|
* @param clientVersion - The client version for metrics (optional)
|
|
110
104
|
* @returns The batch sell trades and the total network fee
|
|
111
105
|
*/
|
|
112
|
-
export declare function fetchBatchSellTrades(quotes: (
|
|
106
|
+
export declare function fetchBatchSellTrades(quotes: (QuoteResponseV1 | null)[], stxEnabled: boolean, signal: AbortSignal | null, clientId: string, jwt: string | undefined, fetchFn: FetchFunction, bridgeApiBaseUrl: string, clientVersion?: string): Promise<BatchSellTradesResponse>;
|
|
113
107
|
export {};
|
|
114
108
|
//# sourceMappingURL=fetch.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.mts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetch.d.mts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/fetch.mjs
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
|
2
2
|
import { StructError } from "@metamask/superstruct";
|
|
3
|
-
import { KnownCaipNamespace } from "@metamask/utils";
|
|
4
|
-
import { toQuoteResponseV2 } from "../coercers/quote-response-v1-to-v2.mjs";
|
|
5
|
-
import { toQuoteResponseV1 } from "../coercers/quote-response-v2-to-v1.mjs";
|
|
6
3
|
import { validateBatchSellTradesResponse } from "../validators/batch-sell.mjs";
|
|
7
4
|
import { validateBridgeAsset } from "../validators/bridge-asset.mjs";
|
|
8
5
|
import { validateQuoteResponseV1 } from "../validators/quote-response-v1.mjs";
|
|
@@ -217,8 +214,8 @@ export const fetchAssetPrices = async (request) => {
|
|
|
217
214
|
});
|
|
218
215
|
return combinedPrices;
|
|
219
216
|
};
|
|
220
|
-
const getQuoteRequestId = ({ srcChainId, destChainId, srcTokenAddress, destTokenAddress, }) => `${formatAddressToAssetId(srcTokenAddress, srcChainId)}-${formatAddressToAssetId(destTokenAddress, destChainId)}
|
|
221
|
-
const getQuoteResponseId = ({
|
|
217
|
+
const getQuoteRequestId = ({ srcChainId, destChainId, srcTokenAddress, destTokenAddress, }) => `${formatAddressToAssetId(srcTokenAddress, srcChainId)}-${formatAddressToAssetId(destTokenAddress, destChainId)}`;
|
|
218
|
+
const getQuoteResponseId = ({ srcAsset: { address: srcTokenAddress, chainId: srcChainId }, destAsset: { address: destTokenAddress, chainId: destChainId }, }) => `${formatAddressToAssetId(srcTokenAddress, srcChainId)}-${formatAddressToAssetId(destTokenAddress, destChainId)}`;
|
|
222
219
|
/**
|
|
223
220
|
* Fetches quotes from the bridge-api
|
|
224
221
|
*
|
|
@@ -248,43 +245,42 @@ export async function fetchBridgeQuoteStream(fetchFn, quoteRequests, signal, fea
|
|
|
248
245
|
const quoteRequestIds = isBatchSellRequest
|
|
249
246
|
? normalizedQuoteRequests.map(getQuoteRequestId)
|
|
250
247
|
: undefined;
|
|
251
|
-
const onQuoteReceived = async (
|
|
248
|
+
const onQuoteReceived = async (quoteResponse) => {
|
|
252
249
|
const uniqueValidationFailures = new Set([]);
|
|
253
250
|
try {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
251
|
+
if (validateQuoteResponseV1(quoteResponse)) {
|
|
252
|
+
// Fallback to 0 if the quote doesn't match any requests
|
|
253
|
+
const matchedQuoteRequestIdx = Math.max(quoteRequestIds?.findIndex((id) => {
|
|
254
|
+
return id === getQuoteResponseId(quoteResponse.quote);
|
|
255
|
+
}) ?? 0, 0);
|
|
256
|
+
const matchingQuoteRequest = normalizedQuoteRequests[matchedQuoteRequestIdx];
|
|
257
|
+
return await serverEventHandlers.onValidQuoteReceived({
|
|
258
|
+
...quoteResponse,
|
|
259
|
+
featureId,
|
|
260
|
+
// Append the reset approval data to the quote response if the request has resetApproval set to true and the quote has an approval
|
|
261
|
+
resetApproval: matchingQuoteRequest.resetApproval &&
|
|
262
|
+
quoteResponse.approval &&
|
|
263
|
+
isEvmTxData(quoteResponse.approval)
|
|
264
|
+
? {
|
|
265
|
+
...quoteResponse.approval,
|
|
266
|
+
data: getEthUsdtResetData(matchingQuoteRequest.destChainId),
|
|
267
|
+
}
|
|
268
|
+
: undefined,
|
|
269
|
+
...(isBatchSellRequest && {
|
|
270
|
+
quoteRequestIndex: matchedQuoteRequestIdx,
|
|
271
|
+
}),
|
|
272
|
+
});
|
|
273
|
+
}
|
|
276
274
|
}
|
|
277
275
|
catch (error) {
|
|
278
276
|
if (error instanceof StructError) {
|
|
279
277
|
console.warn('Quote validation failed', formatStructErrors(error));
|
|
280
278
|
error.failures().forEach(({ branch, path }) => {
|
|
281
|
-
const aggregatorId = branch?.[0]?.quote?.
|
|
282
|
-
branch?.[0]?.quote?.
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
quoteResponseV1OrV2?.quote?.aggregator ??
|
|
287
|
-
'unknown';
|
|
279
|
+
const aggregatorId = branch?.[0]?.quote?.bridgeId ??
|
|
280
|
+
branch?.[0]?.quote?.bridges?.[0] ??
|
|
281
|
+
quoteResponse?.quote?.bridgeId ??
|
|
282
|
+
(quoteResponse?.quote?.bridges?.[0] ||
|
|
283
|
+
'unknown');
|
|
288
284
|
const pathString = path?.join('.') || 'unknown';
|
|
289
285
|
uniqueValidationFailures.add([aggregatorId, pathString].join('|'));
|
|
290
286
|
});
|
|
@@ -296,6 +292,7 @@ export async function fetchBridgeQuoteStream(fetchFn, quoteRequests, signal, fea
|
|
|
296
292
|
// Rethrow any unexpected errors
|
|
297
293
|
throw error;
|
|
298
294
|
}
|
|
295
|
+
return undefined;
|
|
299
296
|
};
|
|
300
297
|
const onTokenWarningReceived = (data) => {
|
|
301
298
|
try {
|
|
@@ -366,8 +363,14 @@ export async function fetchBridgeQuoteStream(fetchFn, quoteRequests, signal, fea
|
|
|
366
363
|
}
|
|
367
364
|
export const formatBatchSellTradesRequest = (quotes, stxEnabled) => ({
|
|
368
365
|
quotes: quotes
|
|
369
|
-
.filter((quote) => quote !== null
|
|
370
|
-
.map(
|
|
366
|
+
.filter((quote) => quote !== null)
|
|
367
|
+
.map(({ trade, approval, quote, estimatedProcessingTimeInSeconds, quoteId, }) => ({
|
|
368
|
+
trade,
|
|
369
|
+
approval,
|
|
370
|
+
quote,
|
|
371
|
+
estimatedProcessingTimeInSeconds,
|
|
372
|
+
quoteId,
|
|
373
|
+
})),
|
|
371
374
|
stxEnabled,
|
|
372
375
|
});
|
|
373
376
|
/**
|