Skip to content

Commit a729e80

Browse files
feat: enable tx submission before swap quotes are loaded + bug fixes (#37963)
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** Bumping the bridge controllers to implement these fixes: - replace the LowReturn banner with a warning font-color change to prevent swap page from auto-scrolling while streaming quotes. Also added an e2e test to verify the QuotesReceived event is published if the trade is submitted before quotes finish loading - fixes USDT approval reset condition + tx generation - publish `usd_amount_source` property for QuotesRequested event - propagates gas parameters for 7702 gasIncluded transactions <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37963?quickstart=1) ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: feat: enable tx submission before swap quotes are loaded ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/SWAPS-3421, https://consensyssoftware.atlassian.net/browse/SWAPS-3427 ## **Manual testing steps** 1. Go to this page... 2. 3. ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> ### **After** <!-- [screenshots/recordings] --> ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Enables submitting swaps before quote streaming completes, updates telemetry and UI warnings, and bumps bridge controllers with related policy changes and tests. > > - **UX/Submit Flow**: > - Allow submitting swaps without waiting for all quotes; CTA no longer disabled during loading when a quote exists. > - Replace low-return banner with warning text color; prevent auto-scroll; refine no-quotes banner display. > - Add `getWarningLabels` selector and `getValidatedFromValue`; validation uses input-derived amounts. > - **Telemetry**: > - Use `getQuotesReceivedProperties` to track `Unified SwapBridge` events; include `usd_amount_source`. > - Pass QuotesReceived context into `submitBridgeTx`. > - **Controllers/Deps**: > - Bump `@metamask/bridge-controller` to `^64.0.0` and `@metamask/bridge-status-controller` to `^64.0.1` (and related deps); update `yarn.lock`. > - Bridge status messenger: remove `BridgeController:getBridgeERC20Allowance` action; add TS expects in controller init. > - **Security Policy**: > - Update LavaMoat policies for nested `@metamask/network-controller`, `eth-json-rpc-*`, `multichain-network-controller`, and add `@ethersproject/bignumber`. > - **Tests/E2E**: > - Add/adjust SSE-based tests to assert QuotesReceived/Submitted/Completed sequences; update mocks to `.once()` and expectations/snapshots. > - Update unit tests for new validation, inputs as strings, and event payload assertions. > - **Misc**: > - Color network fee text based on low return; minor TS and provider notes. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit cb87cd1. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: MetaMask Bot <[email protected]>
1 parent 5a2b80e commit a729e80

26 files changed

+651
-244
lines changed

app/scripts/controller-init/bridge-controller-init.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export const BridgeControllerInit: ControllerInitFunction<
4141
}
4242

4343
const controller = new BridgeController({
44+
// @ts-expect-error - Messenger type mismatch due to missing controller actions and dependency version mismatch
4445
messenger: controllerMessenger,
4546
clientId: BridgeClientId.EXTENSION,
4647
clientVersion: process.env.METAMASK_VERSION,

app/scripts/controller-init/bridge-status-controller-init.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export const BridgeStatusControllerInit: ControllerInitFunction<
2121
const transactionController = getController('TransactionController');
2222

2323
const controller = new BridgeStatusController({
24+
// @ts-expect-error - Messenger type mismatch due to missing controller actions and dependency version mismatch
2425
messenger: controllerMessenger,
2526
state: persistedState.BridgeStatusController,
2627
fetchFn: async (url, requestOptions) => {

app/scripts/controller-init/messengers/bridge-status-controller-messenger.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ type AllowedActions =
2626
| NetworkControllerGetNetworkClientByIdAction
2727
| HandleSnapRequest
2828
| TransactionControllerGetStateAction
29-
| BridgeControllerAction<BridgeBackgroundAction.GET_BRIDGE_ERC20_ALLOWANCE>
3029
| BridgeControllerAction<BridgeBackgroundAction.TRACK_METAMETRICS_EVENT>
3130
| BridgeControllerAction<BridgeBackgroundAction.STOP_POLLING_FOR_QUOTES>
3231
| GetGasFeeState
@@ -68,7 +67,6 @@ export function getBridgeStatusControllerMessenger(
6867
'NetworkController:getNetworkClientById',
6968
'NetworkController:findNetworkClientIdByChainId',
7069
'NetworkController:getState',
71-
'BridgeController:getBridgeERC20Allowance',
7270
'BridgeController:trackUnifiedSwapBridgeEvent',
7371
'BridgeController:stopPollingForQuotes',
7472
'GasFeeController:getState',

lavamoat/browserify/beta/policy.json

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -903,13 +903,14 @@
903903
},
904904
"packages": {
905905
"ethers>@ethersproject/address": true,
906+
"@ethersproject/bignumber": true,
906907
"ethers>@ethersproject/constants": true,
907908
"@ethersproject/contracts": true,
908909
"@ethersproject/providers": true,
909910
"@metamask/controller-utils": true,
910911
"@metamask/keyring-api": true,
911912
"@metamask/metamask-eth-abis": true,
912-
"@metamask/multichain-network-controller": true,
913+
"@metamask/bridge-controller>@metamask/multichain-network-controller": true,
913914
"@metamask/bridge-controller>@metamask/polling-controller": true,
914915
"@metamask/superstruct": true,
915916
"@metamask/utils": true,
@@ -1179,6 +1180,20 @@
11791180
"@metamask/eth-json-rpc-middleware>safe-stable-stringify": true
11801181
}
11811182
},
1183+
"@metamask/bridge-controller>@metamask/network-controller>@metamask/eth-json-rpc-middleware": {
1184+
"globals": {
1185+
"setTimeout": true
1186+
},
1187+
"packages": {
1188+
"@metamask/eth-sig-util": true,
1189+
"@metamask/json-rpc-engine": true,
1190+
"@metamask/rpc-errors": true,
1191+
"@metamask/superstruct": true,
1192+
"@metamask/utils": true,
1193+
"@metamask/json-rpc-engine>klona": true,
1194+
"@metamask/eth-json-rpc-middleware>safe-stable-stringify": true
1195+
}
1196+
},
11821197
"@metamask/transaction-controller>@metamask/network-controller>@metamask/eth-json-rpc-middleware": {
11831198
"globals": {
11841199
"setTimeout": true
@@ -1215,6 +1230,12 @@
12151230
"uuid": true
12161231
}
12171232
},
1233+
"@metamask/bridge-controller>@metamask/network-controller>@metamask/eth-json-rpc-provider": {
1234+
"packages": {
1235+
"@metamask/json-rpc-engine": true,
1236+
"nanoid": true
1237+
}
1238+
},
12181239
"@metamask/transaction-controller>@metamask/network-controller>@metamask/eth-json-rpc-provider": {
12191240
"packages": {
12201241
"@metamask/json-rpc-engine": true,
@@ -1631,6 +1652,19 @@
16311652
"lodash": true
16321653
}
16331654
},
1655+
"@metamask/bridge-controller>@metamask/multichain-network-controller": {
1656+
"globals": {
1657+
"URL": true
1658+
},
1659+
"packages": {
1660+
"@metamask/base-controller": true,
1661+
"@metamask/keyring-api": true,
1662+
"@metamask/bridge-controller>@metamask/network-controller": true,
1663+
"@metamask/superstruct": true,
1664+
"@metamask/utils": true,
1665+
"lodash": true
1666+
}
1667+
},
16341668
"@metamask/transaction-pay-controller>@metamask/bridge-controller>@metamask/multichain-network-controller": {
16351669
"globals": {
16361670
"URL": true
@@ -1693,6 +1727,33 @@
16931727
"uuid": true
16941728
}
16951729
},
1730+
"@metamask/bridge-controller>@metamask/network-controller": {
1731+
"globals": {
1732+
"Intl.NumberFormat": true,
1733+
"URL": true,
1734+
"setTimeout": true
1735+
},
1736+
"packages": {
1737+
"@metamask/base-controller": true,
1738+
"@metamask/controller-utils": true,
1739+
"@metamask/transaction-controller>@metamask/eth-block-tracker": true,
1740+
"@metamask/network-controller>@metamask/eth-json-rpc-infura": true,
1741+
"@metamask/bridge-controller>@metamask/network-controller>@metamask/eth-json-rpc-middleware": true,
1742+
"@metamask/bridge-controller>@metamask/network-controller>@metamask/eth-json-rpc-provider": true,
1743+
"@metamask/controller-utils>@metamask/eth-query": true,
1744+
"@metamask/json-rpc-engine": true,
1745+
"@metamask/rpc-errors": true,
1746+
"@metamask/network-controller>@metamask/swappable-obj-proxy": true,
1747+
"@metamask/utils": true,
1748+
"addons-linter>deepmerge": true,
1749+
"eslint>fast-deep-equal": true,
1750+
"immer": true,
1751+
"lodash": true,
1752+
"reselect": true,
1753+
"uri-js": true,
1754+
"uuid": true
1755+
}
1756+
},
16961757
"@metamask/transaction-controller>@metamask/network-controller": {
16971758
"globals": {
16981759
"Intl.NumberFormat": true,

lavamoat/browserify/experimental/policy.json

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -903,13 +903,14 @@
903903
},
904904
"packages": {
905905
"ethers>@ethersproject/address": true,
906+
"@ethersproject/bignumber": true,
906907
"ethers>@ethersproject/constants": true,
907908
"@ethersproject/contracts": true,
908909
"@ethersproject/providers": true,
909910
"@metamask/controller-utils": true,
910911
"@metamask/keyring-api": true,
911912
"@metamask/metamask-eth-abis": true,
912-
"@metamask/multichain-network-controller": true,
913+
"@metamask/bridge-controller>@metamask/multichain-network-controller": true,
913914
"@metamask/bridge-controller>@metamask/polling-controller": true,
914915
"@metamask/superstruct": true,
915916
"@metamask/utils": true,
@@ -1179,6 +1180,20 @@
11791180
"@metamask/eth-json-rpc-middleware>safe-stable-stringify": true
11801181
}
11811182
},
1183+
"@metamask/bridge-controller>@metamask/network-controller>@metamask/eth-json-rpc-middleware": {
1184+
"globals": {
1185+
"setTimeout": true
1186+
},
1187+
"packages": {
1188+
"@metamask/eth-sig-util": true,
1189+
"@metamask/json-rpc-engine": true,
1190+
"@metamask/rpc-errors": true,
1191+
"@metamask/superstruct": true,
1192+
"@metamask/utils": true,
1193+
"@metamask/json-rpc-engine>klona": true,
1194+
"@metamask/eth-json-rpc-middleware>safe-stable-stringify": true
1195+
}
1196+
},
11821197
"@metamask/transaction-controller>@metamask/network-controller>@metamask/eth-json-rpc-middleware": {
11831198
"globals": {
11841199
"setTimeout": true
@@ -1215,6 +1230,12 @@
12151230
"uuid": true
12161231
}
12171232
},
1233+
"@metamask/bridge-controller>@metamask/network-controller>@metamask/eth-json-rpc-provider": {
1234+
"packages": {
1235+
"@metamask/json-rpc-engine": true,
1236+
"nanoid": true
1237+
}
1238+
},
12181239
"@metamask/transaction-controller>@metamask/network-controller>@metamask/eth-json-rpc-provider": {
12191240
"packages": {
12201241
"@metamask/json-rpc-engine": true,
@@ -1631,6 +1652,19 @@
16311652
"lodash": true
16321653
}
16331654
},
1655+
"@metamask/bridge-controller>@metamask/multichain-network-controller": {
1656+
"globals": {
1657+
"URL": true
1658+
},
1659+
"packages": {
1660+
"@metamask/base-controller": true,
1661+
"@metamask/keyring-api": true,
1662+
"@metamask/bridge-controller>@metamask/network-controller": true,
1663+
"@metamask/superstruct": true,
1664+
"@metamask/utils": true,
1665+
"lodash": true
1666+
}
1667+
},
16341668
"@metamask/transaction-pay-controller>@metamask/bridge-controller>@metamask/multichain-network-controller": {
16351669
"globals": {
16361670
"URL": true
@@ -1693,6 +1727,33 @@
16931727
"uuid": true
16941728
}
16951729
},
1730+
"@metamask/bridge-controller>@metamask/network-controller": {
1731+
"globals": {
1732+
"Intl.NumberFormat": true,
1733+
"URL": true,
1734+
"setTimeout": true
1735+
},
1736+
"packages": {
1737+
"@metamask/base-controller": true,
1738+
"@metamask/controller-utils": true,
1739+
"@metamask/transaction-controller>@metamask/eth-block-tracker": true,
1740+
"@metamask/network-controller>@metamask/eth-json-rpc-infura": true,
1741+
"@metamask/bridge-controller>@metamask/network-controller>@metamask/eth-json-rpc-middleware": true,
1742+
"@metamask/bridge-controller>@metamask/network-controller>@metamask/eth-json-rpc-provider": true,
1743+
"@metamask/controller-utils>@metamask/eth-query": true,
1744+
"@metamask/json-rpc-engine": true,
1745+
"@metamask/rpc-errors": true,
1746+
"@metamask/network-controller>@metamask/swappable-obj-proxy": true,
1747+
"@metamask/utils": true,
1748+
"addons-linter>deepmerge": true,
1749+
"eslint>fast-deep-equal": true,
1750+
"immer": true,
1751+
"lodash": true,
1752+
"reselect": true,
1753+
"uri-js": true,
1754+
"uuid": true
1755+
}
1756+
},
16961757
"@metamask/transaction-controller>@metamask/network-controller": {
16971758
"globals": {
16981759
"Intl.NumberFormat": true,

lavamoat/browserify/flask/policy.json

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -903,13 +903,14 @@
903903
},
904904
"packages": {
905905
"ethers>@ethersproject/address": true,
906+
"@ethersproject/bignumber": true,
906907
"ethers>@ethersproject/constants": true,
907908
"@ethersproject/contracts": true,
908909
"@ethersproject/providers": true,
909910
"@metamask/controller-utils": true,
910911
"@metamask/keyring-api": true,
911912
"@metamask/metamask-eth-abis": true,
912-
"@metamask/multichain-network-controller": true,
913+
"@metamask/bridge-controller>@metamask/multichain-network-controller": true,
913914
"@metamask/bridge-controller>@metamask/polling-controller": true,
914915
"@metamask/superstruct": true,
915916
"@metamask/utils": true,
@@ -1179,6 +1180,20 @@
11791180
"@metamask/eth-json-rpc-middleware>safe-stable-stringify": true
11801181
}
11811182
},
1183+
"@metamask/bridge-controller>@metamask/network-controller>@metamask/eth-json-rpc-middleware": {
1184+
"globals": {
1185+
"setTimeout": true
1186+
},
1187+
"packages": {
1188+
"@metamask/eth-sig-util": true,
1189+
"@metamask/json-rpc-engine": true,
1190+
"@metamask/rpc-errors": true,
1191+
"@metamask/superstruct": true,
1192+
"@metamask/utils": true,
1193+
"@metamask/json-rpc-engine>klona": true,
1194+
"@metamask/eth-json-rpc-middleware>safe-stable-stringify": true
1195+
}
1196+
},
11821197
"@metamask/transaction-controller>@metamask/network-controller>@metamask/eth-json-rpc-middleware": {
11831198
"globals": {
11841199
"setTimeout": true
@@ -1215,6 +1230,12 @@
12151230
"uuid": true
12161231
}
12171232
},
1233+
"@metamask/bridge-controller>@metamask/network-controller>@metamask/eth-json-rpc-provider": {
1234+
"packages": {
1235+
"@metamask/json-rpc-engine": true,
1236+
"nanoid": true
1237+
}
1238+
},
12181239
"@metamask/transaction-controller>@metamask/network-controller>@metamask/eth-json-rpc-provider": {
12191240
"packages": {
12201241
"@metamask/json-rpc-engine": true,
@@ -1631,6 +1652,19 @@
16311652
"lodash": true
16321653
}
16331654
},
1655+
"@metamask/bridge-controller>@metamask/multichain-network-controller": {
1656+
"globals": {
1657+
"URL": true
1658+
},
1659+
"packages": {
1660+
"@metamask/base-controller": true,
1661+
"@metamask/keyring-api": true,
1662+
"@metamask/bridge-controller>@metamask/network-controller": true,
1663+
"@metamask/superstruct": true,
1664+
"@metamask/utils": true,
1665+
"lodash": true
1666+
}
1667+
},
16341668
"@metamask/transaction-pay-controller>@metamask/bridge-controller>@metamask/multichain-network-controller": {
16351669
"globals": {
16361670
"URL": true
@@ -1693,6 +1727,33 @@
16931727
"uuid": true
16941728
}
16951729
},
1730+
"@metamask/bridge-controller>@metamask/network-controller": {
1731+
"globals": {
1732+
"Intl.NumberFormat": true,
1733+
"URL": true,
1734+
"setTimeout": true
1735+
},
1736+
"packages": {
1737+
"@metamask/base-controller": true,
1738+
"@metamask/controller-utils": true,
1739+
"@metamask/transaction-controller>@metamask/eth-block-tracker": true,
1740+
"@metamask/network-controller>@metamask/eth-json-rpc-infura": true,
1741+
"@metamask/bridge-controller>@metamask/network-controller>@metamask/eth-json-rpc-middleware": true,
1742+
"@metamask/bridge-controller>@metamask/network-controller>@metamask/eth-json-rpc-provider": true,
1743+
"@metamask/controller-utils>@metamask/eth-query": true,
1744+
"@metamask/json-rpc-engine": true,
1745+
"@metamask/rpc-errors": true,
1746+
"@metamask/network-controller>@metamask/swappable-obj-proxy": true,
1747+
"@metamask/utils": true,
1748+
"addons-linter>deepmerge": true,
1749+
"eslint>fast-deep-equal": true,
1750+
"immer": true,
1751+
"lodash": true,
1752+
"reselect": true,
1753+
"uri-js": true,
1754+
"uuid": true
1755+
}
1756+
},
16961757
"@metamask/transaction-controller>@metamask/network-controller": {
16971758
"globals": {
16981759
"Intl.NumberFormat": true,

0 commit comments

Comments
 (0)