@metamask-previews/bridge-controller 19.0.0-preview-debb301 → 19.0.0-preview-836a8df
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bridge-controller.cjs +12 -24
- package/dist/bridge-controller.cjs.map +1 -1
- package/dist/bridge-controller.d.cts +4 -1
- package/dist/bridge-controller.d.cts.map +1 -1
- package/dist/bridge-controller.d.mts +4 -1
- package/dist/bridge-controller.d.mts.map +1 -1
- package/dist/bridge-controller.mjs +13 -25
- package/dist/bridge-controller.mjs.map +1 -1
- package/dist/constants/bridge.cjs +0 -1
- package/dist/constants/bridge.cjs.map +1 -1
- package/dist/constants/bridge.d.cts.map +1 -1
- package/dist/constants/bridge.d.mts.map +1 -1
- package/dist/constants/bridge.mjs +0 -1
- package/dist/constants/bridge.mjs.map +1 -1
- package/dist/index.cjs +2 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -3
- package/dist/index.mjs.map +1 -1
- package/dist/selectors.cjs +32 -9
- package/dist/selectors.cjs.map +1 -1
- package/dist/selectors.d.cts +236 -5
- package/dist/selectors.d.cts.map +1 -1
- package/dist/selectors.d.mts +236 -5
- package/dist/selectors.d.mts.map +1 -1
- package/dist/selectors.mjs +31 -8
- package/dist/selectors.mjs.map +1 -1
- package/dist/types.cjs +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +2 -3
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +2 -3
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/feature-flags.cjs +26 -4
- package/dist/utils/feature-flags.cjs.map +1 -1
- package/dist/utils/feature-flags.d.cts +10 -2
- package/dist/utils/feature-flags.d.cts.map +1 -1
- package/dist/utils/feature-flags.d.mts +10 -2
- package/dist/utils/feature-flags.d.mts.map +1 -1
- package/dist/utils/feature-flags.mjs +23 -3
- package/dist/utils/feature-flags.mjs.map +1 -1
- package/dist/utils/fetch.cjs +1 -19
- package/dist/utils/fetch.cjs.map +1 -1
- package/dist/utils/fetch.d.cts +1 -8
- package/dist/utils/fetch.d.cts.map +1 -1
- package/dist/utils/fetch.d.mts +1 -8
- package/dist/utils/fetch.d.mts.map +1 -1
- package/dist/utils/fetch.mjs +1 -18
- package/dist/utils/fetch.mjs.map +1 -1
- package/package.json +1 -1
package/dist/selectors.d.mts
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import type { CurrencyRateState, MultichainAssetsRatesControllerState, TokenRatesControllerState } from "@metamask/assets-controllers";
|
2
2
|
import type { GasFeeEstimates } from "@metamask/gas-fee-controller";
|
3
|
+
import type { Json } from "@metamask/utils";
|
3
4
|
import type { BridgeControllerState, ExchangeRate, GenericQuoteRequest, QuoteMetadata, QuoteResponse } from "./types.mjs";
|
4
5
|
import { SortOrder } from "./types.mjs";
|
5
6
|
/**
|
@@ -13,6 +14,8 @@ export type BridgeAppState = BridgeControllerState & {
|
|
13
14
|
gasFeeEstimates: GasFeeEstimates;
|
14
15
|
} & ExchangeRateControllerState & {
|
15
16
|
participateInMetaMetrics: boolean;
|
17
|
+
} & {
|
18
|
+
bridgeConfig: Json;
|
16
19
|
};
|
17
20
|
/**
|
18
21
|
* Required parameters that clients must provide for the bridge quotes selector
|
@@ -21,6 +24,52 @@ type BridgeQuotesClientParams = {
|
|
21
24
|
sortOrder: SortOrder;
|
22
25
|
selectedQuote: (QuoteResponse & QuoteMetadata) | null;
|
23
26
|
};
|
27
|
+
/**
|
28
|
+
* Selects the bridge feature flags
|
29
|
+
*
|
30
|
+
* @param state - The state of the bridge controller
|
31
|
+
* @returns The bridge feature flags
|
32
|
+
*
|
33
|
+
* @example
|
34
|
+
* ```ts
|
35
|
+
* const featureFlags = useSelector(state => selectBridgeFeatureFlags(state));
|
36
|
+
*
|
37
|
+
* Or
|
38
|
+
*
|
39
|
+
* export const selectBridgeFeatureFlags = createSelector(
|
40
|
+
* selectRemoteFeatureFlags,
|
41
|
+
* (remoteFeatureFlags) =>
|
42
|
+
* selectBridgeFeatureFlagsBase({
|
43
|
+
* bridgeConfig: remoteFeatureFlags.bridgeConfig,
|
44
|
+
* }),
|
45
|
+
* );
|
46
|
+
* ```
|
47
|
+
*/
|
48
|
+
export declare const selectBridgeFeatureFlags: ((state: {
|
49
|
+
bridgeConfig: unknown;
|
50
|
+
}) => import("./types.mjs").FeatureFlagsPlatformConfig) & {
|
51
|
+
clearCache: () => void;
|
52
|
+
resultsCount: () => number;
|
53
|
+
resetResultsCount: () => void;
|
54
|
+
} & {
|
55
|
+
resultFunc: (resultFuncArgs_0: any) => import("./types.mjs").FeatureFlagsPlatformConfig;
|
56
|
+
memoizedResultFunc: ((resultFuncArgs_0: any) => import("./types.mjs").FeatureFlagsPlatformConfig) & {
|
57
|
+
clearCache: () => void;
|
58
|
+
resultsCount: () => number;
|
59
|
+
resetResultsCount: () => void;
|
60
|
+
};
|
61
|
+
lastResult: () => import("./types.mjs").FeatureFlagsPlatformConfig;
|
62
|
+
dependencies: [(state: {
|
63
|
+
bridgeConfig: unknown;
|
64
|
+
}) => unknown];
|
65
|
+
recomputations: () => number;
|
66
|
+
resetRecomputations: () => void;
|
67
|
+
dependencyRecomputations: () => number;
|
68
|
+
resetDependencyRecomputations: () => void;
|
69
|
+
} & {
|
70
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
71
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
72
|
+
};
|
24
73
|
/**
|
25
74
|
* Selects the asset exchange rate for a given chain and address
|
26
75
|
*
|
@@ -37,10 +86,14 @@ export declare const selectExchangeRateByChainIdAndAddress: (state: BridgeAppSta
|
|
37
86
|
* @returns Whether an exchange rate is available for the given chain and address
|
38
87
|
*/
|
39
88
|
export declare const selectIsAssetExchangeRateInState: (exchangeRateSources: ExchangeRateControllerState, chainId?: string | number | undefined, address?: string | undefined) => boolean;
|
40
|
-
export declare const selectIsQuoteExpired: ((state:
|
89
|
+
export declare const selectIsQuoteExpired: ((state: {
|
90
|
+
bridgeConfig: unknown;
|
91
|
+
} & BridgeControllerState & {
|
41
92
|
gasFeeEstimates: GasFeeEstimates;
|
42
93
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
43
94
|
participateInMetaMetrics: boolean;
|
95
|
+
} & {
|
96
|
+
bridgeConfig: Json;
|
44
97
|
}, __: any, currentTimeInMs: number) => boolean) & {
|
45
98
|
clearCache: () => void;
|
46
99
|
resultsCount: () => number;
|
@@ -53,10 +106,66 @@ export declare const selectIsQuoteExpired: ((state: BridgeControllerState & {
|
|
53
106
|
resetResultsCount: () => void;
|
54
107
|
};
|
55
108
|
lastResult: () => boolean;
|
56
|
-
dependencies: [(
|
109
|
+
dependencies: [((state: {
|
110
|
+
bridgeConfig: unknown;
|
111
|
+
} & BridgeControllerState & {
|
57
112
|
gasFeeEstimates: GasFeeEstimates;
|
58
113
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
59
114
|
participateInMetaMetrics: boolean;
|
115
|
+
} & {
|
116
|
+
bridgeConfig: Json;
|
117
|
+
}) => boolean) & {
|
118
|
+
clearCache: () => void;
|
119
|
+
resultsCount: () => number;
|
120
|
+
resetResultsCount: () => void;
|
121
|
+
} & {
|
122
|
+
resultFunc: (resultFuncArgs_0: import("./types.mjs").FeatureFlagsPlatformConfig, resultFuncArgs_1: boolean | undefined, resultFuncArgs_2: number) => boolean;
|
123
|
+
memoizedResultFunc: ((resultFuncArgs_0: import("./types.mjs").FeatureFlagsPlatformConfig, resultFuncArgs_1: boolean | undefined, resultFuncArgs_2: number) => boolean) & {
|
124
|
+
clearCache: () => void;
|
125
|
+
resultsCount: () => number;
|
126
|
+
resetResultsCount: () => void;
|
127
|
+
};
|
128
|
+
lastResult: () => boolean;
|
129
|
+
dependencies: [((state: {
|
130
|
+
bridgeConfig: unknown;
|
131
|
+
}) => import("./types.mjs").FeatureFlagsPlatformConfig) & {
|
132
|
+
clearCache: () => void;
|
133
|
+
resultsCount: () => number;
|
134
|
+
resetResultsCount: () => void;
|
135
|
+
} & {
|
136
|
+
resultFunc: (resultFuncArgs_0: any) => import("./types.mjs").FeatureFlagsPlatformConfig;
|
137
|
+
memoizedResultFunc: ((resultFuncArgs_0: any) => import("./types.mjs").FeatureFlagsPlatformConfig) & {
|
138
|
+
clearCache: () => void;
|
139
|
+
resultsCount: () => number;
|
140
|
+
resetResultsCount: () => void;
|
141
|
+
};
|
142
|
+
lastResult: () => import("./types.mjs").FeatureFlagsPlatformConfig;
|
143
|
+
dependencies: [(state: {
|
144
|
+
bridgeConfig: unknown;
|
145
|
+
}) => unknown];
|
146
|
+
recomputations: () => number;
|
147
|
+
resetRecomputations: () => void;
|
148
|
+
dependencyRecomputations: () => number;
|
149
|
+
resetDependencyRecomputations: () => void;
|
150
|
+
} & {
|
151
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
152
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
153
|
+
}, (state: BridgeAppState) => boolean | undefined, (state: BridgeAppState) => number];
|
154
|
+
recomputations: () => number;
|
155
|
+
resetRecomputations: () => void;
|
156
|
+
dependencyRecomputations: () => number;
|
157
|
+
resetDependencyRecomputations: () => void;
|
158
|
+
} & {
|
159
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
160
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
161
|
+
}, ({ quotesLastFetched }: BridgeAppState) => number | null, ((state: {
|
162
|
+
bridgeConfig: unknown;
|
163
|
+
} & BridgeControllerState & {
|
164
|
+
gasFeeEstimates: GasFeeEstimates;
|
165
|
+
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
166
|
+
participateInMetaMetrics: boolean;
|
167
|
+
} & {
|
168
|
+
bridgeConfig: Json;
|
60
169
|
}) => number) & {
|
61
170
|
clearCache: () => void;
|
62
171
|
resultsCount: () => number;
|
@@ -69,7 +178,31 @@ export declare const selectIsQuoteExpired: ((state: BridgeControllerState & {
|
|
69
178
|
resetResultsCount: () => void;
|
70
179
|
};
|
71
180
|
lastResult: () => number;
|
72
|
-
dependencies: [(
|
181
|
+
dependencies: [((state: {
|
182
|
+
bridgeConfig: unknown;
|
183
|
+
}) => import("./types.mjs").FeatureFlagsPlatformConfig) & {
|
184
|
+
clearCache: () => void;
|
185
|
+
resultsCount: () => number;
|
186
|
+
resetResultsCount: () => void;
|
187
|
+
} & {
|
188
|
+
resultFunc: (resultFuncArgs_0: any) => import("./types.mjs").FeatureFlagsPlatformConfig;
|
189
|
+
memoizedResultFunc: ((resultFuncArgs_0: any) => import("./types.mjs").FeatureFlagsPlatformConfig) & {
|
190
|
+
clearCache: () => void;
|
191
|
+
resultsCount: () => number;
|
192
|
+
resetResultsCount: () => void;
|
193
|
+
};
|
194
|
+
lastResult: () => import("./types.mjs").FeatureFlagsPlatformConfig;
|
195
|
+
dependencies: [(state: {
|
196
|
+
bridgeConfig: unknown;
|
197
|
+
}) => unknown];
|
198
|
+
recomputations: () => number;
|
199
|
+
resetRecomputations: () => void;
|
200
|
+
dependencyRecomputations: () => number;
|
201
|
+
resetDependencyRecomputations: () => void;
|
202
|
+
} & {
|
203
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
204
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
205
|
+
}, (state: BridgeAppState) => string | number | undefined];
|
73
206
|
recomputations: () => number;
|
74
207
|
resetRecomputations: () => void;
|
75
208
|
dependencyRecomputations: () => number;
|
@@ -97,7 +230,7 @@ export declare const selectIsQuoteExpired: ((state: BridgeControllerState & {
|
|
97
230
|
* @example
|
98
231
|
* ```ts
|
99
232
|
* const quotes = useSelector(state => selectBridgeQuotes(
|
100
|
-
* state.metamask,
|
233
|
+
* { ...state.metamask, bridgeConfig: remoteFeatureFlags.bridgeConfig },
|
101
234
|
* {
|
102
235
|
* sortOrder: state.bridge.sortOrder,
|
103
236
|
* selectedQuote: state.bridge.selectedQuote,
|
@@ -109,6 +242,10 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
109
242
|
gasFeeEstimates: GasFeeEstimates;
|
110
243
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
111
244
|
participateInMetaMetrics: boolean;
|
245
|
+
} & {
|
246
|
+
bridgeConfig: Json;
|
247
|
+
} & {
|
248
|
+
bridgeConfig: unknown;
|
112
249
|
}, params_0: BridgeQuotesClientParams) => {
|
113
250
|
sortedQuotes: (QuoteResponse & QuoteMetadata)[];
|
114
251
|
recommendedQuote: (QuoteResponse & QuoteMetadata) | null;
|
@@ -165,6 +302,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
165
302
|
gasFeeEstimates: GasFeeEstimates;
|
166
303
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
167
304
|
participateInMetaMetrics: boolean;
|
305
|
+
} & {
|
306
|
+
bridgeConfig: Json;
|
168
307
|
}, params_0: BridgeQuotesClientParams) => (QuoteResponse & QuoteMetadata)[]) & {
|
169
308
|
clearCache: () => void;
|
170
309
|
resultsCount: () => number;
|
@@ -263,6 +402,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
263
402
|
gasFeeEstimates: GasFeeEstimates;
|
264
403
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
265
404
|
participateInMetaMetrics: boolean;
|
405
|
+
} & {
|
406
|
+
bridgeConfig: Json;
|
266
407
|
}) => {
|
267
408
|
sentAmount: {
|
268
409
|
amount: string;
|
@@ -451,6 +592,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
451
592
|
gasFeeEstimates: GasFeeEstimates;
|
452
593
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
453
594
|
participateInMetaMetrics: boolean;
|
595
|
+
} & {
|
596
|
+
bridgeConfig: Json;
|
454
597
|
}) => {
|
455
598
|
estimatedBaseFeeInDecGwei: string;
|
456
599
|
maxPriorityFeePerGasInDecGwei: string;
|
@@ -491,6 +634,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
491
634
|
gasFeeEstimates: GasFeeEstimates;
|
492
635
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
493
636
|
participateInMetaMetrics: boolean;
|
637
|
+
} & {
|
638
|
+
bridgeConfig: Json;
|
494
639
|
}) => ExchangeRate) & {
|
495
640
|
clearCache: () => void;
|
496
641
|
resultsCount: () => number;
|
@@ -515,6 +660,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
515
660
|
gasFeeEstimates: GasFeeEstimates;
|
516
661
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
517
662
|
participateInMetaMetrics: boolean;
|
663
|
+
} & {
|
664
|
+
bridgeConfig: Json;
|
518
665
|
}) => ExchangeRate) & {
|
519
666
|
clearCache: () => void;
|
520
667
|
resultsCount: () => number;
|
@@ -539,6 +686,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
539
686
|
gasFeeEstimates: GasFeeEstimates;
|
540
687
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
541
688
|
participateInMetaMetrics: boolean;
|
689
|
+
} & {
|
690
|
+
bridgeConfig: Json;
|
542
691
|
}) => ExchangeRate) & {
|
543
692
|
clearCache: () => void;
|
544
693
|
resultsCount: () => number;
|
@@ -579,6 +728,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
579
728
|
gasFeeEstimates: GasFeeEstimates;
|
580
729
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
581
730
|
participateInMetaMetrics: boolean;
|
731
|
+
} & {
|
732
|
+
bridgeConfig: Json;
|
582
733
|
}, params_0: BridgeQuotesClientParams) => (QuoteResponse & QuoteMetadata) | null) & {
|
583
734
|
clearCache: () => void;
|
584
735
|
resultsCount: () => number;
|
@@ -595,6 +746,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
595
746
|
gasFeeEstimates: GasFeeEstimates;
|
596
747
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
597
748
|
participateInMetaMetrics: boolean;
|
749
|
+
} & {
|
750
|
+
bridgeConfig: Json;
|
598
751
|
}, params_0: BridgeQuotesClientParams) => (QuoteResponse & QuoteMetadata)[]) & {
|
599
752
|
clearCache: () => void;
|
600
753
|
resultsCount: () => number;
|
@@ -693,6 +846,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
693
846
|
gasFeeEstimates: GasFeeEstimates;
|
694
847
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
695
848
|
participateInMetaMetrics: boolean;
|
849
|
+
} & {
|
850
|
+
bridgeConfig: Json;
|
696
851
|
}) => {
|
697
852
|
sentAmount: {
|
698
853
|
amount: string;
|
@@ -881,6 +1036,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
881
1036
|
gasFeeEstimates: GasFeeEstimates;
|
882
1037
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
883
1038
|
participateInMetaMetrics: boolean;
|
1039
|
+
} & {
|
1040
|
+
bridgeConfig: Json;
|
884
1041
|
}) => {
|
885
1042
|
estimatedBaseFeeInDecGwei: string;
|
886
1043
|
maxPriorityFeePerGasInDecGwei: string;
|
@@ -921,6 +1078,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
921
1078
|
gasFeeEstimates: GasFeeEstimates;
|
922
1079
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
923
1080
|
participateInMetaMetrics: boolean;
|
1081
|
+
} & {
|
1082
|
+
bridgeConfig: Json;
|
924
1083
|
}) => ExchangeRate) & {
|
925
1084
|
clearCache: () => void;
|
926
1085
|
resultsCount: () => number;
|
@@ -945,6 +1104,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
945
1104
|
gasFeeEstimates: GasFeeEstimates;
|
946
1105
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
947
1106
|
participateInMetaMetrics: boolean;
|
1107
|
+
} & {
|
1108
|
+
bridgeConfig: Json;
|
948
1109
|
}) => ExchangeRate) & {
|
949
1110
|
clearCache: () => void;
|
950
1111
|
resultsCount: () => number;
|
@@ -969,6 +1130,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
969
1130
|
gasFeeEstimates: GasFeeEstimates;
|
970
1131
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
971
1132
|
participateInMetaMetrics: boolean;
|
1133
|
+
} & {
|
1134
|
+
bridgeConfig: Json;
|
972
1135
|
}) => ExchangeRate) & {
|
973
1136
|
clearCache: () => void;
|
974
1137
|
resultsCount: () => number;
|
@@ -1017,6 +1180,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1017
1180
|
gasFeeEstimates: GasFeeEstimates;
|
1018
1181
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1019
1182
|
participateInMetaMetrics: boolean;
|
1183
|
+
} & {
|
1184
|
+
bridgeConfig: Json;
|
1020
1185
|
}, params_0: BridgeQuotesClientParams) => (QuoteResponse & QuoteMetadata) | null) & {
|
1021
1186
|
clearCache: () => void;
|
1022
1187
|
resultsCount: () => number;
|
@@ -1033,6 +1198,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1033
1198
|
gasFeeEstimates: GasFeeEstimates;
|
1034
1199
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1035
1200
|
participateInMetaMetrics: boolean;
|
1201
|
+
} & {
|
1202
|
+
bridgeConfig: Json;
|
1036
1203
|
}, params_0: BridgeQuotesClientParams) => (QuoteResponse & QuoteMetadata) | null) & {
|
1037
1204
|
clearCache: () => void;
|
1038
1205
|
resultsCount: () => number;
|
@@ -1049,6 +1216,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1049
1216
|
gasFeeEstimates: GasFeeEstimates;
|
1050
1217
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1051
1218
|
participateInMetaMetrics: boolean;
|
1219
|
+
} & {
|
1220
|
+
bridgeConfig: Json;
|
1052
1221
|
}, params_0: BridgeQuotesClientParams) => (QuoteResponse & QuoteMetadata)[]) & {
|
1053
1222
|
clearCache: () => void;
|
1054
1223
|
resultsCount: () => number;
|
@@ -1147,6 +1316,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1147
1316
|
gasFeeEstimates: GasFeeEstimates;
|
1148
1317
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1149
1318
|
participateInMetaMetrics: boolean;
|
1319
|
+
} & {
|
1320
|
+
bridgeConfig: Json;
|
1150
1321
|
}) => {
|
1151
1322
|
sentAmount: {
|
1152
1323
|
amount: string;
|
@@ -1335,6 +1506,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1335
1506
|
gasFeeEstimates: GasFeeEstimates;
|
1336
1507
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1337
1508
|
participateInMetaMetrics: boolean;
|
1509
|
+
} & {
|
1510
|
+
bridgeConfig: Json;
|
1338
1511
|
}) => {
|
1339
1512
|
estimatedBaseFeeInDecGwei: string;
|
1340
1513
|
maxPriorityFeePerGasInDecGwei: string;
|
@@ -1375,6 +1548,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1375
1548
|
gasFeeEstimates: GasFeeEstimates;
|
1376
1549
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1377
1550
|
participateInMetaMetrics: boolean;
|
1551
|
+
} & {
|
1552
|
+
bridgeConfig: Json;
|
1378
1553
|
}) => ExchangeRate) & {
|
1379
1554
|
clearCache: () => void;
|
1380
1555
|
resultsCount: () => number;
|
@@ -1399,6 +1574,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1399
1574
|
gasFeeEstimates: GasFeeEstimates;
|
1400
1575
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1401
1576
|
participateInMetaMetrics: boolean;
|
1577
|
+
} & {
|
1578
|
+
bridgeConfig: Json;
|
1402
1579
|
}) => ExchangeRate) & {
|
1403
1580
|
clearCache: () => void;
|
1404
1581
|
resultsCount: () => number;
|
@@ -1423,6 +1600,8 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1423
1600
|
gasFeeEstimates: GasFeeEstimates;
|
1424
1601
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1425
1602
|
participateInMetaMetrics: boolean;
|
1603
|
+
} & {
|
1604
|
+
bridgeConfig: Json;
|
1426
1605
|
}) => ExchangeRate) & {
|
1427
1606
|
clearCache: () => void;
|
1428
1607
|
resultsCount: () => number;
|
@@ -1475,7 +1654,59 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1475
1654
|
} & {
|
1476
1655
|
argsMemoize: typeof import("reselect").weakMapMemoize;
|
1477
1656
|
memoize: typeof import("reselect").weakMapMemoize;
|
1478
|
-
}, (state: BridgeAppState) => number | null, (state: BridgeAppState) => boolean, (state: BridgeAppState) => number | null, (state:
|
1657
|
+
}, (state: BridgeAppState) => number | null, (state: BridgeAppState) => boolean, (state: BridgeAppState) => number | null, ((state: {
|
1658
|
+
bridgeConfig: unknown;
|
1659
|
+
} & BridgeControllerState & {
|
1660
|
+
gasFeeEstimates: GasFeeEstimates;
|
1661
|
+
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1662
|
+
participateInMetaMetrics: boolean;
|
1663
|
+
} & {
|
1664
|
+
bridgeConfig: Json;
|
1665
|
+
}) => boolean) & {
|
1666
|
+
clearCache: () => void;
|
1667
|
+
resultsCount: () => number;
|
1668
|
+
resetResultsCount: () => void;
|
1669
|
+
} & {
|
1670
|
+
resultFunc: (resultFuncArgs_0: import("./types.mjs").FeatureFlagsPlatformConfig, resultFuncArgs_1: boolean | undefined, resultFuncArgs_2: number) => boolean;
|
1671
|
+
memoizedResultFunc: ((resultFuncArgs_0: import("./types.mjs").FeatureFlagsPlatformConfig, resultFuncArgs_1: boolean | undefined, resultFuncArgs_2: number) => boolean) & {
|
1672
|
+
clearCache: () => void;
|
1673
|
+
resultsCount: () => number;
|
1674
|
+
resetResultsCount: () => void;
|
1675
|
+
};
|
1676
|
+
lastResult: () => boolean;
|
1677
|
+
dependencies: [((state: {
|
1678
|
+
bridgeConfig: unknown;
|
1679
|
+
}) => import("./types.mjs").FeatureFlagsPlatformConfig) & {
|
1680
|
+
clearCache: () => void;
|
1681
|
+
resultsCount: () => number;
|
1682
|
+
resetResultsCount: () => void;
|
1683
|
+
} & {
|
1684
|
+
resultFunc: (resultFuncArgs_0: any) => import("./types.mjs").FeatureFlagsPlatformConfig;
|
1685
|
+
memoizedResultFunc: ((resultFuncArgs_0: any) => import("./types.mjs").FeatureFlagsPlatformConfig) & {
|
1686
|
+
clearCache: () => void;
|
1687
|
+
resultsCount: () => number;
|
1688
|
+
resetResultsCount: () => void;
|
1689
|
+
};
|
1690
|
+
lastResult: () => import("./types.mjs").FeatureFlagsPlatformConfig;
|
1691
|
+
dependencies: [(state: {
|
1692
|
+
bridgeConfig: unknown;
|
1693
|
+
}) => unknown];
|
1694
|
+
recomputations: () => number;
|
1695
|
+
resetRecomputations: () => void;
|
1696
|
+
dependencyRecomputations: () => number;
|
1697
|
+
resetDependencyRecomputations: () => void;
|
1698
|
+
} & {
|
1699
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
1700
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
1701
|
+
}, (state: BridgeAppState) => boolean | undefined, (state: BridgeAppState) => number];
|
1702
|
+
recomputations: () => number;
|
1703
|
+
resetRecomputations: () => void;
|
1704
|
+
dependencyRecomputations: () => number;
|
1705
|
+
resetDependencyRecomputations: () => void;
|
1706
|
+
} & {
|
1707
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
1708
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
1709
|
+
}];
|
1479
1710
|
recomputations: () => number;
|
1480
1711
|
resetRecomputations: () => void;
|
1481
1712
|
dependencyRecomputations: () => number;
|
package/dist/selectors.d.mts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"selectors.d.mts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,oCAAoC,EACpC,yBAAyB,EAC1B,qCAAqC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,qCAAqC;
|
1
|
+
{"version":3,"file":"selectors.d.mts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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"}
|
package/dist/selectors.mjs
CHANGED
@@ -7,6 +7,7 @@ import { BRIDGE_PREFERRED_GAS_ESTIMATE } from "./constants/bridge.mjs";
|
|
7
7
|
import { RequestStatus, SortOrder } from "./types.mjs";
|
8
8
|
import { getNativeAssetForChainId, isNativeAddress, isSolanaChainId } from "./utils/bridge.mjs";
|
9
9
|
import { formatAddressToAssetId, formatChainIdToCaip, formatChainIdToHex } from "./utils/caip-formatters.mjs";
|
10
|
+
import { processFeatureFlags } from "./utils/feature-flags.mjs";
|
10
11
|
import { calcAdjustedReturn, calcCost, calcEstimatedAndMaxTotalGasFee, calcRelayerFee, calcSentAmount, calcSolanaTotalNetworkFee, calcSwapRate, calcToAmount, calcTotalEstimatedNetworkFee, calcTotalMaxNetworkFee } from "./utils/quote.mjs";
|
11
12
|
/**
|
12
13
|
* Creates a structured selector for the bridge controller
|
@@ -16,6 +17,29 @@ const createStructuredBridgeSelector = createStructuredSelector_.withTypes();
|
|
16
17
|
* Creates a typed selector for the bridge controller
|
17
18
|
*/
|
18
19
|
const createBridgeSelector = createSelector_.withTypes();
|
20
|
+
const createFeatureFlagsSelector = createSelector_.withTypes();
|
21
|
+
/**
|
22
|
+
* Selects the bridge feature flags
|
23
|
+
*
|
24
|
+
* @param state - The state of the bridge controller
|
25
|
+
* @returns The bridge feature flags
|
26
|
+
*
|
27
|
+
* @example
|
28
|
+
* ```ts
|
29
|
+
* const featureFlags = useSelector(state => selectBridgeFeatureFlags(state));
|
30
|
+
*
|
31
|
+
* Or
|
32
|
+
*
|
33
|
+
* export const selectBridgeFeatureFlags = createSelector(
|
34
|
+
* selectRemoteFeatureFlags,
|
35
|
+
* (remoteFeatureFlags) =>
|
36
|
+
* selectBridgeFeatureFlagsBase({
|
37
|
+
* bridgeConfig: remoteFeatureFlags.bridgeConfig,
|
38
|
+
* }),
|
39
|
+
* );
|
40
|
+
* ```
|
41
|
+
*/
|
42
|
+
export const selectBridgeFeatureFlags = createFeatureFlagsSelector([(state) => state.bridgeConfig], (bridgeConfig) => processFeatureFlags(bridgeConfig));
|
19
43
|
const getExchangeRateByChainIdAndAddress = (exchangeRateSources, chainId, address) => {
|
20
44
|
if (!chainId || !address) {
|
21
45
|
return {};
|
@@ -168,13 +192,12 @@ const selectActiveQuote = createBridgeSelector([
|
|
168
192
|
selectRecommendedQuote,
|
169
193
|
(_, { selectedQuote }) => selectedQuote,
|
170
194
|
], (recommendedQuote, selectedQuote) => selectedQuote ?? recommendedQuote);
|
171
|
-
const selectIsQuoteGoingToRefresh = (
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
], (featureFlags, srcChainId) => (srcChainId
|
195
|
+
const selectIsQuoteGoingToRefresh = createBridgeSelector([
|
196
|
+
selectBridgeFeatureFlags,
|
197
|
+
(state) => state.quoteRequest.insufficientBal,
|
198
|
+
(state) => state.quotesRefreshCount,
|
199
|
+
], (featureFlags, insufficientBal, quotesRefreshCount) => insufficientBal ? false : featureFlags.maxRefreshCount > quotesRefreshCount);
|
200
|
+
const selectQuoteRefreshRate = createBridgeSelector([selectBridgeFeatureFlags, (state) => state.quoteRequest.srcChainId], (featureFlags, srcChainId) => (srcChainId
|
178
201
|
? featureFlags.chains[formatChainIdToCaip(srcChainId)]?.refreshRate
|
179
202
|
: featureFlags.refreshRate) ?? featureFlags.refreshRate);
|
180
203
|
export const selectIsQuoteExpired = createBridgeSelector([
|
@@ -196,7 +219,7 @@ export const selectIsQuoteExpired = createBridgeSelector([
|
|
196
219
|
* @example
|
197
220
|
* ```ts
|
198
221
|
* const quotes = useSelector(state => selectBridgeQuotes(
|
199
|
-
* state.metamask,
|
222
|
+
* { ...state.metamask, bridgeConfig: remoteFeatureFlags.bridgeConfig },
|
200
223
|
* {
|
201
224
|
* sortOrder: state.bridge.sortOrder,
|
202
225
|
* selectedQuote: state.bridge.selectedQuote,
|
package/dist/selectors.mjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"selectors.mjs","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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","sourcesContent":["import { AddressZero } from '@ethersproject/constants';\nimport type {\n CurrencyRateState,\n MultichainAssetsRatesControllerState,\n TokenRatesControllerState,\n} from '@metamask/assets-controllers';\nimport type { GasFeeEstimates } from '@metamask/gas-fee-controller';\nimport type { CaipAssetType } from '@metamask/utils';\nimport { isStrictHexString } from '@metamask/utils';\nimport { orderBy } from 'lodash';\nimport {\n createSelector as createSelector_,\n createStructuredSelector as createStructuredSelector_,\n} from 'reselect';\n\nimport { BRIDGE_PREFERRED_GAS_ESTIMATE } from './constants/bridge';\nimport type {\n BridgeControllerState,\n ExchangeRate,\n GenericQuoteRequest,\n QuoteMetadata,\n QuoteResponse,\n} from './types';\nimport { RequestStatus, SortOrder } from './types';\nimport {\n getNativeAssetForChainId,\n isNativeAddress,\n isSolanaChainId,\n} from './utils/bridge';\nimport {\n formatAddressToAssetId,\n formatChainIdToCaip,\n formatChainIdToHex,\n} from './utils/caip-formatters';\nimport {\n calcAdjustedReturn,\n calcCost,\n calcEstimatedAndMaxTotalGasFee,\n calcRelayerFee,\n calcSentAmount,\n calcSolanaTotalNetworkFee,\n calcSwapRate,\n calcToAmount,\n calcTotalEstimatedNetworkFee,\n calcTotalMaxNetworkFee,\n} from './utils/quote';\n\n/**\n * The controller states that provide exchange rates\n */\ntype ExchangeRateControllerState = MultichainAssetsRatesControllerState &\n TokenRatesControllerState &\n CurrencyRateState &\n Pick<BridgeControllerState, 'assetExchangeRates'>;\n/**\n * The state of the bridge controller and all its dependency controllers\n */\nexport type BridgeAppState = BridgeControllerState & {\n gasFeeEstimates: GasFeeEstimates;\n} & ExchangeRateControllerState & {\n participateInMetaMetrics: boolean;\n };\n/**\n * Creates a structured selector for the bridge controller\n */\nconst createStructuredBridgeSelector =\n createStructuredSelector_.withTypes<BridgeAppState>();\n/**\n * Creates a typed selector for the bridge controller\n */\nconst createBridgeSelector = createSelector_.withTypes<BridgeAppState>();\n/**\n * Required parameters that clients must provide for the bridge quotes selector\n */\ntype BridgeQuotesClientParams = {\n sortOrder: SortOrder;\n selectedQuote: (QuoteResponse & QuoteMetadata) | null;\n};\n\nconst getExchangeRateByChainIdAndAddress = (\n exchangeRateSources: ExchangeRateControllerState,\n chainId?: GenericQuoteRequest['srcChainId'],\n address?: GenericQuoteRequest['srcTokenAddress'],\n): ExchangeRate => {\n if (!chainId || !address) {\n return {};\n }\n // TODO return usd exchange rate if user has opted into metrics\n const assetId = formatAddressToAssetId(address, chainId);\n if (!assetId) {\n return {};\n }\n\n const { assetExchangeRates, currencyRates, marketData, conversionRates } =\n exchangeRateSources;\n\n // If the asset exchange rate is available in the bridge controller, use it\n // This is defined if the token's rate is not available from the assets controllers\n const bridgeControllerRate =\n assetExchangeRates?.[assetId] ??\n assetExchangeRates?.[assetId.toLowerCase() as CaipAssetType];\n if (bridgeControllerRate?.exchangeRate) {\n return bridgeControllerRate;\n }\n // If the chain is a Solana chain, use the conversion rate from the multichain assets controller\n if (isSolanaChainId(chainId)) {\n const multichainAssetExchangeRate = conversionRates?.[assetId];\n if (multichainAssetExchangeRate) {\n return {\n exchangeRate: multichainAssetExchangeRate.rate,\n usdExchangeRate: undefined,\n };\n }\n return {};\n }\n // If the chain is an EVM chain, use the conversion rate from the currency rates controller\n if (isNativeAddress(address)) {\n const { symbol } = getNativeAssetForChainId(chainId);\n const evmNativeExchangeRate = currencyRates?.[symbol];\n if (evmNativeExchangeRate) {\n return {\n exchangeRate: evmNativeExchangeRate?.conversionRate?.toString(),\n usdExchangeRate: evmNativeExchangeRate?.usdConversionRate?.toString(),\n };\n }\n return {};\n }\n // If the chain is an EVM chain and the asset is not the native asset, use the conversion rate from the token rates controller\n const evmTokenExchangeRates = marketData?.[formatChainIdToHex(chainId)];\n const evmTokenExchangeRateForAddress = isStrictHexString(address)\n ? evmTokenExchangeRates?.[address]\n : null;\n if (evmTokenExchangeRateForAddress) {\n return {\n exchangeRate: evmTokenExchangeRateForAddress?.price.toString(),\n usdExchangeRate: undefined,\n };\n }\n\n return {};\n};\n\n/**\n * Selects the asset exchange rate for a given chain and address\n *\n * @param state The state of the bridge controller and its dependency controllers\n * @param chainId The chain ID of the asset\n * @param address The address of the asset\n * @returns The asset exchange rate for the given chain and address\n */\nexport const selectExchangeRateByChainIdAndAddress = (\n state: BridgeAppState,\n chainId?: GenericQuoteRequest['srcChainId'],\n address?: GenericQuoteRequest['srcTokenAddress'],\n) => {\n return getExchangeRateByChainIdAndAddress(state, chainId, address);\n};\n\n/**\n * Checks whether an exchange rate is available for a given chain and address\n *\n * @param params The parameters to pass to {@link getExchangeRateByChainIdAndAddress}\n * @returns Whether an exchange rate is available for the given chain and address\n */\nexport const selectIsAssetExchangeRateInState = (\n ...params: Parameters<typeof getExchangeRateByChainIdAndAddress>\n) =>\n Boolean(getExchangeRateByChainIdAndAddress(...params)?.exchangeRate) &&\n Boolean(getExchangeRateByChainIdAndAddress(...params)?.usdExchangeRate);\n\n/**\n * Selects the gas fee estimates from the gas fee controller. All potential networks\n * support EIP1559 gas fees so assume that gasFeeEstimates is of type GasFeeEstimates\n *\n * @returns The gas fee estimates in decGWEI\n */\nconst selectBridgeFeesPerGas = createStructuredBridgeSelector({\n estimatedBaseFeeInDecGwei: ({ gasFeeEstimates }) =>\n gasFeeEstimates?.estimatedBaseFee,\n maxPriorityFeePerGasInDecGwei: ({ gasFeeEstimates }) =>\n gasFeeEstimates?.[BRIDGE_PREFERRED_GAS_ESTIMATE]\n ?.suggestedMaxPriorityFeePerGas,\n maxFeePerGasInDecGwei: ({ gasFeeEstimates }) =>\n gasFeeEstimates?.high?.suggestedMaxFeePerGas,\n});\n\n// Selects cross-chain swap quotes including their metadata\nconst selectBridgeQuotesWithMetadata = createBridgeSelector(\n [\n ({ quotes }) => quotes,\n selectBridgeFeesPerGas,\n createBridgeSelector(\n [\n (state) => state,\n ({ quoteRequest: { srcChainId } }) => srcChainId,\n ({ quoteRequest: { srcTokenAddress } }) => srcTokenAddress,\n ],\n selectExchangeRateByChainIdAndAddress,\n ),\n createBridgeSelector(\n [\n (state) => state,\n ({ quoteRequest: { destChainId } }) => destChainId,\n ({ quoteRequest: { destTokenAddress } }) => destTokenAddress,\n ],\n selectExchangeRateByChainIdAndAddress,\n ),\n createBridgeSelector(\n [(state) => state, ({ quoteRequest: { srcChainId } }) => srcChainId],\n (state, chainId) =>\n selectExchangeRateByChainIdAndAddress(state, chainId, AddressZero),\n ),\n ],\n (\n quotes,\n bridgeFeesPerGas,\n srcTokenExchangeRate,\n destTokenExchangeRate,\n nativeExchangeRate,\n ) => {\n const newQuotes = quotes.map((quote) => {\n const sentAmount = calcSentAmount(quote.quote, srcTokenExchangeRate);\n const toTokenAmount = calcToAmount(quote.quote, destTokenExchangeRate);\n\n let totalEstimatedNetworkFee, gasFee, totalMaxNetworkFee, relayerFee;\n\n if (isSolanaChainId(quote.quote.srcChainId)) {\n totalEstimatedNetworkFee = calcSolanaTotalNetworkFee(\n quote,\n nativeExchangeRate,\n );\n gasFee = totalEstimatedNetworkFee;\n totalMaxNetworkFee = totalEstimatedNetworkFee;\n } else {\n relayerFee = calcRelayerFee(quote, nativeExchangeRate);\n gasFee = calcEstimatedAndMaxTotalGasFee({\n bridgeQuote: quote,\n ...bridgeFeesPerGas,\n ...nativeExchangeRate,\n });\n totalEstimatedNetworkFee = calcTotalEstimatedNetworkFee(\n gasFee,\n relayerFee,\n );\n totalMaxNetworkFee = calcTotalMaxNetworkFee(gasFee, relayerFee);\n }\n\n const adjustedReturn = calcAdjustedReturn(\n toTokenAmount,\n totalEstimatedNetworkFee,\n );\n const cost = calcCost(adjustedReturn, sentAmount);\n\n return {\n ...quote,\n // QuoteMetadata fields\n sentAmount,\n toTokenAmount,\n swapRate: calcSwapRate(sentAmount.amount, toTokenAmount.amount),\n totalNetworkFee: totalEstimatedNetworkFee,\n totalMaxNetworkFee,\n gasFee,\n adjustedReturn,\n cost,\n };\n });\n\n return newQuotes;\n },\n);\n\nconst selectSortedBridgeQuotes = createBridgeSelector(\n [\n selectBridgeQuotesWithMetadata,\n (_, { sortOrder }: BridgeQuotesClientParams) => sortOrder,\n ],\n (quotesWithMetadata, sortOrder): (QuoteResponse & QuoteMetadata)[] => {\n switch (sortOrder) {\n case SortOrder.ETA_ASC:\n return orderBy(\n quotesWithMetadata,\n (quote) => quote.estimatedProcessingTimeInSeconds,\n 'asc',\n );\n default:\n return orderBy(\n quotesWithMetadata,\n ({ cost }) =>\n cost.valueInCurrency ? Number(cost.valueInCurrency) : 0,\n 'asc',\n );\n }\n },\n);\n\nconst selectRecommendedQuote = createBridgeSelector(\n [selectSortedBridgeQuotes],\n (quotes) => (quotes.length > 0 ? quotes[0] : null),\n);\n\nconst selectActiveQuote = createBridgeSelector(\n [\n selectRecommendedQuote,\n (_, { selectedQuote }: BridgeQuotesClientParams) => selectedQuote,\n ],\n (recommendedQuote, selectedQuote) => selectedQuote ?? recommendedQuote,\n);\n\nconst selectIsQuoteGoingToRefresh = (state: BridgeAppState) =>\n state.quoteRequest.insufficientBal\n ? false\n : state.quotesRefreshCount < state.bridgeFeatureFlags.maxRefreshCount;\n\nconst selectQuoteRefreshRate = createBridgeSelector(\n [\n ({ bridgeFeatureFlags }) => bridgeFeatureFlags,\n (state) => state.quoteRequest.srcChainId,\n ],\n (featureFlags, srcChainId) =>\n (srcChainId\n ? featureFlags.chains[formatChainIdToCaip(srcChainId)]?.refreshRate\n : featureFlags.refreshRate) ?? featureFlags.refreshRate,\n);\n\nexport const selectIsQuoteExpired = createBridgeSelector(\n [\n selectIsQuoteGoingToRefresh,\n ({ quotesLastFetched }) => quotesLastFetched,\n selectQuoteRefreshRate,\n (_, __, currentTimeInMs: number) => currentTimeInMs,\n ],\n (isQuoteGoingToRefresh, quotesLastFetched, refreshRate, currentTimeInMs) =>\n Boolean(\n !isQuoteGoingToRefresh &&\n quotesLastFetched &&\n currentTimeInMs - quotesLastFetched > refreshRate,\n ),\n);\n\n/**\n * Selects sorted cross-chain swap quotes. By default, the quotes are sorted by cost in ascending order.\n *\n * @param state - The state of the bridge controller and its dependency controllers\n * @param sortOrder - The sort order of the quotes\n * @param selectedQuote - The quote that is currently selected by the user, should be cleared by clients when the req params change\n * @returns The activeQuote, recommendedQuote, sortedQuotes, and other quote fetching metadata\n *\n * @example\n * ```ts\n * const quotes = useSelector(state => selectBridgeQuotes(\n * state.metamask,\n * {\n * sortOrder: state.bridge.sortOrder,\n * selectedQuote: state.bridge.selectedQuote,\n * }\n * ));\n * ```\n */\nexport const selectBridgeQuotes = createStructuredBridgeSelector({\n sortedQuotes: selectSortedBridgeQuotes,\n recommendedQuote: selectRecommendedQuote,\n activeQuote: selectActiveQuote,\n quotesLastFetchedMs: (state) => state.quotesLastFetched,\n isLoading: (state) => state.quotesLoadingStatus === RequestStatus.LOADING,\n quoteFetchError: (state) => state.quoteFetchError,\n quotesRefreshCount: (state) => state.quotesRefreshCount,\n quotesInitialLoadTimeMs: (state) => state.quotesInitialLoadTime,\n isQuoteGoingToRefresh: selectIsQuoteGoingToRefresh,\n});\n"]}
|
1
|
+
{"version":3,"file":"selectors.mjs","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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","sourcesContent":["import { AddressZero } from '@ethersproject/constants';\nimport type {\n CurrencyRateState,\n MultichainAssetsRatesControllerState,\n TokenRatesControllerState,\n} from '@metamask/assets-controllers';\nimport type { GasFeeEstimates } from '@metamask/gas-fee-controller';\nimport type { CaipAssetType, Json } from '@metamask/utils';\nimport { isStrictHexString } from '@metamask/utils';\nimport { orderBy } from 'lodash';\nimport {\n createSelector as createSelector_,\n createStructuredSelector as createStructuredSelector_,\n} from 'reselect';\n\nimport { BRIDGE_PREFERRED_GAS_ESTIMATE } from './constants/bridge';\nimport type {\n BridgeControllerState,\n ExchangeRate,\n GenericQuoteRequest,\n QuoteMetadata,\n QuoteResponse,\n} from './types';\nimport { RequestStatus, SortOrder } from './types';\nimport {\n getNativeAssetForChainId,\n isNativeAddress,\n isSolanaChainId,\n} from './utils/bridge';\nimport {\n formatAddressToAssetId,\n formatChainIdToCaip,\n formatChainIdToHex,\n} from './utils/caip-formatters';\nimport { processFeatureFlags } from './utils/feature-flags';\nimport {\n calcAdjustedReturn,\n calcCost,\n calcEstimatedAndMaxTotalGasFee,\n calcRelayerFee,\n calcSentAmount,\n calcSolanaTotalNetworkFee,\n calcSwapRate,\n calcToAmount,\n calcTotalEstimatedNetworkFee,\n calcTotalMaxNetworkFee,\n} from './utils/quote';\n\n/**\n * The controller states that provide exchange rates\n */\ntype ExchangeRateControllerState = MultichainAssetsRatesControllerState &\n TokenRatesControllerState &\n CurrencyRateState &\n Pick<BridgeControllerState, 'assetExchangeRates'>;\n/**\n * The state of the bridge controller and all its dependency controllers\n */\nexport type BridgeAppState = BridgeControllerState & {\n gasFeeEstimates: GasFeeEstimates;\n} & ExchangeRateControllerState & {\n participateInMetaMetrics: boolean;\n } & { bridgeConfig: Json };\n\n/**\n * Creates a structured selector for the bridge controller\n */\nconst createStructuredBridgeSelector =\n createStructuredSelector_.withTypes<BridgeAppState>();\n/**\n * Creates a typed selector for the bridge controller\n */\nconst createBridgeSelector = createSelector_.withTypes<BridgeAppState>();\n/**\n * Required parameters that clients must provide for the bridge quotes selector\n */\ntype BridgeQuotesClientParams = {\n sortOrder: SortOrder;\n selectedQuote: (QuoteResponse & QuoteMetadata) | null;\n};\n\nconst createFeatureFlagsSelector = createSelector_.withTypes<{\n bridgeConfig: unknown;\n}>();\n\n/**\n * Selects the bridge feature flags\n *\n * @param state - The state of the bridge controller\n * @returns The bridge feature flags\n *\n * @example\n * ```ts\n * const featureFlags = useSelector(state => selectBridgeFeatureFlags(state));\n *\n * Or\n *\n * export const selectBridgeFeatureFlags = createSelector(\n * selectRemoteFeatureFlags,\n * (remoteFeatureFlags) =>\n * selectBridgeFeatureFlagsBase({\n * bridgeConfig: remoteFeatureFlags.bridgeConfig,\n * }),\n * );\n * ```\n */\nexport const selectBridgeFeatureFlags = createFeatureFlagsSelector(\n [(state) => state.bridgeConfig],\n (bridgeConfig: unknown) => processFeatureFlags(bridgeConfig),\n);\n\nconst getExchangeRateByChainIdAndAddress = (\n exchangeRateSources: ExchangeRateControllerState,\n chainId?: GenericQuoteRequest['srcChainId'],\n address?: GenericQuoteRequest['srcTokenAddress'],\n): ExchangeRate => {\n if (!chainId || !address) {\n return {};\n }\n // TODO return usd exchange rate if user has opted into metrics\n const assetId = formatAddressToAssetId(address, chainId);\n if (!assetId) {\n return {};\n }\n\n const { assetExchangeRates, currencyRates, marketData, conversionRates } =\n exchangeRateSources;\n\n // If the asset exchange rate is available in the bridge controller, use it\n // This is defined if the token's rate is not available from the assets controllers\n const bridgeControllerRate =\n assetExchangeRates?.[assetId] ??\n assetExchangeRates?.[assetId.toLowerCase() as CaipAssetType];\n if (bridgeControllerRate?.exchangeRate) {\n return bridgeControllerRate;\n }\n // If the chain is a Solana chain, use the conversion rate from the multichain assets controller\n if (isSolanaChainId(chainId)) {\n const multichainAssetExchangeRate = conversionRates?.[assetId];\n if (multichainAssetExchangeRate) {\n return {\n exchangeRate: multichainAssetExchangeRate.rate,\n usdExchangeRate: undefined,\n };\n }\n return {};\n }\n // If the chain is an EVM chain, use the conversion rate from the currency rates controller\n if (isNativeAddress(address)) {\n const { symbol } = getNativeAssetForChainId(chainId);\n const evmNativeExchangeRate = currencyRates?.[symbol];\n if (evmNativeExchangeRate) {\n return {\n exchangeRate: evmNativeExchangeRate?.conversionRate?.toString(),\n usdExchangeRate: evmNativeExchangeRate?.usdConversionRate?.toString(),\n };\n }\n return {};\n }\n // If the chain is an EVM chain and the asset is not the native asset, use the conversion rate from the token rates controller\n const evmTokenExchangeRates = marketData?.[formatChainIdToHex(chainId)];\n const evmTokenExchangeRateForAddress = isStrictHexString(address)\n ? evmTokenExchangeRates?.[address]\n : null;\n if (evmTokenExchangeRateForAddress) {\n return {\n exchangeRate: evmTokenExchangeRateForAddress?.price.toString(),\n usdExchangeRate: undefined,\n };\n }\n\n return {};\n};\n\n/**\n * Selects the asset exchange rate for a given chain and address\n *\n * @param state The state of the bridge controller and its dependency controllers\n * @param chainId The chain ID of the asset\n * @param address The address of the asset\n * @returns The asset exchange rate for the given chain and address\n */\nexport const selectExchangeRateByChainIdAndAddress = (\n state: BridgeAppState,\n chainId?: GenericQuoteRequest['srcChainId'],\n address?: GenericQuoteRequest['srcTokenAddress'],\n) => {\n return getExchangeRateByChainIdAndAddress(state, chainId, address);\n};\n\n/**\n * Checks whether an exchange rate is available for a given chain and address\n *\n * @param params The parameters to pass to {@link getExchangeRateByChainIdAndAddress}\n * @returns Whether an exchange rate is available for the given chain and address\n */\nexport const selectIsAssetExchangeRateInState = (\n ...params: Parameters<typeof getExchangeRateByChainIdAndAddress>\n) =>\n Boolean(getExchangeRateByChainIdAndAddress(...params)?.exchangeRate) &&\n Boolean(getExchangeRateByChainIdAndAddress(...params)?.usdExchangeRate);\n\n/**\n * Selects the gas fee estimates from the gas fee controller. All potential networks\n * support EIP1559 gas fees so assume that gasFeeEstimates is of type GasFeeEstimates\n *\n * @returns The gas fee estimates in decGWEI\n */\nconst selectBridgeFeesPerGas = createStructuredBridgeSelector({\n estimatedBaseFeeInDecGwei: ({ gasFeeEstimates }) =>\n gasFeeEstimates?.estimatedBaseFee,\n maxPriorityFeePerGasInDecGwei: ({ gasFeeEstimates }) =>\n gasFeeEstimates?.[BRIDGE_PREFERRED_GAS_ESTIMATE]\n ?.suggestedMaxPriorityFeePerGas,\n maxFeePerGasInDecGwei: ({ gasFeeEstimates }) =>\n gasFeeEstimates?.high?.suggestedMaxFeePerGas,\n});\n\n// Selects cross-chain swap quotes including their metadata\nconst selectBridgeQuotesWithMetadata = createBridgeSelector(\n [\n ({ quotes }) => quotes,\n selectBridgeFeesPerGas,\n createBridgeSelector(\n [\n (state) => state,\n ({ quoteRequest: { srcChainId } }) => srcChainId,\n ({ quoteRequest: { srcTokenAddress } }) => srcTokenAddress,\n ],\n selectExchangeRateByChainIdAndAddress,\n ),\n createBridgeSelector(\n [\n (state) => state,\n ({ quoteRequest: { destChainId } }) => destChainId,\n ({ quoteRequest: { destTokenAddress } }) => destTokenAddress,\n ],\n selectExchangeRateByChainIdAndAddress,\n ),\n createBridgeSelector(\n [(state) => state, ({ quoteRequest: { srcChainId } }) => srcChainId],\n (state, chainId) =>\n selectExchangeRateByChainIdAndAddress(state, chainId, AddressZero),\n ),\n ],\n (\n quotes,\n bridgeFeesPerGas,\n srcTokenExchangeRate,\n destTokenExchangeRate,\n nativeExchangeRate,\n ) => {\n const newQuotes = quotes.map((quote) => {\n const sentAmount = calcSentAmount(quote.quote, srcTokenExchangeRate);\n const toTokenAmount = calcToAmount(quote.quote, destTokenExchangeRate);\n\n let totalEstimatedNetworkFee, gasFee, totalMaxNetworkFee, relayerFee;\n\n if (isSolanaChainId(quote.quote.srcChainId)) {\n totalEstimatedNetworkFee = calcSolanaTotalNetworkFee(\n quote,\n nativeExchangeRate,\n );\n gasFee = totalEstimatedNetworkFee;\n totalMaxNetworkFee = totalEstimatedNetworkFee;\n } else {\n relayerFee = calcRelayerFee(quote, nativeExchangeRate);\n gasFee = calcEstimatedAndMaxTotalGasFee({\n bridgeQuote: quote,\n ...bridgeFeesPerGas,\n ...nativeExchangeRate,\n });\n totalEstimatedNetworkFee = calcTotalEstimatedNetworkFee(\n gasFee,\n relayerFee,\n );\n totalMaxNetworkFee = calcTotalMaxNetworkFee(gasFee, relayerFee);\n }\n\n const adjustedReturn = calcAdjustedReturn(\n toTokenAmount,\n totalEstimatedNetworkFee,\n );\n const cost = calcCost(adjustedReturn, sentAmount);\n\n return {\n ...quote,\n // QuoteMetadata fields\n sentAmount,\n toTokenAmount,\n swapRate: calcSwapRate(sentAmount.amount, toTokenAmount.amount),\n totalNetworkFee: totalEstimatedNetworkFee,\n totalMaxNetworkFee,\n gasFee,\n adjustedReturn,\n cost,\n };\n });\n\n return newQuotes;\n },\n);\n\nconst selectSortedBridgeQuotes = createBridgeSelector(\n [\n selectBridgeQuotesWithMetadata,\n (_, { sortOrder }: BridgeQuotesClientParams) => sortOrder,\n ],\n (quotesWithMetadata, sortOrder): (QuoteResponse & QuoteMetadata)[] => {\n switch (sortOrder) {\n case SortOrder.ETA_ASC:\n return orderBy(\n quotesWithMetadata,\n (quote) => quote.estimatedProcessingTimeInSeconds,\n 'asc',\n );\n default:\n return orderBy(\n quotesWithMetadata,\n ({ cost }) =>\n cost.valueInCurrency ? Number(cost.valueInCurrency) : 0,\n 'asc',\n );\n }\n },\n);\n\nconst selectRecommendedQuote = createBridgeSelector(\n [selectSortedBridgeQuotes],\n (quotes) => (quotes.length > 0 ? quotes[0] : null),\n);\n\nconst selectActiveQuote = createBridgeSelector(\n [\n selectRecommendedQuote,\n (_, { selectedQuote }: BridgeQuotesClientParams) => selectedQuote,\n ],\n (recommendedQuote, selectedQuote) => selectedQuote ?? recommendedQuote,\n);\n\nconst selectIsQuoteGoingToRefresh = createBridgeSelector(\n [\n selectBridgeFeatureFlags,\n (state) => state.quoteRequest.insufficientBal,\n (state) => state.quotesRefreshCount,\n ],\n (featureFlags, insufficientBal, quotesRefreshCount) =>\n insufficientBal ? false : featureFlags.maxRefreshCount > quotesRefreshCount,\n);\n\nconst selectQuoteRefreshRate = createBridgeSelector(\n [selectBridgeFeatureFlags, (state) => state.quoteRequest.srcChainId],\n (featureFlags, srcChainId) =>\n (srcChainId\n ? featureFlags.chains[formatChainIdToCaip(srcChainId)]?.refreshRate\n : featureFlags.refreshRate) ?? featureFlags.refreshRate,\n);\n\nexport const selectIsQuoteExpired = createBridgeSelector(\n [\n selectIsQuoteGoingToRefresh,\n ({ quotesLastFetched }) => quotesLastFetched,\n selectQuoteRefreshRate,\n (_, __, currentTimeInMs: number) => currentTimeInMs,\n ],\n (isQuoteGoingToRefresh, quotesLastFetched, refreshRate, currentTimeInMs) =>\n Boolean(\n !isQuoteGoingToRefresh &&\n quotesLastFetched &&\n currentTimeInMs - quotesLastFetched > refreshRate,\n ),\n);\n\n/**\n * Selects sorted cross-chain swap quotes. By default, the quotes are sorted by cost in ascending order.\n *\n * @param state - The state of the bridge controller and its dependency controllers\n * @param sortOrder - The sort order of the quotes\n * @param selectedQuote - The quote that is currently selected by the user, should be cleared by clients when the req params change\n * @returns The activeQuote, recommendedQuote, sortedQuotes, and other quote fetching metadata\n *\n * @example\n * ```ts\n * const quotes = useSelector(state => selectBridgeQuotes(\n * { ...state.metamask, bridgeConfig: remoteFeatureFlags.bridgeConfig },\n * {\n * sortOrder: state.bridge.sortOrder,\n * selectedQuote: state.bridge.selectedQuote,\n * }\n * ));\n * ```\n */\nexport const selectBridgeQuotes = createStructuredBridgeSelector({\n sortedQuotes: selectSortedBridgeQuotes,\n recommendedQuote: selectRecommendedQuote,\n activeQuote: selectActiveQuote,\n quotesLastFetchedMs: (state) => state.quotesLastFetched,\n isLoading: (state) => state.quotesLoadingStatus === RequestStatus.LOADING,\n quoteFetchError: (state) => state.quoteFetchError,\n quotesRefreshCount: (state) => state.quotesRefreshCount,\n quotesInitialLoadTimeMs: (state) => state.quotesInitialLoadTime,\n isQuoteGoingToRefresh: selectIsQuoteGoingToRefresh,\n});\n"]}
|
package/dist/types.cjs
CHANGED
@@ -70,7 +70,7 @@ var BridgeUserAction;
|
|
70
70
|
})(BridgeUserAction || (exports.BridgeUserAction = BridgeUserAction = {}));
|
71
71
|
var BridgeBackgroundAction;
|
72
72
|
(function (BridgeBackgroundAction) {
|
73
|
-
BridgeBackgroundAction["
|
73
|
+
BridgeBackgroundAction["SET_CHAIN_INTERVAL_LENGTH"] = "setChainIntervalLength";
|
74
74
|
BridgeBackgroundAction["RESET_STATE"] = "resetState";
|
75
75
|
BridgeBackgroundAction["GET_BRIDGE_ERC20_ALLOWANCE"] = "getBridgeERC20Allowance";
|
76
76
|
BridgeBackgroundAction["TRACK_METAMETRICS_EVENT"] = "trackUnifiedSwapBridgeEvent";
|