@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.
- package/README.md +136 -0
- package/build/Base.d.ts +30 -0
- package/build/Base.js +109 -0
- package/build/Keyring.d.ts +49 -0
- package/build/Keyring.js +304 -0
- package/build/LICENSE +201 -0
- package/build/README.md +136 -0
- package/build/bundle-pezkuwi-ui-keyring.js +2751 -0
- package/build/bundle.d.ts +4 -0
- package/build/bundle.js +4 -0
- package/build/cjs/Base.d.ts +30 -0
- package/build/cjs/Base.js +113 -0
- package/build/cjs/Keyring.d.ts +49 -0
- package/build/cjs/Keyring.js +308 -0
- package/build/cjs/bundle.d.ts +4 -0
- package/build/cjs/bundle.js +8 -0
- package/build/cjs/defaults.d.ts +6 -0
- package/build/cjs/defaults.js +28 -0
- package/build/cjs/index.d.ts +4 -0
- package/build/cjs/index.js +7 -0
- package/build/cjs/observable/accounts.d.ts +1 -0
- package/build/cjs/observable/accounts.js +6 -0
- package/build/cjs/observable/addresses.d.ts +1 -0
- package/build/cjs/observable/addresses.js +6 -0
- package/build/cjs/observable/contracts.d.ts +1 -0
- package/build/cjs/observable/contracts.js +6 -0
- package/build/cjs/observable/env.d.ts +6 -0
- package/build/cjs/observable/env.js +12 -0
- package/build/cjs/observable/genericSubject.d.ts +2 -0
- package/build/cjs/observable/genericSubject.js +47 -0
- package/build/cjs/observable/index.d.ts +8 -0
- package/build/cjs/observable/index.js +16 -0
- package/build/cjs/observable/types.d.ts +15 -0
- package/build/cjs/observable/types.js +2 -0
- package/build/cjs/options/index.d.ts +15 -0
- package/build/cjs/options/index.js +116 -0
- package/build/cjs/options/item.d.ts +2 -0
- package/build/cjs/options/item.js +16 -0
- package/build/cjs/options/types.d.ts +15 -0
- package/build/cjs/options/types.js +2 -0
- package/build/cjs/package.json +3 -0
- package/build/cjs/packageDetect.d.ts +1 -0
- package/build/cjs/packageDetect.js +6 -0
- package/build/cjs/packageInfo.d.ts +6 -0
- package/build/cjs/packageInfo.js +4 -0
- package/build/cjs/stores/Browser.d.ts +7 -0
- package/build/cjs/stores/Browser.js +24 -0
- package/build/cjs/stores/File.d.ts +12 -0
- package/build/cjs/stores/File.js +72 -0
- package/build/cjs/stores/index.d.ts +2 -0
- package/build/cjs/stores/index.js +7 -0
- package/build/cjs/types.d.ts +78 -0
- package/build/cjs/types.js +2 -0
- package/build/defaults.d.ts +6 -0
- package/build/defaults.js +22 -0
- package/build/index.d.ts +4 -0
- package/build/index.js +4 -0
- package/build/observable/accounts.d.ts +1 -0
- package/build/observable/accounts.js +3 -0
- package/build/observable/addresses.d.ts +1 -0
- package/build/observable/addresses.js +3 -0
- package/build/observable/contracts.d.ts +1 -0
- package/build/observable/contracts.js +3 -0
- package/build/observable/env.d.ts +6 -0
- package/build/observable/env.js +9 -0
- package/build/observable/genericSubject.d.ts +2 -0
- package/build/observable/genericSubject.js +44 -0
- package/build/observable/index.d.ts +8 -0
- package/build/observable/index.js +13 -0
- package/build/observable/types.d.ts +15 -0
- package/build/observable/types.js +1 -0
- package/build/options/index.d.ts +15 -0
- package/build/options/index.js +112 -0
- package/build/options/item.d.ts +2 -0
- package/build/options/item.js +13 -0
- package/build/options/types.d.ts +15 -0
- package/build/options/types.js +1 -0
- package/build/package.json +355 -0
- package/build/packageDetect.d.ts +1 -0
- package/build/packageDetect.js +4 -0
- package/build/packageInfo.d.ts +6 -0
- package/build/packageInfo.js +1 -0
- package/build/stores/Browser.d.ts +7 -0
- package/build/stores/Browser.js +19 -0
- package/build/stores/File.d.ts +12 -0
- package/build/stores/File.js +67 -0
- package/build/stores/index.d.ts +2 -0
- package/build/stores/index.js +2 -0
- package/build/types.d.ts +78 -0
- package/build/types.js +1 -0
- package/build-tsc/Base.d.ts +30 -0
- package/build-tsc/Keyring.d.ts +49 -0
- package/build-tsc/bundle.d.ts +4 -0
- package/build-tsc/defaults.d.ts +6 -0
- package/build-tsc/index.d.ts +4 -0
- package/build-tsc/observable/accounts.d.ts +1 -0
- package/build-tsc/observable/addresses.d.ts +1 -0
- package/build-tsc/observable/contracts.d.ts +1 -0
- package/build-tsc/observable/env.d.ts +6 -0
- package/build-tsc/observable/genericSubject.d.ts +2 -0
- package/build-tsc/observable/index.d.ts +8 -0
- package/build-tsc/observable/types.d.ts +15 -0
- package/build-tsc/options/index.d.ts +15 -0
- package/build-tsc/options/item.d.ts +2 -0
- package/build-tsc/options/types.d.ts +15 -0
- package/build-tsc/packageDetect.d.ts +1 -0
- package/build-tsc/packageInfo.d.ts +6 -0
- package/build-tsc/stores/Browser.d.ts +7 -0
- package/build-tsc/stores/File.d.ts +12 -0
- package/build-tsc/stores/index.d.ts +2 -0
- package/build-tsc/types.d.ts +78 -0
- package/build-tsc-cjs/Base.js +113 -0
- package/build-tsc-cjs/Keyring.js +308 -0
- package/build-tsc-cjs/bundle.js +8 -0
- package/build-tsc-cjs/defaults.js +28 -0
- package/build-tsc-cjs/index.js +7 -0
- package/build-tsc-cjs/observable/accounts.js +6 -0
- package/build-tsc-cjs/observable/addresses.js +6 -0
- package/build-tsc-cjs/observable/contracts.js +6 -0
- package/build-tsc-cjs/observable/env.js +12 -0
- package/build-tsc-cjs/observable/genericSubject.js +47 -0
- package/build-tsc-cjs/observable/index.js +16 -0
- package/build-tsc-cjs/observable/types.js +2 -0
- package/build-tsc-cjs/options/index.js +116 -0
- package/build-tsc-cjs/options/item.js +16 -0
- package/build-tsc-cjs/options/types.js +2 -0
- package/build-tsc-cjs/packageDetect.js +6 -0
- package/build-tsc-cjs/packageInfo.js +4 -0
- package/build-tsc-cjs/stores/Browser.js +24 -0
- package/build-tsc-cjs/stores/File.js +72 -0
- package/build-tsc-cjs/stores/index.js +7 -0
- package/build-tsc-cjs/types.js +2 -0
- package/build-tsc-esm/Base.js +109 -0
- package/build-tsc-esm/Keyring.js +304 -0
- package/build-tsc-esm/bundle.js +4 -0
- package/build-tsc-esm/defaults.js +22 -0
- package/build-tsc-esm/index.js +4 -0
- package/build-tsc-esm/observable/accounts.js +3 -0
- package/build-tsc-esm/observable/addresses.js +3 -0
- package/build-tsc-esm/observable/contracts.js +3 -0
- package/build-tsc-esm/observable/env.js +9 -0
- package/build-tsc-esm/observable/genericSubject.js +44 -0
- package/build-tsc-esm/observable/index.js +13 -0
- package/build-tsc-esm/observable/types.js +1 -0
- package/build-tsc-esm/options/index.js +112 -0
- package/build-tsc-esm/options/item.js +13 -0
- package/build-tsc-esm/options/types.js +1 -0
- package/build-tsc-esm/packageDetect.js +4 -0
- package/build-tsc-esm/packageInfo.js +1 -0
- package/build-tsc-esm/stores/Browser.js +19 -0
- package/build-tsc-esm/stores/File.js +67 -0
- package/build-tsc-esm/stores/index.js +2 -0
- package/build-tsc-esm/types.js +1 -0
- package/package.json +41 -0
- package/src/Base.ts +156 -0
- package/src/Keyring.ts +420 -0
- package/src/bundle.ts +10 -0
- package/src/defaults.ts +34 -0
- package/src/index.ts +10 -0
- package/src/json.d.ts +11 -0
- package/src/observable/accounts.ts +7 -0
- package/src/observable/addresses.ts +7 -0
- package/src/observable/contracts.ts +7 -0
- package/src/observable/env.ts +15 -0
- package/src/observable/genericSubject.ts +66 -0
- package/src/observable/index.ts +28 -0
- package/src/observable/types.ts +21 -0
- package/src/options/index.ts +150 -0
- package/src/options/item.ts +22 -0
- package/src/options/types.ts +23 -0
- package/src/packageDetect.ts +12 -0
- package/src/packageInfo.ts +6 -0
- package/src/stores/Browser.ts +28 -0
- package/src/stores/File.ts +94 -0
- package/src/stores/index.ts +5 -0
- package/src/types.ts +91 -0
- package/tsconfig.build.json +14 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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
|
+
}
|