@pezkuwi/ui-keyring 3.16.6

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 (179) hide show
  1. package/README.md +136 -0
  2. package/build/Base.d.ts +30 -0
  3. package/build/Base.js +109 -0
  4. package/build/Keyring.d.ts +49 -0
  5. package/build/Keyring.js +304 -0
  6. package/build/LICENSE +201 -0
  7. package/build/README.md +136 -0
  8. package/build/bundle-pezkuwi-ui-keyring.js +2751 -0
  9. package/build/bundle.d.ts +4 -0
  10. package/build/bundle.js +4 -0
  11. package/build/cjs/Base.d.ts +30 -0
  12. package/build/cjs/Base.js +113 -0
  13. package/build/cjs/Keyring.d.ts +49 -0
  14. package/build/cjs/Keyring.js +308 -0
  15. package/build/cjs/bundle.d.ts +4 -0
  16. package/build/cjs/bundle.js +8 -0
  17. package/build/cjs/defaults.d.ts +6 -0
  18. package/build/cjs/defaults.js +28 -0
  19. package/build/cjs/index.d.ts +4 -0
  20. package/build/cjs/index.js +7 -0
  21. package/build/cjs/observable/accounts.d.ts +1 -0
  22. package/build/cjs/observable/accounts.js +6 -0
  23. package/build/cjs/observable/addresses.d.ts +1 -0
  24. package/build/cjs/observable/addresses.js +6 -0
  25. package/build/cjs/observable/contracts.d.ts +1 -0
  26. package/build/cjs/observable/contracts.js +6 -0
  27. package/build/cjs/observable/env.d.ts +6 -0
  28. package/build/cjs/observable/env.js +12 -0
  29. package/build/cjs/observable/genericSubject.d.ts +2 -0
  30. package/build/cjs/observable/genericSubject.js +47 -0
  31. package/build/cjs/observable/index.d.ts +8 -0
  32. package/build/cjs/observable/index.js +16 -0
  33. package/build/cjs/observable/types.d.ts +15 -0
  34. package/build/cjs/observable/types.js +2 -0
  35. package/build/cjs/options/index.d.ts +15 -0
  36. package/build/cjs/options/index.js +116 -0
  37. package/build/cjs/options/item.d.ts +2 -0
  38. package/build/cjs/options/item.js +16 -0
  39. package/build/cjs/options/types.d.ts +15 -0
  40. package/build/cjs/options/types.js +2 -0
  41. package/build/cjs/package.json +3 -0
  42. package/build/cjs/packageDetect.d.ts +1 -0
  43. package/build/cjs/packageDetect.js +6 -0
  44. package/build/cjs/packageInfo.d.ts +6 -0
  45. package/build/cjs/packageInfo.js +4 -0
  46. package/build/cjs/stores/Browser.d.ts +7 -0
  47. package/build/cjs/stores/Browser.js +24 -0
  48. package/build/cjs/stores/File.d.ts +12 -0
  49. package/build/cjs/stores/File.js +72 -0
  50. package/build/cjs/stores/index.d.ts +2 -0
  51. package/build/cjs/stores/index.js +7 -0
  52. package/build/cjs/types.d.ts +78 -0
  53. package/build/cjs/types.js +2 -0
  54. package/build/defaults.d.ts +6 -0
  55. package/build/defaults.js +22 -0
  56. package/build/index.d.ts +4 -0
  57. package/build/index.js +4 -0
  58. package/build/observable/accounts.d.ts +1 -0
  59. package/build/observable/accounts.js +3 -0
  60. package/build/observable/addresses.d.ts +1 -0
  61. package/build/observable/addresses.js +3 -0
  62. package/build/observable/contracts.d.ts +1 -0
  63. package/build/observable/contracts.js +3 -0
  64. package/build/observable/env.d.ts +6 -0
  65. package/build/observable/env.js +9 -0
  66. package/build/observable/genericSubject.d.ts +2 -0
  67. package/build/observable/genericSubject.js +44 -0
  68. package/build/observable/index.d.ts +8 -0
  69. package/build/observable/index.js +13 -0
  70. package/build/observable/types.d.ts +15 -0
  71. package/build/observable/types.js +1 -0
  72. package/build/options/index.d.ts +15 -0
  73. package/build/options/index.js +112 -0
  74. package/build/options/item.d.ts +2 -0
  75. package/build/options/item.js +13 -0
  76. package/build/options/types.d.ts +15 -0
  77. package/build/options/types.js +1 -0
  78. package/build/package.json +355 -0
  79. package/build/packageDetect.d.ts +1 -0
  80. package/build/packageDetect.js +4 -0
  81. package/build/packageInfo.d.ts +6 -0
  82. package/build/packageInfo.js +1 -0
  83. package/build/stores/Browser.d.ts +7 -0
  84. package/build/stores/Browser.js +19 -0
  85. package/build/stores/File.d.ts +12 -0
  86. package/build/stores/File.js +67 -0
  87. package/build/stores/index.d.ts +2 -0
  88. package/build/stores/index.js +2 -0
  89. package/build/types.d.ts +78 -0
  90. package/build/types.js +1 -0
  91. package/build-tsc/Base.d.ts +30 -0
  92. package/build-tsc/Keyring.d.ts +49 -0
  93. package/build-tsc/bundle.d.ts +4 -0
  94. package/build-tsc/defaults.d.ts +6 -0
  95. package/build-tsc/index.d.ts +4 -0
  96. package/build-tsc/observable/accounts.d.ts +1 -0
  97. package/build-tsc/observable/addresses.d.ts +1 -0
  98. package/build-tsc/observable/contracts.d.ts +1 -0
  99. package/build-tsc/observable/env.d.ts +6 -0
  100. package/build-tsc/observable/genericSubject.d.ts +2 -0
  101. package/build-tsc/observable/index.d.ts +8 -0
  102. package/build-tsc/observable/types.d.ts +15 -0
  103. package/build-tsc/options/index.d.ts +15 -0
  104. package/build-tsc/options/item.d.ts +2 -0
  105. package/build-tsc/options/types.d.ts +15 -0
  106. package/build-tsc/packageDetect.d.ts +1 -0
  107. package/build-tsc/packageInfo.d.ts +6 -0
  108. package/build-tsc/stores/Browser.d.ts +7 -0
  109. package/build-tsc/stores/File.d.ts +12 -0
  110. package/build-tsc/stores/index.d.ts +2 -0
  111. package/build-tsc/types.d.ts +78 -0
  112. package/build-tsc-cjs/Base.js +113 -0
  113. package/build-tsc-cjs/Keyring.js +308 -0
  114. package/build-tsc-cjs/bundle.js +8 -0
  115. package/build-tsc-cjs/defaults.js +28 -0
  116. package/build-tsc-cjs/index.js +7 -0
  117. package/build-tsc-cjs/observable/accounts.js +6 -0
  118. package/build-tsc-cjs/observable/addresses.js +6 -0
  119. package/build-tsc-cjs/observable/contracts.js +6 -0
  120. package/build-tsc-cjs/observable/env.js +12 -0
  121. package/build-tsc-cjs/observable/genericSubject.js +47 -0
  122. package/build-tsc-cjs/observable/index.js +16 -0
  123. package/build-tsc-cjs/observable/types.js +2 -0
  124. package/build-tsc-cjs/options/index.js +116 -0
  125. package/build-tsc-cjs/options/item.js +16 -0
  126. package/build-tsc-cjs/options/types.js +2 -0
  127. package/build-tsc-cjs/packageDetect.js +6 -0
  128. package/build-tsc-cjs/packageInfo.js +4 -0
  129. package/build-tsc-cjs/stores/Browser.js +24 -0
  130. package/build-tsc-cjs/stores/File.js +72 -0
  131. package/build-tsc-cjs/stores/index.js +7 -0
  132. package/build-tsc-cjs/types.js +2 -0
  133. package/build-tsc-esm/Base.js +109 -0
  134. package/build-tsc-esm/Keyring.js +304 -0
  135. package/build-tsc-esm/bundle.js +4 -0
  136. package/build-tsc-esm/defaults.js +22 -0
  137. package/build-tsc-esm/index.js +4 -0
  138. package/build-tsc-esm/observable/accounts.js +3 -0
  139. package/build-tsc-esm/observable/addresses.js +3 -0
  140. package/build-tsc-esm/observable/contracts.js +3 -0
  141. package/build-tsc-esm/observable/env.js +9 -0
  142. package/build-tsc-esm/observable/genericSubject.js +44 -0
  143. package/build-tsc-esm/observable/index.js +13 -0
  144. package/build-tsc-esm/observable/types.js +1 -0
  145. package/build-tsc-esm/options/index.js +112 -0
  146. package/build-tsc-esm/options/item.js +13 -0
  147. package/build-tsc-esm/options/types.js +1 -0
  148. package/build-tsc-esm/packageDetect.js +4 -0
  149. package/build-tsc-esm/packageInfo.js +1 -0
  150. package/build-tsc-esm/stores/Browser.js +19 -0
  151. package/build-tsc-esm/stores/File.js +67 -0
  152. package/build-tsc-esm/stores/index.js +2 -0
  153. package/build-tsc-esm/types.js +1 -0
  154. package/package.json +41 -0
  155. package/src/Base.ts +156 -0
  156. package/src/Keyring.ts +420 -0
  157. package/src/bundle.ts +10 -0
  158. package/src/defaults.ts +34 -0
  159. package/src/index.ts +10 -0
  160. package/src/json.d.ts +11 -0
  161. package/src/observable/accounts.ts +7 -0
  162. package/src/observable/addresses.ts +7 -0
  163. package/src/observable/contracts.ts +7 -0
  164. package/src/observable/env.ts +15 -0
  165. package/src/observable/genericSubject.ts +66 -0
  166. package/src/observable/index.ts +28 -0
  167. package/src/observable/types.ts +21 -0
  168. package/src/options/index.ts +150 -0
  169. package/src/options/item.ts +22 -0
  170. package/src/options/types.ts +23 -0
  171. package/src/packageDetect.ts +12 -0
  172. package/src/packageInfo.ts +6 -0
  173. package/src/stores/Browser.ts +28 -0
  174. package/src/stores/File.ts +94 -0
  175. package/src/stores/index.ts +5 -0
  176. package/src/types.ts +91 -0
  177. package/tsconfig.build.json +14 -0
  178. package/tsconfig.build.tsbuildinfo +1 -0
  179. package/tsconfig.spec.json +16 -0
@@ -0,0 +1,112 @@
1
+ import { BehaviorSubject } from 'rxjs';
2
+ import { obervableAll } from '../observable/index.js';
3
+ let hasCalledInitOptions = false;
4
+ const sortByName = (a, b) => {
5
+ const valueA = a.option.name;
6
+ const valueB = b.option.name;
7
+ return valueA.localeCompare(valueB);
8
+ };
9
+ const sortByCreated = (a, b) => {
10
+ const valueA = a.json.meta.whenCreated || 0;
11
+ const valueB = b.json.meta.whenCreated || 0;
12
+ if (valueA < valueB) {
13
+ return 1;
14
+ }
15
+ if (valueA > valueB) {
16
+ return -1;
17
+ }
18
+ return 0;
19
+ };
20
+ export class KeyringOption {
21
+ #allSub = null;
22
+ optionsSubject = new BehaviorSubject(this.emptyOptions());
23
+ createOptionHeader(name) {
24
+ return {
25
+ key: `header-${name.toLowerCase()}`,
26
+ name,
27
+ value: null
28
+ };
29
+ }
30
+ init(keyring) {
31
+ if (hasCalledInitOptions) {
32
+ throw new Error('Unable to initialise options more than once');
33
+ }
34
+ this.#allSub = obervableAll.subscribe(() => {
35
+ const opts = this.emptyOptions();
36
+ this.addAccounts(keyring, opts);
37
+ this.addAddresses(keyring, opts);
38
+ this.addContracts(keyring, opts);
39
+ opts.address = this.linkItems({ Addresses: opts.address, Recent: opts.recent });
40
+ opts.account = this.linkItems({ Accounts: opts.account, Development: opts.testing });
41
+ opts.contract = this.linkItems({ Contracts: opts.contract });
42
+ opts.all = [].concat(opts.account, opts.address);
43
+ opts.allPlus = [].concat(opts.account, opts.address, opts.contract);
44
+ this.optionsSubject.next(opts);
45
+ });
46
+ hasCalledInitOptions = true;
47
+ }
48
+ clear() {
49
+ if (this.#allSub) {
50
+ this.#allSub.unsubscribe();
51
+ }
52
+ }
53
+ linkItems(items) {
54
+ return Object.keys(items).reduce((result, header) => {
55
+ const options = items[header];
56
+ return result.concat(options.length
57
+ ? [this.createOptionHeader(header)]
58
+ : [], options);
59
+ }, []);
60
+ }
61
+ addAccounts(keyring, options) {
62
+ const available = keyring.accounts.subject.getValue();
63
+ Object
64
+ .values(available)
65
+ .sort(sortByName)
66
+ .forEach(({ json: { meta: { isTesting = false } }, option }) => {
67
+ if (!isTesting) {
68
+ options.account.push(option);
69
+ }
70
+ else {
71
+ options.testing.push(option);
72
+ }
73
+ });
74
+ }
75
+ addAddresses(keyring, options) {
76
+ const available = keyring.addresses.subject.getValue();
77
+ Object
78
+ .values(available)
79
+ .filter(({ json }) => !!json.meta.isRecent)
80
+ .sort(sortByCreated)
81
+ .forEach(({ option }) => {
82
+ options.recent.push(option);
83
+ });
84
+ Object
85
+ .values(available)
86
+ .filter(({ json }) => !json.meta.isRecent)
87
+ .sort(sortByName)
88
+ .forEach(({ option }) => {
89
+ options.address.push(option);
90
+ });
91
+ }
92
+ addContracts(keyring, options) {
93
+ const available = keyring.contracts.subject.getValue();
94
+ Object
95
+ .values(available)
96
+ .sort(sortByName)
97
+ .forEach(({ option }) => {
98
+ options.contract.push(option);
99
+ });
100
+ }
101
+ emptyOptions() {
102
+ return {
103
+ account: [],
104
+ address: [],
105
+ all: [],
106
+ allPlus: [],
107
+ contract: [],
108
+ recent: [],
109
+ testing: []
110
+ };
111
+ }
112
+ }
@@ -0,0 +1,13 @@
1
+ import { isUndefined } from '@pezkuwi/util';
2
+ export function createOptionItem(address, _name) {
3
+ const name = isUndefined(_name)
4
+ ? ((address.length > 15)
5
+ ? `${address.slice(0, 6)}…${address.slice(-6)}`
6
+ : address)
7
+ : _name;
8
+ return {
9
+ key: address,
10
+ name,
11
+ value: address
12
+ };
13
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ import { packageInfo as settingsInfo } from '@pezkuwi/ui-settings/packageInfo';
2
+ import { detectPackage } from '@pezkuwi/util';
3
+ import { packageInfo } from './packageInfo.js';
4
+ detectPackage(packageInfo, null, [settingsInfo]);
@@ -0,0 +1 @@
1
+ export const packageInfo = { name: '@pezkuwi/ui-keyring', path: (import.meta && import.meta.url) ? new URL(import.meta.url).pathname.substring(0, new URL(import.meta.url).pathname.lastIndexOf('/') + 1) : 'auto', type: 'esm', version: '3.16.6' };
@@ -0,0 +1,19 @@
1
+ import store from 'store';
2
+ export class BrowserStore {
3
+ all(fn) {
4
+ store.each((value, key) => {
5
+ fn(key, value);
6
+ });
7
+ }
8
+ get(key, fn) {
9
+ fn(store.get(key));
10
+ }
11
+ remove(key, fn) {
12
+ store.remove(key);
13
+ fn && fn();
14
+ }
15
+ set(key, value, fn) {
16
+ store.set(key, value);
17
+ fn && fn();
18
+ }
19
+ }
@@ -0,0 +1,67 @@
1
+ import { mkdirpSync } from 'mkdirp';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ export class FileStore {
5
+ #path;
6
+ constructor(path) {
7
+ if (!fs.existsSync(path)) {
8
+ mkdirpSync(path);
9
+ }
10
+ this.#path = path;
11
+ }
12
+ validateKey(key) {
13
+ // Make sure the key has a .json extension
14
+ if (!key.endsWith('.json')) {
15
+ console.error('Non-JSON file requested: ', key);
16
+ return false;
17
+ }
18
+ // Remove '.json'
19
+ const keyWithoutExtension = key.slice(0, -5);
20
+ // Only allow alphanumeric characters, hyphens, and underscores in the base filename
21
+ const safeKeyRegex = /^[a-zA-Z0-9_-]+$/;
22
+ if (!safeKeyRegex.test(keyWithoutExtension)) {
23
+ console.error('Invalid key format detected: ', key);
24
+ return false;
25
+ }
26
+ return true;
27
+ }
28
+ all(fn) {
29
+ fs
30
+ .readdirSync(this.#path)
31
+ .filter((key) => !['.', '..', '.DS_Store'].includes(key))
32
+ .forEach((key) => {
33
+ const value = this._readKey(key);
34
+ value?.address && fn(key, value);
35
+ });
36
+ }
37
+ get(key, fn) {
38
+ const value = this._readKey(key);
39
+ if (!value?.address) {
40
+ throw new Error(`Invalid JSON found for ${key}`);
41
+ }
42
+ fn(value);
43
+ }
44
+ remove(key, fn) {
45
+ fs.unlinkSync(this._getPath(key));
46
+ fn && fn();
47
+ }
48
+ set(key, value, fn) {
49
+ fs.writeFileSync(this._getPath(key), Buffer.from(JSON.stringify(value), 'utf-8'));
50
+ fn && fn();
51
+ }
52
+ _getPath(key) {
53
+ if (!this.validateKey(key)) {
54
+ throw new Error('Invalid key format');
55
+ }
56
+ return path.join(this.#path, key);
57
+ }
58
+ _readKey(key) {
59
+ try {
60
+ return JSON.parse(fs.readFileSync(this._getPath(key)).toString('utf-8'));
61
+ }
62
+ catch (error) {
63
+ console.error(error);
64
+ }
65
+ return undefined;
66
+ }
67
+ }
@@ -0,0 +1,2 @@
1
+ export { BrowserStore } from './Browser.js';
2
+ export { FileStore } from './File.js';
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "author": "Jaco Greeff <jacogr@gmail.com>",
3
+ "bugs": "https://github.com/pezkuwichain/ui/issues",
4
+ "engines": {
5
+ "node": ">=18"
6
+ },
7
+ "homepage": "https://github.com/pezkuwichain/ui/tree/master/packages/ui-keyring#readme",
8
+ "license": "Apache-2.0",
9
+ "name": "@pezkuwi/ui-keyring",
10
+ "repository": {
11
+ "directory": "packages/ui-keyring",
12
+ "type": "git",
13
+ "url": "https://github.com/pezkuwichain/ui.git"
14
+ },
15
+ "sideEffects": [
16
+ "./packageDetect.js",
17
+ "./packageDetect.cjs"
18
+ ],
19
+ "type": "module",
20
+ "version": "3.16.6",
21
+ "main": "index.js",
22
+ "dependencies": {
23
+ "@pezkuwi/keyring": "^14.0.5",
24
+ "@pezkuwi/ui-settings": "3.16.6",
25
+ "@pezkuwi/util": "^14.0.5",
26
+ "@pezkuwi/util-crypto": "^14.0.5",
27
+ "mkdirp": "^3.0.1",
28
+ "rxjs": "^7.8.1",
29
+ "store": "^2.0.12",
30
+ "tslib": "^2.8.1"
31
+ },
32
+ "devDependencies": {
33
+ "@types/mkdirp": "^2.0.0",
34
+ "@types/store": "^2.0.5"
35
+ },
36
+ "peerDependencies": {
37
+ "@pezkuwi/keyring": "*",
38
+ "@pezkuwi/ui-settings": "*",
39
+ "@pezkuwi/util": "*"
40
+ }
41
+ }
package/src/Base.ts ADDED
@@ -0,0 +1,156 @@
1
+ // Copyright 2017-2025 @pezkuwi/ui-keyring authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { KeyringInstance, KeyringPair } from '@pezkuwi/keyring/types';
5
+ import type { HexString } from '@pezkuwi/util/types';
6
+ import type { Prefix } from '@pezkuwi/util-crypto/address/types';
7
+ import type { AddressSubject } from './observable/types.js';
8
+ import type { KeyringOptions, KeyringStore } from './types.js';
9
+
10
+ import { createTestKeyring } from '@pezkuwi/keyring';
11
+ import { isBoolean, isNumber, isString } from '@pezkuwi/util';
12
+
13
+ import { accounts } from './observable/accounts.js';
14
+ import { addresses } from './observable/addresses.js';
15
+ import { contracts } from './observable/contracts.js';
16
+ import { env } from './observable/env.js';
17
+ import { BrowserStore } from './stores/Browser.js'; // direct import (skip index with all)
18
+
19
+ export class Base {
20
+ #accounts: AddressSubject;
21
+
22
+ #addresses: AddressSubject;
23
+
24
+ #contracts: AddressSubject;
25
+
26
+ #isEthereum: boolean;
27
+
28
+ #keyring?: KeyringInstance;
29
+
30
+ protected _store: KeyringStore;
31
+
32
+ protected _genesisHash?: HexString | undefined;
33
+
34
+ protected _genesisHashAdd: HexString[] = [];
35
+
36
+ constructor () {
37
+ this.#accounts = accounts;
38
+ this.#addresses = addresses;
39
+ this.#contracts = contracts;
40
+ this.#isEthereum = false;
41
+ this._store = new BrowserStore();
42
+ }
43
+
44
+ public get accounts (): AddressSubject {
45
+ return this.#accounts;
46
+ }
47
+
48
+ public get addresses (): AddressSubject {
49
+ return this.#addresses;
50
+ }
51
+
52
+ public get contracts (): AddressSubject {
53
+ return this.#contracts;
54
+ }
55
+
56
+ public get isEthereum (): boolean {
57
+ return this.#isEthereum;
58
+ }
59
+
60
+ public get keyring (): KeyringInstance {
61
+ if (this.#keyring) {
62
+ return this.#keyring;
63
+ }
64
+
65
+ throw new Error('Keyring should be initialised via \'loadAll\' before use');
66
+ }
67
+
68
+ public get genesisHash (): HexString | undefined {
69
+ return this._genesisHash;
70
+ }
71
+
72
+ public get genesisHashes (): HexString[] {
73
+ return this._genesisHash
74
+ ? [this._genesisHash, ...this._genesisHashAdd]
75
+ : [...this._genesisHashAdd];
76
+ }
77
+
78
+ public decodeAddress = (key: string | Uint8Array, ignoreChecksum?: boolean, ss58Format?: Prefix): Uint8Array => {
79
+ return this.keyring.decodeAddress(key, ignoreChecksum, ss58Format);
80
+ };
81
+
82
+ public encodeAddress = (key: string | Uint8Array, ss58Format?: Prefix): string => {
83
+ return this.keyring.encodeAddress(key, ss58Format);
84
+ };
85
+
86
+ public getPair (address: string | Uint8Array): KeyringPair {
87
+ return this.keyring.getPair(address);
88
+ }
89
+
90
+ public getPairs (): KeyringPair[] {
91
+ return this.keyring.getPairs().filter((pair: KeyringPair): boolean =>
92
+ env.isDevelopment() || pair.meta.isTesting !== true
93
+ );
94
+ }
95
+
96
+ public isAvailable (_address: Uint8Array | string): boolean {
97
+ const accountsValue = this.accounts.subject.getValue();
98
+ const addressesValue = this.addresses.subject.getValue();
99
+ const contractsValue = this.contracts.subject.getValue();
100
+ const address = isString(_address)
101
+ ? _address
102
+ : this.encodeAddress(_address);
103
+
104
+ return !accountsValue[address] && !addressesValue[address] && !contractsValue[address];
105
+ }
106
+
107
+ public isPassValid (password: string): boolean {
108
+ return password.length > 0;
109
+ }
110
+
111
+ public setSS58Format (ss58Format?: Prefix): void {
112
+ if (this.#keyring && isNumber(ss58Format)) {
113
+ this.#keyring.setSS58Format(ss58Format);
114
+ }
115
+ }
116
+
117
+ public setDevMode (isDevelopment: boolean): void {
118
+ env.set(isDevelopment);
119
+ }
120
+
121
+ protected initKeyring (options: KeyringOptions): void {
122
+ const keyring = createTestKeyring(options, true);
123
+
124
+ if (isBoolean(options.isDevelopment)) {
125
+ this.setDevMode(options.isDevelopment);
126
+ }
127
+
128
+ // set Ethereum state
129
+ this.#isEthereum = keyring.type === 'ethereum';
130
+
131
+ this.#keyring = keyring;
132
+ this._genesisHash = options.genesisHash && (
133
+ isString(options.genesisHash)
134
+ ? options.genesisHash.toString() as HexString
135
+ : options.genesisHash.toHex()
136
+ );
137
+ this._genesisHashAdd = options.genesisHashAdd || [];
138
+ this._store = options.store || this._store;
139
+
140
+ this.addAccountPairs();
141
+ }
142
+
143
+ protected addAccountPairs (): void {
144
+ this.keyring
145
+ .getPairs()
146
+ .forEach(({ address, meta }: KeyringPair): void => {
147
+ this.accounts.add(this._store, address, { address, meta });
148
+ });
149
+ }
150
+
151
+ protected addTimestamp (pair: KeyringPair): void {
152
+ if (!pair.meta.whenCreated) {
153
+ pair.setMeta({ whenCreated: Date.now() });
154
+ }
155
+ }
156
+ }