@metamask-previews/account-api 0.1.0-6199101 → 0.2.0-2373565

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 (74) hide show
  1. package/CHANGELOG.md +24 -1
  2. package/dist/api/bip44.cjs +16 -0
  3. package/dist/api/bip44.cjs.map +1 -0
  4. package/dist/api/bip44.d.cts +17 -0
  5. package/dist/api/bip44.d.cts.map +1 -0
  6. package/dist/api/bip44.d.mts +17 -0
  7. package/dist/api/bip44.d.mts.map +1 -0
  8. package/dist/api/bip44.mjs +13 -0
  9. package/dist/api/bip44.mjs.map +1 -0
  10. package/dist/api/group.cjs.map +1 -1
  11. package/dist/api/group.d.cts +4 -5
  12. package/dist/api/group.d.cts.map +1 -1
  13. package/dist/api/group.d.mts +4 -5
  14. package/dist/api/group.d.mts.map +1 -1
  15. package/dist/api/group.mjs.map +1 -1
  16. package/dist/api/index.cjs +1 -0
  17. package/dist/api/index.cjs.map +1 -1
  18. package/dist/api/index.d.cts +3 -0
  19. package/dist/api/index.d.cts.map +1 -1
  20. package/dist/api/index.d.mts +3 -0
  21. package/dist/api/index.d.mts.map +1 -1
  22. package/dist/api/index.mjs +1 -0
  23. package/dist/api/index.mjs.map +1 -1
  24. package/dist/api/multichain/account.cjs +89 -50
  25. package/dist/api/multichain/account.cjs.map +1 -1
  26. package/dist/api/multichain/account.d.cts +41 -62
  27. package/dist/api/multichain/account.d.cts.map +1 -1
  28. package/dist/api/multichain/account.d.mts +41 -62
  29. package/dist/api/multichain/account.d.mts.map +1 -1
  30. package/dist/api/multichain/account.mjs +85 -47
  31. package/dist/api/multichain/account.mjs.map +1 -1
  32. package/dist/api/multichain/index.cjs.map +1 -1
  33. package/dist/api/multichain/index.d.cts +0 -1
  34. package/dist/api/multichain/index.d.cts.map +1 -1
  35. package/dist/api/multichain/index.d.mts +0 -1
  36. package/dist/api/multichain/index.d.mts.map +1 -1
  37. package/dist/api/multichain/index.mjs.map +1 -1
  38. package/dist/api/multichain/wallet.cjs +105 -42
  39. package/dist/api/multichain/wallet.cjs.map +1 -1
  40. package/dist/api/multichain/wallet.d.cts +47 -23
  41. package/dist/api/multichain/wallet.d.cts.map +1 -1
  42. package/dist/api/multichain/wallet.d.mts +47 -23
  43. package/dist/api/multichain/wallet.d.mts.map +1 -1
  44. package/dist/api/multichain/wallet.mjs +104 -41
  45. package/dist/api/multichain/wallet.mjs.map +1 -1
  46. package/dist/api/provider.cjs.map +1 -0
  47. package/dist/api/provider.d.cts +13 -0
  48. package/dist/api/provider.d.cts.map +1 -0
  49. package/dist/api/provider.d.mts +13 -0
  50. package/dist/api/provider.d.mts.map +1 -0
  51. package/dist/api/provider.mjs.map +1 -0
  52. package/dist/api/selector.cjs +3 -0
  53. package/dist/api/selector.cjs.map +1 -0
  54. package/dist/api/selector.d.cts +27 -0
  55. package/dist/api/selector.d.cts.map +1 -0
  56. package/dist/api/selector.d.mts +27 -0
  57. package/dist/api/selector.d.mts.map +1 -0
  58. package/dist/api/selector.mjs +2 -0
  59. package/dist/api/selector.mjs.map +1 -0
  60. package/dist/api/wallet.cjs.map +1 -1
  61. package/dist/api/wallet.d.cts +1 -0
  62. package/dist/api/wallet.d.cts.map +1 -1
  63. package/dist/api/wallet.d.mts +1 -0
  64. package/dist/api/wallet.d.mts.map +1 -1
  65. package/dist/api/wallet.mjs.map +1 -1
  66. package/package.json +5 -4
  67. package/dist/api/multichain/provider.cjs.map +0 -1
  68. package/dist/api/multichain/provider.d.cts +0 -29
  69. package/dist/api/multichain/provider.d.cts.map +0 -1
  70. package/dist/api/multichain/provider.d.mts +0 -29
  71. package/dist/api/multichain/provider.d.mts.map +0 -1
  72. package/dist/api/multichain/provider.mjs.map +0 -1
  73. /package/dist/api/{multichain/provider.cjs → provider.cjs} +0 -0
  74. /package/dist/api/{multichain/provider.mjs → provider.mjs} +0 -0
package/CHANGELOG.md CHANGED
@@ -7,11 +7,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Added
11
+
12
+ - Add `MultichainAccountWallet.sync` method ([#321](https://github.com/MetaMask/accounts/pull/321))
13
+ - This can be used to force wallet synchronization if new accounts are available on the account providers.
14
+
15
+ ### Changed
16
+
17
+ - **BREAKING:** Force `Bip44Account<Account>` for `Multichain*` types ([#321](https://github.com/MetaMask/accounts/pull/321))
18
+ - This requires the `AccountProvider`s to also use new `Bip44Account` type constraint.
19
+
20
+ ## [0.2.0]
21
+
22
+ ### Added
23
+
24
+ - Add multichain account/wallet support ([#315](https://github.com/MetaMask/accounts/pull/315))
25
+ - This is only about "grouping" wallets and accounts together.
26
+
27
+ ### Changed
28
+
29
+ - **BREAKING:** Bump `@metamask/keyring-api` from `^18.0.0` to `^19.0.0` ([#317](https://github.com/MetaMask/accounts/pull/317))
30
+ - The `KeyringAccount.options` field is now partially typed.
31
+
10
32
  ## [0.1.0]
11
33
 
12
34
  ### Added
13
35
 
14
36
  - Add `AccountGroup` and `AccountWallet` ([#307](https://github.com/MetaMask/accounts/pull/307))
15
37
 
16
- [Unreleased]: https://github.com/MetaMask/accounts/compare/@metamask/account-api@0.1.0...HEAD
38
+ [Unreleased]: https://github.com/MetaMask/accounts/compare/@metamask/account-api@0.2.0...HEAD
39
+ [0.2.0]: https://github.com/MetaMask/accounts/compare/@metamask/account-api@0.1.0...@metamask/account-api@0.2.0
17
40
  [0.1.0]: https://github.com/MetaMask/accounts/releases/tag/@metamask/account-api@0.1.0
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isBip44Account = isBip44Account;
4
+ const keyring_api_1 = require("@metamask/keyring-api");
5
+ const superstruct_1 = require("@metamask/superstruct");
6
+ /**
7
+ * Checks if an account is BIP-44 compatible.
8
+ *
9
+ * @param account - The account to be tested.
10
+ * @returns True if the account is BIP-44 compatible.
11
+ */
12
+ function isBip44Account(account) {
13
+ // To be BIP-44 compatible, you just need to use this set of options:
14
+ return (0, superstruct_1.is)(account.options.entropy, keyring_api_1.KeyringAccountEntropyMnemonicOptionsStruct);
15
+ }
16
+ //# sourceMappingURL=bip44.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bip44.cjs","sourceRoot":"","sources":["../../src/api/bip44.ts"],"names":[],"mappings":";;AAwBA,wCAQC;AA5BD,uDAAmF;AACnF,uDAA2C;AAa3C;;;;;GAKG;AACH,SAAgB,cAAc,CAC5B,OAAgB;IAEhB,qEAAqE;IACrE,OAAO,IAAA,gBAAE,EACP,OAAO,CAAC,OAAO,CAAC,OAAO,EACvB,wDAA0C,CAC3C,CAAC;AACJ,CAAC","sourcesContent":["import type {\n KeyringAccount,\n KeyringAccountEntropyMnemonicOptions,\n} from '@metamask/keyring-api';\nimport { KeyringAccountEntropyMnemonicOptionsStruct } from '@metamask/keyring-api';\nimport { is } from '@metamask/superstruct';\n\n/**\n * BIP-44 compatible account type.\n */\nexport type Bip44Account<Account extends KeyringAccount> = Account & {\n // We force the option type for those accounts. (That's how we identify\n // if an account is BIP-44 compatible).\n options: {\n entropy: KeyringAccountEntropyMnemonicOptions;\n };\n};\n\n/**\n * Checks if an account is BIP-44 compatible.\n *\n * @param account - The account to be tested.\n * @returns True if the account is BIP-44 compatible.\n */\nexport function isBip44Account<Account extends KeyringAccount>(\n account: Account,\n): account is Bip44Account<Account> {\n // To be BIP-44 compatible, you just need to use this set of options:\n return is(\n account.options.entropy,\n KeyringAccountEntropyMnemonicOptionsStruct,\n );\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import type { KeyringAccount, KeyringAccountEntropyMnemonicOptions } from "@metamask/keyring-api";
2
+ /**
3
+ * BIP-44 compatible account type.
4
+ */
5
+ export type Bip44Account<Account extends KeyringAccount> = Account & {
6
+ options: {
7
+ entropy: KeyringAccountEntropyMnemonicOptions;
8
+ };
9
+ };
10
+ /**
11
+ * Checks if an account is BIP-44 compatible.
12
+ *
13
+ * @param account - The account to be tested.
14
+ * @returns True if the account is BIP-44 compatible.
15
+ */
16
+ export declare function isBip44Account<Account extends KeyringAccount>(account: Account): account is Bip44Account<Account>;
17
+ //# sourceMappingURL=bip44.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bip44.d.cts","sourceRoot":"","sources":["../../src/api/bip44.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,oCAAoC,EACrC,8BAA8B;AAI/B;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS,cAAc,IAAI,OAAO,GAAG;IAGnE,OAAO,EAAE;QACP,OAAO,EAAE,oCAAoC,CAAC;KAC/C,CAAC;CACH,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,SAAS,cAAc,EAC3D,OAAO,EAAE,OAAO,GACf,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAMlC"}
@@ -0,0 +1,17 @@
1
+ import type { KeyringAccount, KeyringAccountEntropyMnemonicOptions } from "@metamask/keyring-api";
2
+ /**
3
+ * BIP-44 compatible account type.
4
+ */
5
+ export type Bip44Account<Account extends KeyringAccount> = Account & {
6
+ options: {
7
+ entropy: KeyringAccountEntropyMnemonicOptions;
8
+ };
9
+ };
10
+ /**
11
+ * Checks if an account is BIP-44 compatible.
12
+ *
13
+ * @param account - The account to be tested.
14
+ * @returns True if the account is BIP-44 compatible.
15
+ */
16
+ export declare function isBip44Account<Account extends KeyringAccount>(account: Account): account is Bip44Account<Account>;
17
+ //# sourceMappingURL=bip44.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bip44.d.mts","sourceRoot":"","sources":["../../src/api/bip44.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,oCAAoC,EACrC,8BAA8B;AAI/B;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS,cAAc,IAAI,OAAO,GAAG;IAGnE,OAAO,EAAE;QACP,OAAO,EAAE,oCAAoC,CAAC;KAC/C,CAAC;CACH,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,SAAS,cAAc,EAC3D,OAAO,EAAE,OAAO,GACf,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAMlC"}
@@ -0,0 +1,13 @@
1
+ import { KeyringAccountEntropyMnemonicOptionsStruct } from "@metamask/keyring-api";
2
+ import { is } from "@metamask/superstruct";
3
+ /**
4
+ * Checks if an account is BIP-44 compatible.
5
+ *
6
+ * @param account - The account to be tested.
7
+ * @returns True if the account is BIP-44 compatible.
8
+ */
9
+ export function isBip44Account(account) {
10
+ // To be BIP-44 compatible, you just need to use this set of options:
11
+ return is(account.options.entropy, KeyringAccountEntropyMnemonicOptionsStruct);
12
+ }
13
+ //# sourceMappingURL=bip44.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bip44.mjs","sourceRoot":"","sources":["../../src/api/bip44.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0CAA0C,EAAE,8BAA8B;AACnF,OAAO,EAAE,EAAE,EAAE,8BAA8B;AAa3C;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAgB;IAEhB,qEAAqE;IACrE,OAAO,EAAE,CACP,OAAO,CAAC,OAAO,CAAC,OAAO,EACvB,0CAA0C,CAC3C,CAAC;AACJ,CAAC","sourcesContent":["import type {\n KeyringAccount,\n KeyringAccountEntropyMnemonicOptions,\n} from '@metamask/keyring-api';\nimport { KeyringAccountEntropyMnemonicOptionsStruct } from '@metamask/keyring-api';\nimport { is } from '@metamask/superstruct';\n\n/**\n * BIP-44 compatible account type.\n */\nexport type Bip44Account<Account extends KeyringAccount> = Account & {\n // We force the option type for those accounts. (That's how we identify\n // if an account is BIP-44 compatible).\n options: {\n entropy: KeyringAccountEntropyMnemonicOptions;\n };\n};\n\n/**\n * Checks if an account is BIP-44 compatible.\n *\n * @param account - The account to be tested.\n * @returns True if the account is BIP-44 compatible.\n */\nexport function isBip44Account<Account extends KeyringAccount>(\n account: Account,\n): account is Bip44Account<Account> {\n // To be BIP-44 compatible, you just need to use this set of options:\n return is(\n account.options.entropy,\n KeyringAccountEntropyMnemonicOptionsStruct,\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"group.cjs","sourceRoot":"","sources":["../../src/api/group.ts"],"names":[],"mappings":";;;AAwDA,4CAKC;AAQD,0DAIC;AApED;;;;;GAKG;AACU,QAAA,+BAA+B,GAAW,SAAS,CAAC;AAsCjE;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC9B,QAAyB,EACzB,EAAU;IAEV,OAAO,GAAG,QAAQ,IAAI,EAAE,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,SAAgB,uBAAuB,CACrC,QAAyB;IAEzB,OAAO,gBAAgB,CAAC,QAAQ,EAAE,uCAA+B,CAAC,CAAC;AACrE,CAAC","sourcesContent":["import type { KeyringAccount } from '@metamask/keyring-api';\n\n// Circular import are allowed when using `import type`.\nimport type { AccountWallet, AccountWalletId } from './wallet';\n\n/**\n * Default account group unique ID.\n *\n * This constant can be used to reference the \"default\" group from\n * an account wallet.\n */\nexport const DEFAULT_ACCOUNT_GROUP_UNIQUE_ID: string = 'default';\n\n/**\n * Account group ID.\n */\nexport type AccountGroupId = `${AccountWalletId}/${string}`;\n\n/**\n * Account group that can hold multiple accounts.\n */\nexport type AccountGroup<Account extends KeyringAccount> = {\n /**\n * Account group ID.\n */\n get id(): AccountGroupId;\n\n /**\n * Account wallet (parent).\n */\n get wallet(): AccountWallet<Account>;\n\n /**\n * Gets the \"blockchain\" accounts for this account group.\n *\n * @param id - Account ID.\n * @returns The \"blockchain\" accounts.\n */\n getAccounts(): Account[];\n\n /**\n * Gets the \"blockchain\" account for a given account ID.\n *\n * @param id - Account ID.\n * @returns The \"blockchain\" account or undefined if not found.\n */\n getAccount(id: Account['id']): Account | undefined;\n};\n\n/**\n * Convert a wallet ID and a unique ID, to a group ID.\n *\n * @param walletId - A wallet ID.\n * @param id - A unique ID.\n * @returns A group ID.\n */\nexport function toAccountGroupId(\n walletId: AccountWalletId,\n id: string,\n): AccountGroupId {\n return `${walletId}/${id}`;\n}\n\n/**\n * Convert a wallet ID to the default group ID.\n *\n * @param walletId - A wallet ID.\n * @returns The default group ID.\n */\nexport function toDefaultAccountGroupId(\n walletId: AccountWalletId,\n): AccountGroupId {\n return toAccountGroupId(walletId, DEFAULT_ACCOUNT_GROUP_UNIQUE_ID);\n}\n"]}
1
+ {"version":3,"file":"group.cjs","sourceRoot":"","sources":["../../src/api/group.ts"],"names":[],"mappings":";;;AAuDA,4CAKC;AAQD,0DAIC;AAnED;;;;;GAKG;AACU,QAAA,+BAA+B,GAAW,SAAS,CAAC;AAqCjE;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC9B,QAAyB,EACzB,EAAU;IAEV,OAAO,GAAG,QAAQ,IAAI,EAAE,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,SAAgB,uBAAuB,CACrC,QAAyB;IAEzB,OAAO,gBAAgB,CAAC,QAAQ,EAAE,uCAA+B,CAAC,CAAC;AACrE,CAAC","sourcesContent":["import type { KeyringAccount } from '@metamask/keyring-api';\n\n// Circular import are allowed when using `import type`.\nimport type { AccountWallet, AccountWalletId } from './wallet';\n\n/**\n * Default account group unique ID.\n *\n * This constant can be used to reference the \"default\" group from\n * an account wallet.\n */\nexport const DEFAULT_ACCOUNT_GROUP_UNIQUE_ID: string = 'default';\n\n/**\n * Account group ID.\n */\nexport type AccountGroupId = `${AccountWalletId}/${string}`;\n\n/**\n * Account group that can hold multiple accounts.\n */\nexport type AccountGroup<Account extends KeyringAccount> = {\n /**\n * Account group ID.\n */\n get id(): AccountGroupId;\n\n /**\n * Account wallet (parent).\n */\n get wallet(): AccountWallet<Account>;\n\n /**\n * Gets the accounts for this account group.\n *\n * @returns The accounts.\n */\n getAccounts(): Account[];\n\n /**\n * Gets the account for a given account ID.\n *\n * @param id - Account ID.\n * @returns The account or undefined if not found.\n */\n getAccount(id: Account['id']): Account | undefined;\n};\n\n/**\n * Convert a wallet ID and a unique ID, to a group ID.\n *\n * @param walletId - A wallet ID.\n * @param id - A unique ID.\n * @returns A group ID.\n */\nexport function toAccountGroupId(\n walletId: AccountWalletId,\n id: string,\n): AccountGroupId {\n return `${walletId}/${id}`;\n}\n\n/**\n * Convert a wallet ID to the default group ID.\n *\n * @param walletId - A wallet ID.\n * @returns The default group ID.\n */\nexport function toDefaultAccountGroupId(\n walletId: AccountWalletId,\n): AccountGroupId {\n return toAccountGroupId(walletId, DEFAULT_ACCOUNT_GROUP_UNIQUE_ID);\n}\n"]}
@@ -24,17 +24,16 @@ export type AccountGroup<Account extends KeyringAccount> = {
24
24
  */
25
25
  get wallet(): AccountWallet<Account>;
26
26
  /**
27
- * Gets the "blockchain" accounts for this account group.
27
+ * Gets the accounts for this account group.
28
28
  *
29
- * @param id - Account ID.
30
- * @returns The "blockchain" accounts.
29
+ * @returns The accounts.
31
30
  */
32
31
  getAccounts(): Account[];
33
32
  /**
34
- * Gets the "blockchain" account for a given account ID.
33
+ * Gets the account for a given account ID.
35
34
  *
36
35
  * @param id - Account ID.
37
- * @returns The "blockchain" account or undefined if not found.
36
+ * @returns The account or undefined if not found.
38
37
  */
39
38
  getAccount(id: Account['id']): Account | undefined;
40
39
  };
@@ -1 +1 @@
1
- {"version":3,"file":"group.d.cts","sourceRoot":"","sources":["../../src/api/group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA8B;AAG5D,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,qBAAiB;AAE/D;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,EAAE,MAAkB,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,GAAG,eAAe,IAAI,MAAM,EAAE,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS,cAAc,IAAI;IACzD;;OAEG;IACH,IAAI,EAAE,IAAI,cAAc,CAAC;IAEzB;;OAEG;IACH,IAAI,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IAErC;;;;;OAKG;IACH,WAAW,IAAI,OAAO,EAAE,CAAC;IAEzB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,SAAS,CAAC;CACpD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,eAAe,EACzB,EAAE,EAAE,MAAM,GACT,cAAc,CAEhB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,eAAe,GACxB,cAAc,CAEhB"}
1
+ {"version":3,"file":"group.d.cts","sourceRoot":"","sources":["../../src/api/group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA8B;AAG5D,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,qBAAiB;AAE/D;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,EAAE,MAAkB,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,GAAG,eAAe,IAAI,MAAM,EAAE,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS,cAAc,IAAI;IACzD;;OAEG;IACH,IAAI,EAAE,IAAI,cAAc,CAAC;IAEzB;;OAEG;IACH,IAAI,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IAErC;;;;OAIG;IACH,WAAW,IAAI,OAAO,EAAE,CAAC;IAEzB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,SAAS,CAAC;CACpD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,eAAe,EACzB,EAAE,EAAE,MAAM,GACT,cAAc,CAEhB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,eAAe,GACxB,cAAc,CAEhB"}
@@ -24,17 +24,16 @@ export type AccountGroup<Account extends KeyringAccount> = {
24
24
  */
25
25
  get wallet(): AccountWallet<Account>;
26
26
  /**
27
- * Gets the "blockchain" accounts for this account group.
27
+ * Gets the accounts for this account group.
28
28
  *
29
- * @param id - Account ID.
30
- * @returns The "blockchain" accounts.
29
+ * @returns The accounts.
31
30
  */
32
31
  getAccounts(): Account[];
33
32
  /**
34
- * Gets the "blockchain" account for a given account ID.
33
+ * Gets the account for a given account ID.
35
34
  *
36
35
  * @param id - Account ID.
37
- * @returns The "blockchain" account or undefined if not found.
36
+ * @returns The account or undefined if not found.
38
37
  */
39
38
  getAccount(id: Account['id']): Account | undefined;
40
39
  };
@@ -1 +1 @@
1
- {"version":3,"file":"group.d.mts","sourceRoot":"","sources":["../../src/api/group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA8B;AAG5D,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,qBAAiB;AAE/D;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,EAAE,MAAkB,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,GAAG,eAAe,IAAI,MAAM,EAAE,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS,cAAc,IAAI;IACzD;;OAEG;IACH,IAAI,EAAE,IAAI,cAAc,CAAC;IAEzB;;OAEG;IACH,IAAI,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IAErC;;;;;OAKG;IACH,WAAW,IAAI,OAAO,EAAE,CAAC;IAEzB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,SAAS,CAAC;CACpD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,eAAe,EACzB,EAAE,EAAE,MAAM,GACT,cAAc,CAEhB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,eAAe,GACxB,cAAc,CAEhB"}
1
+ {"version":3,"file":"group.d.mts","sourceRoot":"","sources":["../../src/api/group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA8B;AAG5D,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,qBAAiB;AAE/D;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,EAAE,MAAkB,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,GAAG,eAAe,IAAI,MAAM,EAAE,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS,cAAc,IAAI;IACzD;;OAEG;IACH,IAAI,EAAE,IAAI,cAAc,CAAC;IAEzB;;OAEG;IACH,IAAI,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IAErC;;;;OAIG;IACH,WAAW,IAAI,OAAO,EAAE,CAAC;IAEzB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,SAAS,CAAC;CACpD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,eAAe,EACzB,EAAE,EAAE,MAAM,GACT,cAAc,CAEhB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,eAAe,GACxB,cAAc,CAEhB"}
@@ -1 +1 @@
1
- {"version":3,"file":"group.mjs","sourceRoot":"","sources":["../../src/api/group.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAW,SAAS,CAAC;AAsCjE;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAyB,EACzB,EAAU;IAEV,OAAO,GAAG,QAAQ,IAAI,EAAE,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAyB;IAEzB,OAAO,gBAAgB,CAAC,QAAQ,EAAE,+BAA+B,CAAC,CAAC;AACrE,CAAC","sourcesContent":["import type { KeyringAccount } from '@metamask/keyring-api';\n\n// Circular import are allowed when using `import type`.\nimport type { AccountWallet, AccountWalletId } from './wallet';\n\n/**\n * Default account group unique ID.\n *\n * This constant can be used to reference the \"default\" group from\n * an account wallet.\n */\nexport const DEFAULT_ACCOUNT_GROUP_UNIQUE_ID: string = 'default';\n\n/**\n * Account group ID.\n */\nexport type AccountGroupId = `${AccountWalletId}/${string}`;\n\n/**\n * Account group that can hold multiple accounts.\n */\nexport type AccountGroup<Account extends KeyringAccount> = {\n /**\n * Account group ID.\n */\n get id(): AccountGroupId;\n\n /**\n * Account wallet (parent).\n */\n get wallet(): AccountWallet<Account>;\n\n /**\n * Gets the \"blockchain\" accounts for this account group.\n *\n * @param id - Account ID.\n * @returns The \"blockchain\" accounts.\n */\n getAccounts(): Account[];\n\n /**\n * Gets the \"blockchain\" account for a given account ID.\n *\n * @param id - Account ID.\n * @returns The \"blockchain\" account or undefined if not found.\n */\n getAccount(id: Account['id']): Account | undefined;\n};\n\n/**\n * Convert a wallet ID and a unique ID, to a group ID.\n *\n * @param walletId - A wallet ID.\n * @param id - A unique ID.\n * @returns A group ID.\n */\nexport function toAccountGroupId(\n walletId: AccountWalletId,\n id: string,\n): AccountGroupId {\n return `${walletId}/${id}`;\n}\n\n/**\n * Convert a wallet ID to the default group ID.\n *\n * @param walletId - A wallet ID.\n * @returns The default group ID.\n */\nexport function toDefaultAccountGroupId(\n walletId: AccountWalletId,\n): AccountGroupId {\n return toAccountGroupId(walletId, DEFAULT_ACCOUNT_GROUP_UNIQUE_ID);\n}\n"]}
1
+ {"version":3,"file":"group.mjs","sourceRoot":"","sources":["../../src/api/group.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAW,SAAS,CAAC;AAqCjE;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAyB,EACzB,EAAU;IAEV,OAAO,GAAG,QAAQ,IAAI,EAAE,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAyB;IAEzB,OAAO,gBAAgB,CAAC,QAAQ,EAAE,+BAA+B,CAAC,CAAC;AACrE,CAAC","sourcesContent":["import type { KeyringAccount } from '@metamask/keyring-api';\n\n// Circular import are allowed when using `import type`.\nimport type { AccountWallet, AccountWalletId } from './wallet';\n\n/**\n * Default account group unique ID.\n *\n * This constant can be used to reference the \"default\" group from\n * an account wallet.\n */\nexport const DEFAULT_ACCOUNT_GROUP_UNIQUE_ID: string = 'default';\n\n/**\n * Account group ID.\n */\nexport type AccountGroupId = `${AccountWalletId}/${string}`;\n\n/**\n * Account group that can hold multiple accounts.\n */\nexport type AccountGroup<Account extends KeyringAccount> = {\n /**\n * Account group ID.\n */\n get id(): AccountGroupId;\n\n /**\n * Account wallet (parent).\n */\n get wallet(): AccountWallet<Account>;\n\n /**\n * Gets the accounts for this account group.\n *\n * @returns The accounts.\n */\n getAccounts(): Account[];\n\n /**\n * Gets the account for a given account ID.\n *\n * @param id - Account ID.\n * @returns The account or undefined if not found.\n */\n getAccount(id: Account['id']): Account | undefined;\n};\n\n/**\n * Convert a wallet ID and a unique ID, to a group ID.\n *\n * @param walletId - A wallet ID.\n * @param id - A unique ID.\n * @returns A group ID.\n */\nexport function toAccountGroupId(\n walletId: AccountWalletId,\n id: string,\n): AccountGroupId {\n return `${walletId}/${id}`;\n}\n\n/**\n * Convert a wallet ID to the default group ID.\n *\n * @param walletId - A wallet ID.\n * @returns The default group ID.\n */\nexport function toDefaultAccountGroupId(\n walletId: AccountWalletId,\n): AccountGroupId {\n return toAccountGroupId(walletId, DEFAULT_ACCOUNT_GROUP_UNIQUE_ID);\n}\n"]}
@@ -14,6 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./bip44.cjs"), exports);
17
18
  __exportStar(require("./group.cjs"), exports);
18
19
  __exportStar(require("./wallet.cjs"), exports);
19
20
  __exportStar(require("./multichain/index.cjs"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAAwB;AACxB,+CAAyB;AACzB,yDAA6B","sourcesContent":["export * from './group';\nexport * from './wallet';\nexport * from './multichain';\n"]}
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAAwB;AACxB,8CAAwB;AACxB,+CAAyB;AAGzB,yDAA6B","sourcesContent":["export * from './bip44';\nexport * from './group';\nexport * from './wallet';\nexport type * from './provider';\nexport type * from './selector';\nexport * from './multichain';\n"]}
@@ -1,4 +1,7 @@
1
+ export * from "./bip44.cjs";
1
2
  export * from "./group.cjs";
2
3
  export * from "./wallet.cjs";
4
+ export type * from "./provider.cjs";
5
+ export type * from "./selector.cjs";
3
6
  export * from "./multichain/index.cjs";
4
7
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,4BAAwB;AACxB,6BAAyB;AACzB,uCAA6B"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,4BAAwB;AACxB,4BAAwB;AACxB,6BAAyB;AACzB,oCAAgC;AAChC,oCAAgC;AAChC,uCAA6B"}
@@ -1,4 +1,7 @@
1
+ export * from "./bip44.mjs";
1
2
  export * from "./group.mjs";
2
3
  export * from "./wallet.mjs";
4
+ export type * from "./provider.mjs";
5
+ export type * from "./selector.mjs";
3
6
  export * from "./multichain/index.mjs";
4
7
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,4BAAwB;AACxB,6BAAyB;AACzB,uCAA6B"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,4BAAwB;AACxB,4BAAwB;AACxB,6BAAyB;AACzB,oCAAgC;AAChC,oCAAgC;AAChC,uCAA6B"}
@@ -1,3 +1,4 @@
1
+ export * from "./bip44.mjs";
1
2
  export * from "./group.mjs";
2
3
  export * from "./wallet.mjs";
3
4
  export * from "./multichain/index.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,4BAAwB;AACxB,6BAAyB;AACzB,uCAA6B","sourcesContent":["export * from './group';\nexport * from './wallet';\nexport * from './multichain';\n"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,4BAAwB;AACxB,4BAAwB;AACxB,6BAAyB;AAGzB,uCAA6B","sourcesContent":["export * from './bip44';\nexport * from './group';\nexport * from './wallet';\nexport type * from './provider';\nexport type * from './selector';\nexport * from './multichain';\n"]}
@@ -10,64 +10,89 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
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
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _MultichainAccountAdapter_id, _MultichainAccountAdapter_wallet, _MultichainAccountAdapter_index, _MultichainAccountAdapter_providers, _MultichainAccountAdapter_providersByAccountId, _MultichainAccountAdapter_accounts;
13
+ var _MultichainAccount_id, _MultichainAccount_wallet, _MultichainAccount_index, _MultichainAccount_providers;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.MultichainAccountAdapter = void 0;
15
+ exports.MultichainAccount = void 0;
16
16
  exports.toMultichainAccountId = toMultichainAccountId;
17
- exports.getGroupIndexFromAccountGroupId = getGroupIndexFromAccountGroupId;
17
+ exports.isMultichainAccountId = isMultichainAccountId;
18
+ exports.getGroupIndexFromMultichainAccountId = getGroupIndexFromMultichainAccountId;
18
19
  const keyring_utils_1 = require("@metamask/keyring-utils");
19
20
  const wallet_1 = require("../wallet.cjs");
20
- const MULTICHAIN_ACCOUNT_GROUP_INDEX_REGEX = new RegExp(`^${wallet_1.AccountWalletCategory.Entropy}:.*/(?<groupIndex>\\d+)$`, 'u');
21
- class MultichainAccountAdapter {
21
+ const MULTICHAIN_ACCOUNT_ID_REGEX = new RegExp(`^${wallet_1.AccountWalletCategory.Entropy}:.*/(?<groupIndex>\\d+)$`, 'u');
22
+ /**
23
+ * A multichain account that holds multiple accounts.
24
+ */
25
+ class MultichainAccount {
22
26
  constructor({ groupIndex, wallet, providers, }) {
23
- _MultichainAccountAdapter_id.set(this, void 0);
24
- _MultichainAccountAdapter_wallet.set(this, void 0);
25
- _MultichainAccountAdapter_index.set(this, void 0);
26
- _MultichainAccountAdapter_providers.set(this, void 0);
27
- _MultichainAccountAdapter_providersByAccountId.set(this, void 0);
28
- _MultichainAccountAdapter_accounts.set(this, void 0);
29
- __classPrivateFieldSet(this, _MultichainAccountAdapter_id, toMultichainAccountId(wallet.id, groupIndex), "f");
30
- __classPrivateFieldSet(this, _MultichainAccountAdapter_index, groupIndex, "f");
31
- __classPrivateFieldSet(this, _MultichainAccountAdapter_wallet, wallet, "f");
32
- __classPrivateFieldSet(this, _MultichainAccountAdapter_providers, providers, "f");
33
- __classPrivateFieldSet(this, _MultichainAccountAdapter_accounts, new Map(), "f");
34
- __classPrivateFieldSet(this, _MultichainAccountAdapter_providersByAccountId, new Map(), "f");
35
- for (const provider of __classPrivateFieldGet(this, _MultichainAccountAdapter_providers, "f")) {
36
- const accounts = provider.getAccounts({
37
- entropySource: __classPrivateFieldGet(this, _MultichainAccountAdapter_wallet, "f").entropySource,
38
- groupIndex: __classPrivateFieldGet(this, _MultichainAccountAdapter_index, "f"),
39
- });
40
- __classPrivateFieldGet(this, _MultichainAccountAdapter_accounts, "f").set(provider, accounts);
41
- for (const id of accounts) {
42
- __classPrivateFieldGet(this, _MultichainAccountAdapter_providersByAccountId, "f").set(id, provider);
43
- }
44
- }
27
+ _MultichainAccount_id.set(this, void 0);
28
+ _MultichainAccount_wallet.set(this, void 0);
29
+ _MultichainAccount_index.set(this, void 0);
30
+ _MultichainAccount_providers.set(this, void 0);
31
+ __classPrivateFieldSet(this, _MultichainAccount_id, toMultichainAccountId(wallet.id, groupIndex), "f");
32
+ __classPrivateFieldSet(this, _MultichainAccount_index, groupIndex, "f");
33
+ __classPrivateFieldSet(this, _MultichainAccount_wallet, wallet, "f");
34
+ __classPrivateFieldSet(this, _MultichainAccount_providers, providers, "f");
45
35
  }
36
+ /**
37
+ * Gets the multichain account ID.
38
+ *
39
+ * @returns The multichain account ID.
40
+ */
46
41
  get id() {
47
- return __classPrivateFieldGet(this, _MultichainAccountAdapter_id, "f");
42
+ return __classPrivateFieldGet(this, _MultichainAccount_id, "f");
48
43
  }
44
+ /**
45
+ * Gets the multichain account's wallet reference (parent).
46
+ *
47
+ * @returns The multichain account's wallet.
48
+ */
49
49
  get wallet() {
50
- return __classPrivateFieldGet(this, _MultichainAccountAdapter_wallet, "f");
50
+ return __classPrivateFieldGet(this, _MultichainAccount_wallet, "f");
51
51
  }
52
+ /**
53
+ * Gets the multichain account group index.
54
+ *
55
+ * @returns The multichain account group index.
56
+ */
52
57
  get index() {
53
- return __classPrivateFieldGet(this, _MultichainAccountAdapter_index, "f");
54
- }
55
- hasAccounts() {
56
- // Use this map, cause if there's no accounts, then this map will also
57
- // be empty.
58
- return __classPrivateFieldGet(this, _MultichainAccountAdapter_providersByAccountId, "f").size > 0;
58
+ return __classPrivateFieldGet(this, _MultichainAccount_index, "f");
59
59
  }
60
+ /**
61
+ * Gets the accounts for this multichain account.
62
+ *
63
+ * @returns The accounts.
64
+ */
60
65
  getAccounts() {
61
66
  let allAccounts = [];
62
- for (const [provider, accounts] of __classPrivateFieldGet(this, _MultichainAccountAdapter_accounts, "f").entries()) {
63
- allAccounts = allAccounts.concat(accounts.map((id) => provider.getAccount(id)));
67
+ for (const provider of __classPrivateFieldGet(this, _MultichainAccount_providers, "f")) {
68
+ allAccounts = allAccounts.concat(provider.getAccounts().filter(
69
+ // NOTE: For now we always query the providers to get the latest
70
+ // account list. If this becomes too "heavy" in terms of computation
71
+ // we might wanna consider adding a state to that object and store
72
+ // the list of account IDs here.
73
+ (account) => account.options.entropy.id === this.wallet.entropySource &&
74
+ account.options.entropy.groupIndex === this.index));
64
75
  }
65
76
  return allAccounts;
66
77
  }
78
+ /**
79
+ * Gets the account for a given account ID.
80
+ *
81
+ * @param id - Account ID.
82
+ * @returns The account or undefined if not found.
83
+ */
67
84
  getAccount(id) {
68
- const provider = __classPrivateFieldGet(this, _MultichainAccountAdapter_providersByAccountId, "f").get(id);
69
- return provider?.getAccount(id);
85
+ // NOTE: Same remark here. We could keep a state to make this operation
86
+ // faster.
87
+ return this.getAccounts().find((account) => account.id === id);
70
88
  }
89
+ /**
90
+ * Query an account matching the selector.
91
+ *
92
+ * @param selector - Query selector.
93
+ * @returns The account matching the selector or undefined if not matching.
94
+ * @throws If multiple accounts match the selector.
95
+ */
71
96
  get(selector) {
72
97
  const accounts = this.select(selector);
73
98
  if (accounts.length > 1) {
@@ -78,6 +103,12 @@ class MultichainAccountAdapter {
78
103
  }
79
104
  return accounts[0]; // This is safe, see checks above.
80
105
  }
106
+ /**
107
+ * Query accounts matching the selector.
108
+ *
109
+ * @param selector - Query selector.
110
+ * @returns The accounts matching the selector.
111
+ */
81
112
  select(selector) {
82
113
  return this.getAccounts().filter((account) => {
83
114
  let selected = true;
@@ -104,8 +135,8 @@ class MultichainAccountAdapter {
104
135
  });
105
136
  }
106
137
  }
107
- exports.MultichainAccountAdapter = MultichainAccountAdapter;
108
- _MultichainAccountAdapter_id = new WeakMap(), _MultichainAccountAdapter_wallet = new WeakMap(), _MultichainAccountAdapter_index = new WeakMap(), _MultichainAccountAdapter_providers = new WeakMap(), _MultichainAccountAdapter_providersByAccountId = new WeakMap(), _MultichainAccountAdapter_accounts = new WeakMap();
138
+ exports.MultichainAccount = MultichainAccount;
139
+ _MultichainAccount_id = new WeakMap(), _MultichainAccount_wallet = new WeakMap(), _MultichainAccount_index = new WeakMap(), _MultichainAccount_providers = new WeakMap();
109
140
  /**
110
141
  * Gets the multichain account ID from its multichain account wallet ID and its index.
111
142
  *
@@ -116,20 +147,28 @@ _MultichainAccountAdapter_id = new WeakMap(), _MultichainAccountAdapter_wallet =
116
147
  function toMultichainAccountId(walletId, groupIndex) {
117
148
  return `${walletId}/${groupIndex}`;
118
149
  }
150
+ /**
151
+ * Checks if the given value is {@link MultichainAccountId}.
152
+ *
153
+ * @param value - The value to check.
154
+ * @returns Whether the value is a {@link MultichainAccountId}.
155
+ */
156
+ function isMultichainAccountId(value) {
157
+ return MULTICHAIN_ACCOUNT_ID_REGEX.test(value);
158
+ }
119
159
  /**
120
160
  * Gets the multichain account index from an account group ID.
121
161
  *
122
- * @param groupId - Account group ID.
162
+ * @param id - Multichain account ID.
123
163
  * @returns The multichain account index if extractable, undefined otherwise.
124
164
  */
125
- function getGroupIndexFromAccountGroupId(groupId) {
126
- const matched = groupId.match(MULTICHAIN_ACCOUNT_GROUP_INDEX_REGEX);
127
- if (matched) {
128
- if (matched.groups?.groupIndex !== undefined) {
129
- return Number(matched.groups.groupIndex);
130
- }
165
+ function getGroupIndexFromMultichainAccountId(id) {
166
+ const matched = id.match(MULTICHAIN_ACCOUNT_ID_REGEX);
167
+ if (matched?.groups?.groupIndex === undefined) {
168
+ // Unable to extract group index, even though, type wise, this should not
169
+ // be possible!
170
+ throw new Error('Unable to extract group index');
131
171
  }
132
- // Unable to extract group index.
133
- return undefined;
172
+ return Number(matched.groups.groupIndex);
134
173
  }
135
174
  //# sourceMappingURL=account.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"account.cjs","sourceRoot":"","sources":["../../../src/api/multichain/account.ts"],"names":[],"mappings":"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","sourcesContent":["import type { KeyringAccount } from '@metamask/keyring-api';\nimport { isScopeEqualToAny } from '@metamask/keyring-utils';\n\nimport type { MultichainAccountProvider } from './provider';\nimport type {\n MultichainAccountWallet,\n MultichainAccountWalletId,\n} from './wallet';\nimport type { AccountGroup, AccountGroupId } from '../group';\nimport { AccountWalletCategory } from '../wallet';\n\nconst MULTICHAIN_ACCOUNT_GROUP_INDEX_REGEX = new RegExp(\n `^${AccountWalletCategory.Entropy}:.*/(?<groupIndex>\\\\d+)$`,\n 'u',\n);\n\n/**\n * Selector to query a specific \"blockchain\" account based on some criteria.\n */\nexport type MultichainAccountSelector<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\n/**\n * Multichain account ID.\n */\nexport type MultichainAccountId = `${MultichainAccountWalletId}/${number}`; // Use number for the account group index.\n\n/**\n * A multichain account that holds multiple \"blockchain\" accounts.\n */\nexport type MultichainAccount<Account extends KeyringAccount> =\n AccountGroup<Account> & {\n /**\n * Multichain account ID.\n */\n get id(): MultichainAccountId;\n\n /**\n * Multichain account's wallet reference (parent).\n */\n get wallet(): MultichainAccountWallet<Account>;\n\n /**\n * Multichain account group index.\n */\n get index(): number;\n\n /**\n * Gets the \"blockchain\" accounts for this multichain account.\n *\n * @param id - Account ID.\n * @returns The \"blockchain\" accounts.\n */\n getAccounts(): Account[];\n\n /**\n * Gets the \"blockchain\" account for a given account ID.\n *\n * @param id - Account ID.\n * @returns The \"blockchain\" account or undefined if not found.\n */\n getAccount(id: Account['id']): Account | undefined;\n\n /**\n * Query a \"blockchain\" account matching the selector.\n *\n * @param selector - Query selector.\n * @returns The \"blockchain\" account matching the selector or undefined if not matching.\n * @throws If multiple accounts match the selector.\n */\n get(selector: MultichainAccountSelector<Account>): Account | undefined;\n\n /**\n * Query \"blockchain\" accounts matching the selector.\n *\n * @param selector - Query selector.\n * @returns The \"blockchain\" accounts matching the selector.\n */\n select(selector: MultichainAccountSelector<Account>): Account[];\n };\n\nexport class MultichainAccountAdapter<Account extends KeyringAccount>\n implements MultichainAccount<Account>\n{\n readonly #id: MultichainAccountId;\n\n readonly #wallet: MultichainAccountWallet<Account>;\n\n readonly #index: number;\n\n readonly #providers: MultichainAccountProvider<Account>[];\n\n readonly #providersByAccountId: Map<\n Account['id'],\n MultichainAccountProvider<Account>\n >;\n\n readonly #accounts: Map<MultichainAccountProvider<Account>, Account['id'][]>;\n\n constructor({\n groupIndex,\n wallet,\n providers,\n }: {\n groupIndex: number;\n wallet: MultichainAccountWallet<Account>;\n providers: MultichainAccountProvider<Account>[];\n }) {\n this.#id = toMultichainAccountId(wallet.id, groupIndex);\n this.#index = groupIndex;\n this.#wallet = wallet;\n this.#providers = providers;\n this.#accounts = new Map();\n this.#providersByAccountId = new Map();\n\n for (const provider of this.#providers) {\n const accounts = provider.getAccounts({\n entropySource: this.#wallet.entropySource,\n groupIndex: this.#index,\n });\n\n this.#accounts.set(provider, accounts);\n for (const id of accounts) {\n this.#providersByAccountId.set(id, provider);\n }\n }\n }\n\n get id(): MultichainAccountId {\n return this.#id;\n }\n\n get wallet(): MultichainAccountWallet<Account> {\n return this.#wallet;\n }\n\n get index(): number {\n return this.#index;\n }\n\n hasAccounts(): boolean {\n // Use this map, cause if there's no accounts, then this map will also\n // be empty.\n return this.#providersByAccountId.size > 0;\n }\n\n getAccounts(): Account[] {\n let allAccounts: Account[] = [];\n\n for (const [provider, accounts] of this.#accounts.entries()) {\n allAccounts = allAccounts.concat(\n accounts.map((id) => provider.getAccount(id)),\n );\n }\n\n return allAccounts;\n }\n\n getAccount(id: Account['id']): Account | undefined {\n const provider = this.#providersByAccountId.get(id);\n\n return provider?.getAccount(id);\n }\n\n get(selector: MultichainAccountSelector<Account>): Account | undefined {\n const accounts = this.select(selector);\n\n if (accounts.length > 1) {\n throw new Error(\n `Too many account candidates, expected 1, got: ${accounts.length}`,\n );\n }\n\n if (accounts.length === 0) {\n return undefined;\n }\n\n return accounts[0]; // This is safe, see checks above.\n }\n\n select(selector: MultichainAccountSelector<Account>): Account[] {\n return this.getAccounts().filter((account) => {\n let selected = true;\n\n if (selector.id) {\n selected &&= account.id === selector.id;\n }\n if (selector.address) {\n selected &&= account.address === selector.address;\n }\n if (selector.type) {\n selected &&= account.type === selector.type;\n }\n if (selector.methods !== undefined) {\n selected &&= selector.methods.some((method) =>\n account.methods.includes(method),\n );\n }\n if (selector.scopes !== undefined) {\n selected &&= selector.scopes.some((scope) => {\n return (\n // This will cover specific EVM EOA scopes as well.\n isScopeEqualToAny(scope, account.scopes)\n );\n });\n }\n\n return selected;\n });\n }\n}\n\n/**\n * Gets the multichain account ID from its multichain account wallet ID and its index.\n *\n * @param walletId - Multichain account wallet ID.\n * @param groupIndex - Index of that multichain account.\n * @returns The multichain account ID.\n */\nexport function toMultichainAccountId(\n walletId: MultichainAccountWalletId,\n groupIndex: number,\n): MultichainAccountId {\n return `${walletId}/${groupIndex}`;\n}\n\n/**\n * Gets the multichain account index from an account group ID.\n *\n * @param groupId - Account group ID.\n * @returns The multichain account index if extractable, undefined otherwise.\n */\nexport function getGroupIndexFromAccountGroupId(\n groupId: AccountGroupId,\n): number | undefined {\n const matched = groupId.match(MULTICHAIN_ACCOUNT_GROUP_INDEX_REGEX);\n if (matched) {\n if (matched.groups?.groupIndex !== undefined) {\n return Number(matched.groups.groupIndex);\n }\n }\n\n // Unable to extract group index.\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"account.cjs","sourceRoot":"","sources":["../../../src/api/multichain/account.ts"],"names":[],"mappings":"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","sourcesContent":["import { type KeyringAccount } from '@metamask/keyring-api';\nimport { isScopeEqualToAny } from '@metamask/keyring-utils';\n\nimport type {\n MultichainAccountWallet,\n MultichainAccountWalletId,\n} from './wallet';\nimport type { Bip44Account } from '../bip44';\nimport type { AccountGroup } from '../group';\nimport type { AccountProvider } from '../provider';\nimport type { AccountSelector } from '../selector';\nimport { AccountWalletCategory } from '../wallet';\n\nconst MULTICHAIN_ACCOUNT_ID_REGEX = new RegExp(\n `^${AccountWalletCategory.Entropy}:.*/(?<groupIndex>\\\\d+)$`,\n 'u',\n);\n\n/**\n * Multichain account ID.\n */\nexport type MultichainAccountId = `${MultichainAccountWalletId}/${number}`; // Use number for the account group index.\n\n/**\n * A multichain account that holds multiple accounts.\n */\nexport class MultichainAccount<Account extends Bip44Account<KeyringAccount>>\n implements AccountGroup<Account>\n{\n readonly #id: MultichainAccountId;\n\n readonly #wallet: MultichainAccountWallet<Account>;\n\n readonly #index: number;\n\n readonly #providers: AccountProvider<Account>[];\n\n constructor({\n groupIndex,\n wallet,\n providers,\n }: {\n groupIndex: number;\n wallet: MultichainAccountWallet<Account>;\n providers: AccountProvider<Account>[];\n }) {\n this.#id = toMultichainAccountId(wallet.id, groupIndex);\n this.#index = groupIndex;\n this.#wallet = wallet;\n this.#providers = providers;\n }\n\n /**\n * Gets the multichain account ID.\n *\n * @returns The multichain account ID.\n */\n get id(): MultichainAccountId {\n return this.#id;\n }\n\n /**\n * Gets the multichain account's wallet reference (parent).\n *\n * @returns The multichain account's wallet.\n */\n get wallet(): MultichainAccountWallet<Account> {\n return this.#wallet;\n }\n\n /**\n * Gets the multichain account group index.\n *\n * @returns The multichain account group index.\n */\n get index(): number {\n return this.#index;\n }\n\n /**\n * Gets the accounts for this multichain account.\n *\n * @returns The accounts.\n */\n getAccounts(): Account[] {\n let allAccounts: Account[] = [];\n\n for (const provider of this.#providers) {\n allAccounts = allAccounts.concat(\n provider.getAccounts().filter(\n // NOTE: For now we always query the providers to get the latest\n // account list. If this becomes too \"heavy\" in terms of computation\n // we might wanna consider adding a state to that object and store\n // the list of account IDs here.\n (account) =>\n account.options.entropy.id === this.wallet.entropySource &&\n account.options.entropy.groupIndex === this.index,\n ),\n );\n }\n\n return allAccounts;\n }\n\n /**\n * Gets the account for a given account ID.\n *\n * @param id - Account ID.\n * @returns The account or undefined if not found.\n */\n getAccount(id: Account['id']): Account | undefined {\n // NOTE: Same remark here. We could keep a state to make this operation\n // faster.\n return this.getAccounts().find((account) => account.id === id);\n }\n\n /**\n * Query an account matching the selector.\n *\n * @param selector - Query selector.\n * @returns The account matching the selector or undefined if not matching.\n * @throws If multiple accounts match the selector.\n */\n get(selector: AccountSelector<Account>): Account | undefined {\n const accounts = this.select(selector);\n\n if (accounts.length > 1) {\n throw new Error(\n `Too many account candidates, expected 1, got: ${accounts.length}`,\n );\n }\n\n if (accounts.length === 0) {\n return undefined;\n }\n\n return accounts[0]; // This is safe, see checks above.\n }\n\n /**\n * Query accounts matching the selector.\n *\n * @param selector - Query selector.\n * @returns The accounts matching the selector.\n */\n select(selector: AccountSelector<Account>): Account[] {\n return this.getAccounts().filter((account) => {\n let selected = true;\n\n if (selector.id) {\n selected &&= account.id === selector.id;\n }\n if (selector.address) {\n selected &&= account.address === selector.address;\n }\n if (selector.type) {\n selected &&= account.type === selector.type;\n }\n if (selector.methods !== undefined) {\n selected &&= selector.methods.some((method) =>\n account.methods.includes(method),\n );\n }\n if (selector.scopes !== undefined) {\n selected &&= selector.scopes.some((scope) => {\n return (\n // This will cover specific EVM EOA scopes as well.\n isScopeEqualToAny(scope, account.scopes)\n );\n });\n }\n\n return selected;\n });\n }\n}\n\n/**\n * Gets the multichain account ID from its multichain account wallet ID and its index.\n *\n * @param walletId - Multichain account wallet ID.\n * @param groupIndex - Index of that multichain account.\n * @returns The multichain account ID.\n */\nexport function toMultichainAccountId(\n walletId: MultichainAccountWalletId,\n groupIndex: number,\n): MultichainAccountId {\n return `${walletId}/${groupIndex}`;\n}\n\n/**\n * Checks if the given value is {@link MultichainAccountId}.\n *\n * @param value - The value to check.\n * @returns Whether the value is a {@link MultichainAccountId}.\n */\nexport function isMultichainAccountId(\n value: string,\n): value is MultichainAccountId {\n return MULTICHAIN_ACCOUNT_ID_REGEX.test(value);\n}\n\n/**\n * Gets the multichain account index from an account group ID.\n *\n * @param id - Multichain account ID.\n * @returns The multichain account index if extractable, undefined otherwise.\n */\nexport function getGroupIndexFromMultichainAccountId(\n id: MultichainAccountId,\n): number {\n const matched = id.match(MULTICHAIN_ACCOUNT_ID_REGEX);\n if (matched?.groups?.groupIndex === undefined) {\n // Unable to extract group index, even though, type wise, this should not\n // be possible!\n throw new Error('Unable to extract group index');\n }\n\n return Number(matched.groups.groupIndex);\n}\n"]}