From dd2c847ce75d7c6572f718bf6fa309bc291d34fa Mon Sep 17 00:00:00 2001 From: Florin Dzeladini Date: Thu, 2 Apr 2026 23:56:20 +0200 Subject: [PATCH 1/7] chore: wip --- package.json | 13 +- packages/accounts-controller/package.json | 8 +- packages/assets-controller/package.json | 6 +- packages/assets-controllers/CHANGELOG.md | 4 + .../constant.ts | 2 +- packages/bridge-controller/package.json | 4 +- .../chain-agnostic-permission/CHANGELOG.md | 4 + .../chain-agnostic-permission/package.json | 4 +- .../src/scope/constants.test.ts | 5 + .../src/scope/constants.ts | 5 + .../multichain-account-service/CHANGELOG.md | 4 + .../multichain-account-service/package.json | 8 +- .../src/MultichainAccountService.test.ts | 27 +++ .../src/MultichainAccountService.ts | 12 ++ .../multichain-account-service/src/index.ts | 2 + .../src/providers/SnapAccountProvider.test.ts | 16 ++ .../src/providers/XlmAccountProvider.ts | 145 ++++++++++++++ .../src/providers/index.ts | 1 + .../src/tests/accounts.ts | 34 ++++ .../src/tests/providers.ts | 9 +- .../CHANGELOG.md | 4 + .../package.json | 6 +- .../MultichainNetworkController.test.ts | 48 +++++ .../src/constants.ts | 25 ++- .../src/types.ts | 5 +- .../src/utils.test.ts | 9 +- .../package.json | 6 +- .../CHANGELOG.md | 4 + .../package.json | 4 +- .../src/NetworkEnablementController.test.ts | 90 ++++++++- .../src/NetworkEnablementController.ts | 25 ++- yarn.lock | 182 ++++++++---------- 32 files changed, 584 insertions(+), 137 deletions(-) create mode 100644 packages/multichain-account-service/src/providers/XlmAccountProvider.ts diff --git a/package.json b/package.json index 773f20f5d7..4a5a4ba04d 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,11 @@ "resolutions": { "elliptic@6.5.4": "^6.5.7", "fast-xml-parser@^4.3.4": "^4.4.1", - "ws@7.4.6": "^7.5.10" + "ws@7.4.6": "^7.5.10", + "@metamask/utils": "file:.yalc/@metamask/utils", + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", + "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api", + "@metamask/eth-snap-keyring": "file:.yalc/@metamask/eth-snap-keyring" }, "devDependencies": { "@lavamoat/allow-scripts": "^3.0.4", @@ -62,7 +66,7 @@ "@metamask/eth-json-rpc-provider": "^6.0.1", "@metamask/json-rpc-engine": "^10.2.4", "@metamask/network-controller": "^30.0.1", - "@metamask/utils": "^11.9.0", + "@metamask/utils": "file:.yalc/@metamask/utils", "@ts-bridge/cli": "^0.6.4", "@types/jest": "^29.5.14", "@types/lodash": "^4.14.191", @@ -113,5 +117,10 @@ "tsx>esbuild": false, "eslint-plugin-import-x>unrs-resolver": false } + }, + "dependencies": { + "@metamask/eth-snap-keyring": "file:.yalc/@metamask/eth-snap-keyring", + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", + "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" } } diff --git a/packages/accounts-controller/package.json b/packages/accounts-controller/package.json index 4994e00c40..c24f8ae4f6 100644 --- a/packages/accounts-controller/package.json +++ b/packages/accounts-controller/package.json @@ -50,10 +50,10 @@ "dependencies": { "@ethereumjs/util": "^9.1.0", "@metamask/base-controller": "^9.0.1", - "@metamask/eth-snap-keyring": "^19.0.0", - "@metamask/keyring-api": "^21.6.0", + "@metamask/eth-snap-keyring": "file:.yalc/@metamask/eth-snap-keyring", + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", "@metamask/keyring-controller": "^25.1.1", - "@metamask/keyring-internal-api": "^10.0.0", + "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api", "@metamask/keyring-utils": "^3.1.0", "@metamask/messenger": "^1.0.0", "@metamask/network-controller": "^30.0.1", @@ -61,7 +61,7 @@ "@metamask/snaps-sdk": "^11.0.0", "@metamask/snaps-utils": "^12.1.2", "@metamask/superstruct": "^3.1.0", - "@metamask/utils": "^11.9.0", + "@metamask/utils": "file:.yalc/@metamask/utils", "deepmerge": "^4.2.2", "ethereum-cryptography": "^2.1.2", "immer": "^9.0.6", diff --git a/packages/assets-controller/package.json b/packages/assets-controller/package.json index 6706714c71..417c81a3d7 100644 --- a/packages/assets-controller/package.json +++ b/packages/assets-controller/package.json @@ -57,9 +57,9 @@ "@metamask/client-controller": "^1.0.1", "@metamask/controller-utils": "^11.19.0", "@metamask/core-backend": "^6.2.1", - "@metamask/keyring-api": "^21.6.0", + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", "@metamask/keyring-controller": "^25.1.1", - "@metamask/keyring-internal-api": "^10.0.0", + "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api", "@metamask/keyring-snap-client": "^8.2.0", "@metamask/messenger": "^1.0.0", "@metamask/network-controller": "^30.0.1", @@ -70,7 +70,7 @@ "@metamask/snaps-controllers": "^19.0.0", "@metamask/snaps-utils": "^12.1.2", "@metamask/transaction-controller": "^63.3.1", - "@metamask/utils": "^11.9.0", + "@metamask/utils": "file:.yalc/@metamask/utils", "async-mutex": "^0.5.0", "bignumber.js": "^9.1.2", "lodash": "^4.17.21", diff --git a/packages/assets-controllers/CHANGELOG.md b/packages/assets-controllers/CHANGELOG.md index 42e648d6a4..4bcf7cd312 100644 --- a/packages/assets-controllers/CHANGELOG.md +++ b/packages/assets-controllers/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Document Stellar CAIP-19 mapping for `xlm` in `MAP_CAIP_CURRENCIES` (no additional hardcoded chain lists required) ([#TODO](https://github.com/MetaMask/core/pull/TODO)) + ## [103.0.0] ### Changed diff --git a/packages/assets-controllers/src/MultichainAssetsRatesController/constant.ts b/packages/assets-controllers/src/MultichainAssetsRatesController/constant.ts index 2fef0e8155..e0610f49f3 100644 --- a/packages/assets-controllers/src/MultichainAssetsRatesController/constant.ts +++ b/packages/assets-controllers/src/MultichainAssetsRatesController/constant.ts @@ -26,7 +26,7 @@ export const MAP_CAIP_CURRENCIES: { // XRP mainnet xrp: 'xrpl:mainnet/slip44:144', - // Stellar Lumens mainnet + // Stellar Lumens (spot/fiat map uses pubnet; per-chain testnet balances use stellar:testnet/slip44:148 when wired) xlm: 'stellar:pubnet/slip44:148', // Chainlink (ERC20 on Ethereum mainnet) diff --git a/packages/bridge-controller/package.json b/packages/bridge-controller/package.json index ad294dd75d..b788a5ed8c 100644 --- a/packages/bridge-controller/package.json +++ b/packages/bridge-controller/package.json @@ -58,7 +58,7 @@ "@metamask/base-controller": "^9.0.1", "@metamask/controller-utils": "^11.19.0", "@metamask/gas-fee-controller": "^26.1.1", - "@metamask/keyring-api": "^21.6.0", + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", "@metamask/messenger": "^1.0.0", "@metamask/metamask-eth-abis": "^3.1.1", "@metamask/multichain-network-controller": "^3.0.6", @@ -68,7 +68,7 @@ "@metamask/remote-feature-flag-controller": "^4.2.0", "@metamask/snaps-controllers": "^19.0.0", "@metamask/transaction-controller": "^63.3.1", - "@metamask/utils": "^11.9.0", + "@metamask/utils": "file:.yalc/@metamask/utils", "bignumber.js": "^9.1.2", "reselect": "^5.1.1", "uuid": "^8.3.2" diff --git a/packages/chain-agnostic-permission/CHANGELOG.md b/packages/chain-agnostic-permission/CHANGELOG.md index b2091197cd..47f04fea0b 100644 --- a/packages/chain-agnostic-permission/CHANGELOG.md +++ b/packages/chain-agnostic-permission/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add `stellar` to CAIP-25 scope constants (RPC methods, notifications, session properties) ([#TODO](https://github.com/MetaMask/core/pull/TODO)) + ### Changed - Bump `@metamask/permission-controller` from `^12.2.1` to `^12.3.0` ([#8317](https://github.com/MetaMask/core/pull/8317)) diff --git a/packages/chain-agnostic-permission/package.json b/packages/chain-agnostic-permission/package.json index b1727792fa..efbb1e95c7 100644 --- a/packages/chain-agnostic-permission/package.json +++ b/packages/chain-agnostic-permission/package.json @@ -51,12 +51,12 @@ "@metamask/controller-utils": "^11.19.0", "@metamask/permission-controller": "^12.3.0", "@metamask/rpc-errors": "^7.0.2", - "@metamask/utils": "^11.9.0", + "@metamask/utils": "file:.yalc/@metamask/utils", "lodash": "^4.17.21" }, "devDependencies": { "@metamask/auto-changelog": "^3.4.4", - "@metamask/keyring-internal-api": "^10.0.0", + "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api", "@ts-bridge/cli": "^0.6.4", "@types/jest": "^29.5.14", "deepmerge": "^4.2.2", diff --git a/packages/chain-agnostic-permission/src/scope/constants.test.ts b/packages/chain-agnostic-permission/src/scope/constants.test.ts index 9b3dafdc91..3af91b1d64 100644 --- a/packages/chain-agnostic-permission/src/scope/constants.test.ts +++ b/packages/chain-agnostic-permission/src/scope/constants.test.ts @@ -54,6 +54,7 @@ describe('KnownRpcMethods', () => { "eth_uninstallFilter", ], "solana": [], + "stellar": [], "tron": [], } `); @@ -66,6 +67,7 @@ describe('KnownSessionProperties', () => { { "Bip122AccountChangedNotifications": "bip122_accountChanged_notifications", "SolanaAccountChangedNotifications": "solana_accountChanged_notifications", + "StellarAccountChangedNotifications": "stellar_accountChanged_notifications", "TronAccountChangedNotifications": "tron_accountChanged_notifications", } `); @@ -77,6 +79,9 @@ describe('isKnownSessionPropertyValue', () => { expect( isKnownSessionPropertyValue('solana_accountChanged_notifications'), ).toBe(true); + expect( + isKnownSessionPropertyValue('stellar_accountChanged_notifications'), + ).toBe(true); expect( isKnownSessionPropertyValue('tron_accountChanged_notifications'), ).toBe(true); diff --git a/packages/chain-agnostic-permission/src/scope/constants.ts b/packages/chain-agnostic-permission/src/scope/constants.ts index bc31ebf963..41603532d4 100644 --- a/packages/chain-agnostic-permission/src/scope/constants.ts +++ b/packages/chain-agnostic-permission/src/scope/constants.ts @@ -17,6 +17,7 @@ export const CaipReferenceRegexes: Record = eip155: /^(0|[1-9][0-9]*)$/u, bip122: /.*/u, solana: /.*/u, + stellar: /.*/u, tron: /.*/u, }; @@ -67,6 +68,7 @@ export const KnownRpcMethods: Record = { eip155: Eip155Methods, bip122: [], solana: [], + stellar: [], tron: [], }; @@ -80,6 +82,7 @@ export const KnownWalletNamespaceRpcMethods: Record< eip155: WalletEip155Methods, bip122: [], solana: [], + stellar: [], tron: [], }; @@ -91,6 +94,7 @@ export const KnownNotifications: Record = eip155: ['eth_subscription'], bip122: [], solana: [], + stellar: [], tron: [], }; @@ -99,6 +103,7 @@ export const KnownNotifications: Record = */ export enum KnownSessionProperties { SolanaAccountChangedNotifications = 'solana_accountChanged_notifications', + StellarAccountChangedNotifications = 'stellar_accountChanged_notifications', TronAccountChangedNotifications = 'tron_accountChanged_notifications', Bip122AccountChangedNotifications = 'bip122_accountChanged_notifications', } diff --git a/packages/multichain-account-service/CHANGELOG.md b/packages/multichain-account-service/CHANGELOG.md index 484b5e78b7..a431bf53cc 100644 --- a/packages/multichain-account-service/CHANGELOG.md +++ b/packages/multichain-account-service/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add default `XlmAccountProvider` for the Stellar wallet Snap ([#TODO](https://github.com/MetaMask/core/pull/TODO)) + ## [8.0.1] ### Changed diff --git a/packages/multichain-account-service/package.json b/packages/multichain-account-service/package.json index 67c20a2708..ac1ec0cd92 100644 --- a/packages/multichain-account-service/package.json +++ b/packages/multichain-account-service/package.json @@ -51,11 +51,11 @@ "@ethereumjs/util": "^9.1.0", "@metamask/accounts-controller": "^37.1.1", "@metamask/base-controller": "^9.0.1", - "@metamask/eth-snap-keyring": "^19.0.0", + "@metamask/eth-snap-keyring": "file:.yalc/@metamask/eth-snap-keyring", "@metamask/key-tree": "^10.1.1", - "@metamask/keyring-api": "^21.6.0", + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", "@metamask/keyring-controller": "^25.1.1", - "@metamask/keyring-internal-api": "^10.0.0", + "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api", "@metamask/keyring-snap-client": "^8.2.0", "@metamask/keyring-utils": "^3.1.0", "@metamask/messenger": "^1.0.0", @@ -63,7 +63,7 @@ "@metamask/snaps-sdk": "^11.0.0", "@metamask/snaps-utils": "^12.1.2", "@metamask/superstruct": "^3.1.0", - "@metamask/utils": "^11.9.0", + "@metamask/utils": "file:.yalc/@metamask/utils", "async-mutex": "^0.5.0", "lodash": "^4.17.21" }, diff --git a/packages/multichain-account-service/src/MultichainAccountService.test.ts b/packages/multichain-account-service/src/MultichainAccountService.test.ts index d8b3456d11..1d41e9bc90 100644 --- a/packages/multichain-account-service/src/MultichainAccountService.test.ts +++ b/packages/multichain-account-service/src/MultichainAccountService.test.ts @@ -10,6 +10,7 @@ import { EthAccountType, SolAccountType, TrxAccountType, + XlmAccountType, } from '@metamask/keyring-api'; import type { KeyringObject } from '@metamask/keyring-controller'; import type { EthKeyring } from '@metamask/keyring-internal-api'; @@ -37,6 +38,10 @@ import { TRX_ACCOUNT_PROVIDER_NAME, TrxAccountProvider, } from './providers/TrxAccountProvider'; +import { + XLM_ACCOUNT_PROVIDER_NAME, + XlmAccountProvider, +} from './providers/XlmAccountProvider'; import { SnapPlatformWatcher } from './snaps/SnapPlatformWatcher'; import type { RootMessenger, MockAccountProvider } from './tests'; import { @@ -91,6 +96,12 @@ jest.mock('./providers/TrxAccountProvider', () => { TrxAccountProvider: jest.fn(), }; }); +jest.mock('./providers/XlmAccountProvider', () => { + return { + ...jest.requireActual('./providers/XlmAccountProvider'), + XlmAccountProvider: jest.fn(), + }; +}); type Mocks = { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -124,6 +135,8 @@ type Mocks = { BtcAccountProvider: MockAccountProvider; // eslint-disable-next-line @typescript-eslint/naming-convention TrxAccountProvider: MockAccountProvider; + // eslint-disable-next-line @typescript-eslint/naming-convention + XlmAccountProvider: MockAccountProvider; }; type Spies = { @@ -172,6 +185,11 @@ function mockAccountProvider( mocks.isAccountCompatible?.mockImplementation( (account: KeyringAccount) => account.type === TrxAccountType.Eoa, ); + } else if (providerClass === (XlmAccountProvider as unknown)) { + mocks.getName.mockReturnValue(XLM_ACCOUNT_PROVIDER_NAME); + mocks.isAccountCompatible?.mockImplementation( + (account: KeyringAccount) => account.type === XlmAccountType.Account, + ); } } @@ -218,6 +236,7 @@ async function setup({ SolAccountProvider: makeMockAccountProvider(), BtcAccountProvider: makeMockAccountProvider(), TrxAccountProvider: makeMockAccountProvider(), + XlmAccountProvider: makeMockAccountProvider(), }; const spies: Spies = { @@ -292,6 +311,7 @@ async function setup({ SolAccountProvider.NAME = SOL_ACCOUNT_PROVIDER_NAME; BtcAccountProvider.NAME = BTC_ACCOUNT_PROVIDER_NAME; TrxAccountProvider.NAME = TRX_ACCOUNT_PROVIDER_NAME; + XlmAccountProvider.NAME = XLM_ACCOUNT_PROVIDER_NAME; mockAccountProvider( EvmAccountProvider, @@ -321,6 +341,13 @@ async function setup({ 3, TrxAccountType.Eoa, ); + mockAccountProvider( + XlmAccountProvider, + mocks.XlmAccountProvider, + accounts, + 4, + XlmAccountType.Account, + ); } const messenger = getMultichainAccountServiceMessenger(rootMessenger); diff --git a/packages/multichain-account-service/src/MultichainAccountService.ts b/packages/multichain-account-service/src/MultichainAccountService.ts index b6ab4e4e35..7d10f4d28c 100644 --- a/packages/multichain-account-service/src/MultichainAccountService.ts +++ b/packages/multichain-account-service/src/MultichainAccountService.ts @@ -25,10 +25,13 @@ import { EVM_ACCOUNT_PROVIDER_NAME, BtcAccountProviderConfig, TrxAccountProviderConfig, + XlmAccountProviderConfig, BTC_ACCOUNT_PROVIDER_NAME, TRX_ACCOUNT_PROVIDER_NAME, + XLM_ACCOUNT_PROVIDER_NAME, BtcAccountProvider, TrxAccountProvider, + XlmAccountProvider, } from './providers'; import { AccountProviderWrapper, @@ -59,6 +62,7 @@ export type MultichainAccountServiceOptions = { [SOL_ACCOUNT_PROVIDER_NAME]?: SolAccountProviderConfig; [BTC_ACCOUNT_PROVIDER_NAME]?: BtcAccountProviderConfig; [TRX_ACCOUNT_PROVIDER_NAME]?: TrxAccountProviderConfig; + [XLM_ACCOUNT_PROVIDER_NAME]?: XlmAccountProviderConfig; }; config?: MultichainAccountServiceConfig; /** @@ -208,6 +212,14 @@ export class MultichainAccountService { trace, ), ), + new AccountProviderWrapper( + this.#messenger, + new XlmAccountProvider( + this.#messenger, + providerConfigs?.[XLM_ACCOUNT_PROVIDER_NAME], + trace, + ), + ), // Custom account providers that can be provided by the MetaMask client. ...providers, ]; diff --git a/packages/multichain-account-service/src/index.ts b/packages/multichain-account-service/src/index.ts index 802cbfbc97..440af75b7d 100644 --- a/packages/multichain-account-service/src/index.ts +++ b/packages/multichain-account-service/src/index.ts @@ -35,6 +35,8 @@ export { BtcAccountProvider, TRX_ACCOUNT_PROVIDER_NAME, TrxAccountProvider, + XLM_ACCOUNT_PROVIDER_NAME, + XlmAccountProvider, } from './providers'; export { MultichainAccountWallet } from './MultichainAccountWallet'; export { MultichainAccountGroup } from './MultichainAccountGroup'; diff --git a/packages/multichain-account-service/src/providers/SnapAccountProvider.test.ts b/packages/multichain-account-service/src/providers/SnapAccountProvider.test.ts index 05721d34d5..ce749fb7c8 100644 --- a/packages/multichain-account-service/src/providers/SnapAccountProvider.test.ts +++ b/packages/multichain-account-service/src/providers/SnapAccountProvider.test.ts @@ -28,6 +28,7 @@ import { } from './SnapAccountProvider'; import { SolAccountProvider } from './SolAccountProvider'; import { TrxAccountProvider } from './TrxAccountProvider'; +import { XlmAccountProvider } from './XlmAccountProvider'; import { TimeoutError } from './utils'; import { traceFallback } from '../analytics'; import type { DeepPartial, RootMessenger } from '../tests'; @@ -347,6 +348,21 @@ describe('SnapAccountProvider', () => { expect(isSnapAccountProvider(trxProvider)).toBe(true); }); + it('creates XlmAccountProvider with custom trace', () => { + const { messenger } = setup(); + + const customTrace = jest.fn(); + + const xlmProvider = new XlmAccountProvider( + getMultichainAccountServiceMessenger(messenger), + undefined, + customTrace, + ); + + expect(xlmProvider).toBeDefined(); + expect(isSnapAccountProvider(xlmProvider)).toBe(true); + }); + it('creates provider without trace parameter', () => { const { messenger } = setup(); diff --git a/packages/multichain-account-service/src/providers/XlmAccountProvider.ts b/packages/multichain-account-service/src/providers/XlmAccountProvider.ts new file mode 100644 index 0000000000..7ce7a5d3ff --- /dev/null +++ b/packages/multichain-account-service/src/providers/XlmAccountProvider.ts @@ -0,0 +1,145 @@ +import type { Bip44Account } from '@metamask/account-api'; +import type { TraceCallback } from '@metamask/controller-utils'; +import type { + EntropySourceId, + KeyringAccount, + KeyringCapabilities, +} from '@metamask/keyring-api'; +import { + AccountCreationType, + XlmAccountType, + XlmScope, +} from '@metamask/keyring-api'; +import { KeyringTypes } from '@metamask/keyring-controller'; +import type { InternalAccount } from '@metamask/keyring-internal-api'; +import type { SnapId } from '@metamask/snaps-sdk'; + +import { SnapAccountProvider } from './SnapAccountProvider'; +import type { + RestrictedSnapKeyring, + SnapAccountProviderConfig, +} from './SnapAccountProvider'; +import { withRetry, withTimeout } from './utils'; +import { traceFallback } from '../analytics'; +import { TraceName } from '../analytics/traces'; +import type { MultichainAccountServiceMessenger } from '../types'; + +export type XlmAccountProviderConfig = SnapAccountProviderConfig; + +export const XLM_ACCOUNT_PROVIDER_NAME = 'Stellar'; + +export const XLM_ACCOUNT_PROVIDER_DEFAULT_CONFIG: XlmAccountProviderConfig = { + maxConcurrency: 3, + discovery: { + enabled: true, + timeoutMs: 2000, + maxAttempts: 3, + backOffMs: 1000, + }, + createAccounts: { + batched: false, + timeoutMs: 3000, + }, + resyncAccounts: { + autoRemoveExtraSnapAccounts: true, + }, +}; + +export class XlmAccountProvider extends SnapAccountProvider { + static NAME = XLM_ACCOUNT_PROVIDER_NAME; + + static XLM_SNAP_ID = 'npm:@metamask/stellar-wallet-snap' as SnapId; + + readonly capabilities: KeyringCapabilities = { + scopes: [XlmScope.Mainnet, XlmScope.Testnet], + bip44: { + deriveIndex: true, + deriveIndexRange: true, + }, + }; + + constructor( + messenger: MultichainAccountServiceMessenger, + config: XlmAccountProviderConfig = XLM_ACCOUNT_PROVIDER_DEFAULT_CONFIG, + trace: TraceCallback = traceFallback, + ) { + super(XlmAccountProvider.XLM_SNAP_ID, messenger, config, trace); + } + + getName(): string { + return XlmAccountProvider.NAME; + } + + isAccountCompatible(account: Bip44Account): boolean { + return ( + account.type === XlmAccountType.Account && + account.metadata.keyring.type === (KeyringTypes.snap as string) + ); + } + + protected override createAccountV1( + keyring: RestrictedSnapKeyring, + { + entropySource, + groupIndex, + }: { entropySource: EntropySourceId; groupIndex: number }, + ): Promise { + return keyring.createAccount({ + entropySource, + index: groupIndex, + addressType: XlmAccountType.Account, + scope: XlmScope.Mainnet, + }); + } + + async discoverAccounts({ + entropySource, + groupIndex, + }: { + entropySource: EntropySourceId; + groupIndex: number; + }): Promise[]> { + return this.withSnap(async ({ client, keyring }) => { + return await super.trace( + { + name: TraceName.SnapDiscoverAccounts, + data: { + provider: this.getName(), + }, + }, + async () => { + if (!this.config.discovery.enabled) { + return []; + } + + const discoveredAccounts = await withRetry( + () => + withTimeout( + () => + client.discoverAccounts( + [XlmScope.Mainnet], + entropySource, + groupIndex, + ), + this.config.discovery.timeoutMs, + ), + { + maxAttempts: this.config.discovery.maxAttempts, + backOffMs: this.config.discovery.backOffMs, + }, + ); + + if (!discoveredAccounts.length) { + return []; + } + + return await this.createBip44Accounts(keyring, { + type: AccountCreationType.Bip44DeriveIndex, + entropySource, + groupIndex, + }); + }, + ); + }); + } +} diff --git a/packages/multichain-account-service/src/providers/index.ts b/packages/multichain-account-service/src/providers/index.ts index 0504f99fea..51f20af248 100644 --- a/packages/multichain-account-service/src/providers/index.ts +++ b/packages/multichain-account-service/src/providers/index.ts @@ -10,3 +10,4 @@ export * from './SolAccountProvider'; export * from './EvmAccountProvider'; export * from './BtcAccountProvider'; export * from './TrxAccountProvider'; +export * from './XlmAccountProvider'; diff --git a/packages/multichain-account-service/src/tests/accounts.ts b/packages/multichain-account-service/src/tests/accounts.ts index 4479a3000e..3498ef1a57 100644 --- a/packages/multichain-account-service/src/tests/accounts.ts +++ b/packages/multichain-account-service/src/tests/accounts.ts @@ -19,6 +19,9 @@ import { TrxAccountType, TrxMethod, TrxScope, + XlmAccountType, + XlmMethod, + XlmScope, } from '@metamask/keyring-api'; import { KeyringTypes } from '@metamask/keyring-controller'; import type { InternalAccount } from '@metamask/keyring-internal-api'; @@ -149,6 +152,31 @@ export const MOCK_SOL_ACCOUNT_1: Bip44Account = { }, }; +const XLM_METHODS = Object.values(XlmMethod); + +export const MOCK_XLM_ACCOUNT_1: Bip44Account = { + id: 'mock-snap-id-1', + address: `G${'A'.repeat(55)}`, + options: { + entropy: { + type: KeyringAccountEntropyTypeOption.Mnemonic, + id: MOCK_HD_KEYRING_2.metadata.id, + groupIndex: 0, + derivationPath: '', + }, + }, + methods: XLM_METHODS, + type: XlmAccountType.Account, + scopes: [XlmScope.Mainnet, XlmScope.Testnet], + metadata: { + name: 'Stellar Account 1', + keyring: { type: KeyringTypes.snap }, + snap: MOCK_SNAP_1, + importTime: 0, + lastSelected: 0, + }, +}; + export const MOCK_TRX_ACCOUNT_1: Bip44Account = { id: 'mock-snap-id-1', address: 'aabbccdd', @@ -185,6 +213,12 @@ export const MOCK_TRX_DISCOVERED_ACCOUNT_1: DiscoveredAccount = { derivationPath: `m/44'/195'/0'/0'`, }; +export const MOCK_XLM_DISCOVERED_ACCOUNT_1: DiscoveredAccount = { + type: 'bip44', + scopes: [XlmScope.Mainnet], + derivationPath: `m/44'/148'/0'`, +}; + export const MOCK_BTC_P2TR_DISCOVERED_ACCOUNT_1: DiscoveredAccount = { type: 'bip44', scopes: [BtcScope.Mainnet], diff --git a/packages/multichain-account-service/src/tests/providers.ts b/packages/multichain-account-service/src/tests/providers.ts index 9544c9f978..0a55091fd4 100644 --- a/packages/multichain-account-service/src/tests/providers.ts +++ b/packages/multichain-account-service/src/tests/providers.ts @@ -1,5 +1,11 @@ import type { Bip44Account } from '@metamask/account-api'; -import { BtcScope, EthScope, SolScope, TrxScope } from '@metamask/keyring-api'; +import { + BtcScope, + EthScope, + SolScope, + TrxScope, + XlmScope, +} from '@metamask/keyring-api'; import type { KeyringAccount, KeyringCapabilities, @@ -39,6 +45,7 @@ export function makeMockAccountProvider( SolScope.Testnet, BtcScope.Testnet, TrxScope.Shasta, + XlmScope.Testnet, EthScope.Eoa, ], bip44: { deriveIndex: true }, diff --git a/packages/multichain-network-controller/CHANGELOG.md b/packages/multichain-network-controller/CHANGELOG.md index 6260ca6d07..3c33ce4b49 100644 --- a/packages/multichain-network-controller/CHANGELOG.md +++ b/packages/multichain-network-controller/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add Stellar mainnet and testnet to multichain network configuration and supported CAIP chain IDs ([#TODO](https://github.com/MetaMask/core/pull/TODO)) + ### Changed - Bump `@metamask/accounts-controller` from `^37.1.0` to `^37.1.1` ([#8325](https://github.com/MetaMask/core/pull/8325)) diff --git a/packages/multichain-network-controller/package.json b/packages/multichain-network-controller/package.json index f15f305797..bebc1c0d65 100644 --- a/packages/multichain-network-controller/package.json +++ b/packages/multichain-network-controller/package.json @@ -50,12 +50,12 @@ "@metamask/accounts-controller": "^37.1.1", "@metamask/base-controller": "^9.0.1", "@metamask/controller-utils": "^11.19.0", - "@metamask/keyring-api": "^21.6.0", - "@metamask/keyring-internal-api": "^10.0.0", + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", + "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api", "@metamask/messenger": "^1.0.0", "@metamask/network-controller": "^30.0.1", "@metamask/superstruct": "^3.1.0", - "@metamask/utils": "^11.9.0", + "@metamask/utils": "file:.yalc/@metamask/utils", "@solana/addresses": "^2.0.0", "lodash": "^4.17.21" }, diff --git a/packages/multichain-network-controller/src/MultichainNetworkController/MultichainNetworkController.test.ts b/packages/multichain-network-controller/src/MultichainNetworkController/MultichainNetworkController.test.ts index 41b0467dd7..4f8b48bd47 100644 --- a/packages/multichain-network-controller/src/MultichainNetworkController/MultichainNetworkController.test.ts +++ b/packages/multichain-network-controller/src/MultichainNetworkController/MultichainNetworkController.test.ts @@ -778,6 +778,18 @@ describe('MultichainNetworkController', () => { "name": "Solana Devnet", "nativeCurrency": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1/slip44:501", }, + "stellar:pubnet": { + "chainId": "stellar:pubnet", + "isEvm": false, + "name": "Stellar", + "nativeCurrency": "stellar:pubnet/slip44:148", + }, + "stellar:testnet": { + "chainId": "stellar:testnet", + "isEvm": false, + "name": "Stellar Testnet", + "nativeCurrency": "stellar:testnet/slip44:148", + }, "tron:2494104990": { "chainId": "tron:2494104990", "isEvm": false, @@ -864,6 +876,18 @@ describe('MultichainNetworkController', () => { "name": "Solana Devnet", "nativeCurrency": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1/slip44:501", }, + "stellar:pubnet": { + "chainId": "stellar:pubnet", + "isEvm": false, + "name": "Stellar", + "nativeCurrency": "stellar:pubnet/slip44:148", + }, + "stellar:testnet": { + "chainId": "stellar:testnet", + "isEvm": false, + "name": "Stellar Testnet", + "nativeCurrency": "stellar:testnet/slip44:148", + }, "tron:2494104990": { "chainId": "tron:2494104990", "isEvm": false, @@ -950,6 +974,18 @@ describe('MultichainNetworkController', () => { "name": "Solana Devnet", "nativeCurrency": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1/slip44:501", }, + "stellar:pubnet": { + "chainId": "stellar:pubnet", + "isEvm": false, + "name": "Stellar", + "nativeCurrency": "stellar:pubnet/slip44:148", + }, + "stellar:testnet": { + "chainId": "stellar:testnet", + "isEvm": false, + "name": "Stellar Testnet", + "nativeCurrency": "stellar:testnet/slip44:148", + }, "tron:2494104990": { "chainId": "tron:2494104990", "isEvm": false, @@ -1036,6 +1072,18 @@ describe('MultichainNetworkController', () => { "name": "Solana Devnet", "nativeCurrency": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1/slip44:501", }, + "stellar:pubnet": { + "chainId": "stellar:pubnet", + "isEvm": false, + "name": "Stellar", + "nativeCurrency": "stellar:pubnet/slip44:148", + }, + "stellar:testnet": { + "chainId": "stellar:testnet", + "isEvm": false, + "name": "Stellar Testnet", + "nativeCurrency": "stellar:testnet/slip44:148", + }, "tron:2494104990": { "chainId": "tron:2494104990", "isEvm": false, diff --git a/packages/multichain-network-controller/src/constants.ts b/packages/multichain-network-controller/src/constants.ts index 262e79aa6d..1435ce405b 100644 --- a/packages/multichain-network-controller/src/constants.ts +++ b/packages/multichain-network-controller/src/constants.ts @@ -1,5 +1,5 @@ import type { StateMetadata } from '@metamask/base-controller'; -import { BtcScope, SolScope, TrxScope } from '@metamask/keyring-api'; +import { BtcScope, SolScope, TrxScope, XlmScope } from '@metamask/keyring-api'; import type { CaipChainId } from '@metamask/keyring-api'; import { NetworkStatus } from '@metamask/network-controller'; @@ -21,6 +21,8 @@ export const SOL_DEVNET_NATIVE_ASSET = `${SolScope.Devnet}/slip44:501`; export const TRX_NATIVE_ASSET = `${TrxScope.Mainnet}/slip44:195`; export const TRX_NILE_NATIVE_ASSET = `${TrxScope.Nile}/slip44:195`; export const TRX_SHASTA_NATIVE_ASSET = `${TrxScope.Shasta}/slip44:195`; +export const XLM_NATIVE_ASSET = `${XlmScope.Mainnet}/slip44:148`; +export const XLM_TESTNET_NATIVE_ASSET = `${XlmScope.Testnet}/slip44:148`; /** * Supported networks by the MultichainNetworkController @@ -95,6 +97,18 @@ export const AVAILABLE_MULTICHAIN_NETWORK_CONFIGURATIONS: Record< nativeCurrency: TRX_SHASTA_NATIVE_ASSET, isEvm: false, }, + [XlmScope.Mainnet]: { + chainId: XlmScope.Mainnet, + name: 'Stellar', + nativeCurrency: XLM_NATIVE_ASSET, + isEvm: false, + }, + [XlmScope.Testnet]: { + chainId: XlmScope.Testnet, + name: 'Stellar Testnet', + nativeCurrency: XLM_TESTNET_NATIVE_ASSET, + isEvm: false, + }, }; /** @@ -111,6 +125,7 @@ export const NON_EVM_TESTNET_IDS: CaipChainId[] = [ SolScope.Devnet, TrxScope.Nile, TrxScope.Shasta, + XlmScope.Testnet, ]; /** @@ -129,6 +144,10 @@ export const NETWORKS_METADATA: Record = { features: [], status: NetworkStatus.Available, }, + [XlmScope.Mainnet]: { + features: [], + status: NetworkStatus.Available, + }, }; /** @@ -195,6 +214,8 @@ export const MULTICHAIN_NETWORK_TICKER: Record = { [TrxScope.Mainnet]: 'TRX', [TrxScope.Nile]: 'tTRX', [TrxScope.Shasta]: 'sTRX', + [XlmScope.Mainnet]: 'XLM', + [XlmScope.Testnet]: 'tXLM', } as const; /** @@ -213,4 +234,6 @@ export const MULTICHAIN_NETWORK_DECIMAL_PLACES: Record = { [TrxScope.Mainnet]: 6, [TrxScope.Nile]: 6, [TrxScope.Shasta]: 6, + [XlmScope.Mainnet]: 7, + [XlmScope.Testnet]: 7, } as const; diff --git a/packages/multichain-network-controller/src/types.ts b/packages/multichain-network-controller/src/types.ts index 11759f883d..58fff18cd3 100644 --- a/packages/multichain-network-controller/src/types.ts +++ b/packages/multichain-network-controller/src/types.ts @@ -9,6 +9,7 @@ import type { CaipChainId, SolScope, TrxScope, + XlmScope, } from '@metamask/keyring-api'; import type { InternalAccount } from '@metamask/keyring-internal-api'; import type { Messenger } from '@metamask/messenger'; @@ -43,7 +44,9 @@ export type SupportedCaipChainId = | SolScope.Devnet | TrxScope.Mainnet | TrxScope.Nile - | TrxScope.Shasta; + | TrxScope.Shasta + | XlmScope.Mainnet + | XlmScope.Testnet; export type CommonNetworkConfiguration = { /** diff --git a/packages/multichain-network-controller/src/utils.test.ts b/packages/multichain-network-controller/src/utils.test.ts index c865fcf610..2b38ade5dc 100644 --- a/packages/multichain-network-controller/src/utils.test.ts +++ b/packages/multichain-network-controller/src/utils.test.ts @@ -1,4 +1,4 @@ -import { BtcScope, SolScope, EthScope } from '@metamask/keyring-api'; +import { BtcScope, SolScope, EthScope, XlmScope } from '@metamask/keyring-api'; import type { CaipChainId } from '@metamask/keyring-api'; import type { NetworkConfiguration } from '@metamask/network-controller'; import { KnownCaipNamespace } from '@metamask/utils'; @@ -29,6 +29,11 @@ describe('utils', () => { expect(getChainIdForNonEvm(scopes)).toBe(BtcScope.Testnet); }); + it('returns Stellar chain ID for Stellar scopes', () => { + const scopes = [XlmScope.Mainnet, XlmScope.Testnet]; + expect(getChainIdForNonEvm(scopes)).toBe(XlmScope.Mainnet); + }); + it('throws error if network is not found', () => { const scopes = ['unknown:scope' as CaipChainId]; expect(() => getChainIdForNonEvm(scopes)).toThrow( @@ -41,6 +46,8 @@ describe('utils', () => { it('returns true for supported CAIP chain IDs', () => { expect(checkIfSupportedCaipChainId(SolScope.Mainnet)).toBe(true); expect(checkIfSupportedCaipChainId(BtcScope.Mainnet)).toBe(true); + expect(checkIfSupportedCaipChainId(XlmScope.Mainnet)).toBe(true); + expect(checkIfSupportedCaipChainId(XlmScope.Testnet)).toBe(true); }); it('returns false for non-CAIP IDs', () => { diff --git a/packages/multichain-transactions-controller/package.json b/packages/multichain-transactions-controller/package.json index 3a357e4f1e..a7c11159af 100644 --- a/packages/multichain-transactions-controller/package.json +++ b/packages/multichain-transactions-controller/package.json @@ -49,15 +49,15 @@ "dependencies": { "@metamask/accounts-controller": "^37.1.1", "@metamask/base-controller": "^9.0.1", - "@metamask/keyring-api": "^21.6.0", - "@metamask/keyring-internal-api": "^10.0.0", + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", + "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api", "@metamask/keyring-snap-client": "^8.2.0", "@metamask/messenger": "^1.0.0", "@metamask/polling-controller": "^16.0.4", "@metamask/snaps-controllers": "^19.0.0", "@metamask/snaps-sdk": "^11.0.0", "@metamask/snaps-utils": "^12.1.2", - "@metamask/utils": "^11.9.0", + "@metamask/utils": "file:.yalc/@metamask/utils", "@types/uuid": "^8.3.0", "immer": "^9.0.6", "uuid": "^8.3.2" diff --git a/packages/network-enablement-controller/CHANGELOG.md b/packages/network-enablement-controller/CHANGELOG.md index 6b44ea935d..69955b610d 100644 --- a/packages/network-enablement-controller/CHANGELOG.md +++ b/packages/network-enablement-controller/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Wire Stellar into default network enablement, popular network helpers, and related tests ([#TODO](https://github.com/MetaMask/core/pull/TODO)) + ## [5.0.1] ### Changed diff --git a/packages/network-enablement-controller/package.json b/packages/network-enablement-controller/package.json index 939d64ed6e..5afdea455b 100644 --- a/packages/network-enablement-controller/package.json +++ b/packages/network-enablement-controller/package.json @@ -50,13 +50,13 @@ "dependencies": { "@metamask/base-controller": "^9.0.1", "@metamask/controller-utils": "^11.19.0", - "@metamask/keyring-api": "^21.6.0", + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", "@metamask/messenger": "^1.0.0", "@metamask/multichain-network-controller": "^3.0.6", "@metamask/network-controller": "^30.0.1", "@metamask/slip44": "^4.3.0", "@metamask/transaction-controller": "^63.3.1", - "@metamask/utils": "^11.9.0", + "@metamask/utils": "file:.yalc/@metamask/utils", "reselect": "^5.1.1" }, "devDependencies": { diff --git a/packages/network-enablement-controller/src/NetworkEnablementController.test.ts b/packages/network-enablement-controller/src/NetworkEnablementController.test.ts index 7acf9fc43b..0abce49651 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.Mainnet]: { chainId: XlmScope.Mainnet, name: 'Stellar' }, }, selectedMultichainNetworkChainId: 'eip155:1', isEvmSelected: true, @@ -211,6 +212,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -267,6 +272,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: { ...getDefaultNativeAssetIdentifiers(), @@ -330,6 +339,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: expectedNativeAssetIdentifiers, }); @@ -471,6 +484,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: expectedNativeAssetIdentifiersForFallback, }); @@ -571,6 +588,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: true, + [XlmScope.Testnet]: false, + }, }, // init() populates nativeAssetIdentifiers from NetworkController (EVM networks only) nativeAssetIdentifiers: { @@ -1172,6 +1193,10 @@ describe('NetworkEnablementController', () => { chainId: TrxScope.Mainnet, name: 'Tron Mainnet', }, + [XlmScope.Mainnet]: { + chainId: XlmScope.Mainnet, + name: 'Stellar Mainnet', + }, }, selectedMultichainNetworkChainId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', @@ -1213,6 +1238,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1247,6 +1276,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1329,6 +1362,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1510,6 +1547,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1544,6 +1585,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1598,6 +1643,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: { ...getDefaultNativeAssetIdentifiers(), @@ -1636,6 +1685,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: { ...getDefaultNativeAssetIdentifiers(), @@ -1674,6 +1727,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: { ...getDefaultNativeAssetIdentifiers(), @@ -1723,6 +1780,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1764,6 +1825,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1818,6 +1883,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: false, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: { ...getDefaultNativeAssetIdentifiers(), @@ -1864,6 +1933,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -1912,6 +1985,10 @@ describe('NetworkEnablementController', () => { [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: true, + [XlmScope.Testnet]: false, + }, }, nativeAssetIdentifiers: getDefaultNativeAssetIdentifiers(), }); @@ -2148,14 +2225,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.Mainnet); + expect(result).toHaveLength(7); }); it('excludes multichain mainnets when not in MultichainNetworkController state', () => { @@ -2175,6 +2253,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.Mainnet); expect(result).toHaveLength(3); }); @@ -2222,14 +2301,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.Mainnet); + 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 8ea80bcc98..9ebd32fe55 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'; @@ -183,6 +183,10 @@ const getDefaultNetworkEnablementControllerState = [TrxScope.Nile]: false, [TrxScope.Shasta]: false, }, + [KnownCaipNamespace.Stellar]: { + [XlmScope.Mainnet]: true, + [XlmScope.Testnet]: false, + }, }, // nativeAssetIdentifiers is initialized as empty and should be populated // by the client using initNativeAssetIdentifiers() during controller init @@ -418,6 +422,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.Mainnet as CaipChainId); + if ( + multichainState.multichainNetworkConfigurationsByChainId[ + XlmScope.Mainnet + ] + ) { + this.#ensureNamespaceBucket(state, stellarKeys.namespace); + state.enabledNetworkMap[stellarKeys.namespace][stellarKeys.storageKey] = + true; + } }); } @@ -768,11 +784,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( @@ -782,6 +798,7 @@ export class NetworkEnablementController extends BaseController< BtcScope.Mainnet, SolScope.Mainnet, TrxScope.Mainnet, + XlmScope.Mainnet, ] as const; return multichainMainnets.filter( (chainId) => @@ -794,7 +811,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. */ diff --git a/yarn.lock b/yarn.lock index f133a90628..3bde568ef0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2568,10 +2568,10 @@ __metadata: "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/base-controller": "npm:^9.0.1" "@metamask/controller-utils": "npm:^11.19.0" - "@metamask/eth-snap-keyring": "npm:^19.0.0" - "@metamask/keyring-api": "npm:^21.6.0" + "@metamask/eth-snap-keyring": "file:.yalc/@metamask/eth-snap-keyring" + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" "@metamask/keyring-controller": "npm:^25.1.1" - "@metamask/keyring-internal-api": "npm:^10.0.0" + "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" "@metamask/keyring-utils": "npm:^3.1.0" "@metamask/messenger": "npm:^1.0.0" "@metamask/network-controller": "npm:^30.0.1" @@ -2580,7 +2580,7 @@ __metadata: "@metamask/snaps-sdk": "npm:^11.0.0" "@metamask/snaps-utils": "npm:^12.1.2" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^11.9.0" + "@metamask/utils": "file:.yalc/@metamask/utils" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" "@types/readable-stream": "npm:^2.3.0" @@ -2776,9 +2776,9 @@ __metadata: "@metamask/client-controller": "npm:^1.0.1" "@metamask/controller-utils": "npm:^11.19.0" "@metamask/core-backend": "npm:^6.2.1" - "@metamask/keyring-api": "npm:^21.6.0" + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" "@metamask/keyring-controller": "npm:^25.1.1" - "@metamask/keyring-internal-api": "npm:^10.0.0" + "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" "@metamask/keyring-snap-client": "npm:^8.2.0" "@metamask/messenger": "npm:^1.0.0" "@metamask/network-controller": "npm:^30.0.1" @@ -2789,7 +2789,7 @@ __metadata: "@metamask/snaps-controllers": "npm:^19.0.0" "@metamask/snaps-utils": "npm:^12.1.2" "@metamask/transaction-controller": "npm:^63.3.1" - "@metamask/utils": "npm:^11.9.0" + "@metamask/utils": "file:.yalc/@metamask/utils" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" "@types/lodash": "npm:^4.14.191" @@ -3008,7 +3008,7 @@ __metadata: "@metamask/controller-utils": "npm:^11.19.0" "@metamask/eth-json-rpc-provider": "npm:^6.0.1" "@metamask/gas-fee-controller": "npm:^26.1.1" - "@metamask/keyring-api": "npm:^21.6.0" + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" "@metamask/messenger": "npm:^1.0.0" "@metamask/metamask-eth-abis": "npm:^3.1.1" "@metamask/multichain-network-controller": "npm:^3.0.6" @@ -3019,7 +3019,7 @@ __metadata: "@metamask/snaps-controllers": "npm:^19.0.0" "@metamask/superstruct": "npm:^3.1.0" "@metamask/transaction-controller": "npm:^63.3.1" - "@metamask/utils": "npm:^11.9.0" + "@metamask/utils": "file:.yalc/@metamask/utils" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" bignumber.js: "npm:^9.1.2" @@ -3105,10 +3105,10 @@ __metadata: "@metamask/api-specs": "npm:^0.14.0" "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/controller-utils": "npm:^11.19.0" - "@metamask/keyring-internal-api": "npm:^10.0.0" + "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" "@metamask/permission-controller": "npm:^12.3.0" "@metamask/rpc-errors": "npm:^7.0.2" - "@metamask/utils": "npm:^11.9.0" + "@metamask/utils": "file:.yalc/@metamask/utils" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" deepmerge: "npm:^4.2.2" @@ -3335,9 +3335,12 @@ __metadata: "@metamask/eslint-config-typescript": "npm:^15.0.0" "@metamask/eth-block-tracker": "npm:^15.0.1" "@metamask/eth-json-rpc-provider": "npm:^6.0.1" + "@metamask/eth-snap-keyring": "file:.yalc/@metamask/eth-snap-keyring" "@metamask/json-rpc-engine": "npm:^10.2.4" + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" + "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" "@metamask/network-controller": "npm:^30.0.1" - "@metamask/utils": "npm:^11.9.0" + "@metamask/utils": "file:.yalc/@metamask/utils" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" "@types/lodash": "npm:^4.14.191" @@ -3812,26 +3815,29 @@ __metadata: languageName: node linkType: hard -"@metamask/eth-snap-keyring@npm:^19.0.0": - version: 19.0.0 - resolution: "@metamask/eth-snap-keyring@npm:19.0.0" +"@metamask/eth-snap-keyring@file:.yalc/@metamask/eth-snap-keyring::locator=%40metamask%2Fcore-monorepo%40workspace%3A.": + version: 20.0.0 + resolution: "@metamask/eth-snap-keyring@file:.yalc/@metamask/eth-snap-keyring#.yalc/@metamask/eth-snap-keyring::hash=5643bf&locator=%40metamask%2Fcore-monorepo%40workspace%3A." dependencies: "@ethereumjs/tx": "npm:^5.4.0" "@metamask/eth-sig-util": "npm:^8.2.0" - "@metamask/keyring-api": "npm:^21.4.0" - "@metamask/keyring-internal-api": "npm:^10.0.0" - "@metamask/keyring-internal-snap-client": "npm:^9.0.0" - "@metamask/keyring-snap-sdk": "npm:^7.2.0" + "@metamask/keyring-api": "npm:^22.0.0" + "@metamask/keyring-internal-api": "npm:^10.0.1" + "@metamask/keyring-internal-snap-client": "npm:^9.0.1" + "@metamask/keyring-snap-sdk": "npm:^8.0.0" "@metamask/keyring-utils": "npm:^3.2.0" - "@metamask/messenger": "npm:^0.3.0" + "@metamask/messenger": "npm:^1.0.0" + "@metamask/snaps-controllers": "npm:^19.0.0" + "@metamask/snaps-sdk": "npm:^11.0.0" + "@metamask/snaps-utils": "npm:^12.1.2" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^11.1.0" + "@metamask/utils": "file:.yalc/@metamask/utils" "@types/uuid": "npm:^9.0.8" async-mutex: "npm:^0.5.0" uuid: "npm:^9.0.1" peerDependencies: - "@metamask/keyring-api": ^21.4.0 - checksum: 10/6e307295cb15ab44aba4ff89fb1886ad8c0ea6636748e5d84c87250fbaff9d5a3c316e63b614d7b472e4027aad0a7912109b36981e978e978bf31deea7980726 + "@metamask/keyring-api": ^22.0.0 + checksum: 10/e7e6681469e4f06dcb0c4f43e50c1abef15370f3ac7747569a5e9cb962e1e48667e2da4deea20e37f6ce2ddb41adde0b89ead18960c11a8e6eaaa322d79f6148 languageName: node linkType: hard @@ -4151,20 +4157,15 @@ __metadata: languageName: node linkType: hard -"@metamask/keyring-api@npm:^21.4.0, @metamask/keyring-api@npm:^21.6.0": - version: 21.6.0 - resolution: "@metamask/keyring-api@npm:21.6.0" +"@metamask/keyring-api@file:.yalc/@metamask/keyring-api::locator=%40metamask%2Fcore-monorepo%40workspace%3A.": + version: 22.0.0 + resolution: "@metamask/keyring-api@file:.yalc/@metamask/keyring-api#.yalc/@metamask/keyring-api::hash=b286aa&locator=%40metamask%2Fcore-monorepo%40workspace%3A." dependencies: - "@ethereumjs/tx": "npm:^5.4.0" - "@metamask/eth-sig-util": "npm:^8.2.0" "@metamask/keyring-utils": "npm:^3.2.0" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^11.1.0" - "@types/uuid": "npm:^9.0.8" - async-mutex: "npm:^0.5.0" + "@metamask/utils": "file:.yalc/@metamask/utils" bitcoin-address-validation: "npm:^2.2.3" - uuid: "npm:^9.0.1" - checksum: 10/ecd482ec83fbdb16da5f0c548db29931edd4718c57550547aed9f3532c8e60ec39a6894571c96a819e5f205e53ec149e6b52710194ac0610960aa51834f15dd8 + checksum: 10/2fdd7206399e994d00e64af731a8933d50ad51affd03e05856e5c8fa91579d159c35af2f17959839944c192acef20a6871956d4f790faaf545acc9ce74db0493 languageName: node linkType: hard @@ -4207,27 +4208,27 @@ __metadata: languageName: unknown linkType: soft -"@metamask/keyring-internal-api@npm:^10.0.0": - version: 10.0.0 - resolution: "@metamask/keyring-internal-api@npm:10.0.0" +"@metamask/keyring-internal-api@file:.yalc/@metamask/keyring-internal-api::locator=%40metamask%2Fcore-monorepo%40workspace%3A.": + version: 10.0.1 + resolution: "@metamask/keyring-internal-api@file:.yalc/@metamask/keyring-internal-api#.yalc/@metamask/keyring-internal-api::hash=266499&locator=%40metamask%2Fcore-monorepo%40workspace%3A." dependencies: - "@metamask/keyring-api": "npm:^21.4.0" + "@metamask/keyring-api": "npm:^22.0.0" "@metamask/keyring-utils": "npm:^3.2.0" "@metamask/superstruct": "npm:^3.1.0" - checksum: 10/f49499572418128b03ed0d1e5d028082530b0b84f5d4554d24216b1caf0a196fe23b6038f719fc32af6c262e33de4dbd346b593b98236ad40b3ca67026f1a998 + checksum: 10/a184815cd40b5b6d563a68fd6edc12d6d6072bf4edf09b556a3480aa66961506353ae0241c0e1c227da068d99d9a94db8dd69d625e7ca4d522d01138c4b1c785 languageName: node linkType: hard -"@metamask/keyring-internal-snap-client@npm:^9.0.0": - version: 9.0.0 - resolution: "@metamask/keyring-internal-snap-client@npm:9.0.0" +"@metamask/keyring-internal-snap-client@npm:^9.0.1": + version: 9.0.1 + resolution: "@metamask/keyring-internal-snap-client@npm:9.0.1" dependencies: - "@metamask/keyring-api": "npm:^21.4.0" - "@metamask/keyring-internal-api": "npm:^10.0.0" - "@metamask/keyring-snap-client": "npm:^8.2.0" + "@metamask/keyring-api": "npm:^22.0.0" + "@metamask/keyring-internal-api": "npm:^10.0.1" + "@metamask/keyring-snap-client": "npm:^8.2.1" "@metamask/keyring-utils": "npm:^3.2.0" "@metamask/messenger": "npm:^0.3.0" - checksum: 10/d3a63d0a1aff343af013c5bc872f782eec80d048a76b169a17034fd004c61a42fe07d703c8227a1341569b62fb1fe091f66494c4658419a3e2827d864487e608 + checksum: 10/fb683a7826856612d2d89a8f6eb83bd14a20e27c18dddb5c50699d0fefce7475ff9e3077b65296820cf0911ee49d4daf3014932d1b1d7bfd330612229e02e6f4 languageName: node linkType: hard @@ -4247,19 +4248,35 @@ __metadata: languageName: node linkType: hard -"@metamask/keyring-snap-sdk@npm:^7.2.0": - version: 7.2.0 - resolution: "@metamask/keyring-snap-sdk@npm:7.2.0" +"@metamask/keyring-snap-client@npm:^8.2.1": + version: 8.2.1 + resolution: "@metamask/keyring-snap-client@npm:8.2.1" + dependencies: + "@metamask/keyring-api": "npm:^22.0.0" + "@metamask/keyring-utils": "npm:^3.2.0" + "@metamask/superstruct": "npm:^3.1.0" + "@types/uuid": "npm:^9.0.8" + uuid: "npm:^9.0.1" + webextension-polyfill: "npm:^0.12.0" + peerDependencies: + "@metamask/providers": ^19.0.0 + checksum: 10/f69dcb56d3089dfd1bd902ad409c017288e31d3631a2024f42f6b6ee1b4f6e663ad4d7bdfd5d3bcf6c9827190d3bad6983c89f7c821959d305f6ba8f4aae0d7c + languageName: node + linkType: hard + +"@metamask/keyring-snap-sdk@npm:^8.0.0": + version: 8.0.0 + resolution: "@metamask/keyring-snap-sdk@npm:8.0.0" dependencies: "@metamask/keyring-utils": "npm:^3.2.0" - "@metamask/snaps-sdk": "npm:^10.4.0" + "@metamask/snaps-sdk": "npm:^11.0.0" "@metamask/superstruct": "npm:^3.1.0" "@metamask/utils": "npm:^11.1.0" webextension-polyfill: "npm:^0.12.0" peerDependencies: - "@metamask/keyring-api": ^21.4.0 + "@metamask/keyring-api": ^22.0.0 "@metamask/providers": ^19.0.0 - checksum: 10/e805566d60bef72efb7298e9ee05d23acbd6e77e2cc17d47b6e9d09854f1a029b5873754d3ab0a5631a468267c0f21607de1c2cb37f57522a62cabca34b99b4d + checksum: 10/271b4f84d214813c0312ffbbe3fb6201b66172210da4d06a155c3ddb359403ed1fa4c7afa424cd34fa9db04e3c876f30f69afb676bb7a905d392552d871ebd57 languageName: node linkType: hard @@ -4362,11 +4379,11 @@ __metadata: "@metamask/base-controller": "npm:^9.0.1" "@metamask/controller-utils": "npm:^11.19.0" "@metamask/eth-hd-keyring": "npm:^13.0.0" - "@metamask/eth-snap-keyring": "npm:^19.0.0" + "@metamask/eth-snap-keyring": "file:.yalc/@metamask/eth-snap-keyring" "@metamask/key-tree": "npm:^10.1.1" - "@metamask/keyring-api": "npm:^21.6.0" + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" "@metamask/keyring-controller": "npm:^25.1.1" - "@metamask/keyring-internal-api": "npm:^10.0.0" + "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" "@metamask/keyring-snap-client": "npm:^8.2.0" "@metamask/keyring-utils": "npm:^3.1.0" "@metamask/messenger": "npm:^1.0.0" @@ -4375,7 +4392,7 @@ __metadata: "@metamask/snaps-sdk": "npm:^11.0.0" "@metamask/snaps-utils": "npm:^12.1.2" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^11.9.0" + "@metamask/utils": "file:.yalc/@metamask/utils" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" "@types/uuid": "npm:^8.3.0" @@ -4435,13 +4452,13 @@ __metadata: "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/base-controller": "npm:^9.0.1" "@metamask/controller-utils": "npm:^11.19.0" - "@metamask/keyring-api": "npm:^21.6.0" + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" "@metamask/keyring-controller": "npm:^25.1.1" - "@metamask/keyring-internal-api": "npm:^10.0.0" + "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" "@metamask/messenger": "npm:^1.0.0" "@metamask/network-controller": "npm:^30.0.1" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^11.9.0" + "@metamask/utils": "file:.yalc/@metamask/utils" "@solana/addresses": "npm:^2.0.0" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" @@ -4466,16 +4483,16 @@ __metadata: "@metamask/accounts-controller": "npm:^37.1.1" "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/base-controller": "npm:^9.0.1" - "@metamask/keyring-api": "npm:^21.6.0" + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" "@metamask/keyring-controller": "npm:^25.1.1" - "@metamask/keyring-internal-api": "npm:^10.0.0" + "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" "@metamask/keyring-snap-client": "npm:^8.2.0" "@metamask/messenger": "npm:^1.0.0" "@metamask/polling-controller": "npm:^16.0.4" "@metamask/snaps-controllers": "npm:^19.0.0" "@metamask/snaps-sdk": "npm:^11.0.0" "@metamask/snaps-utils": "npm:^12.1.2" - "@metamask/utils": "npm:^11.9.0" + "@metamask/utils": "file:.yalc/@metamask/utils" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" "@types/uuid": "npm:^8.3.0" @@ -4567,13 +4584,13 @@ __metadata: "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/base-controller": "npm:^9.0.1" "@metamask/controller-utils": "npm:^11.19.0" - "@metamask/keyring-api": "npm:^21.6.0" + "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" "@metamask/messenger": "npm:^1.0.0" "@metamask/multichain-network-controller": "npm:^3.0.6" "@metamask/network-controller": "npm:^30.0.1" "@metamask/slip44": "npm:^4.3.0" "@metamask/transaction-controller": "npm:^63.3.1" - "@metamask/utils": "npm:^11.9.0" + "@metamask/utils": "file:.yalc/@metamask/utils" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" deepmerge: "npm:^4.2.2" @@ -5256,20 +5273,6 @@ __metadata: languageName: node linkType: hard -"@metamask/snaps-sdk@npm:^10.4.0": - version: 10.4.0 - resolution: "@metamask/snaps-sdk@npm:10.4.0" - dependencies: - "@metamask/key-tree": "npm:^10.1.1" - "@metamask/providers": "npm:^22.1.1" - "@metamask/rpc-errors": "npm:^7.0.3" - "@metamask/superstruct": "npm:^3.2.1" - "@metamask/utils": "npm:^11.9.0" - luxon: "npm:^3.5.0" - checksum: 10/215a73f41f5043ca9767241da83308bb25b3faae96521ed71a63a9d29078461bcf278a01799e014bb20b49e34d96a05ea1822648c9bcf81e92f22e8c9b6c0f94 - languageName: node - linkType: hard - "@metamask/snaps-sdk@npm:^11.0.0": version: 11.0.0 resolution: "@metamask/snaps-sdk@npm:11.0.0" @@ -5530,9 +5533,9 @@ __metadata: languageName: unknown linkType: soft -"@metamask/utils@npm:^11.0.1, @metamask/utils@npm:^11.1.0, @metamask/utils@npm:^11.10.0, @metamask/utils@npm:^11.4.0, @metamask/utils@npm:^11.4.2, @metamask/utils@npm:^11.8.1, @metamask/utils@npm:^11.9.0": - version: 11.10.0 - resolution: "@metamask/utils@npm:11.10.0" +"@metamask/utils@file:.yalc/@metamask/utils::locator=%40metamask%2Fcore-monorepo%40workspace%3A.": + version: 11.11.0 + resolution: "@metamask/utils@file:.yalc/@metamask/utils#.yalc/@metamask/utils::hash=0927d5&locator=%40metamask%2Fcore-monorepo%40workspace%3A." dependencies: "@ethereumjs/tx": "npm:^4.2.0" "@metamask/superstruct": "npm:^3.1.0" @@ -5545,24 +5548,7 @@ __metadata: pony-cause: "npm:^2.1.10" semver: "npm:^7.5.4" uuid: "npm:^9.0.1" - checksum: 10/691a268af66593b60e9807a069127993cea3cdc941f99d5d7ca4664868754f08945821f1787b2f3e99e4497df63ceb0af37a2419ad494da29a1fddffe94f5797 - languageName: node - linkType: hard - -"@metamask/utils@npm:^9.0.0": - version: 9.3.0 - resolution: "@metamask/utils@npm:9.3.0" - dependencies: - "@ethereumjs/tx": "npm:^4.2.0" - "@metamask/superstruct": "npm:^3.1.0" - "@noble/hashes": "npm:^1.3.1" - "@scure/base": "npm:^1.1.3" - "@types/debug": "npm:^4.1.7" - debug: "npm:^4.3.4" - pony-cause: "npm:^2.1.10" - semver: "npm:^7.5.4" - uuid: "npm:^9.0.1" - checksum: 10/ed6648cd973bbf3b4eb0e862903b795a99d27784c820e19f62f0bc0ddf353e98c2858d7e9aaebc0249a586391b344e35b9249d13c08e3ea0c74b23dc1c6b1558 + checksum: 10/0ba8b4ff754de34ffca545e0ef200bf0c4dfb82783090f0f4685c4a7e20da191d39093ca15971ef8ec2f0e69b0aa32be42602f01a67ce3988d3c5ba50a21cf4c languageName: node linkType: hard From 505bb4dea552519903624bbf25f2d9bed9039fad Mon Sep 17 00:00:00 2001 From: Florin Dzeladini Date: Mon, 13 Apr 2026 17:24:33 +0200 Subject: [PATCH 2/7] chore: wip --- package.json | 15 +- packages/accounts-controller/package.json | 10 +- packages/assets-controller/package.json | 6 +- packages/bridge-controller/package.json | 4 +- .../chain-agnostic-permission/package.json | 4 +- .../multichain-account-service/package.json | 12 +- .../package.json | 8 +- .../package.json | 6 +- .../package.json | 6 +- yarn.lock | 439 +++++++++++++++--- 10 files changed, 413 insertions(+), 97 deletions(-) diff --git a/package.json b/package.json index 4a5a4ba04d..413ef4ed11 100644 --- a/package.json +++ b/package.json @@ -49,10 +49,10 @@ "elliptic@6.5.4": "^6.5.7", "fast-xml-parser@^4.3.4": "^4.4.1", "ws@7.4.6": "^7.5.10", - "@metamask/utils": "file:.yalc/@metamask/utils", - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", - "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api", - "@metamask/eth-snap-keyring": "file:.yalc/@metamask/eth-snap-keyring" + "@metamask/keyring-api": "22.0.0-dev.12", + "@metamask/keyring-internal-api": "10.0.1-dev.12", + "@metamask/eth-snap-keyring": "20.0.0-dev.11", + "@metamask/eth-hd-keyring": "13.1.1-dev.8" }, "devDependencies": { "@lavamoat/allow-scripts": "^3.0.4", @@ -66,7 +66,7 @@ "@metamask/eth-json-rpc-provider": "^6.0.1", "@metamask/json-rpc-engine": "^10.2.4", "@metamask/network-controller": "^30.0.1", - "@metamask/utils": "file:.yalc/@metamask/utils", + "@metamask/utils": "^11.9.0", "@ts-bridge/cli": "^0.6.4", "@types/jest": "^29.5.14", "@types/lodash": "^4.14.191", @@ -117,10 +117,5 @@ "tsx>esbuild": false, "eslint-plugin-import-x>unrs-resolver": false } - }, - "dependencies": { - "@metamask/eth-snap-keyring": "file:.yalc/@metamask/eth-snap-keyring", - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", - "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" } } diff --git a/packages/accounts-controller/package.json b/packages/accounts-controller/package.json index c24f8ae4f6..8875996434 100644 --- a/packages/accounts-controller/package.json +++ b/packages/accounts-controller/package.json @@ -1,6 +1,6 @@ { "name": "@metamask/accounts-controller", - "version": "37.1.1", + "version": "37.1.1-dev.4", "description": "Manages internal accounts", "keywords": [ "MetaMask", @@ -50,10 +50,10 @@ "dependencies": { "@ethereumjs/util": "^9.1.0", "@metamask/base-controller": "^9.0.1", - "@metamask/eth-snap-keyring": "file:.yalc/@metamask/eth-snap-keyring", - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", + "@metamask/eth-snap-keyring": "20.0.0-dev.11", + "@metamask/keyring-api": "22.0.0-dev.12", "@metamask/keyring-controller": "^25.1.1", - "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api", + "@metamask/keyring-internal-api": "10.0.1-dev.12", "@metamask/keyring-utils": "^3.1.0", "@metamask/messenger": "^1.0.0", "@metamask/network-controller": "^30.0.1", @@ -61,7 +61,7 @@ "@metamask/snaps-sdk": "^11.0.0", "@metamask/snaps-utils": "^12.1.2", "@metamask/superstruct": "^3.1.0", - "@metamask/utils": "file:.yalc/@metamask/utils", + "@metamask/utils": "^11.9.0", "deepmerge": "^4.2.2", "ethereum-cryptography": "^2.1.2", "immer": "^9.0.6", diff --git a/packages/assets-controller/package.json b/packages/assets-controller/package.json index 417c81a3d7..6706714c71 100644 --- a/packages/assets-controller/package.json +++ b/packages/assets-controller/package.json @@ -57,9 +57,9 @@ "@metamask/client-controller": "^1.0.1", "@metamask/controller-utils": "^11.19.0", "@metamask/core-backend": "^6.2.1", - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", + "@metamask/keyring-api": "^21.6.0", "@metamask/keyring-controller": "^25.1.1", - "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api", + "@metamask/keyring-internal-api": "^10.0.0", "@metamask/keyring-snap-client": "^8.2.0", "@metamask/messenger": "^1.0.0", "@metamask/network-controller": "^30.0.1", @@ -70,7 +70,7 @@ "@metamask/snaps-controllers": "^19.0.0", "@metamask/snaps-utils": "^12.1.2", "@metamask/transaction-controller": "^63.3.1", - "@metamask/utils": "file:.yalc/@metamask/utils", + "@metamask/utils": "^11.9.0", "async-mutex": "^0.5.0", "bignumber.js": "^9.1.2", "lodash": "^4.17.21", diff --git a/packages/bridge-controller/package.json b/packages/bridge-controller/package.json index b788a5ed8c..ad294dd75d 100644 --- a/packages/bridge-controller/package.json +++ b/packages/bridge-controller/package.json @@ -58,7 +58,7 @@ "@metamask/base-controller": "^9.0.1", "@metamask/controller-utils": "^11.19.0", "@metamask/gas-fee-controller": "^26.1.1", - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", + "@metamask/keyring-api": "^21.6.0", "@metamask/messenger": "^1.0.0", "@metamask/metamask-eth-abis": "^3.1.1", "@metamask/multichain-network-controller": "^3.0.6", @@ -68,7 +68,7 @@ "@metamask/remote-feature-flag-controller": "^4.2.0", "@metamask/snaps-controllers": "^19.0.0", "@metamask/transaction-controller": "^63.3.1", - "@metamask/utils": "file:.yalc/@metamask/utils", + "@metamask/utils": "^11.9.0", "bignumber.js": "^9.1.2", "reselect": "^5.1.1", "uuid": "^8.3.2" diff --git a/packages/chain-agnostic-permission/package.json b/packages/chain-agnostic-permission/package.json index efbb1e95c7..b1727792fa 100644 --- a/packages/chain-agnostic-permission/package.json +++ b/packages/chain-agnostic-permission/package.json @@ -51,12 +51,12 @@ "@metamask/controller-utils": "^11.19.0", "@metamask/permission-controller": "^12.3.0", "@metamask/rpc-errors": "^7.0.2", - "@metamask/utils": "file:.yalc/@metamask/utils", + "@metamask/utils": "^11.9.0", "lodash": "^4.17.21" }, "devDependencies": { "@metamask/auto-changelog": "^3.4.4", - "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api", + "@metamask/keyring-internal-api": "^10.0.0", "@ts-bridge/cli": "^0.6.4", "@types/jest": "^29.5.14", "deepmerge": "^4.2.2", diff --git a/packages/multichain-account-service/package.json b/packages/multichain-account-service/package.json index ac1ec0cd92..ac30163be1 100644 --- a/packages/multichain-account-service/package.json +++ b/packages/multichain-account-service/package.json @@ -1,6 +1,6 @@ { "name": "@metamask/multichain-account-service", - "version": "8.0.1", + "version": "8.0.1-dev.6", "description": "Service to manage multichain accounts", "keywords": [ "MetaMask", @@ -51,11 +51,11 @@ "@ethereumjs/util": "^9.1.0", "@metamask/accounts-controller": "^37.1.1", "@metamask/base-controller": "^9.0.1", - "@metamask/eth-snap-keyring": "file:.yalc/@metamask/eth-snap-keyring", + "@metamask/eth-snap-keyring": "20.0.0-dev.11", "@metamask/key-tree": "^10.1.1", - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", + "@metamask/keyring-api": "22.0.0-dev.12", "@metamask/keyring-controller": "^25.1.1", - "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api", + "@metamask/keyring-internal-api": "10.0.1-dev.12", "@metamask/keyring-snap-client": "^8.2.0", "@metamask/keyring-utils": "^3.1.0", "@metamask/messenger": "^1.0.0", @@ -63,7 +63,7 @@ "@metamask/snaps-sdk": "^11.0.0", "@metamask/snaps-utils": "^12.1.2", "@metamask/superstruct": "^3.1.0", - "@metamask/utils": "file:.yalc/@metamask/utils", + "@metamask/utils": "^11.9.0", "async-mutex": "^0.5.0", "lodash": "^4.17.21" }, @@ -71,7 +71,7 @@ "@metamask/account-api": "^1.0.0", "@metamask/auto-changelog": "^3.4.4", "@metamask/controller-utils": "^11.19.0", - "@metamask/eth-hd-keyring": "^13.0.0", + "@metamask/eth-hd-keyring": "13.1.1-dev.8", "@metamask/providers": "^22.1.0", "@ts-bridge/cli": "^0.6.4", "@types/jest": "^29.5.14", diff --git a/packages/multichain-network-controller/package.json b/packages/multichain-network-controller/package.json index bebc1c0d65..6a637a2880 100644 --- a/packages/multichain-network-controller/package.json +++ b/packages/multichain-network-controller/package.json @@ -1,6 +1,6 @@ { "name": "@metamask/multichain-network-controller", - "version": "3.0.6", + "version": "3.0.6-dev.3", "description": "Multichain network controller", "keywords": [ "MetaMask", @@ -50,12 +50,12 @@ "@metamask/accounts-controller": "^37.1.1", "@metamask/base-controller": "^9.0.1", "@metamask/controller-utils": "^11.19.0", - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", - "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api", + "@metamask/keyring-api": "22.0.0-dev.12", + "@metamask/keyring-internal-api": "10.0.1-dev.12", "@metamask/messenger": "^1.0.0", "@metamask/network-controller": "^30.0.1", "@metamask/superstruct": "^3.1.0", - "@metamask/utils": "file:.yalc/@metamask/utils", + "@metamask/utils": "^11.9.0", "@solana/addresses": "^2.0.0", "lodash": "^4.17.21" }, diff --git a/packages/multichain-transactions-controller/package.json b/packages/multichain-transactions-controller/package.json index a7c11159af..3a357e4f1e 100644 --- a/packages/multichain-transactions-controller/package.json +++ b/packages/multichain-transactions-controller/package.json @@ -49,15 +49,15 @@ "dependencies": { "@metamask/accounts-controller": "^37.1.1", "@metamask/base-controller": "^9.0.1", - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", - "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api", + "@metamask/keyring-api": "^21.6.0", + "@metamask/keyring-internal-api": "^10.0.0", "@metamask/keyring-snap-client": "^8.2.0", "@metamask/messenger": "^1.0.0", "@metamask/polling-controller": "^16.0.4", "@metamask/snaps-controllers": "^19.0.0", "@metamask/snaps-sdk": "^11.0.0", "@metamask/snaps-utils": "^12.1.2", - "@metamask/utils": "file:.yalc/@metamask/utils", + "@metamask/utils": "^11.9.0", "@types/uuid": "^8.3.0", "immer": "^9.0.6", "uuid": "^8.3.2" diff --git a/packages/network-enablement-controller/package.json b/packages/network-enablement-controller/package.json index 5afdea455b..69a6c7e408 100644 --- a/packages/network-enablement-controller/package.json +++ b/packages/network-enablement-controller/package.json @@ -1,6 +1,6 @@ { "name": "@metamask/network-enablement-controller", - "version": "5.0.1", + "version": "5.0.1-dev.3", "description": "Provides an interface to the currently enabled network using a MetaMask-compatible provider object", "keywords": [ "MetaMask", @@ -50,13 +50,13 @@ "dependencies": { "@metamask/base-controller": "^9.0.1", "@metamask/controller-utils": "^11.19.0", - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api", + "@metamask/keyring-api": "22.0.0-dev.12", "@metamask/messenger": "^1.0.0", "@metamask/multichain-network-controller": "^3.0.6", "@metamask/network-controller": "^30.0.1", "@metamask/slip44": "^4.3.0", "@metamask/transaction-controller": "^63.3.1", - "@metamask/utils": "file:.yalc/@metamask/utils", + "@metamask/utils": "^11.9.0", "reselect": "^5.1.1" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 3bde568ef0..f1b3fba311 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2560,7 +2560,37 @@ __metadata: languageName: unknown linkType: soft -"@metamask/accounts-controller@npm:^37.1.1, @metamask/accounts-controller@workspace:packages/accounts-controller": +"@metamask/accounts-controller@npm:^37.1.0, @metamask/accounts-controller@npm:^37.1.1, @metamask/accounts-controller@npm:^37.2.0": + version: 37.2.0 + resolution: "@metamask/accounts-controller@npm:37.2.0" + dependencies: + "@ethereumjs/util": "npm:^9.1.0" + "@metamask/base-controller": "npm:^9.0.1" + "@metamask/eth-snap-keyring": "npm:^19.0.0" + "@metamask/keyring-api": "npm:^21.6.0" + "@metamask/keyring-controller": "npm:^25.2.0" + "@metamask/keyring-internal-api": "npm:^10.0.0" + "@metamask/keyring-utils": "npm:^3.1.0" + "@metamask/messenger": "npm:^1.0.0" + "@metamask/network-controller": "npm:^30.0.1" + "@metamask/snaps-controllers": "npm:^19.0.0" + "@metamask/snaps-sdk": "npm:^11.0.0" + "@metamask/snaps-utils": "npm:^12.1.2" + "@metamask/superstruct": "npm:^3.1.0" + "@metamask/utils": "npm:^11.9.0" + deepmerge: "npm:^4.2.2" + ethereum-cryptography: "npm:^2.1.2" + immer: "npm:^9.0.6" + lodash: "npm:^4.17.21" + uuid: "npm:^8.3.2" + peerDependencies: + "@metamask/providers": ^22.0.0 + webextension-polyfill: ^0.10.0 || ^0.11.0 || ^0.12.0 + checksum: 10/01d07434687732e08a865f26b913e4bcff429e2aab32a851b53a95b068295c97ae7c178ae4915b9ea13cb2924cca1ff3dce9232add8c84202d56d6fdc2965ea9 + languageName: node + linkType: hard + +"@metamask/accounts-controller@workspace:packages/accounts-controller": version: 0.0.0-use.local resolution: "@metamask/accounts-controller@workspace:packages/accounts-controller" dependencies: @@ -2568,10 +2598,10 @@ __metadata: "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/base-controller": "npm:^9.0.1" "@metamask/controller-utils": "npm:^11.19.0" - "@metamask/eth-snap-keyring": "file:.yalc/@metamask/eth-snap-keyring" - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" + "@metamask/eth-snap-keyring": "npm:20.0.0-dev.11" + "@metamask/keyring-api": "npm:22.0.0-dev.12" "@metamask/keyring-controller": "npm:^25.1.1" - "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" + "@metamask/keyring-internal-api": "npm:10.0.1-dev.12" "@metamask/keyring-utils": "npm:^3.1.0" "@metamask/messenger": "npm:^1.0.0" "@metamask/network-controller": "npm:^30.0.1" @@ -2580,7 +2610,7 @@ __metadata: "@metamask/snaps-sdk": "npm:^11.0.0" "@metamask/snaps-utils": "npm:^12.1.2" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "file:.yalc/@metamask/utils" + "@metamask/utils": "npm:^11.9.0" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" "@types/readable-stream": "npm:^2.3.0" @@ -2776,9 +2806,9 @@ __metadata: "@metamask/client-controller": "npm:^1.0.1" "@metamask/controller-utils": "npm:^11.19.0" "@metamask/core-backend": "npm:^6.2.1" - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" + "@metamask/keyring-api": "npm:^21.6.0" "@metamask/keyring-controller": "npm:^25.1.1" - "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" + "@metamask/keyring-internal-api": "npm:^10.0.0" "@metamask/keyring-snap-client": "npm:^8.2.0" "@metamask/messenger": "npm:^1.0.0" "@metamask/network-controller": "npm:^30.0.1" @@ -2789,7 +2819,7 @@ __metadata: "@metamask/snaps-controllers": "npm:^19.0.0" "@metamask/snaps-utils": "npm:^12.1.2" "@metamask/transaction-controller": "npm:^63.3.1" - "@metamask/utils": "file:.yalc/@metamask/utils" + "@metamask/utils": "npm:^11.9.0" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" "@types/lodash": "npm:^4.14.191" @@ -3008,7 +3038,7 @@ __metadata: "@metamask/controller-utils": "npm:^11.19.0" "@metamask/eth-json-rpc-provider": "npm:^6.0.1" "@metamask/gas-fee-controller": "npm:^26.1.1" - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" + "@metamask/keyring-api": "npm:^21.6.0" "@metamask/messenger": "npm:^1.0.0" "@metamask/metamask-eth-abis": "npm:^3.1.1" "@metamask/multichain-network-controller": "npm:^3.0.6" @@ -3019,7 +3049,7 @@ __metadata: "@metamask/snaps-controllers": "npm:^19.0.0" "@metamask/superstruct": "npm:^3.1.0" "@metamask/transaction-controller": "npm:^63.3.1" - "@metamask/utils": "file:.yalc/@metamask/utils" + "@metamask/utils": "npm:^11.9.0" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" bignumber.js: "npm:^9.1.2" @@ -3105,10 +3135,10 @@ __metadata: "@metamask/api-specs": "npm:^0.14.0" "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/controller-utils": "npm:^11.19.0" - "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" + "@metamask/keyring-internal-api": "npm:^10.0.0" "@metamask/permission-controller": "npm:^12.3.0" "@metamask/rpc-errors": "npm:^7.0.2" - "@metamask/utils": "file:.yalc/@metamask/utils" + "@metamask/utils": "npm:^11.9.0" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" deepmerge: "npm:^4.2.2" @@ -3296,6 +3326,27 @@ __metadata: languageName: unknown linkType: soft +"@metamask/controller-utils@npm:^11.20.0": + version: 11.20.0 + resolution: "@metamask/controller-utils@npm:11.20.0" + dependencies: + "@metamask/eth-query": "npm:^4.0.0" + "@metamask/ethjs-unit": "npm:^0.3.0" + "@metamask/utils": "npm:^11.9.0" + "@spruceid/siwe-parser": "npm:2.1.0" + "@types/bn.js": "npm:^5.1.5" + bignumber.js: "npm:^9.1.2" + bn.js: "npm:^5.2.1" + cockatiel: "npm:^3.1.2" + eth-ens-namehash: "npm:^2.0.8" + fast-deep-equal: "npm:^3.1.3" + lodash: "npm:^4.17.21" + peerDependencies: + "@babel/runtime": ^7.0.0 + checksum: 10/a2ba778d00508a606ef4657cd6591a89f8f54136b3dd41f4f96f8effa2e9ad20de347e3c554f643cb248a002a17b478f95eafd4e3b4c3eca4bb40ae2e6bf7fdc + languageName: node + linkType: hard + "@metamask/core-backend@npm:^6.2.1, @metamask/core-backend@workspace:packages/core-backend": version: 0.0.0-use.local resolution: "@metamask/core-backend@workspace:packages/core-backend" @@ -3335,12 +3386,9 @@ __metadata: "@metamask/eslint-config-typescript": "npm:^15.0.0" "@metamask/eth-block-tracker": "npm:^15.0.1" "@metamask/eth-json-rpc-provider": "npm:^6.0.1" - "@metamask/eth-snap-keyring": "file:.yalc/@metamask/eth-snap-keyring" "@metamask/json-rpc-engine": "npm:^10.2.4" - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" - "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" "@metamask/network-controller": "npm:^30.0.1" - "@metamask/utils": "file:.yalc/@metamask/utils" + "@metamask/utils": "npm:^11.9.0" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" "@types/lodash": "npm:^4.14.191" @@ -3670,18 +3718,22 @@ __metadata: languageName: unknown linkType: soft -"@metamask/eth-hd-keyring@npm:^13.0.0": - version: 13.0.0 - resolution: "@metamask/eth-hd-keyring@npm:13.0.0" +"@metamask/eth-hd-keyring@npm:13.1.1-dev.8": + version: 13.1.1-dev.8 + resolution: "@metamask/eth-hd-keyring@npm:13.1.1-dev.8" dependencies: + "@ethereumjs/tx": "npm:^5.4.0" "@ethereumjs/util": "npm:^9.1.0" "@metamask/eth-sig-util": "npm:^8.2.0" "@metamask/key-tree": "npm:^10.0.2" - "@metamask/keyring-utils": "npm:^3.1.0" + "@metamask/keyring-api": "npm:^22.0.0" + "@metamask/keyring-sdk": "npm:^1.2.0" + "@metamask/keyring-utils": "npm:^3.2.0" "@metamask/scure-bip39": "npm:^2.1.1" - "@metamask/utils": "npm:^11.1.0" - ethereum-cryptography: "npm:^2.1.2" - checksum: 10/fe955a4e0331090df8110dbd8f46ea6286c2ad20e6677ecf535361ea9d0008194b2043eddd692cd7ceac2e033a54e4e340caa7d302bd5211826cb252b526f6bc + "@metamask/superstruct": "npm:^3.1.0" + "@metamask/utils": "npm:^11.11.0" + ethereum-cryptography: "npm:^2.2.1" + checksum: 10/0a045e4ccf04348fe10ec74c869677e6a527c83ee0f7c708b080ed64ac4586a88c6f3727cd1d5b70610cb991bf105788977198554c514712767972bdad8e97a5 languageName: node linkType: hard @@ -3815,29 +3867,30 @@ __metadata: languageName: node linkType: hard -"@metamask/eth-snap-keyring@file:.yalc/@metamask/eth-snap-keyring::locator=%40metamask%2Fcore-monorepo%40workspace%3A.": - version: 20.0.0 - resolution: "@metamask/eth-snap-keyring@file:.yalc/@metamask/eth-snap-keyring#.yalc/@metamask/eth-snap-keyring::hash=5643bf&locator=%40metamask%2Fcore-monorepo%40workspace%3A." +"@metamask/eth-snap-keyring@npm:20.0.0-dev.11": + version: 20.0.0-dev.11 + resolution: "@metamask/eth-snap-keyring@npm:20.0.0-dev.11" dependencies: "@ethereumjs/tx": "npm:^5.4.0" "@metamask/eth-sig-util": "npm:^8.2.0" "@metamask/keyring-api": "npm:^22.0.0" "@metamask/keyring-internal-api": "npm:^10.0.1" "@metamask/keyring-internal-snap-client": "npm:^9.0.1" + "@metamask/keyring-sdk": "npm:^1.2.0" "@metamask/keyring-snap-sdk": "npm:^8.0.0" "@metamask/keyring-utils": "npm:^3.2.0" - "@metamask/messenger": "npm:^1.0.0" - "@metamask/snaps-controllers": "npm:^19.0.0" + "@metamask/messenger": "npm:^1.1.1" + "@metamask/snaps-controllers": "npm:^19.0.1" "@metamask/snaps-sdk": "npm:^11.0.0" - "@metamask/snaps-utils": "npm:^12.1.2" + "@metamask/snaps-utils": "npm:^12.1.3" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "file:.yalc/@metamask/utils" + "@metamask/utils": "npm:^11.11.0" "@types/uuid": "npm:^9.0.8" async-mutex: "npm:^0.5.0" uuid: "npm:^9.0.1" peerDependencies: "@metamask/keyring-api": ^22.0.0 - checksum: 10/e7e6681469e4f06dcb0c4f43e50c1abef15370f3ac7747569a5e9cb962e1e48667e2da4deea20e37f6ce2ddb41adde0b89ead18960c11a8e6eaaa322d79f6148 + checksum: 10/f978068f3ceee01ced23e5f15c701fb254c04e838db4028ded9ca96329bf35d3e6b0aba88e76667bd7e8fd4b4d29caa26240ef233bc1ad247a78304b00f79566 languageName: node linkType: hard @@ -4157,15 +4210,15 @@ __metadata: languageName: node linkType: hard -"@metamask/keyring-api@file:.yalc/@metamask/keyring-api::locator=%40metamask%2Fcore-monorepo%40workspace%3A.": - version: 22.0.0 - resolution: "@metamask/keyring-api@file:.yalc/@metamask/keyring-api#.yalc/@metamask/keyring-api::hash=b286aa&locator=%40metamask%2Fcore-monorepo%40workspace%3A." +"@metamask/keyring-api@npm:22.0.0-dev.12": + version: 22.0.0-dev.12 + resolution: "@metamask/keyring-api@npm:22.0.0-dev.12" dependencies: "@metamask/keyring-utils": "npm:^3.2.0" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "file:.yalc/@metamask/utils" + "@metamask/utils": "npm:^11.11.0" bitcoin-address-validation: "npm:^2.2.3" - checksum: 10/2fdd7206399e994d00e64af731a8933d50ad51affd03e05856e5c8fa91579d159c35af2f17959839944c192acef20a6871956d4f790faaf545acc9ce74db0493 + checksum: 10/3e33b9e2d131e1b5b32da2450cf499bceffb2c0cc6345ac33f3a39139e7ac5d32406411631dafd989fcaa1894ec0bb35dc45870944efb5198fc0b59ad20776a4 languageName: node linkType: hard @@ -4208,14 +4261,37 @@ __metadata: languageName: unknown linkType: soft -"@metamask/keyring-internal-api@file:.yalc/@metamask/keyring-internal-api::locator=%40metamask%2Fcore-monorepo%40workspace%3A.": - version: 10.0.1 - resolution: "@metamask/keyring-internal-api@file:.yalc/@metamask/keyring-internal-api#.yalc/@metamask/keyring-internal-api::hash=266499&locator=%40metamask%2Fcore-monorepo%40workspace%3A." +"@metamask/keyring-controller@npm:^25.2.0": + version: 25.2.0 + resolution: "@metamask/keyring-controller@npm:25.2.0" + dependencies: + "@ethereumjs/util": "npm:^9.1.0" + "@metamask/base-controller": "npm:^9.0.1" + "@metamask/browser-passworder": "npm:^6.0.0" + "@metamask/eth-hd-keyring": "npm:^13.0.0" + "@metamask/eth-sig-util": "npm:^8.2.0" + "@metamask/eth-simple-keyring": "npm:^11.0.0" + "@metamask/keyring-api": "npm:^21.6.0" + "@metamask/keyring-internal-api": "npm:^10.0.0" + "@metamask/messenger": "npm:^1.0.0" + "@metamask/utils": "npm:^11.9.0" + async-mutex: "npm:^0.5.0" + ethereumjs-wallet: "npm:^1.0.1" + immer: "npm:^9.0.6" + lodash: "npm:^4.17.21" + ulid: "npm:^2.3.0" + checksum: 10/5f7938312d139621c7a185d55e385c336f96f9d39c42c6a52705af0042cec6157f8bfc850921f240c11e452fe8d433783b1e252304ecc20938b3f7ba92850d87 + languageName: node + linkType: hard + +"@metamask/keyring-internal-api@npm:10.0.1-dev.12": + version: 10.0.1-dev.12 + resolution: "@metamask/keyring-internal-api@npm:10.0.1-dev.12" dependencies: "@metamask/keyring-api": "npm:^22.0.0" "@metamask/keyring-utils": "npm:^3.2.0" "@metamask/superstruct": "npm:^3.1.0" - checksum: 10/a184815cd40b5b6d563a68fd6edc12d6d6072bf4edf09b556a3480aa66961506353ae0241c0e1c227da068d99d9a94db8dd69d625e7ca4d522d01138c4b1c785 + checksum: 10/4d7481c74c76133366beadecff4675cdcb71f43e3d04b3b5abc7acc62242938d2e90dccd6d5aacdcbba29f9e598d5d0ad6c3d778db26915ae5498996304dc62d languageName: node linkType: hard @@ -4232,6 +4308,24 @@ __metadata: languageName: node linkType: hard +"@metamask/keyring-sdk@npm:^1.2.0": + version: 1.2.0 + resolution: "@metamask/keyring-sdk@npm:1.2.0" + dependencies: + "@ethereumjs/tx": "npm:^5.4.0" + "@metamask/eth-sig-util": "npm:^8.2.0" + "@metamask/keyring-api": "npm:^22.0.0" + "@metamask/keyring-utils": "npm:^3.2.0" + "@metamask/scure-bip39": "npm:^2.1.1" + "@metamask/superstruct": "npm:^3.1.0" + "@metamask/utils": "npm:^11.10.0" + async-mutex: "npm:^0.5.0" + ethereum-cryptography: "npm:^2.1.2" + uuid: "npm:^9.0.1" + checksum: 10/ea5a406005a59ab453a2768a6787ec8070be3b2b2cc99970f5af975dc65728823725ad5139dc0deee7e91aed74ef9821388f4a295116190ec95ff547ad15a379 + languageName: node + linkType: hard + "@metamask/keyring-snap-client@npm:^8.2.0": version: 8.2.0 resolution: "@metamask/keyring-snap-client@npm:8.2.0" @@ -4361,6 +4455,20 @@ __metadata: languageName: unknown linkType: soft +"@metamask/messenger@npm:^1.1.0, @metamask/messenger@npm:^1.1.1": + version: 1.1.1 + resolution: "@metamask/messenger@npm:1.1.1" + dependencies: + "@metamask/utils": "npm:^11.9.0" + yargs: "npm:^17.7.2" + peerDependencies: + typescript: ">=5.0.0" + bin: + messenger-generate-action-types: ./dist/generate-action-types/cli.mjs + checksum: 10/a959af95e9e117aa0f7ad1c280f7817fef2c0b575c76837b1a6c884c9c9ef1dd0faeaef0c2c0c2035f68c7638d1f87cd172956ee962dec97d8ab6176fa6964e3 + languageName: node + linkType: hard + "@metamask/metamask-eth-abis@npm:^3.1.1": version: 3.1.1 resolution: "@metamask/metamask-eth-abis@npm:3.1.1" @@ -4368,7 +4476,37 @@ __metadata: languageName: node linkType: hard -"@metamask/multichain-account-service@npm:^8.0.1, @metamask/multichain-account-service@workspace:packages/multichain-account-service": +"@metamask/multichain-account-service@npm:^8.0.1": + version: 8.0.1 + resolution: "@metamask/multichain-account-service@npm:8.0.1" + dependencies: + "@ethereumjs/util": "npm:^9.1.0" + "@metamask/accounts-controller": "npm:^37.1.1" + "@metamask/base-controller": "npm:^9.0.1" + "@metamask/eth-snap-keyring": "npm:^19.0.0" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/keyring-api": "npm:^21.6.0" + "@metamask/keyring-controller": "npm:^25.1.1" + "@metamask/keyring-internal-api": "npm:^10.0.0" + "@metamask/keyring-snap-client": "npm:^8.2.0" + "@metamask/keyring-utils": "npm:^3.1.0" + "@metamask/messenger": "npm:^1.0.0" + "@metamask/snaps-controllers": "npm:^19.0.0" + "@metamask/snaps-sdk": "npm:^11.0.0" + "@metamask/snaps-utils": "npm:^12.1.2" + "@metamask/superstruct": "npm:^3.1.0" + "@metamask/utils": "npm:^11.9.0" + async-mutex: "npm:^0.5.0" + lodash: "npm:^4.17.21" + peerDependencies: + "@metamask/account-api": ^1.0.0 + "@metamask/providers": ^22.0.0 + webextension-polyfill: ^0.10.0 || ^0.11.0 || ^0.12.0 + checksum: 10/7ac3c38db8afd47593cd7ed4cc95de99195ccd2b2903281382be83990b2a47fa2f03de77e325c1ea3c7fd96367e3eac20039994d95154d478bebacd61215140a + languageName: node + linkType: hard + +"@metamask/multichain-account-service@workspace:packages/multichain-account-service": version: 0.0.0-use.local resolution: "@metamask/multichain-account-service@workspace:packages/multichain-account-service" dependencies: @@ -4378,12 +4516,12 @@ __metadata: "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/base-controller": "npm:^9.0.1" "@metamask/controller-utils": "npm:^11.19.0" - "@metamask/eth-hd-keyring": "npm:^13.0.0" - "@metamask/eth-snap-keyring": "file:.yalc/@metamask/eth-snap-keyring" + "@metamask/eth-hd-keyring": "npm:13.1.1-dev.8" + "@metamask/eth-snap-keyring": "npm:20.0.0-dev.11" "@metamask/key-tree": "npm:^10.1.1" - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" + "@metamask/keyring-api": "npm:22.0.0-dev.12" "@metamask/keyring-controller": "npm:^25.1.1" - "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" + "@metamask/keyring-internal-api": "npm:10.0.1-dev.12" "@metamask/keyring-snap-client": "npm:^8.2.0" "@metamask/keyring-utils": "npm:^3.1.0" "@metamask/messenger": "npm:^1.0.0" @@ -4392,7 +4530,7 @@ __metadata: "@metamask/snaps-sdk": "npm:^11.0.0" "@metamask/snaps-utils": "npm:^12.1.2" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "file:.yalc/@metamask/utils" + "@metamask/utils": "npm:^11.9.0" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" "@types/uuid": "npm:^8.3.0" @@ -4444,7 +4582,26 @@ __metadata: languageName: unknown linkType: soft -"@metamask/multichain-network-controller@npm:^3.0.6, @metamask/multichain-network-controller@workspace:packages/multichain-network-controller": +"@metamask/multichain-network-controller@npm:^3.0.6": + version: 3.0.6 + resolution: "@metamask/multichain-network-controller@npm:3.0.6" + dependencies: + "@metamask/accounts-controller": "npm:^37.1.0" + "@metamask/base-controller": "npm:^9.0.1" + "@metamask/controller-utils": "npm:^11.19.0" + "@metamask/keyring-api": "npm:^21.6.0" + "@metamask/keyring-internal-api": "npm:^10.0.0" + "@metamask/messenger": "npm:^1.0.0" + "@metamask/network-controller": "npm:^30.0.1" + "@metamask/superstruct": "npm:^3.1.0" + "@metamask/utils": "npm:^11.9.0" + "@solana/addresses": "npm:^2.0.0" + lodash: "npm:^4.17.21" + checksum: 10/c7e937851b8c944b30c3eafa7d2cfd8d62df9a0278583933912f3c5e1c971f072c5c7e0882677cfe251efd3885e2a0a547c404bd7c2efcf6757c6601431b42a3 + languageName: node + linkType: hard + +"@metamask/multichain-network-controller@workspace:packages/multichain-network-controller": version: 0.0.0-use.local resolution: "@metamask/multichain-network-controller@workspace:packages/multichain-network-controller" dependencies: @@ -4452,13 +4609,13 @@ __metadata: "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/base-controller": "npm:^9.0.1" "@metamask/controller-utils": "npm:^11.19.0" - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" + "@metamask/keyring-api": "npm:22.0.0-dev.12" "@metamask/keyring-controller": "npm:^25.1.1" - "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" + "@metamask/keyring-internal-api": "npm:10.0.1-dev.12" "@metamask/messenger": "npm:^1.0.0" "@metamask/network-controller": "npm:^30.0.1" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "file:.yalc/@metamask/utils" + "@metamask/utils": "npm:^11.9.0" "@solana/addresses": "npm:^2.0.0" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" @@ -4483,16 +4640,16 @@ __metadata: "@metamask/accounts-controller": "npm:^37.1.1" "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/base-controller": "npm:^9.0.1" - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" + "@metamask/keyring-api": "npm:^21.6.0" "@metamask/keyring-controller": "npm:^25.1.1" - "@metamask/keyring-internal-api": "file:.yalc/@metamask/keyring-internal-api" + "@metamask/keyring-internal-api": "npm:^10.0.0" "@metamask/keyring-snap-client": "npm:^8.2.0" "@metamask/messenger": "npm:^1.0.0" "@metamask/polling-controller": "npm:^16.0.4" "@metamask/snaps-controllers": "npm:^19.0.0" "@metamask/snaps-sdk": "npm:^11.0.0" "@metamask/snaps-utils": "npm:^12.1.2" - "@metamask/utils": "file:.yalc/@metamask/utils" + "@metamask/utils": "npm:^11.9.0" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" "@types/uuid": "npm:^8.3.0" @@ -4577,20 +4734,38 @@ __metadata: languageName: unknown linkType: soft -"@metamask/network-enablement-controller@npm:^5.0.1, @metamask/network-enablement-controller@workspace:packages/network-enablement-controller": +"@metamask/network-enablement-controller@npm:^5.0.1": + version: 5.0.2 + resolution: "@metamask/network-enablement-controller@npm:5.0.2" + dependencies: + "@metamask/base-controller": "npm:^9.0.1" + "@metamask/controller-utils": "npm:^11.20.0" + "@metamask/keyring-api": "npm:^21.6.0" + "@metamask/messenger": "npm:^1.0.0" + "@metamask/multichain-network-controller": "npm:^3.0.6" + "@metamask/network-controller": "npm:^30.0.1" + "@metamask/slip44": "npm:^4.3.0" + "@metamask/transaction-controller": "npm:^64.0.0" + "@metamask/utils": "npm:^11.9.0" + reselect: "npm:^5.1.1" + checksum: 10/cd208e9700cc620d5edbf34be10cbb820498985d2e0f186897c979a6a86e8af2b87a5d080f872c030e336867e826d169e4f23d66e1e00a0712a1bdfd09e566e1 + languageName: node + linkType: hard + +"@metamask/network-enablement-controller@workspace:packages/network-enablement-controller": version: 0.0.0-use.local resolution: "@metamask/network-enablement-controller@workspace:packages/network-enablement-controller" dependencies: "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/base-controller": "npm:^9.0.1" "@metamask/controller-utils": "npm:^11.19.0" - "@metamask/keyring-api": "file:.yalc/@metamask/keyring-api" + "@metamask/keyring-api": "npm:22.0.0-dev.12" "@metamask/messenger": "npm:^1.0.0" "@metamask/multichain-network-controller": "npm:^3.0.6" "@metamask/network-controller": "npm:^30.0.1" "@metamask/slip44": "npm:^4.3.0" "@metamask/transaction-controller": "npm:^63.3.1" - "@metamask/utils": "file:.yalc/@metamask/utils" + "@metamask/utils": "npm:^11.9.0" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14" deepmerge: "npm:^4.2.2" @@ -5244,6 +5419,49 @@ __metadata: languageName: node linkType: hard +"@metamask/snaps-controllers@npm:^19.0.1": + version: 19.0.1 + resolution: "@metamask/snaps-controllers@npm:19.0.1" + dependencies: + "@metamask/approval-controller": "npm:^9.0.1" + "@metamask/base-controller": "npm:^9.0.1" + "@metamask/json-rpc-engine": "npm:^10.2.4" + "@metamask/json-rpc-middleware-stream": "npm:^8.0.8" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/messenger": "npm:^1.1.0" + "@metamask/object-multiplex": "npm:^2.1.0" + "@metamask/permission-controller": "npm:^12.3.0" + "@metamask/post-message-stream": "npm:^10.0.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/snaps-registry": "npm:^4.0.0" + "@metamask/snaps-rpc-methods": "npm:^15.0.2" + "@metamask/snaps-sdk": "npm:^11.0.0" + "@metamask/snaps-utils": "npm:^12.1.3" + "@metamask/storage-service": "npm:^1.0.1" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.10.0" + "@xstate/fsm": "npm:^2.0.0" + async-mutex: "npm:^0.5.0" + concat-stream: "npm:^2.0.0" + cron-parser: "npm:^4.5.0" + fast-deep-equal: "npm:^3.1.3" + get-npm-tarball-url: "npm:^2.0.3" + immer: "npm:^9.0.21" + luxon: "npm:^3.5.0" + nanoid: "npm:^3.3.10" + readable-stream: "npm:^3.6.2" + readable-web-to-node-stream: "npm:^3.0.2" + semver: "npm:^7.5.4" + tar-stream: "npm:^3.1.7" + peerDependencies: + "@metamask/snaps-execution-environments": ^11.0.2 + peerDependenciesMeta: + "@metamask/snaps-execution-environments": + optional: true + checksum: 10/e7cee816b1af1e2c4cbd25a81afff779427e6d738c1fe283a1ca9b23f67c62b5a983d6ed35e91acf0b15016e6825074557f3376d322a518c1acfc36728d36509 + languageName: node + linkType: hard + "@metamask/snaps-registry@npm:^4.0.0": version: 4.0.0 resolution: "@metamask/snaps-registry@npm:4.0.0" @@ -5273,6 +5491,23 @@ __metadata: languageName: node linkType: hard +"@metamask/snaps-rpc-methods@npm:^15.0.2": + version: 15.0.2 + resolution: "@metamask/snaps-rpc-methods@npm:15.0.2" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^12.3.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/snaps-sdk": "npm:^11.0.0" + "@metamask/snaps-utils": "npm:^12.1.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.10.0" + "@noble/hashes": "npm:^1.7.1" + async-mutex: "npm:^0.5.0" + checksum: 10/6ad3ebb7f9d32dfe1707c8d871f567ed5550350b4a34a8d31e7a632e7b76b2cf5e9013e8b0f3db49834fae8ad0e441bd62e9e65607b1bdd6daccd6db4e50800c + languageName: node + linkType: hard + "@metamask/snaps-sdk@npm:^11.0.0": version: 11.0.0 resolution: "@metamask/snaps-sdk@npm:11.0.0" @@ -5318,6 +5553,37 @@ __metadata: languageName: node linkType: hard +"@metamask/snaps-utils@npm:^12.1.3": + version: 12.1.3 + resolution: "@metamask/snaps-utils@npm:12.1.3" + dependencies: + "@babel/core": "npm:^7.23.2" + "@babel/types": "npm:^7.23.0" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/messenger": "npm:^1.1.0" + "@metamask/permission-controller": "npm:^12.3.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/slip44": "npm:^4.4.0" + "@metamask/snaps-registry": "npm:^4.0.0" + "@metamask/snaps-sdk": "npm:^11.0.0" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.10.0" + "@scure/base": "npm:^1.1.1" + chalk: "npm:^4.1.2" + cron-parser: "npm:^4.5.0" + fast-deep-equal: "npm:^3.1.3" + fast-json-stable-stringify: "npm:^2.1.0" + fast-xml-parser: "npm:^5.5.6" + luxon: "npm:^3.5.0" + marked: "npm:^12.0.1" + rfdc: "npm:^1.3.0" + semver: "npm:^7.5.4" + ses: "npm:^1.15.0" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/857b213eedbb9024d79e6a872df0c48c6dd7e41cda654cd56a094c1518a5485b6545c6dc7adf7740919de2160d26d930cfd78131b090c10e42f672f71f9a8ca2 + languageName: node + linkType: hard + "@metamask/stake-sdk@npm:^3.2.1": version: 3.2.1 resolution: "@metamask/stake-sdk@npm:3.2.1" @@ -5458,6 +5724,44 @@ __metadata: languageName: unknown linkType: soft +"@metamask/transaction-controller@npm:^64.0.0": + version: 64.1.0 + resolution: "@metamask/transaction-controller@npm:64.1.0" + dependencies: + "@ethereumjs/common": "npm:^4.4.0" + "@ethereumjs/tx": "npm:^5.4.0" + "@ethereumjs/util": "npm:^9.1.0" + "@ethersproject/abi": "npm:^5.7.0" + "@ethersproject/contracts": "npm:^5.7.0" + "@ethersproject/providers": "npm:^5.7.0" + "@ethersproject/wallet": "npm:^5.7.0" + "@metamask/accounts-controller": "npm:^37.2.0" + "@metamask/approval-controller": "npm:^9.0.1" + "@metamask/base-controller": "npm:^9.0.1" + "@metamask/controller-utils": "npm:^11.20.0" + "@metamask/core-backend": "npm:^6.2.1" + "@metamask/gas-fee-controller": "npm:^26.1.1" + "@metamask/messenger": "npm:^1.1.1" + "@metamask/metamask-eth-abis": "npm:^3.1.1" + "@metamask/network-controller": "npm:^30.0.1" + "@metamask/nonce-tracker": "npm:^6.0.0" + "@metamask/remote-feature-flag-controller": "npm:^4.2.0" + "@metamask/rpc-errors": "npm:^7.0.2" + "@metamask/utils": "npm:^11.9.0" + async-mutex: "npm:^0.5.0" + bignumber.js: "npm:^9.1.2" + bn.js: "npm:^5.2.1" + eth-method-registry: "npm:^4.0.0" + fast-json-patch: "npm:^3.1.1" + lodash: "npm:^4.17.21" + uuid: "npm:^8.3.2" + peerDependencies: + "@babel/runtime": ^7.0.0 + "@metamask/eth-block-tracker": ">=9" + checksum: 10/915d5daa4445d605464763a7f06a680bfdaa6aa86fa27ea6ab8255a44824a6714008f750cadfbef4b59f94b0cfe0ee9f5d02d1fd6df3322d3b884ebecea41023 + languageName: node + linkType: hard + "@metamask/transaction-pay-controller@workspace:packages/transaction-pay-controller": version: 0.0.0-use.local resolution: "@metamask/transaction-pay-controller@workspace:packages/transaction-pay-controller" @@ -5533,9 +5837,9 @@ __metadata: languageName: unknown linkType: soft -"@metamask/utils@file:.yalc/@metamask/utils::locator=%40metamask%2Fcore-monorepo%40workspace%3A.": +"@metamask/utils@npm:^11.0.1, @metamask/utils@npm:^11.1.0, @metamask/utils@npm:^11.10.0, @metamask/utils@npm:^11.11.0, @metamask/utils@npm:^11.4.0, @metamask/utils@npm:^11.4.2, @metamask/utils@npm:^11.8.1, @metamask/utils@npm:^11.9.0": version: 11.11.0 - resolution: "@metamask/utils@file:.yalc/@metamask/utils#.yalc/@metamask/utils::hash=0927d5&locator=%40metamask%2Fcore-monorepo%40workspace%3A." + resolution: "@metamask/utils@npm:11.11.0" dependencies: "@ethereumjs/tx": "npm:^4.2.0" "@metamask/superstruct": "npm:^3.1.0" @@ -5548,7 +5852,24 @@ __metadata: pony-cause: "npm:^2.1.10" semver: "npm:^7.5.4" uuid: "npm:^9.0.1" - checksum: 10/0ba8b4ff754de34ffca545e0ef200bf0c4dfb82783090f0f4685c4a7e20da191d39093ca15971ef8ec2f0e69b0aa32be42602f01a67ce3988d3c5ba50a21cf4c + checksum: 10/c4381b9e451a9616bde84ac659bc0d1848ef06b6e605f877bfa065b78c8ed5015706683ea88a3387de5eaeb3a50d1af9af0994f04f9e06258d992598fe2be3bf + languageName: node + linkType: hard + +"@metamask/utils@npm:^9.0.0": + version: 9.3.0 + resolution: "@metamask/utils@npm:9.3.0" + dependencies: + "@ethereumjs/tx": "npm:^4.2.0" + "@metamask/superstruct": "npm:^3.1.0" + "@noble/hashes": "npm:^1.3.1" + "@scure/base": "npm:^1.1.3" + "@types/debug": "npm:^4.1.7" + debug: "npm:^4.3.4" + pony-cause: "npm:^2.1.10" + semver: "npm:^7.5.4" + uuid: "npm:^9.0.1" + checksum: 10/ed6648cd973bbf3b4eb0e862903b795a99d27784c820e19f62f0bc0ddf353e98c2858d7e9aaebc0249a586391b344e35b9249d13c08e3ea0c74b23dc1c6b1558 languageName: node linkType: hard From 7561c4dfc72a81ee7ee933f8378632e8304e078f Mon Sep 17 00:00:00 2001 From: Florin Dzeladini Date: Wed, 15 Apr 2026 20:49:12 +0200 Subject: [PATCH 3/7] chore: wip --- packages/account-tree-controller/src/group.ts | 2 + .../src/KeyringController.ts | 9 ++-- .../src/MultichainAccountWallet.test.ts | 6 +-- .../src/MultichainAccountWallet.ts | 6 +-- .../src/providers/AccountProviderWrapper.ts | 2 +- .../src/providers/BaseBip44AccountProvider.ts | 2 +- .../src/providers/BtcAccountProvider.ts | 2 +- .../src/providers/EvmAccountProvider.ts | 2 +- .../src/providers/SnapAccountProvider.test.ts | 2 +- .../src/providers/SolAccountProvider.ts | 2 +- .../src/providers/TrxAccountProvider.ts | 2 +- .../src/providers/XlmAccountProvider.ts | 8 ++-- .../src/tests/accounts.ts | 4 +- .../src/tests/providers.ts | 6 +-- .../src/constants.ts | 12 ++--- .../src/types.ts | 2 +- .../src/utils.test.ts | 6 +-- .../src/NetworkEnablementController.test.ts | 48 +++++++++---------- .../src/NetworkEnablementController.ts | 8 ++-- 19 files changed, 66 insertions(+), 65 deletions(-) diff --git a/packages/account-tree-controller/src/group.ts b/packages/account-tree-controller/src/group.ts index 118dd0e553..5e53cbc5a0 100644 --- a/packages/account-tree-controller/src/group.ts +++ b/packages/account-tree-controller/src/group.ts @@ -10,6 +10,7 @@ import { EthAccountType, SolAccountType, TrxAccountType, + XlmAccountType, } from '@metamask/keyring-api'; import type { KeyringAccountType } from '@metamask/keyring-api'; @@ -45,6 +46,7 @@ export const ACCOUNT_TYPE_TO_SORT_ORDER: Record = { [BtcAccountType.P2wpkh]: 5, [BtcAccountType.P2tr]: 6, [TrxAccountType.Eoa]: 7, + [XlmAccountType.Account]: 8, [AnyAccountType.Account]: MAX_SORT_ORDER, }; diff --git a/packages/keyring-controller/src/KeyringController.ts b/packages/keyring-controller/src/KeyringController.ts index d3d7def12b..445825a569 100644 --- a/packages/keyring-controller/src/KeyringController.ts +++ b/packages/keyring-controller/src/KeyringController.ts @@ -2,7 +2,8 @@ import type { TypedTransaction, TypedTxData } from '@ethereumjs/tx'; import { isValidPrivate, getBinarySize } from '@ethereumjs/util'; import { BaseController } from '@metamask/base-controller'; import type * as encryptorUtils from '@metamask/browser-passworder'; -import { HdKeyring, HdKeyringV2 } from '@metamask/eth-hd-keyring'; +import { HdKeyring } from '@metamask/eth-hd-keyring'; +import { HdKeyring as HdKeyringV2 } from '@metamask/eth-hd-keyring/v2'; import { normalize as ethNormalize } from '@metamask/eth-sig-util'; import SimpleKeyring, { SimpleKeyringV2 } from '@metamask/eth-simple-keyring'; import type { @@ -11,9 +12,11 @@ import type { EthBaseUserOperation, EthUserOperation, EthUserOperationPatch, - KeyringV2, + KeyringAccount, } from '@metamask/keyring-api'; + +import type { Keyring as KeyringV2 } from '@metamask/keyring-api/v2'; import type { EthKeyring } from '@metamask/keyring-internal-api'; import type { Keyring, KeyringClass } from '@metamask/keyring-utils'; import type { Messenger } from '@metamask/messenger'; @@ -564,7 +567,7 @@ const hdKeyringV2Builder: KeyringV2Builder = Object.assign( const simpleKeyringV2Builder: KeyringV2Builder = Object.assign( (keyring: Keyring): KeyringV2 => - new SimpleKeyringV2({ + new (require('./SimpleKeyringV2').SimpleKeyringV2)({ legacyKeyring: keyring as SimpleKeyring, }), { type: KeyringTypes.simple as string }, diff --git a/packages/multichain-account-service/src/MultichainAccountWallet.test.ts b/packages/multichain-account-service/src/MultichainAccountWallet.test.ts index 705ff8a9cd..57d3c09788 100644 --- a/packages/multichain-account-service/src/MultichainAccountWallet.test.ts +++ b/packages/multichain-account-service/src/MultichainAccountWallet.test.ts @@ -300,7 +300,7 @@ describe('MultichainAccountWallet', () => { ).rejects.toThrow('Unable to create accounts'); expect(captureExceptionSpy).toHaveBeenCalledWith( new Error( - 'Unable to create some accounts with provider "Mocked Provider 0"', + 'Unable to create accounts with provider "Mocked Provider 0" (group indices 1–1)', ), ); expect(captureExceptionSpy.mock.lastCall[0]).toHaveProperty( @@ -609,7 +609,7 @@ describe('MultichainAccountWallet', () => { ).rejects.toThrow(`Bad range, to (${badIndex}) must be >= 0`); }); - it('captures an error with batch mode message when EVM provider fails', async () => { + it('captures an error with group index range message when EVM provider fails', async () => { const { wallet, providers, messenger } = setup({ accounts: [[]], }); @@ -626,7 +626,7 @@ describe('MultichainAccountWallet', () => { expect(captureExceptionSpy).toHaveBeenCalledWith( new Error( - 'Unable to create some accounts (batch) with provider "Mocked Provider 0"', + 'Unable to create accounts with provider "Mocked Provider 0" (group indices 0–2)', ), ); expect(captureExceptionSpy.mock.lastCall[0]).toHaveProperty( diff --git a/packages/multichain-account-service/src/MultichainAccountWallet.ts b/packages/multichain-account-service/src/MultichainAccountWallet.ts index d38114eefe..0aca148d89 100644 --- a/packages/multichain-account-service/src/MultichainAccountWallet.ts +++ b/packages/multichain-account-service/src/MultichainAccountWallet.ts @@ -237,8 +237,6 @@ export class MultichainAccountWallet< from: number, to: number, ): Promise[]> { - const isBatching = to > from; - try { return await provider.createAccounts({ type: AccountCreationType.Bip44DeriveIndexRange, @@ -251,12 +249,12 @@ export class MultichainAccountWallet< } catch (error) { reportError( this.#messenger, - `Unable to create ${isBatching ? 'some accounts (batch)' : 'some accounts'} with provider "${provider.getName()}"`, + `Unable to create accounts with provider "${provider.getName()}" (group indices ${from}–${to})`, error, { range: { from, to }, provider: provider.getName(), - isBatching, + spansMultipleGroupIndices: to > from, }, ); throw error; diff --git a/packages/multichain-account-service/src/providers/AccountProviderWrapper.ts b/packages/multichain-account-service/src/providers/AccountProviderWrapper.ts index 40b1c8aba9..951143a9f3 100644 --- a/packages/multichain-account-service/src/providers/AccountProviderWrapper.ts +++ b/packages/multichain-account-service/src/providers/AccountProviderWrapper.ts @@ -3,8 +3,8 @@ import type { CreateAccountOptions, EntropySourceId, KeyringAccount, - KeyringCapabilities, } from '@metamask/keyring-api'; +import type { KeyringCapabilities } from '@metamask/keyring-api/v2'; import type { InternalAccount } from '@metamask/keyring-internal-api'; import type { MultichainAccountServiceMessenger } from '../types'; diff --git a/packages/multichain-account-service/src/providers/BaseBip44AccountProvider.ts b/packages/multichain-account-service/src/providers/BaseBip44AccountProvider.ts index 969ea506de..9f27f2fc72 100644 --- a/packages/multichain-account-service/src/providers/BaseBip44AccountProvider.ts +++ b/packages/multichain-account-service/src/providers/BaseBip44AccountProvider.ts @@ -4,8 +4,8 @@ import type { CreateAccountOptions, EntropySourceId, KeyringAccount, - KeyringCapabilities, } from '@metamask/keyring-api'; +import type { KeyringCapabilities } from '@metamask/keyring-api/v2'; import type { KeyringMetadata, KeyringSelector, diff --git a/packages/multichain-account-service/src/providers/BtcAccountProvider.ts b/packages/multichain-account-service/src/providers/BtcAccountProvider.ts index 9f48a50684..68fe0421c2 100644 --- a/packages/multichain-account-service/src/providers/BtcAccountProvider.ts +++ b/packages/multichain-account-service/src/providers/BtcAccountProvider.ts @@ -3,8 +3,8 @@ import type { TraceCallback } from '@metamask/controller-utils'; import type { EntropySourceId, KeyringAccount, - KeyringCapabilities, } from '@metamask/keyring-api'; +import type { KeyringCapabilities } from '@metamask/keyring-api/v2'; import { AccountCreationType, BtcAccountType, diff --git a/packages/multichain-account-service/src/providers/EvmAccountProvider.ts b/packages/multichain-account-service/src/providers/EvmAccountProvider.ts index aa0e1eb97d..db51235527 100644 --- a/packages/multichain-account-service/src/providers/EvmAccountProvider.ts +++ b/packages/multichain-account-service/src/providers/EvmAccountProvider.ts @@ -7,8 +7,8 @@ import type { CreateAccountOptions, EntropySourceId, KeyringAccount, - KeyringCapabilities, } from '@metamask/keyring-api'; +import type { KeyringCapabilities } from '@metamask/keyring-api/v2'; import { AccountCreationType, assertCreateAccountOptionIsSupported, diff --git a/packages/multichain-account-service/src/providers/SnapAccountProvider.test.ts b/packages/multichain-account-service/src/providers/SnapAccountProvider.test.ts index af33672f58..0ed4bd50ab 100644 --- a/packages/multichain-account-service/src/providers/SnapAccountProvider.test.ts +++ b/packages/multichain-account-service/src/providers/SnapAccountProvider.test.ts @@ -13,8 +13,8 @@ import type { CreateAccountOptions, DeleteAccountRequest, GetAccountRequest, - KeyringCapabilities, } from '@metamask/keyring-api'; +import type { KeyringCapabilities } from '@metamask/keyring-api/v2'; import type { EntropySourceId, KeyringAccount } from '@metamask/keyring-api'; import type { InternalAccount } from '@metamask/keyring-internal-api'; import type { JsonRpcRequest, SnapId } from '@metamask/snaps-sdk'; diff --git a/packages/multichain-account-service/src/providers/SolAccountProvider.ts b/packages/multichain-account-service/src/providers/SolAccountProvider.ts index 7d29880e71..30da2bd7b9 100644 --- a/packages/multichain-account-service/src/providers/SolAccountProvider.ts +++ b/packages/multichain-account-service/src/providers/SolAccountProvider.ts @@ -4,8 +4,8 @@ import type { TraceCallback } from '@metamask/controller-utils'; import type { EntropySourceId, KeyringAccount, - KeyringCapabilities, } from '@metamask/keyring-api'; +import type { KeyringCapabilities } from '@metamask/keyring-api/v2'; import { AccountCreationType, KeyringAccountEntropyTypeOption, diff --git a/packages/multichain-account-service/src/providers/TrxAccountProvider.ts b/packages/multichain-account-service/src/providers/TrxAccountProvider.ts index 451907ea6b..21128ab640 100644 --- a/packages/multichain-account-service/src/providers/TrxAccountProvider.ts +++ b/packages/multichain-account-service/src/providers/TrxAccountProvider.ts @@ -3,8 +3,8 @@ import type { TraceCallback } from '@metamask/controller-utils'; import type { EntropySourceId, KeyringAccount, - KeyringCapabilities, } from '@metamask/keyring-api'; +import type { KeyringCapabilities } from '@metamask/keyring-api/v2'; import { AccountCreationType, TrxAccountType, diff --git a/packages/multichain-account-service/src/providers/XlmAccountProvider.ts b/packages/multichain-account-service/src/providers/XlmAccountProvider.ts index 7ce7a5d3ff..5fbc0356cb 100644 --- a/packages/multichain-account-service/src/providers/XlmAccountProvider.ts +++ b/packages/multichain-account-service/src/providers/XlmAccountProvider.ts @@ -3,8 +3,8 @@ import type { TraceCallback } from '@metamask/controller-utils'; import type { EntropySourceId, KeyringAccount, - KeyringCapabilities, } from '@metamask/keyring-api'; +import type { KeyringCapabilities } from '@metamask/keyring-api/v2'; import { AccountCreationType, XlmAccountType, @@ -51,7 +51,7 @@ export class XlmAccountProvider extends SnapAccountProvider { static XLM_SNAP_ID = 'npm:@metamask/stellar-wallet-snap' as SnapId; readonly capabilities: KeyringCapabilities = { - scopes: [XlmScope.Mainnet, XlmScope.Testnet], + scopes: [XlmScope.Pubnet, XlmScope.Testnet], bip44: { deriveIndex: true, deriveIndexRange: true, @@ -88,7 +88,7 @@ export class XlmAccountProvider extends SnapAccountProvider { entropySource, index: groupIndex, addressType: XlmAccountType.Account, - scope: XlmScope.Mainnet, + scope: XlmScope.Pubnet, }); } @@ -117,7 +117,7 @@ export class XlmAccountProvider extends SnapAccountProvider { withTimeout( () => client.discoverAccounts( - [XlmScope.Mainnet], + [XlmScope.Pubnet], entropySource, groupIndex, ), diff --git a/packages/multichain-account-service/src/tests/accounts.ts b/packages/multichain-account-service/src/tests/accounts.ts index 3498ef1a57..a403d8d37e 100644 --- a/packages/multichain-account-service/src/tests/accounts.ts +++ b/packages/multichain-account-service/src/tests/accounts.ts @@ -167,7 +167,7 @@ export const MOCK_XLM_ACCOUNT_1: Bip44Account = { }, methods: XLM_METHODS, type: XlmAccountType.Account, - scopes: [XlmScope.Mainnet, XlmScope.Testnet], + scopes: [XlmScope.Pubnet, XlmScope.Testnet], metadata: { name: 'Stellar Account 1', keyring: { type: KeyringTypes.snap }, @@ -215,7 +215,7 @@ export const MOCK_TRX_DISCOVERED_ACCOUNT_1: DiscoveredAccount = { export const MOCK_XLM_DISCOVERED_ACCOUNT_1: DiscoveredAccount = { type: 'bip44', - scopes: [XlmScope.Mainnet], + scopes: [XlmScope.Pubnet], derivationPath: `m/44'/148'/0'`, }; diff --git a/packages/multichain-account-service/src/tests/providers.ts b/packages/multichain-account-service/src/tests/providers.ts index 0a55091fd4..e88c66256d 100644 --- a/packages/multichain-account-service/src/tests/providers.ts +++ b/packages/multichain-account-service/src/tests/providers.ts @@ -6,10 +6,8 @@ import { TrxScope, XlmScope, } from '@metamask/keyring-api'; -import type { - KeyringAccount, - KeyringCapabilities, -} from '@metamask/keyring-api'; +import type { KeyringAccount } from '@metamask/keyring-api'; +import type { KeyringCapabilities } from '@metamask/keyring-api/v2'; import { AccountProviderWrapper, EvmAccountProvider } from '../providers'; import { GroupIndexRange } from '../utils'; diff --git a/packages/multichain-network-controller/src/constants.ts b/packages/multichain-network-controller/src/constants.ts index 1435ce405b..8fe8205881 100644 --- a/packages/multichain-network-controller/src/constants.ts +++ b/packages/multichain-network-controller/src/constants.ts @@ -21,7 +21,7 @@ export const SOL_DEVNET_NATIVE_ASSET = `${SolScope.Devnet}/slip44:501`; export const TRX_NATIVE_ASSET = `${TrxScope.Mainnet}/slip44:195`; export const TRX_NILE_NATIVE_ASSET = `${TrxScope.Nile}/slip44:195`; export const TRX_SHASTA_NATIVE_ASSET = `${TrxScope.Shasta}/slip44:195`; -export const XLM_NATIVE_ASSET = `${XlmScope.Mainnet}/slip44:148`; +export const XLM_NATIVE_ASSET = `${XlmScope.Pubnet}/slip44:148`; export const XLM_TESTNET_NATIVE_ASSET = `${XlmScope.Testnet}/slip44:148`; /** @@ -97,8 +97,8 @@ export const AVAILABLE_MULTICHAIN_NETWORK_CONFIGURATIONS: Record< nativeCurrency: TRX_SHASTA_NATIVE_ASSET, isEvm: false, }, - [XlmScope.Mainnet]: { - chainId: XlmScope.Mainnet, + [XlmScope.Pubnet]: { + chainId: XlmScope.Pubnet, name: 'Stellar', nativeCurrency: XLM_NATIVE_ASSET, isEvm: false, @@ -144,7 +144,7 @@ export const NETWORKS_METADATA: Record = { features: [], status: NetworkStatus.Available, }, - [XlmScope.Mainnet]: { + [XlmScope.Pubnet]: { features: [], status: NetworkStatus.Available, }, @@ -214,7 +214,7 @@ export const MULTICHAIN_NETWORK_TICKER: Record = { [TrxScope.Mainnet]: 'TRX', [TrxScope.Nile]: 'tTRX', [TrxScope.Shasta]: 'sTRX', - [XlmScope.Mainnet]: 'XLM', + [XlmScope.Pubnet]: 'XLM', [XlmScope.Testnet]: 'tXLM', } as const; @@ -234,6 +234,6 @@ export const MULTICHAIN_NETWORK_DECIMAL_PLACES: Record = { [TrxScope.Mainnet]: 6, [TrxScope.Nile]: 6, [TrxScope.Shasta]: 6, - [XlmScope.Mainnet]: 7, + [XlmScope.Pubnet]: 7, [XlmScope.Testnet]: 7, } as const; diff --git a/packages/multichain-network-controller/src/types.ts b/packages/multichain-network-controller/src/types.ts index dcdc830d11..4b4b42b6d4 100644 --- a/packages/multichain-network-controller/src/types.ts +++ b/packages/multichain-network-controller/src/types.ts @@ -45,7 +45,7 @@ export type SupportedCaipChainId = | TrxScope.Mainnet | TrxScope.Nile | TrxScope.Shasta - | XlmScope.Mainnet + | XlmScope.Pubnet | XlmScope.Testnet; export type CommonNetworkConfiguration = { diff --git a/packages/multichain-network-controller/src/utils.test.ts b/packages/multichain-network-controller/src/utils.test.ts index 2b38ade5dc..83ceaacb05 100644 --- a/packages/multichain-network-controller/src/utils.test.ts +++ b/packages/multichain-network-controller/src/utils.test.ts @@ -30,8 +30,8 @@ describe('utils', () => { }); it('returns Stellar chain ID for Stellar scopes', () => { - const scopes = [XlmScope.Mainnet, XlmScope.Testnet]; - expect(getChainIdForNonEvm(scopes)).toBe(XlmScope.Mainnet); + const scopes = [XlmScope.Pubnet, XlmScope.Testnet]; + expect(getChainIdForNonEvm(scopes)).toBe(XlmScope.Pubnet); }); it('throws error if network is not found', () => { @@ -46,7 +46,7 @@ describe('utils', () => { it('returns true for supported CAIP chain IDs', () => { expect(checkIfSupportedCaipChainId(SolScope.Mainnet)).toBe(true); expect(checkIfSupportedCaipChainId(BtcScope.Mainnet)).toBe(true); - expect(checkIfSupportedCaipChainId(XlmScope.Mainnet)).toBe(true); + expect(checkIfSupportedCaipChainId(XlmScope.Pubnet)).toBe(true); expect(checkIfSupportedCaipChainId(XlmScope.Testnet)).toBe(true); }); diff --git a/packages/network-enablement-controller/src/NetworkEnablementController.test.ts b/packages/network-enablement-controller/src/NetworkEnablementController.test.ts index 06aa5b590e..8ca349966c 100644 --- a/packages/network-enablement-controller/src/NetworkEnablementController.test.ts +++ b/packages/network-enablement-controller/src/NetworkEnablementController.test.ts @@ -83,7 +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.Mainnet]: { chainId: XlmScope.Mainnet, name: 'Stellar' }, + [XlmScope.Pubnet]: { chainId: XlmScope.Pubnet, name: 'Stellar' }, }, selectedMultichainNetworkChainId: 'eip155:1', isEvmSelected: true, @@ -213,7 +213,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: true, + [XlmScope.Pubnet]: true, [XlmScope.Testnet]: false, }, }, @@ -273,7 +273,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: true, + [XlmScope.Pubnet]: true, [XlmScope.Testnet]: false, }, }, @@ -340,7 +340,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: true, + [XlmScope.Pubnet]: true, [XlmScope.Testnet]: false, }, }, @@ -485,7 +485,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: true, + [XlmScope.Pubnet]: true, [XlmScope.Testnet]: false, }, }, @@ -589,7 +589,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: true, + [XlmScope.Pubnet]: true, [XlmScope.Testnet]: false, }, }, @@ -1193,8 +1193,8 @@ describe('NetworkEnablementController', () => { chainId: TrxScope.Mainnet, name: 'Tron Mainnet', }, - [XlmScope.Mainnet]: { - chainId: XlmScope.Mainnet, + [XlmScope.Pubnet]: { + chainId: XlmScope.Pubnet, name: 'Stellar Mainnet', }, }, @@ -1239,7 +1239,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: true, + [XlmScope.Pubnet]: true, [XlmScope.Testnet]: false, }, }, @@ -1277,7 +1277,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: true, + [XlmScope.Pubnet]: true, [XlmScope.Testnet]: false, }, }, @@ -1363,7 +1363,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: false, + [XlmScope.Pubnet]: false, [XlmScope.Testnet]: false, }, }, @@ -1548,7 +1548,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: true, + [XlmScope.Pubnet]: true, [XlmScope.Testnet]: false, }, }, @@ -1586,7 +1586,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: false, + [XlmScope.Pubnet]: false, [XlmScope.Testnet]: false, }, }, @@ -1644,7 +1644,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: false, + [XlmScope.Pubnet]: false, [XlmScope.Testnet]: false, }, }, @@ -1686,7 +1686,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: false, + [XlmScope.Pubnet]: false, [XlmScope.Testnet]: false, }, }, @@ -1728,7 +1728,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: false, + [XlmScope.Pubnet]: false, [XlmScope.Testnet]: false, }, }, @@ -1781,7 +1781,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: false, + [XlmScope.Pubnet]: false, [XlmScope.Testnet]: false, }, }, @@ -1826,7 +1826,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: false, + [XlmScope.Pubnet]: false, [XlmScope.Testnet]: false, }, }, @@ -1884,7 +1884,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: false, + [XlmScope.Pubnet]: false, [XlmScope.Testnet]: false, }, }, @@ -1934,7 +1934,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: true, + [XlmScope.Pubnet]: true, [XlmScope.Testnet]: false, }, }, @@ -1986,7 +1986,7 @@ describe('NetworkEnablementController', () => { [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: true, + [XlmScope.Pubnet]: true, [XlmScope.Testnet]: false, }, }, @@ -2232,7 +2232,7 @@ describe('NetworkEnablementController', () => { expect(result).toContain(BtcScope.Mainnet); expect(result).toContain(SolScope.Mainnet); expect(result).toContain(TrxScope.Mainnet); - expect(result).toContain(XlmScope.Mainnet); + expect(result).toContain(XlmScope.Pubnet); expect(result).toHaveLength(7); }); @@ -2253,7 +2253,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.Mainnet); + expect(result).not.toContain(XlmScope.Pubnet); expect(result).toHaveLength(3); }); @@ -2308,7 +2308,7 @@ describe('NetworkEnablementController', () => { expect(result).toContain(BtcScope.Mainnet); expect(result).toContain(SolScope.Mainnet); expect(result).toContain(TrxScope.Mainnet); - expect(result).toContain(XlmScope.Mainnet); + expect(result).toContain(XlmScope.Pubnet); expect(result).toHaveLength(4); }); diff --git a/packages/network-enablement-controller/src/NetworkEnablementController.ts b/packages/network-enablement-controller/src/NetworkEnablementController.ts index 9ebd32fe55..39e428e57b 100644 --- a/packages/network-enablement-controller/src/NetworkEnablementController.ts +++ b/packages/network-enablement-controller/src/NetworkEnablementController.ts @@ -184,7 +184,7 @@ const getDefaultNetworkEnablementControllerState = [TrxScope.Shasta]: false, }, [KnownCaipNamespace.Stellar]: { - [XlmScope.Mainnet]: true, + [XlmScope.Pubnet]: true, [XlmScope.Testnet]: false, }, }, @@ -424,10 +424,10 @@ export class NetworkEnablementController extends BaseController< } // Enable Stellar mainnet if it exists in MultichainNetworkController configurations - const stellarKeys = deriveKeys(XlmScope.Mainnet as CaipChainId); + const stellarKeys = deriveKeys(XlmScope.Pubnet as CaipChainId); if ( multichainState.multichainNetworkConfigurationsByChainId[ - XlmScope.Mainnet + XlmScope.Pubnet ] ) { this.#ensureNamespaceBucket(state, stellarKeys.namespace); @@ -798,7 +798,7 @@ export class NetworkEnablementController extends BaseController< BtcScope.Mainnet, SolScope.Mainnet, TrxScope.Mainnet, - XlmScope.Mainnet, + XlmScope.Pubnet, ] as const; return multichainMainnets.filter( (chainId) => From c9096cef972f2748a2793e9aece63d83f3477ad6 Mon Sep 17 00:00:00 2001 From: Florin Dzeladini Date: Wed, 15 Apr 2026 21:27:49 +0200 Subject: [PATCH 4/7] chore: bump utils in network-enablement-controller --- packages/network-enablement-controller/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/network-enablement-controller/package.json b/packages/network-enablement-controller/package.json index a10eea7acb..d73af27f09 100644 --- a/packages/network-enablement-controller/package.json +++ b/packages/network-enablement-controller/package.json @@ -61,7 +61,7 @@ "@metamask/network-controller": "^30.0.1", "@metamask/slip44": "^4.3.0", "@metamask/transaction-controller": "^64.2.0", - "@metamask/utils": "^11.9.0", + "@metamask/utils": "^11.11.0", "reselect": "^5.1.1" }, "devDependencies": { From eccd2e6702fea0777f3c2788bc3e71bebc315a0c Mon Sep 17 00:00:00 2001 From: Florin Dzeladini Date: Wed, 22 Apr 2026 16:13:27 +0200 Subject: [PATCH 5/7] feat: token import stellar --- packages/bridge-controller/CHANGELOG.md | 5 +++ .../bridge-controller/src/constants/bridge.ts | 4 +- .../bridge-controller/src/constants/tokens.ts | 13 ++++++- packages/bridge-controller/src/index.ts | 3 ++ packages/bridge-controller/src/types.ts | 7 +++- .../src/utils/bridge.test.ts | 36 ++++++++++++++++- .../bridge-controller/src/utils/bridge.ts | 25 ++++++++++-- .../src/utils/caip-formatters.test.ts | 14 ++++++- .../src/utils/caip-formatters.ts | 12 +++++- .../src/utils/trade-utils.test.ts | 39 +++++++++++++++++++ .../src/utils/trade-utils.ts | 39 +++++++++++++++++-- .../bridge-controller/src/utils/validators.ts | 9 +++++ 12 files changed, 194 insertions(+), 12 deletions(-) diff --git a/packages/bridge-controller/CHANGELOG.md b/packages/bridge-controller/CHANGELOG.md index f3b55d98c5..c88ab76e82 100644 --- a/packages/bridge-controller/CHANGELOG.md +++ b/packages/bridge-controller/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add Stellar support for bridge token flows: `isStellarChainId`, `ChainId.STELLAR`, native XLM metadata, CAIP/decimal formatting aligned with Bridge API, and Stellar pubnet/testnet in `isNonEvmChainId` ([#TODO](https://github.com/MetaMask/core/pull/TODO)) +- Add `StellarTradeDataSchema`, `StellarTradeData`, and `isStellarTrade`; extend `extractTradeData` to read Stellar XDR from `{ xdrBase64 }` or `{ xdr }` objects ([#TODO](https://github.com/MetaMask/core/pull/TODO)) + ### Changed - Bump `@metamask/transaction-controller` from `^64.2.0` to `^64.3.0` ([#8482](https://github.com/MetaMask/core/pull/8482)) diff --git a/packages/bridge-controller/src/constants/bridge.ts b/packages/bridge-controller/src/constants/bridge.ts index 14be143ec2..b72baf66ca 100644 --- a/packages/bridge-controller/src/constants/bridge.ts +++ b/packages/bridge-controller/src/constants/bridge.ts @@ -1,5 +1,5 @@ import { AddressZero } from '@ethersproject/constants'; -import { BtcScope, SolScope, TrxScope } from '@metamask/keyring-api'; +import { BtcScope, SolScope, TrxScope, XlmScope } from '@metamask/keyring-api'; import type { Hex } from '@metamask/utils'; import type { @@ -25,6 +25,7 @@ export const ALLOWED_BRIDGE_CHAIN_IDS = [ SolScope.Mainnet, BtcScope.Mainnet, TrxScope.Mainnet, + XlmScope.Pubnet, ] as const; export type AllowedBridgeChainIds = (typeof ALLOWED_BRIDGE_CHAIN_IDS)[number]; @@ -56,6 +57,7 @@ export const DEFAULT_CHAIN_RANKING = [ { chainId: 'bip122:000000000019d6689c085ae165831e93', name: 'BTC' }, { chainId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', name: 'Solana' }, { chainId: 'tron:728126428', name: 'Tron' }, + { chainId: 'stellar:pubnet', name: 'Stellar' }, { chainId: 'eip155:8453', name: 'Base' }, { chainId: 'eip155:42161', name: 'Arbitrum' }, { chainId: 'eip155:59144', name: 'Linea' }, diff --git a/packages/bridge-controller/src/constants/tokens.ts b/packages/bridge-controller/src/constants/tokens.ts index 1c0ec09894..c4f6b85d9d 100644 --- a/packages/bridge-controller/src/constants/tokens.ts +++ b/packages/bridge-controller/src/constants/tokens.ts @@ -1,4 +1,4 @@ -import { BtcScope, SolScope, TrxScope } from '@metamask/keyring-api'; +import { BtcScope, SolScope, TrxScope, XlmScope } from '@metamask/keyring-api'; import type { AllowedBridgeChainIds } from './bridge'; import { CHAIN_IDS } from './chains'; @@ -59,6 +59,7 @@ const CURRENCY_SYMBOLS = { MON: 'MON', HYPE: 'HYPE', MEGAETH: 'ETH', + XLM: 'XLM', } as const; const ETH_SWAPS_TOKEN_OBJECT = { @@ -169,6 +170,14 @@ const TRX_SWAPS_TOKEN_OBJECT = { iconUrl: '', } as const; +const XLM_SWAPS_TOKEN_OBJECT = { + symbol: CURRENCY_SYMBOLS.XLM, + name: 'Stellar Lumens', + address: DEFAULT_TOKEN_ADDRESS, + decimals: 7, + iconUrl: '', +} as const; + const MONAD_SWAPS_TOKEN_OBJECT = { symbol: CURRENCY_SYMBOLS.MON, name: 'Mon', @@ -210,6 +219,7 @@ export const SWAPS_CHAINID_DEFAULT_TOKEN_MAP = { [SolScope.Devnet]: SOLANA_SWAPS_TOKEN_OBJECT, [BtcScope.Mainnet]: BTC_SWAPS_TOKEN_OBJECT, [TrxScope.Mainnet]: TRX_SWAPS_TOKEN_OBJECT, + [XlmScope.Pubnet]: XLM_SWAPS_TOKEN_OBJECT, } as const; export type SupportedSwapsNativeCurrencySymbols = @@ -234,6 +244,7 @@ export const SYMBOL_TO_SLIP44_MAP: Record< TESTETH: 'slip44:60', SEI: 'slip44:19000118', TRX: 'slip44:195', + XLM: 'slip44:148', MON: 'slip44:268435779', HYPE: 'slip44:2457', }; diff --git a/packages/bridge-controller/src/index.ts b/packages/bridge-controller/src/index.ts index 5794866620..ed7739f1e1 100644 --- a/packages/bridge-controller/src/index.ts +++ b/packages/bridge-controller/src/index.ts @@ -48,6 +48,7 @@ export type { Intent, IntentOrderLike, BitcoinTradeData, + StellarTradeData, TronTradeData, BridgeControllerState, BridgeControllerAction, @@ -138,6 +139,7 @@ export { isSolanaChainId, isBitcoinChainId, isTronChainId, + isStellarChainId, isNonEvmChainId, getNativeAssetForChainId, getDefaultBridgeControllerState, @@ -164,6 +166,7 @@ export { export { extractTradeData, isBitcoinTrade, + isStellarTrade, isTronTrade, isEvmTxData, type Trade, diff --git a/packages/bridge-controller/src/types.ts b/packages/bridge-controller/src/types.ts index 0d37064a27..1af17f814e 100644 --- a/packages/bridge-controller/src/types.ts +++ b/packages/bridge-controller/src/types.ts @@ -45,6 +45,7 @@ import type { StepSchema, TokenFeatureSchema, QuoteStreamCompleteSchema, + StellarTradeDataSchema, TronTradeDataSchema, TxDataSchema, } from './utils/validators'; @@ -283,13 +284,15 @@ export type IntentOrderLike = Intent['order']; export type BitcoinTradeData = Infer; export type TronTradeData = Infer; + +export type StellarTradeData = Infer; /** * This is the type for the quote response from the bridge-api * TxDataType can be overriden to be a string when the quote is non-evm * ApprovalType can be overriden when you know the specific approval type (e.g., TxData for EVM-only contexts) */ export type QuoteResponse< - TxDataType = TxData | string | BitcoinTradeData | TronTradeData, + TxDataType = TxData | string | BitcoinTradeData | TronTradeData | StellarTradeData, ApprovalType = TxData | TronTradeData, > = Infer & { trade: TxDataType; @@ -317,6 +320,8 @@ export enum ChainId { LINEA = 59144, SOLANA = 1151111081099710, BTC = 20000000000001, + /** Internal bridge / token-list id for Stellar pubnet (Token API chain: stellar:pubnet). */ + STELLAR = 20000000000002, TRON = 728126428, SEI = 1329, MONAD = 143, diff --git a/packages/bridge-controller/src/utils/bridge.test.ts b/packages/bridge-controller/src/utils/bridge.test.ts index 97680af1e2..f24dea769a 100644 --- a/packages/bridge-controller/src/utils/bridge.test.ts +++ b/packages/bridge-controller/src/utils/bridge.test.ts @@ -1,4 +1,4 @@ -import { BtcScope, SolScope } from '@metamask/keyring-api'; +import { BtcScope, SolScope, XlmScope } from '@metamask/keyring-api'; import type { Hex } from '@metamask/utils'; import { @@ -15,6 +15,7 @@ import { isEthUsdt, isNonEvmChainId, isSolanaChainId, + isStellarChainId, isSwapsDefaultTokenAddress, isSwapsDefaultTokenSymbol, sumHexes, @@ -185,6 +186,24 @@ describe('Bridge utils', () => { }); }); + describe('isStellarChainId', () => { + it('returns true for Stellar CAIP-2 chain ids', () => { + expect(isStellarChainId(XlmScope.Pubnet)).toBe(true); + expect(isStellarChainId(XlmScope.Testnet)).toBe(true); + }); + + it('returns true for internal Stellar bridge chain id', () => { + expect(isStellarChainId(ChainId.STELLAR)).toBe(true); + expect(isStellarChainId(String(ChainId.STELLAR))).toBe(true); + }); + + it('returns false for other chainIds', () => { + expect(isStellarChainId(SolScope.Mainnet)).toBe(false); + expect(isStellarChainId('0x1')).toBe(false); + expect(isStellarChainId(1)).toBe(false); + }); + }); + describe('isNonEvmChainId', () => { it('returns true for Solana chainIds', () => { expect(isNonEvmChainId(ChainId.SOLANA)).toBe(true); @@ -198,6 +217,12 @@ describe('Bridge utils', () => { expect(isNonEvmChainId('20000000000001')).toBe(true); }); + it('returns true for Stellar chainIds', () => { + expect(isNonEvmChainId(XlmScope.Pubnet)).toBe(true); + expect(isNonEvmChainId(XlmScope.Testnet)).toBe(true); + expect(isNonEvmChainId(ChainId.STELLAR)).toBe(true); + }); + it('returns false for EVM chainIds', () => { expect(isNonEvmChainId('0x1')).toBe(false); expect(isNonEvmChainId(1)).toBe(false); @@ -268,6 +293,15 @@ describe('Bridge utils', () => { }); }); + it('should return native asset for Stellar chainId', () => { + const result = getNativeAssetForChainId(XlmScope.Pubnet); + expect(result).toStrictEqual({ + ...SWAPS_CHAINID_DEFAULT_TOKEN_MAP[XlmScope.Pubnet], + chainId: ChainId.STELLAR, + assetId: 'stellar:pubnet/slip44:148', + }); + }); + it('should throw error for unsupported chainId', () => { expect(() => getNativeAssetForChainId('999999')).toThrow( 'No XChain Swaps native asset found for chainId: 999999', diff --git a/packages/bridge-controller/src/utils/bridge.ts b/packages/bridge-controller/src/utils/bridge.ts index 204b164d51..9eea963a7f 100644 --- a/packages/bridge-controller/src/utils/bridge.ts +++ b/packages/bridge-controller/src/utils/bridge.ts @@ -1,6 +1,6 @@ import { AddressZero } from '@ethersproject/constants'; import { Contract } from '@ethersproject/contracts'; -import { BtcScope, SolScope, TrxScope } from '@metamask/keyring-api'; +import { BtcScope, SolScope, TrxScope, XlmScope } from '@metamask/keyring-api'; import { abiERC20 } from '@metamask/metamask-eth-abis'; import { isCaipChainId, isStrictHexString } from '@metamask/utils'; import type { CaipAssetType, CaipChainId, Hex } from '@metamask/utils'; @@ -230,9 +230,27 @@ export const isTronChainId = (chainId: Hex | number | CaipChainId | string) => { return chainId.toString() === ChainId.TRON.toString(); }; +/** + * Checks whether the chainId matches Stellar pubnet or testnet (CAIP-2). + * + * @param chainId - The chainId to check + * @returns Whether the chainId is Stellar + */ +export const isStellarChainId = ( + chainId: Hex | number | CaipChainId | string, +): boolean => { + if (isCaipChainId(chainId)) { + return ( + chainId === XlmScope.Pubnet.toString() || + chainId === XlmScope.Testnet.toString() + ); + } + return chainId.toString() === ChainId.STELLAR.toString(); +}; + /** * Checks if a chain ID represents a non-EVM blockchain supported by swaps - * Currently supports Solana, Bitcoin and Tron + * Currently supports Solana, Bitcoin, Tron, and Stellar * * @param chainId - The chain ID to check * @returns True if the chain is a supported non-EVM chain, false otherwise @@ -243,7 +261,8 @@ export const isNonEvmChainId = ( return ( isSolanaChainId(chainId) || isBitcoinChainId(chainId) || - isTronChainId(chainId) + isTronChainId(chainId) || + isStellarChainId(chainId) ); }; diff --git a/packages/bridge-controller/src/utils/caip-formatters.test.ts b/packages/bridge-controller/src/utils/caip-formatters.test.ts index 6b39b96434..3f91b91bfc 100644 --- a/packages/bridge-controller/src/utils/caip-formatters.test.ts +++ b/packages/bridge-controller/src/utils/caip-formatters.test.ts @@ -1,5 +1,5 @@ import { AddressZero } from '@ethersproject/constants'; -import { BtcScope, SolScope, TrxScope } from '@metamask/keyring-api'; +import { BtcScope, SolScope, TrxScope, XlmScope } from '@metamask/keyring-api'; import { CHAIN_IDS } from '../constants/chains'; import { ChainId } from '../types'; @@ -41,6 +41,12 @@ describe('CAIP Formatters', () => { expect(formatChainIdToCaip(TrxScope.Mainnet)).toBe(TrxScope.Mainnet); }); + it('should convert Stellar chainId to XlmScope', () => { + expect(formatChainIdToCaip(ChainId.STELLAR)).toBe(XlmScope.Pubnet); + expect(formatChainIdToCaip(XlmScope.Pubnet)).toBe(XlmScope.Pubnet); + expect(formatChainIdToCaip(XlmScope.Testnet)).toBe(XlmScope.Testnet); + }); + it('should convert number to CAIP format', () => { expect(formatChainIdToCaip(1)).toBe('eip155:1'); }); @@ -68,6 +74,12 @@ describe('CAIP Formatters', () => { expect(formatChainIdToDec(TrxScope.Mainnet)).toBe(ChainId.TRON); }); + it('should handle Stellar mainnet', () => { + expect(formatChainIdToDec(XlmScope.Pubnet)).toBe(ChainId.STELLAR); + expect(formatChainIdToDec(XlmScope.Testnet)).toBe(ChainId.STELLAR); + expect(formatChainIdToDec(ChainId.STELLAR)).toBe(ChainId.STELLAR); + }); + it('should parse CAIP chainId to decimal', () => { expect(formatChainIdToDec('eip155:1')).toBe(1); }); diff --git a/packages/bridge-controller/src/utils/caip-formatters.ts b/packages/bridge-controller/src/utils/caip-formatters.ts index 450be976b0..eec21f2c74 100644 --- a/packages/bridge-controller/src/utils/caip-formatters.ts +++ b/packages/bridge-controller/src/utils/caip-formatters.ts @@ -5,7 +5,7 @@ import { convertHexToDecimal, toChecksumHexAddress, } from '@metamask/controller-utils'; -import { BtcScope, SolScope, TrxScope } from '@metamask/keyring-api'; +import { BtcScope, SolScope, TrxScope, XlmScope } from '@metamask/keyring-api'; import { toEvmCaipChainId } from '@metamask/multichain-network-controller'; import { isCaipChainId, @@ -25,6 +25,7 @@ import { isBitcoinChainId, isNativeAddress, isSolanaChainId, + isStellarChainId, isTronChainId, } from './bridge'; @@ -52,6 +53,12 @@ export const formatChainIdToCaip = ( if (isTronChainId(chainId)) { return TrxScope.Mainnet; } + if (isStellarChainId(chainId)) { + if (chainId === XlmScope.Testnet) { + return XlmScope.Testnet; + } + return XlmScope.Pubnet; + } return toEvmCaipChainId(numberToHex(Number(chainId))); }; @@ -76,6 +83,9 @@ export const formatChainIdToDec = ( if (chainId === TrxScope.Mainnet) { return ChainId.TRON; } + if (isStellarChainId(chainId)) { + return ChainId.STELLAR; + } if (isCaipChainId(chainId)) { return Number(chainId.split(':').at(-1)); } diff --git a/packages/bridge-controller/src/utils/trade-utils.test.ts b/packages/bridge-controller/src/utils/trade-utils.test.ts index 0d4a4cf74f..d238910208 100644 --- a/packages/bridge-controller/src/utils/trade-utils.test.ts +++ b/packages/bridge-controller/src/utils/trade-utils.test.ts @@ -3,6 +3,7 @@ import { extractTradeData, isEvmTxData, isBitcoinTrade, + isStellarTrade, isTronTrade, } from './trade-utils'; import type { Trade } from './trade-utils'; @@ -145,12 +146,50 @@ describe('Trade utils', () => { }); }); + describe('isStellarTrade', () => { + it('returns true for xdrBase64 object', () => { + expect( + isStellarTrade({ xdrBase64: 'AAAABg==' } as unknown as Trade), + ).toBe(true); + }); + + it('returns true for xdr object', () => { + expect(isStellarTrade({ xdr: 'AAAABg==' } as unknown as Trade)).toBe( + true, + ); + }); + + it('returns false for Tron trade', () => { + expect( + isStellarTrade({ + raw_data_hex: 'ab', + } as unknown as Trade), + ).toBe(false); + }); + }); + describe('extractTradeData', () => { it('returns string as-is for Solana trades', () => { const solanaTrade = 'base64EncodedSolanaTransaction'; expect(extractTradeData(solanaTrade)).toBe(solanaTrade); }); + it('returns xdrBase64 for Stellar trade object', () => { + expect( + extractTradeData({ + xdrBase64: 'stellarXdrPayload', + } as unknown as Trade), + ).toBe('stellarXdrPayload'); + }); + + it('returns xdr for Stellar trade object with xdr key', () => { + expect( + extractTradeData({ + xdr: 'stellarXdrAlt', + } as unknown as Trade), + ).toBe('stellarXdrAlt'); + }); + it('extracts data property from EVM TxData object', () => { const evmTxData: TxData = { chainId: 1, diff --git a/packages/bridge-controller/src/utils/trade-utils.ts b/packages/bridge-controller/src/utils/trade-utils.ts index 0e78b063da..568b115236 100644 --- a/packages/bridge-controller/src/utils/trade-utils.ts +++ b/packages/bridge-controller/src/utils/trade-utils.ts @@ -1,7 +1,17 @@ -import type { BitcoinTradeData, TronTradeData, TxData } from '../types'; +import type { + BitcoinTradeData, + StellarTradeData, + TronTradeData, + TxData, +} from '../types'; -// Union type representing all possible trade formats (EVM, Solana, Bitcoin, Tron) -export type Trade = TxData | string | BitcoinTradeData | TronTradeData; +// Union type representing all possible trade formats (EVM, Solana, Bitcoin, Tron, Stellar) +export type Trade = + | TxData + | string + | BitcoinTradeData + | TronTradeData + | StellarTradeData; /** * Type guard to check if a trade is an EVM TxData object @@ -41,6 +51,25 @@ export const isTronTrade = (trade: Trade): trade is TronTradeData => { return typeof trade === 'object' && trade !== null && 'raw_data_hex' in trade; }; +/** + * Type guard to check if a trade is a Stellar trade with XDR (base64) payload + */ +export const isStellarTrade = (trade: Trade): trade is StellarTradeData => { + if (typeof trade !== 'object' || trade === null) { + return false; + } + if ( + 'xdrBase64' in trade && + typeof (trade as { xdrBase64: unknown }).xdrBase64 === 'string' + ) { + return true; + } + if ('xdr' in trade && typeof (trade as { xdr: unknown }).xdr === 'string') { + return true; + } + return false; +}; + /** * Extracts the transaction data from different trade formats * @@ -59,6 +88,10 @@ export const extractTradeData = (trade: Trade): string => { return Buffer.from(trade.raw_data_hex, 'hex').toString('base64'); } + if (isStellarTrade(trade)) { + return 'xdrBase64' in trade ? trade.xdrBase64 : trade.xdr; + } + if (typeof trade === 'string') { // Solana txs - assuming already in correct format return trade; diff --git a/packages/bridge-controller/src/utils/validators.ts b/packages/bridge-controller/src/utils/validators.ts index 73603b2ee9..893cb9c374 100644 --- a/packages/bridge-controller/src/utils/validators.ts +++ b/packages/bridge-controller/src/utils/validators.ts @@ -458,6 +458,14 @@ export const TronTradeDataSchema = type({ ), }); +/** + * Stellar bridge quote: unsigned transaction envelope as XDR (base64). + */ +export const StellarTradeDataSchema = union([ + type({ xdrBase64: string() }), + type({ xdr: string() }), +]); + export const QuoteResponseSchema = type({ quote: QuoteSchema, estimatedProcessingTimeInSeconds: number(), @@ -466,6 +474,7 @@ export const QuoteResponseSchema = type({ TxDataSchema, BitcoinTradeDataSchema, TronTradeDataSchema, + StellarTradeDataSchema, string(), ]), }); From 8c875c1d7bd07decdadb5aff98a6b347bb3af965 Mon Sep 17 00:00:00 2001 From: Florin Dzeladini Date: Wed, 22 Apr 2026 16:14:34 +0200 Subject: [PATCH 6/7] chore: add STELLAR in scope --- packages/chain-agnostic-permission/src/scope/types.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/chain-agnostic-permission/src/scope/types.ts b/packages/chain-agnostic-permission/src/scope/types.ts index 24c2c036c2..2b7f052b3e 100644 --- a/packages/chain-agnostic-permission/src/scope/types.ts +++ b/packages/chain-agnostic-permission/src/scope/types.ts @@ -123,7 +123,8 @@ export type NonWalletKnownCaipNamespace = | KnownCaipNamespace.Eip155 | KnownCaipNamespace.Bip122 | KnownCaipNamespace.Solana - | KnownCaipNamespace.Tron; + | KnownCaipNamespace.Tron + | KnownCaipNamespace.Stellar; /** * Checks if a scope string is either a 'wallet' scope or a 'wallet:*' scope. From 751e42a5d048780da4ad2c2710715322de22b998 Mon Sep 17 00:00:00 2001 From: Florin Dzeladini Date: Tue, 5 May 2026 10:17:55 +0200 Subject: [PATCH 7/7] feat: enable batching in stellar --- .../src/providers/XlmAccountProvider.test.ts | 286 ++++++++++++++++++ .../src/providers/XlmAccountProvider.ts | 4 +- 2 files changed, 288 insertions(+), 2 deletions(-) create mode 100644 packages/multichain-account-service/src/providers/XlmAccountProvider.test.ts diff --git a/packages/multichain-account-service/src/providers/XlmAccountProvider.test.ts b/packages/multichain-account-service/src/providers/XlmAccountProvider.test.ts new file mode 100644 index 0000000000..0c2d2942ef --- /dev/null +++ b/packages/multichain-account-service/src/providers/XlmAccountProvider.test.ts @@ -0,0 +1,286 @@ +import { isBip44Account } from '@metamask/account-api'; +import type { SnapKeyring } from '@metamask/eth-snap-keyring'; +import { AccountCreationType } from '@metamask/keyring-api'; +import type { KeyringMetadata } from '@metamask/keyring-controller'; +import type { + EthKeyring, + InternalAccount, +} from '@metamask/keyring-internal-api'; +import { SnapControllerState } from '@metamask/snaps-controllers'; +import type { Json } from '@metamask/utils'; +import deepmerge from 'deepmerge'; + +import { + getMultichainAccountServiceMessenger, + getRootMessenger, + MOCK_HD_KEYRING_2, + MOCK_XLM_ACCOUNT_1, + MockAccountBuilder, + toGroupIndexRangeArray, +} from '../tests'; +import type { RootMessenger, DeepPartial } from '../tests'; +import { AccountProviderWrapper } from './AccountProviderWrapper'; +import type { SnapAccountProviderConfig } from './SnapAccountProvider'; +import { + XLM_ACCOUNT_PROVIDER_DEFAULT_CONFIG, + XLM_ACCOUNT_PROVIDER_NAME, + XlmAccountProvider, +} from './XlmAccountProvider'; + +function asConfig( + partial: DeepPartial, +): SnapAccountProviderConfig { + return deepmerge( + XLM_ACCOUNT_PROVIDER_DEFAULT_CONFIG, + partial, + ) as SnapAccountProviderConfig; +} + +class MockStellarKeyring { + readonly type = 'MockStellarKeyring'; + + readonly metadata: KeyringMetadata = { + id: 'mock-stellar-keyring-id', + name: '', + }; + + readonly accounts: InternalAccount[]; + + constructor(accounts: InternalAccount[]) { + this.accounts = accounts; + } + + createAccount: SnapKeyring['createAccount'] = jest + .fn() + .mockImplementation((_, options: Record) => { + const { index } = options; + if (typeof index === 'number') { + const found = this.accounts.find( + (account) => + isBip44Account(account) && + account.options.entropy.groupIndex === index, + ); + + if (found) { + return found; + } + } + + const account = MockAccountBuilder.from(MOCK_XLM_ACCOUNT_1) + .withUuid() + .withAddressSuffix(`${this.accounts.length}`) + .withGroupIndex(typeof index === 'number' ? index : this.accounts.length) + .get(); + this.accounts.push(account); + + return account; + }); + + createAccounts: SnapKeyring['createAccounts'] = jest + .fn() + .mockImplementation((_, options) => { + const groupIndices = + options.type === 'bip44:derive-index' + ? [options.groupIndex] + : toGroupIndexRangeArray(options.range); + + return groupIndices.map((groupIndex) => { + const found = this.accounts.find( + (account) => + isBip44Account(account) && + account.options.entropy.groupIndex === groupIndex, + ); + + if (found) { + return found; + } + + const account = MockAccountBuilder.from(MOCK_XLM_ACCOUNT_1) + .withUuid() + .withAddressSuffix(`${groupIndex}`) + .withGroupIndex(groupIndex) + .get(); + this.accounts.push(account); + return account; + }); + }); +} + +class MockXlmAccountProvider extends XlmAccountProvider { + override async ensureCanUseSnapPlatform(): Promise { + // Override to avoid waiting during tests. + } +} + +function setup({ + messenger = getRootMessenger(), + accounts = [], + config, +}: { + messenger?: RootMessenger; + accounts?: InternalAccount[]; + config?: SnapAccountProviderConfig; +} = {}): { + provider: AccountProviderWrapper; + messenger: RootMessenger; + keyring: MockStellarKeyring; + mocks: { + handleRequest: jest.Mock; + keyring: { + createAccount: jest.Mock; + createAccounts: jest.Mock; + }; + trace: jest.Mock; + }; +} { + const keyring = new MockStellarKeyring(accounts); + + messenger.registerActionHandler( + 'AccountsController:getAccounts', + () => accounts, + ); + + messenger.registerActionHandler( + 'SnapController:getState', + () => ({ isReady: true }) as SnapControllerState, + ); + + messenger.registerActionHandler( + 'AccountsController:listMultichainAccounts', + () => accounts, + ); + + const mockGetAccount = jest.fn().mockImplementation((id) => { + return keyring.accounts.find((account) => account.id === id); + }); + messenger.registerActionHandler( + 'AccountsController:getAccount', + mockGetAccount, + ); + + const mockHandleRequest = jest + .fn() + .mockImplementation((address: string) => + keyring.accounts.find((account) => account.address === address), + ); + + const mockTrace = jest.fn().mockImplementation(async (_request, fn) => { + return await fn(); + }); + + messenger.registerActionHandler( + 'SnapController:handleRequest', + mockHandleRequest, + ); + + messenger.registerActionHandler( + 'KeyringController:withKeyring', + async (_, operation) => + operation({ + keyring: keyring as unknown as EthKeyring, + metadata: keyring.metadata, + }), + ); + + const multichainMessenger = getMultichainAccountServiceMessenger(messenger); + const xlmProvider = new MockXlmAccountProvider( + multichainMessenger, + config, + mockTrace, + ); + const accountIds = accounts.map((account) => account.id); + xlmProvider.init(accountIds); + const provider = new AccountProviderWrapper(multichainMessenger, xlmProvider); + + return { + provider, + messenger, + keyring, + mocks: { + handleRequest: mockHandleRequest, + keyring: { + createAccount: keyring.createAccount as jest.Mock, + createAccounts: keyring.createAccounts as jest.Mock, + }, + trace: mockTrace, + }, + }; +} + +describe('XlmAccountProvider', () => { + it('getName returns Stellar', () => { + const { provider } = setup({ accounts: [] }); + expect(provider.getName()).toBe(XLM_ACCOUNT_PROVIDER_NAME); + }); + + describe('v1', () => { + it('uses createAccount when batching is disabled', async () => { + const accounts = [MOCK_XLM_ACCOUNT_1]; + const { provider, mocks } = setup({ + accounts, + config: asConfig({ createAccounts: { batched: false } }), + }); + + await provider.createAccounts({ + type: AccountCreationType.Bip44DeriveIndex, + entropySource: MOCK_HD_KEYRING_2.metadata.id, + groupIndex: accounts.length, + }); + + expect(mocks.keyring.createAccount).toHaveBeenCalled(); + expect(mocks.keyring.createAccounts).not.toHaveBeenCalled(); + }); + }); + + describe('v2 - batched', () => { + it('creates one account via createAccounts', async () => { + const accounts = [MOCK_XLM_ACCOUNT_1]; + const { provider, mocks } = setup({ + accounts, + config: asConfig({ createAccounts: { batched: true } }), + }); + + const newGroupIndex = accounts.length; + const newAccounts = await provider.createAccounts({ + type: AccountCreationType.Bip44DeriveIndex, + entropySource: MOCK_HD_KEYRING_2.metadata.id, + groupIndex: newGroupIndex, + }); + + expect(newAccounts).toHaveLength(1); + expect(mocks.keyring.createAccounts).toHaveBeenCalledWith( + XlmAccountProvider.XLM_SNAP_ID, + { + type: AccountCreationType.Bip44DeriveIndex, + entropySource: MOCK_HD_KEYRING_2.metadata.id, + groupIndex: newGroupIndex, + }, + ); + expect(mocks.keyring.createAccount).not.toHaveBeenCalled(); + }); + + it('creates multiple accounts using Bip44DeriveIndexRange', async () => { + const accounts = [MOCK_XLM_ACCOUNT_1]; + const { provider, mocks } = setup({ + accounts, + config: asConfig({ createAccounts: { batched: true } }), + }); + + const from = 1; + const newAccounts = await provider.createAccounts({ + type: AccountCreationType.Bip44DeriveIndexRange, + entropySource: MOCK_HD_KEYRING_2.metadata.id, + range: { from, to: 3 }, + }); + + expect(newAccounts).toHaveLength(3); + expect(mocks.keyring.createAccounts).toHaveBeenCalledTimes(1); + expect(mocks.keyring.createAccount).not.toHaveBeenCalled(); + + for (const [index, account] of newAccounts.entries()) { + expect(isBip44Account(account)).toBe(true); + expect(account.options.entropy.groupIndex).toBe(from + index); + } + }); + }); +}); diff --git a/packages/multichain-account-service/src/providers/XlmAccountProvider.ts b/packages/multichain-account-service/src/providers/XlmAccountProvider.ts index 5fbc0356cb..55e109d5a3 100644 --- a/packages/multichain-account-service/src/providers/XlmAccountProvider.ts +++ b/packages/multichain-account-service/src/providers/XlmAccountProvider.ts @@ -37,8 +37,8 @@ export const XLM_ACCOUNT_PROVIDER_DEFAULT_CONFIG: XlmAccountProviderConfig = { backOffMs: 1000, }, createAccounts: { - batched: false, - timeoutMs: 3000, + batched: true, + timeoutMs: 10000, }, resyncAccounts: { autoRemoveExtraSnapAccounts: true,