Skip to content

feat: use remote-feature-flag-controller for bridge flags #5708

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 15 commits into
base: main
Choose a base branch
from

Conversation

infiniteflower
Copy link
Contributor

@infiniteflower infiniteflower commented Apr 24, 2025

Explanation

This PR updates the BridgeController to consume feature flags from the RemoteFeatureFlagController rather than the Bridge API.

References

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed, highlighting breaking changes as necessary
  • I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes

@infiniteflower infiniteflower marked this pull request as ready for review April 24, 2025 18:26
@infiniteflower infiniteflower requested review from a team as code owners April 24, 2025 18:26
@amitabh94 amitabh94 requested a review from Copilot April 24, 2025 23:43
Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR updates the BridgeController and related utilities to consume feature flags via the RemoteFeatureFlagController rather than the Bridge API. Key changes include:

  • Refactoring the feature flag validation and type definitions to use a unified PlatformConfig.
  • Modifying the fetch function to retrieve feature flags using a messenger call instead of direct API fetch.
  • Updating selectors, tests, and changelogs to align with the new feature flag structure.

Reviewed Changes

Copilot reviewed 11 out of 14 changed files in this pull request and generated no comments.

Show a summary per file
File Description
packages/bridge-controller/src/utils/validators.ts Updated validator to check against PlatformConfigSchema instead of legacy keys.
packages/bridge-controller/src/utils/fetch.ts Rewrote feature flag fetching to use the RemoteFeatureFlagController and updated config extraction.
packages/bridge-controller/src/utils/fetch.test.ts Modified tests to work with the new fetch signature and default config behavior.
packages/bridge-controller/src/types.ts Removed client-specific feature flag keys and updated type definitions.
packages/bridge-controller/src/selectors.ts Removed featureFlagsKey parameter and simplified state access.
packages/bridge-controller/src/constants/bridge.ts Updated default state configuration to use the new flattened structure.
packages/bridge-controller/src/bridge-controller.ts Adjusted feature flag usage and interval configuration logic.
packages/bridge-controller/src/bridge-controller.test.ts Updated tests to validate the new feature flag values and messenger mocks.
packages/bridge-controller/CHANGELOG.md Added a breaking change note regarding the new feature flag source.
Files not reviewed (3)
  • packages/bridge-controller/package.json: Language not supported
  • packages/bridge-controller/tsconfig.build.json: Language not supported
  • packages/bridge-controller/tsconfig.json: Language not supported
Comments suppressed due to low confidence (2)

packages/bridge-controller/src/utils/fetch.ts:46

  • Remove or replace this debugging log before production deployment to avoid leaking internal state information.
console.log('HELLO remoteFeatureFlagControllerState', remoteFeatureFlagControllerState);

packages/bridge-controller/src/utils/fetch.test.ts:226

  • [nitpick] Consider updating the test description to more accurately reflect that the function returns a fallback default config on error rather than throwing an exception.
it('should handle fetch error', async () => {

Copy link
Member

@micaelae micaelae left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@infiniteflower infiniteflower force-pushed the feat/bridge-remote-feature-flag-controller branch from 69af7a1 to f1847b2 Compare April 28, 2025 20:09
@infiniteflower
Copy link
Contributor Author

@metamaskbot publish-preview

Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/accounts-controller": "27.0.0-preview-debb301",
  "@metamask-previews/address-book-controller": "6.0.3-preview-debb301",
  "@metamask-previews/announcement-controller": "7.0.3-preview-debb301",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-debb301",
  "@metamask-previews/approval-controller": "7.1.3-preview-debb301",
  "@metamask-previews/assets-controllers": "60.0.0-preview-debb301",
  "@metamask-previews/base-controller": "8.0.0-preview-debb301",
  "@metamask-previews/bridge-controller": "19.0.0-preview-debb301",
  "@metamask-previews/bridge-status-controller": "16.0.0-preview-debb301",
  "@metamask-previews/build-utils": "3.0.3-preview-debb301",
  "@metamask-previews/chain-agnostic-permission": "0.5.0-preview-debb301",
  "@metamask-previews/composable-controller": "11.0.0-preview-debb301",
  "@metamask-previews/controller-utils": "11.7.0-preview-debb301",
  "@metamask-previews/delegation-controller": "0.1.0-preview-debb301",
  "@metamask-previews/earn-controller": "0.12.0-preview-debb301",
  "@metamask-previews/eip1193-permission-middleware": "0.1.0-preview-debb301",
  "@metamask-previews/ens-controller": "16.0.0-preview-debb301",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-debb301",
  "@metamask-previews/gas-fee-controller": "23.0.0-preview-debb301",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-debb301",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-debb301",
  "@metamask-previews/keyring-controller": "21.0.4-preview-debb301",
  "@metamask-previews/logging-controller": "6.0.4-preview-debb301",
  "@metamask-previews/message-manager": "12.0.1-preview-debb301",
  "@metamask-previews/multichain": "4.0.0-preview-debb301",
  "@metamask-previews/multichain-api-middleware": "0.2.0-preview-debb301",
  "@metamask-previews/multichain-network-controller": "0.5.1-preview-debb301",
  "@metamask-previews/multichain-transactions-controller": "0.9.0-preview-debb301",
  "@metamask-previews/name-controller": "8.0.3-preview-debb301",
  "@metamask-previews/network-controller": "23.2.0-preview-debb301",
  "@metamask-previews/notification-services-controller": "6.0.0-preview-debb301",
  "@metamask-previews/permission-controller": "11.0.6-preview-debb301",
  "@metamask-previews/permission-log-controller": "3.0.3-preview-debb301",
  "@metamask-previews/phishing-controller": "12.5.0-preview-debb301",
  "@metamask-previews/polling-controller": "13.0.0-preview-debb301",
  "@metamask-previews/preferences-controller": "17.0.0-preview-debb301",
  "@metamask-previews/profile-sync-controller": "12.0.0-preview-debb301",
  "@metamask-previews/queued-request-controller": "10.0.0-preview-debb301",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-debb301",
  "@metamask-previews/remote-feature-flag-controller": "1.6.0-preview-debb301",
  "@metamask-previews/sample-controllers": "0.1.0-preview-debb301",
  "@metamask-previews/selected-network-controller": "22.0.0-preview-debb301",
  "@metamask-previews/signature-controller": "27.1.0-preview-debb301",
  "@metamask-previews/token-search-discovery-controller": "3.1.0-preview-debb301",
  "@metamask-previews/transaction-controller": "54.2.0-preview-debb301",
  "@metamask-previews/user-operation-controller": "33.0.0-preview-debb301"
}

@infiniteflower
Copy link
Contributor Author

@metamaskbot publish-preview

Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/accounts-controller": "27.0.0-preview-836a8df",
  "@metamask-previews/address-book-controller": "6.0.3-preview-836a8df",
  "@metamask-previews/announcement-controller": "7.0.3-preview-836a8df",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-836a8df",
  "@metamask-previews/approval-controller": "7.1.3-preview-836a8df",
  "@metamask-previews/assets-controllers": "60.0.0-preview-836a8df",
  "@metamask-previews/base-controller": "8.0.0-preview-836a8df",
  "@metamask-previews/bridge-controller": "19.0.0-preview-836a8df",
  "@metamask-previews/bridge-status-controller": "16.0.0-preview-836a8df",
  "@metamask-previews/build-utils": "3.0.3-preview-836a8df",
  "@metamask-previews/chain-agnostic-permission": "0.5.0-preview-836a8df",
  "@metamask-previews/composable-controller": "11.0.0-preview-836a8df",
  "@metamask-previews/controller-utils": "11.7.0-preview-836a8df",
  "@metamask-previews/delegation-controller": "0.1.0-preview-836a8df",
  "@metamask-previews/earn-controller": "0.12.0-preview-836a8df",
  "@metamask-previews/eip1193-permission-middleware": "0.1.0-preview-836a8df",
  "@metamask-previews/ens-controller": "16.0.0-preview-836a8df",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-836a8df",
  "@metamask-previews/gas-fee-controller": "23.0.0-preview-836a8df",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-836a8df",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-836a8df",
  "@metamask-previews/keyring-controller": "21.0.4-preview-836a8df",
  "@metamask-previews/logging-controller": "6.0.4-preview-836a8df",
  "@metamask-previews/message-manager": "12.0.1-preview-836a8df",
  "@metamask-previews/multichain": "4.0.0-preview-836a8df",
  "@metamask-previews/multichain-api-middleware": "0.2.0-preview-836a8df",
  "@metamask-previews/multichain-network-controller": "0.5.1-preview-836a8df",
  "@metamask-previews/multichain-transactions-controller": "0.9.0-preview-836a8df",
  "@metamask-previews/name-controller": "8.0.3-preview-836a8df",
  "@metamask-previews/network-controller": "23.2.0-preview-836a8df",
  "@metamask-previews/notification-services-controller": "6.0.0-preview-836a8df",
  "@metamask-previews/permission-controller": "11.0.6-preview-836a8df",
  "@metamask-previews/permission-log-controller": "3.0.3-preview-836a8df",
  "@metamask-previews/phishing-controller": "12.5.0-preview-836a8df",
  "@metamask-previews/polling-controller": "13.0.0-preview-836a8df",
  "@metamask-previews/preferences-controller": "17.0.0-preview-836a8df",
  "@metamask-previews/profile-sync-controller": "12.0.0-preview-836a8df",
  "@metamask-previews/queued-request-controller": "10.0.0-preview-836a8df",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-836a8df",
  "@metamask-previews/remote-feature-flag-controller": "1.6.0-preview-836a8df",
  "@metamask-previews/sample-controllers": "0.1.0-preview-836a8df",
  "@metamask-previews/selected-network-controller": "22.0.0-preview-836a8df",
  "@metamask-previews/signature-controller": "27.1.0-preview-836a8df",
  "@metamask-previews/token-search-discovery-controller": "3.1.0-preview-836a8df",
  "@metamask-previews/transaction-controller": "54.2.0-preview-836a8df",
  "@metamask-previews/user-operation-controller": "33.0.0-preview-836a8df"
}

@infiniteflower infiniteflower force-pushed the feat/bridge-remote-feature-flag-controller branch from b225df4 to 47d1bd5 Compare April 29, 2025 14:47
@infiniteflower
Copy link
Contributor Author

@metamaskbot publish-preview

Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/accounts-controller": "27.0.0-preview-47d1bd5",
  "@metamask-previews/address-book-controller": "6.0.3-preview-47d1bd5",
  "@metamask-previews/announcement-controller": "7.0.3-preview-47d1bd5",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-47d1bd5",
  "@metamask-previews/approval-controller": "7.1.3-preview-47d1bd5",
  "@metamask-previews/assets-controllers": "60.0.0-preview-47d1bd5",
  "@metamask-previews/base-controller": "8.0.1-preview-47d1bd5",
  "@metamask-previews/bridge-controller": "19.0.0-preview-47d1bd5",
  "@metamask-previews/bridge-status-controller": "16.0.0-preview-47d1bd5",
  "@metamask-previews/build-utils": "3.0.3-preview-47d1bd5",
  "@metamask-previews/chain-agnostic-permission": "0.5.0-preview-47d1bd5",
  "@metamask-previews/composable-controller": "11.0.0-preview-47d1bd5",
  "@metamask-previews/controller-utils": "11.7.0-preview-47d1bd5",
  "@metamask-previews/delegation-controller": "0.1.0-preview-47d1bd5",
  "@metamask-previews/earn-controller": "0.12.0-preview-47d1bd5",
  "@metamask-previews/eip1193-permission-middleware": "0.1.0-preview-47d1bd5",
  "@metamask-previews/ens-controller": "16.0.0-preview-47d1bd5",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-47d1bd5",
  "@metamask-previews/gas-fee-controller": "23.0.0-preview-47d1bd5",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-47d1bd5",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-47d1bd5",
  "@metamask-previews/keyring-controller": "21.0.4-preview-47d1bd5",
  "@metamask-previews/logging-controller": "6.0.4-preview-47d1bd5",
  "@metamask-previews/message-manager": "12.0.1-preview-47d1bd5",
  "@metamask-previews/multichain": "4.0.0-preview-47d1bd5",
  "@metamask-previews/multichain-api-middleware": "0.2.0-preview-47d1bd5",
  "@metamask-previews/multichain-network-controller": "0.5.1-preview-47d1bd5",
  "@metamask-previews/multichain-transactions-controller": "0.9.0-preview-47d1bd5",
  "@metamask-previews/name-controller": "8.0.3-preview-47d1bd5",
  "@metamask-previews/network-controller": "23.2.0-preview-47d1bd5",
  "@metamask-previews/notification-services-controller": "6.0.0-preview-47d1bd5",
  "@metamask-previews/permission-controller": "11.0.6-preview-47d1bd5",
  "@metamask-previews/permission-log-controller": "3.0.3-preview-47d1bd5",
  "@metamask-previews/phishing-controller": "12.5.0-preview-47d1bd5",
  "@metamask-previews/polling-controller": "13.0.0-preview-47d1bd5",
  "@metamask-previews/preferences-controller": "17.0.0-preview-47d1bd5",
  "@metamask-previews/profile-sync-controller": "12.0.0-preview-47d1bd5",
  "@metamask-previews/queued-request-controller": "10.0.0-preview-47d1bd5",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-47d1bd5",
  "@metamask-previews/remote-feature-flag-controller": "1.6.0-preview-47d1bd5",
  "@metamask-previews/sample-controllers": "0.1.0-preview-47d1bd5",
  "@metamask-previews/selected-network-controller": "22.0.0-preview-47d1bd5",
  "@metamask-previews/signature-controller": "27.1.0-preview-47d1bd5",
  "@metamask-previews/token-search-discovery-controller": "3.1.0-preview-47d1bd5",
  "@metamask-previews/transaction-controller": "54.2.0-preview-47d1bd5",
  "@metamask-previews/user-operation-controller": "33.0.0-preview-47d1bd5"
}

@@ -350,14 +336,13 @@ export enum BridgeUserAction {
UPDATE_QUOTE_PARAMS = 'updateBridgeQuoteRequestParams',
}
export enum BridgeBackgroundAction {
SET_FEATURE_FLAGS = 'setBridgeFeatureFlags',
SET_CHAIN_INTERVAL_LENGTH = 'setChainIntervalLength',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do the clients need to call this handler? Or can we set the interval length within the controller as needed?

Copy link
Contributor Author

@infiniteflower infiniteflower Apr 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#setIntervalLength used to be called inside setBridgeFeatureFlags but since that's gone now, I just put it into its own function setChainIntervalLength and made it public to maintain the previous behavior where it could be called by clients, on say Bridge UI init.

I do notice that we previously called #setIntervalLength (now setChainIntervalLength) inside updateBridgeQuoteRequestParams. Do we need to call this from the client if it's called when we update the quote request?

@@ -60,7 +60,8 @@ export type BridgeAppState = BridgeControllerState & {
gasFeeEstimates: GasFeeEstimates;
} & ExchangeRateControllerState & {
participateInMetaMetrics: boolean;
};
} & { bridgeConfig: Json };

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we use this as the expected type from clients instead? So we can just pass in the entire state of the RemoteFeatureFlagsController

Suggested change
} & {
remoteFeatureFlags: {
bridgeConfig: Json;
};
};

};

const createFeatureFlagsSelector = createSelector_.withTypes<{
bridgeConfig: unknown;
}>();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar comment as above regarding remoteFeatureFlags controller stat

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants