Skip to content

Commit 9ed9bc3

Browse files
committed
feat: add discovery for solana
1 parent f7fbe26 commit 9ed9bc3

File tree

1 file changed

+44
-2
lines changed

1 file changed

+44
-2
lines changed

packages/multichain-account-service/src/providers/SolAccountProvider.ts

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
import { type Bip44Account } from '@metamask/account-api';
22
import type { EntropySourceId, KeyringAccount } from '@metamask/keyring-api';
3+
import { SolScope } from '@metamask/keyring-api';
34
import {
45
KeyringAccountEntropyTypeOption,
56
SolAccountType,
67
} from '@metamask/keyring-api';
78
import { KeyringTypes } from '@metamask/keyring-controller';
89
import type { InternalAccount } from '@metamask/keyring-internal-api';
10+
import { KeyringClient } from '@metamask/keyring-snap-client';
911
import type { SnapId } from '@metamask/snaps-sdk';
12+
import { HandlerType } from '@metamask/snaps-utils';
13+
import type { Json, JsonRpcRequest } from '@metamask/utils';
1014
import type { MultichainAccountServiceMessenger } from 'src/types';
1115

1216
import { assertAreBip44Accounts } from './BaseBip44AccountProvider';
@@ -15,8 +19,30 @@ import { SnapAccountProvider } from './SnapAccountProvider';
1519
export class SolAccountProvider extends SnapAccountProvider {
1620
static SOLANA_SNAP_ID = 'npm:@metamask/solana-wallet-snap' as SnapId;
1721

22+
readonly #client: KeyringClient;
23+
1824
constructor(messenger: MultichainAccountServiceMessenger) {
1925
super(SolAccountProvider.SOLANA_SNAP_ID, messenger);
26+
this.#client = this.#getKeyringClientFromSnapId(
27+
SolAccountProvider.SOLANA_SNAP_ID,
28+
);
29+
}
30+
31+
#getKeyringClientFromSnapId(snapId: string): KeyringClient {
32+
return new KeyringClient({
33+
send: async (request: JsonRpcRequest) => {
34+
const response = await this.messenger.call(
35+
'SnapController:handleRequest',
36+
{
37+
snapId: snapId as SnapId,
38+
origin: 'metamask',
39+
handler: HandlerType.OnKeyringRequest,
40+
request,
41+
},
42+
);
43+
return response as Promise<Json>;
44+
},
45+
});
2046
}
2147

2248
isAccountCompatible(account: Bip44Account<InternalAccount>): boolean {
@@ -60,10 +86,26 @@ export class SolAccountProvider extends SnapAccountProvider {
6086
return accounts;
6187
}
6288

63-
async discoverAndCreateAccounts(_: {
89+
async discoverAndCreateAccounts({
90+
entropySource,
91+
groupIndex,
92+
}: {
6493
entropySource: EntropySourceId;
6594
groupIndex: number;
6695
}): Promise<Bip44Account<KeyringAccount>[]> {
67-
return []; // TODO: Implement account discovery.
96+
const discoveredAccounts = await this.#client.discoverAccounts(
97+
[SolScope.Mainnet],
98+
entropySource,
99+
groupIndex,
100+
);
101+
102+
const createdAccounts = await Promise.all(
103+
discoveredAccounts.map(
104+
async (_account) =>
105+
await this.createAccounts({ entropySource, groupIndex }),
106+
),
107+
);
108+
109+
return createdAccounts.flat();
68110
}
69111
}

0 commit comments

Comments
 (0)