@metamask-previews/multichain-account-service 5.0.0-preview-cb897e9 → 5.0.0-preview-6a568504

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/MultichainAccountGroup.cjs +84 -45
  3. package/dist/MultichainAccountGroup.cjs.map +1 -1
  4. package/dist/MultichainAccountGroup.d.cts +17 -4
  5. package/dist/MultichainAccountGroup.d.cts.map +1 -1
  6. package/dist/MultichainAccountGroup.d.mts +17 -4
  7. package/dist/MultichainAccountGroup.d.mts.map +1 -1
  8. package/dist/MultichainAccountGroup.mjs +84 -45
  9. package/dist/MultichainAccountGroup.mjs.map +1 -1
  10. package/dist/MultichainAccountService.cjs +144 -113
  11. package/dist/MultichainAccountService.cjs.map +1 -1
  12. package/dist/MultichainAccountService.d.cts +48 -20
  13. package/dist/MultichainAccountService.d.cts.map +1 -1
  14. package/dist/MultichainAccountService.d.mts +48 -20
  15. package/dist/MultichainAccountService.d.mts.map +1 -1
  16. package/dist/MultichainAccountService.mjs +145 -114
  17. package/dist/MultichainAccountService.mjs.map +1 -1
  18. package/dist/MultichainAccountWallet.cjs +108 -123
  19. package/dist/MultichainAccountWallet.cjs.map +1 -1
  20. package/dist/MultichainAccountWallet.d.cts +5 -4
  21. package/dist/MultichainAccountWallet.d.cts.map +1 -1
  22. package/dist/MultichainAccountWallet.d.mts +5 -4
  23. package/dist/MultichainAccountWallet.d.mts.map +1 -1
  24. package/dist/MultichainAccountWallet.mjs +108 -123
  25. package/dist/MultichainAccountWallet.mjs.map +1 -1
  26. package/dist/providers/AccountProviderWrapper.cjs +18 -0
  27. package/dist/providers/AccountProviderWrapper.cjs.map +1 -1
  28. package/dist/providers/AccountProviderWrapper.d.cts +12 -0
  29. package/dist/providers/AccountProviderWrapper.d.cts.map +1 -1
  30. package/dist/providers/AccountProviderWrapper.d.mts +12 -0
  31. package/dist/providers/AccountProviderWrapper.d.mts.map +1 -1
  32. package/dist/providers/AccountProviderWrapper.mjs +18 -0
  33. package/dist/providers/AccountProviderWrapper.mjs.map +1 -1
  34. package/dist/providers/BaseBip44AccountProvider.cjs +45 -20
  35. package/dist/providers/BaseBip44AccountProvider.cjs.map +1 -1
  36. package/dist/providers/BaseBip44AccountProvider.d.cts +58 -6
  37. package/dist/providers/BaseBip44AccountProvider.d.cts.map +1 -1
  38. package/dist/providers/BaseBip44AccountProvider.d.mts +58 -6
  39. package/dist/providers/BaseBip44AccountProvider.d.mts.map +1 -1
  40. package/dist/providers/BaseBip44AccountProvider.mjs +45 -20
  41. package/dist/providers/BaseBip44AccountProvider.mjs.map +1 -1
  42. package/dist/providers/BtcAccountProvider.cjs +1 -0
  43. package/dist/providers/BtcAccountProvider.cjs.map +1 -1
  44. package/dist/providers/BtcAccountProvider.d.cts.map +1 -1
  45. package/dist/providers/BtcAccountProvider.d.mts.map +1 -1
  46. package/dist/providers/BtcAccountProvider.mjs +1 -0
  47. package/dist/providers/BtcAccountProvider.mjs.map +1 -1
  48. package/dist/providers/EvmAccountProvider.cjs +39 -5
  49. package/dist/providers/EvmAccountProvider.cjs.map +1 -1
  50. package/dist/providers/EvmAccountProvider.d.cts +8 -0
  51. package/dist/providers/EvmAccountProvider.d.cts.map +1 -1
  52. package/dist/providers/EvmAccountProvider.d.mts +8 -0
  53. package/dist/providers/EvmAccountProvider.d.mts.map +1 -1
  54. package/dist/providers/EvmAccountProvider.mjs +39 -5
  55. package/dist/providers/EvmAccountProvider.mjs.map +1 -1
  56. package/dist/providers/SolAccountProvider.cjs +4 -0
  57. package/dist/providers/SolAccountProvider.cjs.map +1 -1
  58. package/dist/providers/SolAccountProvider.d.cts.map +1 -1
  59. package/dist/providers/SolAccountProvider.d.mts.map +1 -1
  60. package/dist/providers/SolAccountProvider.mjs +4 -0
  61. package/dist/providers/SolAccountProvider.mjs.map +1 -1
  62. package/dist/providers/TrxAccountProvider.cjs +1 -0
  63. package/dist/providers/TrxAccountProvider.cjs.map +1 -1
  64. package/dist/providers/TrxAccountProvider.d.cts.map +1 -1
  65. package/dist/providers/TrxAccountProvider.d.mts.map +1 -1
  66. package/dist/providers/TrxAccountProvider.mjs +1 -0
  67. package/dist/providers/TrxAccountProvider.mjs.map +1 -1
  68. package/dist/tests/messenger.cjs +4 -0
  69. package/dist/tests/messenger.cjs.map +1 -1
  70. package/dist/tests/messenger.d.cts.map +1 -1
  71. package/dist/tests/messenger.d.mts.map +1 -1
  72. package/dist/tests/messenger.mjs +4 -0
  73. package/dist/tests/messenger.mjs.map +1 -1
  74. package/dist/tests/providers.cjs +62 -7
  75. package/dist/tests/providers.cjs.map +1 -1
  76. package/dist/tests/providers.d.cts +17 -3
  77. package/dist/tests/providers.d.cts.map +1 -1
  78. package/dist/tests/providers.d.mts +17 -3
  79. package/dist/tests/providers.d.mts.map +1 -1
  80. package/dist/tests/providers.mjs +60 -6
  81. package/dist/tests/providers.mjs.map +1 -1
  82. package/dist/types.cjs.map +1 -1
  83. package/dist/types.d.cts +8 -4
  84. package/dist/types.d.cts.map +1 -1
  85. package/dist/types.d.mts +8 -4
  86. package/dist/types.d.mts.map +1 -1
  87. package/dist/types.mjs.map +1 -1
  88. package/dist/utils.cjs +1 -11
  89. package/dist/utils.cjs.map +1 -1
  90. package/dist/utils.d.cts +0 -1
  91. package/dist/utils.d.cts.map +1 -1
  92. package/dist/utils.d.mts +0 -1
  93. package/dist/utils.d.mts.map +1 -1
  94. package/dist/utils.mjs +0 -9
  95. package/dist/utils.mjs.map +1 -1
  96. package/package.json +1 -1
@@ -18,10 +18,34 @@ export type MultichainAccountServiceOptions = {
18
18
  };
19
19
  config?: MultichainAccountServiceConfig;
20
20
  };
21
- /** Reverse mapping object used to map account IDs and their wallet/multichain account. */
22
- type AccountContext<Account extends Bip44Account<KeyringAccount>> = {
23
- wallet: MultichainAccountWallet<Account>;
24
- group: MultichainAccountGroup<Account>;
21
+ /**
22
+ * The keys used to identify an account in the service state.
23
+ */
24
+ export type StateKeys = {
25
+ entropySource: EntropySourceId;
26
+ groupIndex: number;
27
+ providerName: string;
28
+ };
29
+ /**
30
+ * The service state.
31
+ */
32
+ export type ServiceState = {
33
+ [entropySource: StateKeys['entropySource']]: {
34
+ [groupIndex: string]: {
35
+ [providerName: StateKeys['providerName']]: Bip44Account<KeyringAccount>['id'][];
36
+ };
37
+ };
38
+ };
39
+ export type CreateWalletParams = {
40
+ type: 'restore';
41
+ password: string;
42
+ mnemonic: Uint8Array;
43
+ } | {
44
+ type: 'import';
45
+ mnemonic: Uint8Array;
46
+ } | {
47
+ type: 'create';
48
+ password: string;
25
49
  };
26
50
  /**
27
51
  * Service to expose multichain accounts capabilities.
@@ -65,14 +89,6 @@ export declare class MultichainAccountService {
65
89
  */
66
90
  resyncAccounts(): Promise<void>;
67
91
  ensureCanUseSnapPlatform(): Promise<void>;
68
- /**
69
- * Gets the account's context which contains its multichain wallet and
70
- * multichain account group references.
71
- *
72
- * @param id - Account ID.
73
- * @returns The account context if any, undefined otherwise.
74
- */
75
- getAccountContext(id: KeyringAccount['id']): AccountContext<Bip44Account<KeyringAccount>> | undefined;
76
92
  /**
77
93
  * Gets a reference to the multichain account wallet matching this entropy source.
78
94
  *
@@ -91,19 +107,32 @@ export declare class MultichainAccountService {
91
107
  */
92
108
  getMultichainAccountWallets(): MultichainAccountWallet<Bip44Account<KeyringAccount>>[];
93
109
  /**
94
- * Creates a new multichain account wallet with the given mnemonic.
110
+ * Creates a new multichain account wallet by either importing an existing mnemonic,
111
+ * creating a new vault and keychain, or restoring a vault and keyring.
95
112
  *
96
113
  * NOTE: This method should only be called in client code where a mutex lock is acquired.
97
- * `discoverAndCreateAccounts` should be called after this method to discover and create accounts.
114
+ * `discoverAccounts` should be called after this method to discover and create accounts.
98
115
  *
99
- * @param options - Options.
100
- * @param options.mnemonic - The mnemonic to use to create the new wallet.
116
+ * @param params - The parameters to use to create the new wallet.
117
+ * @param params.mnemonic - The mnemonic to use to create the new wallet.
118
+ * @param params.password - The password to encrypt the vault with.
119
+ * @param params.type - The flow type to use to create the new wallet.
101
120
  * @throws If the mnemonic has already been imported.
102
121
  * @returns The new multichain account wallet.
103
122
  */
104
- createMultichainAccountWallet({ mnemonic, }: {
105
- mnemonic: string;
106
- }): Promise<MultichainAccountWallet<Bip44Account<KeyringAccount>>>;
123
+ createMultichainAccountWallet(params: CreateWalletParams): Promise<MultichainAccountWallet<Bip44Account<KeyringAccount>>>;
124
+ /**
125
+ * Removes a multichain account wallet.
126
+ *
127
+ * NOTE: This method should only be called in client code as a revert mechanism.
128
+ * At the point that this code is called, discovery shouldn't have been triggered.
129
+ * This is meant to be used in the scenario where a seed phrase backup is not successful.
130
+ *
131
+ * @param entropySource - The entropy source of the multichain account wallet.
132
+ * @param accountAddress - The address of the account to remove.
133
+ * @returns The removed multichain account wallet.
134
+ */
135
+ removeMultichainAccountWallet(entropySource: EntropySourceId, accountAddress: string): Promise<void>;
107
136
  /**
108
137
  * Gets a reference to the multichain account group matching this entropy source
109
138
  * and a group index.
@@ -171,5 +200,4 @@ export declare class MultichainAccountService {
171
200
  */
172
201
  alignWallet(entropySource: EntropySourceId): Promise<void>;
173
202
  }
174
- export {};
175
203
  //# sourceMappingURL=MultichainAccountService.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MultichainAccountService.d.cts","sourceRoot":"","sources":["../src/MultichainAccountService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MultichainAccountService.d.cts","sourceRoot":"","sources":["../src/MultichainAccountService.ts"],"names":[],"mappings":"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"}
@@ -18,10 +18,34 @@ export type MultichainAccountServiceOptions = {
18
18
  };
19
19
  config?: MultichainAccountServiceConfig;
20
20
  };
21
- /** Reverse mapping object used to map account IDs and their wallet/multichain account. */
22
- type AccountContext<Account extends Bip44Account<KeyringAccount>> = {
23
- wallet: MultichainAccountWallet<Account>;
24
- group: MultichainAccountGroup<Account>;
21
+ /**
22
+ * The keys used to identify an account in the service state.
23
+ */
24
+ export type StateKeys = {
25
+ entropySource: EntropySourceId;
26
+ groupIndex: number;
27
+ providerName: string;
28
+ };
29
+ /**
30
+ * The service state.
31
+ */
32
+ export type ServiceState = {
33
+ [entropySource: StateKeys['entropySource']]: {
34
+ [groupIndex: string]: {
35
+ [providerName: StateKeys['providerName']]: Bip44Account<KeyringAccount>['id'][];
36
+ };
37
+ };
38
+ };
39
+ export type CreateWalletParams = {
40
+ type: 'restore';
41
+ password: string;
42
+ mnemonic: Uint8Array;
43
+ } | {
44
+ type: 'import';
45
+ mnemonic: Uint8Array;
46
+ } | {
47
+ type: 'create';
48
+ password: string;
25
49
  };
26
50
  /**
27
51
  * Service to expose multichain accounts capabilities.
@@ -65,14 +89,6 @@ export declare class MultichainAccountService {
65
89
  */
66
90
  resyncAccounts(): Promise<void>;
67
91
  ensureCanUseSnapPlatform(): Promise<void>;
68
- /**
69
- * Gets the account's context which contains its multichain wallet and
70
- * multichain account group references.
71
- *
72
- * @param id - Account ID.
73
- * @returns The account context if any, undefined otherwise.
74
- */
75
- getAccountContext(id: KeyringAccount['id']): AccountContext<Bip44Account<KeyringAccount>> | undefined;
76
92
  /**
77
93
  * Gets a reference to the multichain account wallet matching this entropy source.
78
94
  *
@@ -91,19 +107,32 @@ export declare class MultichainAccountService {
91
107
  */
92
108
  getMultichainAccountWallets(): MultichainAccountWallet<Bip44Account<KeyringAccount>>[];
93
109
  /**
94
- * Creates a new multichain account wallet with the given mnemonic.
110
+ * Creates a new multichain account wallet by either importing an existing mnemonic,
111
+ * creating a new vault and keychain, or restoring a vault and keyring.
95
112
  *
96
113
  * NOTE: This method should only be called in client code where a mutex lock is acquired.
97
- * `discoverAndCreateAccounts` should be called after this method to discover and create accounts.
114
+ * `discoverAccounts` should be called after this method to discover and create accounts.
98
115
  *
99
- * @param options - Options.
100
- * @param options.mnemonic - The mnemonic to use to create the new wallet.
116
+ * @param params - The parameters to use to create the new wallet.
117
+ * @param params.mnemonic - The mnemonic to use to create the new wallet.
118
+ * @param params.password - The password to encrypt the vault with.
119
+ * @param params.type - The flow type to use to create the new wallet.
101
120
  * @throws If the mnemonic has already been imported.
102
121
  * @returns The new multichain account wallet.
103
122
  */
104
- createMultichainAccountWallet({ mnemonic, }: {
105
- mnemonic: string;
106
- }): Promise<MultichainAccountWallet<Bip44Account<KeyringAccount>>>;
123
+ createMultichainAccountWallet(params: CreateWalletParams): Promise<MultichainAccountWallet<Bip44Account<KeyringAccount>>>;
124
+ /**
125
+ * Removes a multichain account wallet.
126
+ *
127
+ * NOTE: This method should only be called in client code as a revert mechanism.
128
+ * At the point that this code is called, discovery shouldn't have been triggered.
129
+ * This is meant to be used in the scenario where a seed phrase backup is not successful.
130
+ *
131
+ * @param entropySource - The entropy source of the multichain account wallet.
132
+ * @param accountAddress - The address of the account to remove.
133
+ * @returns The removed multichain account wallet.
134
+ */
135
+ removeMultichainAccountWallet(entropySource: EntropySourceId, accountAddress: string): Promise<void>;
107
136
  /**
108
137
  * Gets a reference to the multichain account group matching this entropy source
109
138
  * and a group index.
@@ -171,5 +200,4 @@ export declare class MultichainAccountService {
171
200
  */
172
201
  alignWallet(entropySource: EntropySourceId): Promise<void>;
173
202
  }
174
- export {};
175
203
  //# sourceMappingURL=MultichainAccountService.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MultichainAccountService.d.mts","sourceRoot":"","sources":["../src/MultichainAccountService.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,YAAY,EACb,8BAA8B;AAG/B,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,8BAA8B;AAM7E,OAAO,KAAK,EAAE,sBAAsB,EAAE,qCAAiC;AACvE,OAAO,EAAE,uBAAuB,EAAE,sCAAkC;AACpE,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,yBAAyB,EAC1B,8BAAoB;AAOrB,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACzB,2CAAuC;AAExC,OAAO,KAAK,EACV,8BAA8B,EAC9B,iCAAiC,EAClC,oBAAgB;AAGjB,eAAO,MAAM,WAAW,6BAA6B,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,+BAA+B,GAAG;IAC5C,SAAS,EAAE,iCAAiC,CAAC;IAC7C,SAAS,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACnC,eAAe,CAAC,EAAE;QAChB,CAAC,yBAAyB,CAAC,CAAC,EAAE,wBAAwB,CAAC;QACvD,CAAC,yBAAyB,CAAC,CAAC,EAAE,wBAAwB,CAAC;KACxD,CAAC;IACF,MAAM,CAAC,EAAE,8BAA8B,CAAC;CACzC,CAAC;AAEF,0FAA0F;AAC1F,KAAK,cAAc,CAAC,OAAO,SAAS,YAAY,CAAC,cAAc,CAAC,IAAI;IAClE,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACzC,KAAK,EAAE,sBAAsB,CAAC,OAAO,CAAC,CAAC;CACxC,CAAC;AAEF;;GAEG;AACH,qBAAa,wBAAwB;;IAiBnC;;OAEG;IACH,IAAI,EAAE,OAAO,WAAW,CAAe;IAEvC;;;;;;;;;OASG;gBACS,EACV,SAAS,EACT,SAAc,EACd,eAAe,EACf,MAAM,GACP,EAAE,+BAA+B;IAuFlC;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuC3B;;;;;;;;;;;;;;OAcG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BrC,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgGzC;;;;;;OAMG;IACH,iBAAiB,CACf,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC,GACvB,cAAc,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,GAAG,SAAS;IAI3D;;;;;;;OAOG;IACH,0BAA0B,CAAC,EACzB,aAAa,GACd,EAAE;QACD,aAAa,EAAE,eAAe,CAAC;KAChC,GAAG,uBAAuB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAIzD;;;;OAIG;IACH,2BAA2B,IAAI,uBAAuB,CACpD,YAAY,CAAC,cAAc,CAAC,CAC7B,EAAE;IAIH;;;;;;;;;;OAUG;IACG,6BAA6B,CAAC,EAClC,QAAQ,GACT,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,uBAAuB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;IAwClE;;;;;;;;;OASG;IACH,yBAAyB,CAAC,EACxB,aAAa,EACb,UAAU,GACX,EAAE;QACD,aAAa,EAAE,eAAe,CAAC;QAC/B,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,sBAAsB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAWxD;;;;;;;OAOG;IACH,0BAA0B,CAAC,EACzB,aAAa,GACd,EAAE;QACD,aAAa,EAAE,eAAe,CAAC;KAChC,GAAG,sBAAsB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,EAAE;IAI1D;;;;;;OAMG;IACG,gCAAgC,CAAC,EACrC,aAAa,GACd,EAAE;QACD,aAAa,EAAE,eAAe,CAAC;KAChC,GAAG,OAAO,CAAC,sBAAsB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;IAMjE;;;;;;;OAOG;IACG,4BAA4B,CAAC,EACjC,UAAU,EACV,aAAa,GACd,EAAE;QACD,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,eAAe,CAAC;KAChC,GAAG,OAAO,CAAC,sBAAsB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;IAMjE;;;;;;;OAOG;IACG,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB5D;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IASnC;;;;OAIG;IACG,WAAW,CAAC,aAAa,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAOjE"}
1
+ {"version":3,"file":"MultichainAccountService.d.mts","sourceRoot":"","sources":["../src/MultichainAccountService.ts"],"names":[],"mappings":"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"}
@@ -9,11 +9,10 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _MultichainAccountService_instances, _MultichainAccountService_messenger, _MultichainAccountService_watcher, _MultichainAccountService_providers, _MultichainAccountService_wallets, _MultichainAccountService_accountIdToContext, _MultichainAccountService_handleOnAccountAdded, _MultichainAccountService_handleOnAccountRemoved, _MultichainAccountService_getWallet;
12
+ var _MultichainAccountService_instances, _MultichainAccountService_messenger, _MultichainAccountService_watcher, _MultichainAccountService_providers, _MultichainAccountService_wallets, _MultichainAccountService_getStateKeys, _MultichainAccountService_constructServiceState, _MultichainAccountService_getWallet, _MultichainAccountService_getPrimaryEntropySourceId, _MultichainAccountService_createWalletByImport, _MultichainAccountService_createWalletByNewVault, _MultichainAccountService_createWalletByRestore;
13
13
  import { isBip44Account, toMultichainAccountWalletId } from "@metamask/account-api";
14
- import { mnemonicPhraseToBytes } from "@metamask/key-tree";
15
14
  import { KeyringTypes } from "@metamask/keyring-controller";
16
- import { areUint8ArraysEqual } from "@metamask/utils";
15
+ import { areUint8ArraysEqual, assert } from "@metamask/utils";
17
16
  import { traceFallback } from "./analytics/index.mjs";
18
17
  import { projectLogger as log } from "./logger.mjs";
19
18
  import { MultichainAccountWallet } from "./MultichainAccountWallet.mjs";
@@ -45,14 +44,12 @@ export class MultichainAccountService {
45
44
  _MultichainAccountService_watcher.set(this, void 0);
46
45
  _MultichainAccountService_providers.set(this, void 0);
47
46
  _MultichainAccountService_wallets.set(this, void 0);
48
- _MultichainAccountService_accountIdToContext.set(this, void 0);
49
47
  /**
50
48
  * The name of the service.
51
49
  */
52
50
  this.name = serviceName;
53
51
  __classPrivateFieldSet(this, _MultichainAccountService_messenger, messenger, "f");
54
52
  __classPrivateFieldSet(this, _MultichainAccountService_wallets, new Map(), "f");
55
- __classPrivateFieldSet(this, _MultichainAccountService_accountIdToContext, new Map(), "f");
56
53
  // Pass trace callback directly to preserve original 'this' context
57
54
  // This avoids binding the callback to the MultichainAccountService instance
58
55
  const traceCallback = config?.trace ?? traceFallback;
@@ -75,9 +72,8 @@ export class MultichainAccountService {
75
72
  __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").registerActionHandler('MultichainAccountService:alignWallet', (...args) => this.alignWallet(...args));
76
73
  __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").registerActionHandler('MultichainAccountService:createMultichainAccountWallet', (...args) => this.createMultichainAccountWallet(...args));
77
74
  __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").registerActionHandler('MultichainAccountService:resyncAccounts', (...args) => this.resyncAccounts(...args));
75
+ __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").registerActionHandler('MultichainAccountService:removeMultichainAccountWallet', (...args) => this.removeMultichainAccountWallet(...args));
78
76
  __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").registerActionHandler('MultichainAccountService:ensureCanUseSnapPlatform', (...args) => this.ensureCanUseSnapPlatform(...args));
79
- __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").subscribe('AccountsController:accountAdded', (account) => __classPrivateFieldGet(this, _MultichainAccountService_instances, "m", _MultichainAccountService_handleOnAccountAdded).call(this, account));
80
- __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").subscribe('AccountsController:accountRemoved', (id) => __classPrivateFieldGet(this, _MultichainAccountService_instances, "m", _MultichainAccountService_handleOnAccountRemoved).call(this, id));
81
77
  }
82
78
  /**
83
79
  * Initialize the service and constructs the internal reprensentation of
@@ -86,32 +82,22 @@ export class MultichainAccountService {
86
82
  async init() {
87
83
  log('Initializing...');
88
84
  __classPrivateFieldGet(this, _MultichainAccountService_wallets, "f").clear();
89
- __classPrivateFieldGet(this, _MultichainAccountService_accountIdToContext, "f").clear();
90
- // Create initial wallets.
91
- const { keyrings } = __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").call('KeyringController:getState');
92
- for (const keyring of keyrings) {
93
- if (keyring.type === KeyringTypes.hd) {
94
- // Only HD keyrings have an entropy source/SRP.
95
- const entropySource = keyring.metadata.id;
96
- log(`Adding new wallet for entropy: "${entropySource}"`);
97
- // This will automatically "associate" all multichain accounts for that wallet
98
- // (based on the accounts owned by each account providers).
99
- const wallet = new MultichainAccountWallet({
100
- entropySource,
101
- providers: __classPrivateFieldGet(this, _MultichainAccountService_providers, "f"),
102
- messenger: __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f"),
103
- });
104
- __classPrivateFieldGet(this, _MultichainAccountService_wallets, "f").set(wallet.id, wallet);
105
- // Reverse mapping between account ID and their multichain wallet/account:
106
- for (const group of wallet.getMultichainAccountGroups()) {
107
- for (const account of group.getAccounts()) {
108
- __classPrivateFieldGet(this, _MultichainAccountService_accountIdToContext, "f").set(account.id, {
109
- wallet,
110
- group,
111
- });
112
- }
113
- }
114
- }
85
+ const { serviceState, providerState } = __classPrivateFieldGet(this, _MultichainAccountService_instances, "m", _MultichainAccountService_constructServiceState).call(this);
86
+ for (const provider of __classPrivateFieldGet(this, _MultichainAccountService_providers, "f")) {
87
+ const providerName = provider.getName();
88
+ // Initialize providers even if there are no accounts yet.
89
+ // Passing an empty array ensures providers start in a valid state.
90
+ const state = providerState[providerName] ?? [];
91
+ provider.init(state);
92
+ }
93
+ for (const entropySource of Object.keys(serviceState)) {
94
+ const wallet = new MultichainAccountWallet({
95
+ entropySource,
96
+ providers: __classPrivateFieldGet(this, _MultichainAccountService_providers, "f"),
97
+ messenger: __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f"),
98
+ });
99
+ wallet.init(serviceState[entropySource]);
100
+ __classPrivateFieldGet(this, _MultichainAccountService_wallets, "f").set(wallet.id, wallet);
115
101
  }
116
102
  log('Initialized');
117
103
  }
@@ -156,16 +142,6 @@ export class MultichainAccountService {
156
142
  ensureCanUseSnapPlatform() {
157
143
  return __classPrivateFieldGet(this, _MultichainAccountService_watcher, "f").ensureCanUseSnapPlatform();
158
144
  }
159
- /**
160
- * Gets the account's context which contains its multichain wallet and
161
- * multichain account group references.
162
- *
163
- * @param id - Account ID.
164
- * @returns The account context if any, undefined otherwise.
165
- */
166
- getAccountContext(id) {
167
- return __classPrivateFieldGet(this, _MultichainAccountService_accountIdToContext, "f").get(id);
168
- }
169
145
  /**
170
146
  * Gets a reference to the multichain account wallet matching this entropy source.
171
147
  *
@@ -186,39 +162,52 @@ export class MultichainAccountService {
186
162
  return Array.from(__classPrivateFieldGet(this, _MultichainAccountService_wallets, "f").values());
187
163
  }
188
164
  /**
189
- * Creates a new multichain account wallet with the given mnemonic.
165
+ * Creates a new multichain account wallet by either importing an existing mnemonic,
166
+ * creating a new vault and keychain, or restoring a vault and keyring.
190
167
  *
191
168
  * NOTE: This method should only be called in client code where a mutex lock is acquired.
192
- * `discoverAndCreateAccounts` should be called after this method to discover and create accounts.
169
+ * `discoverAccounts` should be called after this method to discover and create accounts.
193
170
  *
194
- * @param options - Options.
195
- * @param options.mnemonic - The mnemonic to use to create the new wallet.
171
+ * @param params - The parameters to use to create the new wallet.
172
+ * @param params.mnemonic - The mnemonic to use to create the new wallet.
173
+ * @param params.password - The password to encrypt the vault with.
174
+ * @param params.type - The flow type to use to create the new wallet.
196
175
  * @throws If the mnemonic has already been imported.
197
176
  * @returns The new multichain account wallet.
198
177
  */
199
- async createMultichainAccountWallet({ mnemonic, }) {
200
- const existingKeyrings = __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").call('KeyringController:getKeyringsByType', KeyringTypes.hd);
201
- const mnemonicAsBytes = mnemonicPhraseToBytes(mnemonic);
202
- const alreadyHasImportedSrp = existingKeyrings.some((keyring) => {
203
- if (!keyring.mnemonic) {
204
- return false;
205
- }
206
- return areUint8ArraysEqual(keyring.mnemonic, mnemonicAsBytes);
207
- });
208
- if (alreadyHasImportedSrp) {
209
- throw new Error('This Secret Recovery Phrase has already been imported.');
178
+ async createMultichainAccountWallet(params) {
179
+ let wallet;
180
+ if (params.type === 'import') {
181
+ wallet = await __classPrivateFieldGet(this, _MultichainAccountService_instances, "m", _MultichainAccountService_createWalletByImport).call(this, params.mnemonic);
182
+ }
183
+ else if (params.type === 'create') {
184
+ wallet = await __classPrivateFieldGet(this, _MultichainAccountService_instances, "m", _MultichainAccountService_createWalletByNewVault).call(this, params.password);
185
+ }
186
+ else if (params.type === 'restore') {
187
+ wallet = await __classPrivateFieldGet(this, _MultichainAccountService_instances, "m", _MultichainAccountService_createWalletByRestore).call(this, params.password, params.mnemonic);
210
188
  }
211
- log(`Creating new wallet...`);
212
- const result = await __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").call('KeyringController:addNewKeyring', KeyringTypes.hd, { mnemonic });
213
- const wallet = new MultichainAccountWallet({
214
- providers: __classPrivateFieldGet(this, _MultichainAccountService_providers, "f"),
215
- entropySource: result.id,
216
- messenger: __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f"),
217
- });
189
+ assert(wallet, 'Failed to create wallet.');
190
+ wallet.init({});
218
191
  __classPrivateFieldGet(this, _MultichainAccountService_wallets, "f").set(wallet.id, wallet);
219
192
  log(`Wallet created: [${wallet.id}]`);
220
193
  return wallet;
221
194
  }
195
+ /**
196
+ * Removes a multichain account wallet.
197
+ *
198
+ * NOTE: This method should only be called in client code as a revert mechanism.
199
+ * At the point that this code is called, discovery shouldn't have been triggered.
200
+ * This is meant to be used in the scenario where a seed phrase backup is not successful.
201
+ *
202
+ * @param entropySource - The entropy source of the multichain account wallet.
203
+ * @param accountAddress - The address of the account to remove.
204
+ * @returns The removed multichain account wallet.
205
+ */
206
+ async removeMultichainAccountWallet(entropySource, accountAddress) {
207
+ const wallet = __classPrivateFieldGet(this, _MultichainAccountService_instances, "m", _MultichainAccountService_getWallet).call(this, entropySource);
208
+ await __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").call('KeyringController:removeAccount', accountAddress);
209
+ __classPrivateFieldGet(this, _MultichainAccountService_wallets, "f").delete(wallet.id);
210
+ }
222
211
  /**
223
212
  * Gets a reference to the multichain account group matching this entropy source
224
213
  * and a group index.
@@ -312,64 +301,106 @@ export class MultichainAccountService {
312
301
  log(`Wallet [${wallet.id}] aligned`);
313
302
  }
314
303
  }
315
- _MultichainAccountService_messenger = new WeakMap(), _MultichainAccountService_watcher = new WeakMap(), _MultichainAccountService_providers = new WeakMap(), _MultichainAccountService_wallets = new WeakMap(), _MultichainAccountService_accountIdToContext = new WeakMap(), _MultichainAccountService_instances = new WeakSet(), _MultichainAccountService_handleOnAccountAdded = function _MultichainAccountService_handleOnAccountAdded(account) {
316
- // We completely omit non-BIP-44 accounts!
317
- if (!isBip44Account(account)) {
318
- return;
319
- }
320
- let sync = true;
321
- let wallet = __classPrivateFieldGet(this, _MultichainAccountService_wallets, "f").get(toMultichainAccountWalletId(account.options.entropy.id));
322
- if (!wallet) {
323
- log(`Adding new wallet for entropy: "${account.options.entropy.id}" (for account: "${account.id}")`);
324
- // That's a new wallet.
325
- wallet = new MultichainAccountWallet({
326
- entropySource: account.options.entropy.id,
327
- providers: __classPrivateFieldGet(this, _MultichainAccountService_providers, "f"),
328
- messenger: __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f"),
329
- });
330
- __classPrivateFieldGet(this, _MultichainAccountService_wallets, "f").set(wallet.id, wallet);
331
- // If that's a new wallet wallet. There's nothing to "force-sync".
332
- sync = false;
333
- }
334
- let group = wallet.getMultichainAccountGroup(account.options.entropy.groupIndex);
335
- if (!group) {
336
- // This new account is a new multichain account, let the wallet know
337
- // it has to re-sync with its providers.
338
- if (sync) {
339
- wallet.sync();
304
+ _MultichainAccountService_messenger = new WeakMap(), _MultichainAccountService_watcher = new WeakMap(), _MultichainAccountService_providers = new WeakMap(), _MultichainAccountService_wallets = new WeakMap(), _MultichainAccountService_instances = new WeakSet(), _MultichainAccountService_getStateKeys = function _MultichainAccountService_getStateKeys(account) {
305
+ for (const provider of __classPrivateFieldGet(this, _MultichainAccountService_providers, "f")) {
306
+ if (isBip44Account(account) && provider.isAccountCompatible(account)) {
307
+ return {
308
+ entropySource: account.options.entropy.id,
309
+ groupIndex: account.options.entropy.groupIndex,
310
+ providerName: provider.getName(),
311
+ };
340
312
  }
341
- group = wallet.getMultichainAccountGroup(account.options.entropy.groupIndex);
342
- // If that's a new multichain account. There's nothing to "force-sync".
343
- sync = false;
344
313
  }
345
- // We have to check against `undefined` in case `getMultichainAccount` is
346
- // not able to find this multichain account (which should not be possible...)
347
- if (group) {
348
- if (sync) {
349
- group.sync();
314
+ return null;
315
+ }, _MultichainAccountService_constructServiceState = function _MultichainAccountService_constructServiceState() {
316
+ var _a, _b;
317
+ const accounts = __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").call('AccountsController:listMultichainAccounts');
318
+ const serviceState = {};
319
+ const providerState = {};
320
+ for (const account of accounts) {
321
+ const keys = __classPrivateFieldGet(this, _MultichainAccountService_instances, "m", _MultichainAccountService_getStateKeys).call(this, account);
322
+ if (keys) {
323
+ const { entropySource, groupIndex, providerName } = keys;
324
+ serviceState[entropySource] ?? (serviceState[entropySource] = {});
325
+ (_a = serviceState[entropySource])[groupIndex] ?? (_a[groupIndex] = {});
326
+ (_b = serviceState[entropySource][groupIndex])[providerName] ?? (_b[providerName] = []);
327
+ serviceState[entropySource][groupIndex][providerName].push(account.id);
328
+ providerState[providerName] ?? (providerState[providerName] = []);
329
+ providerState[providerName].push(account.id);
350
330
  }
351
- // Same here, this account should have been already grouped in that
352
- // multichain account.
353
- __classPrivateFieldGet(this, _MultichainAccountService_accountIdToContext, "f").set(account.id, {
354
- wallet,
355
- group,
356
- });
357
331
  }
358
- }, _MultichainAccountService_handleOnAccountRemoved = function _MultichainAccountService_handleOnAccountRemoved(id) {
359
- // Force sync of the appropriate wallet if an account got removed.
360
- const found = __classPrivateFieldGet(this, _MultichainAccountService_accountIdToContext, "f").get(id);
361
- if (found) {
362
- const { wallet } = found;
363
- log(`Re-synchronize wallet [${wallet.id}] since account "${id}" got removed`);
364
- wallet.sync();
365
- }
366
- // Safe to call delete even if the `id` was not referencing a BIP-44 account.
367
- __classPrivateFieldGet(this, _MultichainAccountService_accountIdToContext, "f").delete(id);
332
+ return { serviceState, providerState };
368
333
  }, _MultichainAccountService_getWallet = function _MultichainAccountService_getWallet(entropySource) {
369
334
  const wallet = __classPrivateFieldGet(this, _MultichainAccountService_wallets, "f").get(toMultichainAccountWalletId(entropySource));
370
335
  if (!wallet) {
371
336
  throw new Error('Unknown wallet, no wallet matching this entropy source');
372
337
  }
373
338
  return wallet;
339
+ }, _MultichainAccountService_getPrimaryEntropySourceId = function _MultichainAccountService_getPrimaryEntropySourceId() {
340
+ const { keyrings } = __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").call('KeyringController:getState');
341
+ const primaryKeyring = keyrings.find((keyring) => keyring.type === 'HD Key Tree');
342
+ assert(primaryKeyring, 'Primary keyring not found');
343
+ return primaryKeyring.metadata.id;
344
+ }, _MultichainAccountService_createWalletByImport =
345
+ /**
346
+ * Creates a new multichain account wallet by importing an existing mnemonic.
347
+ *
348
+ * @param mnemonic - The mnemonic to use to create the new wallet.
349
+ * @returns The new multichain account wallet.
350
+ */
351
+ async function _MultichainAccountService_createWalletByImport(mnemonic) {
352
+ log(`Creating new wallet by importing an existing mnemonic...`);
353
+ const existingKeyrings = __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").call('KeyringController:getKeyringsByType', KeyringTypes.hd);
354
+ const alreadyHasImportedSrp = existingKeyrings.some((keyring) => {
355
+ if (!keyring.mnemonic) {
356
+ return false;
357
+ }
358
+ return areUint8ArraysEqual(keyring.mnemonic, mnemonic);
359
+ });
360
+ if (alreadyHasImportedSrp) {
361
+ throw new Error('This Secret Recovery Phrase has already been imported.');
362
+ }
363
+ const result = await __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").call('KeyringController:addNewKeyring', KeyringTypes.hd, { mnemonic });
364
+ // The wallet is ripe for discovery
365
+ return new MultichainAccountWallet({
366
+ providers: __classPrivateFieldGet(this, _MultichainAccountService_providers, "f"),
367
+ entropySource: result.id,
368
+ messenger: __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f"),
369
+ });
370
+ }, _MultichainAccountService_createWalletByNewVault =
371
+ /**
372
+ * Creates a new multichain account wallet by creating a new vault and keychain.
373
+ *
374
+ * @param password - The password to encrypt the vault with.
375
+ * @returns The new multichain account wallet.
376
+ */
377
+ async function _MultichainAccountService_createWalletByNewVault(password) {
378
+ log(`Creating new wallet by creating a new vault and keychain...`);
379
+ await __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").call('KeyringController:createNewVaultAndKeychain', password);
380
+ const entropySourceId = __classPrivateFieldGet(this, _MultichainAccountService_instances, "m", _MultichainAccountService_getPrimaryEntropySourceId).call(this);
381
+ // The wallet is ripe for discovery
382
+ return new MultichainAccountWallet({
383
+ providers: __classPrivateFieldGet(this, _MultichainAccountService_providers, "f"),
384
+ entropySource: entropySourceId,
385
+ messenger: __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f"),
386
+ });
387
+ }, _MultichainAccountService_createWalletByRestore =
388
+ /**
389
+ * Creates a new multichain account wallet by restoring a vault and keyring.
390
+ *
391
+ * @param password - The password to encrypt the vault with.
392
+ * @param mnemonic - The mnemonic to use to restore the new wallet.
393
+ * @returns The new multichain account wallet.
394
+ */
395
+ async function _MultichainAccountService_createWalletByRestore(password, mnemonic) {
396
+ log(`Creating new wallet by restoring vault and keyring...`);
397
+ await __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").call('KeyringController:createNewVaultAndRestore', password, mnemonic);
398
+ const entropySourceId = __classPrivateFieldGet(this, _MultichainAccountService_instances, "m", _MultichainAccountService_getPrimaryEntropySourceId).call(this);
399
+ // The wallet is ripe for discovery
400
+ return new MultichainAccountWallet({
401
+ providers: __classPrivateFieldGet(this, _MultichainAccountService_providers, "f"),
402
+ entropySource: entropySourceId,
403
+ messenger: __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f"),
404
+ });
374
405
  };
375
406
  //# sourceMappingURL=MultichainAccountService.mjs.map