From 90b09caed2c2b1baf513fde95f794d069830d8bd Mon Sep 17 00:00:00 2001 From: Chingiz Mardanov Date: Mon, 27 Oct 2025 13:34:59 -0400 Subject: [PATCH 1/4] chore: replace the noFee flag with the fee flag --- .../src/bridge-controller.test.ts | 15 +++++++-------- packages/bridge-controller/src/types.ts | 5 ++++- .../bridge-controller/src/utils/fetch.test.ts | 6 +++--- packages/bridge-controller/src/utils/fetch.ts | 4 ++-- .../bridge-controller/src/utils/validators.ts | 2 +- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/packages/bridge-controller/src/bridge-controller.test.ts b/packages/bridge-controller/src/bridge-controller.test.ts index c15c23b53f1..4541433e4ee 100644 --- a/packages/bridge-controller/src/bridge-controller.test.ts +++ b/packages/bridge-controller/src/bridge-controller.test.ts @@ -2600,7 +2600,7 @@ describe('BridgeController', function () { [FeatureId.PERPS]: { aggIds: ['debridge', 'socket'], bridgeIds: ['bridge1', 'bridge2'], - noFee: true, + fee: 0, }, }, }); @@ -2609,7 +2609,7 @@ describe('BridgeController', function () { })); }); - it('should override aggIds and noFee in perps request', async () => { + it('should override aggIds and fee in perps request', async () => { const fetchBridgeQuotesSpy = jest .spyOn(fetchUtils, 'fetchBridgeQuotes') .mockResolvedValueOnce({ @@ -2631,7 +2631,7 @@ describe('BridgeController', function () { bridgeIds: ['other', 'debridge'], gasIncluded: false, gasIncluded7702: false, - noFee: false, + fee: 0, }, null, FeatureId.PERPS, @@ -2652,9 +2652,9 @@ describe('BridgeController', function () { ], "destChainId": "1", "destTokenAddress": "0x1234", + "fee": 0, "gasIncluded": false, "gasIncluded7702": false, - "noFee": true, "slippage": 0.5, "srcChainId": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", "srcTokenAddress": "NATIVE", @@ -2697,7 +2697,6 @@ describe('BridgeController', function () { bridgeIds: ['other', 'debridge'], gasIncluded: false, gasIncluded7702: false, - noFee: false, } as never, null, FeatureId.PERPS, @@ -2708,7 +2707,7 @@ describe('BridgeController', function () { expect(bridgeController.state).toStrictEqual(expectedControllerState); }); - it('should add aggIds and noFee to perps request', async () => { + it('should add aggIds and fee to perps request', async () => { const fetchBridgeQuotesSpy = jest .spyOn(fetchUtils, 'fetchBridgeQuotes') .mockResolvedValueOnce({ @@ -2748,9 +2747,9 @@ describe('BridgeController', function () { ], "destChainId": "1", "destTokenAddress": "0x1234", + "fee": 0, "gasIncluded": false, "gasIncluded7702": false, - "noFee": true, "slippage": 0.5, "srcChainId": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", "srcTokenAddress": "NATIVE", @@ -2770,7 +2769,7 @@ describe('BridgeController', function () { expect(bridgeController.state).toStrictEqual(expectedControllerState); }); - it('should not add aggIds and noFee if featureId is not specified', async () => { + it('should not add aggIds and fee if featureId is not specified', async () => { const fetchBridgeQuotesSpy = jest .spyOn(fetchUtils, 'fetchBridgeQuotes') .mockResolvedValueOnce({ diff --git a/packages/bridge-controller/src/types.ts b/packages/bridge-controller/src/types.ts index 3e5c9b3535a..5329a33bab4 100644 --- a/packages/bridge-controller/src/types.ts +++ b/packages/bridge-controller/src/types.ts @@ -216,7 +216,10 @@ export type QuoteRequest< * Whether to request quotes that use EIP-7702 delegated gasless execution */ gasIncluded7702: boolean; - noFee?: boolean; + /** + * The fee that will be charged by MetaMask + */ + fee?: number; }; export enum StatusTypes { diff --git a/packages/bridge-controller/src/utils/fetch.test.ts b/packages/bridge-controller/src/utils/fetch.test.ts index 9627e9bec82..2411edeef49 100644 --- a/packages/bridge-controller/src/utils/fetch.test.ts +++ b/packages/bridge-controller/src/utils/fetch.test.ts @@ -354,7 +354,7 @@ describe('fetch', () => { mockConsoleWarn.mockRestore(); }); - it('should fetch bridge quotes successfully, with aggIds, bridgeIds and noFee=true', async () => { + it('should fetch bridge quotes successfully, with aggIds, bridgeIds and fee=0', async () => { mockFetchFn.mockResolvedValue(mockBridgeQuotesNativeErc20); const { signal } = new AbortController(); @@ -371,7 +371,7 @@ describe('fetch', () => { gasIncluded7702: false, aggIds: ['socket', 'lifi'], bridgeIds: ['bridge1', 'bridge2'], - noFee: true, + fee: 0, }, signal, BridgeClientId.EXTENSION, @@ -382,7 +382,7 @@ describe('fetch', () => { ); expect(mockFetchFn).toHaveBeenCalledWith( - 'https://bridge.api.cx.metamask.io/getQuote?walletAddress=0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984&destWalletAddress=0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984&srcChainId=1&destChainId=10&srcTokenAddress=0x0000000000000000000000000000000000000000&destTokenAddress=0x0000000000000000000000000000000000000000&srcTokenAmount=20000&insufficientBal=false&resetApproval=false&gasIncluded=false&gasIncluded7702=false&slippage=0.5&noFee=true&aggIds=socket%2Clifi&bridgeIds=bridge1%2Cbridge2', + 'https://bridge.api.cx.metamask.io/getQuote?walletAddress=0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984&destWalletAddress=0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984&srcChainId=1&destChainId=10&srcTokenAddress=0x0000000000000000000000000000000000000000&destTokenAddress=0x0000000000000000000000000000000000000000&srcTokenAmount=20000&insufficientBal=false&resetApproval=false&gasIncluded=false&gasIncluded7702=false&slippage=0.5&fee=0&aggIds=socket%2Clifi&bridgeIds=bridge1%2Cbridge2', { headers: { 'X-Client-Id': 'extension', 'Client-Version': '1.0.0' }, signal, diff --git a/packages/bridge-controller/src/utils/fetch.ts b/packages/bridge-controller/src/utils/fetch.ts index 96e9311ad13..95f994d14de 100644 --- a/packages/bridge-controller/src/utils/fetch.ts +++ b/packages/bridge-controller/src/utils/fetch.ts @@ -82,8 +82,8 @@ const formatQueryParams = (request: GenericQuoteRequest): URLSearchParams => { if (request.slippage !== undefined) { normalizedRequest.slippage = request.slippage; } - if (request.noFee !== undefined) { - normalizedRequest.noFee = request.noFee; + if (request.fee !== undefined) { + normalizedRequest.fee = request.fee; } if (request.aggIds && request.aggIds.length > 0) { normalizedRequest.aggIds = request.aggIds; diff --git a/packages/bridge-controller/src/utils/validators.ts b/packages/bridge-controller/src/utils/validators.ts index 3082ae0f196..be950ab8564 100644 --- a/packages/bridge-controller/src/utils/validators.ts +++ b/packages/bridge-controller/src/utils/validators.ts @@ -122,7 +122,7 @@ export const PriceImpactThresholdSchema = type({ const GenericQuoteRequestSchema = type({ aggIds: optional(array(string())), bridgeIds: optional(array(string())), - noFee: optional(boolean()), + fee: optional(number()), }); const FeatureIdSchema = enums(Object.values(FeatureId)); From 596b8ea95d9dd39eb695834bc9acd32b6b0d5b64 Mon Sep 17 00:00:00 2001 From: Chingiz Mardanov Date: Tue, 28 Oct 2025 11:59:42 -0400 Subject: [PATCH 2/4] chore: update changelog --- packages/bridge-controller/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bridge-controller/CHANGELOG.md b/packages/bridge-controller/CHANGELOG.md index be10a43b4da..28f284b7d83 100644 --- a/packages/bridge-controller/CHANGELOG.md +++ b/packages/bridge-controller/CHANGELOG.md @@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add `BridgeControllerGetStateAction` and `BridgeControllerStateChangeEvent` types ([#6444](https://github.com/MetaMask/core/pull/6444)) ### Changed - +- **BREAKING:** `noFee` flag was replaced with `fee` flag in bridge api requests ([#6964](https://github.com/MetaMask/core/pull/6964)) - **BREAKING:** Use new `Messenger` from `@metamask/messenger` ([#6444](https://github.com/MetaMask/core/pull/6444)) - Previously, `BridgeController` accepted a `RestrictedMessenger` instance from `@metamask/base-controller`. - **BREAKING:** Metadata property `anonymous` renamed to `includeInDebugSnapshot` ([#6444](https://github.com/MetaMask/core/pull/6444)) From c9fae6301c68b12aaa20edb46ba9f5338cc6442c Mon Sep 17 00:00:00 2001 From: Chingiz Mardanov Date: Thu, 30 Oct 2025 09:30:10 -0400 Subject: [PATCH 3/4] fix: changelog --- packages/bridge-controller/CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/bridge-controller/CHANGELOG.md b/packages/bridge-controller/CHANGELOG.md index 6f041fff23b..a82a063375a 100644 --- a/packages/bridge-controller/CHANGELOG.md +++ b/packages/bridge-controller/CHANGELOG.md @@ -36,7 +36,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add `BridgeControllerGetStateAction` and `BridgeControllerStateChangeEvent` types ([#6444](https://github.com/MetaMask/core/pull/6444)) ### Changed -- **BREAKING:** `noFee` flag was replaced with `fee` flag in bridge api requests ([#6964](https://github.com/MetaMask/core/pull/6964)) + +- **BREAKING:** `noFee` flag was replaced with `fee` flag in bridge api requests ([#6964](https://github.com/MetaMask/core/pull/6964)) - **BREAKING:** Use new `Messenger` from `@metamask/messenger` ([#6444](https://github.com/MetaMask/core/pull/6444)) - Previously, `BridgeController` accepted a `RestrictedMessenger` instance from `@metamask/base-controller`. - **BREAKING:** Metadata property `anonymous` renamed to `includeInDebugSnapshot` ([#6444](https://github.com/MetaMask/core/pull/6444)) From 703adc80cef2aa60bfb54bdd83d5232897fdecbd Mon Sep 17 00:00:00 2001 From: Chingiz Mardanov Date: Thu, 30 Oct 2025 10:04:20 -0400 Subject: [PATCH 4/4] chore: update changelog --- packages/bridge-controller/CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/bridge-controller/CHANGELOG.md b/packages/bridge-controller/CHANGELOG.md index a82a063375a..04a1d8f2c69 100644 --- a/packages/bridge-controller/CHANGELOG.md +++ b/packages/bridge-controller/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- **BREAKING:** `noFee` flag was replaced with `fee` flag in bridge api requests ([#6964](https://github.com/MetaMask/core/pull/6964)) + ## [56.0.3] ### Fixed @@ -37,7 +41,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- **BREAKING:** `noFee` flag was replaced with `fee` flag in bridge api requests ([#6964](https://github.com/MetaMask/core/pull/6964)) - **BREAKING:** Use new `Messenger` from `@metamask/messenger` ([#6444](https://github.com/MetaMask/core/pull/6444)) - Previously, `BridgeController` accepted a `RestrictedMessenger` instance from `@metamask/base-controller`. - **BREAKING:** Metadata property `anonymous` renamed to `includeInDebugSnapshot` ([#6444](https://github.com/MetaMask/core/pull/6444))