diff --git a/packages/assets-controllers/CHANGELOG.md b/packages/assets-controllers/CHANGELOG.md index b561612c1f..4ae7de953b 100644 --- a/packages/assets-controllers/CHANGELOG.md +++ b/packages/assets-controllers/CHANGELOG.md @@ -76,6 +76,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Bump `@metamask/utils` from `^11.9.0` to `^11.11.0` ([#9074](https://github.com/MetaMask/core/pull/9074)) - Bump `@metamask/transaction-controller` from `^67.0.0` to `^67.1.0` ([#9066](https://github.com/MetaMask/core/pull/9066)) ### Removed diff --git a/packages/network-enablement-controller/CHANGELOG.md b/packages/network-enablement-controller/CHANGELOG.md index e507181e15..6458c5783f 100644 --- a/packages/network-enablement-controller/CHANGELOG.md +++ b/packages/network-enablement-controller/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Add Stellar network enablement: default `enabledNetworkMap` entries for Stellar namespace (pubnet on, testnet off), enable Stellar pubnet during popular-network init when it exists in `MultichainNetworkController`, and include Stellar pubnet in `listPopularMultichainNetworks` ([#8832](https://github.com/MetaMask/core/pull/8832)) - Export `NetworkEnablementControllerStateChangeEvent` type from the package root ([#9084](https://github.com/MetaMask/core/pull/9084)) ### Changed diff --git a/packages/network-enablement-controller/src/NetworkEnablementController-method-action-types.ts b/packages/network-enablement-controller/src/NetworkEnablementController-method-action-types.ts index ebf6536415..b3245a0393 100644 --- a/packages/network-enablement-controller/src/NetworkEnablementController-method-action-types.ts +++ b/packages/network-enablement-controller/src/NetworkEnablementController-method-action-types.ts @@ -151,11 +151,11 @@ export type NetworkEnablementControllerListPopularEvmNetworksAction = { }; /** - * Returns popular multichain (Bitcoin, Solana, Tron) mainnet chain IDs in + * Returns popular multichain (Bitcoin, Solana, Tron, Stellar) mainnet chain IDs in * CAIP-2 form, restricted to networks that exist in MultichainNetworkController * (multichainNetworkConfigurationsByChainId). * - * @returns CAIP-2 chain IDs for Bitcoin, Solana, and Tron mainnets that are configured. + * @returns CAIP-2 chain IDs for Bitcoin, Solana, Tron, and Stellar mainnets that are configured. */ export type NetworkEnablementControllerListPopularMultichainNetworksAction = { type: `NetworkEnablementController:listPopularMultichainNetworks`; @@ -167,7 +167,7 @@ export type NetworkEnablementControllerListPopularMultichainNetworksAction = { * networks that exist in NetworkController (networkConfigurationsByChainId) and * MultichainNetworkController (multichainNetworkConfigurationsByChainId). EVM * popular networks come from POPULAR_NETWORKS; multichain popular are Bitcoin, - * Solana, and Tron mainnets. + * Solana, Tron, and Stellar mainnets. * * @returns CAIP-2 chain IDs for popular EVM networks and multichain mainnets that are configured. */ diff --git a/packages/network-enablement-controller/src/NetworkEnablementController.test.ts b/packages/network-enablement-controller/src/NetworkEnablementController.test.ts index d444eccdab..17d9fedd03 100644 --- a/packages/network-enablement-controller/src/NetworkEnablementController.test.ts +++ b/packages/network-enablement-controller/src/NetworkEnablementController.test.ts @@ -1,6 +1,6 @@ import { deriveStateFromMetadata } from '@metamask/base-controller'; import { BuiltInNetworkName, ChainId } from '@metamask/controller-utils'; -import { BtcScope, SolScope, TrxScope } from '@metamask/keyring-api'; +import { BtcScope, SolScope, TrxScope, XlmScope } from '@metamask/keyring-api'; import { Messenger, MOCK_ANY_NAMESPACE } from '@metamask/messenger'; import type { MessengerActions, @@ -83,6 +83,7 @@ const defaultMultichainGetState = (): MultichainGetStateReturn => ({ [BtcScope.Mainnet]: { chainId: BtcScope.Mainnet, name: 'Bitcoin' }, [SolScope.Mainnet]: { chainId: SolScope.Mainnet, name: 'Solana' }, [TrxScope.Mainnet]: { chainId: TrxScope.Mainnet, name: 'Tron' }, + [XlmScope.Pubnet]: { chainId: XlmScope.Pubnet, name: 'Stellar' }, }, selectedMultichainNetworkChainId: 'eip155:1', isEvmSelected: true, @@ -212,6 +213,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -269,6 +274,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: { ...getDefaultNativeAssetIdentifiers(), @@ -333,6 +342,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: expectedNativeAssetIdentifiers, }); @@ -476,6 +489,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: expectedNativeAssetIdentifiersForFallback, }); @@ -577,6 +594,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: true, + [XlmScope.Testnet]: false, + }, }, // init() populates nativeAssetIdentifiers from NetworkController (EVM networks only) nativeAssetIdentifiers: { @@ -1178,6 +1199,10 @@ describe('NetworkEnablementController', () => { chainId: TrxScope.Mainnet, name: 'Tron Mainnet', }, + [XlmScope.Pubnet]: { + chainId: XlmScope.Pubnet, + name: 'Stellar Mainnet', + }, }, selectedMultichainNetworkChainId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', @@ -1220,6 +1245,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1255,6 +1284,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1337,6 +1370,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1519,6 +1556,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1554,6 +1595,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1609,6 +1654,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: { ...getDefaultNativeAssetIdentifiers(), @@ -1648,6 +1697,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: { ...getDefaultNativeAssetIdentifiers(), @@ -1687,6 +1740,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: { ...getDefaultNativeAssetIdentifiers(), @@ -1737,6 +1794,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1779,6 +1840,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1834,6 +1899,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: { ...getDefaultNativeAssetIdentifiers(), @@ -1881,6 +1950,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1930,6 +2003,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -2166,14 +2243,15 @@ describe('NetworkEnablementController', () => { const { controller } = setupController(); const result = controller.listPopularNetworks(); - // Default setup: 3 EVM (0x1, 0xe708, 0x2105) + 3 multichain (Btc, Sol, Trx) + // Default setup: 3 EVM (0x1, 0xe708, 0x2105) + 4 multichain (Btc, Sol, Trx, Stellar) expect(result).toContain('eip155:1'); expect(result).toContain('eip155:59144'); expect(result).toContain('eip155:8453'); expect(result).toContain(BtcScope.Mainnet); expect(result).toContain(SolScope.Mainnet); expect(result).toContain(TrxScope.Mainnet); - expect(result).toHaveLength(6); + expect(result).toContain(XlmScope.Pubnet); + expect(result).toHaveLength(7); }); it('excludes multichain mainnets when not in MultichainNetworkController state', () => { @@ -2193,6 +2271,7 @@ describe('NetworkEnablementController', () => { expect(result).not.toContain(BtcScope.Mainnet); expect(result).not.toContain(SolScope.Mainnet); expect(result).not.toContain(TrxScope.Mainnet); + expect(result).not.toContain(XlmScope.Pubnet); expect(result).toHaveLength(3); }); @@ -2240,14 +2319,15 @@ describe('NetworkEnablementController', () => { }); describe('listPopularMultichainNetworks', () => { - it('returns only Bitcoin, Solana, Tron mainnets that exist in MultichainNetworkController state', () => { + it('returns only Bitcoin, Solana, Tron, Stellar mainnets that exist in MultichainNetworkController state', () => { const { controller } = setupController(); const result = controller.listPopularMultichainNetworks(); expect(result).toContain(BtcScope.Mainnet); expect(result).toContain(SolScope.Mainnet); expect(result).toContain(TrxScope.Mainnet); - expect(result).toHaveLength(3); + expect(result).toContain(XlmScope.Pubnet); + expect(result).toHaveLength(4); }); it('returns empty when none of the multichain mainnets are configured', () => { diff --git a/packages/network-enablement-controller/src/NetworkEnablementController.ts b/packages/network-enablement-controller/src/NetworkEnablementController.ts index ffc5a77578..0e9173bcbc 100644 --- a/packages/network-enablement-controller/src/NetworkEnablementController.ts +++ b/packages/network-enablement-controller/src/NetworkEnablementController.ts @@ -4,7 +4,7 @@ import type { ControllerStateChangeEvent, } from '@metamask/base-controller'; import { BuiltInNetworkName, ChainId } from '@metamask/controller-utils'; -import { BtcScope, SolScope, TrxScope } from '@metamask/keyring-api'; +import { BtcScope, SolScope, TrxScope, XlmScope } from '@metamask/keyring-api'; import type { Messenger } from '@metamask/messenger'; import type { MultichainNetworkControllerGetStateAction } from '@metamask/multichain-network-controller'; import { toEvmCaipChainId } from '@metamask/multichain-network-controller'; @@ -184,6 +184,10 @@ const getDefaultNetworkEnablementControllerState = [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Pubnet]: true, + [XlmScope.Testnet]: false, + }, }, // nativeAssetIdentifiers is initialized as empty and should be populated // by the client using initNativeAssetIdentifiers() during controller init @@ -419,6 +423,18 @@ export class NetworkEnablementController extends BaseController< // Enable Tron mainnet state.enabledNetworkMap[tronKeys.namespace][tronKeys.storageKey] = true; } + + // Enable Stellar mainnet if it exists in MultichainNetworkController configurations + const stellarKeys = deriveKeys(XlmScope.Pubnet as CaipChainId); + if ( + multichainState.multichainNetworkConfigurationsByChainId[ + XlmScope.Pubnet + ] + ) { + this.#ensureNamespaceBucket(state, stellarKeys.namespace); + state.enabledNetworkMap[stellarKeys.namespace][stellarKeys.storageKey] = + true; + } }); } @@ -769,11 +785,11 @@ export class NetworkEnablementController extends BaseController< } /** - * Returns popular multichain (Bitcoin, Solana, Tron) mainnet chain IDs in + * Returns popular multichain (Bitcoin, Solana, Tron, Stellar) mainnet chain IDs in * CAIP-2 form, restricted to networks that exist in MultichainNetworkController * (multichainNetworkConfigurationsByChainId). * - * @returns CAIP-2 chain IDs for Bitcoin, Solana, and Tron mainnets that are configured. + * @returns CAIP-2 chain IDs for Bitcoin, Solana, Tron, and Stellar mainnets that are configured. */ listPopularMultichainNetworks(): CaipChainId[] { const multichainState = this.messenger.call( @@ -783,6 +799,7 @@ export class NetworkEnablementController extends BaseController< BtcScope.Mainnet, SolScope.Mainnet, TrxScope.Mainnet, + XlmScope.Pubnet, ] as const; return multichainMainnets.filter( (chainId) => @@ -795,7 +812,7 @@ export class NetworkEnablementController extends BaseController< * networks that exist in NetworkController (networkConfigurationsByChainId) and * MultichainNetworkController (multichainNetworkConfigurationsByChainId). EVM * popular networks come from POPULAR_NETWORKS; multichain popular are Bitcoin, - * Solana, and Tron mainnets. + * Solana, Tron, and Stellar mainnets. * * @returns CAIP-2 chain IDs for popular EVM networks and multichain mainnets that are configured. */