@metamask-previews/bridge-controller 19.0.0-preview-60adb80 → 19.0.0-preview-c8164dc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +0 -1
- package/dist/bridge-controller.cjs +25 -13
- package/dist/bridge-controller.cjs.map +1 -1
- package/dist/bridge-controller.d.cts +1 -4
- package/dist/bridge-controller.d.cts.map +1 -1
- package/dist/bridge-controller.d.mts +1 -4
- package/dist/bridge-controller.d.mts.map +1 -1
- package/dist/bridge-controller.mjs +27 -15
- package/dist/bridge-controller.mjs.map +1 -1
- package/dist/constants/bridge.cjs +5 -0
- 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 +5 -0
- package/dist/constants/bridge.mjs.map +1 -1
- package/dist/index.cjs +4 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/selectors.cjs +12 -32
- package/dist/selectors.cjs.map +1 -1
- package/dist/selectors.d.cts +49 -186
- package/dist/selectors.d.cts.map +1 -1
- package/dist/selectors.d.mts +49 -186
- package/dist/selectors.d.mts.map +1 -1
- package/dist/selectors.mjs +11 -31
- package/dist/selectors.mjs.map +1 -1
- package/dist/types.cjs +12 -2
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +21 -6
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +21 -6
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +11 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/fetch.cjs +40 -1
- package/dist/utils/fetch.cjs.map +1 -1
- package/dist/utils/fetch.d.cts +10 -1
- package/dist/utils/fetch.d.cts.map +1 -1
- package/dist/utils/fetch.d.mts +10 -1
- package/dist/utils/fetch.d.mts.map +1 -1
- package/dist/utils/fetch.mjs +40 -2
- package/dist/utils/fetch.mjs.map +1 -1
- package/dist/utils/validators.cjs +6 -2
- package/dist/utils/validators.cjs.map +1 -1
- package/dist/utils/validators.d.cts +2 -2
- package/dist/utils/validators.d.cts.map +1 -1
- package/dist/utils/validators.d.mts +2 -2
- package/dist/utils/validators.d.mts.map +1 -1
- package/dist/utils/validators.mjs +7 -3
- package/dist/utils/validators.mjs.map +1 -1
- package/package.json +1 -3
- package/dist/utils/feature-flags.cjs +0 -38
- package/dist/utils/feature-flags.cjs.map +0 -1
- package/dist/utils/feature-flags.d.cts +0 -16
- package/dist/utils/feature-flags.d.cts.map +0 -1
- package/dist/utils/feature-flags.d.mts +0 -16
- package/dist/utils/feature-flags.d.mts.map +0 -1
- package/dist/utils/feature-flags.mjs +0 -32
- package/dist/utils/feature-flags.mjs.map +0 -1
package/dist/selectors.d.mts
CHANGED
@@ -1,6 +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 { BridgeControllerState, ExchangeRate, GenericQuoteRequest, QuoteMetadata, QuoteResponse } from "./types.mjs";
|
3
|
+
import type { BridgeControllerState, BridgeFeatureFlagsKey, ExchangeRate, GenericQuoteRequest, QuoteMetadata, QuoteResponse } from "./types.mjs";
|
4
4
|
import { SortOrder } from "./types.mjs";
|
5
5
|
/**
|
6
6
|
* The controller states that provide exchange rates
|
@@ -9,64 +9,18 @@ type ExchangeRateControllerState = MultichainAssetsRatesControllerState & TokenR
|
|
9
9
|
/**
|
10
10
|
* The state of the bridge controller and all its dependency controllers
|
11
11
|
*/
|
12
|
-
type RemoteFeatureFlagControllerState = {
|
13
|
-
remoteFeatureFlags: {
|
14
|
-
bridgeConfig: unknown;
|
15
|
-
};
|
16
|
-
};
|
17
12
|
export type BridgeAppState = BridgeControllerState & {
|
18
13
|
gasFeeEstimates: GasFeeEstimates;
|
19
14
|
} & ExchangeRateControllerState & {
|
20
15
|
participateInMetaMetrics: boolean;
|
21
|
-
}
|
16
|
+
};
|
22
17
|
/**
|
23
18
|
* Required parameters that clients must provide for the bridge quotes selector
|
24
19
|
*/
|
25
20
|
type BridgeQuotesClientParams = {
|
26
21
|
sortOrder: SortOrder;
|
27
22
|
selectedQuote: (QuoteResponse & QuoteMetadata) | null;
|
28
|
-
|
29
|
-
/**
|
30
|
-
* Selects the bridge feature flags
|
31
|
-
*
|
32
|
-
* @param state - The state of the bridge controller
|
33
|
-
* @returns The bridge feature flags
|
34
|
-
*
|
35
|
-
* @example
|
36
|
-
* ```ts
|
37
|
-
* const featureFlags = useSelector(state => selectBridgeFeatureFlags(state));
|
38
|
-
*
|
39
|
-
* Or
|
40
|
-
*
|
41
|
-
* export const selectBridgeFeatureFlags = createSelector(
|
42
|
-
* selectRemoteFeatureFlags,
|
43
|
-
* (remoteFeatureFlags) =>
|
44
|
-
* selectBridgeFeatureFlagsBase({
|
45
|
-
* bridgeConfig: remoteFeatureFlags.bridgeConfig,
|
46
|
-
* }),
|
47
|
-
* );
|
48
|
-
* ```
|
49
|
-
*/
|
50
|
-
export declare const selectBridgeFeatureFlags: ((state: RemoteFeatureFlagControllerState) => 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: RemoteFeatureFlagControllerState) => unknown];
|
63
|
-
recomputations: () => number;
|
64
|
-
resetRecomputations: () => void;
|
65
|
-
dependencyRecomputations: () => number;
|
66
|
-
resetDependencyRecomputations: () => void;
|
67
|
-
} & {
|
68
|
-
argsMemoize: typeof import("reselect").weakMapMemoize;
|
69
|
-
memoize: typeof import("reselect").weakMapMemoize;
|
23
|
+
featureFlagsKey: BridgeFeatureFlagsKey;
|
70
24
|
};
|
71
25
|
/**
|
72
26
|
* Selects the asset exchange rate for a given chain and address
|
@@ -84,7 +38,7 @@ export declare const selectExchangeRateByChainIdAndAddress: (state: BridgeAppSta
|
|
84
38
|
* @returns Whether an exchange rate is available for the given chain and address
|
85
39
|
*/
|
86
40
|
export declare const selectIsAssetExchangeRateInState: (exchangeRateSources: ExchangeRateControllerState, chainId?: string | number | undefined, address?: string | undefined) => boolean;
|
87
|
-
export declare const selectIsQuoteExpired: ((state:
|
41
|
+
export declare const selectIsQuoteExpired: ((state: BridgeControllerState & {
|
88
42
|
gasFeeEstimates: GasFeeEstimates;
|
89
43
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
90
44
|
participateInMetaMetrics: boolean;
|
@@ -100,86 +54,37 @@ export declare const selectIsQuoteExpired: ((state: RemoteFeatureFlagControllerS
|
|
100
54
|
resetResultsCount: () => void;
|
101
55
|
};
|
102
56
|
lastResult: () => boolean;
|
103
|
-
dependencies: [(
|
57
|
+
dependencies: [(state: BridgeAppState, { featureFlagsKey }: BridgeQuotesClientParams) => boolean, ({ quotesLastFetched }: BridgeAppState) => number | null, ((state: BridgeControllerState & {
|
104
58
|
gasFeeEstimates: GasFeeEstimates;
|
105
59
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
106
60
|
participateInMetaMetrics: boolean;
|
107
|
-
}) =>
|
61
|
+
}, params_0: BridgeQuotesClientParams) => number) & {
|
108
62
|
clearCache: () => void;
|
109
63
|
resultsCount: () => number;
|
110
64
|
resetResultsCount: () => void;
|
111
65
|
} & {
|
112
|
-
resultFunc: (resultFuncArgs_0:
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
};
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
} & {
|
124
|
-
resultFunc: (resultFuncArgs_0: any) => import("./types.mjs").FeatureFlagsPlatformConfig;
|
125
|
-
memoizedResultFunc: ((resultFuncArgs_0: any) => import("./types.mjs").FeatureFlagsPlatformConfig) & {
|
126
|
-
clearCache: () => void;
|
127
|
-
resultsCount: () => number;
|
128
|
-
resetResultsCount: () => void;
|
129
|
-
};
|
130
|
-
lastResult: () => import("./types.mjs").FeatureFlagsPlatformConfig;
|
131
|
-
dependencies: [(state: RemoteFeatureFlagControllerState) => unknown];
|
132
|
-
recomputations: () => number;
|
133
|
-
resetRecomputations: () => void;
|
134
|
-
dependencyRecomputations: () => number;
|
135
|
-
resetDependencyRecomputations: () => void;
|
136
|
-
} & {
|
137
|
-
argsMemoize: typeof import("reselect").weakMapMemoize;
|
138
|
-
memoize: typeof import("reselect").weakMapMemoize;
|
139
|
-
}, (state: BridgeAppState) => boolean | undefined, (state: BridgeAppState) => number];
|
140
|
-
recomputations: () => number;
|
141
|
-
resetRecomputations: () => void;
|
142
|
-
dependencyRecomputations: () => number;
|
143
|
-
resetDependencyRecomputations: () => void;
|
144
|
-
} & {
|
145
|
-
argsMemoize: typeof import("reselect").weakMapMemoize;
|
146
|
-
memoize: typeof import("reselect").weakMapMemoize;
|
147
|
-
}, ({ quotesLastFetched }: BridgeAppState) => number | null, ((state: RemoteFeatureFlagControllerState & BridgeControllerState & {
|
148
|
-
gasFeeEstimates: GasFeeEstimates;
|
149
|
-
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
150
|
-
participateInMetaMetrics: boolean;
|
151
|
-
}) => number) & {
|
152
|
-
clearCache: () => void;
|
153
|
-
resultsCount: () => number;
|
154
|
-
resetResultsCount: () => void;
|
155
|
-
} & {
|
156
|
-
resultFunc: (resultFuncArgs_0: import("./types.mjs").FeatureFlagsPlatformConfig, resultFuncArgs_1: string | number | undefined) => number;
|
157
|
-
memoizedResultFunc: ((resultFuncArgs_0: import("./types.mjs").FeatureFlagsPlatformConfig, resultFuncArgs_1: string | number | undefined) => number) & {
|
66
|
+
resultFunc: (resultFuncArgs_0: {
|
67
|
+
refreshRate: number;
|
68
|
+
maxRefreshCount: number;
|
69
|
+
support: boolean;
|
70
|
+
chains: Record<`${string}:${string}`, import("./types.mjs").ChainConfiguration>;
|
71
|
+
}, resultFuncArgs_1: string | number | undefined) => number;
|
72
|
+
memoizedResultFunc: ((resultFuncArgs_0: {
|
73
|
+
refreshRate: number;
|
74
|
+
maxRefreshCount: number;
|
75
|
+
support: boolean;
|
76
|
+
chains: Record<`${string}:${string}`, import("./types.mjs").ChainConfiguration>;
|
77
|
+
}, resultFuncArgs_1: string | number | undefined) => number) & {
|
158
78
|
clearCache: () => void;
|
159
79
|
resultsCount: () => number;
|
160
80
|
resetResultsCount: () => void;
|
161
81
|
};
|
162
82
|
lastResult: () => number;
|
163
|
-
dependencies: [(
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
resultFunc: (resultFuncArgs_0: any) => import("./types.mjs").FeatureFlagsPlatformConfig;
|
169
|
-
memoizedResultFunc: ((resultFuncArgs_0: any) => import("./types.mjs").FeatureFlagsPlatformConfig) & {
|
170
|
-
clearCache: () => void;
|
171
|
-
resultsCount: () => number;
|
172
|
-
resetResultsCount: () => void;
|
173
|
-
};
|
174
|
-
lastResult: () => import("./types.mjs").FeatureFlagsPlatformConfig;
|
175
|
-
dependencies: [(state: RemoteFeatureFlagControllerState) => unknown];
|
176
|
-
recomputations: () => number;
|
177
|
-
resetRecomputations: () => void;
|
178
|
-
dependencyRecomputations: () => number;
|
179
|
-
resetDependencyRecomputations: () => void;
|
180
|
-
} & {
|
181
|
-
argsMemoize: typeof import("reselect").weakMapMemoize;
|
182
|
-
memoize: typeof import("reselect").weakMapMemoize;
|
83
|
+
dependencies: [({ bridgeFeatureFlags }: BridgeAppState, { featureFlagsKey }: BridgeQuotesClientParams) => {
|
84
|
+
refreshRate: number;
|
85
|
+
maxRefreshCount: number;
|
86
|
+
support: boolean;
|
87
|
+
chains: Record<`${string}:${string}`, import("./types.mjs").ChainConfiguration>;
|
183
88
|
}, (state: BridgeAppState) => string | number | undefined];
|
184
89
|
recomputations: () => number;
|
185
90
|
resetRecomputations: () => void;
|
@@ -203,15 +108,17 @@ export declare const selectIsQuoteExpired: ((state: RemoteFeatureFlagControllerS
|
|
203
108
|
* @param state - The state of the bridge controller and its dependency controllers
|
204
109
|
* @param sortOrder - The sort order of the quotes
|
205
110
|
* @param selectedQuote - The quote that is currently selected by the user, should be cleared by clients when the req params change
|
111
|
+
* @param featureFlagsKey - The feature flags key for the client (e.g. `BridgeFeatureFlagsKey.EXTENSION_CONFIG`
|
206
112
|
* @returns The activeQuote, recommendedQuote, sortedQuotes, and other quote fetching metadata
|
207
113
|
*
|
208
114
|
* @example
|
209
115
|
* ```ts
|
210
116
|
* const quotes = useSelector(state => selectBridgeQuotes(
|
211
|
-
*
|
117
|
+
* state.metamask,
|
212
118
|
* {
|
213
119
|
* sortOrder: state.bridge.sortOrder,
|
214
120
|
* selectedQuote: state.bridge.selectedQuote,
|
121
|
+
* featureFlagsKey: BridgeFeatureFlagsKey.EXTENSION_CONFIG,
|
215
122
|
* }
|
216
123
|
* ));
|
217
124
|
* ```
|
@@ -220,7 +127,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
220
127
|
gasFeeEstimates: GasFeeEstimates;
|
221
128
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
222
129
|
participateInMetaMetrics: boolean;
|
223
|
-
}
|
130
|
+
}, params_0: BridgeQuotesClientParams) => {
|
224
131
|
sortedQuotes: (QuoteResponse & QuoteMetadata)[];
|
225
132
|
recommendedQuote: (QuoteResponse & QuoteMetadata) | null;
|
226
133
|
activeQuote: (QuoteResponse & QuoteMetadata) | null;
|
@@ -276,7 +183,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
276
183
|
gasFeeEstimates: GasFeeEstimates;
|
277
184
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
278
185
|
participateInMetaMetrics: boolean;
|
279
|
-
}
|
186
|
+
}, params_0: BridgeQuotesClientParams) => (QuoteResponse & QuoteMetadata)[]) & {
|
280
187
|
clearCache: () => void;
|
281
188
|
resultsCount: () => number;
|
282
189
|
resetResultsCount: () => void;
|
@@ -374,7 +281,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
374
281
|
gasFeeEstimates: GasFeeEstimates;
|
375
282
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
376
283
|
participateInMetaMetrics: boolean;
|
377
|
-
}
|
284
|
+
}) => {
|
378
285
|
sentAmount: {
|
379
286
|
amount: string;
|
380
287
|
valueInCurrency: string | null;
|
@@ -562,7 +469,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
562
469
|
gasFeeEstimates: GasFeeEstimates;
|
563
470
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
564
471
|
participateInMetaMetrics: boolean;
|
565
|
-
}
|
472
|
+
}) => {
|
566
473
|
estimatedBaseFeeInDecGwei: string;
|
567
474
|
maxPriorityFeePerGasInDecGwei: string;
|
568
475
|
maxFeePerGasInDecGwei: string;
|
@@ -602,7 +509,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
602
509
|
gasFeeEstimates: GasFeeEstimates;
|
603
510
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
604
511
|
participateInMetaMetrics: boolean;
|
605
|
-
}
|
512
|
+
}) => ExchangeRate) & {
|
606
513
|
clearCache: () => void;
|
607
514
|
resultsCount: () => number;
|
608
515
|
resetResultsCount: () => void;
|
@@ -626,7 +533,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
626
533
|
gasFeeEstimates: GasFeeEstimates;
|
627
534
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
628
535
|
participateInMetaMetrics: boolean;
|
629
|
-
}
|
536
|
+
}) => ExchangeRate) & {
|
630
537
|
clearCache: () => void;
|
631
538
|
resultsCount: () => number;
|
632
539
|
resetResultsCount: () => void;
|
@@ -650,7 +557,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
650
557
|
gasFeeEstimates: GasFeeEstimates;
|
651
558
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
652
559
|
participateInMetaMetrics: boolean;
|
653
|
-
}
|
560
|
+
}) => ExchangeRate) & {
|
654
561
|
clearCache: () => void;
|
655
562
|
resultsCount: () => number;
|
656
563
|
resetResultsCount: () => void;
|
@@ -690,7 +597,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
690
597
|
gasFeeEstimates: GasFeeEstimates;
|
691
598
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
692
599
|
participateInMetaMetrics: boolean;
|
693
|
-
}
|
600
|
+
}, params_0: BridgeQuotesClientParams) => (QuoteResponse & QuoteMetadata) | null) & {
|
694
601
|
clearCache: () => void;
|
695
602
|
resultsCount: () => number;
|
696
603
|
resetResultsCount: () => void;
|
@@ -706,7 +613,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
706
613
|
gasFeeEstimates: GasFeeEstimates;
|
707
614
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
708
615
|
participateInMetaMetrics: boolean;
|
709
|
-
}
|
616
|
+
}, params_0: BridgeQuotesClientParams) => (QuoteResponse & QuoteMetadata)[]) & {
|
710
617
|
clearCache: () => void;
|
711
618
|
resultsCount: () => number;
|
712
619
|
resetResultsCount: () => void;
|
@@ -804,7 +711,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
804
711
|
gasFeeEstimates: GasFeeEstimates;
|
805
712
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
806
713
|
participateInMetaMetrics: boolean;
|
807
|
-
}
|
714
|
+
}) => {
|
808
715
|
sentAmount: {
|
809
716
|
amount: string;
|
810
717
|
valueInCurrency: string | null;
|
@@ -992,7 +899,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
992
899
|
gasFeeEstimates: GasFeeEstimates;
|
993
900
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
994
901
|
participateInMetaMetrics: boolean;
|
995
|
-
}
|
902
|
+
}) => {
|
996
903
|
estimatedBaseFeeInDecGwei: string;
|
997
904
|
maxPriorityFeePerGasInDecGwei: string;
|
998
905
|
maxFeePerGasInDecGwei: string;
|
@@ -1032,7 +939,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1032
939
|
gasFeeEstimates: GasFeeEstimates;
|
1033
940
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1034
941
|
participateInMetaMetrics: boolean;
|
1035
|
-
}
|
942
|
+
}) => ExchangeRate) & {
|
1036
943
|
clearCache: () => void;
|
1037
944
|
resultsCount: () => number;
|
1038
945
|
resetResultsCount: () => void;
|
@@ -1056,7 +963,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1056
963
|
gasFeeEstimates: GasFeeEstimates;
|
1057
964
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1058
965
|
participateInMetaMetrics: boolean;
|
1059
|
-
}
|
966
|
+
}) => ExchangeRate) & {
|
1060
967
|
clearCache: () => void;
|
1061
968
|
resultsCount: () => number;
|
1062
969
|
resetResultsCount: () => void;
|
@@ -1080,7 +987,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1080
987
|
gasFeeEstimates: GasFeeEstimates;
|
1081
988
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1082
989
|
participateInMetaMetrics: boolean;
|
1083
|
-
}
|
990
|
+
}) => ExchangeRate) & {
|
1084
991
|
clearCache: () => void;
|
1085
992
|
resultsCount: () => number;
|
1086
993
|
resetResultsCount: () => void;
|
@@ -1128,7 +1035,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1128
1035
|
gasFeeEstimates: GasFeeEstimates;
|
1129
1036
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1130
1037
|
participateInMetaMetrics: boolean;
|
1131
|
-
}
|
1038
|
+
}, params_0: BridgeQuotesClientParams) => (QuoteResponse & QuoteMetadata) | null) & {
|
1132
1039
|
clearCache: () => void;
|
1133
1040
|
resultsCount: () => number;
|
1134
1041
|
resetResultsCount: () => void;
|
@@ -1144,7 +1051,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1144
1051
|
gasFeeEstimates: GasFeeEstimates;
|
1145
1052
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1146
1053
|
participateInMetaMetrics: boolean;
|
1147
|
-
}
|
1054
|
+
}, params_0: BridgeQuotesClientParams) => (QuoteResponse & QuoteMetadata) | null) & {
|
1148
1055
|
clearCache: () => void;
|
1149
1056
|
resultsCount: () => number;
|
1150
1057
|
resetResultsCount: () => void;
|
@@ -1160,7 +1067,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1160
1067
|
gasFeeEstimates: GasFeeEstimates;
|
1161
1068
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1162
1069
|
participateInMetaMetrics: boolean;
|
1163
|
-
}
|
1070
|
+
}, params_0: BridgeQuotesClientParams) => (QuoteResponse & QuoteMetadata)[]) & {
|
1164
1071
|
clearCache: () => void;
|
1165
1072
|
resultsCount: () => number;
|
1166
1073
|
resetResultsCount: () => void;
|
@@ -1258,7 +1165,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1258
1165
|
gasFeeEstimates: GasFeeEstimates;
|
1259
1166
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1260
1167
|
participateInMetaMetrics: boolean;
|
1261
|
-
}
|
1168
|
+
}) => {
|
1262
1169
|
sentAmount: {
|
1263
1170
|
amount: string;
|
1264
1171
|
valueInCurrency: string | null;
|
@@ -1446,7 +1353,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1446
1353
|
gasFeeEstimates: GasFeeEstimates;
|
1447
1354
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1448
1355
|
participateInMetaMetrics: boolean;
|
1449
|
-
}
|
1356
|
+
}) => {
|
1450
1357
|
estimatedBaseFeeInDecGwei: string;
|
1451
1358
|
maxPriorityFeePerGasInDecGwei: string;
|
1452
1359
|
maxFeePerGasInDecGwei: string;
|
@@ -1486,7 +1393,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1486
1393
|
gasFeeEstimates: GasFeeEstimates;
|
1487
1394
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1488
1395
|
participateInMetaMetrics: boolean;
|
1489
|
-
}
|
1396
|
+
}) => ExchangeRate) & {
|
1490
1397
|
clearCache: () => void;
|
1491
1398
|
resultsCount: () => number;
|
1492
1399
|
resetResultsCount: () => void;
|
@@ -1510,7 +1417,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1510
1417
|
gasFeeEstimates: GasFeeEstimates;
|
1511
1418
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1512
1419
|
participateInMetaMetrics: boolean;
|
1513
|
-
}
|
1420
|
+
}) => ExchangeRate) & {
|
1514
1421
|
clearCache: () => void;
|
1515
1422
|
resultsCount: () => number;
|
1516
1423
|
resetResultsCount: () => void;
|
@@ -1534,7 +1441,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1534
1441
|
gasFeeEstimates: GasFeeEstimates;
|
1535
1442
|
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1536
1443
|
participateInMetaMetrics: boolean;
|
1537
|
-
}
|
1444
|
+
}) => ExchangeRate) & {
|
1538
1445
|
clearCache: () => void;
|
1539
1446
|
resultsCount: () => number;
|
1540
1447
|
resetResultsCount: () => void;
|
@@ -1586,51 +1493,7 @@ export declare const selectBridgeQuotes: ((state: BridgeControllerState & {
|
|
1586
1493
|
} & {
|
1587
1494
|
argsMemoize: typeof import("reselect").weakMapMemoize;
|
1588
1495
|
memoize: typeof import("reselect").weakMapMemoize;
|
1589
|
-
}, (state: BridgeAppState) => number | null, (state: BridgeAppState) => boolean, (state: BridgeAppState) => number | null, (
|
1590
|
-
gasFeeEstimates: GasFeeEstimates;
|
1591
|
-
} & MultichainAssetsRatesControllerState & TokenRatesControllerState & CurrencyRateState & Pick<BridgeControllerState, "assetExchangeRates"> & {
|
1592
|
-
participateInMetaMetrics: boolean;
|
1593
|
-
}) => boolean) & {
|
1594
|
-
clearCache: () => void;
|
1595
|
-
resultsCount: () => number;
|
1596
|
-
resetResultsCount: () => void;
|
1597
|
-
} & {
|
1598
|
-
resultFunc: (resultFuncArgs_0: import("./types.mjs").FeatureFlagsPlatformConfig, resultFuncArgs_1: boolean | undefined, resultFuncArgs_2: number) => boolean;
|
1599
|
-
memoizedResultFunc: ((resultFuncArgs_0: import("./types.mjs").FeatureFlagsPlatformConfig, resultFuncArgs_1: boolean | undefined, resultFuncArgs_2: number) => boolean) & {
|
1600
|
-
clearCache: () => void;
|
1601
|
-
resultsCount: () => number;
|
1602
|
-
resetResultsCount: () => void;
|
1603
|
-
};
|
1604
|
-
lastResult: () => boolean;
|
1605
|
-
dependencies: [((state: RemoteFeatureFlagControllerState) => import("./types.mjs").FeatureFlagsPlatformConfig) & {
|
1606
|
-
clearCache: () => void;
|
1607
|
-
resultsCount: () => number;
|
1608
|
-
resetResultsCount: () => void;
|
1609
|
-
} & {
|
1610
|
-
resultFunc: (resultFuncArgs_0: any) => import("./types.mjs").FeatureFlagsPlatformConfig;
|
1611
|
-
memoizedResultFunc: ((resultFuncArgs_0: any) => import("./types.mjs").FeatureFlagsPlatformConfig) & {
|
1612
|
-
clearCache: () => void;
|
1613
|
-
resultsCount: () => number;
|
1614
|
-
resetResultsCount: () => void;
|
1615
|
-
};
|
1616
|
-
lastResult: () => import("./types.mjs").FeatureFlagsPlatformConfig;
|
1617
|
-
dependencies: [(state: RemoteFeatureFlagControllerState) => unknown];
|
1618
|
-
recomputations: () => number;
|
1619
|
-
resetRecomputations: () => void;
|
1620
|
-
dependencyRecomputations: () => number;
|
1621
|
-
resetDependencyRecomputations: () => void;
|
1622
|
-
} & {
|
1623
|
-
argsMemoize: typeof import("reselect").weakMapMemoize;
|
1624
|
-
memoize: typeof import("reselect").weakMapMemoize;
|
1625
|
-
}, (state: BridgeAppState) => boolean | undefined, (state: BridgeAppState) => number];
|
1626
|
-
recomputations: () => number;
|
1627
|
-
resetRecomputations: () => void;
|
1628
|
-
dependencyRecomputations: () => number;
|
1629
|
-
resetDependencyRecomputations: () => void;
|
1630
|
-
} & {
|
1631
|
-
argsMemoize: typeof import("reselect").weakMapMemoize;
|
1632
|
-
memoize: typeof import("reselect").weakMapMemoize;
|
1633
|
-
}];
|
1496
|
+
}, (state: BridgeAppState) => number | null, (state: BridgeAppState) => boolean, (state: BridgeAppState) => number | null, (state: BridgeAppState, { featureFlagsKey }: BridgeQuotesClientParams) => boolean];
|
1634
1497
|
recomputations: () => number;
|
1635
1498
|
resetRecomputations: () => void;
|
1636
1499
|
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;AAUpE,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,aAAa,EACd,oBAAgB;AACjB,OAAO,EAAiB,SAAS,EAAE,oBAAgB;
|
1
|
+
{"version":3,"file":"selectors.d.mts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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"}
|
package/dist/selectors.mjs
CHANGED
@@ -7,7 +7,6 @@ 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";
|
11
10
|
import { calcAdjustedReturn, calcCost, calcEstimatedAndMaxTotalGasFee, calcRelayerFee, calcSentAmount, calcSolanaTotalNetworkFee, calcSwapRate, calcToAmount, calcTotalEstimatedNetworkFee, calcTotalMaxNetworkFee } from "./utils/quote.mjs";
|
12
11
|
/**
|
13
12
|
* Creates a structured selector for the bridge controller
|
@@ -17,29 +16,6 @@ const createStructuredBridgeSelector = createStructuredSelector_.withTypes();
|
|
17
16
|
* Creates a typed selector for the bridge controller
|
18
17
|
*/
|
19
18
|
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.remoteFeatureFlags.bridgeConfig], (bridgeConfig) => processFeatureFlags(bridgeConfig));
|
43
19
|
const getExchangeRateByChainIdAndAddress = (exchangeRateSources, chainId, address) => {
|
44
20
|
if (!chainId || !address) {
|
45
21
|
return {};
|
@@ -192,12 +168,14 @@ const selectActiveQuote = createBridgeSelector([
|
|
192
168
|
selectRecommendedQuote,
|
193
169
|
(_, { selectedQuote }) => selectedQuote,
|
194
170
|
], (recommendedQuote, selectedQuote) => selectedQuote ?? recommendedQuote);
|
195
|
-
const selectIsQuoteGoingToRefresh =
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
171
|
+
const selectIsQuoteGoingToRefresh = (state, { featureFlagsKey }) => state.quoteRequest.insufficientBal
|
172
|
+
? false
|
173
|
+
: state.quotesRefreshCount <
|
174
|
+
state.bridgeFeatureFlags[featureFlagsKey].maxRefreshCount;
|
175
|
+
const selectQuoteRefreshRate = createBridgeSelector([
|
176
|
+
({ bridgeFeatureFlags }, { featureFlagsKey }) => bridgeFeatureFlags[featureFlagsKey],
|
177
|
+
(state) => state.quoteRequest.srcChainId,
|
178
|
+
], (featureFlags, srcChainId) => (srcChainId
|
201
179
|
? featureFlags.chains[formatChainIdToCaip(srcChainId)]?.refreshRate
|
202
180
|
: featureFlags.refreshRate) ?? featureFlags.refreshRate);
|
203
181
|
export const selectIsQuoteExpired = createBridgeSelector([
|
@@ -214,15 +192,17 @@ export const selectIsQuoteExpired = createBridgeSelector([
|
|
214
192
|
* @param state - The state of the bridge controller and its dependency controllers
|
215
193
|
* @param sortOrder - The sort order of the quotes
|
216
194
|
* @param selectedQuote - The quote that is currently selected by the user, should be cleared by clients when the req params change
|
195
|
+
* @param featureFlagsKey - The feature flags key for the client (e.g. `BridgeFeatureFlagsKey.EXTENSION_CONFIG`
|
217
196
|
* @returns The activeQuote, recommendedQuote, sortedQuotes, and other quote fetching metadata
|
218
197
|
*
|
219
198
|
* @example
|
220
199
|
* ```ts
|
221
200
|
* const quotes = useSelector(state => selectBridgeQuotes(
|
222
|
-
*
|
201
|
+
* state.metamask,
|
223
202
|
* {
|
224
203
|
* sortOrder: state.bridge.sortOrder,
|
225
204
|
* selectedQuote: state.bridge.selectedQuote,
|
205
|
+
* featureFlagsKey: BridgeFeatureFlagsKey.EXTENSION_CONFIG,
|
226
206
|
* }
|
227
207
|
* ));
|
228
208
|
* ```
|