@metamask-previews/account-tree-controller 0.6.0-preview-9b5151c → 0.6.0-preview-ed2a2e6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"AccountTreeController.cjs","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountGroupId, AccountWalletId } from '@metamask/account-api';\nimport { AccountWalletCategory } from '@metamask/account-api';\nimport type {\n AccountId,\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerGetAccountAction,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport {\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type RestrictedMessenger,\n BaseController,\n} from '@metamask/base-controller';\nimport type {\n KeyringControllerGetStateAction,\n KeyringControllerStateChangeEvent,\n} from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { GetSnap as SnapControllerGetSnap } from '@metamask/snaps-controllers';\nimport type { AccountTreeGroup } from 'src';\n\nimport { AccountTreeWallet } from './AccountTreeWallet';\nimport type { Rule } from './rules';\nimport { EntropyRule, SnapRule, KeyringRule } from './rules';\nimport type { AccountContext } from './types';\n\nconst controllerName = 'AccountTreeController';\n\n// Do not export this one, we just use it to have a common type interface between group and wallet metadata.\ntype Metadata = {\n name: string;\n};\n\nexport type AccountWalletMetadata = Metadata;\n\nexport type AccountGroupMetadata = Metadata;\n\nexport type AccountGroupObject = {\n id: AccountGroupId;\n // Blockchain Accounts:\n accounts: AccountId[];\n metadata: AccountGroupMetadata;\n};\n\nexport type AccountWalletObject = {\n id: AccountWalletId;\n category: AccountWalletCategory;\n // Account groups OR Multichain accounts (once available).\n groups: {\n [groupId: AccountGroupId]: AccountGroupObject;\n };\n metadata: AccountWalletMetadata;\n};\n\nexport type AccountTreeControllerState = {\n accountTree: {\n wallets: {\n // Wallets:\n [walletId: AccountWalletId]: AccountWalletObject;\n };\n };\n};\n\nexport type AccountTreeControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedActions =\n | AccountsControllerGetAccountAction\n | AccountsControllerListMultichainAccountsAction\n | KeyringControllerGetStateAction\n | SnapControllerGetSnap;\n\nexport type AccountTreeControllerActions = never;\n\nexport type AccountTreeControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent\n | KeyringControllerStateChangeEvent;\n\nexport type AccountTreeControllerEvents = AccountTreeControllerStateChangeEvent;\n\nexport type AccountTreeControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n AccountTreeControllerActions | AllowedActions,\n AccountTreeControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nconst accountTreeControllerMetadata: StateMetadata<AccountTreeControllerState> =\n {\n accountTree: {\n persist: false, // We do re-recompute this state everytime.\n anonymous: false,\n },\n };\n\n/**\n * Gets default state of the `AccountTreeController`.\n *\n * @returns The default state of the `AccountTreeController`.\n */\nexport function getDefaultAccountTreeControllerState(): AccountTreeControllerState {\n return {\n accountTree: {\n wallets: {},\n },\n };\n}\n\nexport class AccountTreeController extends BaseController<\n typeof controllerName,\n AccountTreeControllerState,\n AccountTreeControllerMessenger\n> {\n readonly #accountIdToContext: Map<AccountId, AccountContext>;\n\n readonly #rules: Rule[];\n\n readonly #categoryToRule: Record<AccountWalletCategory, Rule>;\n\n readonly #wallets: Map<AccountWalletId, AccountTreeWallet>;\n\n /**\n * Constructor for AccountTreeController.\n *\n * @param options - The controller options.\n * @param options.messenger - The messenger object.\n * @param options.state - Initial state to set on this controller\n */\n constructor({\n messenger,\n state,\n }: {\n messenger: AccountTreeControllerMessenger;\n state?: Partial<AccountTreeControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: accountTreeControllerMetadata,\n state: {\n ...getDefaultAccountTreeControllerState(),\n ...state,\n },\n });\n this.#wallets = new Map();\n\n // Reverse map to allow fast node access from an account ID.\n this.#accountIdToContext = new Map();\n\n // Rules to apply to construct the wallets tree.\n this.#categoryToRule = {\n [AccountWalletCategory.Entropy]: new EntropyRule(this.messagingSystem),\n [AccountWalletCategory.Snap]: new SnapRule(this.messagingSystem),\n [AccountWalletCategory.Keyring]: new KeyringRule(this.messagingSystem),\n } as const;\n this.#rules = [\n // 1. We group by entropy-source\n this.#categoryToRule[AccountWalletCategory.Entropy],\n // 2. We group by Snap ID\n this.#categoryToRule[AccountWalletCategory.Snap],\n // 3. We group by wallet type (this rule cannot fail and will group all non-matching accounts)\n this.#categoryToRule[AccountWalletCategory.Keyring],\n ];\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountAdded',\n (account) => {\n this.#handleAccountAdded(account);\n },\n );\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountRemoved',\n (accountId) => {\n this.#handleAccountRemoved(accountId);\n },\n );\n }\n\n init() {\n const wallets: AccountTreeControllerState['accountTree']['wallets'] = {};\n\n // For now, we always re-compute all wallets, we do not re-use the existing state.\n for (const account of this.#listAccounts()) {\n this.#insert(wallets, account);\n }\n\n // Once we have the account tree, we can compute the name.\n for (const wallet of Object.values(wallets)) {\n const walletInstance = this.getWallet(wallet.id);\n\n if (walletInstance) {\n if (wallet.metadata.name === '') {\n this.#renameAccountWallet(walletInstance, wallet);\n }\n\n for (const group of Object.values(wallet.groups)) {\n const groupInstance = walletInstance.getAccountGroup(group.id);\n\n if (groupInstance) {\n if (group.metadata.name === '') {\n this.#renameAccountGroup(groupInstance, group);\n }\n }\n }\n }\n }\n\n this.update((state) => {\n state.accountTree.wallets = wallets;\n });\n }\n\n #renameAccountWallet(\n wallet: AccountTreeWallet,\n walletObject: AccountWalletObject,\n ) {\n const rule = this.#categoryToRule[walletObject.category];\n walletObject.metadata.name = rule.getDefaultAccountWalletName(wallet);\n }\n\n #renameAccountGroup(\n group: AccountTreeGroup,\n groupObject: AccountGroupObject,\n ) {\n const rule = this.#categoryToRule[group.wallet.category];\n groupObject.metadata.name = rule.getDefaultAccountGroupName(group);\n }\n\n getWallet(id: AccountWalletId): AccountTreeWallet | undefined {\n return this.#wallets.get(id);\n }\n\n getWallets(): AccountTreeWallet[] {\n return Array.from(this.#wallets.values());\n }\n\n #handleAccountAdded(account: InternalAccount) {\n this.update((state) => {\n this.#insert(state.accountTree.wallets, account);\n\n const context = this.#accountIdToContext.get(account.id);\n if (context) {\n const { walletId, groupId } = context;\n\n const wallet = state.accountTree.wallets[walletId];\n if (wallet) {\n const walletInstance = this.getWallet(wallet.id);\n if (walletInstance) {\n if (wallet.metadata.name === '') {\n this.#renameAccountWallet(walletInstance, wallet);\n }\n\n const group = wallet.groups[groupId];\n if (group) {\n const groupInstance = walletInstance.getAccountGroup(group.id);\n if (groupInstance) {\n if (group.metadata.name === '') {\n this.#renameAccountGroup(groupInstance, group);\n }\n }\n }\n }\n }\n }\n });\n }\n\n #handleAccountRemoved(accountId: AccountId) {\n const context = this.#accountIdToContext.get(accountId);\n\n if (context) {\n const { walletId, groupId } = context;\n this.update((state) => {\n const { accounts } =\n state.accountTree.wallets[walletId].groups[groupId];\n\n const index = accounts.indexOf(accountId);\n if (index !== -1) {\n accounts.splice(index, 1);\n }\n });\n }\n }\n\n #insert(\n wallets: AccountTreeControllerState['accountTree']['wallets'],\n account: InternalAccount,\n ) {\n for (const rule of this.#rules) {\n const match = rule.match(account);\n\n if (!match) {\n // No match for that rule, we go to the next one.\n continue;\n }\n\n const { walletId, groupId } = match;\n\n // Update controller's state.\n let wallet = wallets[walletId];\n if (!wallet) {\n wallets[walletId] = {\n id: walletId,\n category: rule.category,\n groups: {},\n metadata: {\n name: '', // Will get updated later.\n },\n };\n wallet = wallets[walletId];\n }\n\n let group = wallet.groups[groupId];\n if (!group) {\n wallet.groups[groupId] = {\n id: groupId,\n accounts: [],\n metadata: {\n name: '', // Will get updated later.\n },\n };\n group = wallet.groups[groupId];\n }\n\n group.accounts.push(account.id);\n\n // Update in-memory wallet/group instances.\n this.#wallets.set(\n wallet.id,\n new AccountTreeWallet({ messenger: this.messagingSystem, wallet }),\n );\n\n // Update the reverse mapping for this account.\n this.#accountIdToContext.set(account.id, {\n walletId: wallet.id,\n groupId: group.id,\n });\n\n return;\n }\n }\n\n #listAccounts(): InternalAccount[] {\n return this.messagingSystem.call(\n 'AccountsController:listMultichainAccounts',\n );\n }\n}\n"]}
1
+ {"version":3,"file":"AccountTreeController.cjs","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountGroupId, AccountWalletId } from '@metamask/account-api';\nimport { AccountWalletCategory } from '@metamask/account-api';\nimport type {\n AccountId,\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerGetAccountAction,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport {\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type RestrictedMessenger,\n BaseController,\n} from '@metamask/base-controller';\nimport type { KeyringControllerGetStateAction } from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { GetSnap as SnapControllerGetSnap } from '@metamask/snaps-controllers';\nimport type { AccountTreeGroup } from 'src';\n\nimport { AccountTreeWallet } from './AccountTreeWallet';\nimport type { Rule } from './rules';\nimport { EntropyRule, SnapRule, KeyringRule } from './rules';\nimport type { AccountContext } from './types';\n\nconst controllerName = 'AccountTreeController';\n\n// Do not export this one, we just use it to have a common type interface between group and wallet metadata.\ntype Metadata = {\n name: string;\n};\n\nexport type AccountWalletMetadata = Metadata;\n\nexport type AccountGroupMetadata = Metadata;\n\nexport type AccountGroupObject = {\n id: AccountGroupId;\n // Blockchain Accounts:\n accounts: AccountId[];\n metadata: AccountGroupMetadata;\n};\n\nexport type AccountWalletObject = {\n id: AccountWalletId;\n category: AccountWalletCategory;\n // Account groups OR Multichain accounts (once available).\n groups: {\n [groupId: AccountGroupId]: AccountGroupObject;\n };\n metadata: AccountWalletMetadata;\n};\n\nexport type AccountTreeControllerState = {\n accountTree: {\n wallets: {\n // Wallets:\n [walletId: AccountWalletId]: AccountWalletObject;\n };\n };\n};\n\nexport type AccountTreeControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedActions =\n | AccountsControllerGetAccountAction\n | AccountsControllerListMultichainAccountsAction\n | KeyringControllerGetStateAction\n | SnapControllerGetSnap;\n\nexport type AccountTreeControllerActions = never;\n\nexport type AccountTreeControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent;\n\nexport type AccountTreeControllerEvents = AccountTreeControllerStateChangeEvent;\n\nexport type AccountTreeControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n AccountTreeControllerActions | AllowedActions,\n AccountTreeControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nconst accountTreeControllerMetadata: StateMetadata<AccountTreeControllerState> =\n {\n accountTree: {\n persist: false, // We do re-recompute this state everytime.\n anonymous: false,\n },\n };\n\n/**\n * Gets default state of the `AccountTreeController`.\n *\n * @returns The default state of the `AccountTreeController`.\n */\nexport function getDefaultAccountTreeControllerState(): AccountTreeControllerState {\n return {\n accountTree: {\n wallets: {},\n },\n };\n}\n\nexport class AccountTreeController extends BaseController<\n typeof controllerName,\n AccountTreeControllerState,\n AccountTreeControllerMessenger\n> {\n readonly #accountIdToContext: Map<AccountId, AccountContext>;\n\n readonly #rules: Rule[];\n\n readonly #categoryToRule: Record<AccountWalletCategory, Rule>;\n\n readonly #wallets: Map<AccountWalletId, AccountTreeWallet>;\n\n /**\n * Constructor for AccountTreeController.\n *\n * @param options - The controller options.\n * @param options.messenger - The messenger object.\n * @param options.state - Initial state to set on this controller\n */\n constructor({\n messenger,\n state,\n }: {\n messenger: AccountTreeControllerMessenger;\n state?: Partial<AccountTreeControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: accountTreeControllerMetadata,\n state: {\n ...getDefaultAccountTreeControllerState(),\n ...state,\n },\n });\n this.#wallets = new Map();\n\n // Reverse map to allow fast node access from an account ID.\n this.#accountIdToContext = new Map();\n\n // Rules to apply to construct the wallets tree.\n this.#categoryToRule = {\n [AccountWalletCategory.Entropy]: new EntropyRule(this.messagingSystem),\n [AccountWalletCategory.Snap]: new SnapRule(this.messagingSystem),\n [AccountWalletCategory.Keyring]: new KeyringRule(this.messagingSystem),\n } as const;\n this.#rules = [\n // 1. We group by entropy-source\n this.#categoryToRule[AccountWalletCategory.Entropy],\n // 2. We group by Snap ID\n this.#categoryToRule[AccountWalletCategory.Snap],\n // 3. We group by wallet type (this rule cannot fail and will group all non-matching accounts)\n this.#categoryToRule[AccountWalletCategory.Keyring],\n ];\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountAdded',\n (account) => {\n this.#handleAccountAdded(account);\n },\n );\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountRemoved',\n (accountId) => {\n this.#handleAccountRemoved(accountId);\n },\n );\n }\n\n init() {\n const wallets: AccountTreeControllerState['accountTree']['wallets'] = {};\n\n // For now, we always re-compute all wallets, we do not re-use the existing state.\n for (const account of this.#listAccounts()) {\n this.#insert(wallets, account);\n }\n\n // Once we have the account tree, we can compute the name.\n for (const wallet of Object.values(wallets)) {\n const walletInstance = this.getWallet(wallet.id);\n\n if (walletInstance) {\n if (wallet.metadata.name === '') {\n this.#renameAccountWallet(walletInstance, wallet);\n }\n\n for (const group of Object.values(wallet.groups)) {\n const groupInstance = walletInstance.getAccountGroup(group.id);\n\n if (groupInstance) {\n if (group.metadata.name === '') {\n this.#renameAccountGroup(groupInstance, group);\n }\n }\n }\n }\n }\n\n this.update((state) => {\n state.accountTree.wallets = wallets;\n });\n }\n\n #renameAccountWallet(\n wallet: AccountTreeWallet,\n walletObject: AccountWalletObject,\n ) {\n const rule = this.#categoryToRule[walletObject.category];\n walletObject.metadata.name = rule.getDefaultAccountWalletName(wallet);\n }\n\n #renameAccountGroup(\n group: AccountTreeGroup,\n groupObject: AccountGroupObject,\n ) {\n const rule = this.#categoryToRule[group.wallet.category];\n groupObject.metadata.name = rule.getDefaultAccountGroupName(group);\n }\n\n getWallet(id: AccountWalletId): AccountTreeWallet | undefined {\n return this.#wallets.get(id);\n }\n\n getWallets(): AccountTreeWallet[] {\n return Array.from(this.#wallets.values());\n }\n\n #handleAccountAdded(account: InternalAccount) {\n this.update((state) => {\n this.#insert(state.accountTree.wallets, account);\n\n const context = this.#accountIdToContext.get(account.id);\n if (context) {\n const { walletId, groupId } = context;\n\n const wallet = state.accountTree.wallets[walletId];\n if (wallet) {\n const walletInstance = this.getWallet(wallet.id);\n if (walletInstance) {\n if (wallet.metadata.name === '') {\n this.#renameAccountWallet(walletInstance, wallet);\n }\n\n const group = wallet.groups[groupId];\n if (group) {\n const groupInstance = walletInstance.getAccountGroup(group.id);\n if (groupInstance) {\n if (group.metadata.name === '') {\n this.#renameAccountGroup(groupInstance, group);\n }\n }\n }\n }\n }\n }\n });\n }\n\n #handleAccountRemoved(accountId: AccountId) {\n const context = this.#accountIdToContext.get(accountId);\n\n if (context) {\n const { walletId, groupId } = context;\n this.update((state) => {\n const { accounts } =\n state.accountTree.wallets[walletId].groups[groupId];\n\n const index = accounts.indexOf(accountId);\n if (index !== -1) {\n accounts.splice(index, 1);\n }\n });\n }\n }\n\n #insert(\n wallets: AccountTreeControllerState['accountTree']['wallets'],\n account: InternalAccount,\n ) {\n for (const rule of this.#rules) {\n const match = rule.match(account);\n\n if (!match) {\n // No match for that rule, we go to the next one.\n continue;\n }\n\n const { walletId, groupId } = match;\n\n // Update controller's state.\n let wallet = wallets[walletId];\n if (!wallet) {\n wallets[walletId] = {\n id: walletId,\n category: rule.category,\n groups: {},\n metadata: {\n name: '', // Will get updated later.\n },\n };\n wallet = wallets[walletId];\n }\n\n let group = wallet.groups[groupId];\n if (!group) {\n wallet.groups[groupId] = {\n id: groupId,\n accounts: [],\n metadata: {\n name: '', // Will get updated later.\n },\n };\n group = wallet.groups[groupId];\n }\n\n group.accounts.push(account.id);\n\n // Update in-memory wallet/group instances.\n this.#wallets.set(\n wallet.id,\n new AccountTreeWallet({ messenger: this.messagingSystem, wallet }),\n );\n\n // Update the reverse mapping for this account.\n this.#accountIdToContext.set(account.id, {\n walletId: wallet.id,\n groupId: group.id,\n });\n\n return;\n }\n }\n\n #listAccounts(): InternalAccount[] {\n return this.messagingSystem.call(\n 'AccountsController:listMultichainAccounts',\n );\n }\n}\n"]}
@@ -2,7 +2,7 @@ import type { AccountGroupId, AccountWalletId } from "@metamask/account-api";
2
2
  import { AccountWalletCategory } from "@metamask/account-api";
3
3
  import type { AccountId, AccountsControllerAccountAddedEvent, AccountsControllerAccountRemovedEvent, AccountsControllerGetAccountAction, AccountsControllerListMultichainAccountsAction } from "@metamask/accounts-controller";
4
4
  import { type ControllerGetStateAction, type ControllerStateChangeEvent, type RestrictedMessenger, BaseController } from "@metamask/base-controller";
5
- import type { KeyringControllerGetStateAction, KeyringControllerStateChangeEvent } from "@metamask/keyring-controller";
5
+ import type { KeyringControllerGetStateAction } from "@metamask/keyring-controller";
6
6
  import type { GetSnap as SnapControllerGetSnap } from "@metamask/snaps-controllers";
7
7
  import { AccountTreeWallet } from "./AccountTreeWallet.cjs";
8
8
  declare const controllerName = "AccountTreeController";
@@ -35,7 +35,7 @@ export type AccountTreeControllerGetStateAction = ControllerGetStateAction<typeo
35
35
  export type AllowedActions = AccountsControllerGetAccountAction | AccountsControllerListMultichainAccountsAction | KeyringControllerGetStateAction | SnapControllerGetSnap;
36
36
  export type AccountTreeControllerActions = never;
37
37
  export type AccountTreeControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, AccountTreeControllerState>;
38
- export type AllowedEvents = AccountsControllerAccountAddedEvent | AccountsControllerAccountRemovedEvent | KeyringControllerStateChangeEvent;
38
+ export type AllowedEvents = AccountsControllerAccountAddedEvent | AccountsControllerAccountRemovedEvent;
39
39
  export type AccountTreeControllerEvents = AccountTreeControllerStateChangeEvent;
40
40
  export type AccountTreeControllerMessenger = RestrictedMessenger<typeof controllerName, AccountTreeControllerActions | AllowedActions, AccountTreeControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
41
41
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AccountTreeController.d.cts","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,8BAA8B;AAC7E,OAAO,EAAE,qBAAqB,EAAE,8BAA8B;AAC9D,OAAO,KAAK,EACV,SAAS,EACT,mCAAmC,EACnC,qCAAqC,EACrC,kCAAkC,EAClC,8CAA8C,EAC/C,sCAAsC;AAEvC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,cAAc,EACf,kCAAkC;AACnC,OAAO,KAAK,EACV,+BAA+B,EAC/B,iCAAiC,EAClC,qCAAqC;AAEtC,OAAO,KAAK,EAAE,OAAO,IAAI,qBAAqB,EAAE,oCAAoC;AAGpF,OAAO,EAAE,iBAAiB,EAAE,gCAA4B;AAKxD,QAAA,MAAM,cAAc,0BAA0B,CAAC;AAG/C,KAAK,QAAQ,GAAG;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AAE7C,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAE5C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,cAAc,CAAC;IAEnB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,QAAQ,EAAE,oBAAoB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,eAAe,CAAC;IACpB,QAAQ,EAAE,qBAAqB,CAAC;IAEhC,MAAM,EAAE;QACN,CAAC,OAAO,EAAE,cAAc,GAAG,kBAAkB,CAAC;KAC/C,CAAC;IACF,QAAQ,EAAE,qBAAqB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,WAAW,EAAE;QACX,OAAO,EAAE;YAEP,CAAC,QAAQ,EAAE,eAAe,GAAG,mBAAmB,CAAC;SAClD,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG,wBAAwB,CACxE,OAAO,cAAc,EACrB,0BAA0B,CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GACtB,kCAAkC,GAClC,8CAA8C,GAC9C,+BAA+B,GAC/B,qBAAqB,CAAC;AAE1B,MAAM,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAEjD,MAAM,MAAM,qCAAqC,GAAG,0BAA0B,CAC5E,OAAO,cAAc,EACrB,0BAA0B,CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB,mCAAmC,GACnC,qCAAqC,GACrC,iCAAiC,CAAC;AAEtC,MAAM,MAAM,2BAA2B,GAAG,qCAAqC,CAAC;AAEhF,MAAM,MAAM,8BAA8B,GAAG,mBAAmB,CAC9D,OAAO,cAAc,EACrB,4BAA4B,GAAG,cAAc,EAC7C,2BAA2B,GAAG,aAAa,EAC3C,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAUF;;;;GAIG;AACH,wBAAgB,oCAAoC,IAAI,0BAA0B,CAMjF;AAED,qBAAa,qBAAsB,SAAQ,cAAc,CACvD,OAAO,cAAc,EACrB,0BAA0B,EAC1B,8BAA8B,CAC/B;;IASC;;;;;;OAMG;gBACS,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,8BAA8B,CAAC;QAC1C,KAAK,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC;KAC7C;IA6CD,IAAI;IAkDJ,SAAS,CAAC,EAAE,EAAE,eAAe,GAAG,iBAAiB,GAAG,SAAS;IAI7D,UAAU,IAAI,iBAAiB,EAAE;CAmHlC"}
1
+ {"version":3,"file":"AccountTreeController.d.cts","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,8BAA8B;AAC7E,OAAO,EAAE,qBAAqB,EAAE,8BAA8B;AAC9D,OAAO,KAAK,EACV,SAAS,EACT,mCAAmC,EACnC,qCAAqC,EACrC,kCAAkC,EAClC,8CAA8C,EAC/C,sCAAsC;AAEvC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,cAAc,EACf,kCAAkC;AACnC,OAAO,KAAK,EAAE,+BAA+B,EAAE,qCAAqC;AAEpF,OAAO,KAAK,EAAE,OAAO,IAAI,qBAAqB,EAAE,oCAAoC;AAGpF,OAAO,EAAE,iBAAiB,EAAE,gCAA4B;AAKxD,QAAA,MAAM,cAAc,0BAA0B,CAAC;AAG/C,KAAK,QAAQ,GAAG;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AAE7C,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAE5C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,cAAc,CAAC;IAEnB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,QAAQ,EAAE,oBAAoB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,eAAe,CAAC;IACpB,QAAQ,EAAE,qBAAqB,CAAC;IAEhC,MAAM,EAAE;QACN,CAAC,OAAO,EAAE,cAAc,GAAG,kBAAkB,CAAC;KAC/C,CAAC;IACF,QAAQ,EAAE,qBAAqB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,WAAW,EAAE;QACX,OAAO,EAAE;YAEP,CAAC,QAAQ,EAAE,eAAe,GAAG,mBAAmB,CAAC;SAClD,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG,wBAAwB,CACxE,OAAO,cAAc,EACrB,0BAA0B,CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GACtB,kCAAkC,GAClC,8CAA8C,GAC9C,+BAA+B,GAC/B,qBAAqB,CAAC;AAE1B,MAAM,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAEjD,MAAM,MAAM,qCAAqC,GAAG,0BAA0B,CAC5E,OAAO,cAAc,EACrB,0BAA0B,CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB,mCAAmC,GACnC,qCAAqC,CAAC;AAE1C,MAAM,MAAM,2BAA2B,GAAG,qCAAqC,CAAC;AAEhF,MAAM,MAAM,8BAA8B,GAAG,mBAAmB,CAC9D,OAAO,cAAc,EACrB,4BAA4B,GAAG,cAAc,EAC7C,2BAA2B,GAAG,aAAa,EAC3C,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAUF;;;;GAIG;AACH,wBAAgB,oCAAoC,IAAI,0BAA0B,CAMjF;AAED,qBAAa,qBAAsB,SAAQ,cAAc,CACvD,OAAO,cAAc,EACrB,0BAA0B,EAC1B,8BAA8B,CAC/B;;IASC;;;;;;OAMG;gBACS,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,8BAA8B,CAAC;QAC1C,KAAK,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC;KAC7C;IA6CD,IAAI;IAkDJ,SAAS,CAAC,EAAE,EAAE,eAAe,GAAG,iBAAiB,GAAG,SAAS;IAI7D,UAAU,IAAI,iBAAiB,EAAE;CAmHlC"}
@@ -2,7 +2,7 @@ import type { AccountGroupId, AccountWalletId } from "@metamask/account-api";
2
2
  import { AccountWalletCategory } from "@metamask/account-api";
3
3
  import type { AccountId, AccountsControllerAccountAddedEvent, AccountsControllerAccountRemovedEvent, AccountsControllerGetAccountAction, AccountsControllerListMultichainAccountsAction } from "@metamask/accounts-controller";
4
4
  import { type ControllerGetStateAction, type ControllerStateChangeEvent, type RestrictedMessenger, BaseController } from "@metamask/base-controller";
5
- import type { KeyringControllerGetStateAction, KeyringControllerStateChangeEvent } from "@metamask/keyring-controller";
5
+ import type { KeyringControllerGetStateAction } from "@metamask/keyring-controller";
6
6
  import type { GetSnap as SnapControllerGetSnap } from "@metamask/snaps-controllers";
7
7
  import { AccountTreeWallet } from "./AccountTreeWallet.mjs";
8
8
  declare const controllerName = "AccountTreeController";
@@ -35,7 +35,7 @@ export type AccountTreeControllerGetStateAction = ControllerGetStateAction<typeo
35
35
  export type AllowedActions = AccountsControllerGetAccountAction | AccountsControllerListMultichainAccountsAction | KeyringControllerGetStateAction | SnapControllerGetSnap;
36
36
  export type AccountTreeControllerActions = never;
37
37
  export type AccountTreeControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, AccountTreeControllerState>;
38
- export type AllowedEvents = AccountsControllerAccountAddedEvent | AccountsControllerAccountRemovedEvent | KeyringControllerStateChangeEvent;
38
+ export type AllowedEvents = AccountsControllerAccountAddedEvent | AccountsControllerAccountRemovedEvent;
39
39
  export type AccountTreeControllerEvents = AccountTreeControllerStateChangeEvent;
40
40
  export type AccountTreeControllerMessenger = RestrictedMessenger<typeof controllerName, AccountTreeControllerActions | AllowedActions, AccountTreeControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
41
41
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AccountTreeController.d.mts","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,8BAA8B;AAC7E,OAAO,EAAE,qBAAqB,EAAE,8BAA8B;AAC9D,OAAO,KAAK,EACV,SAAS,EACT,mCAAmC,EACnC,qCAAqC,EACrC,kCAAkC,EAClC,8CAA8C,EAC/C,sCAAsC;AAEvC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,cAAc,EACf,kCAAkC;AACnC,OAAO,KAAK,EACV,+BAA+B,EAC/B,iCAAiC,EAClC,qCAAqC;AAEtC,OAAO,KAAK,EAAE,OAAO,IAAI,qBAAqB,EAAE,oCAAoC;AAGpF,OAAO,EAAE,iBAAiB,EAAE,gCAA4B;AAKxD,QAAA,MAAM,cAAc,0BAA0B,CAAC;AAG/C,KAAK,QAAQ,GAAG;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AAE7C,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAE5C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,cAAc,CAAC;IAEnB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,QAAQ,EAAE,oBAAoB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,eAAe,CAAC;IACpB,QAAQ,EAAE,qBAAqB,CAAC;IAEhC,MAAM,EAAE;QACN,CAAC,OAAO,EAAE,cAAc,GAAG,kBAAkB,CAAC;KAC/C,CAAC;IACF,QAAQ,EAAE,qBAAqB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,WAAW,EAAE;QACX,OAAO,EAAE;YAEP,CAAC,QAAQ,EAAE,eAAe,GAAG,mBAAmB,CAAC;SAClD,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG,wBAAwB,CACxE,OAAO,cAAc,EACrB,0BAA0B,CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GACtB,kCAAkC,GAClC,8CAA8C,GAC9C,+BAA+B,GAC/B,qBAAqB,CAAC;AAE1B,MAAM,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAEjD,MAAM,MAAM,qCAAqC,GAAG,0BAA0B,CAC5E,OAAO,cAAc,EACrB,0BAA0B,CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB,mCAAmC,GACnC,qCAAqC,GACrC,iCAAiC,CAAC;AAEtC,MAAM,MAAM,2BAA2B,GAAG,qCAAqC,CAAC;AAEhF,MAAM,MAAM,8BAA8B,GAAG,mBAAmB,CAC9D,OAAO,cAAc,EACrB,4BAA4B,GAAG,cAAc,EAC7C,2BAA2B,GAAG,aAAa,EAC3C,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAUF;;;;GAIG;AACH,wBAAgB,oCAAoC,IAAI,0BAA0B,CAMjF;AAED,qBAAa,qBAAsB,SAAQ,cAAc,CACvD,OAAO,cAAc,EACrB,0BAA0B,EAC1B,8BAA8B,CAC/B;;IASC;;;;;;OAMG;gBACS,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,8BAA8B,CAAC;QAC1C,KAAK,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC;KAC7C;IA6CD,IAAI;IAkDJ,SAAS,CAAC,EAAE,EAAE,eAAe,GAAG,iBAAiB,GAAG,SAAS;IAI7D,UAAU,IAAI,iBAAiB,EAAE;CAmHlC"}
1
+ {"version":3,"file":"AccountTreeController.d.mts","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,8BAA8B;AAC7E,OAAO,EAAE,qBAAqB,EAAE,8BAA8B;AAC9D,OAAO,KAAK,EACV,SAAS,EACT,mCAAmC,EACnC,qCAAqC,EACrC,kCAAkC,EAClC,8CAA8C,EAC/C,sCAAsC;AAEvC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,cAAc,EACf,kCAAkC;AACnC,OAAO,KAAK,EAAE,+BAA+B,EAAE,qCAAqC;AAEpF,OAAO,KAAK,EAAE,OAAO,IAAI,qBAAqB,EAAE,oCAAoC;AAGpF,OAAO,EAAE,iBAAiB,EAAE,gCAA4B;AAKxD,QAAA,MAAM,cAAc,0BAA0B,CAAC;AAG/C,KAAK,QAAQ,GAAG;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AAE7C,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAE5C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,cAAc,CAAC;IAEnB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,QAAQ,EAAE,oBAAoB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,eAAe,CAAC;IACpB,QAAQ,EAAE,qBAAqB,CAAC;IAEhC,MAAM,EAAE;QACN,CAAC,OAAO,EAAE,cAAc,GAAG,kBAAkB,CAAC;KAC/C,CAAC;IACF,QAAQ,EAAE,qBAAqB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,WAAW,EAAE;QACX,OAAO,EAAE;YAEP,CAAC,QAAQ,EAAE,eAAe,GAAG,mBAAmB,CAAC;SAClD,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG,wBAAwB,CACxE,OAAO,cAAc,EACrB,0BAA0B,CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GACtB,kCAAkC,GAClC,8CAA8C,GAC9C,+BAA+B,GAC/B,qBAAqB,CAAC;AAE1B,MAAM,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAEjD,MAAM,MAAM,qCAAqC,GAAG,0BAA0B,CAC5E,OAAO,cAAc,EACrB,0BAA0B,CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB,mCAAmC,GACnC,qCAAqC,CAAC;AAE1C,MAAM,MAAM,2BAA2B,GAAG,qCAAqC,CAAC;AAEhF,MAAM,MAAM,8BAA8B,GAAG,mBAAmB,CAC9D,OAAO,cAAc,EACrB,4BAA4B,GAAG,cAAc,EAC7C,2BAA2B,GAAG,aAAa,EAC3C,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAUF;;;;GAIG;AACH,wBAAgB,oCAAoC,IAAI,0BAA0B,CAMjF;AAED,qBAAa,qBAAsB,SAAQ,cAAc,CACvD,OAAO,cAAc,EACrB,0BAA0B,EAC1B,8BAA8B,CAC/B;;IASC;;;;;;OAMG;gBACS,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,8BAA8B,CAAC;QAC1C,KAAK,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC;KAC7C;IA6CD,IAAI;IAkDJ,SAAS,CAAC,EAAE,EAAE,eAAe,GAAG,iBAAiB,GAAG,SAAS;IAI7D,UAAU,IAAI,iBAAiB,EAAE;CAmHlC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AccountTreeController.mjs","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountGroupId, AccountWalletId } from '@metamask/account-api';\nimport { AccountWalletCategory } from '@metamask/account-api';\nimport type {\n AccountId,\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerGetAccountAction,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport {\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type RestrictedMessenger,\n BaseController,\n} from '@metamask/base-controller';\nimport type {\n KeyringControllerGetStateAction,\n KeyringControllerStateChangeEvent,\n} from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { GetSnap as SnapControllerGetSnap } from '@metamask/snaps-controllers';\nimport type { AccountTreeGroup } from 'src';\n\nimport { AccountTreeWallet } from './AccountTreeWallet';\nimport type { Rule } from './rules';\nimport { EntropyRule, SnapRule, KeyringRule } from './rules';\nimport type { AccountContext } from './types';\n\nconst controllerName = 'AccountTreeController';\n\n// Do not export this one, we just use it to have a common type interface between group and wallet metadata.\ntype Metadata = {\n name: string;\n};\n\nexport type AccountWalletMetadata = Metadata;\n\nexport type AccountGroupMetadata = Metadata;\n\nexport type AccountGroupObject = {\n id: AccountGroupId;\n // Blockchain Accounts:\n accounts: AccountId[];\n metadata: AccountGroupMetadata;\n};\n\nexport type AccountWalletObject = {\n id: AccountWalletId;\n category: AccountWalletCategory;\n // Account groups OR Multichain accounts (once available).\n groups: {\n [groupId: AccountGroupId]: AccountGroupObject;\n };\n metadata: AccountWalletMetadata;\n};\n\nexport type AccountTreeControllerState = {\n accountTree: {\n wallets: {\n // Wallets:\n [walletId: AccountWalletId]: AccountWalletObject;\n };\n };\n};\n\nexport type AccountTreeControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedActions =\n | AccountsControllerGetAccountAction\n | AccountsControllerListMultichainAccountsAction\n | KeyringControllerGetStateAction\n | SnapControllerGetSnap;\n\nexport type AccountTreeControllerActions = never;\n\nexport type AccountTreeControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent\n | KeyringControllerStateChangeEvent;\n\nexport type AccountTreeControllerEvents = AccountTreeControllerStateChangeEvent;\n\nexport type AccountTreeControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n AccountTreeControllerActions | AllowedActions,\n AccountTreeControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nconst accountTreeControllerMetadata: StateMetadata<AccountTreeControllerState> =\n {\n accountTree: {\n persist: false, // We do re-recompute this state everytime.\n anonymous: false,\n },\n };\n\n/**\n * Gets default state of the `AccountTreeController`.\n *\n * @returns The default state of the `AccountTreeController`.\n */\nexport function getDefaultAccountTreeControllerState(): AccountTreeControllerState {\n return {\n accountTree: {\n wallets: {},\n },\n };\n}\n\nexport class AccountTreeController extends BaseController<\n typeof controllerName,\n AccountTreeControllerState,\n AccountTreeControllerMessenger\n> {\n readonly #accountIdToContext: Map<AccountId, AccountContext>;\n\n readonly #rules: Rule[];\n\n readonly #categoryToRule: Record<AccountWalletCategory, Rule>;\n\n readonly #wallets: Map<AccountWalletId, AccountTreeWallet>;\n\n /**\n * Constructor for AccountTreeController.\n *\n * @param options - The controller options.\n * @param options.messenger - The messenger object.\n * @param options.state - Initial state to set on this controller\n */\n constructor({\n messenger,\n state,\n }: {\n messenger: AccountTreeControllerMessenger;\n state?: Partial<AccountTreeControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: accountTreeControllerMetadata,\n state: {\n ...getDefaultAccountTreeControllerState(),\n ...state,\n },\n });\n this.#wallets = new Map();\n\n // Reverse map to allow fast node access from an account ID.\n this.#accountIdToContext = new Map();\n\n // Rules to apply to construct the wallets tree.\n this.#categoryToRule = {\n [AccountWalletCategory.Entropy]: new EntropyRule(this.messagingSystem),\n [AccountWalletCategory.Snap]: new SnapRule(this.messagingSystem),\n [AccountWalletCategory.Keyring]: new KeyringRule(this.messagingSystem),\n } as const;\n this.#rules = [\n // 1. We group by entropy-source\n this.#categoryToRule[AccountWalletCategory.Entropy],\n // 2. We group by Snap ID\n this.#categoryToRule[AccountWalletCategory.Snap],\n // 3. We group by wallet type (this rule cannot fail and will group all non-matching accounts)\n this.#categoryToRule[AccountWalletCategory.Keyring],\n ];\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountAdded',\n (account) => {\n this.#handleAccountAdded(account);\n },\n );\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountRemoved',\n (accountId) => {\n this.#handleAccountRemoved(accountId);\n },\n );\n }\n\n init() {\n const wallets: AccountTreeControllerState['accountTree']['wallets'] = {};\n\n // For now, we always re-compute all wallets, we do not re-use the existing state.\n for (const account of this.#listAccounts()) {\n this.#insert(wallets, account);\n }\n\n // Once we have the account tree, we can compute the name.\n for (const wallet of Object.values(wallets)) {\n const walletInstance = this.getWallet(wallet.id);\n\n if (walletInstance) {\n if (wallet.metadata.name === '') {\n this.#renameAccountWallet(walletInstance, wallet);\n }\n\n for (const group of Object.values(wallet.groups)) {\n const groupInstance = walletInstance.getAccountGroup(group.id);\n\n if (groupInstance) {\n if (group.metadata.name === '') {\n this.#renameAccountGroup(groupInstance, group);\n }\n }\n }\n }\n }\n\n this.update((state) => {\n state.accountTree.wallets = wallets;\n });\n }\n\n #renameAccountWallet(\n wallet: AccountTreeWallet,\n walletObject: AccountWalletObject,\n ) {\n const rule = this.#categoryToRule[walletObject.category];\n walletObject.metadata.name = rule.getDefaultAccountWalletName(wallet);\n }\n\n #renameAccountGroup(\n group: AccountTreeGroup,\n groupObject: AccountGroupObject,\n ) {\n const rule = this.#categoryToRule[group.wallet.category];\n groupObject.metadata.name = rule.getDefaultAccountGroupName(group);\n }\n\n getWallet(id: AccountWalletId): AccountTreeWallet | undefined {\n return this.#wallets.get(id);\n }\n\n getWallets(): AccountTreeWallet[] {\n return Array.from(this.#wallets.values());\n }\n\n #handleAccountAdded(account: InternalAccount) {\n this.update((state) => {\n this.#insert(state.accountTree.wallets, account);\n\n const context = this.#accountIdToContext.get(account.id);\n if (context) {\n const { walletId, groupId } = context;\n\n const wallet = state.accountTree.wallets[walletId];\n if (wallet) {\n const walletInstance = this.getWallet(wallet.id);\n if (walletInstance) {\n if (wallet.metadata.name === '') {\n this.#renameAccountWallet(walletInstance, wallet);\n }\n\n const group = wallet.groups[groupId];\n if (group) {\n const groupInstance = walletInstance.getAccountGroup(group.id);\n if (groupInstance) {\n if (group.metadata.name === '') {\n this.#renameAccountGroup(groupInstance, group);\n }\n }\n }\n }\n }\n }\n });\n }\n\n #handleAccountRemoved(accountId: AccountId) {\n const context = this.#accountIdToContext.get(accountId);\n\n if (context) {\n const { walletId, groupId } = context;\n this.update((state) => {\n const { accounts } =\n state.accountTree.wallets[walletId].groups[groupId];\n\n const index = accounts.indexOf(accountId);\n if (index !== -1) {\n accounts.splice(index, 1);\n }\n });\n }\n }\n\n #insert(\n wallets: AccountTreeControllerState['accountTree']['wallets'],\n account: InternalAccount,\n ) {\n for (const rule of this.#rules) {\n const match = rule.match(account);\n\n if (!match) {\n // No match for that rule, we go to the next one.\n continue;\n }\n\n const { walletId, groupId } = match;\n\n // Update controller's state.\n let wallet = wallets[walletId];\n if (!wallet) {\n wallets[walletId] = {\n id: walletId,\n category: rule.category,\n groups: {},\n metadata: {\n name: '', // Will get updated later.\n },\n };\n wallet = wallets[walletId];\n }\n\n let group = wallet.groups[groupId];\n if (!group) {\n wallet.groups[groupId] = {\n id: groupId,\n accounts: [],\n metadata: {\n name: '', // Will get updated later.\n },\n };\n group = wallet.groups[groupId];\n }\n\n group.accounts.push(account.id);\n\n // Update in-memory wallet/group instances.\n this.#wallets.set(\n wallet.id,\n new AccountTreeWallet({ messenger: this.messagingSystem, wallet }),\n );\n\n // Update the reverse mapping for this account.\n this.#accountIdToContext.set(account.id, {\n walletId: wallet.id,\n groupId: group.id,\n });\n\n return;\n }\n }\n\n #listAccounts(): InternalAccount[] {\n return this.messagingSystem.call(\n 'AccountsController:listMultichainAccounts',\n );\n }\n}\n"]}
1
+ {"version":3,"file":"AccountTreeController.mjs","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountGroupId, AccountWalletId } from '@metamask/account-api';\nimport { AccountWalletCategory } from '@metamask/account-api';\nimport type {\n AccountId,\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerGetAccountAction,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport {\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type RestrictedMessenger,\n BaseController,\n} from '@metamask/base-controller';\nimport type { KeyringControllerGetStateAction } from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { GetSnap as SnapControllerGetSnap } from '@metamask/snaps-controllers';\nimport type { AccountTreeGroup } from 'src';\n\nimport { AccountTreeWallet } from './AccountTreeWallet';\nimport type { Rule } from './rules';\nimport { EntropyRule, SnapRule, KeyringRule } from './rules';\nimport type { AccountContext } from './types';\n\nconst controllerName = 'AccountTreeController';\n\n// Do not export this one, we just use it to have a common type interface between group and wallet metadata.\ntype Metadata = {\n name: string;\n};\n\nexport type AccountWalletMetadata = Metadata;\n\nexport type AccountGroupMetadata = Metadata;\n\nexport type AccountGroupObject = {\n id: AccountGroupId;\n // Blockchain Accounts:\n accounts: AccountId[];\n metadata: AccountGroupMetadata;\n};\n\nexport type AccountWalletObject = {\n id: AccountWalletId;\n category: AccountWalletCategory;\n // Account groups OR Multichain accounts (once available).\n groups: {\n [groupId: AccountGroupId]: AccountGroupObject;\n };\n metadata: AccountWalletMetadata;\n};\n\nexport type AccountTreeControllerState = {\n accountTree: {\n wallets: {\n // Wallets:\n [walletId: AccountWalletId]: AccountWalletObject;\n };\n };\n};\n\nexport type AccountTreeControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedActions =\n | AccountsControllerGetAccountAction\n | AccountsControllerListMultichainAccountsAction\n | KeyringControllerGetStateAction\n | SnapControllerGetSnap;\n\nexport type AccountTreeControllerActions = never;\n\nexport type AccountTreeControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent;\n\nexport type AccountTreeControllerEvents = AccountTreeControllerStateChangeEvent;\n\nexport type AccountTreeControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n AccountTreeControllerActions | AllowedActions,\n AccountTreeControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nconst accountTreeControllerMetadata: StateMetadata<AccountTreeControllerState> =\n {\n accountTree: {\n persist: false, // We do re-recompute this state everytime.\n anonymous: false,\n },\n };\n\n/**\n * Gets default state of the `AccountTreeController`.\n *\n * @returns The default state of the `AccountTreeController`.\n */\nexport function getDefaultAccountTreeControllerState(): AccountTreeControllerState {\n return {\n accountTree: {\n wallets: {},\n },\n };\n}\n\nexport class AccountTreeController extends BaseController<\n typeof controllerName,\n AccountTreeControllerState,\n AccountTreeControllerMessenger\n> {\n readonly #accountIdToContext: Map<AccountId, AccountContext>;\n\n readonly #rules: Rule[];\n\n readonly #categoryToRule: Record<AccountWalletCategory, Rule>;\n\n readonly #wallets: Map<AccountWalletId, AccountTreeWallet>;\n\n /**\n * Constructor for AccountTreeController.\n *\n * @param options - The controller options.\n * @param options.messenger - The messenger object.\n * @param options.state - Initial state to set on this controller\n */\n constructor({\n messenger,\n state,\n }: {\n messenger: AccountTreeControllerMessenger;\n state?: Partial<AccountTreeControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: accountTreeControllerMetadata,\n state: {\n ...getDefaultAccountTreeControllerState(),\n ...state,\n },\n });\n this.#wallets = new Map();\n\n // Reverse map to allow fast node access from an account ID.\n this.#accountIdToContext = new Map();\n\n // Rules to apply to construct the wallets tree.\n this.#categoryToRule = {\n [AccountWalletCategory.Entropy]: new EntropyRule(this.messagingSystem),\n [AccountWalletCategory.Snap]: new SnapRule(this.messagingSystem),\n [AccountWalletCategory.Keyring]: new KeyringRule(this.messagingSystem),\n } as const;\n this.#rules = [\n // 1. We group by entropy-source\n this.#categoryToRule[AccountWalletCategory.Entropy],\n // 2. We group by Snap ID\n this.#categoryToRule[AccountWalletCategory.Snap],\n // 3. We group by wallet type (this rule cannot fail and will group all non-matching accounts)\n this.#categoryToRule[AccountWalletCategory.Keyring],\n ];\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountAdded',\n (account) => {\n this.#handleAccountAdded(account);\n },\n );\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountRemoved',\n (accountId) => {\n this.#handleAccountRemoved(accountId);\n },\n );\n }\n\n init() {\n const wallets: AccountTreeControllerState['accountTree']['wallets'] = {};\n\n // For now, we always re-compute all wallets, we do not re-use the existing state.\n for (const account of this.#listAccounts()) {\n this.#insert(wallets, account);\n }\n\n // Once we have the account tree, we can compute the name.\n for (const wallet of Object.values(wallets)) {\n const walletInstance = this.getWallet(wallet.id);\n\n if (walletInstance) {\n if (wallet.metadata.name === '') {\n this.#renameAccountWallet(walletInstance, wallet);\n }\n\n for (const group of Object.values(wallet.groups)) {\n const groupInstance = walletInstance.getAccountGroup(group.id);\n\n if (groupInstance) {\n if (group.metadata.name === '') {\n this.#renameAccountGroup(groupInstance, group);\n }\n }\n }\n }\n }\n\n this.update((state) => {\n state.accountTree.wallets = wallets;\n });\n }\n\n #renameAccountWallet(\n wallet: AccountTreeWallet,\n walletObject: AccountWalletObject,\n ) {\n const rule = this.#categoryToRule[walletObject.category];\n walletObject.metadata.name = rule.getDefaultAccountWalletName(wallet);\n }\n\n #renameAccountGroup(\n group: AccountTreeGroup,\n groupObject: AccountGroupObject,\n ) {\n const rule = this.#categoryToRule[group.wallet.category];\n groupObject.metadata.name = rule.getDefaultAccountGroupName(group);\n }\n\n getWallet(id: AccountWalletId): AccountTreeWallet | undefined {\n return this.#wallets.get(id);\n }\n\n getWallets(): AccountTreeWallet[] {\n return Array.from(this.#wallets.values());\n }\n\n #handleAccountAdded(account: InternalAccount) {\n this.update((state) => {\n this.#insert(state.accountTree.wallets, account);\n\n const context = this.#accountIdToContext.get(account.id);\n if (context) {\n const { walletId, groupId } = context;\n\n const wallet = state.accountTree.wallets[walletId];\n if (wallet) {\n const walletInstance = this.getWallet(wallet.id);\n if (walletInstance) {\n if (wallet.metadata.name === '') {\n this.#renameAccountWallet(walletInstance, wallet);\n }\n\n const group = wallet.groups[groupId];\n if (group) {\n const groupInstance = walletInstance.getAccountGroup(group.id);\n if (groupInstance) {\n if (group.metadata.name === '') {\n this.#renameAccountGroup(groupInstance, group);\n }\n }\n }\n }\n }\n }\n });\n }\n\n #handleAccountRemoved(accountId: AccountId) {\n const context = this.#accountIdToContext.get(accountId);\n\n if (context) {\n const { walletId, groupId } = context;\n this.update((state) => {\n const { accounts } =\n state.accountTree.wallets[walletId].groups[groupId];\n\n const index = accounts.indexOf(accountId);\n if (index !== -1) {\n accounts.splice(index, 1);\n }\n });\n }\n }\n\n #insert(\n wallets: AccountTreeControllerState['accountTree']['wallets'],\n account: InternalAccount,\n ) {\n for (const rule of this.#rules) {\n const match = rule.match(account);\n\n if (!match) {\n // No match for that rule, we go to the next one.\n continue;\n }\n\n const { walletId, groupId } = match;\n\n // Update controller's state.\n let wallet = wallets[walletId];\n if (!wallet) {\n wallets[walletId] = {\n id: walletId,\n category: rule.category,\n groups: {},\n metadata: {\n name: '', // Will get updated later.\n },\n };\n wallet = wallets[walletId];\n }\n\n let group = wallet.groups[groupId];\n if (!group) {\n wallet.groups[groupId] = {\n id: groupId,\n accounts: [],\n metadata: {\n name: '', // Will get updated later.\n },\n };\n group = wallet.groups[groupId];\n }\n\n group.accounts.push(account.id);\n\n // Update in-memory wallet/group instances.\n this.#wallets.set(\n wallet.id,\n new AccountTreeWallet({ messenger: this.messagingSystem, wallet }),\n );\n\n // Update the reverse mapping for this account.\n this.#accountIdToContext.set(account.id, {\n walletId: wallet.id,\n groupId: group.id,\n });\n\n return;\n }\n }\n\n #listAccounts(): InternalAccount[] {\n return this.messagingSystem.call(\n 'AccountsController:listMultichainAccounts',\n );\n }\n}\n"]}
@@ -1,46 +1,28 @@
1
1
  "use strict";
2
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
- if (kind === "m") throw new TypeError("Private method is not writable");
4
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
- };
8
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
- 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");
11
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
- };
13
- var _EntropyRule_instances, _EntropyRule_entropySourcesToIndex, _EntropyRule_syncEntropySources;
14
2
  Object.defineProperty(exports, "__esModule", { value: true });
15
3
  exports.EntropyRule = void 0;
16
4
  const account_api_1 = require("@metamask/account-api");
17
5
  const keyring_api_1 = require("@metamask/keyring-api");
6
+ const keyring_controller_1 = require("@metamask/keyring-controller");
18
7
  const rule_1 = require("./rule.cjs");
19
- /**
20
- * Select keyrings from keyring controller state.
21
- *
22
- * @param state - The keyring controller state.
23
- * @returns The keyrings.
24
- */
25
- function selectKeyringControllerKeyrings(state) {
26
- return state.keyrings;
27
- }
28
8
  class EntropyRule extends rule_1.Rule {
29
- constructor(messenger) {
30
- super(messenger);
31
- _EntropyRule_instances.add(this);
9
+ constructor() {
10
+ super(...arguments);
32
11
  this.category = account_api_1.AccountWalletCategory.Entropy;
33
- _EntropyRule_entropySourcesToIndex.set(this, void 0);
34
- __classPrivateFieldSet(this, _EntropyRule_entropySourcesToIndex, new Map(), "f");
35
- __classPrivateFieldGet(this, _EntropyRule_instances, "m", _EntropyRule_syncEntropySources).call(this);
12
+ }
13
+ getEntropySourceIndex(entropySource) {
14
+ const { keyrings } = this.messenger.call('KeyringController:getState');
15
+ return keyrings
16
+ .filter((keyring) => keyring.type === keyring_controller_1.KeyringTypes.hd)
17
+ .findIndex((keyring) => keyring.metadata.id === entropySource);
36
18
  }
37
19
  match(account) {
38
20
  if (!(0, account_api_1.isBip44Account)(account)) {
39
21
  return undefined;
40
22
  }
41
23
  const entropySource = account.options.entropy.id;
42
- const entropySourceIndex = __classPrivateFieldGet(this, _EntropyRule_entropySourcesToIndex, "f").get(entropySource);
43
- if (entropySourceIndex === undefined) {
24
+ const entropySourceIndex = this.getEntropySourceIndex(entropySource);
25
+ if (entropySourceIndex === -1) {
44
26
  console.warn(`! Found an unknown entropy ID: "${entropySource}", account "${account.id}" won't be grouped by entropy.`);
45
27
  return undefined;
46
28
  }
@@ -56,7 +38,7 @@ class EntropyRule extends rule_1.Rule {
56
38
  // a BIP-44 account, so we can type-cast here.
57
39
  const account = wallet.getAnyAccount();
58
40
  const entropySource = account.options.entropy.id;
59
- const entropySourceIndex = __classPrivateFieldGet(this, _EntropyRule_entropySourcesToIndex, "f").get(entropySource); // This has to be defined, we checked it during the `match` above.
41
+ const entropySourceIndex = this.getEntropySourceIndex(entropySource); // This has to be defined, we checked it during the `match` above.
60
42
  return `Wallet ${entropySourceIndex + 1}`; // Use human indexing (starts at 1).
61
43
  }
62
44
  getDefaultAccountGroupName(group) {
@@ -72,12 +54,4 @@ class EntropyRule extends rule_1.Rule {
72
54
  }
73
55
  }
74
56
  exports.EntropyRule = EntropyRule;
75
- _EntropyRule_entropySourcesToIndex = new WeakMap(), _EntropyRule_instances = new WeakSet(), _EntropyRule_syncEntropySources = function _EntropyRule_syncEntropySources() {
76
- __classPrivateFieldGet(this, _EntropyRule_entropySourcesToIndex, "f").clear();
77
- const state = this.messenger.call('KeyringController:getState');
78
- state.keyrings.forEach((keyring, index) => __classPrivateFieldGet(this, _EntropyRule_entropySourcesToIndex, "f").set(keyring.metadata.id, index));
79
- this.messenger.subscribe('KeyringController:stateChange', (keyrings) => {
80
- keyrings.forEach((keyring, index) => __classPrivateFieldGet(this, _EntropyRule_entropySourcesToIndex, "f").set(keyring.metadata.id, index));
81
- }, selectKeyringControllerKeyrings);
82
- };
83
57
  //# sourceMappingURL=entropy.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"entropy.cjs","sourceRoot":"","sources":["../../src/rules/entropy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,uDAK+B;AAC/B,uDAA+E;AAI/E,qCAA8B;AAK9B;;;;;GAKG;AACH,SAAS,+BAA+B,CAAC,KAA6B;IACpE,OAAO,KAAK,CAAC,QAAQ,CAAC;AACxB,CAAC;AAED,MAAa,WAAY,SAAQ,WAAI;IAKnC,YAAY,SAAyC;QACnD,KAAK,CAAC,SAAS,CAAC,CAAC;;QALV,aAAQ,GAAG,mCAAqB,CAAC,OAAO,CAAC;QAEzC,qDAAqD;QAK5D,uBAAA,IAAI,sCAA0B,IAAI,GAAG,EAAE,MAAA,CAAC;QACxC,uBAAA,IAAI,+DAAoB,MAAxB,IAAI,CAAsB,CAAC;IAC7B,CAAC;IAqBD,KAAK,CAAC,OAAwB;QAC5B,IAAI,CAAC,IAAA,4BAAc,EAAC,OAAO,CAAC,EAAE;YAC5B,OAAO,SAAS,CAAC;SAClB;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,kBAAkB,GAAG,uBAAA,IAAI,0CAAuB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC1E,IAAI,kBAAkB,KAAK,SAAS,EAAE;YACpC,OAAO,CAAC,IAAI,CACV,mCAAmC,aAAa,eAAe,OAAO,CAAC,EAAE,gCAAgC,CAC1G,CAAC;YACF,OAAO,SAAS,CAAC;SAClB;QAED,MAAM,QAAQ,GAAG,IAAA,yCAA2B,EAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,IAAA,mCAAqB,EACnC,QAAQ,EACR,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CACnC,CAAC;QAEF,OAAO;YACL,QAAQ;YACR,OAAO;SACR,CAAC;IACJ,CAAC;IAED,2BAA2B,CAAC,MAAyB;QACnD,qEAAqE;QACrE,8CAA8C;QAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,EAAmC,CAAC;QAExE,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,kBAAkB,GAAG,uBAAA,IAAI,0CAAuB,CAAC,GAAG,CACxD,aAAa,CACJ,CAAC,CAAC,kEAAkE;QAE/E,OAAO,UAAU,kBAAkB,GAAG,CAAC,EAAE,CAAC,CAAC,oCAAoC;IACjF,CAAC;IAED,0BAA0B,CAAC,KAAuB;QAChD,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC3C,IAAA,8BAAgB,EAAC,OAAO,CAAC,IAAI,CAAC,CAC/B,CAAC;QACF,IAAI,UAAU,EAAE;YACd,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;SACjC;QAED,4EAA4E;QAC5E,6BAA6B;QAC7B,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;IACnC,CAAC;CACF;AApFD,kCAoFC;;IAvEG,uBAAA,IAAI,0CAAuB,CAAC,KAAK,EAAE,CAAC;IAEpC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAChE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CACxC,uBAAA,IAAI,0CAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAC5D,CAAC;IAEF,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,+BAA+B,EAC/B,CAAC,QAAQ,EAAE,EAAE;QACX,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAClC,uBAAA,IAAI,0CAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAC5D,CAAC;IACJ,CAAC,EACD,+BAA+B,CAChC,CAAC;AACJ,CAAC","sourcesContent":["import type { Bip44Account } from '@metamask/account-api';\nimport {\n AccountWalletCategory,\n isBip44Account,\n toMultichainAccountId,\n toMultichainAccountWalletId,\n} from '@metamask/account-api';\nimport { isEvmAccountType, type EntropySourceId } from '@metamask/keyring-api';\nimport type { KeyringControllerState } from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\n\nimport { Rule } from './rule';\nimport type { AccountTreeGroup, AccountTreeWallet } from '..';\nimport type { AccountTreeControllerMessenger } from '../AccountTreeController';\nimport type { AccountContext } from '../types';\n\n/**\n * Select keyrings from keyring controller state.\n *\n * @param state - The keyring controller state.\n * @returns The keyrings.\n */\nfunction selectKeyringControllerKeyrings(state: KeyringControllerState) {\n return state.keyrings;\n}\n\nexport class EntropyRule extends Rule {\n readonly category = AccountWalletCategory.Entropy;\n\n readonly #entropySourcesToIndex: Map<EntropySourceId, number>;\n\n constructor(messenger: AccountTreeControllerMessenger) {\n super(messenger);\n\n this.#entropySourcesToIndex = new Map();\n this.#syncEntropySources();\n }\n\n #syncEntropySources() {\n this.#entropySourcesToIndex.clear();\n\n const state = this.messenger.call('KeyringController:getState');\n state.keyrings.forEach((keyring, index) =>\n this.#entropySourcesToIndex.set(keyring.metadata.id, index),\n );\n\n this.messenger.subscribe(\n 'KeyringController:stateChange',\n (keyrings) => {\n keyrings.forEach((keyring, index) =>\n this.#entropySourcesToIndex.set(keyring.metadata.id, index),\n );\n },\n selectKeyringControllerKeyrings,\n );\n }\n\n match(account: InternalAccount): AccountContext | undefined {\n if (!isBip44Account(account)) {\n return undefined;\n }\n\n const entropySource = account.options.entropy.id;\n const entropySourceIndex = this.#entropySourcesToIndex.get(entropySource);\n if (entropySourceIndex === undefined) {\n console.warn(\n `! Found an unknown entropy ID: \"${entropySource}\", account \"${account.id}\" won't be grouped by entropy.`,\n );\n return undefined;\n }\n\n const walletId = toMultichainAccountWalletId(account.options.entropy.id);\n const groupId = toMultichainAccountId(\n walletId,\n account.options.entropy.groupIndex,\n );\n\n return {\n walletId,\n groupId,\n };\n }\n\n getDefaultAccountWalletName(wallet: AccountTreeWallet): string {\n // Precondition: This method is invoked only if there was a match for\n // a BIP-44 account, so we can type-cast here.\n const account = wallet.getAnyAccount() as Bip44Account<InternalAccount>;\n\n const entropySource = account.options.entropy.id;\n const entropySourceIndex = this.#entropySourcesToIndex.get(\n entropySource,\n ) as number; // This has to be defined, we checked it during the `match` above.\n\n return `Wallet ${entropySourceIndex + 1}`; // Use human indexing (starts at 1).\n }\n\n getDefaultAccountGroupName(group: AccountTreeGroup): string {\n // EVM account name has a highest priority.\n const accounts = group.getAccounts();\n const evmAccount = accounts.find((account) =>\n isEvmAccountType(account.type),\n );\n if (evmAccount) {\n return evmAccount.metadata.name;\n }\n\n // We should always have an account, since this function will be called only\n // if an account got a match.\n return accounts[0].metadata.name;\n }\n}\n"]}
1
+ {"version":3,"file":"entropy.cjs","sourceRoot":"","sources":["../../src/rules/entropy.ts"],"names":[],"mappings":";;;AACA,uDAK+B;AAC/B,uDAAyD;AACzD,qEAA4D;AAG5D,qCAA8B;AAI9B,MAAa,WAAY,SAAQ,WAAI;IAArC;;QACW,aAAQ,GAAG,mCAAqB,CAAC,OAAO,CAAC;IA+DpD,CAAC;IA7DC,qBAAqB,CAAC,aAAqB;QACzC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAEvE,OAAO,QAAQ;aACZ,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAM,iCAAY,CAAC,EAAa,CAAC;aACjE,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,aAAa,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,OAAwB;QAC5B,IAAI,CAAC,IAAA,4BAAc,EAAC,OAAO,CAAC,EAAE;YAC5B,OAAO,SAAS,CAAC;SAClB;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QACrE,IAAI,kBAAkB,KAAK,CAAC,CAAC,EAAE;YAC7B,OAAO,CAAC,IAAI,CACV,mCAAmC,aAAa,eAAe,OAAO,CAAC,EAAE,gCAAgC,CAC1G,CAAC;YACF,OAAO,SAAS,CAAC;SAClB;QAED,MAAM,QAAQ,GAAG,IAAA,yCAA2B,EAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,IAAA,mCAAqB,EACnC,QAAQ,EACR,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CACnC,CAAC;QAEF,OAAO;YACL,QAAQ;YACR,OAAO;SACR,CAAC;IACJ,CAAC;IAED,2BAA2B,CAAC,MAAyB;QACnD,qEAAqE;QACrE,8CAA8C;QAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,EAAmC,CAAC;QAExE,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CACnD,aAAa,CACJ,CAAC,CAAC,kEAAkE;QAE/E,OAAO,UAAU,kBAAkB,GAAG,CAAC,EAAE,CAAC,CAAC,oCAAoC;IACjF,CAAC;IAED,0BAA0B,CAAC,KAAuB;QAChD,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC3C,IAAA,8BAAgB,EAAC,OAAO,CAAC,IAAI,CAAC,CAC/B,CAAC;QACF,IAAI,UAAU,EAAE;YACd,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;SACjC;QAED,4EAA4E;QAC5E,6BAA6B;QAC7B,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;IACnC,CAAC;CACF;AAhED,kCAgEC","sourcesContent":["import type { Bip44Account } from '@metamask/account-api';\nimport {\n AccountWalletCategory,\n isBip44Account,\n toMultichainAccountId,\n toMultichainAccountWalletId,\n} from '@metamask/account-api';\nimport { isEvmAccountType } from '@metamask/keyring-api';\nimport { KeyringTypes } from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\n\nimport { Rule } from './rule';\nimport type { AccountTreeGroup, AccountTreeWallet } from '..';\nimport type { AccountContext } from '../types';\n\nexport class EntropyRule extends Rule {\n readonly category = AccountWalletCategory.Entropy;\n\n getEntropySourceIndex(entropySource: string) {\n const { keyrings } = this.messenger.call('KeyringController:getState');\n\n return keyrings\n .filter((keyring) => keyring.type === (KeyringTypes.hd as string))\n .findIndex((keyring) => keyring.metadata.id === entropySource);\n }\n\n match(account: InternalAccount): AccountContext | undefined {\n if (!isBip44Account(account)) {\n return undefined;\n }\n\n const entropySource = account.options.entropy.id;\n const entropySourceIndex = this.getEntropySourceIndex(entropySource);\n if (entropySourceIndex === -1) {\n console.warn(\n `! Found an unknown entropy ID: \"${entropySource}\", account \"${account.id}\" won't be grouped by entropy.`,\n );\n return undefined;\n }\n\n const walletId = toMultichainAccountWalletId(account.options.entropy.id);\n const groupId = toMultichainAccountId(\n walletId,\n account.options.entropy.groupIndex,\n );\n\n return {\n walletId,\n groupId,\n };\n }\n\n getDefaultAccountWalletName(wallet: AccountTreeWallet): string {\n // Precondition: This method is invoked only if there was a match for\n // a BIP-44 account, so we can type-cast here.\n const account = wallet.getAnyAccount() as Bip44Account<InternalAccount>;\n\n const entropySource = account.options.entropy.id;\n const entropySourceIndex = this.getEntropySourceIndex(\n entropySource,\n ) as number; // This has to be defined, we checked it during the `match` above.\n\n return `Wallet ${entropySourceIndex + 1}`; // Use human indexing (starts at 1).\n }\n\n getDefaultAccountGroupName(group: AccountTreeGroup): string {\n // EVM account name has a highest priority.\n const accounts = group.getAccounts();\n const evmAccount = accounts.find((account) =>\n isEvmAccountType(account.type),\n );\n if (evmAccount) {\n return evmAccount.metadata.name;\n }\n\n // We should always have an account, since this function will be called only\n // if an account got a match.\n return accounts[0].metadata.name;\n }\n}\n"]}
@@ -2,12 +2,10 @@ import { AccountWalletCategory } from "@metamask/account-api";
2
2
  import type { InternalAccount } from "@metamask/keyring-internal-api";
3
3
  import { Rule } from "./rule.cjs";
4
4
  import type { AccountTreeGroup, AccountTreeWallet } from "../index.cjs";
5
- import type { AccountTreeControllerMessenger } from "../AccountTreeController.cjs";
6
5
  import type { AccountContext } from "../types.cjs";
7
6
  export declare class EntropyRule extends Rule {
8
- #private;
9
7
  readonly category = AccountWalletCategory.Entropy;
10
- constructor(messenger: AccountTreeControllerMessenger);
8
+ getEntropySourceIndex(entropySource: string): number;
11
9
  match(account: InternalAccount): AccountContext | undefined;
12
10
  getDefaultAccountWalletName(wallet: AccountTreeWallet): string;
13
11
  getDefaultAccountGroupName(group: AccountTreeGroup): string;
@@ -1 +1 @@
1
- {"version":3,"file":"entropy.d.cts","sourceRoot":"","sources":["../../src/rules/entropy.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EAItB,8BAA8B;AAG/B,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AAEtE,OAAO,EAAE,IAAI,EAAE,mBAAe;AAC9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,qBAAW;AAC9D,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAiB;AAY/C,qBAAa,WAAY,SAAQ,IAAI;;IACnC,QAAQ,CAAC,QAAQ,iCAAiC;gBAItC,SAAS,EAAE,8BAA8B;IA0BrD,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,GAAG,SAAS;IA0B3D,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM;IAa9D,0BAA0B,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM;CAc5D"}
1
+ {"version":3,"file":"entropy.d.cts","sourceRoot":"","sources":["../../src/rules/entropy.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EAItB,8BAA8B;AAG/B,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AAEtE,OAAO,EAAE,IAAI,EAAE,mBAAe;AAC9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,qBAAW;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAiB;AAE/C,qBAAa,WAAY,SAAQ,IAAI;IACnC,QAAQ,CAAC,QAAQ,iCAAiC;IAElD,qBAAqB,CAAC,aAAa,EAAE,MAAM;IAQ3C,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,GAAG,SAAS;IA0B3D,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM;IAa9D,0BAA0B,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM;CAc5D"}
@@ -2,12 +2,10 @@ import { AccountWalletCategory } from "@metamask/account-api";
2
2
  import type { InternalAccount } from "@metamask/keyring-internal-api";
3
3
  import { Rule } from "./rule.mjs";
4
4
  import type { AccountTreeGroup, AccountTreeWallet } from "../index.mjs";
5
- import type { AccountTreeControllerMessenger } from "../AccountTreeController.mjs";
6
5
  import type { AccountContext } from "../types.mjs";
7
6
  export declare class EntropyRule extends Rule {
8
- #private;
9
7
  readonly category = AccountWalletCategory.Entropy;
10
- constructor(messenger: AccountTreeControllerMessenger);
8
+ getEntropySourceIndex(entropySource: string): number;
11
9
  match(account: InternalAccount): AccountContext | undefined;
12
10
  getDefaultAccountWalletName(wallet: AccountTreeWallet): string;
13
11
  getDefaultAccountGroupName(group: AccountTreeGroup): string;
@@ -1 +1 @@
1
- {"version":3,"file":"entropy.d.mts","sourceRoot":"","sources":["../../src/rules/entropy.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EAItB,8BAA8B;AAG/B,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AAEtE,OAAO,EAAE,IAAI,EAAE,mBAAe;AAC9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,qBAAW;AAC9D,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAiB;AAY/C,qBAAa,WAAY,SAAQ,IAAI;;IACnC,QAAQ,CAAC,QAAQ,iCAAiC;gBAItC,SAAS,EAAE,8BAA8B;IA0BrD,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,GAAG,SAAS;IA0B3D,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM;IAa9D,0BAA0B,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM;CAc5D"}
1
+ {"version":3,"file":"entropy.d.mts","sourceRoot":"","sources":["../../src/rules/entropy.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EAItB,8BAA8B;AAG/B,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AAEtE,OAAO,EAAE,IAAI,EAAE,mBAAe;AAC9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,qBAAW;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAiB;AAE/C,qBAAa,WAAY,SAAQ,IAAI;IACnC,QAAQ,CAAC,QAAQ,iCAAiC;IAElD,qBAAqB,CAAC,aAAa,EAAE,MAAM;IAQ3C,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,GAAG,SAAS;IA0B3D,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM;IAa9D,0BAA0B,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM;CAc5D"}
@@ -1,43 +1,25 @@
1
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
- if (kind === "m") throw new TypeError("Private method is not writable");
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
- };
7
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
- };
12
- var _EntropyRule_instances, _EntropyRule_entropySourcesToIndex, _EntropyRule_syncEntropySources;
13
1
  import { AccountWalletCategory, isBip44Account, toMultichainAccountId, toMultichainAccountWalletId } from "@metamask/account-api";
14
2
  import { isEvmAccountType } from "@metamask/keyring-api";
3
+ import { KeyringTypes } from "@metamask/keyring-controller";
15
4
  import { Rule } from "./rule.mjs";
16
- /**
17
- * Select keyrings from keyring controller state.
18
- *
19
- * @param state - The keyring controller state.
20
- * @returns The keyrings.
21
- */
22
- function selectKeyringControllerKeyrings(state) {
23
- return state.keyrings;
24
- }
25
5
  export class EntropyRule extends Rule {
26
- constructor(messenger) {
27
- super(messenger);
28
- _EntropyRule_instances.add(this);
6
+ constructor() {
7
+ super(...arguments);
29
8
  this.category = AccountWalletCategory.Entropy;
30
- _EntropyRule_entropySourcesToIndex.set(this, void 0);
31
- __classPrivateFieldSet(this, _EntropyRule_entropySourcesToIndex, new Map(), "f");
32
- __classPrivateFieldGet(this, _EntropyRule_instances, "m", _EntropyRule_syncEntropySources).call(this);
9
+ }
10
+ getEntropySourceIndex(entropySource) {
11
+ const { keyrings } = this.messenger.call('KeyringController:getState');
12
+ return keyrings
13
+ .filter((keyring) => keyring.type === KeyringTypes.hd)
14
+ .findIndex((keyring) => keyring.metadata.id === entropySource);
33
15
  }
34
16
  match(account) {
35
17
  if (!isBip44Account(account)) {
36
18
  return undefined;
37
19
  }
38
20
  const entropySource = account.options.entropy.id;
39
- const entropySourceIndex = __classPrivateFieldGet(this, _EntropyRule_entropySourcesToIndex, "f").get(entropySource);
40
- if (entropySourceIndex === undefined) {
21
+ const entropySourceIndex = this.getEntropySourceIndex(entropySource);
22
+ if (entropySourceIndex === -1) {
41
23
  console.warn(`! Found an unknown entropy ID: "${entropySource}", account "${account.id}" won't be grouped by entropy.`);
42
24
  return undefined;
43
25
  }
@@ -53,7 +35,7 @@ export class EntropyRule extends Rule {
53
35
  // a BIP-44 account, so we can type-cast here.
54
36
  const account = wallet.getAnyAccount();
55
37
  const entropySource = account.options.entropy.id;
56
- const entropySourceIndex = __classPrivateFieldGet(this, _EntropyRule_entropySourcesToIndex, "f").get(entropySource); // This has to be defined, we checked it during the `match` above.
38
+ const entropySourceIndex = this.getEntropySourceIndex(entropySource); // This has to be defined, we checked it during the `match` above.
57
39
  return `Wallet ${entropySourceIndex + 1}`; // Use human indexing (starts at 1).
58
40
  }
59
41
  getDefaultAccountGroupName(group) {
@@ -68,12 +50,4 @@ export class EntropyRule extends Rule {
68
50
  return accounts[0].metadata.name;
69
51
  }
70
52
  }
71
- _EntropyRule_entropySourcesToIndex = new WeakMap(), _EntropyRule_instances = new WeakSet(), _EntropyRule_syncEntropySources = function _EntropyRule_syncEntropySources() {
72
- __classPrivateFieldGet(this, _EntropyRule_entropySourcesToIndex, "f").clear();
73
- const state = this.messenger.call('KeyringController:getState');
74
- state.keyrings.forEach((keyring, index) => __classPrivateFieldGet(this, _EntropyRule_entropySourcesToIndex, "f").set(keyring.metadata.id, index));
75
- this.messenger.subscribe('KeyringController:stateChange', (keyrings) => {
76
- keyrings.forEach((keyring, index) => __classPrivateFieldGet(this, _EntropyRule_entropySourcesToIndex, "f").set(keyring.metadata.id, index));
77
- }, selectKeyringControllerKeyrings);
78
- };
79
53
  //# sourceMappingURL=entropy.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"entropy.mjs","sourceRoot":"","sources":["../../src/rules/entropy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Bip44Account } from '@metamask/account-api';\nimport {\n AccountWalletCategory,\n isBip44Account,\n toMultichainAccountId,\n toMultichainAccountWalletId,\n} from '@metamask/account-api';\nimport { isEvmAccountType, type EntropySourceId } from '@metamask/keyring-api';\nimport type { KeyringControllerState } from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\n\nimport { Rule } from './rule';\nimport type { AccountTreeGroup, AccountTreeWallet } from '..';\nimport type { AccountTreeControllerMessenger } from '../AccountTreeController';\nimport type { AccountContext } from '../types';\n\n/**\n * Select keyrings from keyring controller state.\n *\n * @param state - The keyring controller state.\n * @returns The keyrings.\n */\nfunction selectKeyringControllerKeyrings(state: KeyringControllerState) {\n return state.keyrings;\n}\n\nexport class EntropyRule extends Rule {\n readonly category = AccountWalletCategory.Entropy;\n\n readonly #entropySourcesToIndex: Map<EntropySourceId, number>;\n\n constructor(messenger: AccountTreeControllerMessenger) {\n super(messenger);\n\n this.#entropySourcesToIndex = new Map();\n this.#syncEntropySources();\n }\n\n #syncEntropySources() {\n this.#entropySourcesToIndex.clear();\n\n const state = this.messenger.call('KeyringController:getState');\n state.keyrings.forEach((keyring, index) =>\n this.#entropySourcesToIndex.set(keyring.metadata.id, index),\n );\n\n this.messenger.subscribe(\n 'KeyringController:stateChange',\n (keyrings) => {\n keyrings.forEach((keyring, index) =>\n this.#entropySourcesToIndex.set(keyring.metadata.id, index),\n );\n },\n selectKeyringControllerKeyrings,\n );\n }\n\n match(account: InternalAccount): AccountContext | undefined {\n if (!isBip44Account(account)) {\n return undefined;\n }\n\n const entropySource = account.options.entropy.id;\n const entropySourceIndex = this.#entropySourcesToIndex.get(entropySource);\n if (entropySourceIndex === undefined) {\n console.warn(\n `! Found an unknown entropy ID: \"${entropySource}\", account \"${account.id}\" won't be grouped by entropy.`,\n );\n return undefined;\n }\n\n const walletId = toMultichainAccountWalletId(account.options.entropy.id);\n const groupId = toMultichainAccountId(\n walletId,\n account.options.entropy.groupIndex,\n );\n\n return {\n walletId,\n groupId,\n };\n }\n\n getDefaultAccountWalletName(wallet: AccountTreeWallet): string {\n // Precondition: This method is invoked only if there was a match for\n // a BIP-44 account, so we can type-cast here.\n const account = wallet.getAnyAccount() as Bip44Account<InternalAccount>;\n\n const entropySource = account.options.entropy.id;\n const entropySourceIndex = this.#entropySourcesToIndex.get(\n entropySource,\n ) as number; // This has to be defined, we checked it during the `match` above.\n\n return `Wallet ${entropySourceIndex + 1}`; // Use human indexing (starts at 1).\n }\n\n getDefaultAccountGroupName(group: AccountTreeGroup): string {\n // EVM account name has a highest priority.\n const accounts = group.getAccounts();\n const evmAccount = accounts.find((account) =>\n isEvmAccountType(account.type),\n );\n if (evmAccount) {\n return evmAccount.metadata.name;\n }\n\n // We should always have an account, since this function will be called only\n // if an account got a match.\n return accounts[0].metadata.name;\n }\n}\n"]}
1
+ {"version":3,"file":"entropy.mjs","sourceRoot":"","sources":["../../src/rules/entropy.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,2BAA2B,EAC5B,8BAA8B;AAC/B,OAAO,EAAE,gBAAgB,EAAE,8BAA8B;AACzD,OAAO,EAAE,YAAY,EAAE,qCAAqC;AAG5D,OAAO,EAAE,IAAI,EAAE,mBAAe;AAI9B,MAAM,OAAO,WAAY,SAAQ,IAAI;IAArC;;QACW,aAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC;IA+DpD,CAAC;IA7DC,qBAAqB,CAAC,aAAqB;QACzC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAEvE,OAAO,QAAQ;aACZ,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAM,YAAY,CAAC,EAAa,CAAC;aACjE,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,aAAa,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,OAAwB;QAC5B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;YAC5B,OAAO,SAAS,CAAC;SAClB;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QACrE,IAAI,kBAAkB,KAAK,CAAC,CAAC,EAAE;YAC7B,OAAO,CAAC,IAAI,CACV,mCAAmC,aAAa,eAAe,OAAO,CAAC,EAAE,gCAAgC,CAC1G,CAAC;YACF,OAAO,SAAS,CAAC;SAClB;QAED,MAAM,QAAQ,GAAG,2BAA2B,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,qBAAqB,CACnC,QAAQ,EACR,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CACnC,CAAC;QAEF,OAAO;YACL,QAAQ;YACR,OAAO;SACR,CAAC;IACJ,CAAC;IAED,2BAA2B,CAAC,MAAyB;QACnD,qEAAqE;QACrE,8CAA8C;QAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,EAAmC,CAAC;QAExE,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CACnD,aAAa,CACJ,CAAC,CAAC,kEAAkE;QAE/E,OAAO,UAAU,kBAAkB,GAAG,CAAC,EAAE,CAAC,CAAC,oCAAoC;IACjF,CAAC;IAED,0BAA0B,CAAC,KAAuB;QAChD,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC3C,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAC/B,CAAC;QACF,IAAI,UAAU,EAAE;YACd,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;SACjC;QAED,4EAA4E;QAC5E,6BAA6B;QAC7B,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;IACnC,CAAC;CACF","sourcesContent":["import type { Bip44Account } from '@metamask/account-api';\nimport {\n AccountWalletCategory,\n isBip44Account,\n toMultichainAccountId,\n toMultichainAccountWalletId,\n} from '@metamask/account-api';\nimport { isEvmAccountType } from '@metamask/keyring-api';\nimport { KeyringTypes } from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\n\nimport { Rule } from './rule';\nimport type { AccountTreeGroup, AccountTreeWallet } from '..';\nimport type { AccountContext } from '../types';\n\nexport class EntropyRule extends Rule {\n readonly category = AccountWalletCategory.Entropy;\n\n getEntropySourceIndex(entropySource: string) {\n const { keyrings } = this.messenger.call('KeyringController:getState');\n\n return keyrings\n .filter((keyring) => keyring.type === (KeyringTypes.hd as string))\n .findIndex((keyring) => keyring.metadata.id === entropySource);\n }\n\n match(account: InternalAccount): AccountContext | undefined {\n if (!isBip44Account(account)) {\n return undefined;\n }\n\n const entropySource = account.options.entropy.id;\n const entropySourceIndex = this.getEntropySourceIndex(entropySource);\n if (entropySourceIndex === -1) {\n console.warn(\n `! Found an unknown entropy ID: \"${entropySource}\", account \"${account.id}\" won't be grouped by entropy.`,\n );\n return undefined;\n }\n\n const walletId = toMultichainAccountWalletId(account.options.entropy.id);\n const groupId = toMultichainAccountId(\n walletId,\n account.options.entropy.groupIndex,\n );\n\n return {\n walletId,\n groupId,\n };\n }\n\n getDefaultAccountWalletName(wallet: AccountTreeWallet): string {\n // Precondition: This method is invoked only if there was a match for\n // a BIP-44 account, so we can type-cast here.\n const account = wallet.getAnyAccount() as Bip44Account<InternalAccount>;\n\n const entropySource = account.options.entropy.id;\n const entropySourceIndex = this.getEntropySourceIndex(\n entropySource,\n ) as number; // This has to be defined, we checked it during the `match` above.\n\n return `Wallet ${entropySourceIndex + 1}`; // Use human indexing (starts at 1).\n }\n\n getDefaultAccountGroupName(group: AccountTreeGroup): string {\n // EVM account name has a highest priority.\n const accounts = group.getAccounts();\n const evmAccount = accounts.find((account) =>\n isEvmAccountType(account.type),\n );\n if (evmAccount) {\n return evmAccount.metadata.name;\n }\n\n // We should always have an account, since this function will be called only\n // if an account got a match.\n return accounts[0].metadata.name;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/account-tree-controller",
3
- "version": "0.6.0-preview-9b5151c",
3
+ "version": "0.6.0-preview-ed2a2e6",
4
4
  "description": "Controller to group account together based on some pre-defined rules",
5
5
  "keywords": [
6
6
  "MetaMask",