diff --git a/app/components/UI/Bridge/_mocks_/bridgeControllerState.ts b/app/components/UI/Bridge/_mocks_/bridgeControllerState.ts index 7a30609ae05..7d6922c56f2 100644 --- a/app/components/UI/Bridge/_mocks_/bridgeControllerState.ts +++ b/app/components/UI/Bridge/_mocks_/bridgeControllerState.ts @@ -13,7 +13,7 @@ export const optimismToken1Address = '0x0000000000000000000000000000000000000003' as Hex; export const defaultBridgeControllerState = { - quoteRequest: {}, + quoteRequest: [{}], quotes: [], quotesInitialLoadTime: null, quotesLastFetched: null, diff --git a/app/components/UI/Bridge/hooks/useBridgeQuoteRequest/index.ts b/app/components/UI/Bridge/hooks/useBridgeQuoteRequest/index.ts index 4c4a294865b..d10b75acda7 100644 --- a/app/components/UI/Bridge/hooks/useBridgeQuoteRequest/index.ts +++ b/app/components/UI/Bridge/hooks/useBridgeQuoteRequest/index.ts @@ -129,6 +129,8 @@ export const useBridgeQuoteRequest = ( await Engine.context.BridgeController.updateBridgeQuoteRequestParams( params, context, + 0, + 1, ); }, [ sourceToken, diff --git a/app/components/UI/Bridge/hooks/useBridgeQuoteRequest/useBridgeQuoteRequest.test.ts b/app/components/UI/Bridge/hooks/useBridgeQuoteRequest/useBridgeQuoteRequest.test.ts index 4ff41034b46..6d2c464a912 100644 --- a/app/components/UI/Bridge/hooks/useBridgeQuoteRequest/useBridgeQuoteRequest.test.ts +++ b/app/components/UI/Bridge/hooks/useBridgeQuoteRequest/useBridgeQuoteRequest.test.ts @@ -253,6 +253,8 @@ describe('useBridgeQuoteRequest', () => { srcTokenAmount: '1500000000000000000', // 1.5 ETH in wei }), undefined, + 0, + 1, ); }); @@ -277,6 +279,8 @@ describe('useBridgeQuoteRequest', () => { srcTokenAmount: '0', }), undefined, + 0, + 1, ); }); @@ -312,6 +316,8 @@ describe('useBridgeQuoteRequest', () => { srcTokenAmount: '1000500000', // 1000.5 with 6 decimals }), undefined, + 0, + 1, ); }); @@ -386,6 +392,8 @@ describe('useBridgeQuoteRequest', () => { destWalletAddress: destSolanaAddress, }), undefined, + 0, + 1, ); // Reset mock @@ -414,6 +422,8 @@ describe('useBridgeQuoteRequest', () => { gasIncluded: true, }), undefined, + 0, + 1, ); }); @@ -438,6 +448,8 @@ describe('useBridgeQuoteRequest', () => { gasIncluded: false, }), undefined, + 0, + 1, ); }); @@ -475,6 +487,8 @@ describe('useBridgeQuoteRequest', () => { gasIncluded7702: true, }), undefined, + 0, + 1, ); }); @@ -495,6 +509,8 @@ describe('useBridgeQuoteRequest', () => { gasIncluded7702: false, }), undefined, + 0, + 1, ); }); }); @@ -539,6 +555,8 @@ describe('useBridgeQuoteRequest', () => { gasIncluded7702: false, }), undefined, + 0, + 1, ); }); }); @@ -566,6 +584,8 @@ describe('useBridgeQuoteRequest', () => { insufficientBal: false, }), undefined, + 0, + 1, ); }); @@ -596,6 +616,8 @@ describe('useBridgeQuoteRequest', () => { insufficientBal: true, }), undefined, + 0, + 1, ); }); @@ -626,6 +648,8 @@ describe('useBridgeQuoteRequest', () => { insufficientBal: true, }), undefined, + 0, + 1, ); }); diff --git a/app/components/UI/Bridge/testUtils/index.ts b/app/components/UI/Bridge/testUtils/index.ts index dd4a0cb77b7..12ef1250751 100644 --- a/app/components/UI/Bridge/testUtils/index.ts +++ b/app/components/UI/Bridge/testUtils/index.ts @@ -1,29 +1,41 @@ import { type BridgeControllerState, getDefaultBridgeControllerState, + type GenericQuoteRequest, } from '@metamask/bridge-controller'; import { initialState } from '../_mocks_/initialState'; import { mockBridgeReducerState } from '../_mocks_/bridgeReducerState'; import type { BridgeState } from '../../../../core/redux/slices/bridge'; import { RootState } from '../../../../reducers'; import { DeepPartial } from '../../../../util/test/renderWithProvider'; +import { merge } from 'lodash'; // Re-export all fixtures (no heavy dependencies) export * from './fixtures'; -type BridgeControllerStateOverride = Partial; - +type BridgeControllerStateOverride = Partial< + Omit +> & { quoteRequest?: Partial }; /** * Creates a complete bridge controller state by merging default state with overrides * @param overrides - Partial state to override default values * @returns Complete bridge controller state */ -export const createBridgeControllerState = ( - overrides: BridgeControllerStateOverride = {}, -): BridgeControllerState => ({ - ...getDefaultBridgeControllerState(), - ...overrides, -}); +export const createBridgeControllerState = ({ + quoteRequest, + ...overrides +}: BridgeControllerStateOverride = {}): BridgeControllerState => + merge( + getDefaultBridgeControllerState(), + overrides, + quoteRequest + ? { + quoteRequest: Array.isArray(quoteRequest) + ? quoteRequest + : [quoteRequest], + } + : {}, + ); /** * Creates a complete test state for bridge components/hooks diff --git a/app/components/Views/SocialLeaderboard/TraderPositionView/components/QuickBuyBottomSheet/useQuickBuyQuotes.ts b/app/components/Views/SocialLeaderboard/TraderPositionView/components/QuickBuyBottomSheet/useQuickBuyQuotes.ts index 5fb061d55e6..6a45684a90b 100644 --- a/app/components/Views/SocialLeaderboard/TraderPositionView/components/QuickBuyBottomSheet/useQuickBuyQuotes.ts +++ b/app/components/Views/SocialLeaderboard/TraderPositionView/components/QuickBuyBottomSheet/useQuickBuyQuotes.ts @@ -256,10 +256,12 @@ export function useQuickBuyQuotes({ const controllerFields = { ...metadataDeps.bridgeController, quotes: rawQuotes, - quoteRequest: { - ...metadataDeps.bridgeController.quoteRequest, - ...quoteRequestPatch, - }, + quoteRequest: [ + { + ...(metadataDeps.bridgeController.quoteRequest?.[0] ?? {}), + ...quoteRequestPatch, + }, + ], gasFeeEstimatesByChainId: metadataDeps.gasFeeEstimatesByChainId, ...metadataDeps.multichainAssetsRates, ...metadataDeps.tokenRates, diff --git a/app/selectors/bridgeController/index.ts b/app/selectors/bridgeController/index.ts index e72ced8f346..bf2313553f4 100644 --- a/app/selectors/bridgeController/index.ts +++ b/app/selectors/bridgeController/index.ts @@ -19,7 +19,7 @@ export const selectBridgeControllerState = (state: RootState) => export const selectQuoteRequest = createSelector( selectBridgeControllerState, (bridgeControllerState: BridgeControllerState) => - bridgeControllerState.quoteRequest, + bridgeControllerState.quoteRequest[0], ); // Create the BridgeAppState selector following the same pattern as in bridge slice diff --git a/app/util/bridge/hooks/useSubmitBridgeTx.test.tsx b/app/util/bridge/hooks/useSubmitBridgeTx.test.tsx index 8678b419f3f..0addffbf64a 100644 --- a/app/util/bridge/hooks/useSubmitBridgeTx.test.tsx +++ b/app/util/bridge/hooks/useSubmitBridgeTx.test.tsx @@ -142,9 +142,11 @@ describe('useSubmitBridgeTx', () => { backgroundState: { ...backgroundState, BridgeController: { - quoteRequest: { - slippage: 0.5, - }, + quoteRequest: [ + { + slippage: 0.5, + }, + ], }, BridgeStatusController: { startPollingForBridgeTxStatus: jest.fn(), diff --git a/app/util/test/initial-background-state.json b/app/util/test/initial-background-state.json index e338ef76165..5e8ce227c55 100644 --- a/app/util/test/initial-background-state.json +++ b/app/util/test/initial-background-state.json @@ -698,9 +698,11 @@ "assetExchangeRates": {}, "minimumBalanceForRentExemptionInLamports": "0", "quoteFetchError": null, - "quoteRequest": { - "srcTokenAddress": "0x0000000000000000000000000000000000000000" - }, + "quoteRequest": [ + { + "srcTokenAddress": "0x0000000000000000000000000000000000000000" + } + ], "quotes": [], "quotesInitialLoadTime": null, "quotesLastFetched": null, diff --git a/package.json b/package.json index fa29e7b4fcd..8d166031f20 100644 --- a/package.json +++ b/package.json @@ -216,7 +216,6 @@ "@metamask/keyring-api@npm:^21.4.0": "23.1.0", "@metamask/keyring-api@npm:^21.6.0": "23.1.0", "@metamask/keyring-api@npm:^22.0.0": "23.1.0", - "@metamask/bridge-status-controller@npm:^71.0.0": "patch:@metamask/bridge-status-controller@npm%3A71.1.0#~/.yarn/patches/@metamask-bridge-status-controller-npm-71.1.0-6140a0bdf3.patch", "@metamask/permission-controller": "^13.1.1" }, "dependencies": { @@ -248,8 +247,8 @@ "@metamask/authenticated-user-storage": "^1.0.0", "@metamask/base-controller": "^9.0.1", "@metamask/bitcoin-wallet-snap": "^1.10.1", - "@metamask/bridge-controller": "^71.1.0", - "@metamask/bridge-status-controller": "patch:@metamask/bridge-status-controller@npm%3A71.1.0#~/.yarn/patches/@metamask-bridge-status-controller-npm-71.1.0-6140a0bdf3.patch", + "@metamask/bridge-controller": "^72.0.0", + "@metamask/bridge-status-controller": "^71.1.1", "@metamask/chain-agnostic-permission": "^1.5.0", "@metamask/chomp-api-service": "^3.1.0", "@metamask/client-controller": "^1.0.1", diff --git a/tests/component-view/stateFixture.ts b/tests/component-view/stateFixture.ts index b12992f9c16..cf751cfc13f 100644 --- a/tests/component-view/stateFixture.ts +++ b/tests/component-view/stateFixture.ts @@ -307,15 +307,17 @@ export function createStateFixture(): StateFixtureBuilder { conversionRates: {}, }, BridgeController: { - quoteRequest: { - srcChainId: numericChainId, - srcTokenAddress, - destChainId: numericChainId, - destTokenAddress, - destAddress: '', - srcAmount, - slippage: 0.005, - }, + quoteRequest: [ + { + srcChainId: numericChainId, + srcTokenAddress, + destChainId: numericChainId, + destTokenAddress, + destAddress: '', + srcAmount, + slippage: 0.005, + }, + ], quotes: [quoteResponse], recommendedQuote: quoteResponse, quotesLastFetched: now, @@ -446,15 +448,17 @@ export function createStateFixture(): StateFixtureBuilder { backgroundState: { ...bg, BridgeController: { - quoteRequest: { - srcChainId: undefined, - srcTokenAddress: undefined, - destChainId: undefined, - destTokenAddress: undefined, - destAddress: undefined, - srcAmount: undefined, - slippage: 0.005, - }, + quoteRequest: [ + { + srcChainId: undefined, + srcTokenAddress: undefined, + destChainId: undefined, + destTokenAddress: undefined, + destAddress: undefined, + srcAmount: undefined, + slippage: 0.005, + }, + ], isInPolling: false, quotesLastFetched: 0, quotes: [], diff --git a/tests/smoke/swap/swap-deeplink-smoke.spec.ts b/tests/smoke/swap/swap-deeplink-smoke.spec.ts index c9ebf45c86a..0b19075a577 100644 --- a/tests/smoke/swap/swap-deeplink-smoke.spec.ts +++ b/tests/smoke/swap/swap-deeplink-smoke.spec.ts @@ -10,9 +10,13 @@ import { SmokeSwap } from '../../tags'; import Assertions from '../../framework/Assertions'; import { asDetoxElement } from '../../framework'; import QuoteView from '../../page-objects/swaps/QuoteView'; -import { testSpecificMock } from '../../helpers/swap/swap-mocks'; +import { + mockSwapPopularTokens, + testSpecificMock, +} from '../../helpers/swap/swap-mocks'; import TestHelpers from '../../helpers'; import WalletView from '../../page-objects/wallet/WalletView'; +import { Mockttp } from 'mockttp'; // Deep link URLs for testing unified swap/bridge experience // Note: URLs use 'swap' terminology for backward compatibility but redirect to unified bridge experience @@ -57,7 +61,10 @@ describe( }, }, ], - testSpecificMock, + testSpecificMock: async (mockServer: Mockttp) => { + await testSpecificMock(mockServer); + await mockSwapPopularTokens(mockServer); + }, restartDevice: true, }, async () => { @@ -176,7 +183,10 @@ describe( }, }, ], - testSpecificMock, + testSpecificMock: async (mockServer: Mockttp) => { + await testSpecificMock(mockServer); + await mockSwapPopularTokens(mockServer); + }, restartDevice: true, }, async () => { diff --git a/yarn.lock b/yarn.lock index e8f13feb95a..5b07c39f0be 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7648,43 +7648,6 @@ __metadata: languageName: node linkType: hard -"@metamask/assets-controller@npm:^6.4.0": - version: 6.4.0 - resolution: "@metamask/assets-controller@npm:6.4.0" - dependencies: - "@ethereumjs/util": "npm:^9.1.0" - "@ethersproject/abi": "npm:^5.7.0" - "@ethersproject/providers": "npm:^5.7.0" - "@metamask/account-tree-controller": "npm:^7.2.0" - "@metamask/accounts-controller": "npm:^38.0.0" - "@metamask/assets-controllers": "npm:^106.0.0" - "@metamask/base-controller": "npm:^9.1.0" - "@metamask/client-controller": "npm:^1.0.1" - "@metamask/controller-utils": "npm:^11.20.0" - "@metamask/core-backend": "npm:^6.2.1" - "@metamask/keyring-api": "npm:^23.1.0" - "@metamask/keyring-controller": "npm:^25.4.0" - "@metamask/keyring-internal-api": "npm:^11.0.1" - "@metamask/keyring-snap-client": "npm:^9.0.2" - "@metamask/messenger": "npm:^1.2.0" - "@metamask/network-controller": "npm:^30.1.0" - "@metamask/network-enablement-controller": "npm:^5.1.0" - "@metamask/permission-controller": "npm:^13.0.0" - "@metamask/phishing-controller": "npm:^17.1.1" - "@metamask/polling-controller": "npm:^16.0.4" - "@metamask/preferences-controller": "npm:^23.1.0" - "@metamask/snaps-controllers": "npm:^19.0.0" - "@metamask/snaps-utils": "npm:^12.1.2" - "@metamask/transaction-controller": "npm:^65.1.0" - "@metamask/utils": "npm:^11.9.0" - async-mutex: "npm:^0.5.0" - bignumber.js: "npm:^9.1.2" - lodash: "npm:^4.17.21" - p-limit: "npm:^3.1.0" - checksum: 10/f7f664dc0aca065a21b78ec55c063a2a68a0aa32481d760fc92899f8af65af7bd354b5aae3156d93454e1d5f88695f79319c7be83d7e4d9074bbd7c38ccc5714 - languageName: node - linkType: hard - "@metamask/assets-controller@npm:^7.1.1, @metamask/assets-controller@npm:^7.1.2": version: 7.1.2 resolution: "@metamask/assets-controller@npm:7.1.2" @@ -7931,40 +7894,7 @@ __metadata: languageName: node linkType: hard -"@metamask/bridge-controller@npm:^71.0.0, @metamask/bridge-controller@npm:^71.1.0": - version: 71.1.1 - resolution: "@metamask/bridge-controller@npm:71.1.1" - dependencies: - "@ethersproject/address": "npm:^5.7.0" - "@ethersproject/bignumber": "npm:^5.7.0" - "@ethersproject/constants": "npm:^5.7.0" - "@ethersproject/contracts": "npm:^5.7.0" - "@ethersproject/providers": "npm:^5.7.0" - "@metamask/accounts-controller": "npm:^38.0.0" - "@metamask/assets-controller": "npm:^6.4.0" - "@metamask/assets-controllers": "npm:^106.0.0" - "@metamask/base-controller": "npm:^9.1.0" - "@metamask/controller-utils": "npm:^11.20.0" - "@metamask/gas-fee-controller": "npm:^26.1.1" - "@metamask/keyring-api": "npm:^23.1.0" - "@metamask/messenger": "npm:^1.2.0" - "@metamask/metamask-eth-abis": "npm:^3.1.1" - "@metamask/multichain-network-controller": "npm:^3.1.0" - "@metamask/network-controller": "npm:^30.1.0" - "@metamask/polling-controller": "npm:^16.0.4" - "@metamask/profile-sync-controller": "npm:^28.0.2" - "@metamask/remote-feature-flag-controller": "npm:^4.2.0" - "@metamask/snaps-controllers": "npm:^19.0.0" - "@metamask/transaction-controller": "npm:^65.1.0" - "@metamask/utils": "npm:^11.9.0" - bignumber.js: "npm:^9.1.2" - reselect: "npm:^5.1.1" - uuid: "npm:^8.3.2" - checksum: 10/f77fa75bf0bbd29febaadd96906c26831d487391c925d9a29b4b4b69e10579b535977e479890e816842d589e7a49772fb498e80b25e34ce67de1503b5459c07f - languageName: node - linkType: hard - -"@metamask/bridge-controller@npm:^72.0.4": +"@metamask/bridge-controller@npm:^72.0.0, @metamask/bridge-controller@npm:^72.0.4": version: 72.0.4 resolution: "@metamask/bridge-controller@npm:72.0.4" dependencies: @@ -7997,31 +7927,7 @@ __metadata: languageName: node linkType: hard -"@metamask/bridge-status-controller@npm:71.1.0": - version: 71.1.0 - resolution: "@metamask/bridge-status-controller@npm:71.1.0" - dependencies: - "@metamask/accounts-controller": "npm:^37.2.0" - "@metamask/base-controller": "npm:^9.1.0" - "@metamask/bridge-controller": "npm:^71.0.0" - "@metamask/controller-utils": "npm:^11.20.0" - "@metamask/gas-fee-controller": "npm:^26.1.1" - "@metamask/keyring-controller": "npm:^25.2.0" - "@metamask/messenger": "npm:^1.1.1" - "@metamask/network-controller": "npm:^30.0.1" - "@metamask/polling-controller": "npm:^16.0.4" - "@metamask/profile-sync-controller": "npm:^28.0.2" - "@metamask/snaps-controllers": "npm:^19.0.0" - "@metamask/superstruct": "npm:^3.1.0" - "@metamask/transaction-controller": "npm:^65.0.0" - "@metamask/utils": "npm:^11.9.0" - bignumber.js: "npm:^9.1.2" - uuid: "npm:^8.3.2" - checksum: 10/5d6d509407b9ac20bd7c54a082a99e2b8ee682ea5f6938895d56aaf9fde9be4baeb3c18944f390f50aa8ebc0f5406f0dddc13c1f1a3d3d0eec16f3f866b1bde1 - languageName: node - linkType: hard - -"@metamask/bridge-status-controller@npm:^71.1.4": +"@metamask/bridge-status-controller@npm:^71.1.1, @metamask/bridge-status-controller@npm:^71.1.4": version: 71.1.4 resolution: "@metamask/bridge-status-controller@npm:71.1.4" dependencies: @@ -8045,30 +7951,6 @@ __metadata: languageName: node linkType: hard -"@metamask/bridge-status-controller@patch:@metamask/bridge-status-controller@npm%3A71.1.0#~/.yarn/patches/@metamask-bridge-status-controller-npm-71.1.0-6140a0bdf3.patch": - version: 71.1.0 - resolution: "@metamask/bridge-status-controller@patch:@metamask/bridge-status-controller@npm%3A71.1.0#~/.yarn/patches/@metamask-bridge-status-controller-npm-71.1.0-6140a0bdf3.patch::version=71.1.0&hash=d27fd3" - dependencies: - "@metamask/accounts-controller": "npm:^37.2.0" - "@metamask/base-controller": "npm:^9.1.0" - "@metamask/bridge-controller": "npm:^71.0.0" - "@metamask/controller-utils": "npm:^11.20.0" - "@metamask/gas-fee-controller": "npm:^26.1.1" - "@metamask/keyring-controller": "npm:^25.2.0" - "@metamask/messenger": "npm:^1.1.1" - "@metamask/network-controller": "npm:^30.0.1" - "@metamask/polling-controller": "npm:^16.0.4" - "@metamask/profile-sync-controller": "npm:^28.0.2" - "@metamask/snaps-controllers": "npm:^19.0.0" - "@metamask/superstruct": "npm:^3.1.0" - "@metamask/transaction-controller": "npm:^65.0.0" - "@metamask/utils": "npm:^11.9.0" - bignumber.js: "npm:^9.1.2" - uuid: "npm:^8.3.2" - checksum: 10/530cc836eb0bc921092538b8253d9d673a1470360f4715510aa1d25d91d14fcad576df77ad5d131f7708d89fd129ace000a4682ce53108d4b560db3cf8e36469 - languageName: node - linkType: hard - "@metamask/browser-passworder@npm:^5.0.0": version: 5.0.0 resolution: "@metamask/browser-passworder@npm:5.0.0" @@ -35330,8 +35212,8 @@ __metadata: "@metamask/auto-changelog": "npm:^5.3.0" "@metamask/base-controller": "npm:^9.0.1" "@metamask/bitcoin-wallet-snap": "npm:^1.10.1" - "@metamask/bridge-controller": "npm:^71.1.0" - "@metamask/bridge-status-controller": "patch:@metamask/bridge-status-controller@npm%3A71.1.0#~/.yarn/patches/@metamask-bridge-status-controller-npm-71.1.0-6140a0bdf3.patch" + "@metamask/bridge-controller": "npm:^72.0.0" + "@metamask/bridge-status-controller": "npm:^71.1.1" "@metamask/browser-passworder": "npm:^5.0.0" "@metamask/browser-playground": "npm:0.3.0" "@metamask/build-utils": "npm:^3.0.0"