@metamask-previews/bridge-controller 77.6.0-preview-8abc30aca → 77.6.0-preview-41e84b094
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/dist/bridge-controller.cjs +8 -3
- package/dist/bridge-controller.cjs.map +1 -1
- package/dist/bridge-controller.d.cts +2 -1
- package/dist/bridge-controller.d.cts.map +1 -1
- package/dist/bridge-controller.d.mts +2 -1
- package/dist/bridge-controller.d.mts.map +1 -1
- package/dist/bridge-controller.mjs +8 -3
- package/dist/bridge-controller.mjs.map +1 -1
- package/dist/coercers/quote-response-v1-to-v2.cjs +136 -0
- package/dist/coercers/quote-response-v1-to-v2.cjs.map +1 -0
- package/dist/coercers/quote-response-v1-to-v2.d.cts +13 -0
- package/dist/coercers/quote-response-v1-to-v2.d.cts.map +1 -0
- package/dist/coercers/quote-response-v1-to-v2.d.mts +13 -0
- package/dist/coercers/quote-response-v1-to-v2.d.mts.map +1 -0
- package/dist/coercers/quote-response-v1-to-v2.mjs +131 -0
- package/dist/coercers/quote-response-v1-to-v2.mjs.map +1 -0
- package/dist/coercers/quote-response-v2-to-v1.cjs +162 -0
- package/dist/coercers/quote-response-v2-to-v1.cjs.map +1 -0
- package/dist/coercers/quote-response-v2-to-v1.d.cts +13 -0
- package/dist/coercers/quote-response-v2-to-v1.d.cts.map +1 -0
- package/dist/coercers/quote-response-v2-to-v1.d.mts +13 -0
- package/dist/coercers/quote-response-v2-to-v1.d.mts.map +1 -0
- package/dist/coercers/quote-response-v2-to-v1.mjs +158 -0
- package/dist/coercers/quote-response-v2-to-v1.mjs.map +1 -0
- package/dist/index.cjs +19 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +12 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +7 -1
- package/dist/index.mjs.map +1 -1
- package/dist/selectors.cjs +26 -24
- package/dist/selectors.cjs.map +1 -1
- package/dist/selectors.d.cts +3103 -31319
- package/dist/selectors.d.cts.map +1 -1
- package/dist/selectors.d.mts +3103 -31319
- package/dist/selectors.d.mts.map +1 -1
- package/dist/selectors.mjs +26 -24
- package/dist/selectors.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +2 -7
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +2 -7
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/bridge.cjs.map +1 -1
- package/dist/utils/bridge.d.cts +4 -3
- package/dist/utils/bridge.d.cts.map +1 -1
- package/dist/utils/bridge.d.mts +4 -3
- package/dist/utils/bridge.d.mts.map +1 -1
- package/dist/utils/bridge.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 +37 -40
- package/dist/utils/fetch.cjs.map +1 -1
- package/dist/utils/fetch.d.cts +10 -4
- package/dist/utils/fetch.d.cts.map +1 -1
- package/dist/utils/fetch.d.mts +10 -4
- package/dist/utils/fetch.d.mts.map +1 -1
- package/dist/utils/fetch.mjs +37 -40
- 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 +8 -5
- package/dist/utils/metrics/properties.d.cts.map +1 -1
- package/dist/utils/metrics/properties.d.mts +8 -5
- 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/number-formatters.cjs +73 -1
- package/dist/utils/number-formatters.cjs.map +1 -1
- package/dist/utils/number-formatters.d.cts +49 -0
- package/dist/utils/number-formatters.d.cts.map +1 -1
- package/dist/utils/number-formatters.d.mts +49 -0
- package/dist/utils/number-formatters.d.mts.map +1 -1
- package/dist/utils/number-formatters.mjs +70 -0
- package/dist/utils/number-formatters.mjs.map +1 -1
- package/dist/utils/quote-fees.cjs +23 -21
- package/dist/utils/quote-fees.cjs.map +1 -1
- package/dist/utils/quote-fees.d.cts +4 -2
- package/dist/utils/quote-fees.d.cts.map +1 -1
- package/dist/utils/quote-fees.d.mts +4 -2
- package/dist/utils/quote-fees.d.mts.map +1 -1
- package/dist/utils/quote-fees.mjs +24 -22
- package/dist/utils/quote-fees.mjs.map +1 -1
- package/dist/utils/quote-metadata/calculators.cjs +33 -35
- package/dist/utils/quote-metadata/calculators.cjs.map +1 -1
- package/dist/utils/quote-metadata/calculators.d.cts +20 -14
- package/dist/utils/quote-metadata/calculators.d.cts.map +1 -1
- package/dist/utils/quote-metadata/calculators.d.mts +20 -14
- package/dist/utils/quote-metadata/calculators.d.mts.map +1 -1
- package/dist/utils/quote-metadata/calculators.mjs +34 -36
- package/dist/utils/quote-metadata/calculators.mjs.map +1 -1
- package/dist/utils/quote-metadata/merge.cjs +30 -2
- package/dist/utils/quote-metadata/merge.cjs.map +1 -1
- package/dist/utils/quote-metadata/merge.d.cts +3 -2
- package/dist/utils/quote-metadata/merge.d.cts.map +1 -1
- package/dist/utils/quote-metadata/merge.d.mts +3 -2
- package/dist/utils/quote-metadata/merge.d.mts.map +1 -1
- package/dist/utils/quote-metadata/merge.mjs +30 -2
- package/dist/utils/quote-metadata/merge.mjs.map +1 -1
- package/dist/utils/quote-metadata/to-normalized-amounts.cjs +38 -0
- package/dist/utils/quote-metadata/to-normalized-amounts.cjs.map +1 -0
- package/dist/utils/quote-metadata/to-normalized-amounts.d.cts +10 -0
- package/dist/utils/quote-metadata/to-normalized-amounts.d.cts.map +1 -0
- package/dist/utils/quote-metadata/to-normalized-amounts.d.mts +10 -0
- package/dist/utils/quote-metadata/to-normalized-amounts.d.mts.map +1 -0
- package/dist/utils/quote-metadata/to-normalized-amounts.mjs +34 -0
- package/dist/utils/quote-metadata/to-normalized-amounts.mjs.map +1 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v1.cjs +42 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v1.cjs.map +1 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v1.d.cts +13 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v1.d.cts.map +1 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v1.d.mts +13 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v1.d.mts.map +1 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v1.mjs +39 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v1.mjs.map +1 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v2.cjs +94 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v2.cjs.map +1 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v2.d.cts +12 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v2.d.cts.map +1 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v2.d.mts +12 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v2.d.mts.map +1 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v2.mjs +90 -0
- package/dist/utils/quote-metadata/to-quote-metadata-v2.mjs.map +1 -0
- package/dist/utils/slippage.d.cts +1 -1
- package/dist/utils/slippage.d.mts +1 -1
- package/dist/validators/amount-and-asset.cjs +16 -0
- package/dist/validators/amount-and-asset.cjs.map +1 -0
- package/dist/validators/amount-and-asset.d.cts +62 -0
- package/dist/validators/amount-and-asset.d.cts.map +1 -0
- package/dist/validators/amount-and-asset.d.mts +62 -0
- package/dist/validators/amount-and-asset.d.mts.map +1 -0
- package/dist/validators/amount-and-asset.mjs +13 -0
- package/dist/validators/amount-and-asset.mjs.map +1 -0
- package/dist/validators/batch-sell.d.cts +8 -8
- package/dist/validators/batch-sell.d.mts +8 -8
- package/dist/validators/bridge-asset.cjs +64 -1
- package/dist/validators/bridge-asset.cjs.map +1 -1
- package/dist/validators/bridge-asset.d.cts +99 -5
- package/dist/validators/bridge-asset.d.cts.map +1 -1
- package/dist/validators/bridge-asset.d.mts +99 -5
- package/dist/validators/bridge-asset.d.mts.map +1 -1
- package/dist/validators/bridge-asset.mjs +63 -1
- 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-response.cjs +116 -0
- package/dist/validators/quote-response.cjs.map +1 -0
- package/dist/validators/quote-response.d.cts +1979 -0
- package/dist/validators/quote-response.d.cts.map +1 -0
- package/dist/validators/quote-response.d.mts +1979 -0
- package/dist/validators/quote-response.d.mts.map +1 -0
- package/dist/validators/quote-response.mjs +112 -0
- package/dist/validators/quote-response.mjs.map +1 -0
- package/dist/validators/quote.cjs +73 -3
- package/dist/validators/quote.cjs.map +1 -1
- package/dist/validators/quote.d.cts +407 -45
- package/dist/validators/quote.d.cts.map +1 -1
- package/dist/validators/quote.d.mts +407 -45
- package/dist/validators/quote.d.mts.map +1 -1
- package/dist/validators/quote.mjs +74 -4
- package/dist/validators/quote.mjs.map +1 -1
- package/dist/validators/step.cjs +7 -1
- package/dist/validators/step.cjs.map +1 -1
- package/dist/validators/step.d.cts +197 -26
- package/dist/validators/step.d.cts.map +1 -1
- package/dist/validators/step.d.mts +197 -26
- package/dist/validators/step.d.mts.map +1 -1
- package/dist/validators/step.mjs +7 -1
- 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
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { create, coerce, is, intersection } from "@metamask/superstruct";
|
|
2
|
+
import { parseCaipAssetType } from "@metamask/utils";
|
|
3
|
+
import { BigNumber } from "bignumber.js";
|
|
4
|
+
import { formatAddressToAssetId } from "../utils/caip-formatters.mjs";
|
|
5
|
+
import { BridgeAssetSchema, BridgeAssetV2Schema, MinimalAssetSchema } from "../validators/bridge-asset.mjs";
|
|
6
|
+
import { QuoteSchemaV2, FeeType, QuoteSchema } from "../validators/quote.mjs";
|
|
7
|
+
import { QuoteResponseSchemaV2, validateQuoteResponse } from "../validators/quote-response.mjs";
|
|
8
|
+
import { QuoteResponseSchemaV1 } from "../validators/quote-response-v1.mjs";
|
|
9
|
+
import { StepSchemaV2, StepSchema } from "../validators/step.mjs";
|
|
10
|
+
const BridgeAssetV2FromV1 = coerce(BridgeAssetV2Schema, intersection([BridgeAssetSchema, MinimalAssetSchema]), (value) => {
|
|
11
|
+
const { chainId, address,
|
|
12
|
+
// @ts-expect-error - chainAgnosticId is not in the schema
|
|
13
|
+
chainAgnosticId,
|
|
14
|
+
// @ts-expect-error - logoURI is not in the schema
|
|
15
|
+
logoURI, iconUrl, icon, assetId, ...rest } = value;
|
|
16
|
+
const resolvedIconUrl = iconUrl ?? logoURI ?? icon;
|
|
17
|
+
return {
|
|
18
|
+
assetId: assetId ?? formatAddressToAssetId(address, chainId),
|
|
19
|
+
...(resolvedIconUrl && { iconUrl: resolvedIconUrl }),
|
|
20
|
+
...rest,
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
export const toBridgeAssetV2 = (data) => {
|
|
24
|
+
return create(data, BridgeAssetV2FromV1);
|
|
25
|
+
};
|
|
26
|
+
const StepSchemaV2FromV1 = coerce(StepSchemaV2, StepSchema, (value) => {
|
|
27
|
+
const { srcAsset, destAsset, action } = value;
|
|
28
|
+
return {
|
|
29
|
+
action,
|
|
30
|
+
src: {
|
|
31
|
+
asset: toBridgeAssetV2(srcAsset),
|
|
32
|
+
},
|
|
33
|
+
dest: {
|
|
34
|
+
asset: toBridgeAssetV2(destAsset),
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
const toStepV2 = (step) => create(step, StepSchemaV2FromV1);
|
|
39
|
+
const QuoteV2FromV1 = coerce(QuoteSchemaV2, QuoteSchema, (value) => {
|
|
40
|
+
const { srcTokenAmount, destTokenAmount, minDestTokenAmount, srcAsset, destAsset, srcChainId, destChainId, walletAddress, destWalletAddress, priceData, feeData, bridgeId, bridges, steps, intent, ...restQuote } = value;
|
|
41
|
+
return {
|
|
42
|
+
src: {
|
|
43
|
+
amount: new BigNumber(srcTokenAmount)
|
|
44
|
+
.plus(intent ? 0 : feeData[FeeType.METABRIDGE].amount)
|
|
45
|
+
.toFixed(),
|
|
46
|
+
asset: toBridgeAssetV2(srcAsset),
|
|
47
|
+
...(walletAddress && { walletAddress }),
|
|
48
|
+
},
|
|
49
|
+
dest: {
|
|
50
|
+
amount: destTokenAmount,
|
|
51
|
+
asset: toBridgeAssetV2(destAsset),
|
|
52
|
+
...(destWalletAddress && { walletAddress: destWalletAddress }),
|
|
53
|
+
minAmount: minDestTokenAmount,
|
|
54
|
+
},
|
|
55
|
+
priceData: {
|
|
56
|
+
...(value.priceData?.priceImpact && {
|
|
57
|
+
priceImpact: {
|
|
58
|
+
amount: value.priceData?.priceImpact,
|
|
59
|
+
},
|
|
60
|
+
}),
|
|
61
|
+
},
|
|
62
|
+
feeData: {
|
|
63
|
+
[FeeType.METABRIDGE]: [
|
|
64
|
+
{
|
|
65
|
+
...feeData[FeeType.METABRIDGE],
|
|
66
|
+
asset: toBridgeAssetV2(feeData[FeeType.METABRIDGE].asset),
|
|
67
|
+
...(priceData?.totalFeeAmountUsd && {
|
|
68
|
+
usd: priceData?.totalFeeAmountUsd,
|
|
69
|
+
}),
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
...(feeData[FeeType.TX_FEE] && {
|
|
73
|
+
[FeeType.TX_FEE]: [
|
|
74
|
+
{
|
|
75
|
+
...feeData[FeeType.TX_FEE],
|
|
76
|
+
asset: toBridgeAssetV2(feeData[FeeType.TX_FEE].asset),
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
}),
|
|
80
|
+
},
|
|
81
|
+
steps: steps ? steps.map(toStepV2) : undefined,
|
|
82
|
+
...restQuote,
|
|
83
|
+
protocols: bridges,
|
|
84
|
+
aggregator: bridgeId,
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
const toQuoteV2 = (quote) => {
|
|
88
|
+
const quoteV2 = create(quote, QuoteV2FromV1);
|
|
89
|
+
return quoteV2;
|
|
90
|
+
};
|
|
91
|
+
const QuoteResponseV2FromV1 = coerce(QuoteResponseSchemaV2, QuoteResponseSchemaV1, (value) => {
|
|
92
|
+
const { quote, l1GasFeesInHexWei, nonEvmFeesInNative, ...rest } = value;
|
|
93
|
+
const { srcAsset } = quote;
|
|
94
|
+
const { chain: { namespace }, chainId, } = parseCaipAssetType(srcAsset.assetId);
|
|
95
|
+
return {
|
|
96
|
+
...rest,
|
|
97
|
+
...(nonEvmFeesInNative && { nonEvmFeesInNative }),
|
|
98
|
+
...(l1GasFeesInHexWei && { l1GasFeesInHexWei }),
|
|
99
|
+
namespace,
|
|
100
|
+
chainId,
|
|
101
|
+
quote: toQuoteV2(quote),
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
/**
|
|
105
|
+
* Converts a partial quote response to a {@link QuoteResponseV2}.
|
|
106
|
+
* This does not preserve any post-fetch metadata.
|
|
107
|
+
*
|
|
108
|
+
* @param quoteResponse - The {@link QuoteResponseV1} to convert
|
|
109
|
+
* @returns The {@link QuoteResponseV2}
|
|
110
|
+
*/
|
|
111
|
+
export function toQuoteResponseV2(quoteResponse) {
|
|
112
|
+
let quoteResponseV2 = null;
|
|
113
|
+
// V1 quote
|
|
114
|
+
if (quoteResponse && is(quoteResponse, QuoteResponseSchemaV1)) {
|
|
115
|
+
quoteResponseV2 = create(quoteResponse, QuoteResponseV2FromV1);
|
|
116
|
+
if (!quoteResponseV2) {
|
|
117
|
+
throw new Error('QuoteResponseV1 to V2 conversion failed');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// V2 quote
|
|
121
|
+
else if (validateQuoteResponse(quoteResponse)) {
|
|
122
|
+
quoteResponseV2 = quoteResponse;
|
|
123
|
+
}
|
|
124
|
+
if (quoteResponseV2) {
|
|
125
|
+
const { chain: { namespace }, chainId, } = parseCaipAssetType(quoteResponseV2.quote.src.asset.assetId);
|
|
126
|
+
// Add namespace, chainId
|
|
127
|
+
return { ...quoteResponseV2, namespace: namespace, chainId };
|
|
128
|
+
}
|
|
129
|
+
throw new Error('QuoteResponseV1 to V2 conversion failed. Invalid quoteResponse provided');
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=quote-response-v1-to-v2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote-response-v1-to-v2.mjs","sourceRoot":"","sources":["../../src/coercers/quote-response-v1-to-v2.ts"],"names":[],"mappings":"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","sourcesContent":["import { create, coerce, Infer, is, intersection } from '@metamask/superstruct';\nimport { parseCaipAssetType } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { formatAddressToAssetId } from '../utils/caip-formatters';\nimport {\n BridgeAssetSchema,\n BridgeAssetV2Schema,\n MinimalAssetSchema,\n} from '../validators/bridge-asset';\nimport { QuoteSchemaV2, FeeType, QuoteSchema } from '../validators/quote';\nimport {\n QuoteResponse,\n QuoteResponseSchemaV2,\n validateQuoteResponse,\n} from '../validators/quote-response';\nimport {\n QuoteResponseSchemaV1,\n QuoteResponseV1,\n} from '../validators/quote-response-v1';\nimport { StepSchemaV2, StepSchema } from '../validators/step';\n\nconst BridgeAssetV2FromV1 = coerce(\n BridgeAssetV2Schema,\n intersection([BridgeAssetSchema, MinimalAssetSchema]),\n (value) => {\n const {\n chainId,\n address,\n // @ts-expect-error - chainAgnosticId is not in the schema\n chainAgnosticId,\n // @ts-expect-error - logoURI is not in the schema\n logoURI,\n iconUrl,\n icon,\n assetId,\n ...rest\n } = value;\n\n const resolvedIconUrl = iconUrl ?? logoURI ?? icon;\n\n return {\n assetId: assetId ?? formatAddressToAssetId(address, chainId),\n ...(resolvedIconUrl && { iconUrl: resolvedIconUrl }),\n ...rest,\n };\n },\n);\n\nexport const toBridgeAssetV2 = (\n data: unknown,\n): Infer<typeof BridgeAssetV2Schema> => {\n return create(data, BridgeAssetV2FromV1);\n};\n\nconst StepSchemaV2FromV1 = coerce(StepSchemaV2, StepSchema, (value) => {\n const { srcAsset, destAsset, action } = value;\n return {\n action,\n src: {\n asset: toBridgeAssetV2(srcAsset),\n },\n dest: {\n asset: toBridgeAssetV2(destAsset),\n },\n };\n});\nconst toStepV2 = (step: unknown): Infer<typeof StepSchemaV2> =>\n create(step, StepSchemaV2FromV1);\n\nconst QuoteV2FromV1 = coerce(QuoteSchemaV2, QuoteSchema, (value) => {\n const {\n srcTokenAmount,\n destTokenAmount,\n minDestTokenAmount,\n srcAsset,\n destAsset,\n srcChainId,\n destChainId,\n walletAddress,\n destWalletAddress,\n priceData,\n feeData,\n bridgeId,\n bridges,\n steps,\n intent,\n ...restQuote\n } = value;\n\n return {\n src: {\n amount: new BigNumber(srcTokenAmount)\n .plus(intent ? 0 : feeData[FeeType.METABRIDGE].amount)\n .toFixed(),\n asset: toBridgeAssetV2(srcAsset),\n ...(walletAddress && { walletAddress }),\n },\n dest: {\n amount: destTokenAmount,\n asset: toBridgeAssetV2(destAsset),\n ...(destWalletAddress && { walletAddress: destWalletAddress }),\n minAmount: minDestTokenAmount,\n },\n priceData: {\n ...(value.priceData?.priceImpact && {\n priceImpact: {\n amount: value.priceData?.priceImpact,\n },\n }),\n },\n feeData: {\n [FeeType.METABRIDGE]: [\n {\n ...feeData[FeeType.METABRIDGE],\n asset: toBridgeAssetV2(feeData[FeeType.METABRIDGE].asset),\n ...(priceData?.totalFeeAmountUsd && {\n usd: priceData?.totalFeeAmountUsd,\n }),\n },\n ],\n ...(feeData[FeeType.TX_FEE] && {\n [FeeType.TX_FEE]: [\n {\n ...feeData[FeeType.TX_FEE],\n asset: toBridgeAssetV2(feeData[FeeType.TX_FEE].asset),\n },\n ],\n }),\n },\n steps: steps ? steps.map(toStepV2) : undefined,\n ...restQuote,\n protocols: bridges,\n aggregator: bridgeId,\n };\n});\n\nconst toQuoteV2 = (quote: unknown): Infer<typeof QuoteSchemaV2> => {\n const quoteV2 = create(quote, QuoteV2FromV1);\n return quoteV2;\n};\n\nconst QuoteResponseV2FromV1 = coerce(\n QuoteResponseSchemaV2,\n QuoteResponseSchemaV1,\n (value: QuoteResponseV1) => {\n const { quote, l1GasFeesInHexWei, nonEvmFeesInNative, ...rest } = value;\n const { srcAsset } = quote;\n\n const {\n chain: { namespace },\n chainId,\n } = parseCaipAssetType(srcAsset.assetId);\n\n return {\n ...rest,\n ...(nonEvmFeesInNative && { nonEvmFeesInNative }),\n ...(l1GasFeesInHexWei && { l1GasFeesInHexWei }),\n namespace,\n chainId,\n quote: toQuoteV2(quote),\n };\n },\n);\n\n/**\n * Converts a partial quote response to a {@link QuoteResponseV2}.\n * This does not preserve any post-fetch metadata.\n *\n * @param quoteResponse - The {@link QuoteResponseV1} to convert\n * @returns The {@link QuoteResponseV2}\n */\nexport function toQuoteResponseV2(quoteResponse: unknown): QuoteResponse {\n let quoteResponseV2: QuoteResponse | null = null;\n\n // V1 quote\n if (quoteResponse && is(quoteResponse, QuoteResponseSchemaV1)) {\n quoteResponseV2 = create(quoteResponse, QuoteResponseV2FromV1);\n if (!quoteResponseV2) {\n throw new Error('QuoteResponseV1 to V2 conversion failed');\n }\n }\n\n // V2 quote\n else if (validateQuoteResponse(quoteResponse)) {\n quoteResponseV2 = quoteResponse;\n }\n\n if (quoteResponseV2) {\n const {\n chain: { namespace },\n chainId,\n } = parseCaipAssetType(quoteResponseV2.quote.src.asset.assetId);\n\n // Add namespace, chainId\n return { ...quoteResponseV2, namespace: namespace as never, chainId };\n }\n\n throw new Error(\n 'QuoteResponseV1 to V2 conversion failed. Invalid quoteResponse provided',\n );\n}\n"]}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toQuoteResponseV1 = void 0;
|
|
4
|
+
const superstruct_1 = require("@metamask/superstruct");
|
|
5
|
+
const utils_1 = require("@metamask/utils");
|
|
6
|
+
const caip_formatters_1 = require("../utils/caip-formatters.cjs");
|
|
7
|
+
const struct_error_1 = require("../utils/struct-error.cjs");
|
|
8
|
+
const bridge_asset_1 = require("../validators/bridge-asset.cjs");
|
|
9
|
+
const quote_1 = require("../validators/quote.cjs");
|
|
10
|
+
const quote_response_1 = require("../validators/quote-response.cjs");
|
|
11
|
+
const quote_response_v1_1 = require("../validators/quote-response-v1.cjs");
|
|
12
|
+
const step_1 = require("../validators/step.cjs");
|
|
13
|
+
const BridgeAssetV1FromV2 = (0, superstruct_1.coerce)((0, superstruct_1.intersection)([bridge_asset_1.BridgeAssetSchema, bridge_asset_1.MinimalAssetSchema]), bridge_asset_1.BridgeAssetV2Schema, (value) => {
|
|
14
|
+
const { assetId, ...rest } = value;
|
|
15
|
+
const { chainId } = (0, utils_1.parseCaipAssetType)(assetId);
|
|
16
|
+
return {
|
|
17
|
+
address: (0, caip_formatters_1.formatAddressToCaipReference)(assetId),
|
|
18
|
+
chainId: (0, caip_formatters_1.formatChainIdToDec)(chainId),
|
|
19
|
+
assetId,
|
|
20
|
+
...rest,
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
const toBridgeAssetV1 = (data) => {
|
|
24
|
+
return (0, superstruct_1.create)(data, BridgeAssetV1FromV2);
|
|
25
|
+
};
|
|
26
|
+
const StepSchemaV1FromV2 = (0, superstruct_1.coerce)(step_1.StepSchema, step_1.StepSchemaV2, (value) => {
|
|
27
|
+
const { src, dest, action } = value;
|
|
28
|
+
const srcAsset = toBridgeAssetV1(src.asset);
|
|
29
|
+
const destAsset = toBridgeAssetV1(dest.asset);
|
|
30
|
+
return {
|
|
31
|
+
action,
|
|
32
|
+
srcChainId: srcAsset.chainId,
|
|
33
|
+
destChainId: destAsset.chainId,
|
|
34
|
+
srcAsset,
|
|
35
|
+
destAsset,
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
const toStepV1 = (step) => {
|
|
39
|
+
const stepV2 = (0, superstruct_1.create)(step, StepSchemaV1FromV2);
|
|
40
|
+
return stepV2;
|
|
41
|
+
};
|
|
42
|
+
const QuoteV1FromV2 = (0, superstruct_1.coerce)(quote_1.QuoteSchema, quote_1.QuoteSchemaV2, (value) => {
|
|
43
|
+
const { priceData, feeData, steps, protocols, aggregator, src, dest, ...restQuote } = value;
|
|
44
|
+
const { chainId: srcChainIdInCaip, assetReference: srcReference } = (0, utils_1.parseCaipAssetType)(src.asset.assetId);
|
|
45
|
+
const { chainId: destChainIdInCaip, assetReference: destReference } = (0, utils_1.parseCaipAssetType)(dest.asset.assetId);
|
|
46
|
+
const srcChainId = (0, caip_formatters_1.formatChainIdToDec)(srcChainIdInCaip);
|
|
47
|
+
const destChainId = (0, caip_formatters_1.formatChainIdToDec)(destChainIdInCaip);
|
|
48
|
+
const srcTokenAddress = (0, caip_formatters_1.formatAddressToCaipReference)(srcReference);
|
|
49
|
+
const destTokenAddress = (0, caip_formatters_1.formatAddressToCaipReference)(destReference);
|
|
50
|
+
const { usd, ...metabridgeFeeData } = feeData[quote_1.FeeType.METABRIDGE][0];
|
|
51
|
+
return {
|
|
52
|
+
bridges: protocols,
|
|
53
|
+
bridgeId: aggregator,
|
|
54
|
+
protocols,
|
|
55
|
+
aggregator,
|
|
56
|
+
srcChainId,
|
|
57
|
+
destChainId,
|
|
58
|
+
srcAsset: {
|
|
59
|
+
...src.asset,
|
|
60
|
+
chainId: srcChainId,
|
|
61
|
+
address: srcTokenAddress,
|
|
62
|
+
},
|
|
63
|
+
destAsset: {
|
|
64
|
+
...dest.asset,
|
|
65
|
+
chainId: destChainId,
|
|
66
|
+
address: destTokenAddress,
|
|
67
|
+
},
|
|
68
|
+
srcTokenAmount: src.amount,
|
|
69
|
+
destTokenAmount: dest.amount,
|
|
70
|
+
minDestTokenAmount: dest.minAmount,
|
|
71
|
+
...(dest.walletAddress && { destWalletAddress: dest.walletAddress }),
|
|
72
|
+
feeData: {
|
|
73
|
+
[quote_1.FeeType.METABRIDGE]: {
|
|
74
|
+
...metabridgeFeeData,
|
|
75
|
+
asset: {
|
|
76
|
+
...metabridgeFeeData.asset,
|
|
77
|
+
chainId: (0, caip_formatters_1.formatChainIdToDec)((0, utils_1.parseCaipAssetType)(metabridgeFeeData.asset.assetId).chainId),
|
|
78
|
+
address: (0, caip_formatters_1.formatAddressToCaipReference)((0, utils_1.parseCaipAssetType)(metabridgeFeeData.asset.assetId).assetReference),
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
...(feeData[quote_1.FeeType.TX_FEE]?.length && {
|
|
82
|
+
...feeData[quote_1.FeeType.TX_FEE][0],
|
|
83
|
+
asset: feeData[quote_1.FeeType.TX_FEE][0].asset,
|
|
84
|
+
}),
|
|
85
|
+
},
|
|
86
|
+
...(src.walletAddress && { walletAddress: src.walletAddress }),
|
|
87
|
+
...(value.priceData?.priceImpact?.amount && {
|
|
88
|
+
priceData: {
|
|
89
|
+
priceImpact: value.priceData?.priceImpact?.amount,
|
|
90
|
+
},
|
|
91
|
+
}),
|
|
92
|
+
/**
|
|
93
|
+
* @deprecated This field is deprecated.
|
|
94
|
+
*/
|
|
95
|
+
steps: steps?.map(toStepV1),
|
|
96
|
+
...restQuote,
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
const toQuoteV1 = (quote) => {
|
|
100
|
+
const quoteV2 = (0, superstruct_1.create)(quote, QuoteV1FromV2);
|
|
101
|
+
return quoteV2;
|
|
102
|
+
};
|
|
103
|
+
const QuoteResponseV1FromV2 = (0, superstruct_1.coerce)(quote_response_v1_1.QuoteResponseSchemaV1, quote_response_1.QuoteResponseSchemaV2, (value) => {
|
|
104
|
+
if (!value) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
const { quote, estimatedProcessingTimeInSeconds, approval,
|
|
108
|
+
// @ts-expect-error - Some networks don't have an approval field
|
|
109
|
+
resetApproval, featureId, trade, quoteRequestIndex, nonEvmFeesInNative, l1GasFeesInHexWei, quoteId, namespace, chainId, ...rest } = value;
|
|
110
|
+
const quoteV1 = toQuoteV1(quote);
|
|
111
|
+
return {
|
|
112
|
+
...rest,
|
|
113
|
+
estimatedProcessingTimeInSeconds,
|
|
114
|
+
approval,
|
|
115
|
+
trade,
|
|
116
|
+
quote: quoteV1,
|
|
117
|
+
...(featureId && { featureId }),
|
|
118
|
+
...(quoteId && { quoteId }),
|
|
119
|
+
...(resetApproval && { resetApproval }),
|
|
120
|
+
...(quoteRequestIndex !== undefined && { quoteRequestIndex }),
|
|
121
|
+
...(nonEvmFeesInNative && { nonEvmFeesInNative }),
|
|
122
|
+
...(l1GasFeesInHexWei && { l1GasFeesInHexWei }),
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
/**
|
|
126
|
+
* Converts a {@link QuoteResponseV2} to a {@link QuoteResponseV1} for backwards compatibility.
|
|
127
|
+
* This does not preserve any post-fetch metadata.
|
|
128
|
+
*
|
|
129
|
+
* @deprecated Avoid introducing new code that uses this function. It is only for backwards compatibility with the old quote response format.
|
|
130
|
+
* @param quoteResponse - The {@link QuoteResponse} to convert
|
|
131
|
+
* @returns The {@link QuoteResponseV1}
|
|
132
|
+
*/
|
|
133
|
+
const toQuoteResponseV1 = (quoteResponse) => {
|
|
134
|
+
let errorMessage = 'Failed to convert';
|
|
135
|
+
// V1 quote
|
|
136
|
+
if ((0, superstruct_1.is)(quoteResponse, quote_response_v1_1.QuoteResponseSchemaV1)) {
|
|
137
|
+
errorMessage += ' unmodified QuoteResponseV1';
|
|
138
|
+
return quoteResponse;
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
// V2 with namespace, chainId, maybe QuoteMetadata
|
|
142
|
+
if ((0, superstruct_1.is)(quoteResponse, quote_response_1.QuoteResponseSchemaV2)) {
|
|
143
|
+
errorMessage += ' QuoteResponseV2 + metadata to QuoteResponseV1';
|
|
144
|
+
const quoteResponseV1 = (0, superstruct_1.create)(quoteResponse, QuoteResponseV1FromV2);
|
|
145
|
+
return quoteResponseV1;
|
|
146
|
+
}
|
|
147
|
+
// V2 with no namespace, chainId
|
|
148
|
+
errorMessage += ' QuoteResponseV2 to QuoteResponseV1';
|
|
149
|
+
return (0, superstruct_1.create)(quoteResponse, QuoteResponseV1FromV2);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
let errorDetails = error instanceof Error ? error.message : 'Unknown error';
|
|
153
|
+
if (error instanceof superstruct_1.StructError) {
|
|
154
|
+
const formattedErrors = (0, struct_error_1.formatStructErrors)(error);
|
|
155
|
+
errorDetails = JSON.stringify(formattedErrors, null, 2);
|
|
156
|
+
console.warn(errorMessage, (0, struct_error_1.formatStructErrors)(error));
|
|
157
|
+
}
|
|
158
|
+
throw new Error(`${errorMessage}. ${errorDetails}`);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
exports.toQuoteResponseV1 = toQuoteResponseV1;
|
|
162
|
+
//# sourceMappingURL=quote-response-v2-to-v1.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote-response-v2-to-v1.cjs","sourceRoot":"","sources":["../../src/coercers/quote-response-v2-to-v1.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n create,\n coerce,\n is,\n StructError,\n intersection,\n Infer,\n} from '@metamask/superstruct';\nimport { parseCaipAssetType } from '@metamask/utils';\n\nimport { Step } from '../types';\nimport {\n formatAddressToCaipReference,\n formatChainIdToDec,\n} from '../utils/caip-formatters';\nimport { QuoteMetadata } from '../utils/quote-metadata/types';\nimport { formatStructErrors } from '../utils/struct-error';\nimport {\n BridgeAssetSchema,\n BridgeAssetV2Schema,\n MinimalAssetSchema,\n} from '../validators/bridge-asset';\nimport {\n QuoteSchemaV2,\n FeeType,\n Quote,\n QuoteSchema,\n} from '../validators/quote';\nimport {\n QuoteResponse,\n QuoteResponseSchemaV2,\n} from '../validators/quote-response';\nimport {\n QuoteResponseSchemaV1,\n QuoteResponseV1,\n} from '../validators/quote-response-v1';\nimport { StepSchemaV2, StepSchema } from '../validators/step';\n\nconst BridgeAssetV1FromV2 = coerce(\n intersection([BridgeAssetSchema, MinimalAssetSchema]),\n BridgeAssetV2Schema,\n (value) => {\n const { assetId, ...rest } = value;\n\n const { chainId } = parseCaipAssetType(assetId);\n return {\n address: formatAddressToCaipReference(assetId),\n chainId: formatChainIdToDec(chainId),\n assetId,\n ...rest,\n };\n },\n);\n\nconst toBridgeAssetV1 = (data: unknown): Infer<typeof BridgeAssetSchema> => {\n return create(data, BridgeAssetV1FromV2);\n};\n\nconst StepSchemaV1FromV2 = coerce(StepSchema, StepSchemaV2, (value) => {\n const { src, dest, action } = value;\n const srcAsset = toBridgeAssetV1(src.asset);\n const destAsset = toBridgeAssetV1(dest.asset);\n\n return {\n action,\n srcChainId: srcAsset.chainId,\n destChainId: destAsset.chainId,\n srcAsset,\n destAsset,\n };\n});\n\nconst toStepV1 = (step: unknown): Step => {\n const stepV2 = create(step, StepSchemaV1FromV2);\n return stepV2;\n};\n\nconst QuoteV1FromV2 = coerce(QuoteSchema, QuoteSchemaV2, (value) => {\n const {\n priceData,\n feeData,\n steps,\n protocols,\n aggregator,\n src,\n dest,\n ...restQuote\n } = value;\n\n const { chainId: srcChainIdInCaip, assetReference: srcReference } =\n parseCaipAssetType(src.asset.assetId);\n const { chainId: destChainIdInCaip, assetReference: destReference } =\n parseCaipAssetType(dest.asset.assetId);\n\n const srcChainId = formatChainIdToDec(srcChainIdInCaip);\n const destChainId = formatChainIdToDec(destChainIdInCaip);\n const srcTokenAddress = formatAddressToCaipReference(srcReference);\n const destTokenAddress = formatAddressToCaipReference(destReference);\n\n const { usd, ...metabridgeFeeData } = feeData[FeeType.METABRIDGE][0];\n\n return {\n bridges: protocols,\n bridgeId: aggregator,\n protocols,\n aggregator,\n srcChainId,\n destChainId,\n srcAsset: {\n ...src.asset,\n chainId: srcChainId,\n address: srcTokenAddress,\n },\n destAsset: {\n ...dest.asset,\n chainId: destChainId,\n address: destTokenAddress,\n },\n srcTokenAmount: src.amount,\n destTokenAmount: dest.amount,\n minDestTokenAmount: dest.minAmount,\n ...(dest.walletAddress && { destWalletAddress: dest.walletAddress }),\n feeData: {\n [FeeType.METABRIDGE]: {\n ...metabridgeFeeData,\n asset: {\n ...metabridgeFeeData.asset,\n chainId: formatChainIdToDec(\n parseCaipAssetType(metabridgeFeeData.asset.assetId).chainId,\n ),\n address: formatAddressToCaipReference(\n parseCaipAssetType(metabridgeFeeData.asset.assetId).assetReference,\n ),\n },\n },\n ...(feeData[FeeType.TX_FEE]?.length && {\n ...feeData[FeeType.TX_FEE][0],\n asset: feeData[FeeType.TX_FEE][0].asset,\n }),\n },\n ...(src.walletAddress && { walletAddress: src.walletAddress }),\n ...(value.priceData?.priceImpact?.amount && {\n priceData: {\n priceImpact: value.priceData?.priceImpact?.amount,\n },\n }),\n /**\n * @deprecated This field is deprecated.\n */\n steps: steps?.map(toStepV1),\n ...restQuote,\n };\n});\n\nconst toQuoteV1 = (quote: unknown): Quote => {\n const quoteV2 = create(quote, QuoteV1FromV2);\n return quoteV2;\n};\n\nconst QuoteResponseV1FromV2 = coerce(\n QuoteResponseSchemaV1,\n QuoteResponseSchemaV2,\n (value: QuoteResponse | null) => {\n if (!value) {\n return null;\n }\n const {\n quote,\n estimatedProcessingTimeInSeconds,\n approval,\n // @ts-expect-error - Some networks don't have an approval field\n resetApproval,\n featureId,\n trade,\n quoteRequestIndex,\n nonEvmFeesInNative,\n l1GasFeesInHexWei,\n quoteId,\n namespace,\n chainId,\n ...rest\n } = value;\n\n const quoteV1 = toQuoteV1(quote);\n return {\n ...rest,\n estimatedProcessingTimeInSeconds,\n approval,\n trade,\n quote: quoteV1,\n ...(featureId && { featureId }),\n ...(quoteId && { quoteId }),\n ...(resetApproval && { resetApproval }),\n ...(quoteRequestIndex !== undefined && { quoteRequestIndex }),\n ...(nonEvmFeesInNative && { nonEvmFeesInNative }),\n ...(l1GasFeesInHexWei && { l1GasFeesInHexWei }),\n };\n },\n);\n\n/**\n * Converts a {@link QuoteResponseV2} to a {@link QuoteResponseV1} for backwards compatibility.\n * This does not preserve any post-fetch metadata.\n *\n * @deprecated Avoid introducing new code that uses this function. It is only for backwards compatibility with the old quote response format.\n * @param quoteResponse - The {@link QuoteResponse} to convert\n * @returns The {@link QuoteResponseV1}\n */\nexport const toQuoteResponseV1 = (\n quoteResponse:\n | QuoteResponse\n | (QuoteResponseV1 & QuoteMetadata)\n | QuoteResponseV1,\n): QuoteResponseV1 & QuoteMetadata => {\n let errorMessage = 'Failed to convert';\n\n // V1 quote\n if (is(quoteResponse, QuoteResponseSchemaV1)) {\n errorMessage += ' unmodified QuoteResponseV1';\n return quoteResponse as QuoteResponseV1 & QuoteMetadata;\n }\n\n try {\n // V2 with namespace, chainId, maybe QuoteMetadata\n if (is(quoteResponse, QuoteResponseSchemaV2)) {\n errorMessage += ' QuoteResponseV2 + metadata to QuoteResponseV1';\n const quoteResponseV1 = create(quoteResponse, QuoteResponseV1FromV2);\n return quoteResponseV1;\n }\n\n // V2 with no namespace, chainId\n errorMessage += ' QuoteResponseV2 to QuoteResponseV1';\n return create(quoteResponse, QuoteResponseV1FromV2);\n } catch (error) {\n let errorDetails = error instanceof Error ? error.message : 'Unknown error';\n\n if (error instanceof StructError) {\n const formattedErrors = formatStructErrors(error);\n errorDetails = JSON.stringify(formattedErrors, null, 2);\n console.warn(errorMessage, formatStructErrors(error));\n }\n\n throw new Error(`${errorMessage}. ${errorDetails}`);\n }\n};\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { QuoteMetadata } from "../utils/quote-metadata/types.cjs";
|
|
2
|
+
import { QuoteResponse } from "../validators/quote-response.cjs";
|
|
3
|
+
import { QuoteResponseV1 } from "../validators/quote-response-v1.cjs";
|
|
4
|
+
/**
|
|
5
|
+
* Converts a {@link QuoteResponseV2} to a {@link QuoteResponseV1} for backwards compatibility.
|
|
6
|
+
* This does not preserve any post-fetch metadata.
|
|
7
|
+
*
|
|
8
|
+
* @deprecated Avoid introducing new code that uses this function. It is only for backwards compatibility with the old quote response format.
|
|
9
|
+
* @param quoteResponse - The {@link QuoteResponse} to convert
|
|
10
|
+
* @returns The {@link QuoteResponseV1}
|
|
11
|
+
*/
|
|
12
|
+
export declare const toQuoteResponseV1: (quoteResponse: QuoteResponse | (QuoteResponseV1 & QuoteMetadata) | QuoteResponseV1) => QuoteResponseV1 & QuoteMetadata;
|
|
13
|
+
//# sourceMappingURL=quote-response-v2-to-v1.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote-response-v2-to-v1.d.cts","sourceRoot":"","sources":["../../src/coercers/quote-response-v2-to-v1.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,aAAa,EAAE,0CAAsC;AAa9D,OAAO,EACL,aAAa,EAEd,yCAAqC;AACtC,OAAO,EAEL,eAAe,EAChB,4CAAwC;AAqKzC;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,kBAExB,aAAa,GACb,CAAC,eAAe,GAAG,aAAa,CAAC,GACjC,eAAe,KAClB,eAAe,GAAG,aA+BpB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { QuoteMetadata } from "../utils/quote-metadata/types.mjs";
|
|
2
|
+
import { QuoteResponse } from "../validators/quote-response.mjs";
|
|
3
|
+
import { QuoteResponseV1 } from "../validators/quote-response-v1.mjs";
|
|
4
|
+
/**
|
|
5
|
+
* Converts a {@link QuoteResponseV2} to a {@link QuoteResponseV1} for backwards compatibility.
|
|
6
|
+
* This does not preserve any post-fetch metadata.
|
|
7
|
+
*
|
|
8
|
+
* @deprecated Avoid introducing new code that uses this function. It is only for backwards compatibility with the old quote response format.
|
|
9
|
+
* @param quoteResponse - The {@link QuoteResponse} to convert
|
|
10
|
+
* @returns The {@link QuoteResponseV1}
|
|
11
|
+
*/
|
|
12
|
+
export declare const toQuoteResponseV1: (quoteResponse: QuoteResponse | (QuoteResponseV1 & QuoteMetadata) | QuoteResponseV1) => QuoteResponseV1 & QuoteMetadata;
|
|
13
|
+
//# sourceMappingURL=quote-response-v2-to-v1.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote-response-v2-to-v1.d.mts","sourceRoot":"","sources":["../../src/coercers/quote-response-v2-to-v1.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,aAAa,EAAE,0CAAsC;AAa9D,OAAO,EACL,aAAa,EAEd,yCAAqC;AACtC,OAAO,EAEL,eAAe,EAChB,4CAAwC;AAqKzC;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,kBAExB,aAAa,GACb,CAAC,eAAe,GAAG,aAAa,CAAC,GACjC,eAAe,KAClB,eAAe,GAAG,aA+BpB,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { create, coerce, is, StructError, intersection } from "@metamask/superstruct";
|
|
2
|
+
import { parseCaipAssetType } from "@metamask/utils";
|
|
3
|
+
import { formatAddressToCaipReference, formatChainIdToDec } from "../utils/caip-formatters.mjs";
|
|
4
|
+
import { formatStructErrors } from "../utils/struct-error.mjs";
|
|
5
|
+
import { BridgeAssetSchema, BridgeAssetV2Schema, MinimalAssetSchema } from "../validators/bridge-asset.mjs";
|
|
6
|
+
import { QuoteSchemaV2, FeeType, QuoteSchema } from "../validators/quote.mjs";
|
|
7
|
+
import { QuoteResponseSchemaV2 } from "../validators/quote-response.mjs";
|
|
8
|
+
import { QuoteResponseSchemaV1 } from "../validators/quote-response-v1.mjs";
|
|
9
|
+
import { StepSchemaV2, StepSchema } from "../validators/step.mjs";
|
|
10
|
+
const BridgeAssetV1FromV2 = coerce(intersection([BridgeAssetSchema, MinimalAssetSchema]), BridgeAssetV2Schema, (value) => {
|
|
11
|
+
const { assetId, ...rest } = value;
|
|
12
|
+
const { chainId } = parseCaipAssetType(assetId);
|
|
13
|
+
return {
|
|
14
|
+
address: formatAddressToCaipReference(assetId),
|
|
15
|
+
chainId: formatChainIdToDec(chainId),
|
|
16
|
+
assetId,
|
|
17
|
+
...rest,
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
const toBridgeAssetV1 = (data) => {
|
|
21
|
+
return create(data, BridgeAssetV1FromV2);
|
|
22
|
+
};
|
|
23
|
+
const StepSchemaV1FromV2 = coerce(StepSchema, StepSchemaV2, (value) => {
|
|
24
|
+
const { src, dest, action } = value;
|
|
25
|
+
const srcAsset = toBridgeAssetV1(src.asset);
|
|
26
|
+
const destAsset = toBridgeAssetV1(dest.asset);
|
|
27
|
+
return {
|
|
28
|
+
action,
|
|
29
|
+
srcChainId: srcAsset.chainId,
|
|
30
|
+
destChainId: destAsset.chainId,
|
|
31
|
+
srcAsset,
|
|
32
|
+
destAsset,
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
const toStepV1 = (step) => {
|
|
36
|
+
const stepV2 = create(step, StepSchemaV1FromV2);
|
|
37
|
+
return stepV2;
|
|
38
|
+
};
|
|
39
|
+
const QuoteV1FromV2 = coerce(QuoteSchema, QuoteSchemaV2, (value) => {
|
|
40
|
+
const { priceData, feeData, steps, protocols, aggregator, src, dest, ...restQuote } = value;
|
|
41
|
+
const { chainId: srcChainIdInCaip, assetReference: srcReference } = parseCaipAssetType(src.asset.assetId);
|
|
42
|
+
const { chainId: destChainIdInCaip, assetReference: destReference } = parseCaipAssetType(dest.asset.assetId);
|
|
43
|
+
const srcChainId = formatChainIdToDec(srcChainIdInCaip);
|
|
44
|
+
const destChainId = formatChainIdToDec(destChainIdInCaip);
|
|
45
|
+
const srcTokenAddress = formatAddressToCaipReference(srcReference);
|
|
46
|
+
const destTokenAddress = formatAddressToCaipReference(destReference);
|
|
47
|
+
const { usd, ...metabridgeFeeData } = feeData[FeeType.METABRIDGE][0];
|
|
48
|
+
return {
|
|
49
|
+
bridges: protocols,
|
|
50
|
+
bridgeId: aggregator,
|
|
51
|
+
protocols,
|
|
52
|
+
aggregator,
|
|
53
|
+
srcChainId,
|
|
54
|
+
destChainId,
|
|
55
|
+
srcAsset: {
|
|
56
|
+
...src.asset,
|
|
57
|
+
chainId: srcChainId,
|
|
58
|
+
address: srcTokenAddress,
|
|
59
|
+
},
|
|
60
|
+
destAsset: {
|
|
61
|
+
...dest.asset,
|
|
62
|
+
chainId: destChainId,
|
|
63
|
+
address: destTokenAddress,
|
|
64
|
+
},
|
|
65
|
+
srcTokenAmount: src.amount,
|
|
66
|
+
destTokenAmount: dest.amount,
|
|
67
|
+
minDestTokenAmount: dest.minAmount,
|
|
68
|
+
...(dest.walletAddress && { destWalletAddress: dest.walletAddress }),
|
|
69
|
+
feeData: {
|
|
70
|
+
[FeeType.METABRIDGE]: {
|
|
71
|
+
...metabridgeFeeData,
|
|
72
|
+
asset: {
|
|
73
|
+
...metabridgeFeeData.asset,
|
|
74
|
+
chainId: formatChainIdToDec(parseCaipAssetType(metabridgeFeeData.asset.assetId).chainId),
|
|
75
|
+
address: formatAddressToCaipReference(parseCaipAssetType(metabridgeFeeData.asset.assetId).assetReference),
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
...(feeData[FeeType.TX_FEE]?.length && {
|
|
79
|
+
...feeData[FeeType.TX_FEE][0],
|
|
80
|
+
asset: feeData[FeeType.TX_FEE][0].asset,
|
|
81
|
+
}),
|
|
82
|
+
},
|
|
83
|
+
...(src.walletAddress && { walletAddress: src.walletAddress }),
|
|
84
|
+
...(value.priceData?.priceImpact?.amount && {
|
|
85
|
+
priceData: {
|
|
86
|
+
priceImpact: value.priceData?.priceImpact?.amount,
|
|
87
|
+
},
|
|
88
|
+
}),
|
|
89
|
+
/**
|
|
90
|
+
* @deprecated This field is deprecated.
|
|
91
|
+
*/
|
|
92
|
+
steps: steps?.map(toStepV1),
|
|
93
|
+
...restQuote,
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
const toQuoteV1 = (quote) => {
|
|
97
|
+
const quoteV2 = create(quote, QuoteV1FromV2);
|
|
98
|
+
return quoteV2;
|
|
99
|
+
};
|
|
100
|
+
const QuoteResponseV1FromV2 = coerce(QuoteResponseSchemaV1, QuoteResponseSchemaV2, (value) => {
|
|
101
|
+
if (!value) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const { quote, estimatedProcessingTimeInSeconds, approval,
|
|
105
|
+
// @ts-expect-error - Some networks don't have an approval field
|
|
106
|
+
resetApproval, featureId, trade, quoteRequestIndex, nonEvmFeesInNative, l1GasFeesInHexWei, quoteId, namespace, chainId, ...rest } = value;
|
|
107
|
+
const quoteV1 = toQuoteV1(quote);
|
|
108
|
+
return {
|
|
109
|
+
...rest,
|
|
110
|
+
estimatedProcessingTimeInSeconds,
|
|
111
|
+
approval,
|
|
112
|
+
trade,
|
|
113
|
+
quote: quoteV1,
|
|
114
|
+
...(featureId && { featureId }),
|
|
115
|
+
...(quoteId && { quoteId }),
|
|
116
|
+
...(resetApproval && { resetApproval }),
|
|
117
|
+
...(quoteRequestIndex !== undefined && { quoteRequestIndex }),
|
|
118
|
+
...(nonEvmFeesInNative && { nonEvmFeesInNative }),
|
|
119
|
+
...(l1GasFeesInHexWei && { l1GasFeesInHexWei }),
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
/**
|
|
123
|
+
* Converts a {@link QuoteResponseV2} to a {@link QuoteResponseV1} for backwards compatibility.
|
|
124
|
+
* This does not preserve any post-fetch metadata.
|
|
125
|
+
*
|
|
126
|
+
* @deprecated Avoid introducing new code that uses this function. It is only for backwards compatibility with the old quote response format.
|
|
127
|
+
* @param quoteResponse - The {@link QuoteResponse} to convert
|
|
128
|
+
* @returns The {@link QuoteResponseV1}
|
|
129
|
+
*/
|
|
130
|
+
export const toQuoteResponseV1 = (quoteResponse) => {
|
|
131
|
+
let errorMessage = 'Failed to convert';
|
|
132
|
+
// V1 quote
|
|
133
|
+
if (is(quoteResponse, QuoteResponseSchemaV1)) {
|
|
134
|
+
errorMessage += ' unmodified QuoteResponseV1';
|
|
135
|
+
return quoteResponse;
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
// V2 with namespace, chainId, maybe QuoteMetadata
|
|
139
|
+
if (is(quoteResponse, QuoteResponseSchemaV2)) {
|
|
140
|
+
errorMessage += ' QuoteResponseV2 + metadata to QuoteResponseV1';
|
|
141
|
+
const quoteResponseV1 = create(quoteResponse, QuoteResponseV1FromV2);
|
|
142
|
+
return quoteResponseV1;
|
|
143
|
+
}
|
|
144
|
+
// V2 with no namespace, chainId
|
|
145
|
+
errorMessage += ' QuoteResponseV2 to QuoteResponseV1';
|
|
146
|
+
return create(quoteResponse, QuoteResponseV1FromV2);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
let errorDetails = error instanceof Error ? error.message : 'Unknown error';
|
|
150
|
+
if (error instanceof StructError) {
|
|
151
|
+
const formattedErrors = formatStructErrors(error);
|
|
152
|
+
errorDetails = JSON.stringify(formattedErrors, null, 2);
|
|
153
|
+
console.warn(errorMessage, formatStructErrors(error));
|
|
154
|
+
}
|
|
155
|
+
throw new Error(`${errorMessage}. ${errorDetails}`);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=quote-response-v2-to-v1.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote-response-v2-to-v1.mjs","sourceRoot":"","sources":["../../src/coercers/quote-response-v2-to-v1.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n create,\n coerce,\n is,\n StructError,\n intersection,\n Infer,\n} from '@metamask/superstruct';\nimport { parseCaipAssetType } from '@metamask/utils';\n\nimport { Step } from '../types';\nimport {\n formatAddressToCaipReference,\n formatChainIdToDec,\n} from '../utils/caip-formatters';\nimport { QuoteMetadata } from '../utils/quote-metadata/types';\nimport { formatStructErrors } from '../utils/struct-error';\nimport {\n BridgeAssetSchema,\n BridgeAssetV2Schema,\n MinimalAssetSchema,\n} from '../validators/bridge-asset';\nimport {\n QuoteSchemaV2,\n FeeType,\n Quote,\n QuoteSchema,\n} from '../validators/quote';\nimport {\n QuoteResponse,\n QuoteResponseSchemaV2,\n} from '../validators/quote-response';\nimport {\n QuoteResponseSchemaV1,\n QuoteResponseV1,\n} from '../validators/quote-response-v1';\nimport { StepSchemaV2, StepSchema } from '../validators/step';\n\nconst BridgeAssetV1FromV2 = coerce(\n intersection([BridgeAssetSchema, MinimalAssetSchema]),\n BridgeAssetV2Schema,\n (value) => {\n const { assetId, ...rest } = value;\n\n const { chainId } = parseCaipAssetType(assetId);\n return {\n address: formatAddressToCaipReference(assetId),\n chainId: formatChainIdToDec(chainId),\n assetId,\n ...rest,\n };\n },\n);\n\nconst toBridgeAssetV1 = (data: unknown): Infer<typeof BridgeAssetSchema> => {\n return create(data, BridgeAssetV1FromV2);\n};\n\nconst StepSchemaV1FromV2 = coerce(StepSchema, StepSchemaV2, (value) => {\n const { src, dest, action } = value;\n const srcAsset = toBridgeAssetV1(src.asset);\n const destAsset = toBridgeAssetV1(dest.asset);\n\n return {\n action,\n srcChainId: srcAsset.chainId,\n destChainId: destAsset.chainId,\n srcAsset,\n destAsset,\n };\n});\n\nconst toStepV1 = (step: unknown): Step => {\n const stepV2 = create(step, StepSchemaV1FromV2);\n return stepV2;\n};\n\nconst QuoteV1FromV2 = coerce(QuoteSchema, QuoteSchemaV2, (value) => {\n const {\n priceData,\n feeData,\n steps,\n protocols,\n aggregator,\n src,\n dest,\n ...restQuote\n } = value;\n\n const { chainId: srcChainIdInCaip, assetReference: srcReference } =\n parseCaipAssetType(src.asset.assetId);\n const { chainId: destChainIdInCaip, assetReference: destReference } =\n parseCaipAssetType(dest.asset.assetId);\n\n const srcChainId = formatChainIdToDec(srcChainIdInCaip);\n const destChainId = formatChainIdToDec(destChainIdInCaip);\n const srcTokenAddress = formatAddressToCaipReference(srcReference);\n const destTokenAddress = formatAddressToCaipReference(destReference);\n\n const { usd, ...metabridgeFeeData } = feeData[FeeType.METABRIDGE][0];\n\n return {\n bridges: protocols,\n bridgeId: aggregator,\n protocols,\n aggregator,\n srcChainId,\n destChainId,\n srcAsset: {\n ...src.asset,\n chainId: srcChainId,\n address: srcTokenAddress,\n },\n destAsset: {\n ...dest.asset,\n chainId: destChainId,\n address: destTokenAddress,\n },\n srcTokenAmount: src.amount,\n destTokenAmount: dest.amount,\n minDestTokenAmount: dest.minAmount,\n ...(dest.walletAddress && { destWalletAddress: dest.walletAddress }),\n feeData: {\n [FeeType.METABRIDGE]: {\n ...metabridgeFeeData,\n asset: {\n ...metabridgeFeeData.asset,\n chainId: formatChainIdToDec(\n parseCaipAssetType(metabridgeFeeData.asset.assetId).chainId,\n ),\n address: formatAddressToCaipReference(\n parseCaipAssetType(metabridgeFeeData.asset.assetId).assetReference,\n ),\n },\n },\n ...(feeData[FeeType.TX_FEE]?.length && {\n ...feeData[FeeType.TX_FEE][0],\n asset: feeData[FeeType.TX_FEE][0].asset,\n }),\n },\n ...(src.walletAddress && { walletAddress: src.walletAddress }),\n ...(value.priceData?.priceImpact?.amount && {\n priceData: {\n priceImpact: value.priceData?.priceImpact?.amount,\n },\n }),\n /**\n * @deprecated This field is deprecated.\n */\n steps: steps?.map(toStepV1),\n ...restQuote,\n };\n});\n\nconst toQuoteV1 = (quote: unknown): Quote => {\n const quoteV2 = create(quote, QuoteV1FromV2);\n return quoteV2;\n};\n\nconst QuoteResponseV1FromV2 = coerce(\n QuoteResponseSchemaV1,\n QuoteResponseSchemaV2,\n (value: QuoteResponse | null) => {\n if (!value) {\n return null;\n }\n const {\n quote,\n estimatedProcessingTimeInSeconds,\n approval,\n // @ts-expect-error - Some networks don't have an approval field\n resetApproval,\n featureId,\n trade,\n quoteRequestIndex,\n nonEvmFeesInNative,\n l1GasFeesInHexWei,\n quoteId,\n namespace,\n chainId,\n ...rest\n } = value;\n\n const quoteV1 = toQuoteV1(quote);\n return {\n ...rest,\n estimatedProcessingTimeInSeconds,\n approval,\n trade,\n quote: quoteV1,\n ...(featureId && { featureId }),\n ...(quoteId && { quoteId }),\n ...(resetApproval && { resetApproval }),\n ...(quoteRequestIndex !== undefined && { quoteRequestIndex }),\n ...(nonEvmFeesInNative && { nonEvmFeesInNative }),\n ...(l1GasFeesInHexWei && { l1GasFeesInHexWei }),\n };\n },\n);\n\n/**\n * Converts a {@link QuoteResponseV2} to a {@link QuoteResponseV1} for backwards compatibility.\n * This does not preserve any post-fetch metadata.\n *\n * @deprecated Avoid introducing new code that uses this function. It is only for backwards compatibility with the old quote response format.\n * @param quoteResponse - The {@link QuoteResponse} to convert\n * @returns The {@link QuoteResponseV1}\n */\nexport const toQuoteResponseV1 = (\n quoteResponse:\n | QuoteResponse\n | (QuoteResponseV1 & QuoteMetadata)\n | QuoteResponseV1,\n): QuoteResponseV1 & QuoteMetadata => {\n let errorMessage = 'Failed to convert';\n\n // V1 quote\n if (is(quoteResponse, QuoteResponseSchemaV1)) {\n errorMessage += ' unmodified QuoteResponseV1';\n return quoteResponse as QuoteResponseV1 & QuoteMetadata;\n }\n\n try {\n // V2 with namespace, chainId, maybe QuoteMetadata\n if (is(quoteResponse, QuoteResponseSchemaV2)) {\n errorMessage += ' QuoteResponseV2 + metadata to QuoteResponseV1';\n const quoteResponseV1 = create(quoteResponse, QuoteResponseV1FromV2);\n return quoteResponseV1;\n }\n\n // V2 with no namespace, chainId\n errorMessage += ' QuoteResponseV2 to QuoteResponseV1';\n return create(quoteResponse, QuoteResponseV1FromV2);\n } catch (error) {\n let errorDetails = error instanceof Error ? error.message : 'Unknown error';\n\n if (error instanceof StructError) {\n const formattedErrors = formatStructErrors(error);\n errorDetails = JSON.stringify(formattedErrors, null, 2);\n console.warn(errorMessage, formatStructErrors(error));\n }\n\n throw new Error(`${errorMessage}. ${errorDetails}`);\n }\n};\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.
|
|
3
|
+
exports.ALLOWED_BRIDGE_CHAIN_IDS = exports.toBridgeAssetV2 = exports.FeatureId = exports.BridgeAssetSecurityDataType = exports.BridgeAssetV2Schema = exports.MinimalAssetSchema = exports.validateBridgeAssetV2 = exports.validateBridgeAsset = exports.BridgeAssetSchema = exports.TokenFeatureType = exports.BatchSellTransactionType = exports.QuoteStreamCompleteReason = exports.validateQuoteStreamComplete = exports.toQuoteMetadataV2 = exports.toQuoteMetadataV1 = exports.sumAmounts = exports.toQuoteResponseV2 = exports.toQuoteResponseV1 = exports.ActionTypes = exports.DiscountType = exports.FeeType = exports.isStellarTrade = exports.isEvmTxData = exports.isTronTrade = exports.isBitcoinTrade = exports.AbortReason = exports.StatusTypes = exports.RequestStatus = exports.ChainId = exports.SortOrder = exports.AssetType = exports.mergeQuoteMetadata = exports.QuoteResponseSchemaV1 = exports.validateQuoteResponseV1 = exports.getQuotesReceivedProperties = exports.isCustomSlippage = exports.isHardwareWallet = exports.getSwapType = exports.getRequestParams = exports.formatProviderLabel = exports.getAccountHardwareType = exports.PollingStatus = exports.MetaMetricsSwapsEventSource = exports.InputAmountPreset = exports.BatchSellMetricsLocation = exports.UNIFIED_SWAP_BRIDGE_EVENT_CATEGORY = exports.BATCH_SELL_EVENT_CATEGORY = exports.UnifiedSwapBridgeEventName = exports.BatchSellMetricsEventName = exports.BridgeController = void 0;
|
|
4
|
+
exports.selectBridgeFeatureFlags = exports.selectIsQuoteExpired = exports.selectExchangeRateByAssetId = exports.selectDefaultSlippagePercentage = exports.selectBatchSellTrades = exports.selectBatchSellQuotes = exports.selectBridgeQuotes = exports.extractTradeData = exports.formatAddressToAssetId = exports.formatAddressToCaipReference = exports.formatChainIdToHex = exports.formatChainIdToCaip = exports.appendFeesToQuotes = exports.fetchBridgeQuoteStream = exports.getClientHeaders = exports.fetchBridgeTokens = exports.calcLatestSrcBalance = exports.calcQuoteMetadata = exports.calcSlippagePercentage = exports.isValidBatchSellQuoteRequest = exports.isValidQuoteRequest = exports.isCrossChain = exports.getDefaultBridgeControllerState = exports.getNativeAssetForChainId = exports.isNonEvmChainId = exports.isStellarChainId = exports.isTronChainId = exports.isBitcoinChainId = exports.isSolanaChainId = exports.isNativeAddress = exports.isEthUsdt = exports.MetricsSwapType = exports.MetricsActionType = exports.ALLOWED_CONTRACT_ADDRESSES = exports.SWAPS_WRAPPED_TOKENS_ADDRESSES = exports.SWAPS_CONTRACT_ADDRESSES = exports.SWAPS_API_V2_BASE_URL = exports.SWAPS_CHAINID_DEFAULT_TOKEN_MAP = exports.BRIDGE_PROD_API_BASE_URL = exports.BRIDGE_DEV_API_BASE_URL = exports.METABRIDGE_CHAIN_TO_ADDRESS_MAP = exports.DEFAULT_BRIDGE_CONTROLLER_STATE = exports.DEFAULT_MAX_REFRESH_COUNT = exports.REFRESH_INTERVAL_MS = exports.BRIDGE_MM_FEE_RATE = exports.BRIDGE_PREFERRED_GAS_ESTIMATE = exports.BRIDGE_QUOTE_MAX_RETURN_DIFFERENCE_PERCENTAGE = exports.BRIDGE_QUOTE_MAX_ETA_SECONDS = exports.BRIDGE_CONTROLLER_NAME = exports.BridgeClientId = void 0;
|
|
5
|
+
exports.fetchTokens = exports.getSwapsContractAddress = exports.isValidSwapsContractAddress = exports.BRIDGE_DEFAULT_SLIPPAGE = exports.getBridgeFeatureFlags = exports.DEFAULT_FEATURE_FLAG_CONFIG = exports.selectTokenWarnings = exports.selectMinimumBalanceForRentExemptionInSOL = void 0;
|
|
5
6
|
var bridge_controller_1 = require("./bridge-controller.cjs");
|
|
6
7
|
Object.defineProperty(exports, "BridgeController", { enumerable: true, get: function () { return bridge_controller_1.BridgeController; } });
|
|
7
8
|
var constants_1 = require("./utils/metrics/constants.cjs");
|
|
@@ -44,6 +45,16 @@ Object.defineProperty(exports, "FeeType", { enumerable: true, get: function () {
|
|
|
44
45
|
Object.defineProperty(exports, "DiscountType", { enumerable: true, get: function () { return quote_1.DiscountType; } });
|
|
45
46
|
var step_1 = require("./validators/step.cjs");
|
|
46
47
|
Object.defineProperty(exports, "ActionTypes", { enumerable: true, get: function () { return step_1.ActionTypes; } });
|
|
48
|
+
var quote_response_v2_to_v1_1 = require("./coercers/quote-response-v2-to-v1.cjs");
|
|
49
|
+
Object.defineProperty(exports, "toQuoteResponseV1", { enumerable: true, get: function () { return quote_response_v2_to_v1_1.toQuoteResponseV1; } });
|
|
50
|
+
var quote_response_v1_to_v2_1 = require("./coercers/quote-response-v1-to-v2.cjs");
|
|
51
|
+
Object.defineProperty(exports, "toQuoteResponseV2", { enumerable: true, get: function () { return quote_response_v1_to_v2_1.toQuoteResponseV2; } });
|
|
52
|
+
var number_formatters_1 = require("./utils/number-formatters.cjs");
|
|
53
|
+
Object.defineProperty(exports, "sumAmounts", { enumerable: true, get: function () { return number_formatters_1.sumAmounts; } });
|
|
54
|
+
var to_quote_metadata_v1_1 = require("./utils/quote-metadata/to-quote-metadata-v1.cjs");
|
|
55
|
+
Object.defineProperty(exports, "toQuoteMetadataV1", { enumerable: true, get: function () { return to_quote_metadata_v1_1.toQuoteMetadataV1; } });
|
|
56
|
+
var to_quote_metadata_v2_1 = require("./utils/quote-metadata/to-quote-metadata-v2.cjs");
|
|
57
|
+
Object.defineProperty(exports, "toQuoteMetadataV2", { enumerable: true, get: function () { return to_quote_metadata_v2_1.toQuoteMetadataV2; } });
|
|
47
58
|
var quote_stream_complete_1 = require("./validators/quote-stream-complete.cjs");
|
|
48
59
|
Object.defineProperty(exports, "validateQuoteStreamComplete", { enumerable: true, get: function () { return quote_stream_complete_1.validateQuoteStreamComplete; } });
|
|
49
60
|
Object.defineProperty(exports, "QuoteStreamCompleteReason", { enumerable: true, get: function () { return quote_stream_complete_1.QuoteStreamCompleteReason; } });
|
|
@@ -54,8 +65,14 @@ Object.defineProperty(exports, "TokenFeatureType", { enumerable: true, get: func
|
|
|
54
65
|
var bridge_asset_1 = require("./validators/bridge-asset.cjs");
|
|
55
66
|
Object.defineProperty(exports, "BridgeAssetSchema", { enumerable: true, get: function () { return bridge_asset_1.BridgeAssetSchema; } });
|
|
56
67
|
Object.defineProperty(exports, "validateBridgeAsset", { enumerable: true, get: function () { return bridge_asset_1.validateBridgeAsset; } });
|
|
68
|
+
Object.defineProperty(exports, "validateBridgeAssetV2", { enumerable: true, get: function () { return bridge_asset_1.validateBridgeAssetV2; } });
|
|
69
|
+
Object.defineProperty(exports, "MinimalAssetSchema", { enumerable: true, get: function () { return bridge_asset_1.MinimalAssetSchema; } });
|
|
70
|
+
Object.defineProperty(exports, "BridgeAssetV2Schema", { enumerable: true, get: function () { return bridge_asset_1.BridgeAssetV2Schema; } });
|
|
71
|
+
Object.defineProperty(exports, "BridgeAssetSecurityDataType", { enumerable: true, get: function () { return bridge_asset_1.BridgeAssetSecurityDataType; } });
|
|
57
72
|
var feature_flags_1 = require("./validators/feature-flags.cjs");
|
|
58
73
|
Object.defineProperty(exports, "FeatureId", { enumerable: true, get: function () { return feature_flags_1.FeatureId; } });
|
|
74
|
+
var quote_response_v1_to_v2_2 = require("./coercers/quote-response-v1-to-v2.cjs");
|
|
75
|
+
Object.defineProperty(exports, "toBridgeAssetV2", { enumerable: true, get: function () { return quote_response_v1_to_v2_2.toBridgeAssetV2; } });
|
|
59
76
|
var bridge_1 = require("./constants/bridge.cjs");
|
|
60
77
|
Object.defineProperty(exports, "ALLOWED_BRIDGE_CHAIN_IDS", { enumerable: true, get: function () { return bridge_1.ALLOWED_BRIDGE_CHAIN_IDS; } });
|
|
61
78
|
Object.defineProperty(exports, "BridgeClientId", { enumerable: true, get: function () { return bridge_1.BridgeClientId; } });
|