Skip to content

Commit b0bad50

Browse files
feat: register Bitcoin and Tron account provider wrappers
1 parent afe574e commit b0bad50

File tree

2 files changed

+114
-8
lines changed

2 files changed

+114
-8
lines changed

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

Lines changed: 88 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
import type { Messenger } from '@metamask/base-controller';
44
import { mnemonicPhraseToBytes } from '@metamask/key-tree';
55
import type { KeyringAccount } from '@metamask/keyring-api';
6-
import { EthAccountType, SolAccountType } from '@metamask/keyring-api';
6+
import { BtcAccountType, EthAccountType, SolAccountType, TrxAccountType } from '@metamask/keyring-api';
77
import { KeyringTypes, type KeyringObject } from '@metamask/keyring-controller';
88

99
import type { MultichainAccountServiceOptions } from './MultichainAccountService';
1010
import { MultichainAccountService } from './MultichainAccountService';
11-
import type { NamedAccountProvider } from './providers';
11+
import { BTC_ACCOUNT_PROVIDER_NAME, BtcAccountProvider, TRX_ACCOUNT_PROVIDER_NAME, TrxAccountProvider, type NamedAccountProvider } from './providers';
1212
import { AccountProviderWrapper } from './providers/AccountProviderWrapper';
1313
import {
1414
EVM_ACCOUNT_PROVIDER_NAME,
@@ -59,6 +59,18 @@ jest.mock('./providers/SolAccountProvider', () => {
5959
SolAccountProvider: jest.fn(),
6060
};
6161
});
62+
jest.mock('./providers/BtcAccountProvider', () => {
63+
return {
64+
...jest.requireActual('./providers/BtcAccountProvider'),
65+
BtcAccountProvider: jest.fn(),
66+
};
67+
});
68+
jest.mock('./providers/TrxAccountProvider', () => {
69+
return {
70+
...jest.requireActual('./providers/TrxAccountProvider'),
71+
TrxAccountProvider: jest.fn(),
72+
};
73+
});
6274

6375
type Mocks = {
6476
KeyringController: {
@@ -72,6 +84,8 @@ type Mocks = {
7284
};
7385
EvmAccountProvider: MockAccountProvider;
7486
SolAccountProvider: MockAccountProvider;
87+
BtcAccountProvider: MockAccountProvider;
88+
TrxAccountProvider: MockAccountProvider;
7589
};
7690

7791
function mockAccountProvider<Provider extends NamedAccountProvider>(
@@ -126,6 +140,8 @@ function setup({
126140
},
127141
EvmAccountProvider: makeMockAccountProvider(),
128142
SolAccountProvider: makeMockAccountProvider(),
143+
BtcAccountProvider: makeMockAccountProvider(),
144+
TrxAccountProvider: makeMockAccountProvider(),
129145
};
130146

131147
// Required for the `assert` on `MultichainAccountWallet.createMultichainAccountGroup`.
@@ -165,6 +181,8 @@ function setup({
165181
// force it here.
166182
EvmAccountProvider.NAME = EVM_ACCOUNT_PROVIDER_NAME;
167183
SolAccountProvider.NAME = SOL_ACCOUNT_PROVIDER_NAME;
184+
BtcAccountProvider.NAME = BTC_ACCOUNT_PROVIDER_NAME;
185+
TrxAccountProvider.NAME = TRX_ACCOUNT_PROVIDER_NAME;
168186

169187
mockAccountProvider<EvmAccountProvider>(
170188
EvmAccountProvider,
@@ -178,6 +196,18 @@ function setup({
178196
accounts,
179197
SolAccountType.DataAccount,
180198
);
199+
mockAccountProvider<BtcAccountProvider>(
200+
BtcAccountProvider,
201+
mocks.BtcAccountProvider,
202+
accounts,
203+
BtcAccountType.P2wpkh,
204+
);
205+
mockAccountProvider<TrxAccountProvider>(
206+
TrxAccountProvider,
207+
mocks.TrxAccountProvider,
208+
accounts,
209+
TrxAccountType.Eoa,
210+
);
181211
}
182212

183213
const serviceMessenger = getMultichainAccountServiceMessenger(messenger);
@@ -214,6 +244,26 @@ describe('MultichainAccountService', () => {
214244
timeoutMs: 3000,
215245
},
216246
},
247+
[BTC_ACCOUNT_PROVIDER_NAME]: {
248+
discovery: {
249+
timeoutMs: 5000,
250+
maxAttempts: 4,
251+
backOffMs: 2000,
252+
},
253+
createAccounts: {
254+
timeoutMs: 3000,
255+
},
256+
},
257+
[TRX_ACCOUNT_PROVIDER_NAME]: {
258+
discovery: {
259+
timeoutMs: 5000,
260+
maxAttempts: 4,
261+
backOffMs: 2000,
262+
},
263+
createAccounts: {
264+
timeoutMs: 3000,
265+
},
266+
},
217267
};
218268

219269
const { mocks, serviceMessenger } = setup({
@@ -229,6 +279,14 @@ describe('MultichainAccountService', () => {
229279
serviceMessenger,
230280
providerConfigs[SolAccountProvider.NAME],
231281
);
282+
expect(mocks.BtcAccountProvider.constructor).toHaveBeenCalledWith(
283+
serviceMessenger,
284+
providerConfigs[BtcAccountProvider.NAME],
285+
);
286+
expect(mocks.TrxAccountProvider.constructor).toHaveBeenCalledWith(
287+
serviceMessenger,
288+
providerConfigs[TrxAccountProvider.NAME],
289+
);
232290
});
233291

234292
it('allows optional configs for some providers', () => {
@@ -246,6 +304,26 @@ describe('MultichainAccountService', () => {
246304
timeoutMs: 3000,
247305
},
248306
},
307+
[BTC_ACCOUNT_PROVIDER_NAME]: {
308+
discovery: {
309+
timeoutMs: 5000,
310+
maxAttempts: 4,
311+
backOffMs: 2000,
312+
},
313+
createAccounts: {
314+
timeoutMs: 3000,
315+
},
316+
},
317+
[TRX_ACCOUNT_PROVIDER_NAME]: {
318+
discovery: {
319+
timeoutMs: 5000,
320+
maxAttempts: 4,
321+
backOffMs: 2000,
322+
},
323+
createAccounts: {
324+
timeoutMs: 3000,
325+
},
326+
},
249327
// No `EVM_ACCOUNT_PROVIDER_NAME`, cause it's optional in this test.
250328
};
251329

@@ -262,6 +340,14 @@ describe('MultichainAccountService', () => {
262340
serviceMessenger,
263341
providerConfigs[SolAccountProvider.NAME],
264342
);
343+
expect(mocks.BtcAccountProvider.constructor).toHaveBeenCalledWith(
344+
serviceMessenger,
345+
providerConfigs[BtcAccountProvider.NAME],
346+
);
347+
expect(mocks.TrxAccountProvider.constructor).toHaveBeenCalledWith(
348+
serviceMessenger,
349+
providerConfigs[TrxAccountProvider.NAME],
350+
);
265351
});
266352
});
267353

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

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,21 @@ import { areUint8ArraysEqual } from '@metamask/utils';
1515
import { projectLogger as log } from './logger';
1616
import type { MultichainAccountGroup } from './MultichainAccountGroup';
1717
import { MultichainAccountWallet } from './MultichainAccountWallet';
18-
import type {
19-
EvmAccountProviderConfig,
20-
NamedAccountProvider,
21-
SolAccountProviderConfig,
18+
import {
19+
BtcAccountProvider,
20+
EvmAccountProvider,
21+
SolAccountProvider,
22+
TrxAccountProvider,
23+
type BtcAccountProviderConfig,
24+
type EvmAccountProviderConfig,
25+
type NamedAccountProvider,
26+
type SolAccountProviderConfig,
27+
type TrxAccountProviderConfig,
2228
} from './providers';
2329
import {
2430
AccountProviderWrapper,
2531
isAccountProviderWrapper,
2632
} from './providers/AccountProviderWrapper';
27-
import { EvmAccountProvider } from './providers/EvmAccountProvider';
28-
import { SolAccountProvider } from './providers/SolAccountProvider';
2933
import type { MultichainAccountServiceMessenger } from './types';
3034

3135
export const serviceName = 'MultichainAccountService';
@@ -39,6 +43,8 @@ export type MultichainAccountServiceOptions = {
3943
providerConfigs?: {
4044
[EvmAccountProvider.NAME]?: EvmAccountProviderConfig;
4145
[SolAccountProvider.NAME]?: SolAccountProviderConfig;
46+
[BtcAccountProvider.NAME]?: BtcAccountProviderConfig;
47+
[TrxAccountProvider.NAME]?: TrxAccountProviderConfig
4248
};
4349
};
4450

@@ -103,6 +109,20 @@ export class MultichainAccountService {
103109
providerConfigs?.[SolAccountProvider.NAME],
104110
),
105111
),
112+
new AccountProviderWrapper(
113+
this.#messenger,
114+
new BtcAccountProvider(
115+
this.#messenger,
116+
providerConfigs?.[BtcAccountProvider.NAME],
117+
),
118+
),
119+
new AccountProviderWrapper(
120+
this.#messenger,
121+
new TrxAccountProvider(
122+
this.#messenger,
123+
providerConfigs?.[TrxAccountProvider.NAME],
124+
),
125+
),
106126
// Custom account providers that can be provided by the MetaMask client.
107127
...providers,
108128
];

0 commit comments

Comments
 (0)