Skip to content

Commit bd7766e

Browse files
committed
feat(multichain-account-service): register XlmAccountProvider and accept providerConfigs[XLM_ACCOUNT_PROVIDER_NAME]
1 parent 8f1db4f commit bd7766e

5 files changed

Lines changed: 74 additions & 1 deletion

File tree

‎oxlint-suppressions.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3836,7 +3836,7 @@
38363836
},
38373837
"packages/multichain-account-service/src/MultichainAccountService.test.ts": {
38383838
"typescript/no-unsafe-return": {
3839-
"count": 5
3839+
"count": 6
38403840
},
38413841
"typescript/unbound-method": {
38423842
"count": 1

‎packages/multichain-account-service/CHANGELOG.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Added
11+
12+
- Register `XlmAccountProvider` in `MultichainAccountService` built-in providers and accept `providerConfigs[XLM_ACCOUNT_PROVIDER_NAME]` ([#10867](https://github.com/MetaMask/core/pull/10867))
13+
1014
### Changed
1115

1216
- Bump `lodash-es` from `^4.17.21` to `^4.18.1` ([#10447](https://github.com/MetaMask/core/pull/10447))

‎packages/multichain-account-service/src/MultichainAccountService.test.ts‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
EthAccountType,
1111
SolAccountType,
1212
TrxAccountType,
13+
XlmAccountType,
1314
} from '@metamask/keyring-api';
1415
import type { Keyring } from '@metamask/keyring-api/v2';
1516
import { KeyringType } from '@metamask/keyring-api/v2';
@@ -41,6 +42,10 @@ import {
4142
TRX_ACCOUNT_PROVIDER_NAME,
4243
TrxAccountProvider,
4344
} from './providers/TrxAccountProvider.js';
45+
import {
46+
XLM_ACCOUNT_PROVIDER_NAME,
47+
XlmAccountProvider,
48+
} from './providers/XlmAccountProvider.js';
4449
import type { RootMessenger, MockAccountProvider } from './tests/index.js';
4550
import {
4651
MOCK_HARDWARE_ACCOUNT_1,
@@ -94,6 +99,12 @@ jest.mock('./providers/TrxAccountProvider', () => {
9499
TrxAccountProvider: jest.fn(),
95100
};
96101
});
102+
jest.mock('./providers/XlmAccountProvider', () => {
103+
return {
104+
...jest.requireActual('./providers/XlmAccountProvider'),
105+
XlmAccountProvider: jest.fn(),
106+
};
107+
});
97108

98109
type Mocks = {
99110
// eslint-disable-next-line @typescript-eslint/naming-convention
@@ -123,6 +134,8 @@ type Mocks = {
123134
BtcAccountProvider: MockAccountProvider;
124135
// eslint-disable-next-line @typescript-eslint/naming-convention
125136
TrxAccountProvider: MockAccountProvider;
137+
// eslint-disable-next-line @typescript-eslint/naming-convention
138+
XlmAccountProvider: MockAccountProvider;
126139
};
127140

128141
function mockAccountProvider<Provider extends Bip44AccountProvider>(
@@ -164,6 +177,11 @@ function mockAccountProvider<Provider extends Bip44AccountProvider>(
164177
mocks.isAccountCompatible?.mockImplementation(
165178
(account: KeyringAccount) => account.type === TrxAccountType.Eoa,
166179
);
180+
} else if (providerClass === (XlmAccountProvider as unknown)) {
181+
mocks.getName.mockReturnValue(XLM_ACCOUNT_PROVIDER_NAME);
182+
mocks.isAccountCompatible?.mockImplementation(
183+
(account: KeyringAccount) => account.type === XlmAccountType.Account,
184+
);
167185
}
168186

169187
// Mirror production behavior: a provider's tracked account IDs are only
@@ -221,6 +239,7 @@ async function setup({
221239
SolAccountProvider: makeMockAccountProvider(),
222240
BtcAccountProvider: makeMockAccountProvider(),
223241
TrxAccountProvider: makeMockAccountProvider(),
242+
XlmAccountProvider: makeMockAccountProvider(),
224243
};
225244

226245
// Required for the `assert` on `MultichainAccountWallet.createMultichainAccountGroup`.
@@ -277,6 +296,7 @@ async function setup({
277296
SolAccountProvider.NAME = SOL_ACCOUNT_PROVIDER_NAME;
278297
BtcAccountProvider.NAME = BTC_ACCOUNT_PROVIDER_NAME;
279298
TrxAccountProvider.NAME = TRX_ACCOUNT_PROVIDER_NAME;
299+
XlmAccountProvider.NAME = XLM_ACCOUNT_PROVIDER_NAME;
280300

281301
mockAccountProvider<EvmAccountProvider>(
282302
EvmAccountProvider,
@@ -306,6 +326,13 @@ async function setup({
306326
3,
307327
TrxAccountType.Eoa,
308328
);
329+
mockAccountProvider<XlmAccountProvider>(
330+
XlmAccountProvider,
331+
mocks.XlmAccountProvider,
332+
accounts,
333+
4,
334+
XlmAccountType.Account,
335+
);
309336
}
310337

311338
const messenger = getMultichainAccountServiceMessenger(rootMessenger);
@@ -351,6 +378,17 @@ describe('MultichainAccountService', () => {
351378
timeoutMs: 3000,
352379
},
353380
},
381+
[XLM_ACCOUNT_PROVIDER_NAME]: {
382+
maxConcurrency: 1,
383+
discovery: {
384+
timeoutMs: 2000,
385+
maxAttempts: 3,
386+
backOffMs: 1000,
387+
},
388+
createAccounts: {
389+
timeoutMs: 3000,
390+
},
391+
},
354392
};
355393

356394
const { mocks, messenger } = await setup({
@@ -368,6 +406,11 @@ describe('MultichainAccountService', () => {
368406
providerConfigs?.[SOL_ACCOUNT_PROVIDER_NAME],
369407
expect.any(Function), // TraceCallback
370408
);
409+
expect(mocks.XlmAccountProvider.constructor).toHaveBeenCalledWith(
410+
messenger,
411+
providerConfigs?.[XLM_ACCOUNT_PROVIDER_NAME],
412+
expect.any(Function), // TraceCallback
413+
);
371414
});
372415

373416
it('passes traceFallback to providers when no config.trace is provided and perf is disabled', async () => {
@@ -1051,6 +1094,7 @@ describe('MultichainAccountService', () => {
10511094
// Providers that own no accounts for this wallet should be left alone.
10521095
expect(mocks.BtcAccountProvider.deleteAccounts).not.toHaveBeenCalled();
10531096
expect(mocks.TrxAccountProvider.deleteAccounts).not.toHaveBeenCalled();
1097+
expect(mocks.XlmAccountProvider.deleteAccounts).not.toHaveBeenCalled();
10541098
expect(() =>
10551099
service.getMultichainAccountWallet({
10561100
entropySource: MOCK_HD_KEYRING_1.metadata.id,

‎packages/multichain-account-service/src/MultichainAccountService.ts‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,13 @@ import {
3030
EVM_ACCOUNT_PROVIDER_NAME,
3131
BtcAccountProviderConfig,
3232
TrxAccountProviderConfig,
33+
XlmAccountProviderConfig,
3334
BTC_ACCOUNT_PROVIDER_NAME,
3435
TRX_ACCOUNT_PROVIDER_NAME,
36+
XLM_ACCOUNT_PROVIDER_NAME,
3537
BtcAccountProvider,
3638
TrxAccountProvider,
39+
XlmAccountProvider,
3740
} from './providers/index.js';
3841
import { SolAccountProvider } from './providers/SolAccountProvider.js';
3942
import {
@@ -67,6 +70,7 @@ export type MultichainAccountServiceOptions = {
6770
[SOL_ACCOUNT_PROVIDER_NAME]?: SolAccountProviderConfig;
6871
[BTC_ACCOUNT_PROVIDER_NAME]?: BtcAccountProviderConfig;
6972
[TRX_ACCOUNT_PROVIDER_NAME]?: TrxAccountProviderConfig;
73+
[XLM_ACCOUNT_PROVIDER_NAME]?: XlmAccountProviderConfig;
7074
};
7175
config?: MultichainAccountServiceConfig;
7276
};
@@ -207,6 +211,14 @@ export class MultichainAccountService {
207211
trace,
208212
),
209213
),
214+
new AccountProviderWrapper(
215+
this.#messenger,
216+
new XlmAccountProvider(
217+
this.#messenger,
218+
providerConfigs?.[XLM_ACCOUNT_PROVIDER_NAME],
219+
trace,
220+
),
221+
),
210222
// Custom account providers that can be provided by the MetaMask client.
211223
...providers,
212224
];

‎packages/multichain-account-service/src/providers/SnapAccountProvider.test.ts‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import {
4141
import { SolAccountProvider } from './SolAccountProvider.js';
4242
import { TrxAccountProvider } from './TrxAccountProvider.js';
4343
import { TimeoutError } from './utils.js';
44+
import { XlmAccountProvider } from './XlmAccountProvider.js';
4445

4546
jest.mock('../analytics', () => {
4647
const actual = jest.requireActual('../analytics');
@@ -370,6 +371,18 @@ describe('SnapAccountProvider', () => {
370371
expect(isSnapAccountProvider(trxProvider)).toBe(true);
371372
});
372373

374+
it('creates XlmAccountProvider with default trace', () => {
375+
const { messenger } = setup();
376+
377+
const xlmProvider = new XlmAccountProvider(
378+
getMultichainAccountServiceMessenger(messenger),
379+
);
380+
381+
expect(xlmProvider).toBeDefined();
382+
expect(isSnapAccountProvider(xlmProvider)).toBe(true);
383+
expect(xlmProvider.snapId).toBe(XlmAccountProvider.XLM_SNAP_ID);
384+
});
385+
373386
it('creates provider without trace parameter', () => {
374387
const { messenger } = setup();
375388

0 commit comments

Comments
 (0)