From 4fab5328d0258768ff0080d9a2003a584dd9582f Mon Sep 17 00:00:00 2001 From: Florin Dzeladini Date: Thu, 2 Jul 2026 22:26:19 +0200 Subject: [PATCH 1/3] feat: auto-registre xlm account provider --- .../src/MultichainAccountService.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/multichain-account-service/src/MultichainAccountService.ts b/packages/multichain-account-service/src/MultichainAccountService.ts index c3eb45eb33..ea7a627d42 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, + XLM_ACCOUNT_PROVIDER_NAME, BTC_ACCOUNT_PROVIDER_NAME, TRX_ACCOUNT_PROVIDER_NAME, BtcAccountProvider, TrxAccountProvider, + XlmAccountProvider, } from './providers'; import { AccountProviderWrapper, @@ -83,6 +86,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; }; @@ -221,6 +225,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, ]; From 24885de412a1b548f783e0ebfc53d9a3e660f1d2 Mon Sep 17 00:00:00 2001 From: Florin Dzeladini Date: Thu, 2 Jul 2026 22:27:04 +0200 Subject: [PATCH 2/3] chore: changelog --- packages/multichain-account-service/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/multichain-account-service/CHANGELOG.md b/packages/multichain-account-service/CHANGELOG.md index 2dcadd5a5e..cbc8e8d108 100644 --- a/packages/multichain-account-service/CHANGELOG.md +++ b/packages/multichain-account-service/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Auto-register `XlmAccountProvider` in `MultichainAccountService`, matching other non-EVM ([#9380](https://github.com/MetaMask/core/pull/9380)) - Adds `MultichainAccountGroup.isProviderAligned(provider)` to check alignment per provider ([#9269](https://github.com/MetaMask/core/pull/9269)) ### Changed From eeb8179db4c1a8dceaecda15114737f3e78051e8 Mon Sep 17 00:00:00 2001 From: Florin Dzeladini Date: Thu, 2 Jul 2026 22:33:33 +0200 Subject: [PATCH 3/3] chore: update test --- .../src/MultichainAccountService.test.ts | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/multichain-account-service/src/MultichainAccountService.test.ts b/packages/multichain-account-service/src/MultichainAccountService.test.ts index a9b2dc0fd7..42650ac459 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 { Keyring } from '@metamask/keyring-api/v2'; import { KeyringType } from '@metamask/keyring-api/v2'; @@ -41,6 +42,10 @@ import { TRX_ACCOUNT_PROVIDER_NAME, TrxAccountProvider, } from './providers/TrxAccountProvider'; +import { + XLM_ACCOUNT_PROVIDER_NAME, + XlmAccountProvider, +} from './providers/XlmAccountProvider'; import type { RootMessenger, MockAccountProvider } from './tests'; import { MOCK_HARDWARE_ACCOUNT_1, @@ -94,6 +99,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 @@ -123,6 +134,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; }; function mockAccountProvider( @@ -164,6 +177,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.DataAccount, + ); } // Mirror production behavior: a provider's tracked account IDs are only @@ -221,6 +239,7 @@ async function setup({ SolAccountProvider: makeMockAccountProvider(), BtcAccountProvider: makeMockAccountProvider(), TrxAccountProvider: makeMockAccountProvider(), + XlmAccountProvider: makeMockAccountProvider(), }; // Required for the `assert` on `MultichainAccountWallet.createMultichainAccountGroup`. @@ -277,6 +296,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, @@ -306,6 +326,13 @@ async function setup({ 3, TrxAccountType.Eoa, ); + mockAccountProvider( + XlmAccountProvider, + mocks.XlmAccountProvider, + accounts, + 4, + XlmAccountType.DataAccount, + ); } const messenger = getMultichainAccountServiceMessenger(rootMessenger); @@ -1031,6 +1058,7 @@ describe('MultichainAccountService', () => { entropySource: MOCK_HD_KEYRING_1.metadata.id, }), ).toThrow('Unknown wallet, no wallet matching this entropy source'); + expect(mocks.XlmAccountProvider.deleteAccount).not.toHaveBeenCalled(); }); it('continues with remaining accounts and removes the wallet when one provider deleteAccount call throws', async () => { @@ -1217,7 +1245,7 @@ describe('MultichainAccountService', () => { }); // Turning basic functionality off disables the snap-backed provider - // wrappers (Sol/Btc/Trx). EVM is intentionally left enabled. + // wrappers (Sol/Btc/Trx/Xlm). EVM is intentionally left enabled. await service.setBasicFunctionality(false); await service.removeMultichainAccountWallet(