core icon indicating copy to clipboard operation
core copied to clipboard

Group network configurations by chain

Open mcmire opened this issue 9 months ago • 11 comments

Explanation

Currently, in the client, it is possible to have multiple networks with different RPC endpoint URLs representing the same chain. This creates a problem because if all we have is a chain ID, we don't know which URL to use for requests.

To solve this, we plan on consolidating the UX on the client side such that each network corresponds to exactly one chain. Users can then select which default RPC URL they'd like to use for requests. This commit implements the controller changes necessary to support this UX.

Here are some more details on the changes here:

  • The concept of a network configuration has been repurposed such that instead of representing an RPC endpoint, it now represents a whole chain.

    • A network configuration may have multiple RPC endpoints, and one of them must be designated as the default.
    • Some RPC endpoints are special in that they represent Infura API URLs; these have the same object shape as "non-Infura" (custom) RPC endpoints, but the Infura project ID is hidden and injected into the RPC URL when creating the network client.
    • There is no longer a 1-to-1 relationship between network configuration and network client; rather, the 1-to-1 relationship exists between RPC endpoint and network client. This means that the ID of the network client which is created for an RPC endpoint is stored on that RPC endpoint instead of the whole network configuration.
  • The networkConfigurations state property has been replaced with networkConfigurationsByChainId. This continues to be an object, but the data inside is organized such that network configurations are identified by chain ID instead of network client ID as they were previously.

  • The methods upsertNetworkConfiguration and removeNetworkConfiguration have been removed. These methods always did more than simply add or remove a network configuration; they also updated the registry of network clients. Instead, these methods have been replaced with addNetwork, updateNetwork, and removeNetwork.

    • addNetwork creates new network clients for each RPC endpoint in the given network configuration.
    • updateNetwork takes a chain ID referring to a network configuration and a draft version of that network configuration, and adds or removes network clients for added or removed RPC endpoints.
    • removeNetwork takes a chain ID referring to a network configuration and removes the network clients for each of its RPC endpoints.
  • In addition, due to the changes to network configuration itself, there are new restrictions on networkConfigurationsByChainId, which are validated on initialization and on update. These are:

    • The network controller cannot be initialized with an empty collection of network configurations. This is because there must be a selected network client so that consumers have a provider to use out of the gate.
    • Consequently, the last network configuration cannot be removed.
    • The network configuration that contains a reference to the currently selected network client cannot be removed.
    • The chain ID of a network configuration must match the same chain that it's filed under in networkConfigurationsByChainId.
    • No two network configurations can have the same chain ID.
    • A RPC endpoint in a network configuration must have a well-formed URL.
    • A network configuration cannot have duplicate RPC endpoints.
    • No two RPC endpoints (regardless of network configuration) can have the same URL. Equality is currently determined by normalizing URLs as per RFC 3986 and may include data like request headers in the future.
    • If a network configuration has an Infura RPC endpoint, its chain ID must match the set chain ID of the network configuration.
      • Changing the chain ID of a network configuration is possible, but any existing Infura RPC endpoint must be replaced with the one that matches the new chain ID.
    • No two RPC endpoints (regardless of network configuration) can have the same network client ID.
  • Finally, the trackMetaMetricsEvent option has been removed from the constructor. This was previously used in upsertNetworkConfiguration to create a MetaMetrics event when a new network added, but I've added a new event NetworkController:networkAdded to allow the client to do this on its own accord.

References

Fixes #4189. Fixes #3793.

Changelog

(Updated in the PR.)

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 highlighted breaking changes using the "BREAKING" category above as appropriate

mcmire avatar May 17 '24 04:05 mcmire

👍 Dependency issues cleared. Learn more about Socket for GitHub ↗︎

This PR previously contained dependency changes with security issues that have been resolved, removed, or ignored.

View full report↗︎

socket-security[bot] avatar May 17 '24 04:05 socket-security[bot]

@metamaskbot publish-preview

mcmire avatar Jun 14 '24 17:06 mcmire

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": "17.0.0-preview-0ee2e0a7",
  "@metamask-previews/address-book-controller": "5.0.0-preview-0ee2e0a7",
  "@metamask-previews/announcement-controller": "7.0.0-preview-0ee2e0a7",
  "@metamask-previews/approval-controller": "7.0.0-preview-0ee2e0a7",
  "@metamask-previews/assets-controllers": "33.0.0-preview-0ee2e0a7",
  "@metamask-previews/base-controller": "6.0.0-preview-0ee2e0a7",
  "@metamask-previews/build-utils": "3.0.0-preview-0ee2e0a7",
  "@metamask-previews/chain-controller": "0.1.0-preview-0ee2e0a7",
  "@metamask-previews/composable-controller": "7.0.0-preview-0ee2e0a7",
  "@metamask-previews/controller-utils": "11.0.0-preview-0ee2e0a7",
  "@metamask-previews/ens-controller": "12.0.0-preview-0ee2e0a7",
  "@metamask-previews/eth-json-rpc-provider": "4.0.0-preview-0ee2e0a7",
  "@metamask-previews/gas-fee-controller": "17.0.0-preview-0ee2e0a7",
  "@metamask-previews/json-rpc-engine": "9.0.0-preview-0ee2e0a7",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.0-preview-0ee2e0a7",
  "@metamask-previews/keyring-controller": "17.1.0-preview-0ee2e0a7",
  "@metamask-previews/logging-controller": "5.0.0-preview-0ee2e0a7",
  "@metamask-previews/message-manager": "10.0.0-preview-0ee2e0a7",
  "@metamask-previews/name-controller": "8.0.0-preview-0ee2e0a7",
  "@metamask-previews/network-controller": "19.0.0-preview-0ee2e0a7",
  "@metamask-previews/notification-controller": "6.0.0-preview-0ee2e0a7",
  "@metamask-previews/notification-services-controller": "0.0.0-preview-0ee2e0a7",
  "@metamask-previews/permission-controller": "10.0.0-preview-0ee2e0a7",
  "@metamask-previews/permission-log-controller": "3.0.0-preview-0ee2e0a7",
  "@metamask-previews/phishing-controller": "10.0.0-preview-0ee2e0a7",
  "@metamask-previews/polling-controller": "8.0.0-preview-0ee2e0a7",
  "@metamask-previews/preferences-controller": "13.0.0-preview-0ee2e0a7",
  "@metamask-previews/profile-sync-controller": "0.0.0-preview-0ee2e0a7",
  "@metamask-previews/queued-request-controller": "0.12.0-preview-0ee2e0a7",
  "@metamask-previews/rate-limit-controller": "6.0.0-preview-0ee2e0a7",
  "@metamask-previews/selected-network-controller": "15.0.2-preview-0ee2e0a7",
  "@metamask-previews/signature-controller": "18.0.0-preview-0ee2e0a7",
  "@metamask-previews/transaction-controller": "33.0.0-preview-0ee2e0a7",
  "@metamask-previews/user-operation-controller": "12.0.0-preview-0ee2e0a7"
}

github-actions[bot] avatar Jun 14 '24 17:06 github-actions[bot]

@metamaskbot publish-preview

mcmire avatar Jun 18 '24 20:06 mcmire

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": "17.0.0-preview-98d4c2a0",
  "@metamask-previews/address-book-controller": "5.0.0-preview-98d4c2a0",
  "@metamask-previews/announcement-controller": "7.0.0-preview-98d4c2a0",
  "@metamask-previews/approval-controller": "7.0.0-preview-98d4c2a0",
  "@metamask-previews/assets-controllers": "33.0.0-preview-98d4c2a0",
  "@metamask-previews/base-controller": "6.0.0-preview-98d4c2a0",
  "@metamask-previews/build-utils": "3.0.0-preview-98d4c2a0",
  "@metamask-previews/chain-controller": "0.1.0-preview-98d4c2a0",
  "@metamask-previews/composable-controller": "7.0.0-preview-98d4c2a0",
  "@metamask-previews/controller-utils": "11.0.0-preview-98d4c2a0",
  "@metamask-previews/ens-controller": "12.0.0-preview-98d4c2a0",
  "@metamask-previews/eth-json-rpc-provider": "4.0.0-preview-98d4c2a0",
  "@metamask-previews/gas-fee-controller": "17.0.0-preview-98d4c2a0",
  "@metamask-previews/json-rpc-engine": "9.0.0-preview-98d4c2a0",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.0-preview-98d4c2a0",
  "@metamask-previews/keyring-controller": "17.1.0-preview-98d4c2a0",
  "@metamask-previews/logging-controller": "5.0.0-preview-98d4c2a0",
  "@metamask-previews/message-manager": "10.0.0-preview-98d4c2a0",
  "@metamask-previews/name-controller": "8.0.0-preview-98d4c2a0",
  "@metamask-previews/network-controller": "19.0.0-preview-98d4c2a0",
  "@metamask-previews/notification-controller": "6.0.0-preview-98d4c2a0",
  "@metamask-previews/notification-services-controller": "0.0.0-preview-98d4c2a0",
  "@metamask-previews/permission-controller": "10.0.0-preview-98d4c2a0",
  "@metamask-previews/permission-log-controller": "3.0.0-preview-98d4c2a0",
  "@metamask-previews/phishing-controller": "10.0.0-preview-98d4c2a0",
  "@metamask-previews/polling-controller": "8.0.0-preview-98d4c2a0",
  "@metamask-previews/preferences-controller": "13.0.0-preview-98d4c2a0",
  "@metamask-previews/profile-sync-controller": "0.0.0-preview-98d4c2a0",
  "@metamask-previews/queued-request-controller": "1.0.0-preview-98d4c2a0",
  "@metamask-previews/rate-limit-controller": "6.0.0-preview-98d4c2a0",
  "@metamask-previews/selected-network-controller": "15.0.2-preview-98d4c2a0",
  "@metamask-previews/signature-controller": "18.0.0-preview-98d4c2a0",
  "@metamask-previews/transaction-controller": "33.0.0-preview-98d4c2a0",
  "@metamask-previews/user-operation-controller": "12.0.0-preview-98d4c2a0"
}

github-actions[bot] avatar Jun 18 '24 21:06 github-actions[bot]

Adding this before I forget: Brian suggested that we add a way to access the network client configuration for a network client from state in order to clean up selectors in the extension. To solve this, we could add another state property networkClientConfigurationsByNetworkClientId, and subscribe to the NetworkConfiguration:stateChange event to keep it automatically in sync with networkConfigurationsByChainId.

mcmire avatar Jul 01 '24 15:07 mcmire

New changes:

  • defaultRpcEndpointUrl is now defaultRpcEndpointIndex
  • blockExplorerUrl is now blockExplorerUrls; added defaultBlockExplorerUrlIndex
  • The name property on RpcEndpoint is now optional

mcmire avatar Jul 02 '24 23:07 mcmire

@metamaskbot publish-previews

mcmire avatar Jul 02 '24 23:07 mcmire

@metamaskbot publish-preview

mcmire avatar Jul 02 '24 23:07 mcmire

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": "17.1.1-preview-1c4ca62e",
  "@metamask-previews/address-book-controller": "5.0.0-preview-1c4ca62e",
  "@metamask-previews/announcement-controller": "7.0.0-preview-1c4ca62e",
  "@metamask-previews/approval-controller": "7.0.0-preview-1c4ca62e",
  "@metamask-previews/assets-controllers": "34.0.0-preview-1c4ca62e",
  "@metamask-previews/base-controller": "6.0.0-preview-1c4ca62e",
  "@metamask-previews/build-utils": "3.0.0-preview-1c4ca62e",
  "@metamask-previews/chain-controller": "0.1.0-preview-1c4ca62e",
  "@metamask-previews/composable-controller": "7.0.0-preview-1c4ca62e",
  "@metamask-previews/controller-utils": "11.0.0-preview-1c4ca62e",
  "@metamask-previews/ens-controller": "12.0.0-preview-1c4ca62e",
  "@metamask-previews/eth-json-rpc-provider": "4.0.0-preview-1c4ca62e",
  "@metamask-previews/gas-fee-controller": "17.0.0-preview-1c4ca62e",
  "@metamask-previews/json-rpc-engine": "9.0.0-preview-1c4ca62e",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.0-preview-1c4ca62e",
  "@metamask-previews/keyring-controller": "17.1.0-preview-1c4ca62e",
  "@metamask-previews/logging-controller": "5.0.0-preview-1c4ca62e",
  "@metamask-previews/message-manager": "10.0.0-preview-1c4ca62e",
  "@metamask-previews/name-controller": "8.0.0-preview-1c4ca62e",
  "@metamask-previews/network-controller": "19.0.0-preview-1c4ca62e",
  "@metamask-previews/notification-controller": "6.0.0-preview-1c4ca62e",
  "@metamask-previews/notification-services-controller": "0.1.1-preview-1c4ca62e",
  "@metamask-previews/permission-controller": "10.0.0-preview-1c4ca62e",
  "@metamask-previews/permission-log-controller": "3.0.0-preview-1c4ca62e",
  "@metamask-previews/phishing-controller": "10.0.0-preview-1c4ca62e",
  "@metamask-previews/polling-controller": "8.0.0-preview-1c4ca62e",
  "@metamask-previews/preferences-controller": "13.0.0-preview-1c4ca62e",
  "@metamask-previews/profile-sync-controller": "0.1.2-preview-1c4ca62e",
  "@metamask-previews/queued-request-controller": "2.0.0-preview-1c4ca62e",
  "@metamask-previews/rate-limit-controller": "6.0.0-preview-1c4ca62e",
  "@metamask-previews/selected-network-controller": "15.0.2-preview-1c4ca62e",
  "@metamask-previews/signature-controller": "18.0.0-preview-1c4ca62e",
  "@metamask-previews/transaction-controller": "33.0.1-preview-1c4ca62e",
  "@metamask-previews/user-operation-controller": "12.0.1-preview-1c4ca62e"
}

github-actions[bot] avatar Jul 02 '24 23:07 github-actions[bot]

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": "17.1.1-preview-28c65566",
  "@metamask-previews/address-book-controller": "5.0.0-preview-28c65566",
  "@metamask-previews/announcement-controller": "7.0.0-preview-28c65566",
  "@metamask-previews/approval-controller": "7.0.0-preview-28c65566",
  "@metamask-previews/assets-controllers": "34.0.0-preview-28c65566",
  "@metamask-previews/base-controller": "6.0.0-preview-28c65566",
  "@metamask-previews/build-utils": "3.0.0-preview-28c65566",
  "@metamask-previews/chain-controller": "0.1.0-preview-28c65566",
  "@metamask-previews/composable-controller": "7.0.0-preview-28c65566",
  "@metamask-previews/controller-utils": "11.0.0-preview-28c65566",
  "@metamask-previews/ens-controller": "12.0.0-preview-28c65566",
  "@metamask-previews/eth-json-rpc-provider": "4.0.0-preview-28c65566",
  "@metamask-previews/gas-fee-controller": "17.0.0-preview-28c65566",
  "@metamask-previews/json-rpc-engine": "9.0.0-preview-28c65566",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.0-preview-28c65566",
  "@metamask-previews/keyring-controller": "17.1.0-preview-28c65566",
  "@metamask-previews/logging-controller": "5.0.0-preview-28c65566",
  "@metamask-previews/message-manager": "10.0.0-preview-28c65566",
  "@metamask-previews/name-controller": "8.0.0-preview-28c65566",
  "@metamask-previews/network-controller": "19.0.0-preview-28c65566",
  "@metamask-previews/notification-controller": "6.0.0-preview-28c65566",
  "@metamask-previews/notification-services-controller": "0.1.1-preview-28c65566",
  "@metamask-previews/permission-controller": "10.0.0-preview-28c65566",
  "@metamask-previews/permission-log-controller": "3.0.0-preview-28c65566",
  "@metamask-previews/phishing-controller": "10.0.0-preview-28c65566",
  "@metamask-previews/polling-controller": "8.0.0-preview-28c65566",
  "@metamask-previews/preferences-controller": "13.0.0-preview-28c65566",
  "@metamask-previews/profile-sync-controller": "0.1.2-preview-28c65566",
  "@metamask-previews/queued-request-controller": "2.0.0-preview-28c65566",
  "@metamask-previews/rate-limit-controller": "6.0.0-preview-28c65566",
  "@metamask-previews/selected-network-controller": "15.0.2-preview-28c65566",
  "@metamask-previews/signature-controller": "18.0.0-preview-28c65566",
  "@metamask-previews/transaction-controller": "33.0.1-preview-28c65566",
  "@metamask-previews/user-operation-controller": "12.0.1-preview-28c65566"
}

github-actions[bot] avatar Jul 02 '24 23:07 github-actions[bot]

Items to do before merging:

  • Resolve conflicts.
  • The assets team requested that we add an option to updateNetwork which allows for removing the default RPC endpoint by making it possible to simultaneously switching the network. Currently we throw an error when the default RPC endpoint is being removed, but instead of throwing an error we can require a newNetworkClientId option to be passed instead.

mcmire avatar Jul 09 '24 18:07 mcmire

~I thought of something else that I should probably do now vs. later: if the URL of an RPC endpoint changes, but the networkClientId stays the same, then I'm not sure whether the controller will create a new network client or not. If it doesn't, then perhaps we should account for this (because then the URL associated with the RPC endpoint will be different from the actual URL used by the network client). Or, maybe we ask the client to remove the networkClientId if the user changes the URL so that it can be regenerated.~ This is now resolved. If the URL of an RPC endpoint changes then a new network client will be created regardless of the given networkClientId.

mcmire avatar Jul 11 '24 03:07 mcmire

@metamaskbot publish-preview

mcmire avatar Jul 13 '24 04:07 mcmire

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": "17.2.0-preview-5ba43a24",
  "@metamask-previews/address-book-controller": "5.0.0-preview-5ba43a24",
  "@metamask-previews/announcement-controller": "7.0.0-preview-5ba43a24",
  "@metamask-previews/approval-controller": "7.0.1-preview-5ba43a24",
  "@metamask-previews/assets-controllers": "35.0.0-preview-5ba43a24",
  "@metamask-previews/base-controller": "6.0.1-preview-5ba43a24",
  "@metamask-previews/build-utils": "3.0.0-preview-5ba43a24",
  "@metamask-previews/chain-controller": "0.1.0-preview-5ba43a24",
  "@metamask-previews/composable-controller": "7.0.0-preview-5ba43a24",
  "@metamask-previews/controller-utils": "11.0.1-preview-5ba43a24",
  "@metamask-previews/ens-controller": "13.0.0-preview-5ba43a24",
  "@metamask-previews/eth-json-rpc-provider": "4.1.1-preview-5ba43a24",
  "@metamask-previews/gas-fee-controller": "19.0.0-preview-5ba43a24",
  "@metamask-previews/json-rpc-engine": "9.0.1-preview-5ba43a24",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.1-preview-5ba43a24",
  "@metamask-previews/keyring-controller": "17.1.0-preview-5ba43a24",
  "@metamask-previews/logging-controller": "5.0.0-preview-5ba43a24",
  "@metamask-previews/message-manager": "10.0.0-preview-5ba43a24",
  "@metamask-previews/name-controller": "8.0.0-preview-5ba43a24",
  "@metamask-previews/network-controller": "20.0.0-preview-5ba43a24",
  "@metamask-previews/notification-controller": "6.0.0-preview-5ba43a24",
  "@metamask-previews/notification-services-controller": "0.1.1-preview-5ba43a24",
  "@metamask-previews/permission-controller": "10.0.1-preview-5ba43a24",
  "@metamask-previews/permission-log-controller": "3.0.0-preview-5ba43a24",
  "@metamask-previews/phishing-controller": "10.0.0-preview-5ba43a24",
  "@metamask-previews/polling-controller": "9.0.0-preview-5ba43a24",
  "@metamask-previews/preferences-controller": "13.0.0-preview-5ba43a24",
  "@metamask-previews/profile-sync-controller": "0.1.2-preview-5ba43a24",
  "@metamask-previews/queued-request-controller": "3.0.0-preview-5ba43a24",
  "@metamask-previews/rate-limit-controller": "6.0.0-preview-5ba43a24",
  "@metamask-previews/selected-network-controller": "16.0.0-preview-5ba43a24",
  "@metamask-previews/signature-controller": "18.0.0-preview-5ba43a24",
  "@metamask-previews/transaction-controller": "35.0.0-preview-5ba43a24",
  "@metamask-previews/user-operation-controller": "14.0.0-preview-5ba43a24"
}

github-actions[bot] avatar Jul 13 '24 04:07 github-actions[bot]

Changes since last preview build:

  • The updateNetwork method now throws an error when the RPC endpoint that is represented by the globally selected network is removed (otherwise, selectedNetworkClientId would have no corresponding RPC endpoint).
    • To prevent this error, you'll want to detect when an RPC endpoint is being removed and designate which RPC endpoint should be used for the globally selected network by passing a replacementSelectedRpcEndpointIndex option. This must point to an object in rpcEndpoints. updateNetwork will then automatically issue a network switch, and it will update both selectedNetworkClientId and networkConfigurationsByChainId at the same time to avoid creating a moment where the state is invalid.
    • Note that if an RPC endpoint is changed in such a way that necessitates recreating the network client for that RPC endpoint, updateNetwork will automatically use the new network client without having to specify replacementSelectedRpcEndpointIndex.
    • If you'd like to always pass replacementSelectedRpcEndpointIndex, there isn't a good way to get this without looping through networkConfigurationsByChainId. It can be done, but let me know if you need a more convenient way.
  • updateNetwork now throws if you try to add an invalid Infura RPC endpoint or change any part of an Infura RPC endpoint (since they must have specific data at all times).
    • The url must match a specific string.
  • addNetwork and updateNetwork now throw if defaultBlockExplorerUrlIndex is invalid.
  • updateNetwork will now gracefully handle the case in which a networkClientId for a previously added RPC endpoint is unset (it will just fill it back in without creating a new network client)
  • updateNetwork is also smarter about keeping track of RPC endpoints, so for instance you can shuffle around RPC endpoints and it won't change state or create any new network clients.

mcmire avatar Jul 13 '24 04:07 mcmire

@metamaskbot publish-preview

mcmire avatar Jul 17 '24 18:07 mcmire

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": "17.2.0-preview-ee06f305",
  "@metamask-previews/address-book-controller": "5.0.0-preview-ee06f305",
  "@metamask-previews/announcement-controller": "7.0.0-preview-ee06f305",
  "@metamask-previews/approval-controller": "7.0.1-preview-ee06f305",
  "@metamask-previews/assets-controllers": "36.0.0-preview-ee06f305",
  "@metamask-previews/base-controller": "6.0.1-preview-ee06f305",
  "@metamask-previews/build-utils": "3.0.0-preview-ee06f305",
  "@metamask-previews/chain-controller": "0.1.0-preview-ee06f305",
  "@metamask-previews/composable-controller": "7.0.0-preview-ee06f305",
  "@metamask-previews/controller-utils": "11.0.1-preview-ee06f305",
  "@metamask-previews/ens-controller": "13.0.0-preview-ee06f305",
  "@metamask-previews/eth-json-rpc-provider": "4.1.1-preview-ee06f305",
  "@metamask-previews/gas-fee-controller": "19.0.0-preview-ee06f305",
  "@metamask-previews/json-rpc-engine": "9.0.1-preview-ee06f305",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.1-preview-ee06f305",
  "@metamask-previews/keyring-controller": "17.1.1-preview-ee06f305",
  "@metamask-previews/logging-controller": "5.0.0-preview-ee06f305",
  "@metamask-previews/message-manager": "10.0.1-preview-ee06f305",
  "@metamask-previews/name-controller": "8.0.0-preview-ee06f305",
  "@metamask-previews/network-controller": "20.0.0-preview-ee06f305",
  "@metamask-previews/notification-controller": "6.0.0-preview-ee06f305",
  "@metamask-previews/notification-services-controller": "0.1.1-preview-ee06f305",
  "@metamask-previews/permission-controller": "10.0.1-preview-ee06f305",
  "@metamask-previews/permission-log-controller": "3.0.0-preview-ee06f305",
  "@metamask-previews/phishing-controller": "10.1.0-preview-ee06f305",
  "@metamask-previews/polling-controller": "9.0.0-preview-ee06f305",
  "@metamask-previews/preferences-controller": "13.0.0-preview-ee06f305",
  "@metamask-previews/profile-sync-controller": "0.1.3-preview-ee06f305",
  "@metamask-previews/queued-request-controller": "3.0.0-preview-ee06f305",
  "@metamask-previews/rate-limit-controller": "6.0.0-preview-ee06f305",
  "@metamask-previews/selected-network-controller": "16.0.0-preview-ee06f305",
  "@metamask-previews/signature-controller": "18.0.0-preview-ee06f305",
  "@metamask-previews/transaction-controller": "35.0.0-preview-ee06f305",
  "@metamask-previews/user-operation-controller": "14.0.0-preview-ee06f305"
}

github-actions[bot] avatar Jul 17 '24 18:07 github-actions[bot]

Pushed some updates to fix tests, and specifically to ensure that when we are testing updateNetwork we do not try to update a network configuration that has an RPC endpoint that is represented by the selected network client unless we explicitly want to. This should guarantee that we don't have the same issue that Brian reported.

That should be it for updates unless we receive another bug report.

mcmire avatar Jul 19 '24 17:07 mcmire

@metamaskbot publish-preview

mcmire avatar Jul 22 '24 17:07 mcmire

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": "17.2.0-preview-276db038",
  "@metamask-previews/address-book-controller": "5.0.0-preview-276db038",
  "@metamask-previews/announcement-controller": "7.0.0-preview-276db038",
  "@metamask-previews/approval-controller": "7.0.2-preview-276db038",
  "@metamask-previews/assets-controllers": "36.0.0-preview-276db038",
  "@metamask-previews/base-controller": "6.0.2-preview-276db038",
  "@metamask-previews/build-utils": "3.0.0-preview-276db038",
  "@metamask-previews/chain-controller": "0.1.0-preview-276db038",
  "@metamask-previews/composable-controller": "7.0.0-preview-276db038",
  "@metamask-previews/controller-utils": "11.0.2-preview-276db038",
  "@metamask-previews/ens-controller": "13.0.0-preview-276db038",
  "@metamask-previews/eth-json-rpc-provider": "4.1.1-preview-276db038",
  "@metamask-previews/gas-fee-controller": "19.0.0-preview-276db038",
  "@metamask-previews/json-rpc-engine": "9.0.2-preview-276db038",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.2-preview-276db038",
  "@metamask-previews/keyring-controller": "17.1.1-preview-276db038",
  "@metamask-previews/logging-controller": "5.0.0-preview-276db038",
  "@metamask-previews/message-manager": "10.0.1-preview-276db038",
  "@metamask-previews/name-controller": "8.0.0-preview-276db038",
  "@metamask-previews/network-controller": "20.0.0-preview-276db038",
  "@metamask-previews/notification-controller": "6.0.0-preview-276db038",
  "@metamask-previews/notification-services-controller": "0.1.2-preview-276db038",
  "@metamask-previews/permission-controller": "11.0.0-preview-276db038",
  "@metamask-previews/permission-log-controller": "3.0.0-preview-276db038",
  "@metamask-previews/phishing-controller": "10.1.1-preview-276db038",
  "@metamask-previews/polling-controller": "9.0.0-preview-276db038",
  "@metamask-previews/preferences-controller": "13.0.0-preview-276db038",
  "@metamask-previews/profile-sync-controller": "0.1.4-preview-276db038",
  "@metamask-previews/queued-request-controller": "3.0.0-preview-276db038",
  "@metamask-previews/rate-limit-controller": "6.0.0-preview-276db038",
  "@metamask-previews/selected-network-controller": "16.0.0-preview-276db038",
  "@metamask-previews/signature-controller": "18.0.0-preview-276db038",
  "@metamask-previews/transaction-controller": "35.0.0-preview-276db038",
  "@metamask-previews/user-operation-controller": "14.0.0-preview-276db038"
}

github-actions[bot] avatar Jul 22 '24 17:07 github-actions[bot]

Updates since previous preview release:

  • Added AddNetworkFields and UpdateNetworkFields types.

mcmire avatar Jul 22 '24 17:07 mcmire

Marking this as "DO-NOT-MERGE" until we are prepared to update this on both mobile and extension (e.g. until we have a draft PR somewhat-close to working)

Gudahtt avatar Jul 26 '24 17:07 Gudahtt

Fixed conflicts.

mcmire avatar Jul 26 '24 20:07 mcmire

I suspect a fix is needed in SelectedNetworkController.

This code to remove deleted network client IDs from dapp domains no longer triggers, since it expects a patch to networkConfigurations but receives networkConfigurationsByChainId.

image

It would also need to trigger when deleting an RPC endpoint within a network, not just when deleting the whole network. Since both remove network client id(s).

Something like this: https://github.com/MetaMask/core/commit/ac25fa0fa198d5779726722d6bbbb71f00f3392e

In the future, it could make sense for SelectedNetworkController to migrate from Record<Domain, NetworkClientId> to Record<Domain, ChainId>.

Edit: I've now tested that change via extension and it is needed Edit2: I committed this change so I can publish a preview release containing it

bergeron avatar Aug 22 '24 05:08 bergeron

@metamaskbot publish-preview

bergeron avatar Aug 27 '24 19:08 bergeron

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": "18.1.0-preview-b59ee0c8",
  "@metamask-previews/address-book-controller": "5.0.0-preview-b59ee0c8",
  "@metamask-previews/announcement-controller": "7.0.0-preview-b59ee0c8",
  "@metamask-previews/approval-controller": "7.0.2-preview-b59ee0c8",
  "@metamask-previews/assets-controllers": "37.0.0-preview-b59ee0c8",
  "@metamask-previews/base-controller": "6.0.3-preview-b59ee0c8",
  "@metamask-previews/build-utils": "3.0.0-preview-b59ee0c8",
  "@metamask-previews/chain-controller": "0.1.1-preview-b59ee0c8",
  "@metamask-previews/composable-controller": "8.0.0-preview-b59ee0c8",
  "@metamask-previews/controller-utils": "11.0.2-preview-b59ee0c8",
  "@metamask-previews/ens-controller": "13.0.1-preview-b59ee0c8",
  "@metamask-previews/eth-json-rpc-provider": "4.1.3-preview-b59ee0c8",
  "@metamask-previews/gas-fee-controller": "19.0.1-preview-b59ee0c8",
  "@metamask-previews/json-rpc-engine": "9.0.2-preview-b59ee0c8",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.2-preview-b59ee0c8",
  "@metamask-previews/keyring-controller": "17.1.2-preview-b59ee0c8",
  "@metamask-previews/logging-controller": "5.0.0-preview-b59ee0c8",
  "@metamask-previews/message-manager": "10.0.2-preview-b59ee0c8",
  "@metamask-previews/name-controller": "8.0.0-preview-b59ee0c8",
  "@metamask-previews/network-controller": "20.2.0-preview-b59ee0c8",
  "@metamask-previews/notification-controller": "6.0.0-preview-b59ee0c8",
  "@metamask-previews/notification-services-controller": "0.2.1-preview-b59ee0c8",
  "@metamask-previews/permission-controller": "11.0.0-preview-b59ee0c8",
  "@metamask-previews/permission-log-controller": "3.0.0-preview-b59ee0c8",
  "@metamask-previews/phishing-controller": "11.0.0-preview-b59ee0c8",
  "@metamask-previews/polling-controller": "9.0.1-preview-b59ee0c8",
  "@metamask-previews/preferences-controller": "13.0.1-preview-b59ee0c8",
  "@metamask-previews/profile-sync-controller": "0.2.1-preview-b59ee0c8",
  "@metamask-previews/queued-request-controller": "4.0.0-preview-b59ee0c8",
  "@metamask-previews/rate-limit-controller": "6.0.0-preview-b59ee0c8",
  "@metamask-previews/selected-network-controller": "17.0.0-preview-b59ee0c8",
  "@metamask-previews/signature-controller": "18.1.0-preview-b59ee0c8",
  "@metamask-previews/transaction-controller": "35.2.0-preview-b59ee0c8",
  "@metamask-previews/user-operation-controller": "14.0.1-preview-b59ee0c8"
}

github-actions[bot] avatar Aug 27 '24 21:08 github-actions[bot]

@mikesposito The only remaining thing I can't figure out, is an error Cannot perform 'get' on a proxy that has been revoked on various places that call getNetworkConfigurationByNetworkClientId.

The easiest repro is on thrown by TokenDetectionController when switching chains here:

image

It's possible it was introduced by https://github.com/MetaMask/core/commit/b59ee0c80be54b353033f5fbfa156ebb8fec2849. Perhaps using the draft state passed to this.update becomes revoked on later reference. But then we'll need another way to fix https://github.com/MetaMask/core/pull/4286#discussion_r1732085702

Edit: I think I've fixed it in https://github.com/MetaMask/core/pull/4286/commits/02e7ff99c640127d9b08c80f0951f1141c16b3c6 by performing buildNetworkConfigurationsByNetworkClientId after the call to this.update instead of inside it. This satisfies both criteria. That we're including the added/updated/removed network in the call to build...(), but it's also not revoked due to being a reference to draft state.

bergeron avatar Aug 29 '24 19:08 bergeron

@metamaskbot publish-preview

bergeron avatar Aug 29 '24 22:08 bergeron

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": "18.1.0-preview-02e7ff99",
  "@metamask-previews/address-book-controller": "5.0.0-preview-02e7ff99",
  "@metamask-previews/announcement-controller": "7.0.0-preview-02e7ff99",
  "@metamask-previews/approval-controller": "7.0.2-preview-02e7ff99",
  "@metamask-previews/assets-controllers": "37.0.0-preview-02e7ff99",
  "@metamask-previews/base-controller": "6.0.3-preview-02e7ff99",
  "@metamask-previews/build-utils": "3.0.0-preview-02e7ff99",
  "@metamask-previews/chain-controller": "0.1.1-preview-02e7ff99",
  "@metamask-previews/composable-controller": "8.0.0-preview-02e7ff99",
  "@metamask-previews/controller-utils": "11.0.2-preview-02e7ff99",
  "@metamask-previews/ens-controller": "13.0.1-preview-02e7ff99",
  "@metamask-previews/eth-json-rpc-provider": "4.1.3-preview-02e7ff99",
  "@metamask-previews/gas-fee-controller": "19.0.1-preview-02e7ff99",
  "@metamask-previews/json-rpc-engine": "9.0.2-preview-02e7ff99",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.2-preview-02e7ff99",
  "@metamask-previews/keyring-controller": "17.1.2-preview-02e7ff99",
  "@metamask-previews/logging-controller": "5.0.0-preview-02e7ff99",
  "@metamask-previews/message-manager": "10.0.2-preview-02e7ff99",
  "@metamask-previews/name-controller": "8.0.0-preview-02e7ff99",
  "@metamask-previews/network-controller": "20.2.0-preview-02e7ff99",
  "@metamask-previews/notification-controller": "6.0.0-preview-02e7ff99",
  "@metamask-previews/notification-services-controller": "0.2.1-preview-02e7ff99",
  "@metamask-previews/permission-controller": "11.0.0-preview-02e7ff99",
  "@metamask-previews/permission-log-controller": "3.0.0-preview-02e7ff99",
  "@metamask-previews/phishing-controller": "11.0.0-preview-02e7ff99",
  "@metamask-previews/polling-controller": "9.0.1-preview-02e7ff99",
  "@metamask-previews/preferences-controller": "13.0.1-preview-02e7ff99",
  "@metamask-previews/profile-sync-controller": "0.2.1-preview-02e7ff99",
  "@metamask-previews/queued-request-controller": "4.0.0-preview-02e7ff99",
  "@metamask-previews/rate-limit-controller": "6.0.0-preview-02e7ff99",
  "@metamask-previews/selected-network-controller": "17.0.0-preview-02e7ff99",
  "@metamask-previews/signature-controller": "18.1.0-preview-02e7ff99",
  "@metamask-previews/transaction-controller": "35.2.0-preview-02e7ff99",
  "@metamask-previews/user-operation-controller": "14.0.1-preview-02e7ff99"
}

github-actions[bot] avatar Aug 29 '24 22:08 github-actions[bot]