@metamask-previews/account-api 0.1.0-e86c8ec → 0.2.0-77f7003
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.
- package/CHANGELOG.md +24 -1
- package/dist/api/bip44.cjs +16 -0
- package/dist/api/bip44.cjs.map +1 -0
- package/dist/api/bip44.d.cts +17 -0
- package/dist/api/bip44.d.cts.map +1 -0
- package/dist/api/bip44.d.mts +17 -0
- package/dist/api/bip44.d.mts.map +1 -0
- package/dist/api/bip44.mjs +13 -0
- package/dist/api/bip44.mjs.map +1 -0
- package/dist/api/index.cjs +1 -0
- package/dist/api/index.cjs.map +1 -1
- package/dist/api/index.d.cts +1 -0
- package/dist/api/index.d.cts.map +1 -1
- package/dist/api/index.d.mts +1 -0
- package/dist/api/index.d.mts.map +1 -1
- package/dist/api/index.mjs +1 -0
- package/dist/api/index.mjs.map +1 -1
- package/dist/api/multichain/account.cjs +54 -19
- package/dist/api/multichain/account.cjs.map +1 -1
- package/dist/api/multichain/account.d.cts +9 -1
- package/dist/api/multichain/account.d.cts.map +1 -1
- package/dist/api/multichain/account.d.mts +9 -1
- package/dist/api/multichain/account.d.mts.map +1 -1
- package/dist/api/multichain/account.mjs +54 -19
- package/dist/api/multichain/account.mjs.map +1 -1
- package/dist/api/multichain/wallet.cjs +29 -34
- package/dist/api/multichain/wallet.cjs.map +1 -1
- package/dist/api/multichain/wallet.d.cts +6 -7
- package/dist/api/multichain/wallet.d.cts.map +1 -1
- package/dist/api/multichain/wallet.d.mts +6 -7
- package/dist/api/multichain/wallet.d.mts.map +1 -1
- package/dist/api/multichain/wallet.mjs +29 -34
- package/dist/api/multichain/wallet.mjs.map +1 -1
- package/dist/api/provider.cjs.map +1 -1
- package/dist/api/provider.d.cts +6 -0
- package/dist/api/provider.d.cts.map +1 -1
- package/dist/api/provider.d.mts +6 -0
- package/dist/api/provider.d.mts.map +1 -1
- package/dist/api/provider.mjs.map +1 -1
- package/package.json +5 -4
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.
|
|
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"]}
|
package/dist/api/index.cjs
CHANGED
|
@@ -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);
|
package/dist/api/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAAwB;AACxB,+CAAyB;AAGzB,yDAA6B","sourcesContent":["export * from './group';\nexport * from './wallet';\nexport type * from './provider';\nexport type * from './selector';\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"]}
|
package/dist/api/index.d.cts
CHANGED
package/dist/api/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,4BAAwB;AACxB,6BAAyB;AACzB,oCAAgC;AAChC,oCAAgC;AAChC,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"}
|
package/dist/api/index.d.mts
CHANGED
package/dist/api/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,4BAAwB;AACxB,6BAAyB;AACzB,oCAAgC;AAChC,oCAAgC;AAChC,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"}
|
package/dist/api/index.mjs
CHANGED
package/dist/api/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,4BAAwB;AACxB,6BAAyB;AAGzB,uCAA6B","sourcesContent":["export * from './group';\nexport * from './wallet';\nexport type * from './provider';\nexport type * from './selector';\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,13 +10,12 @@ 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 _MultichainAccount_id, _MultichainAccount_wallet, _MultichainAccount_index, _MultichainAccount_providers;
|
|
13
|
+
var _MultichainAccount_id, _MultichainAccount_wallet, _MultichainAccount_index, _MultichainAccount_providers, _MultichainAccount_accounts, _MultichainAccount_reverse;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.MultichainAccount = void 0;
|
|
16
16
|
exports.toMultichainAccountId = toMultichainAccountId;
|
|
17
17
|
exports.isMultichainAccountId = isMultichainAccountId;
|
|
18
18
|
exports.getGroupIndexFromMultichainAccountId = getGroupIndexFromMultichainAccountId;
|
|
19
|
-
const keyring_api_1 = require("@metamask/keyring-api");
|
|
20
19
|
const keyring_utils_1 = require("@metamask/keyring-utils");
|
|
21
20
|
const wallet_1 = require("../wallet.cjs");
|
|
22
21
|
const MULTICHAIN_ACCOUNT_ID_REGEX = new RegExp(`^${wallet_1.AccountWalletCategory.Entropy}:.*/(?<groupIndex>\\d+)$`, 'u');
|
|
@@ -29,10 +28,42 @@ class MultichainAccount {
|
|
|
29
28
|
_MultichainAccount_wallet.set(this, void 0);
|
|
30
29
|
_MultichainAccount_index.set(this, void 0);
|
|
31
30
|
_MultichainAccount_providers.set(this, void 0);
|
|
31
|
+
_MultichainAccount_accounts.set(this, void 0);
|
|
32
|
+
_MultichainAccount_reverse.set(this, void 0);
|
|
32
33
|
__classPrivateFieldSet(this, _MultichainAccount_id, toMultichainAccountId(wallet.id, groupIndex), "f");
|
|
33
34
|
__classPrivateFieldSet(this, _MultichainAccount_index, groupIndex, "f");
|
|
34
35
|
__classPrivateFieldSet(this, _MultichainAccount_wallet, wallet, "f");
|
|
35
36
|
__classPrivateFieldSet(this, _MultichainAccount_providers, providers, "f");
|
|
37
|
+
__classPrivateFieldSet(this, _MultichainAccount_accounts, new Map(), "f");
|
|
38
|
+
__classPrivateFieldSet(this, _MultichainAccount_reverse, new Map(), "f");
|
|
39
|
+
this.sync();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Force multichain account synchronization.
|
|
43
|
+
*
|
|
44
|
+
* This can be used if account providers got new accounts that the multichain
|
|
45
|
+
* account doesn't know about.
|
|
46
|
+
*/
|
|
47
|
+
sync() {
|
|
48
|
+
// Clear reverse mapping and re-construct it entirely based on the refreshed
|
|
49
|
+
// list of accounts from each providers.
|
|
50
|
+
__classPrivateFieldGet(this, _MultichainAccount_reverse, "f").clear();
|
|
51
|
+
for (const provider of __classPrivateFieldGet(this, _MultichainAccount_providers, "f")) {
|
|
52
|
+
// Filter account only for that index.
|
|
53
|
+
const accounts = [];
|
|
54
|
+
for (const account of provider.getAccounts()) {
|
|
55
|
+
if (account.options.entropy.id === this.wallet.entropySource &&
|
|
56
|
+
account.options.entropy.groupIndex === this.index) {
|
|
57
|
+
// We only use IDs to always fetch the latest version of accounts.
|
|
58
|
+
accounts.push(account.id);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
__classPrivateFieldGet(this, _MultichainAccount_accounts, "f").set(provider, accounts);
|
|
62
|
+
// Reverse-mapping for fast indexing.
|
|
63
|
+
for (const id of accounts) {
|
|
64
|
+
__classPrivateFieldGet(this, _MultichainAccount_reverse, "f").set(id, provider);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
36
67
|
}
|
|
37
68
|
/**
|
|
38
69
|
* Gets the multichain account ID.
|
|
@@ -64,7 +95,8 @@ class MultichainAccount {
|
|
|
64
95
|
* @returns True if there's any underlying accounts, false otherwise.
|
|
65
96
|
*/
|
|
66
97
|
hasAccounts() {
|
|
67
|
-
|
|
98
|
+
// If there's anything in the reverse-map, it means we have some accounts.
|
|
99
|
+
return __classPrivateFieldGet(this, _MultichainAccount_reverse, "f").size > 0;
|
|
68
100
|
}
|
|
69
101
|
/**
|
|
70
102
|
* Gets the accounts for this multichain account.
|
|
@@ -72,18 +104,17 @@ class MultichainAccount {
|
|
|
72
104
|
* @returns The accounts.
|
|
73
105
|
*/
|
|
74
106
|
getAccounts() {
|
|
75
|
-
|
|
76
|
-
for (const provider of __classPrivateFieldGet(this,
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
account.options.entropy.groupIndex === this.index));
|
|
107
|
+
const allAccounts = [];
|
|
108
|
+
for (const [provider, accounts] of __classPrivateFieldGet(this, _MultichainAccount_accounts, "f").entries()) {
|
|
109
|
+
for (const id of accounts) {
|
|
110
|
+
const account = provider.getAccount(id);
|
|
111
|
+
if (account) {
|
|
112
|
+
// If for some reason we cannot get this account from the provider, it
|
|
113
|
+
// might means it has been deleted or something, so we just filter it
|
|
114
|
+
// out.
|
|
115
|
+
allAccounts.push(account);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
87
118
|
}
|
|
88
119
|
return allAccounts;
|
|
89
120
|
}
|
|
@@ -94,9 +125,13 @@ class MultichainAccount {
|
|
|
94
125
|
* @returns The account or undefined if not found.
|
|
95
126
|
*/
|
|
96
127
|
getAccount(id) {
|
|
97
|
-
|
|
98
|
-
//
|
|
99
|
-
|
|
128
|
+
const provider = __classPrivateFieldGet(this, _MultichainAccount_reverse, "f").get(id);
|
|
129
|
+
// If there's nothing in the map, it means we tried to get an account
|
|
130
|
+
// that does not belong to this multichain account.
|
|
131
|
+
if (!provider) {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
return provider.getAccount(id);
|
|
100
135
|
}
|
|
101
136
|
/**
|
|
102
137
|
* Query an account matching the selector.
|
|
@@ -148,7 +183,7 @@ class MultichainAccount {
|
|
|
148
183
|
}
|
|
149
184
|
}
|
|
150
185
|
exports.MultichainAccount = MultichainAccount;
|
|
151
|
-
_MultichainAccount_id = new WeakMap(), _MultichainAccount_wallet = new WeakMap(), _MultichainAccount_index = new WeakMap(), _MultichainAccount_providers = new WeakMap();
|
|
186
|
+
_MultichainAccount_id = new WeakMap(), _MultichainAccount_wallet = new WeakMap(), _MultichainAccount_index = new WeakMap(), _MultichainAccount_providers = new WeakMap(), _MultichainAccount_accounts = new WeakMap(), _MultichainAccount_reverse = new WeakMap();
|
|
152
187
|
/**
|
|
153
188
|
* Gets the multichain account ID from its multichain account wallet ID and its index.
|
|
154
189
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.cjs","sourceRoot":"","sources":["../../../src/api/multichain/account.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n KeyringAccountEntropyTypeOption,\n type KeyringAccount,\n} from '@metamask/keyring-api';\nimport { isScopeEqualToAny } from '@metamask/keyring-utils';\n\nimport type {\n MultichainAccountWallet,\n MultichainAccountWalletId,\n} from './wallet';\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 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 * Checks if there's any underlying accounts for this multichain accounts.\n *\n * @returns True if there's any underlying accounts, false otherwise.\n */\n hasAccounts(): boolean {\n return this.getAccounts().length > 0;\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 &&\n account.options.entropy.type ===\n KeyringAccountEntropyTypeOption.Mnemonic &&\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"]}
|
|
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 readonly #accounts: Map<AccountProvider<Account>, Account['id'][]>;\n\n readonly #reverse: Map<Account['id'], 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 this.#accounts = new Map();\n this.#reverse = new Map();\n\n this.sync();\n }\n\n /**\n * Force multichain account synchronization.\n *\n * This can be used if account providers got new accounts that the multichain\n * account doesn't know about.\n */\n sync(): void {\n // Clear reverse mapping and re-construct it entirely based on the refreshed\n // list of accounts from each providers.\n this.#reverse.clear();\n\n for (const provider of this.#providers) {\n // Filter account only for that index.\n const accounts = [];\n for (const account of provider.getAccounts()) {\n if (\n account.options.entropy.id === this.wallet.entropySource &&\n account.options.entropy.groupIndex === this.index\n ) {\n // We only use IDs to always fetch the latest version of accounts.\n accounts.push(account.id);\n }\n }\n this.#accounts.set(provider, accounts);\n\n // Reverse-mapping for fast indexing.\n for (const id of accounts) {\n this.#reverse.set(id, provider);\n }\n }\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 * Checks if there's any underlying accounts for this multichain accounts.\n *\n * @returns True if there's any underlying accounts, false otherwise.\n */\n hasAccounts(): boolean {\n // If there's anything in the reverse-map, it means we have some accounts.\n return this.#reverse.size > 0;\n }\n\n /**\n * Gets the accounts for this multichain account.\n *\n * @returns The accounts.\n */\n getAccounts(): Account[] {\n const allAccounts: Account[] = [];\n\n for (const [provider, accounts] of this.#accounts.entries()) {\n for (const id of accounts) {\n const account = provider.getAccount(id);\n\n if (account) {\n // If for some reason we cannot get this account from the provider, it\n // might means it has been deleted or something, so we just filter it\n // out.\n allAccounts.push(account);\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 const provider = this.#reverse.get(id);\n\n // If there's nothing in the map, it means we tried to get an account\n // that does not belong to this multichain account.\n if (!provider) {\n return undefined;\n }\n return provider.getAccount(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"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type KeyringAccount } from "@metamask/keyring-api";
|
|
2
2
|
import type { MultichainAccountWallet, MultichainAccountWalletId } from "./wallet.cjs";
|
|
3
|
+
import type { Bip44Account } from "../bip44.cjs";
|
|
3
4
|
import type { AccountGroup } from "../group.cjs";
|
|
4
5
|
import type { AccountProvider } from "../provider.cjs";
|
|
5
6
|
import type { AccountSelector } from "../selector.cjs";
|
|
@@ -10,13 +11,20 @@ export type MultichainAccountId = `${MultichainAccountWalletId}/${number}`;
|
|
|
10
11
|
/**
|
|
11
12
|
* A multichain account that holds multiple accounts.
|
|
12
13
|
*/
|
|
13
|
-
export declare class MultichainAccount<Account extends KeyringAccount
|
|
14
|
+
export declare class MultichainAccount<Account extends Bip44Account<KeyringAccount>> implements AccountGroup<Account> {
|
|
14
15
|
#private;
|
|
15
16
|
constructor({ groupIndex, wallet, providers, }: {
|
|
16
17
|
groupIndex: number;
|
|
17
18
|
wallet: MultichainAccountWallet<Account>;
|
|
18
19
|
providers: AccountProvider<Account>[];
|
|
19
20
|
});
|
|
21
|
+
/**
|
|
22
|
+
* Force multichain account synchronization.
|
|
23
|
+
*
|
|
24
|
+
* This can be used if account providers got new accounts that the multichain
|
|
25
|
+
* account doesn't know about.
|
|
26
|
+
*/
|
|
27
|
+
sync(): void;
|
|
20
28
|
/**
|
|
21
29
|
* Gets the multichain account ID.
|
|
22
30
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.d.cts","sourceRoot":"","sources":["../../../src/api/multichain/account.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"account.d.cts","sourceRoot":"","sources":["../../../src/api/multichain/account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,8BAA8B;AAG5D,OAAO,KAAK,EACV,uBAAuB,EACvB,yBAAyB,EAC1B,qBAAiB;AAClB,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAiB;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAiB;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAoB;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAoB;AAQnD;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,GAAG,yBAAyB,IAAI,MAAM,EAAE,CAAC;AAE3E;;GAEG;AACH,qBAAa,iBAAiB,CAAC,OAAO,SAAS,YAAY,CAAC,cAAc,CAAC,CACzE,YAAW,YAAY,CAAC,OAAO,CAAC;;gBAcpB,EACV,UAAU,EACV,MAAM,EACN,SAAS,GACV,EAAE;QACD,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC;QACzC,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;KACvC;IAWD;;;;;OAKG;IACH,IAAI,IAAI,IAAI;IA0BZ;;;;OAIG;IACH,IAAI,EAAE,IAAI,mBAAmB,CAE5B;IAED;;;;OAIG;IACH,IAAI,MAAM,IAAI,uBAAuB,CAAC,OAAO,CAAC,CAE7C;IAED;;;;OAIG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;;;OAIG;IACH,WAAW,IAAI,OAAO;IAKtB;;;;OAIG;IACH,WAAW,IAAI,OAAO,EAAE;IAmBxB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,SAAS;IAWlD;;;;;;OAMG;IACH,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,SAAS;IAgB5D;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO,EAAE;CA8BtD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,yBAAyB,EACnC,UAAU,EAAE,MAAM,GACjB,mBAAmB,CAErB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,GACZ,KAAK,IAAI,mBAAmB,CAE9B;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,CAClD,EAAE,EAAE,mBAAmB,GACtB,MAAM,CASR"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type KeyringAccount } from "@metamask/keyring-api";
|
|
2
2
|
import type { MultichainAccountWallet, MultichainAccountWalletId } from "./wallet.mjs";
|
|
3
|
+
import type { Bip44Account } from "../bip44.mjs";
|
|
3
4
|
import type { AccountGroup } from "../group.mjs";
|
|
4
5
|
import type { AccountProvider } from "../provider.mjs";
|
|
5
6
|
import type { AccountSelector } from "../selector.mjs";
|
|
@@ -10,13 +11,20 @@ export type MultichainAccountId = `${MultichainAccountWalletId}/${number}`;
|
|
|
10
11
|
/**
|
|
11
12
|
* A multichain account that holds multiple accounts.
|
|
12
13
|
*/
|
|
13
|
-
export declare class MultichainAccount<Account extends KeyringAccount
|
|
14
|
+
export declare class MultichainAccount<Account extends Bip44Account<KeyringAccount>> implements AccountGroup<Account> {
|
|
14
15
|
#private;
|
|
15
16
|
constructor({ groupIndex, wallet, providers, }: {
|
|
16
17
|
groupIndex: number;
|
|
17
18
|
wallet: MultichainAccountWallet<Account>;
|
|
18
19
|
providers: AccountProvider<Account>[];
|
|
19
20
|
});
|
|
21
|
+
/**
|
|
22
|
+
* Force multichain account synchronization.
|
|
23
|
+
*
|
|
24
|
+
* This can be used if account providers got new accounts that the multichain
|
|
25
|
+
* account doesn't know about.
|
|
26
|
+
*/
|
|
27
|
+
sync(): void;
|
|
20
28
|
/**
|
|
21
29
|
* Gets the multichain account ID.
|
|
22
30
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.d.mts","sourceRoot":"","sources":["../../../src/api/multichain/account.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"account.d.mts","sourceRoot":"","sources":["../../../src/api/multichain/account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,8BAA8B;AAG5D,OAAO,KAAK,EACV,uBAAuB,EACvB,yBAAyB,EAC1B,qBAAiB;AAClB,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAiB;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAiB;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAoB;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAoB;AAQnD;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,GAAG,yBAAyB,IAAI,MAAM,EAAE,CAAC;AAE3E;;GAEG;AACH,qBAAa,iBAAiB,CAAC,OAAO,SAAS,YAAY,CAAC,cAAc,CAAC,CACzE,YAAW,YAAY,CAAC,OAAO,CAAC;;gBAcpB,EACV,UAAU,EACV,MAAM,EACN,SAAS,GACV,EAAE;QACD,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC;QACzC,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;KACvC;IAWD;;;;;OAKG;IACH,IAAI,IAAI,IAAI;IA0BZ;;;;OAIG;IACH,IAAI,EAAE,IAAI,mBAAmB,CAE5B;IAED;;;;OAIG;IACH,IAAI,MAAM,IAAI,uBAAuB,CAAC,OAAO,CAAC,CAE7C;IAED;;;;OAIG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;;;OAIG;IACH,WAAW,IAAI,OAAO;IAKtB;;;;OAIG;IACH,WAAW,IAAI,OAAO,EAAE;IAmBxB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,SAAS;IAWlD;;;;;;OAMG;IACH,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,SAAS;IAgB5D;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO,EAAE;CA8BtD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,yBAAyB,EACnC,UAAU,EAAE,MAAM,GACjB,mBAAmB,CAErB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,GACZ,KAAK,IAAI,mBAAmB,CAE9B;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,CAClD,EAAE,EAAE,mBAAmB,GACtB,MAAM,CASR"}
|
|
@@ -9,8 +9,7 @@ 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 _MultichainAccount_id, _MultichainAccount_wallet, _MultichainAccount_index, _MultichainAccount_providers;
|
|
13
|
-
import { KeyringAccountEntropyTypeOption } from "@metamask/keyring-api";
|
|
12
|
+
var _MultichainAccount_id, _MultichainAccount_wallet, _MultichainAccount_index, _MultichainAccount_providers, _MultichainAccount_accounts, _MultichainAccount_reverse;
|
|
14
13
|
import { isScopeEqualToAny } from "@metamask/keyring-utils";
|
|
15
14
|
import { AccountWalletCategory } from "../wallet.mjs";
|
|
16
15
|
const MULTICHAIN_ACCOUNT_ID_REGEX = new RegExp(`^${AccountWalletCategory.Entropy}:.*/(?<groupIndex>\\d+)$`, 'u');
|
|
@@ -23,10 +22,42 @@ export class MultichainAccount {
|
|
|
23
22
|
_MultichainAccount_wallet.set(this, void 0);
|
|
24
23
|
_MultichainAccount_index.set(this, void 0);
|
|
25
24
|
_MultichainAccount_providers.set(this, void 0);
|
|
25
|
+
_MultichainAccount_accounts.set(this, void 0);
|
|
26
|
+
_MultichainAccount_reverse.set(this, void 0);
|
|
26
27
|
__classPrivateFieldSet(this, _MultichainAccount_id, toMultichainAccountId(wallet.id, groupIndex), "f");
|
|
27
28
|
__classPrivateFieldSet(this, _MultichainAccount_index, groupIndex, "f");
|
|
28
29
|
__classPrivateFieldSet(this, _MultichainAccount_wallet, wallet, "f");
|
|
29
30
|
__classPrivateFieldSet(this, _MultichainAccount_providers, providers, "f");
|
|
31
|
+
__classPrivateFieldSet(this, _MultichainAccount_accounts, new Map(), "f");
|
|
32
|
+
__classPrivateFieldSet(this, _MultichainAccount_reverse, new Map(), "f");
|
|
33
|
+
this.sync();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Force multichain account synchronization.
|
|
37
|
+
*
|
|
38
|
+
* This can be used if account providers got new accounts that the multichain
|
|
39
|
+
* account doesn't know about.
|
|
40
|
+
*/
|
|
41
|
+
sync() {
|
|
42
|
+
// Clear reverse mapping and re-construct it entirely based on the refreshed
|
|
43
|
+
// list of accounts from each providers.
|
|
44
|
+
__classPrivateFieldGet(this, _MultichainAccount_reverse, "f").clear();
|
|
45
|
+
for (const provider of __classPrivateFieldGet(this, _MultichainAccount_providers, "f")) {
|
|
46
|
+
// Filter account only for that index.
|
|
47
|
+
const accounts = [];
|
|
48
|
+
for (const account of provider.getAccounts()) {
|
|
49
|
+
if (account.options.entropy.id === this.wallet.entropySource &&
|
|
50
|
+
account.options.entropy.groupIndex === this.index) {
|
|
51
|
+
// We only use IDs to always fetch the latest version of accounts.
|
|
52
|
+
accounts.push(account.id);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
__classPrivateFieldGet(this, _MultichainAccount_accounts, "f").set(provider, accounts);
|
|
56
|
+
// Reverse-mapping for fast indexing.
|
|
57
|
+
for (const id of accounts) {
|
|
58
|
+
__classPrivateFieldGet(this, _MultichainAccount_reverse, "f").set(id, provider);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
30
61
|
}
|
|
31
62
|
/**
|
|
32
63
|
* Gets the multichain account ID.
|
|
@@ -58,7 +89,8 @@ export class MultichainAccount {
|
|
|
58
89
|
* @returns True if there's any underlying accounts, false otherwise.
|
|
59
90
|
*/
|
|
60
91
|
hasAccounts() {
|
|
61
|
-
|
|
92
|
+
// If there's anything in the reverse-map, it means we have some accounts.
|
|
93
|
+
return __classPrivateFieldGet(this, _MultichainAccount_reverse, "f").size > 0;
|
|
62
94
|
}
|
|
63
95
|
/**
|
|
64
96
|
* Gets the accounts for this multichain account.
|
|
@@ -66,18 +98,17 @@ export class MultichainAccount {
|
|
|
66
98
|
* @returns The accounts.
|
|
67
99
|
*/
|
|
68
100
|
getAccounts() {
|
|
69
|
-
|
|
70
|
-
for (const provider of __classPrivateFieldGet(this,
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
account.options.entropy.groupIndex === this.index));
|
|
101
|
+
const allAccounts = [];
|
|
102
|
+
for (const [provider, accounts] of __classPrivateFieldGet(this, _MultichainAccount_accounts, "f").entries()) {
|
|
103
|
+
for (const id of accounts) {
|
|
104
|
+
const account = provider.getAccount(id);
|
|
105
|
+
if (account) {
|
|
106
|
+
// If for some reason we cannot get this account from the provider, it
|
|
107
|
+
// might means it has been deleted or something, so we just filter it
|
|
108
|
+
// out.
|
|
109
|
+
allAccounts.push(account);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
81
112
|
}
|
|
82
113
|
return allAccounts;
|
|
83
114
|
}
|
|
@@ -88,9 +119,13 @@ export class MultichainAccount {
|
|
|
88
119
|
* @returns The account or undefined if not found.
|
|
89
120
|
*/
|
|
90
121
|
getAccount(id) {
|
|
91
|
-
|
|
92
|
-
//
|
|
93
|
-
|
|
122
|
+
const provider = __classPrivateFieldGet(this, _MultichainAccount_reverse, "f").get(id);
|
|
123
|
+
// If there's nothing in the map, it means we tried to get an account
|
|
124
|
+
// that does not belong to this multichain account.
|
|
125
|
+
if (!provider) {
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
return provider.getAccount(id);
|
|
94
129
|
}
|
|
95
130
|
/**
|
|
96
131
|
* Query an account matching the selector.
|
|
@@ -141,7 +176,7 @@ export class MultichainAccount {
|
|
|
141
176
|
});
|
|
142
177
|
}
|
|
143
178
|
}
|
|
144
|
-
_MultichainAccount_id = new WeakMap(), _MultichainAccount_wallet = new WeakMap(), _MultichainAccount_index = new WeakMap(), _MultichainAccount_providers = new WeakMap();
|
|
179
|
+
_MultichainAccount_id = new WeakMap(), _MultichainAccount_wallet = new WeakMap(), _MultichainAccount_index = new WeakMap(), _MultichainAccount_providers = new WeakMap(), _MultichainAccount_accounts = new WeakMap(), _MultichainAccount_reverse = new WeakMap();
|
|
145
180
|
/**
|
|
146
181
|
* Gets the multichain account ID from its multichain account wallet ID and its index.
|
|
147
182
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.mjs","sourceRoot":"","sources":["../../../src/api/multichain/account.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n KeyringAccountEntropyTypeOption,\n type KeyringAccount,\n} from '@metamask/keyring-api';\nimport { isScopeEqualToAny } from '@metamask/keyring-utils';\n\nimport type {\n MultichainAccountWallet,\n MultichainAccountWalletId,\n} from './wallet';\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 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 * Checks if there's any underlying accounts for this multichain accounts.\n *\n * @returns True if there's any underlying accounts, false otherwise.\n */\n hasAccounts(): boolean {\n return this.getAccounts().length > 0;\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 &&\n account.options.entropy.type ===\n KeyringAccountEntropyTypeOption.Mnemonic &&\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"]}
|
|
1
|
+
{"version":3,"file":"account.mjs","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 readonly #accounts: Map<AccountProvider<Account>, Account['id'][]>;\n\n readonly #reverse: Map<Account['id'], 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 this.#accounts = new Map();\n this.#reverse = new Map();\n\n this.sync();\n }\n\n /**\n * Force multichain account synchronization.\n *\n * This can be used if account providers got new accounts that the multichain\n * account doesn't know about.\n */\n sync(): void {\n // Clear reverse mapping and re-construct it entirely based on the refreshed\n // list of accounts from each providers.\n this.#reverse.clear();\n\n for (const provider of this.#providers) {\n // Filter account only for that index.\n const accounts = [];\n for (const account of provider.getAccounts()) {\n if (\n account.options.entropy.id === this.wallet.entropySource &&\n account.options.entropy.groupIndex === this.index\n ) {\n // We only use IDs to always fetch the latest version of accounts.\n accounts.push(account.id);\n }\n }\n this.#accounts.set(provider, accounts);\n\n // Reverse-mapping for fast indexing.\n for (const id of accounts) {\n this.#reverse.set(id, provider);\n }\n }\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 * Checks if there's any underlying accounts for this multichain accounts.\n *\n * @returns True if there's any underlying accounts, false otherwise.\n */\n hasAccounts(): boolean {\n // If there's anything in the reverse-map, it means we have some accounts.\n return this.#reverse.size > 0;\n }\n\n /**\n * Gets the accounts for this multichain account.\n *\n * @returns The accounts.\n */\n getAccounts(): Account[] {\n const allAccounts: Account[] = [];\n\n for (const [provider, accounts] of this.#accounts.entries()) {\n for (const id of accounts) {\n const account = provider.getAccount(id);\n\n if (account) {\n // If for some reason we cannot get this account from the provider, it\n // might means it has been deleted or something, so we just filter it\n // out.\n allAccounts.push(account);\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 const provider = this.#reverse.get(id);\n\n // If there's nothing in the map, it means we tried to get an account\n // that does not belong to this multichain account.\n if (!provider) {\n return undefined;\n }\n return provider.getAccount(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"]}
|
|
@@ -14,7 +14,6 @@ var _MultichainAccountWallet_id, _MultichainAccountWallet_providers, _Multichain
|
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.MultichainAccountWallet = void 0;
|
|
16
16
|
exports.toMultichainAccountWalletId = toMultichainAccountWalletId;
|
|
17
|
-
const keyring_api_1 = require("@metamask/keyring-api");
|
|
18
17
|
const account_1 = require("./account.cjs");
|
|
19
18
|
const group_1 = require("../group.cjs");
|
|
20
19
|
const wallet_1 = require("../wallet.cjs");
|
|
@@ -32,47 +31,43 @@ class MultichainAccountWallet {
|
|
|
32
31
|
__classPrivateFieldSet(this, _MultichainAccountWallet_providers, providers, "f");
|
|
33
32
|
__classPrivateFieldSet(this, _MultichainAccountWallet_entropySource, entropySource, "f");
|
|
34
33
|
__classPrivateFieldSet(this, _MultichainAccountWallet_accounts, new Map(), "f");
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
// becomes too costly.
|
|
38
|
-
const maxGroupIndex = MultichainAccountWallet.getHighestGroupIndexFrom(providers, entropySource);
|
|
39
|
-
// NOTE: We could have some gap for now, until we fully implement the
|
|
40
|
-
// gap/alignment mechanisms to backfill all "missing accounts".
|
|
41
|
-
for (let groupIndex = 0; groupIndex <= maxGroupIndex; groupIndex++) {
|
|
42
|
-
// Use "lower or equal", since we need to "include" the max index (which
|
|
43
|
-
// can also be 0)
|
|
44
|
-
const multichainAccount = new account_1.MultichainAccount({
|
|
45
|
-
groupIndex,
|
|
46
|
-
wallet: this,
|
|
47
|
-
providers: __classPrivateFieldGet(this, _MultichainAccountWallet_providers, "f"),
|
|
48
|
-
});
|
|
49
|
-
// We only add multichain account that has underlying accounts.
|
|
50
|
-
if (multichainAccount.hasAccounts()) {
|
|
51
|
-
__classPrivateFieldGet(this, _MultichainAccountWallet_accounts, "f").set(groupIndex, multichainAccount);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
34
|
+
// Initial synchronization.
|
|
35
|
+
this.sync();
|
|
54
36
|
}
|
|
55
37
|
/**
|
|
56
|
-
*
|
|
57
|
-
* entropy source.
|
|
38
|
+
* Force wallet synchronization.
|
|
58
39
|
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
* @returns The highest group index for a given entropy source.
|
|
40
|
+
* This can be used if account providers got new accounts that the wallet
|
|
41
|
+
* doesn't know about.
|
|
62
42
|
*/
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
for (const provider of providers) {
|
|
43
|
+
sync() {
|
|
44
|
+
for (const provider of __classPrivateFieldGet(this, _MultichainAccountWallet_providers, "f")) {
|
|
66
45
|
for (const account of provider.getAccounts()) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
46
|
+
const { entropy } = account.options;
|
|
47
|
+
// Filter for this wallet only.
|
|
48
|
+
if (entropy.id !== this.entropySource) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// This multichain account might exists already.
|
|
52
|
+
let multichainAccount = __classPrivateFieldGet(this, _MultichainAccountWallet_accounts, "f").get(entropy.groupIndex);
|
|
53
|
+
if (!multichainAccount) {
|
|
54
|
+
multichainAccount = new account_1.MultichainAccount({
|
|
55
|
+
groupIndex: entropy.groupIndex,
|
|
56
|
+
wallet: this,
|
|
57
|
+
providers: __classPrivateFieldGet(this, _MultichainAccountWallet_providers, "f"),
|
|
58
|
+
});
|
|
59
|
+
__classPrivateFieldGet(this, _MultichainAccountWallet_accounts, "f").set(entropy.groupIndex, multichainAccount);
|
|
72
60
|
}
|
|
73
61
|
}
|
|
74
62
|
}
|
|
75
|
-
|
|
63
|
+
// Now force-sync all remaining multichain accounts.
|
|
64
|
+
for (const [groupIndex, multichainAccount] of __classPrivateFieldGet(this, _MultichainAccountWallet_accounts, "f").entries()) {
|
|
65
|
+
multichainAccount.sync();
|
|
66
|
+
// Clean up old multichain accounts.
|
|
67
|
+
if (!multichainAccount.hasAccounts()) {
|
|
68
|
+
__classPrivateFieldGet(this, _MultichainAccountWallet_accounts, "f").delete(groupIndex);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
76
71
|
}
|
|
77
72
|
/**
|
|
78
73
|
* Gets the multichain account wallet ID.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.cjs","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"wallet.cjs","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type EntropySourceId,\n type KeyringAccount,\n} from '@metamask/keyring-api';\n\nimport {\n getGroupIndexFromMultichainAccountId,\n isMultichainAccountId,\n MultichainAccount,\n} from './account';\nimport type { Bip44Account } from '../bip44';\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<\n Account extends Bip44Account<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 // Initial synchronization.\n this.sync();\n }\n\n /**\n * Force wallet synchronization.\n *\n * This can be used if account providers got new accounts that the wallet\n * doesn't know about.\n */\n sync(): void {\n for (const provider of this.#providers) {\n for (const account of provider.getAccounts()) {\n const { entropy } = account.options;\n\n // Filter for this wallet only.\n if (entropy.id !== this.entropySource) {\n continue;\n }\n\n // This multichain account might exists already.\n let multichainAccount = this.#accounts.get(entropy.groupIndex);\n if (!multichainAccount) {\n multichainAccount = new MultichainAccount<Account>({\n groupIndex: entropy.groupIndex,\n wallet: this,\n providers: this.#providers,\n });\n\n this.#accounts.set(entropy.groupIndex, multichainAccount);\n }\n }\n }\n\n // Now force-sync all remaining multichain accounts.\n for (const [groupIndex, multichainAccount] of this.#accounts.entries()) {\n multichainAccount.sync();\n\n // Clean up old multichain accounts.\n if (!multichainAccount.hasAccounts()) {\n this.#accounts.delete(groupIndex);\n }\n }\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,5 +1,6 @@
|
|
|
1
1
|
import { type EntropySourceId, type KeyringAccount } from "@metamask/keyring-api";
|
|
2
2
|
import { MultichainAccount } from "./account.cjs";
|
|
3
|
+
import type { Bip44Account } from "../bip44.cjs";
|
|
3
4
|
import type { AccountGroupId } from "../group.cjs";
|
|
4
5
|
import type { AccountProvider } from "../provider.cjs";
|
|
5
6
|
import type { AccountWallet } from "../wallet.cjs";
|
|
@@ -12,21 +13,19 @@ export type MultichainAccountWalletId = `${AccountWalletCategory.Entropy}:${Entr
|
|
|
12
13
|
* A multichain account wallet that holds multiple multichain accounts (one multichain account per
|
|
13
14
|
* group index).
|
|
14
15
|
*/
|
|
15
|
-
export declare class MultichainAccountWallet<Account extends KeyringAccount
|
|
16
|
+
export declare class MultichainAccountWallet<Account extends Bip44Account<KeyringAccount>> implements AccountWallet<Account> {
|
|
16
17
|
#private;
|
|
17
18
|
constructor({ providers, entropySource, }: {
|
|
18
19
|
providers: AccountProvider<Account>[];
|
|
19
20
|
entropySource: EntropySourceId;
|
|
20
21
|
});
|
|
21
22
|
/**
|
|
22
|
-
*
|
|
23
|
-
* entropy source.
|
|
23
|
+
* Force wallet synchronization.
|
|
24
24
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* @returns The highest group index for a given entropy source.
|
|
25
|
+
* This can be used if account providers got new accounts that the wallet
|
|
26
|
+
* doesn't know about.
|
|
28
27
|
*/
|
|
29
|
-
|
|
28
|
+
sync(): void;
|
|
30
29
|
/**
|
|
31
30
|
* Gets the multichain account wallet ID.
|
|
32
31
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.d.cts","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"wallet.d.cts","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,8BAA8B;AAE/B,OAAO,EAGL,iBAAiB,EAClB,sBAAkB;AACnB,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAiB;AAC7C,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,CAClC,OAAO,SAAS,YAAY,CAAC,cAAc,CAAC,CAC5C,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;IAUD;;;;;OAKG;IACH,IAAI,IAAI,IAAI;IAmCZ;;;;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,5 +1,6 @@
|
|
|
1
1
|
import { type EntropySourceId, type KeyringAccount } from "@metamask/keyring-api";
|
|
2
2
|
import { MultichainAccount } from "./account.mjs";
|
|
3
|
+
import type { Bip44Account } from "../bip44.mjs";
|
|
3
4
|
import type { AccountGroupId } from "../group.mjs";
|
|
4
5
|
import type { AccountProvider } from "../provider.mjs";
|
|
5
6
|
import type { AccountWallet } from "../wallet.mjs";
|
|
@@ -12,21 +13,19 @@ export type MultichainAccountWalletId = `${AccountWalletCategory.Entropy}:${Entr
|
|
|
12
13
|
* A multichain account wallet that holds multiple multichain accounts (one multichain account per
|
|
13
14
|
* group index).
|
|
14
15
|
*/
|
|
15
|
-
export declare class MultichainAccountWallet<Account extends KeyringAccount
|
|
16
|
+
export declare class MultichainAccountWallet<Account extends Bip44Account<KeyringAccount>> implements AccountWallet<Account> {
|
|
16
17
|
#private;
|
|
17
18
|
constructor({ providers, entropySource, }: {
|
|
18
19
|
providers: AccountProvider<Account>[];
|
|
19
20
|
entropySource: EntropySourceId;
|
|
20
21
|
});
|
|
21
22
|
/**
|
|
22
|
-
*
|
|
23
|
-
* entropy source.
|
|
23
|
+
* Force wallet synchronization.
|
|
24
24
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* @returns The highest group index for a given entropy source.
|
|
25
|
+
* This can be used if account providers got new accounts that the wallet
|
|
26
|
+
* doesn't know about.
|
|
28
27
|
*/
|
|
29
|
-
|
|
28
|
+
sync(): void;
|
|
30
29
|
/**
|
|
31
30
|
* Gets the multichain account wallet ID.
|
|
32
31
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.d.mts","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"wallet.d.mts","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,8BAA8B;AAE/B,OAAO,EAGL,iBAAiB,EAClB,sBAAkB;AACnB,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAiB;AAC7C,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,CAClC,OAAO,SAAS,YAAY,CAAC,cAAc,CAAC,CAC5C,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;IAUD;;;;;OAKG;IACH,IAAI,IAAI,IAAI;IAmCZ;;;;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"}
|
|
@@ -10,7 +10,6 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
12
|
var _MultichainAccountWallet_id, _MultichainAccountWallet_providers, _MultichainAccountWallet_entropySource, _MultichainAccountWallet_accounts;
|
|
13
|
-
import { KeyringAccountEntropyTypeOption } from "@metamask/keyring-api";
|
|
14
13
|
import { getGroupIndexFromMultichainAccountId, isMultichainAccountId, MultichainAccount } from "./account.mjs";
|
|
15
14
|
import { toDefaultAccountGroupId } from "../group.mjs";
|
|
16
15
|
import { AccountWalletCategory } from "../wallet.mjs";
|
|
@@ -28,47 +27,43 @@ export class MultichainAccountWallet {
|
|
|
28
27
|
__classPrivateFieldSet(this, _MultichainAccountWallet_providers, providers, "f");
|
|
29
28
|
__classPrivateFieldSet(this, _MultichainAccountWallet_entropySource, entropySource, "f");
|
|
30
29
|
__classPrivateFieldSet(this, _MultichainAccountWallet_accounts, new Map(), "f");
|
|
31
|
-
//
|
|
32
|
-
|
|
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({
|
|
41
|
-
groupIndex,
|
|
42
|
-
wallet: this,
|
|
43
|
-
providers: __classPrivateFieldGet(this, _MultichainAccountWallet_providers, "f"),
|
|
44
|
-
});
|
|
45
|
-
// We only add multichain account that has underlying accounts.
|
|
46
|
-
if (multichainAccount.hasAccounts()) {
|
|
47
|
-
__classPrivateFieldGet(this, _MultichainAccountWallet_accounts, "f").set(groupIndex, multichainAccount);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
30
|
+
// Initial synchronization.
|
|
31
|
+
this.sync();
|
|
50
32
|
}
|
|
51
33
|
/**
|
|
52
|
-
*
|
|
53
|
-
* entropy source.
|
|
34
|
+
* Force wallet synchronization.
|
|
54
35
|
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* @returns The highest group index for a given entropy source.
|
|
36
|
+
* This can be used if account providers got new accounts that the wallet
|
|
37
|
+
* doesn't know about.
|
|
58
38
|
*/
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
for (const provider of providers) {
|
|
39
|
+
sync() {
|
|
40
|
+
for (const provider of __classPrivateFieldGet(this, _MultichainAccountWallet_providers, "f")) {
|
|
62
41
|
for (const account of provider.getAccounts()) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
42
|
+
const { entropy } = account.options;
|
|
43
|
+
// Filter for this wallet only.
|
|
44
|
+
if (entropy.id !== this.entropySource) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
// This multichain account might exists already.
|
|
48
|
+
let multichainAccount = __classPrivateFieldGet(this, _MultichainAccountWallet_accounts, "f").get(entropy.groupIndex);
|
|
49
|
+
if (!multichainAccount) {
|
|
50
|
+
multichainAccount = new MultichainAccount({
|
|
51
|
+
groupIndex: entropy.groupIndex,
|
|
52
|
+
wallet: this,
|
|
53
|
+
providers: __classPrivateFieldGet(this, _MultichainAccountWallet_providers, "f"),
|
|
54
|
+
});
|
|
55
|
+
__classPrivateFieldGet(this, _MultichainAccountWallet_accounts, "f").set(entropy.groupIndex, multichainAccount);
|
|
68
56
|
}
|
|
69
57
|
}
|
|
70
58
|
}
|
|
71
|
-
|
|
59
|
+
// Now force-sync all remaining multichain accounts.
|
|
60
|
+
for (const [groupIndex, multichainAccount] of __classPrivateFieldGet(this, _MultichainAccountWallet_accounts, "f").entries()) {
|
|
61
|
+
multichainAccount.sync();
|
|
62
|
+
// Clean up old multichain accounts.
|
|
63
|
+
if (!multichainAccount.hasAccounts()) {
|
|
64
|
+
__classPrivateFieldGet(this, _MultichainAccountWallet_accounts, "f").delete(groupIndex);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
72
67
|
}
|
|
73
68
|
/**
|
|
74
69
|
* Gets the multichain account wallet ID.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.mjs","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"wallet.mjs","sourceRoot":"","sources":["../../../src/api/multichain/wallet.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type EntropySourceId,\n type KeyringAccount,\n} from '@metamask/keyring-api';\n\nimport {\n getGroupIndexFromMultichainAccountId,\n isMultichainAccountId,\n MultichainAccount,\n} from './account';\nimport type { Bip44Account } from '../bip44';\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<\n Account extends Bip44Account<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 // Initial synchronization.\n this.sync();\n }\n\n /**\n * Force wallet synchronization.\n *\n * This can be used if account providers got new accounts that the wallet\n * doesn't know about.\n */\n sync(): void {\n for (const provider of this.#providers) {\n for (const account of provider.getAccounts()) {\n const { entropy } = account.options;\n\n // Filter for this wallet only.\n if (entropy.id !== this.entropySource) {\n continue;\n }\n\n // This multichain account might exists already.\n let multichainAccount = this.#accounts.get(entropy.groupIndex);\n if (!multichainAccount) {\n multichainAccount = new MultichainAccount<Account>({\n groupIndex: entropy.groupIndex,\n wallet: this,\n providers: this.#providers,\n });\n\n this.#accounts.set(entropy.groupIndex, multichainAccount);\n }\n }\n }\n\n // Now force-sync all remaining multichain accounts.\n for (const [groupIndex, multichainAccount] of this.#accounts.entries()) {\n multichainAccount.sync();\n\n // Clean up old multichain accounts.\n if (!multichainAccount.hasAccounts()) {\n this.#accounts.delete(groupIndex);\n }\n }\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 +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"]}
|
|
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 an account for a given ID.\n *\n * @returns An account, or undefined if not found.\n */\n getAccount: (id: Account['id']) => Account | undefined;\n\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"]}
|
package/dist/api/provider.d.cts
CHANGED
|
@@ -3,6 +3,12 @@ import type { KeyringAccount } from "@metamask/keyring-api";
|
|
|
3
3
|
* An account provider is reponsible of providing accounts to an account group.
|
|
4
4
|
*/
|
|
5
5
|
export type AccountProvider<Account extends KeyringAccount> = {
|
|
6
|
+
/**
|
|
7
|
+
* Gets an account for a given ID.
|
|
8
|
+
*
|
|
9
|
+
* @returns An account, or undefined if not found.
|
|
10
|
+
*/
|
|
11
|
+
getAccount: (id: Account['id']) => Account | undefined;
|
|
6
12
|
/**
|
|
7
13
|
* Gets all accounts for a given entropy source and group index.
|
|
8
14
|
*
|
|
@@ -1 +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"}
|
|
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,UAAU,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,GAAG,SAAS,CAAC;IAEvD;;;;OAIG;IACH,WAAW,EAAE,MAAM,OAAO,EAAE,CAAC;CAC9B,CAAC"}
|
package/dist/api/provider.d.mts
CHANGED
|
@@ -3,6 +3,12 @@ import type { KeyringAccount } from "@metamask/keyring-api";
|
|
|
3
3
|
* An account provider is reponsible of providing accounts to an account group.
|
|
4
4
|
*/
|
|
5
5
|
export type AccountProvider<Account extends KeyringAccount> = {
|
|
6
|
+
/**
|
|
7
|
+
* Gets an account for a given ID.
|
|
8
|
+
*
|
|
9
|
+
* @returns An account, or undefined if not found.
|
|
10
|
+
*/
|
|
11
|
+
getAccount: (id: Account['id']) => Account | undefined;
|
|
6
12
|
/**
|
|
7
13
|
* Gets all accounts for a given entropy source and group index.
|
|
8
14
|
*
|
|
@@ -1 +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"}
|
|
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,UAAU,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,GAAG,SAAS,CAAC;IAEvD;;;;OAIG;IACH,WAAW,EAAE,MAAM,OAAO,EAAE,CAAC;CAC9B,CAAC"}
|
|
@@ -1 +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"]}
|
|
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 an account for a given ID.\n *\n * @returns An account, or undefined if not found.\n */\n getAccount: (id: Account['id']) => Account | undefined;\n\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/account-api",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0-77f7003",
|
|
4
4
|
"description": "MetaMask Account API",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"metamask",
|
|
@@ -46,14 +46,15 @@
|
|
|
46
46
|
"test:watch": "jest --watch"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@metamask/keyring-api": "
|
|
50
|
-
"@metamask/keyring-utils": "3.
|
|
49
|
+
"@metamask/keyring-api": "19.0.0",
|
|
50
|
+
"@metamask/keyring-utils": "3.1.0",
|
|
51
|
+
"@metamask/superstruct": "^3.1.0"
|
|
51
52
|
},
|
|
52
53
|
"devDependencies": {
|
|
53
54
|
"@lavamoat/allow-scripts": "^3.2.1",
|
|
54
55
|
"@lavamoat/preinstall-always-fail": "^2.1.0",
|
|
55
56
|
"@metamask/auto-changelog": "^3.4.4",
|
|
56
|
-
"@metamask/keyring-internal-api": "
|
|
57
|
+
"@metamask/keyring-internal-api": "7.0.0",
|
|
57
58
|
"@ts-bridge/cli": "^0.6.3",
|
|
58
59
|
"@types/jest": "^29.5.12",
|
|
59
60
|
"@types/node": "^20.12.12",
|