@metamask-previews/account-tree-controller 7.6.1-preview-58a4a8b71 → 7.6.1-preview-4c8a5dfcb

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 (70) hide show
  1. package/CHANGELOG.md +1 -5
  2. package/dist/AccountTreeController-method-action-types.cjs.map +1 -1
  3. package/dist/AccountTreeController-method-action-types.d.cts +1 -34
  4. package/dist/AccountTreeController-method-action-types.d.cts.map +1 -1
  5. package/dist/AccountTreeController-method-action-types.d.mts +1 -34
  6. package/dist/AccountTreeController-method-action-types.d.mts.map +1 -1
  7. package/dist/AccountTreeController-method-action-types.mjs.map +1 -1
  8. package/dist/AccountTreeController.cjs +0 -42
  9. package/dist/AccountTreeController.cjs.map +1 -1
  10. package/dist/AccountTreeController.d.cts +0 -29
  11. package/dist/AccountTreeController.d.cts.map +1 -1
  12. package/dist/AccountTreeController.d.mts +0 -29
  13. package/dist/AccountTreeController.d.mts.map +1 -1
  14. package/dist/AccountTreeController.mjs +0 -42
  15. package/dist/AccountTreeController.mjs.map +1 -1
  16. package/dist/index.cjs +1 -10
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +1 -6
  19. package/dist/index.d.cts.map +1 -1
  20. package/dist/index.d.mts +1 -6
  21. package/dist/index.d.mts.map +1 -1
  22. package/dist/index.mjs +0 -3
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/types.cjs.map +1 -1
  25. package/dist/types.d.cts +3 -3
  26. package/dist/types.d.cts.map +1 -1
  27. package/dist/types.d.mts +3 -3
  28. package/dist/types.d.mts.map +1 -1
  29. package/dist/types.mjs.map +1 -1
  30. package/package.json +1 -3
  31. package/dist/state/export.cjs +0 -210
  32. package/dist/state/export.cjs.map +0 -1
  33. package/dist/state/export.d.cts +0 -40
  34. package/dist/state/export.d.cts.map +0 -1
  35. package/dist/state/export.d.mts +0 -40
  36. package/dist/state/export.d.mts.map +0 -1
  37. package/dist/state/export.mjs +0 -204
  38. package/dist/state/export.mjs.map +0 -1
  39. package/dist/state/id-map.cjs +0 -59
  40. package/dist/state/id-map.cjs.map +0 -1
  41. package/dist/state/id-map.d.cts +0 -41
  42. package/dist/state/id-map.d.cts.map +0 -1
  43. package/dist/state/id-map.d.mts +0 -41
  44. package/dist/state/id-map.d.mts.map +0 -1
  45. package/dist/state/id-map.mjs +0 -55
  46. package/dist/state/id-map.mjs.map +0 -1
  47. package/dist/state/import.cjs +0 -233
  48. package/dist/state/import.cjs.map +0 -1
  49. package/dist/state/import.d.cts +0 -29
  50. package/dist/state/import.d.cts.map +0 -1
  51. package/dist/state/import.d.mts +0 -29
  52. package/dist/state/import.d.mts.map +0 -1
  53. package/dist/state/import.mjs +0 -229
  54. package/dist/state/import.mjs.map +0 -1
  55. package/dist/state/payload.cjs +0 -159
  56. package/dist/state/payload.cjs.map +0 -1
  57. package/dist/state/payload.d.cts +0 -287
  58. package/dist/state/payload.d.cts.map +0 -1
  59. package/dist/state/payload.d.mts +0 -287
  60. package/dist/state/payload.d.mts.map +0 -1
  61. package/dist/state/payload.mjs +0 -152
  62. package/dist/state/payload.mjs.map +0 -1
  63. package/dist/state/snapshot.cjs +0 -203
  64. package/dist/state/snapshot.cjs.map +0 -1
  65. package/dist/state/snapshot.d.cts +0 -111
  66. package/dist/state/snapshot.d.cts.map +0 -1
  67. package/dist/state/snapshot.d.mts +0 -111
  68. package/dist/state/snapshot.d.mts.map +0 -1
  69. package/dist/state/snapshot.mjs +0 -199
  70. package/dist/state/snapshot.mjs.map +0 -1
@@ -1,204 +0,0 @@
1
- import { AccountWalletType } from "@metamask/account-api";
2
- import { HdKeyring } from "@metamask/eth-hd-keyring/v2";
3
- import { EthAccountType } from "@metamask/keyring-api";
4
- import { KeyringTypes } from "@metamask/keyring-controller";
5
- import { encodeMnemonicWords } from "@metamask/keyring-sdk";
6
- import { IdMap } from "./id-map.mjs";
7
- import { AccountTreeSnapshot } from "./snapshot.mjs";
8
- /**
9
- * Returns `true` if `wallet` is an HD entropy wallet ({@link AccountWalletEntropyObject}).
10
- *
11
- * @param wallet - The wallet object to test.
12
- * @returns Type predicate narrowing to {@link AccountWalletEntropyObject}.
13
- */
14
- export function isMnemonicWalletObject(wallet) {
15
- return wallet.type === AccountWalletType.Entropy;
16
- }
17
- /**
18
- * Returns `true` if `wallet` is an imported private-key wallet
19
- * ({@link AccountWalletKeyringObject} with keyring type {@link KeyringTypes.simple}).
20
- *
21
- * @param wallet - The wallet object to test.
22
- * @returns Type predicate narrowing to {@link AccountWalletKeyringObject}.
23
- */
24
- export function isPrivateKeyWalletObject(wallet) {
25
- return (wallet.type === AccountWalletType.Keyring &&
26
- wallet.metadata.keyring.type === KeyringTypes.simple);
27
- }
28
- /**
29
- * Exports a single entropy (HD) wallet object as an {@link AccountWalletMnemonicPayload}.
30
- *
31
- * Calls `KeyringController:withKeyringV2Unsafe` to derive the stable entropy source ID
32
- * via {@link HdKeyring.toEntropySourceId} and, when `includeSecrets` is `true`, to read
33
- * the raw mnemonic bytes.
34
- *
35
- * @param context - Export context.
36
- * @param walletObj - The local entropy wallet to export.
37
- * @param includeSecrets - When `true`, the BIP-39 mnemonic is included in the payload.
38
- * @param idMap - ID map to populate with local↔payload ID pairs for this wallet and its groups.
39
- * @returns The mnemonic wallet payload entry.
40
- * @throws If `includeSecrets` is `true` but the mnemonic cannot be read from the keyring.
41
- */
42
- async function exportMnemonicWalletObject(context, walletObj, includeSecrets, idMap) {
43
- const result = await context.messenger.call('KeyringController:withKeyringV2Unsafe',
44
- // The local wallet entropy ID is the keyring ID.
45
- { id: walletObj.metadata.entropy.id }, async ({ keyring }) => {
46
- const hdKeyring = keyring;
47
- const includeMnemonic = includeSecrets &&
48
- hdKeyring.mnemonic !== null &&
49
- hdKeyring.mnemonic !== undefined;
50
- return {
51
- // Compute the stable entropy source ID from the keyring's mnemonic (BIP-39 seed).
52
- entropySourceId: await hdKeyring.toEntropySourceId(),
53
- // No need to include the mnemonic here if we're not exporting secrets.
54
- mnemonic: includeMnemonic ? hdKeyring.mnemonic : undefined,
55
- };
56
- });
57
- const { entropySourceId, mnemonic } = result;
58
- // We use the stable entropy source ID as the payload wallet ID, rather than the local wallet ID, to
59
- // ensure that the exported snapshot is stable across different installations and sessions.
60
- const wallet = {
61
- type: 'mnemonic',
62
- id: `wallet:${entropySourceId}`,
63
- metadata: { name: walletObj.metadata.name },
64
- groups: [],
65
- };
66
- idMap.add(walletObj.id, wallet.id);
67
- for (const groupObj of Object.values(walletObj.groups)) {
68
- const { groupIndex } = groupObj.metadata.entropy;
69
- const group = {
70
- id: `${wallet.id}/${groupIndex}`,
71
- groupIndex,
72
- metadata: {
73
- name: groupObj.metadata.name,
74
- pinned: groupObj.metadata.pinned,
75
- hidden: groupObj.metadata.hidden,
76
- },
77
- };
78
- idMap.add(groupObj.id, group.id);
79
- wallet.groups.push(group);
80
- }
81
- // This should never happen, but we check just in case.
82
- if (includeSecrets) {
83
- if (mnemonic === undefined) {
84
- throw new Error(`Failed to export mnemonic for wallet ${wallet.id}`);
85
- }
86
- wallet.value = encodeMnemonicWords(mnemonic);
87
- }
88
- return wallet;
89
- }
90
- /**
91
- * Exports a single simple-keyring wallet object as an {@link AccountWalletPrivateKeyPayload}.
92
- *
93
- * All groups from the wallet are merged into the `'private-key'` singleton payload entry.
94
- * When `includeSecrets` is `true`, each group's private key is exported via
95
- * `KeyringController:withKeyringV2`.
96
- *
97
- * @param context - Export context.
98
- * @param walletObj - The local simple-keyring wallet to export.
99
- * @param includeSecrets - When `true`, private keys are included in the payload.
100
- * @param idMap - ID map to populate with local↔payload ID pairs for this wallet and its groups.
101
- * @returns The private-key wallet payload entry.
102
- * @throws If `includeSecrets` is `true` but a private key cannot be exported for an account.
103
- */
104
- async function exportPrivateKeyWalletObject(context, walletObj, includeSecrets, idMap) {
105
- // We use a singleton wallet ID for private keys.
106
- const wallet = {
107
- type: 'private-key',
108
- id: `wallet:private-key`,
109
- metadata: { name: walletObj.metadata.name },
110
- groups: [],
111
- };
112
- idMap.add(walletObj.id, wallet.id);
113
- for (const groupObj of Object.values(walletObj.groups)) {
114
- const accountId = groupObj.accounts[0];
115
- if (!accountId) {
116
- continue;
117
- }
118
- const account = context.messenger.call('AccountsController:getAccount', accountId);
119
- if (!account) {
120
- continue;
121
- }
122
- const { address } = account;
123
- let exported;
124
- if (includeSecrets) {
125
- const result = await context.messenger.call('KeyringController:withKeyringV2', { address }, async ({ keyring }) => {
126
- if (!keyring.exportAccount) {
127
- throw new Error(`Keyring for account ${accountId} does not support exportAccount`);
128
- }
129
- return keyring.exportAccount(accountId, {
130
- type: 'private-key',
131
- encoding: 'hexadecimal',
132
- });
133
- });
134
- exported = result;
135
- }
136
- const group = {
137
- id: `${wallet.id}/${address}`,
138
- metadata: {
139
- name: groupObj.metadata.name,
140
- pinned: groupObj.metadata.pinned,
141
- hidden: groupObj.metadata.hidden,
142
- },
143
- };
144
- if (includeSecrets) {
145
- if (!exported) {
146
- throw new Error(`Failed to export private key for account ${accountId}`);
147
- }
148
- group.value = {
149
- privateKey: exported.privateKey,
150
- encoding: exported.encoding,
151
- type: EthAccountType.Eoa,
152
- };
153
- }
154
- idMap.add(groupObj.id, group.id);
155
- wallet.groups.push(group);
156
- }
157
- return wallet;
158
- }
159
- /**
160
- * Builds an {@link AccountTreeSnapshot} from the current controller state.
161
- *
162
- * Iterates over all wallets in the tree:
163
- * - {@link AccountWalletType.Entropy} (HD) wallets -> `'mnemonic'` payload entries.
164
- * - {@link AccountWalletType.Keyring} wallets of type `simple` -> `'private-key'` payload entries.
165
- * - Snap wallets and hardware keyrings are skipped in v1.
166
- *
167
- * @param context - Export context providing state and messenger access.
168
- * @param options - Export options.
169
- * @returns A promise that resolves to the built snapshot.
170
- * @throws If `options.includeSecrets` is `true` and the vault is locked.
171
- */
172
- export async function exportState(context, options = {}) {
173
- const state = context.getState();
174
- const includeSecrets = options.includeSecrets ?? false;
175
- const { isUnlocked } = context.messenger.call('KeyringController:getState');
176
- if (includeSecrets && !isUnlocked) {
177
- throw new Error('Cannot include secrets in export when vault is locked');
178
- }
179
- const idMap = new IdMap();
180
- const entries = [];
181
- let privateKeyWallet;
182
- for (const walletObj of Object.values(state.accountTree.wallets)) {
183
- if (isMnemonicWalletObject(walletObj)) {
184
- entries.push(await exportMnemonicWalletObject(context, walletObj, includeSecrets, idMap));
185
- }
186
- else if (isPrivateKeyWalletObject(walletObj)) {
187
- const exported = await exportPrivateKeyWalletObject(context, walletObj, includeSecrets, idMap);
188
- if (privateKeyWallet) {
189
- privateKeyWallet.groups.push(...exported.groups);
190
- }
191
- else {
192
- privateKeyWallet = exported;
193
- }
194
- }
195
- else {
196
- // AccountWalletType.Snap and hardware keyrings: skipped for now.
197
- }
198
- }
199
- if (privateKeyWallet) {
200
- entries.push(privateKeyWallet);
201
- }
202
- return new AccountTreeSnapshot(entries, idMap);
203
- }
204
- //# sourceMappingURL=export.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"export.mjs","sourceRoot":"","sources":["../../src/state/export.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccountWalletType } from '@metamask/account-api';\nimport { HdKeyring } from '@metamask/eth-hd-keyring/v2';\nimport { EthAccountType } from '@metamask/keyring-api';\nimport { PrivateKeyExportedAccount } from '@metamask/keyring-api/v2';\nimport { KeyringTypes } from '@metamask/keyring-controller';\nimport { encodeMnemonicWords } from '@metamask/keyring-sdk';\n\nimport type {\n AccountTreeControllerMessenger,\n AccountTreeControllerState,\n} from '../types.js';\nimport type { AccountWalletObject } from '../wallet.js';\nimport {\n AccountWalletEntropyObject,\n AccountWalletKeyringObject,\n} from '../wallet.js';\nimport { IdMap } from './id-map.js';\nimport type {\n AccountTreeWalletEntry,\n AccountWalletMnemonicGroupEntry,\n AccountWalletMnemonicPayload,\n AccountWalletPrivateKeyGroupEntry,\n AccountWalletPrivateKeyPayload,\n ExportStateOptions,\n} from './payload.js';\nimport { AccountTreeSnapshot } from './snapshot.js';\n\n/**\n * Returns `true` if `wallet` is an HD entropy wallet ({@link AccountWalletEntropyObject}).\n *\n * @param wallet - The wallet object to test.\n * @returns Type predicate narrowing to {@link AccountWalletEntropyObject}.\n */\nexport function isMnemonicWalletObject(\n wallet: AccountWalletObject,\n): wallet is AccountWalletEntropyObject {\n return wallet.type === AccountWalletType.Entropy;\n}\n\n/**\n * Returns `true` if `wallet` is an imported private-key wallet\n * ({@link AccountWalletKeyringObject} with keyring type {@link KeyringTypes.simple}).\n *\n * @param wallet - The wallet object to test.\n * @returns Type predicate narrowing to {@link AccountWalletKeyringObject}.\n */\nexport function isPrivateKeyWalletObject(\n wallet: AccountWalletObject,\n): wallet is AccountWalletKeyringObject {\n return (\n wallet.type === AccountWalletType.Keyring &&\n wallet.metadata.keyring.type === KeyringTypes.simple\n );\n}\n\n/** Context required by {@link exportState}. */\nexport type ExportContext = {\n getState: () => AccountTreeControllerState;\n messenger: AccountTreeControllerMessenger;\n};\n\n/**\n * Exports a single entropy (HD) wallet object as an {@link AccountWalletMnemonicPayload}.\n *\n * Calls `KeyringController:withKeyringV2Unsafe` to derive the stable entropy source ID\n * via {@link HdKeyring.toEntropySourceId} and, when `includeSecrets` is `true`, to read\n * the raw mnemonic bytes.\n *\n * @param context - Export context.\n * @param walletObj - The local entropy wallet to export.\n * @param includeSecrets - When `true`, the BIP-39 mnemonic is included in the payload.\n * @param idMap - ID map to populate with local↔payload ID pairs for this wallet and its groups.\n * @returns The mnemonic wallet payload entry.\n * @throws If `includeSecrets` is `true` but the mnemonic cannot be read from the keyring.\n */\nasync function exportMnemonicWalletObject(\n context: ExportContext,\n walletObj: AccountWalletEntropyObject,\n includeSecrets: boolean,\n idMap: IdMap,\n): Promise<AccountWalletMnemonicPayload> {\n const result = await context.messenger.call(\n 'KeyringController:withKeyringV2Unsafe',\n // The local wallet entropy ID is the keyring ID.\n { id: walletObj.metadata.entropy.id },\n async ({ keyring }) => {\n const hdKeyring = keyring as HdKeyring;\n const includeMnemonic =\n includeSecrets &&\n hdKeyring.mnemonic !== null &&\n hdKeyring.mnemonic !== undefined;\n\n return {\n // Compute the stable entropy source ID from the keyring's mnemonic (BIP-39 seed).\n entropySourceId: await hdKeyring.toEntropySourceId(),\n // No need to include the mnemonic here if we're not exporting secrets.\n mnemonic: includeMnemonic ? hdKeyring.mnemonic : undefined,\n };\n },\n );\n const { entropySourceId, mnemonic } = result as {\n entropySourceId: string;\n mnemonic?: Uint8Array;\n };\n\n // We use the stable entropy source ID as the payload wallet ID, rather than the local wallet ID, to\n // ensure that the exported snapshot is stable across different installations and sessions.\n const wallet: AccountWalletMnemonicPayload = {\n type: 'mnemonic',\n id: `wallet:${entropySourceId}`,\n metadata: { name: walletObj.metadata.name },\n groups: [],\n };\n\n idMap.add(walletObj.id, wallet.id);\n\n for (const groupObj of Object.values(walletObj.groups)) {\n const { groupIndex } = groupObj.metadata.entropy;\n\n const group: AccountWalletMnemonicGroupEntry = {\n id: `${wallet.id}/${groupIndex}`,\n groupIndex,\n metadata: {\n name: groupObj.metadata.name,\n pinned: groupObj.metadata.pinned,\n hidden: groupObj.metadata.hidden,\n },\n };\n\n idMap.add(groupObj.id, group.id);\n\n wallet.groups.push(group);\n }\n\n // This should never happen, but we check just in case.\n if (includeSecrets) {\n if (mnemonic === undefined) {\n throw new Error(`Failed to export mnemonic for wallet ${wallet.id}`);\n }\n\n wallet.value = encodeMnemonicWords(mnemonic);\n }\n\n return wallet;\n}\n\n/**\n * Exports a single simple-keyring wallet object as an {@link AccountWalletPrivateKeyPayload}.\n *\n * All groups from the wallet are merged into the `'private-key'` singleton payload entry.\n * When `includeSecrets` is `true`, each group's private key is exported via\n * `KeyringController:withKeyringV2`.\n *\n * @param context - Export context.\n * @param walletObj - The local simple-keyring wallet to export.\n * @param includeSecrets - When `true`, private keys are included in the payload.\n * @param idMap - ID map to populate with local↔payload ID pairs for this wallet and its groups.\n * @returns The private-key wallet payload entry.\n * @throws If `includeSecrets` is `true` but a private key cannot be exported for an account.\n */\nasync function exportPrivateKeyWalletObject(\n context: ExportContext,\n walletObj: AccountWalletKeyringObject,\n includeSecrets: boolean,\n idMap: IdMap,\n): Promise<AccountWalletPrivateKeyPayload> {\n // We use a singleton wallet ID for private keys.\n const wallet: AccountWalletPrivateKeyPayload = {\n type: 'private-key',\n id: `wallet:private-key`,\n metadata: { name: walletObj.metadata.name },\n groups: [],\n };\n\n idMap.add(walletObj.id, wallet.id);\n\n for (const groupObj of Object.values(walletObj.groups)) {\n const accountId = groupObj.accounts[0];\n if (!accountId) {\n continue;\n }\n const account = context.messenger.call(\n 'AccountsController:getAccount',\n accountId,\n );\n if (!account) {\n continue;\n }\n\n const { address } = account;\n\n let exported: PrivateKeyExportedAccount | undefined;\n if (includeSecrets) {\n const result = await context.messenger.call(\n 'KeyringController:withKeyringV2',\n { address },\n async ({ keyring }) => {\n if (!keyring.exportAccount) {\n throw new Error(\n `Keyring for account ${accountId} does not support exportAccount`,\n );\n }\n\n return keyring.exportAccount(accountId, {\n type: 'private-key',\n encoding: 'hexadecimal',\n });\n },\n );\n\n exported = result as PrivateKeyExportedAccount;\n }\n\n const group: AccountWalletPrivateKeyGroupEntry = {\n id: `${wallet.id}/${address}`,\n metadata: {\n name: groupObj.metadata.name,\n pinned: groupObj.metadata.pinned,\n hidden: groupObj.metadata.hidden,\n },\n };\n\n if (includeSecrets) {\n if (!exported) {\n throw new Error(\n `Failed to export private key for account ${accountId}`,\n );\n }\n group.value = {\n privateKey: exported.privateKey,\n encoding: exported.encoding,\n type: EthAccountType.Eoa,\n };\n }\n\n idMap.add(groupObj.id, group.id);\n\n wallet.groups.push(group);\n }\n\n return wallet;\n}\n\n/**\n * Builds an {@link AccountTreeSnapshot} from the current controller state.\n *\n * Iterates over all wallets in the tree:\n * - {@link AccountWalletType.Entropy} (HD) wallets -> `'mnemonic'` payload entries.\n * - {@link AccountWalletType.Keyring} wallets of type `simple` -> `'private-key'` payload entries.\n * - Snap wallets and hardware keyrings are skipped in v1.\n *\n * @param context - Export context providing state and messenger access.\n * @param options - Export options.\n * @returns A promise that resolves to the built snapshot.\n * @throws If `options.includeSecrets` is `true` and the vault is locked.\n */\nexport async function exportState(\n context: ExportContext,\n options: ExportStateOptions = {},\n): Promise<AccountTreeSnapshot> {\n const state = context.getState();\n\n const includeSecrets = options.includeSecrets ?? false;\n const { isUnlocked } = context.messenger.call('KeyringController:getState');\n if (includeSecrets && !isUnlocked) {\n throw new Error('Cannot include secrets in export when vault is locked');\n }\n\n const idMap = new IdMap();\n const entries: AccountTreeWalletEntry[] = [];\n let privateKeyWallet: AccountWalletPrivateKeyPayload | undefined;\n\n for (const walletObj of Object.values(state.accountTree.wallets)) {\n if (isMnemonicWalletObject(walletObj)) {\n entries.push(\n await exportMnemonicWalletObject(\n context,\n walletObj,\n includeSecrets,\n idMap,\n ),\n );\n } else if (isPrivateKeyWalletObject(walletObj)) {\n const exported = await exportPrivateKeyWalletObject(\n context,\n walletObj,\n includeSecrets,\n idMap,\n );\n\n if (privateKeyWallet) {\n privateKeyWallet.groups.push(...exported.groups);\n } else {\n privateKeyWallet = exported;\n }\n } else {\n // AccountWalletType.Snap and hardware keyrings: skipped for now.\n }\n }\n\n if (privateKeyWallet) {\n entries.push(privateKeyWallet);\n }\n\n return new AccountTreeSnapshot(entries, idMap);\n}\n"]}
@@ -1,59 +0,0 @@
1
- "use strict";
2
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
- 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");
5
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
- };
7
- var _IdMap_localToPayload, _IdMap_payloadToLocal;
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.IdMap = void 0;
10
- /**
11
- * Bidirectional map between local controller IDs and portable payload IDs.
12
- *
13
- * Populated during {@link exportState} so that callers can bridge between
14
- * device-local wallet/group IDs and the stable cross-device IDs that appear
15
- * in a serialized {@link AccountTreePayload}.
16
- */
17
- class IdMap {
18
- /**
19
- * @param entries - Optional seed pairs `[localId, payloadId]` to pre-populate the map.
20
- */
21
- constructor(entries = []) {
22
- _IdMap_localToPayload.set(this, new Map());
23
- _IdMap_payloadToLocal.set(this, new Map());
24
- for (const [localId, payloadId] of entries) {
25
- this.add(localId, payloadId);
26
- }
27
- }
28
- /**
29
- * Registers a local↔payload ID pair.
30
- *
31
- * @param localId - Local controller wallet or group ID.
32
- * @param payloadId - Corresponding portable payload ID.
33
- */
34
- add(localId, payloadId) {
35
- __classPrivateFieldGet(this, _IdMap_localToPayload, "f").set(localId, payloadId);
36
- __classPrivateFieldGet(this, _IdMap_payloadToLocal, "f").set(payloadId, localId);
37
- }
38
- /**
39
- * Returns the portable payload ID for a given local ID.
40
- *
41
- * @param localId - Local controller wallet or group ID.
42
- * @returns The payload ID, or `undefined` if not registered.
43
- */
44
- getPayloadId(localId) {
45
- return __classPrivateFieldGet(this, _IdMap_localToPayload, "f").get(localId);
46
- }
47
- /**
48
- * Returns the local controller ID for a given payload ID.
49
- *
50
- * @param payloadId - Portable payload ID.
51
- * @returns The local wallet or group ID, or `undefined` if not registered.
52
- */
53
- getLocalId(payloadId) {
54
- return __classPrivateFieldGet(this, _IdMap_payloadToLocal, "f").get(payloadId);
55
- }
56
- }
57
- exports.IdMap = IdMap;
58
- _IdMap_localToPayload = new WeakMap(), _IdMap_payloadToLocal = new WeakMap();
59
- //# sourceMappingURL=id-map.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"id-map.cjs","sourceRoot":"","sources":["../../src/state/id-map.ts"],"names":[],"mappings":";;;;;;;;;AAUA;;;;;;GAMG;AACH,MAAa,KAAK;IAKhB;;OAEG;IACH,YAAY,UAAsD,EAAE;QAP3D,gCAA2C,IAAI,GAAG,EAAE,EAAC;QAErD,gCAA2C,IAAI,GAAG,EAAE,EAAC;QAM5D,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,OAAgB,EAAE,SAAoB;QACxC,uBAAA,IAAI,6BAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC7C,uBAAA,IAAI,6BAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,OAAgB;QAC3B,OAAO,uBAAA,IAAI,6BAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,SAAoB;QAC7B,OAAO,uBAAA,IAAI,6BAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;CACF;AA5CD,sBA4CC","sourcesContent":["import type { AccountGroupId, AccountWalletId } from '@metamask/account-api';\n\nimport type {\n AccountGroupPayloadId,\n AccountWalletPayloadId,\n} from './payload.js';\n\ntype LocalId = AccountWalletId | AccountGroupId;\ntype PayloadId = AccountWalletPayloadId | AccountGroupPayloadId;\n\n/**\n * Bidirectional map between local controller IDs and portable payload IDs.\n *\n * Populated during {@link exportState} so that callers can bridge between\n * device-local wallet/group IDs and the stable cross-device IDs that appear\n * in a serialized {@link AccountTreePayload}.\n */\nexport class IdMap {\n readonly #localToPayload: Map<LocalId, PayloadId> = new Map();\n\n readonly #payloadToLocal: Map<PayloadId, LocalId> = new Map();\n\n /**\n * @param entries - Optional seed pairs `[localId, payloadId]` to pre-populate the map.\n */\n constructor(entries: [localId: LocalId, payloadId: PayloadId][] = []) {\n for (const [localId, payloadId] of entries) {\n this.add(localId, payloadId);\n }\n }\n\n /**\n * Registers a local↔payload ID pair.\n *\n * @param localId - Local controller wallet or group ID.\n * @param payloadId - Corresponding portable payload ID.\n */\n add(localId: LocalId, payloadId: PayloadId): void {\n this.#localToPayload.set(localId, payloadId);\n this.#payloadToLocal.set(payloadId, localId);\n }\n\n /**\n * Returns the portable payload ID for a given local ID.\n *\n * @param localId - Local controller wallet or group ID.\n * @returns The payload ID, or `undefined` if not registered.\n */\n getPayloadId(localId: LocalId): PayloadId | undefined {\n return this.#localToPayload.get(localId);\n }\n\n /**\n * Returns the local controller ID for a given payload ID.\n *\n * @param payloadId - Portable payload ID.\n * @returns The local wallet or group ID, or `undefined` if not registered.\n */\n getLocalId(payloadId: PayloadId): LocalId | undefined {\n return this.#payloadToLocal.get(payloadId);\n }\n}\n"]}
@@ -1,41 +0,0 @@
1
- import type { AccountGroupId, AccountWalletId } from "@metamask/account-api";
2
- import type { AccountGroupPayloadId, AccountWalletPayloadId } from "./payload.cjs";
3
- type LocalId = AccountWalletId | AccountGroupId;
4
- type PayloadId = AccountWalletPayloadId | AccountGroupPayloadId;
5
- /**
6
- * Bidirectional map between local controller IDs and portable payload IDs.
7
- *
8
- * Populated during {@link exportState} so that callers can bridge between
9
- * device-local wallet/group IDs and the stable cross-device IDs that appear
10
- * in a serialized {@link AccountTreePayload}.
11
- */
12
- export declare class IdMap {
13
- #private;
14
- /**
15
- * @param entries - Optional seed pairs `[localId, payloadId]` to pre-populate the map.
16
- */
17
- constructor(entries?: [localId: LocalId, payloadId: PayloadId][]);
18
- /**
19
- * Registers a local↔payload ID pair.
20
- *
21
- * @param localId - Local controller wallet or group ID.
22
- * @param payloadId - Corresponding portable payload ID.
23
- */
24
- add(localId: LocalId, payloadId: PayloadId): void;
25
- /**
26
- * Returns the portable payload ID for a given local ID.
27
- *
28
- * @param localId - Local controller wallet or group ID.
29
- * @returns The payload ID, or `undefined` if not registered.
30
- */
31
- getPayloadId(localId: LocalId): PayloadId | undefined;
32
- /**
33
- * Returns the local controller ID for a given payload ID.
34
- *
35
- * @param payloadId - Portable payload ID.
36
- * @returns The local wallet or group ID, or `undefined` if not registered.
37
- */
38
- getLocalId(payloadId: PayloadId): LocalId | undefined;
39
- }
40
- export {};
41
- //# sourceMappingURL=id-map.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"id-map.d.cts","sourceRoot":"","sources":["../../src/state/id-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,8BAA8B;AAE7E,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACvB,sBAAqB;AAEtB,KAAK,OAAO,GAAG,eAAe,GAAG,cAAc,CAAC;AAChD,KAAK,SAAS,GAAG,sBAAsB,GAAG,qBAAqB,CAAC;AAEhE;;;;;;GAMG;AACH,qBAAa,KAAK;;IAKhB;;OAEG;gBACS,OAAO,GAAE,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,EAAO;IAMpE;;;;;OAKG;IACH,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAKjD;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS;IAIrD;;;;;OAKG;IACH,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS;CAGtD"}
@@ -1,41 +0,0 @@
1
- import type { AccountGroupId, AccountWalletId } from "@metamask/account-api";
2
- import type { AccountGroupPayloadId, AccountWalletPayloadId } from "./payload.mjs";
3
- type LocalId = AccountWalletId | AccountGroupId;
4
- type PayloadId = AccountWalletPayloadId | AccountGroupPayloadId;
5
- /**
6
- * Bidirectional map between local controller IDs and portable payload IDs.
7
- *
8
- * Populated during {@link exportState} so that callers can bridge between
9
- * device-local wallet/group IDs and the stable cross-device IDs that appear
10
- * in a serialized {@link AccountTreePayload}.
11
- */
12
- export declare class IdMap {
13
- #private;
14
- /**
15
- * @param entries - Optional seed pairs `[localId, payloadId]` to pre-populate the map.
16
- */
17
- constructor(entries?: [localId: LocalId, payloadId: PayloadId][]);
18
- /**
19
- * Registers a local↔payload ID pair.
20
- *
21
- * @param localId - Local controller wallet or group ID.
22
- * @param payloadId - Corresponding portable payload ID.
23
- */
24
- add(localId: LocalId, payloadId: PayloadId): void;
25
- /**
26
- * Returns the portable payload ID for a given local ID.
27
- *
28
- * @param localId - Local controller wallet or group ID.
29
- * @returns The payload ID, or `undefined` if not registered.
30
- */
31
- getPayloadId(localId: LocalId): PayloadId | undefined;
32
- /**
33
- * Returns the local controller ID for a given payload ID.
34
- *
35
- * @param payloadId - Portable payload ID.
36
- * @returns The local wallet or group ID, or `undefined` if not registered.
37
- */
38
- getLocalId(payloadId: PayloadId): LocalId | undefined;
39
- }
40
- export {};
41
- //# sourceMappingURL=id-map.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"id-map.d.mts","sourceRoot":"","sources":["../../src/state/id-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,8BAA8B;AAE7E,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACvB,sBAAqB;AAEtB,KAAK,OAAO,GAAG,eAAe,GAAG,cAAc,CAAC;AAChD,KAAK,SAAS,GAAG,sBAAsB,GAAG,qBAAqB,CAAC;AAEhE;;;;;;GAMG;AACH,qBAAa,KAAK;;IAKhB;;OAEG;gBACS,OAAO,GAAE,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,EAAO;IAMpE;;;;;OAKG;IACH,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAKjD;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS;IAIrD;;;;;OAKG;IACH,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS;CAGtD"}
@@ -1,55 +0,0 @@
1
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
- 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");
4
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
- };
6
- var _IdMap_localToPayload, _IdMap_payloadToLocal;
7
- /**
8
- * Bidirectional map between local controller IDs and portable payload IDs.
9
- *
10
- * Populated during {@link exportState} so that callers can bridge between
11
- * device-local wallet/group IDs and the stable cross-device IDs that appear
12
- * in a serialized {@link AccountTreePayload}.
13
- */
14
- export class IdMap {
15
- /**
16
- * @param entries - Optional seed pairs `[localId, payloadId]` to pre-populate the map.
17
- */
18
- constructor(entries = []) {
19
- _IdMap_localToPayload.set(this, new Map());
20
- _IdMap_payloadToLocal.set(this, new Map());
21
- for (const [localId, payloadId] of entries) {
22
- this.add(localId, payloadId);
23
- }
24
- }
25
- /**
26
- * Registers a local↔payload ID pair.
27
- *
28
- * @param localId - Local controller wallet or group ID.
29
- * @param payloadId - Corresponding portable payload ID.
30
- */
31
- add(localId, payloadId) {
32
- __classPrivateFieldGet(this, _IdMap_localToPayload, "f").set(localId, payloadId);
33
- __classPrivateFieldGet(this, _IdMap_payloadToLocal, "f").set(payloadId, localId);
34
- }
35
- /**
36
- * Returns the portable payload ID for a given local ID.
37
- *
38
- * @param localId - Local controller wallet or group ID.
39
- * @returns The payload ID, or `undefined` if not registered.
40
- */
41
- getPayloadId(localId) {
42
- return __classPrivateFieldGet(this, _IdMap_localToPayload, "f").get(localId);
43
- }
44
- /**
45
- * Returns the local controller ID for a given payload ID.
46
- *
47
- * @param payloadId - Portable payload ID.
48
- * @returns The local wallet or group ID, or `undefined` if not registered.
49
- */
50
- getLocalId(payloadId) {
51
- return __classPrivateFieldGet(this, _IdMap_payloadToLocal, "f").get(payloadId);
52
- }
53
- }
54
- _IdMap_localToPayload = new WeakMap(), _IdMap_payloadToLocal = new WeakMap();
55
- //# sourceMappingURL=id-map.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"id-map.mjs","sourceRoot":"","sources":["../../src/state/id-map.ts"],"names":[],"mappings":";;;;;;AAUA;;;;;;GAMG;AACH,MAAM,OAAO,KAAK;IAKhB;;OAEG;IACH,YAAY,UAAsD,EAAE;QAP3D,gCAA2C,IAAI,GAAG,EAAE,EAAC;QAErD,gCAA2C,IAAI,GAAG,EAAE,EAAC;QAM5D,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,OAAgB,EAAE,SAAoB;QACxC,uBAAA,IAAI,6BAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC7C,uBAAA,IAAI,6BAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,OAAgB;QAC3B,OAAO,uBAAA,IAAI,6BAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,SAAoB;QAC7B,OAAO,uBAAA,IAAI,6BAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;CACF","sourcesContent":["import type { AccountGroupId, AccountWalletId } from '@metamask/account-api';\n\nimport type {\n AccountGroupPayloadId,\n AccountWalletPayloadId,\n} from './payload.js';\n\ntype LocalId = AccountWalletId | AccountGroupId;\ntype PayloadId = AccountWalletPayloadId | AccountGroupPayloadId;\n\n/**\n * Bidirectional map between local controller IDs and portable payload IDs.\n *\n * Populated during {@link exportState} so that callers can bridge between\n * device-local wallet/group IDs and the stable cross-device IDs that appear\n * in a serialized {@link AccountTreePayload}.\n */\nexport class IdMap {\n readonly #localToPayload: Map<LocalId, PayloadId> = new Map();\n\n readonly #payloadToLocal: Map<PayloadId, LocalId> = new Map();\n\n /**\n * @param entries - Optional seed pairs `[localId, payloadId]` to pre-populate the map.\n */\n constructor(entries: [localId: LocalId, payloadId: PayloadId][] = []) {\n for (const [localId, payloadId] of entries) {\n this.add(localId, payloadId);\n }\n }\n\n /**\n * Registers a local↔payload ID pair.\n *\n * @param localId - Local controller wallet or group ID.\n * @param payloadId - Corresponding portable payload ID.\n */\n add(localId: LocalId, payloadId: PayloadId): void {\n this.#localToPayload.set(localId, payloadId);\n this.#payloadToLocal.set(payloadId, localId);\n }\n\n /**\n * Returns the portable payload ID for a given local ID.\n *\n * @param localId - Local controller wallet or group ID.\n * @returns The payload ID, or `undefined` if not registered.\n */\n getPayloadId(localId: LocalId): PayloadId | undefined {\n return this.#localToPayload.get(localId);\n }\n\n /**\n * Returns the local controller ID for a given payload ID.\n *\n * @param payloadId - Portable payload ID.\n * @returns The local wallet or group ID, or `undefined` if not registered.\n */\n getLocalId(payloadId: PayloadId): LocalId | undefined {\n return this.#payloadToLocal.get(payloadId);\n }\n}\n"]}