@metamask-previews/account-api 0.1.0-6199101 → 0.1.0-e86c8ec

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 (63) hide show
  1. package/dist/api/group.cjs.map +1 -1
  2. package/dist/api/group.d.cts +4 -5
  3. package/dist/api/group.d.cts.map +1 -1
  4. package/dist/api/group.d.mts +4 -5
  5. package/dist/api/group.d.mts.map +1 -1
  6. package/dist/api/group.mjs.map +1 -1
  7. package/dist/api/index.cjs.map +1 -1
  8. package/dist/api/index.d.cts +2 -0
  9. package/dist/api/index.d.cts.map +1 -1
  10. package/dist/api/index.d.mts +2 -0
  11. package/dist/api/index.d.mts.map +1 -1
  12. package/dist/api/index.mjs.map +1 -1
  13. package/dist/api/multichain/account.cjs +99 -48
  14. package/dist/api/multichain/account.cjs.map +1 -1
  15. package/dist/api/multichain/account.d.cts +46 -62
  16. package/dist/api/multichain/account.d.cts.map +1 -1
  17. package/dist/api/multichain/account.d.mts +46 -62
  18. package/dist/api/multichain/account.d.mts.map +1 -1
  19. package/dist/api/multichain/account.mjs +95 -45
  20. package/dist/api/multichain/account.mjs.map +1 -1
  21. package/dist/api/multichain/index.cjs.map +1 -1
  22. package/dist/api/multichain/index.d.cts +0 -1
  23. package/dist/api/multichain/index.d.cts.map +1 -1
  24. package/dist/api/multichain/index.d.mts +0 -1
  25. package/dist/api/multichain/index.d.mts.map +1 -1
  26. package/dist/api/multichain/index.mjs.map +1 -1
  27. package/dist/api/multichain/wallet.cjs +104 -38
  28. package/dist/api/multichain/wallet.cjs.map +1 -1
  29. package/dist/api/multichain/wallet.d.cts +48 -23
  30. package/dist/api/multichain/wallet.d.cts.map +1 -1
  31. package/dist/api/multichain/wallet.d.mts +48 -23
  32. package/dist/api/multichain/wallet.d.mts.map +1 -1
  33. package/dist/api/multichain/wallet.mjs +103 -37
  34. package/dist/api/multichain/wallet.mjs.map +1 -1
  35. package/dist/api/provider.cjs.map +1 -0
  36. package/dist/api/provider.d.cts +13 -0
  37. package/dist/api/provider.d.cts.map +1 -0
  38. package/dist/api/provider.d.mts +13 -0
  39. package/dist/api/provider.d.mts.map +1 -0
  40. package/dist/api/provider.mjs.map +1 -0
  41. package/dist/api/selector.cjs +3 -0
  42. package/dist/api/selector.cjs.map +1 -0
  43. package/dist/api/selector.d.cts +27 -0
  44. package/dist/api/selector.d.cts.map +1 -0
  45. package/dist/api/selector.d.mts +27 -0
  46. package/dist/api/selector.d.mts.map +1 -0
  47. package/dist/api/selector.mjs +2 -0
  48. package/dist/api/selector.mjs.map +1 -0
  49. package/dist/api/wallet.cjs.map +1 -1
  50. package/dist/api/wallet.d.cts +1 -0
  51. package/dist/api/wallet.d.cts.map +1 -1
  52. package/dist/api/wallet.d.mts +1 -0
  53. package/dist/api/wallet.d.mts.map +1 -1
  54. package/dist/api/wallet.mjs.map +1 -1
  55. package/package.json +1 -1
  56. package/dist/api/multichain/provider.cjs.map +0 -1
  57. package/dist/api/multichain/provider.d.cts +0 -29
  58. package/dist/api/multichain/provider.d.cts.map +0 -1
  59. package/dist/api/multichain/provider.d.mts +0 -29
  60. package/dist/api/multichain/provider.d.mts.map +0 -1
  61. package/dist/api/multichain/provider.mjs.map +0 -1
  62. /package/dist/api/{multichain/provider.cjs → provider.cjs} +0 -0
  63. /package/dist/api/{multichain/provider.mjs → provider.mjs} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"wallet.cjs","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAoJA,kEAIC;AAtJD,2CAImB;AAGnB,wCAAmD;AAEnD,0CAAkD;AAyClD,MAAa,8BAA8B;IAWzC,YAAY,EACV,SAAS,EACT,aAAa,GAId;QAdQ,qDAA+B;QAE/B,4DAAiD;QAEjD,gEAAgC;QAEhC,2DAAmD;QAS1D,uBAAA,IAAI,sCAAO,2BAA2B,CAAC,aAAa,CAAC,MAAA,CAAC;QACtD,uBAAA,IAAI,6CAAc,SAAS,MAAA,CAAC;QAC5B,uBAAA,IAAI,iDAAkB,aAAa,MAAA,CAAC;QACpC,uBAAA,IAAI,4CAAa,IAAI,GAAG,EAAE,MAAA,CAAC;QAE3B,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,yFAAyF;QACzF,kFAAkF;QAClF,EAAE;QACF,mFAAmF;QACnF,kDAAkD;QAClD,GAAG,CAAC;YACF,MAAM,iBAAiB,GAAG,IAAI,kCAAwB,CAAC;gBACrD,UAAU;gBACV,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,uBAAA,IAAI,iDAAW;aAC3B,CAAC,CAAC;YAEH,+DAA+D;YAC/D,WAAW,GAAG,iBAAiB,CAAC,WAAW,EAAE,CAAC;YAC9C,IAAI,WAAW,EAAE,CAAC;gBAChB,uBAAA,IAAI,gDAAU,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;YACpD,CAAC;YAED,UAAU,IAAI,CAAC,CAAC;QAClB,CAAC,QAAQ,WAAW,EAAE;IACxB,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,uBAAA,IAAI,0CAAI,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,8BAAqB,CAAC,OAAO,CAAC;IACvC,CAAC;IAED,IAAI,aAAa;QACf,OAAO,uBAAA,IAAI,qDAAe,CAAC;IAC7B,CAAC;IAED,eAAe,CACb,OAAuB;QAEvB,0DAA0D;QAC1D,IAAI,OAAO,KAAK,IAAA,+BAAuB,EAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACjD,OAAO,uBAAA,IAAI,gDAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,UAAU,GAAG,IAAA,yCAA+B,EAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,uBAAA,IAAI,gDAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACtC,CAAC;IAED,oBAAoB,CAClB,UAAkB;QAElB,OAAO,uBAAA,IAAI,gDAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,qBAAqB;QACnB,OAAO,KAAK,CAAC,IAAI,CAAC,uBAAA,IAAI,gDAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,2BAA2B;IACzE,CAAC;CACF;AAxFD,wEAwFC;;AAED;;;;;GAKG;AACH,SAAgB,2BAA2B,CACzC,aAA8B;IAE9B,OAAO,GAAG,8BAAqB,CAAC,OAAO,IAAI,aAAa,EAAE,CAAC;AAC7D,CAAC","sourcesContent":["import type { EntropySourceId, KeyringAccount } from '@metamask/keyring-api';\n\nimport {\n getGroupIndexFromAccountGroupId,\n MultichainAccountAdapter,\n type MultichainAccount,\n} from './account';\nimport type { MultichainAccountProvider } from './provider';\nimport type { AccountGroupId } from '../group';\nimport { toDefaultAccountGroupId } from '../group';\nimport type { AccountWallet } from '../wallet';\nimport { AccountWalletCategory } from '../wallet';\n\n/**\n * Multichain account wallet ID.\n */\nexport type MultichainAccountWalletId =\n `${AccountWalletCategory.Entropy}:${EntropySourceId}`;\n\n/**\n * A multichain account wallet that holds multiple multichain accounts (one multichain account per\n * group index).\n */\nexport type MultichainAccountWallet<Account extends KeyringAccount> =\n AccountWallet<Account> & {\n /**\n * Multichain account wallet ID.\n */\n get id(): MultichainAccountWalletId;\n\n /**\n * Multichain account wallet entropy source.\n */\n get entropySource(): EntropySourceId;\n\n /**\n * Gets multichain account for a given index.\n *\n * @returns Multichain accounts.\n */\n getMultichainAccount(\n groupIndex: number,\n ): MultichainAccount<Account> | undefined;\n\n /**\n * Gets multichain accounts.\n *\n * @returns Multichain accounts.\n */\n getMultichainAccounts(): MultichainAccount<Account>[];\n };\n\nexport class MultichainAccountWalletAdapter<Account extends KeyringAccount>\n implements MultichainAccountWallet<Account>\n{\n readonly #id: MultichainAccountWalletId;\n\n readonly #providers: MultichainAccountProvider<Account>[];\n\n readonly #entropySource: EntropySourceId;\n\n readonly #accounts: Map<number, MultichainAccount<Account>>;\n\n constructor({\n providers,\n entropySource,\n }: {\n providers: MultichainAccountProvider<Account>[];\n entropySource: EntropySourceId;\n }) {\n this.#id = toMultichainAccountWalletId(entropySource);\n this.#providers = providers;\n this.#entropySource = entropySource;\n this.#accounts = new Map();\n\n let groupIndex = 0;\n let hasAccounts = false;\n\n // NOTE: We do not allow any gap for now. So if we have accounts for index 0 and index 2,\n // then this logic will stop at index 1, given that no account will be \"provided\".\n //\n // QUESTION: Should we a hard limit to the `groupIndex` to avoid having an infinite\n // loop here in case one of the provider is buggy?\n do {\n const multichainAccount = new MultichainAccountAdapter({\n groupIndex,\n wallet: this,\n providers: this.#providers,\n });\n\n // We only add multichain account that has underlying accounts.\n hasAccounts = multichainAccount.hasAccounts();\n if (hasAccounts) {\n this.#accounts.set(groupIndex, multichainAccount);\n }\n\n groupIndex += 1;\n } while (hasAccounts);\n }\n\n get id(): MultichainAccountWalletId {\n return this.#id;\n }\n\n get category(): AccountWalletCategory.Entropy {\n return AccountWalletCategory.Entropy;\n }\n\n get entropySource(): EntropySourceId {\n return this.#entropySource;\n }\n\n getAccountGroup(\n groupId: AccountGroupId,\n ): MultichainAccount<Account> | undefined {\n // We consider the \"default case\" to be mapped to index 0.\n if (groupId === toDefaultAccountGroupId(this.id)) {\n return this.#accounts.get(0);\n }\n\n const groupIndex = getGroupIndexFromAccountGroupId(groupId);\n if (groupIndex === undefined) {\n return undefined;\n }\n return this.#accounts.get(groupIndex);\n }\n\n getAccountGroups(): MultichainAccount<Account>[] {\n return this.getMultichainAccounts();\n }\n\n getMultichainAccount(\n groupIndex: number,\n ): MultichainAccount<Account> | undefined {\n return this.#accounts.get(groupIndex);\n }\n\n getMultichainAccounts(): MultichainAccount<Account>[] {\n return Array.from(this.#accounts.values()); // TODO: Prevent copy here.\n }\n}\n\n/**\n * Gets the multichain account wallet ID from its entropy source.\n *\n * @param entropySource - Entropy source ID of that wallet.\n * @returns The multichain account wallet ID.\n */\nexport function toMultichainAccountWalletId(\n entropySource: EntropySourceId,\n): MultichainAccountWalletId {\n return `${AccountWalletCategory.Entropy}:${entropySource}`;\n}\n"]}
1
+ {"version":3,"file":"wallet.cjs","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n KeyringAccountEntropyTypeOption,\n type EntropySourceId,\n type KeyringAccount,\n} from '@metamask/keyring-api';\n\nimport {\n getGroupIndexFromMultichainAccountId,\n isMultichainAccountId,\n MultichainAccount,\n} from './account';\nimport type { AccountGroupId } from '../group';\nimport { toDefaultAccountGroupId } from '../group';\nimport type { AccountProvider } from '../provider';\nimport type { AccountWallet } from '../wallet';\nimport { AccountWalletCategory } from '../wallet';\n\n/**\n * Multichain account wallet ID.\n */\nexport type MultichainAccountWalletId =\n `${AccountWalletCategory.Entropy}:${EntropySourceId}`;\n\n/**\n * A multichain account wallet that holds multiple multichain accounts (one multichain account per\n * group index).\n */\nexport class MultichainAccountWallet<Account extends KeyringAccount>\n implements AccountWallet<Account>\n{\n readonly #id: MultichainAccountWalletId;\n\n readonly #providers: AccountProvider<Account>[];\n\n readonly #entropySource: EntropySourceId;\n\n readonly #accounts: Map<number, MultichainAccount<Account>>;\n\n constructor({\n providers,\n entropySource,\n }: {\n providers: AccountProvider<Account>[];\n entropySource: EntropySourceId;\n }) {\n this.#id = toMultichainAccountWalletId(entropySource);\n this.#providers = providers;\n this.#entropySource = entropySource;\n this.#accounts = new Map();\n\n // NOTE: This will traverse all accounts to compute the max index. We could try\n // to minimize the number of filtering we're doing on each providers if this\n // becomes too costly.\n const maxGroupIndex = MultichainAccountWallet.getHighestGroupIndexFrom(\n providers,\n entropySource,\n );\n\n // NOTE: We could have some gap for now, until we fully implement the\n // gap/alignment mechanisms to backfill all \"missing accounts\".\n for (let groupIndex = 0; groupIndex <= maxGroupIndex; groupIndex++) {\n // Use \"lower or equal\", since we need to \"include\" the max index (which\n // can also be 0)\n const multichainAccount = new MultichainAccount<Account>({\n groupIndex,\n wallet: this,\n providers: this.#providers,\n });\n\n // We only add multichain account that has underlying accounts.\n if (multichainAccount.hasAccounts()) {\n this.#accounts.set(groupIndex, multichainAccount);\n }\n }\n }\n\n /**\n * Gets the highest group index from multiple account providers for a given\n * entropy source.\n *\n * @param providers - Account providers.\n * @param entropySource - Entropy source to filter on.\n * @returns The highest group index for a given entropy source.\n */\n static getHighestGroupIndexFrom<Account extends KeyringAccount>(\n providers: AccountProvider<Account>[],\n entropySource: EntropySourceId,\n ): number {\n let max = -1;\n\n for (const provider of providers) {\n for (const account of provider.getAccounts()) {\n if (\n account.options.entropy &&\n account.options.entropy.type ===\n KeyringAccountEntropyTypeOption.Mnemonic &&\n account.options.entropy.id === entropySource\n ) {\n max = Math.max(max, account.options.entropy.groupIndex);\n }\n }\n }\n\n return max;\n }\n\n /**\n * Gets the multichain account wallet ID.\n *\n * @returns The multichain account wallet ID.\n */\n get id(): MultichainAccountWalletId {\n return this.#id;\n }\n\n /**\n * Gets the multichain account wallet category, which is always {@link AccountWalletCategory.Entropy}.\n *\n * @returns The multichain account wallet category.\n */\n get category(): AccountWalletCategory.Entropy {\n return AccountWalletCategory.Entropy;\n }\n\n /**\n * Gets the multichain account wallet entropy source.\n *\n * @returns The multichain account wallet entropy source.\n */\n get entropySource(): EntropySourceId {\n return this.#entropySource;\n }\n\n /**\n * Gets multichain account for a given ID.\n * The default group ID will default to the multichain account with index 0.\n *\n * @param id - Account group ID.\n * @returns Account group.\n */\n getAccountGroup(id: AccountGroupId): MultichainAccount<Account> | undefined {\n // We consider the \"default case\" to be mapped to index 0.\n if (id === toDefaultAccountGroupId(this.id)) {\n return this.#accounts.get(0);\n }\n\n // If it is not a valid ID, we cannot extract the group index\n // from it, so we fail fast.\n if (!isMultichainAccountId(id)) {\n return undefined;\n }\n\n const groupIndex = getGroupIndexFromMultichainAccountId(id);\n return this.#accounts.get(groupIndex);\n }\n\n /**\n * Gets all multichain accounts. Similar to {@link MultichainAccountWallet.getMultichainAccounts}.\n *\n * @returns The multichain accounts.\n */\n getAccountGroups(): MultichainAccount<Account>[] {\n return this.getMultichainAccounts();\n }\n\n /**\n * Gets multichain account for a given index.\n *\n * @param groupIndex - Multichain account index.\n * @returns The multichain account associated with the given index.\n */\n getMultichainAccount(\n groupIndex: number,\n ): MultichainAccount<Account> | undefined {\n return this.#accounts.get(groupIndex);\n }\n\n /**\n * Gets all multichain accounts.\n *\n * @returns The multichain accounts.\n */\n getMultichainAccounts(): MultichainAccount<Account>[] {\n return Array.from(this.#accounts.values()); // TODO: Prevent copy here.\n }\n}\n\n/**\n * Gets the multichain account wallet ID from its entropy source.\n *\n * @param entropySource - Entropy source ID of that wallet.\n * @returns The multichain account wallet ID.\n */\nexport function toMultichainAccountWalletId(\n entropySource: EntropySourceId,\n): MultichainAccountWalletId {\n return `${AccountWalletCategory.Entropy}:${entropySource}`;\n}\n"]}
@@ -1,7 +1,7 @@
1
- import type { EntropySourceId, KeyringAccount } from "@metamask/keyring-api";
2
- import { type MultichainAccount } from "./account.cjs";
3
- import type { MultichainAccountProvider } from "./provider.cjs";
1
+ import { type EntropySourceId, type KeyringAccount } from "@metamask/keyring-api";
2
+ import { MultichainAccount } from "./account.cjs";
4
3
  import type { AccountGroupId } from "../group.cjs";
4
+ import type { AccountProvider } from "../provider.cjs";
5
5
  import type { AccountWallet } from "../wallet.cjs";
6
6
  import { AccountWalletCategory } from "../wallet.cjs";
7
7
  /**
@@ -12,40 +12,65 @@ export type MultichainAccountWalletId = `${AccountWalletCategory.Entropy}:${Entr
12
12
  * A multichain account wallet that holds multiple multichain accounts (one multichain account per
13
13
  * group index).
14
14
  */
15
- export type MultichainAccountWallet<Account extends KeyringAccount> = AccountWallet<Account> & {
15
+ export declare class MultichainAccountWallet<Account extends KeyringAccount> implements AccountWallet<Account> {
16
+ #private;
17
+ constructor({ providers, entropySource, }: {
18
+ providers: AccountProvider<Account>[];
19
+ entropySource: EntropySourceId;
20
+ });
16
21
  /**
17
- * Multichain account wallet ID.
22
+ * Gets the highest group index from multiple account providers for a given
23
+ * entropy source.
24
+ *
25
+ * @param providers - Account providers.
26
+ * @param entropySource - Entropy source to filter on.
27
+ * @returns The highest group index for a given entropy source.
28
+ */
29
+ static getHighestGroupIndexFrom<Account extends KeyringAccount>(providers: AccountProvider<Account>[], entropySource: EntropySourceId): number;
30
+ /**
31
+ * Gets the multichain account wallet ID.
32
+ *
33
+ * @returns The multichain account wallet ID.
18
34
  */
19
35
  get id(): MultichainAccountWalletId;
20
36
  /**
21
- * Multichain account wallet entropy source.
37
+ * Gets the multichain account wallet category, which is always {@link AccountWalletCategory.Entropy}.
38
+ *
39
+ * @returns The multichain account wallet category.
40
+ */
41
+ get category(): AccountWalletCategory.Entropy;
42
+ /**
43
+ * Gets the multichain account wallet entropy source.
44
+ *
45
+ * @returns The multichain account wallet entropy source.
22
46
  */
23
47
  get entropySource(): EntropySourceId;
24
48
  /**
25
- * Gets multichain account for a given index.
49
+ * Gets multichain account for a given ID.
50
+ * The default group ID will default to the multichain account with index 0.
26
51
  *
27
- * @returns Multichain accounts.
52
+ * @param id - Account group ID.
53
+ * @returns Account group.
28
54
  */
29
- getMultichainAccount(groupIndex: number): MultichainAccount<Account> | undefined;
55
+ getAccountGroup(id: AccountGroupId): MultichainAccount<Account> | undefined;
30
56
  /**
31
- * Gets multichain accounts.
57
+ * Gets all multichain accounts. Similar to {@link MultichainAccountWallet.getMultichainAccounts}.
32
58
  *
33
- * @returns Multichain accounts.
59
+ * @returns The multichain accounts.
34
60
  */
35
- getMultichainAccounts(): MultichainAccount<Account>[];
36
- };
37
- export declare class MultichainAccountWalletAdapter<Account extends KeyringAccount> implements MultichainAccountWallet<Account> {
38
- #private;
39
- constructor({ providers, entropySource, }: {
40
- providers: MultichainAccountProvider<Account>[];
41
- entropySource: EntropySourceId;
42
- });
43
- get id(): MultichainAccountWalletId;
44
- get category(): AccountWalletCategory.Entropy;
45
- get entropySource(): EntropySourceId;
46
- getAccountGroup(groupId: AccountGroupId): MultichainAccount<Account> | undefined;
47
61
  getAccountGroups(): MultichainAccount<Account>[];
62
+ /**
63
+ * Gets multichain account for a given index.
64
+ *
65
+ * @param groupIndex - Multichain account index.
66
+ * @returns The multichain account associated with the given index.
67
+ */
48
68
  getMultichainAccount(groupIndex: number): MultichainAccount<Account> | undefined;
69
+ /**
70
+ * Gets all multichain accounts.
71
+ *
72
+ * @returns The multichain accounts.
73
+ */
49
74
  getMultichainAccounts(): MultichainAccount<Account>[];
50
75
  }
51
76
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"wallet.d.cts","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,8BAA8B;AAE7E,OAAO,EAGL,KAAK,iBAAiB,EACvB,sBAAkB;AACnB,OAAO,KAAK,EAAE,yBAAyB,EAAE,uBAAmB;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAiB;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAkB;AAC/C,OAAO,EAAE,qBAAqB,EAAE,sBAAkB;AAElD;;GAEG;AACH,MAAM,MAAM,yBAAyB,GACnC,GAAG,qBAAqB,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC;AAExD;;;GAGG;AACH,MAAM,MAAM,uBAAuB,CAAC,OAAO,SAAS,cAAc,IAChE,aAAa,CAAC,OAAO,CAAC,GAAG;IACvB;;OAEG;IACH,IAAI,EAAE,IAAI,yBAAyB,CAAC;IAEpC;;OAEG;IACH,IAAI,aAAa,IAAI,eAAe,CAAC;IAErC;;;;OAIG;IACH,oBAAoB,CAClB,UAAU,EAAE,MAAM,GACjB,iBAAiB,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;IAE1C;;;;OAIG;IACH,qBAAqB,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;CACvD,CAAC;AAEJ,qBAAa,8BAA8B,CAAC,OAAO,SAAS,cAAc,CACxE,YAAW,uBAAuB,CAAC,OAAO,CAAC;;gBAU/B,EACV,SAAS,EACT,aAAa,GACd,EAAE;QACD,SAAS,EAAE,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,aAAa,EAAE,eAAe,CAAC;KAChC;IA+BD,IAAI,EAAE,IAAI,yBAAyB,CAElC;IAED,IAAI,QAAQ,IAAI,qBAAqB,CAAC,OAAO,CAE5C;IAED,IAAI,aAAa,IAAI,eAAe,CAEnC;IAED,eAAe,CACb,OAAO,EAAE,cAAc,GACtB,iBAAiB,CAAC,OAAO,CAAC,GAAG,SAAS;IAazC,gBAAgB,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE;IAIhD,oBAAoB,CAClB,UAAU,EAAE,MAAM,GACjB,iBAAiB,CAAC,OAAO,CAAC,GAAG,SAAS;IAIzC,qBAAqB,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE;CAGtD;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,eAAe,GAC7B,yBAAyB,CAE3B"}
1
+ {"version":3,"file":"wallet.d.cts","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,8BAA8B;AAE/B,OAAO,EAGL,iBAAiB,EAClB,sBAAkB;AACnB,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAiB;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAoB;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAkB;AAC/C,OAAO,EAAE,qBAAqB,EAAE,sBAAkB;AAElD;;GAEG;AACH,MAAM,MAAM,yBAAyB,GACnC,GAAG,qBAAqB,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC;AAExD;;;GAGG;AACH,qBAAa,uBAAuB,CAAC,OAAO,SAAS,cAAc,CACjE,YAAW,aAAa,CAAC,OAAO,CAAC;;gBAUrB,EACV,SAAS,EACT,aAAa,GACd,EAAE;QACD,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,aAAa,EAAE,eAAe,CAAC;KAChC;IAgCD;;;;;;;OAOG;IACH,MAAM,CAAC,wBAAwB,CAAC,OAAO,SAAS,cAAc,EAC5D,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,EACrC,aAAa,EAAE,eAAe,GAC7B,MAAM;IAmBT;;;;OAIG;IACH,IAAI,EAAE,IAAI,yBAAyB,CAElC;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,qBAAqB,CAAC,OAAO,CAE5C;IAED;;;;OAIG;IACH,IAAI,aAAa,IAAI,eAAe,CAEnC;IAED;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,EAAE,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,SAAS;IAgB3E;;;;OAIG;IACH,gBAAgB,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE;IAIhD;;;;;OAKG;IACH,oBAAoB,CAClB,UAAU,EAAE,MAAM,GACjB,iBAAiB,CAAC,OAAO,CAAC,GAAG,SAAS;IAIzC;;;;OAIG;IACH,qBAAqB,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE;CAGtD;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,eAAe,GAC7B,yBAAyB,CAE3B"}
@@ -1,7 +1,7 @@
1
- import type { EntropySourceId, KeyringAccount } from "@metamask/keyring-api";
2
- import { type MultichainAccount } from "./account.mjs";
3
- import type { MultichainAccountProvider } from "./provider.mjs";
1
+ import { type EntropySourceId, type KeyringAccount } from "@metamask/keyring-api";
2
+ import { MultichainAccount } from "./account.mjs";
4
3
  import type { AccountGroupId } from "../group.mjs";
4
+ import type { AccountProvider } from "../provider.mjs";
5
5
  import type { AccountWallet } from "../wallet.mjs";
6
6
  import { AccountWalletCategory } from "../wallet.mjs";
7
7
  /**
@@ -12,40 +12,65 @@ export type MultichainAccountWalletId = `${AccountWalletCategory.Entropy}:${Entr
12
12
  * A multichain account wallet that holds multiple multichain accounts (one multichain account per
13
13
  * group index).
14
14
  */
15
- export type MultichainAccountWallet<Account extends KeyringAccount> = AccountWallet<Account> & {
15
+ export declare class MultichainAccountWallet<Account extends KeyringAccount> implements AccountWallet<Account> {
16
+ #private;
17
+ constructor({ providers, entropySource, }: {
18
+ providers: AccountProvider<Account>[];
19
+ entropySource: EntropySourceId;
20
+ });
16
21
  /**
17
- * Multichain account wallet ID.
22
+ * Gets the highest group index from multiple account providers for a given
23
+ * entropy source.
24
+ *
25
+ * @param providers - Account providers.
26
+ * @param entropySource - Entropy source to filter on.
27
+ * @returns The highest group index for a given entropy source.
28
+ */
29
+ static getHighestGroupIndexFrom<Account extends KeyringAccount>(providers: AccountProvider<Account>[], entropySource: EntropySourceId): number;
30
+ /**
31
+ * Gets the multichain account wallet ID.
32
+ *
33
+ * @returns The multichain account wallet ID.
18
34
  */
19
35
  get id(): MultichainAccountWalletId;
20
36
  /**
21
- * Multichain account wallet entropy source.
37
+ * Gets the multichain account wallet category, which is always {@link AccountWalletCategory.Entropy}.
38
+ *
39
+ * @returns The multichain account wallet category.
40
+ */
41
+ get category(): AccountWalletCategory.Entropy;
42
+ /**
43
+ * Gets the multichain account wallet entropy source.
44
+ *
45
+ * @returns The multichain account wallet entropy source.
22
46
  */
23
47
  get entropySource(): EntropySourceId;
24
48
  /**
25
- * Gets multichain account for a given index.
49
+ * Gets multichain account for a given ID.
50
+ * The default group ID will default to the multichain account with index 0.
26
51
  *
27
- * @returns Multichain accounts.
52
+ * @param id - Account group ID.
53
+ * @returns Account group.
28
54
  */
29
- getMultichainAccount(groupIndex: number): MultichainAccount<Account> | undefined;
55
+ getAccountGroup(id: AccountGroupId): MultichainAccount<Account> | undefined;
30
56
  /**
31
- * Gets multichain accounts.
57
+ * Gets all multichain accounts. Similar to {@link MultichainAccountWallet.getMultichainAccounts}.
32
58
  *
33
- * @returns Multichain accounts.
59
+ * @returns The multichain accounts.
34
60
  */
35
- getMultichainAccounts(): MultichainAccount<Account>[];
36
- };
37
- export declare class MultichainAccountWalletAdapter<Account extends KeyringAccount> implements MultichainAccountWallet<Account> {
38
- #private;
39
- constructor({ providers, entropySource, }: {
40
- providers: MultichainAccountProvider<Account>[];
41
- entropySource: EntropySourceId;
42
- });
43
- get id(): MultichainAccountWalletId;
44
- get category(): AccountWalletCategory.Entropy;
45
- get entropySource(): EntropySourceId;
46
- getAccountGroup(groupId: AccountGroupId): MultichainAccount<Account> | undefined;
47
61
  getAccountGroups(): MultichainAccount<Account>[];
62
+ /**
63
+ * Gets multichain account for a given index.
64
+ *
65
+ * @param groupIndex - Multichain account index.
66
+ * @returns The multichain account associated with the given index.
67
+ */
48
68
  getMultichainAccount(groupIndex: number): MultichainAccount<Account> | undefined;
69
+ /**
70
+ * Gets all multichain accounts.
71
+ *
72
+ * @returns The multichain accounts.
73
+ */
49
74
  getMultichainAccounts(): MultichainAccount<Account>[];
50
75
  }
51
76
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"wallet.d.mts","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,8BAA8B;AAE7E,OAAO,EAGL,KAAK,iBAAiB,EACvB,sBAAkB;AACnB,OAAO,KAAK,EAAE,yBAAyB,EAAE,uBAAmB;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAiB;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAkB;AAC/C,OAAO,EAAE,qBAAqB,EAAE,sBAAkB;AAElD;;GAEG;AACH,MAAM,MAAM,yBAAyB,GACnC,GAAG,qBAAqB,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC;AAExD;;;GAGG;AACH,MAAM,MAAM,uBAAuB,CAAC,OAAO,SAAS,cAAc,IAChE,aAAa,CAAC,OAAO,CAAC,GAAG;IACvB;;OAEG;IACH,IAAI,EAAE,IAAI,yBAAyB,CAAC;IAEpC;;OAEG;IACH,IAAI,aAAa,IAAI,eAAe,CAAC;IAErC;;;;OAIG;IACH,oBAAoB,CAClB,UAAU,EAAE,MAAM,GACjB,iBAAiB,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;IAE1C;;;;OAIG;IACH,qBAAqB,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;CACvD,CAAC;AAEJ,qBAAa,8BAA8B,CAAC,OAAO,SAAS,cAAc,CACxE,YAAW,uBAAuB,CAAC,OAAO,CAAC;;gBAU/B,EACV,SAAS,EACT,aAAa,GACd,EAAE;QACD,SAAS,EAAE,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,aAAa,EAAE,eAAe,CAAC;KAChC;IA+BD,IAAI,EAAE,IAAI,yBAAyB,CAElC;IAED,IAAI,QAAQ,IAAI,qBAAqB,CAAC,OAAO,CAE5C;IAED,IAAI,aAAa,IAAI,eAAe,CAEnC;IAED,eAAe,CACb,OAAO,EAAE,cAAc,GACtB,iBAAiB,CAAC,OAAO,CAAC,GAAG,SAAS;IAazC,gBAAgB,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE;IAIhD,oBAAoB,CAClB,UAAU,EAAE,MAAM,GACjB,iBAAiB,CAAC,OAAO,CAAC,GAAG,SAAS;IAIzC,qBAAqB,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE;CAGtD;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,eAAe,GAC7B,yBAAyB,CAE3B"}
1
+ {"version":3,"file":"wallet.d.mts","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,8BAA8B;AAE/B,OAAO,EAGL,iBAAiB,EAClB,sBAAkB;AACnB,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAiB;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAoB;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAkB;AAC/C,OAAO,EAAE,qBAAqB,EAAE,sBAAkB;AAElD;;GAEG;AACH,MAAM,MAAM,yBAAyB,GACnC,GAAG,qBAAqB,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC;AAExD;;;GAGG;AACH,qBAAa,uBAAuB,CAAC,OAAO,SAAS,cAAc,CACjE,YAAW,aAAa,CAAC,OAAO,CAAC;;gBAUrB,EACV,SAAS,EACT,aAAa,GACd,EAAE;QACD,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,aAAa,EAAE,eAAe,CAAC;KAChC;IAgCD;;;;;;;OAOG;IACH,MAAM,CAAC,wBAAwB,CAAC,OAAO,SAAS,cAAc,EAC5D,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,EACrC,aAAa,EAAE,eAAe,GAC7B,MAAM;IAmBT;;;;OAIG;IACH,IAAI,EAAE,IAAI,yBAAyB,CAElC;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,qBAAqB,CAAC,OAAO,CAE5C;IAED;;;;OAIG;IACH,IAAI,aAAa,IAAI,eAAe,CAEnC;IAED;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,EAAE,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,SAAS;IAgB3E;;;;OAIG;IACH,gBAAgB,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE;IAIhD;;;;;OAKG;IACH,oBAAoB,CAClB,UAAU,EAAE,MAAM,GACjB,iBAAiB,CAAC,OAAO,CAAC,GAAG,SAAS;IAIzC;;;;OAIG;IACH,qBAAqB,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE;CAGtD;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,eAAe,GAC7B,yBAAyB,CAE3B"}
@@ -9,72 +9,138 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _MultichainAccountWalletAdapter_id, _MultichainAccountWalletAdapter_providers, _MultichainAccountWalletAdapter_entropySource, _MultichainAccountWalletAdapter_accounts;
13
- import { getGroupIndexFromAccountGroupId, MultichainAccountAdapter } from "./account.mjs";
12
+ var _MultichainAccountWallet_id, _MultichainAccountWallet_providers, _MultichainAccountWallet_entropySource, _MultichainAccountWallet_accounts;
13
+ import { KeyringAccountEntropyTypeOption } from "@metamask/keyring-api";
14
+ import { getGroupIndexFromMultichainAccountId, isMultichainAccountId, MultichainAccount } from "./account.mjs";
14
15
  import { toDefaultAccountGroupId } from "../group.mjs";
15
16
  import { AccountWalletCategory } from "../wallet.mjs";
16
- export class MultichainAccountWalletAdapter {
17
+ /**
18
+ * A multichain account wallet that holds multiple multichain accounts (one multichain account per
19
+ * group index).
20
+ */
21
+ export class MultichainAccountWallet {
17
22
  constructor({ providers, entropySource, }) {
18
- _MultichainAccountWalletAdapter_id.set(this, void 0);
19
- _MultichainAccountWalletAdapter_providers.set(this, void 0);
20
- _MultichainAccountWalletAdapter_entropySource.set(this, void 0);
21
- _MultichainAccountWalletAdapter_accounts.set(this, void 0);
22
- __classPrivateFieldSet(this, _MultichainAccountWalletAdapter_id, toMultichainAccountWalletId(entropySource), "f");
23
- __classPrivateFieldSet(this, _MultichainAccountWalletAdapter_providers, providers, "f");
24
- __classPrivateFieldSet(this, _MultichainAccountWalletAdapter_entropySource, entropySource, "f");
25
- __classPrivateFieldSet(this, _MultichainAccountWalletAdapter_accounts, new Map(), "f");
26
- let groupIndex = 0;
27
- let hasAccounts = false;
28
- // NOTE: We do not allow any gap for now. So if we have accounts for index 0 and index 2,
29
- // then this logic will stop at index 1, given that no account will be "provided".
30
- //
31
- // QUESTION: Should we a hard limit to the `groupIndex` to avoid having an infinite
32
- // loop here in case one of the provider is buggy?
33
- do {
34
- const multichainAccount = new MultichainAccountAdapter({
23
+ _MultichainAccountWallet_id.set(this, void 0);
24
+ _MultichainAccountWallet_providers.set(this, void 0);
25
+ _MultichainAccountWallet_entropySource.set(this, void 0);
26
+ _MultichainAccountWallet_accounts.set(this, void 0);
27
+ __classPrivateFieldSet(this, _MultichainAccountWallet_id, toMultichainAccountWalletId(entropySource), "f");
28
+ __classPrivateFieldSet(this, _MultichainAccountWallet_providers, providers, "f");
29
+ __classPrivateFieldSet(this, _MultichainAccountWallet_entropySource, entropySource, "f");
30
+ __classPrivateFieldSet(this, _MultichainAccountWallet_accounts, new Map(), "f");
31
+ // NOTE: This will traverse all accounts to compute the max index. We could try
32
+ // to minimize the number of filtering we're doing on each providers if this
33
+ // becomes too costly.
34
+ const maxGroupIndex = MultichainAccountWallet.getHighestGroupIndexFrom(providers, entropySource);
35
+ // NOTE: We could have some gap for now, until we fully implement the
36
+ // gap/alignment mechanisms to backfill all "missing accounts".
37
+ for (let groupIndex = 0; groupIndex <= maxGroupIndex; groupIndex++) {
38
+ // Use "lower or equal", since we need to "include" the max index (which
39
+ // can also be 0)
40
+ const multichainAccount = new MultichainAccount({
35
41
  groupIndex,
36
42
  wallet: this,
37
- providers: __classPrivateFieldGet(this, _MultichainAccountWalletAdapter_providers, "f"),
43
+ providers: __classPrivateFieldGet(this, _MultichainAccountWallet_providers, "f"),
38
44
  });
39
45
  // We only add multichain account that has underlying accounts.
40
- hasAccounts = multichainAccount.hasAccounts();
41
- if (hasAccounts) {
42
- __classPrivateFieldGet(this, _MultichainAccountWalletAdapter_accounts, "f").set(groupIndex, multichainAccount);
46
+ if (multichainAccount.hasAccounts()) {
47
+ __classPrivateFieldGet(this, _MultichainAccountWallet_accounts, "f").set(groupIndex, multichainAccount);
48
+ }
49
+ }
50
+ }
51
+ /**
52
+ * Gets the highest group index from multiple account providers for a given
53
+ * entropy source.
54
+ *
55
+ * @param providers - Account providers.
56
+ * @param entropySource - Entropy source to filter on.
57
+ * @returns The highest group index for a given entropy source.
58
+ */
59
+ static getHighestGroupIndexFrom(providers, entropySource) {
60
+ let max = -1;
61
+ for (const provider of providers) {
62
+ for (const account of provider.getAccounts()) {
63
+ if (account.options.entropy &&
64
+ account.options.entropy.type ===
65
+ KeyringAccountEntropyTypeOption.Mnemonic &&
66
+ account.options.entropy.id === entropySource) {
67
+ max = Math.max(max, account.options.entropy.groupIndex);
68
+ }
43
69
  }
44
- groupIndex += 1;
45
- } while (hasAccounts);
70
+ }
71
+ return max;
46
72
  }
73
+ /**
74
+ * Gets the multichain account wallet ID.
75
+ *
76
+ * @returns The multichain account wallet ID.
77
+ */
47
78
  get id() {
48
- return __classPrivateFieldGet(this, _MultichainAccountWalletAdapter_id, "f");
79
+ return __classPrivateFieldGet(this, _MultichainAccountWallet_id, "f");
49
80
  }
81
+ /**
82
+ * Gets the multichain account wallet category, which is always {@link AccountWalletCategory.Entropy}.
83
+ *
84
+ * @returns The multichain account wallet category.
85
+ */
50
86
  get category() {
51
87
  return AccountWalletCategory.Entropy;
52
88
  }
89
+ /**
90
+ * Gets the multichain account wallet entropy source.
91
+ *
92
+ * @returns The multichain account wallet entropy source.
93
+ */
53
94
  get entropySource() {
54
- return __classPrivateFieldGet(this, _MultichainAccountWalletAdapter_entropySource, "f");
95
+ return __classPrivateFieldGet(this, _MultichainAccountWallet_entropySource, "f");
55
96
  }
56
- getAccountGroup(groupId) {
97
+ /**
98
+ * Gets multichain account for a given ID.
99
+ * The default group ID will default to the multichain account with index 0.
100
+ *
101
+ * @param id - Account group ID.
102
+ * @returns Account group.
103
+ */
104
+ getAccountGroup(id) {
57
105
  // We consider the "default case" to be mapped to index 0.
58
- if (groupId === toDefaultAccountGroupId(this.id)) {
59
- return __classPrivateFieldGet(this, _MultichainAccountWalletAdapter_accounts, "f").get(0);
106
+ if (id === toDefaultAccountGroupId(this.id)) {
107
+ return __classPrivateFieldGet(this, _MultichainAccountWallet_accounts, "f").get(0);
60
108
  }
61
- const groupIndex = getGroupIndexFromAccountGroupId(groupId);
62
- if (groupIndex === undefined) {
109
+ // If it is not a valid ID, we cannot extract the group index
110
+ // from it, so we fail fast.
111
+ if (!isMultichainAccountId(id)) {
63
112
  return undefined;
64
113
  }
65
- return __classPrivateFieldGet(this, _MultichainAccountWalletAdapter_accounts, "f").get(groupIndex);
114
+ const groupIndex = getGroupIndexFromMultichainAccountId(id);
115
+ return __classPrivateFieldGet(this, _MultichainAccountWallet_accounts, "f").get(groupIndex);
66
116
  }
117
+ /**
118
+ * Gets all multichain accounts. Similar to {@link MultichainAccountWallet.getMultichainAccounts}.
119
+ *
120
+ * @returns The multichain accounts.
121
+ */
67
122
  getAccountGroups() {
68
123
  return this.getMultichainAccounts();
69
124
  }
125
+ /**
126
+ * Gets multichain account for a given index.
127
+ *
128
+ * @param groupIndex - Multichain account index.
129
+ * @returns The multichain account associated with the given index.
130
+ */
70
131
  getMultichainAccount(groupIndex) {
71
- return __classPrivateFieldGet(this, _MultichainAccountWalletAdapter_accounts, "f").get(groupIndex);
132
+ return __classPrivateFieldGet(this, _MultichainAccountWallet_accounts, "f").get(groupIndex);
72
133
  }
134
+ /**
135
+ * Gets all multichain accounts.
136
+ *
137
+ * @returns The multichain accounts.
138
+ */
73
139
  getMultichainAccounts() {
74
- return Array.from(__classPrivateFieldGet(this, _MultichainAccountWalletAdapter_accounts, "f").values()); // TODO: Prevent copy here.
140
+ return Array.from(__classPrivateFieldGet(this, _MultichainAccountWallet_accounts, "f").values()); // TODO: Prevent copy here.
75
141
  }
76
142
  }
77
- _MultichainAccountWalletAdapter_id = new WeakMap(), _MultichainAccountWalletAdapter_providers = new WeakMap(), _MultichainAccountWalletAdapter_entropySource = new WeakMap(), _MultichainAccountWalletAdapter_accounts = new WeakMap();
143
+ _MultichainAccountWallet_id = new WeakMap(), _MultichainAccountWallet_providers = new WeakMap(), _MultichainAccountWallet_entropySource = new WeakMap(), _MultichainAccountWallet_accounts = new WeakMap();
78
144
  /**
79
145
  * Gets the multichain account wallet ID from its entropy source.
80
146
  *
@@ -1 +1 @@
1
- {"version":3,"file":"wallet.mjs","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,OAAO,EACL,+BAA+B,EAC/B,wBAAwB,EAEzB,sBAAkB;AAGnB,OAAO,EAAE,uBAAuB,EAAE,qBAAiB;AAEnD,OAAO,EAAE,qBAAqB,EAAE,sBAAkB;AAyClD,MAAM,OAAO,8BAA8B;IAWzC,YAAY,EACV,SAAS,EACT,aAAa,GAId;QAdQ,qDAA+B;QAE/B,4DAAiD;QAEjD,gEAAgC;QAEhC,2DAAmD;QAS1D,uBAAA,IAAI,sCAAO,2BAA2B,CAAC,aAAa,CAAC,MAAA,CAAC;QACtD,uBAAA,IAAI,6CAAc,SAAS,MAAA,CAAC;QAC5B,uBAAA,IAAI,iDAAkB,aAAa,MAAA,CAAC;QACpC,uBAAA,IAAI,4CAAa,IAAI,GAAG,EAAE,MAAA,CAAC;QAE3B,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,yFAAyF;QACzF,kFAAkF;QAClF,EAAE;QACF,mFAAmF;QACnF,kDAAkD;QAClD,GAAG,CAAC;YACF,MAAM,iBAAiB,GAAG,IAAI,wBAAwB,CAAC;gBACrD,UAAU;gBACV,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,uBAAA,IAAI,iDAAW;aAC3B,CAAC,CAAC;YAEH,+DAA+D;YAC/D,WAAW,GAAG,iBAAiB,CAAC,WAAW,EAAE,CAAC;YAC9C,IAAI,WAAW,EAAE,CAAC;gBAChB,uBAAA,IAAI,gDAAU,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;YACpD,CAAC;YAED,UAAU,IAAI,CAAC,CAAC;QAClB,CAAC,QAAQ,WAAW,EAAE;IACxB,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,uBAAA,IAAI,0CAAI,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,qBAAqB,CAAC,OAAO,CAAC;IACvC,CAAC;IAED,IAAI,aAAa;QACf,OAAO,uBAAA,IAAI,qDAAe,CAAC;IAC7B,CAAC;IAED,eAAe,CACb,OAAuB;QAEvB,0DAA0D;QAC1D,IAAI,OAAO,KAAK,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACjD,OAAO,uBAAA,IAAI,gDAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,UAAU,GAAG,+BAA+B,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,uBAAA,IAAI,gDAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACtC,CAAC;IAED,oBAAoB,CAClB,UAAkB;QAElB,OAAO,uBAAA,IAAI,gDAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,qBAAqB;QACnB,OAAO,KAAK,CAAC,IAAI,CAAC,uBAAA,IAAI,gDAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,2BAA2B;IACzE,CAAC;CACF;;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,aAA8B;IAE9B,OAAO,GAAG,qBAAqB,CAAC,OAAO,IAAI,aAAa,EAAE,CAAC;AAC7D,CAAC","sourcesContent":["import type { EntropySourceId, KeyringAccount } from '@metamask/keyring-api';\n\nimport {\n getGroupIndexFromAccountGroupId,\n MultichainAccountAdapter,\n type MultichainAccount,\n} from './account';\nimport type { MultichainAccountProvider } from './provider';\nimport type { AccountGroupId } from '../group';\nimport { toDefaultAccountGroupId } from '../group';\nimport type { AccountWallet } from '../wallet';\nimport { AccountWalletCategory } from '../wallet';\n\n/**\n * Multichain account wallet ID.\n */\nexport type MultichainAccountWalletId =\n `${AccountWalletCategory.Entropy}:${EntropySourceId}`;\n\n/**\n * A multichain account wallet that holds multiple multichain accounts (one multichain account per\n * group index).\n */\nexport type MultichainAccountWallet<Account extends KeyringAccount> =\n AccountWallet<Account> & {\n /**\n * Multichain account wallet ID.\n */\n get id(): MultichainAccountWalletId;\n\n /**\n * Multichain account wallet entropy source.\n */\n get entropySource(): EntropySourceId;\n\n /**\n * Gets multichain account for a given index.\n *\n * @returns Multichain accounts.\n */\n getMultichainAccount(\n groupIndex: number,\n ): MultichainAccount<Account> | undefined;\n\n /**\n * Gets multichain accounts.\n *\n * @returns Multichain accounts.\n */\n getMultichainAccounts(): MultichainAccount<Account>[];\n };\n\nexport class MultichainAccountWalletAdapter<Account extends KeyringAccount>\n implements MultichainAccountWallet<Account>\n{\n readonly #id: MultichainAccountWalletId;\n\n readonly #providers: MultichainAccountProvider<Account>[];\n\n readonly #entropySource: EntropySourceId;\n\n readonly #accounts: Map<number, MultichainAccount<Account>>;\n\n constructor({\n providers,\n entropySource,\n }: {\n providers: MultichainAccountProvider<Account>[];\n entropySource: EntropySourceId;\n }) {\n this.#id = toMultichainAccountWalletId(entropySource);\n this.#providers = providers;\n this.#entropySource = entropySource;\n this.#accounts = new Map();\n\n let groupIndex = 0;\n let hasAccounts = false;\n\n // NOTE: We do not allow any gap for now. So if we have accounts for index 0 and index 2,\n // then this logic will stop at index 1, given that no account will be \"provided\".\n //\n // QUESTION: Should we a hard limit to the `groupIndex` to avoid having an infinite\n // loop here in case one of the provider is buggy?\n do {\n const multichainAccount = new MultichainAccountAdapter({\n groupIndex,\n wallet: this,\n providers: this.#providers,\n });\n\n // We only add multichain account that has underlying accounts.\n hasAccounts = multichainAccount.hasAccounts();\n if (hasAccounts) {\n this.#accounts.set(groupIndex, multichainAccount);\n }\n\n groupIndex += 1;\n } while (hasAccounts);\n }\n\n get id(): MultichainAccountWalletId {\n return this.#id;\n }\n\n get category(): AccountWalletCategory.Entropy {\n return AccountWalletCategory.Entropy;\n }\n\n get entropySource(): EntropySourceId {\n return this.#entropySource;\n }\n\n getAccountGroup(\n groupId: AccountGroupId,\n ): MultichainAccount<Account> | undefined {\n // We consider the \"default case\" to be mapped to index 0.\n if (groupId === toDefaultAccountGroupId(this.id)) {\n return this.#accounts.get(0);\n }\n\n const groupIndex = getGroupIndexFromAccountGroupId(groupId);\n if (groupIndex === undefined) {\n return undefined;\n }\n return this.#accounts.get(groupIndex);\n }\n\n getAccountGroups(): MultichainAccount<Account>[] {\n return this.getMultichainAccounts();\n }\n\n getMultichainAccount(\n groupIndex: number,\n ): MultichainAccount<Account> | undefined {\n return this.#accounts.get(groupIndex);\n }\n\n getMultichainAccounts(): MultichainAccount<Account>[] {\n return Array.from(this.#accounts.values()); // TODO: Prevent copy here.\n }\n}\n\n/**\n * Gets the multichain account wallet ID from its entropy source.\n *\n * @param entropySource - Entropy source ID of that wallet.\n * @returns The multichain account wallet ID.\n */\nexport function toMultichainAccountWalletId(\n entropySource: EntropySourceId,\n): MultichainAccountWalletId {\n return `${AccountWalletCategory.Entropy}:${entropySource}`;\n}\n"]}
1
+ {"version":3,"file":"wallet.mjs","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n KeyringAccountEntropyTypeOption,\n type EntropySourceId,\n type KeyringAccount,\n} from '@metamask/keyring-api';\n\nimport {\n getGroupIndexFromMultichainAccountId,\n isMultichainAccountId,\n MultichainAccount,\n} from './account';\nimport type { AccountGroupId } from '../group';\nimport { toDefaultAccountGroupId } from '../group';\nimport type { AccountProvider } from '../provider';\nimport type { AccountWallet } from '../wallet';\nimport { AccountWalletCategory } from '../wallet';\n\n/**\n * Multichain account wallet ID.\n */\nexport type MultichainAccountWalletId =\n `${AccountWalletCategory.Entropy}:${EntropySourceId}`;\n\n/**\n * A multichain account wallet that holds multiple multichain accounts (one multichain account per\n * group index).\n */\nexport class MultichainAccountWallet<Account extends KeyringAccount>\n implements AccountWallet<Account>\n{\n readonly #id: MultichainAccountWalletId;\n\n readonly #providers: AccountProvider<Account>[];\n\n readonly #entropySource: EntropySourceId;\n\n readonly #accounts: Map<number, MultichainAccount<Account>>;\n\n constructor({\n providers,\n entropySource,\n }: {\n providers: AccountProvider<Account>[];\n entropySource: EntropySourceId;\n }) {\n this.#id = toMultichainAccountWalletId(entropySource);\n this.#providers = providers;\n this.#entropySource = entropySource;\n this.#accounts = new Map();\n\n // NOTE: This will traverse all accounts to compute the max index. We could try\n // to minimize the number of filtering we're doing on each providers if this\n // becomes too costly.\n const maxGroupIndex = MultichainAccountWallet.getHighestGroupIndexFrom(\n providers,\n entropySource,\n );\n\n // NOTE: We could have some gap for now, until we fully implement the\n // gap/alignment mechanisms to backfill all \"missing accounts\".\n for (let groupIndex = 0; groupIndex <= maxGroupIndex; groupIndex++) {\n // Use \"lower or equal\", since we need to \"include\" the max index (which\n // can also be 0)\n const multichainAccount = new MultichainAccount<Account>({\n groupIndex,\n wallet: this,\n providers: this.#providers,\n });\n\n // We only add multichain account that has underlying accounts.\n if (multichainAccount.hasAccounts()) {\n this.#accounts.set(groupIndex, multichainAccount);\n }\n }\n }\n\n /**\n * Gets the highest group index from multiple account providers for a given\n * entropy source.\n *\n * @param providers - Account providers.\n * @param entropySource - Entropy source to filter on.\n * @returns The highest group index for a given entropy source.\n */\n static getHighestGroupIndexFrom<Account extends KeyringAccount>(\n providers: AccountProvider<Account>[],\n entropySource: EntropySourceId,\n ): number {\n let max = -1;\n\n for (const provider of providers) {\n for (const account of provider.getAccounts()) {\n if (\n account.options.entropy &&\n account.options.entropy.type ===\n KeyringAccountEntropyTypeOption.Mnemonic &&\n account.options.entropy.id === entropySource\n ) {\n max = Math.max(max, account.options.entropy.groupIndex);\n }\n }\n }\n\n return max;\n }\n\n /**\n * Gets the multichain account wallet ID.\n *\n * @returns The multichain account wallet ID.\n */\n get id(): MultichainAccountWalletId {\n return this.#id;\n }\n\n /**\n * Gets the multichain account wallet category, which is always {@link AccountWalletCategory.Entropy}.\n *\n * @returns The multichain account wallet category.\n */\n get category(): AccountWalletCategory.Entropy {\n return AccountWalletCategory.Entropy;\n }\n\n /**\n * Gets the multichain account wallet entropy source.\n *\n * @returns The multichain account wallet entropy source.\n */\n get entropySource(): EntropySourceId {\n return this.#entropySource;\n }\n\n /**\n * Gets multichain account for a given ID.\n * The default group ID will default to the multichain account with index 0.\n *\n * @param id - Account group ID.\n * @returns Account group.\n */\n getAccountGroup(id: AccountGroupId): MultichainAccount<Account> | undefined {\n // We consider the \"default case\" to be mapped to index 0.\n if (id === toDefaultAccountGroupId(this.id)) {\n return this.#accounts.get(0);\n }\n\n // If it is not a valid ID, we cannot extract the group index\n // from it, so we fail fast.\n if (!isMultichainAccountId(id)) {\n return undefined;\n }\n\n const groupIndex = getGroupIndexFromMultichainAccountId(id);\n return this.#accounts.get(groupIndex);\n }\n\n /**\n * Gets all multichain accounts. Similar to {@link MultichainAccountWallet.getMultichainAccounts}.\n *\n * @returns The multichain accounts.\n */\n getAccountGroups(): MultichainAccount<Account>[] {\n return this.getMultichainAccounts();\n }\n\n /**\n * Gets multichain account for a given index.\n *\n * @param groupIndex - Multichain account index.\n * @returns The multichain account associated with the given index.\n */\n getMultichainAccount(\n groupIndex: number,\n ): MultichainAccount<Account> | undefined {\n return this.#accounts.get(groupIndex);\n }\n\n /**\n * Gets all multichain accounts.\n *\n * @returns The multichain accounts.\n */\n getMultichainAccounts(): MultichainAccount<Account>[] {\n return Array.from(this.#accounts.values()); // TODO: Prevent copy here.\n }\n}\n\n/**\n * Gets the multichain account wallet ID from its entropy source.\n *\n * @param entropySource - Entropy source ID of that wallet.\n * @returns The multichain account wallet ID.\n */\nexport function toMultichainAccountWalletId(\n entropySource: EntropySourceId,\n): MultichainAccountWalletId {\n return `${AccountWalletCategory.Entropy}:${entropySource}`;\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.cjs","sourceRoot":"","sources":["../../src/api/provider.ts"],"names":[],"mappings":"","sourcesContent":["import type { KeyringAccount } from '@metamask/keyring-api';\n\n/**\n * An account provider is reponsible of providing accounts to an account group.\n */\nexport type AccountProvider<Account extends KeyringAccount> = {\n /**\n * Gets all accounts for a given entropy source and group index.\n *\n * @returns A list of all account for this provider.\n */\n getAccounts: () => Account[];\n};\n"]}
@@ -0,0 +1,13 @@
1
+ import type { KeyringAccount } from "@metamask/keyring-api";
2
+ /**
3
+ * An account provider is reponsible of providing accounts to an account group.
4
+ */
5
+ export type AccountProvider<Account extends KeyringAccount> = {
6
+ /**
7
+ * Gets all accounts for a given entropy source and group index.
8
+ *
9
+ * @returns A list of all account for this provider.
10
+ */
11
+ getAccounts: () => Account[];
12
+ };
13
+ //# sourceMappingURL=provider.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.cts","sourceRoot":"","sources":["../../src/api/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA8B;AAE5D;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,cAAc,IAAI;IAC5D;;;;OAIG;IACH,WAAW,EAAE,MAAM,OAAO,EAAE,CAAC;CAC9B,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { KeyringAccount } from "@metamask/keyring-api";
2
+ /**
3
+ * An account provider is reponsible of providing accounts to an account group.
4
+ */
5
+ export type AccountProvider<Account extends KeyringAccount> = {
6
+ /**
7
+ * Gets all accounts for a given entropy source and group index.
8
+ *
9
+ * @returns A list of all account for this provider.
10
+ */
11
+ getAccounts: () => Account[];
12
+ };
13
+ //# sourceMappingURL=provider.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.mts","sourceRoot":"","sources":["../../src/api/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA8B;AAE5D;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,cAAc,IAAI;IAC5D;;;;OAIG;IACH,WAAW,EAAE,MAAM,OAAO,EAAE,CAAC;CAC9B,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.mjs","sourceRoot":"","sources":["../../src/api/provider.ts"],"names":[],"mappings":"","sourcesContent":["import type { KeyringAccount } from '@metamask/keyring-api';\n\n/**\n * An account provider is reponsible of providing accounts to an account group.\n */\nexport type AccountProvider<Account extends KeyringAccount> = {\n /**\n * Gets all accounts for a given entropy source and group index.\n *\n * @returns A list of all account for this provider.\n */\n getAccounts: () => Account[];\n};\n"]}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=selector.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selector.cjs","sourceRoot":"","sources":["../../src/api/selector.ts"],"names":[],"mappings":"","sourcesContent":["import type { KeyringAccount } from '@metamask/keyring-api';\n\n/**\n * Selector to query a specific account based on some criteria.\n */\nexport type AccountSelector<Account extends KeyringAccount> = {\n /**\n * Query by account ID.\n */\n id?: Account['id'];\n\n /**\n * Query by account address.\n */\n address?: Account['address'];\n\n /**\n * Query by account type.\n */\n type?: Account['type'];\n\n /**\n * Query by account methods.\n */\n methods?: Account['methods'];\n\n /**\n * Query by account scopes.\n */\n scopes?: Account['scopes'];\n};\n"]}
@@ -0,0 +1,27 @@
1
+ import type { KeyringAccount } from "@metamask/keyring-api";
2
+ /**
3
+ * Selector to query a specific account based on some criteria.
4
+ */
5
+ export type AccountSelector<Account extends KeyringAccount> = {
6
+ /**
7
+ * Query by account ID.
8
+ */
9
+ id?: Account['id'];
10
+ /**
11
+ * Query by account address.
12
+ */
13
+ address?: Account['address'];
14
+ /**
15
+ * Query by account type.
16
+ */
17
+ type?: Account['type'];
18
+ /**
19
+ * Query by account methods.
20
+ */
21
+ methods?: Account['methods'];
22
+ /**
23
+ * Query by account scopes.
24
+ */
25
+ scopes?: Account['scopes'];
26
+ };
27
+ //# sourceMappingURL=selector.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selector.d.cts","sourceRoot":"","sources":["../../src/api/selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA8B;AAE5D;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,cAAc,IAAI;IAC5D;;OAEG;IACH,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAE7B;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAE7B;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC5B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { KeyringAccount } from "@metamask/keyring-api";
2
+ /**
3
+ * Selector to query a specific account based on some criteria.
4
+ */
5
+ export type AccountSelector<Account extends KeyringAccount> = {
6
+ /**
7
+ * Query by account ID.
8
+ */
9
+ id?: Account['id'];
10
+ /**
11
+ * Query by account address.
12
+ */
13
+ address?: Account['address'];
14
+ /**
15
+ * Query by account type.
16
+ */
17
+ type?: Account['type'];
18
+ /**
19
+ * Query by account methods.
20
+ */
21
+ methods?: Account['methods'];
22
+ /**
23
+ * Query by account scopes.
24
+ */
25
+ scopes?: Account['scopes'];
26
+ };
27
+ //# sourceMappingURL=selector.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selector.d.mts","sourceRoot":"","sources":["../../src/api/selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA8B;AAE5D;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,cAAc,IAAI;IAC5D;;OAEG;IACH,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAE7B;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAE7B;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC5B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=selector.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selector.mjs","sourceRoot":"","sources":["../../src/api/selector.ts"],"names":[],"mappings":"","sourcesContent":["import type { KeyringAccount } from '@metamask/keyring-api';\n\n/**\n * Selector to query a specific account based on some criteria.\n */\nexport type AccountSelector<Account extends KeyringAccount> = {\n /**\n * Query by account ID.\n */\n id?: Account['id'];\n\n /**\n * Query by account address.\n */\n address?: Account['address'];\n\n /**\n * Query by account type.\n */\n type?: Account['type'];\n\n /**\n * Query by account methods.\n */\n methods?: Account['methods'];\n\n /**\n * Query by account scopes.\n */\n scopes?: Account['scopes'];\n};\n"]}