Batch export (#449)

* .

* .

* fix lint

* .

* change on request
This commit is contained in:
雪霁
2021-03-10 02:55:31 +08:00
committed by GitHub
parent 942bd2baf5
commit fd3176c36e
2 changed files with 36 additions and 3 deletions
+30 -3
View File
@@ -2,16 +2,17 @@
// SPDX-License-Identifier: Apache-2.0
import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta } from '@polkadot/keyring/types';
import type { EncryptedJson } from '@polkadot/util-crypto/json/types';
import type { KeypairType } from '@polkadot/util-crypto/types';
import type { AddressSubject, SingleAddress } from './observable/types';
import type { CreateResult, KeyringAddress, KeyringAddressType, KeyringItemType, KeyringJson, KeyringJson$Meta, KeyringOptions, KeyringStruct } from './types';
import type { CreateResult, KeyringAddress, KeyringAddressType, KeyringItemType, KeyringJson, KeyringJson$Meta, KeyringOptions, KeyringPairs$Json, KeyringStruct } from './types';
import BN from 'bn.js';
import { createPair } from '@polkadot/keyring/pair';
import { chains } from '@polkadot/ui-settings/defaults/chains';
import { bnToBn, hexToU8a, isHex, isString, u8aSorted } from '@polkadot/util';
import { base64Decode, createKeyMulti } from '@polkadot/util-crypto';
import { bnToBn, hexToU8a, isHex, isString, stringToU8a, u8aSorted, u8aToString } from '@polkadot/util';
import { base64Decode, createKeyMulti, jsonDecrypt, jsonEncrypt } from '@polkadot/util-crypto';
import { env } from './observable/env';
import { Base } from './Base';
@@ -82,6 +83,24 @@ export class Keyring extends Base implements KeyringStruct {
return pair.toJson(password);
}
public async backupAccounts (addresses: string[]): Promise<KeyringPairs$Json> {
const accountPromises = addresses.map((address) => {
return new Promise<KeyringJson>((resolve) => {
this._store.get(accountKey(address), resolve);
});
});
const accounts = await Promise.all(accountPromises);
return {
...jsonEncrypt(stringToU8a(JSON.stringify(accounts)), ['batch-pkcs8']),
accounts: accounts.map((account) => ({
address: account.address,
meta: account.meta
}))
};
}
public createFromJson (json: KeyringPair$Json, meta: KeyringPair$Meta = {}): KeyringPair {
return this.keyring.createFromJson({ ...json, meta: { ...(json.meta || {}), meta } });
}
@@ -310,6 +329,14 @@ export class Keyring extends Base implements KeyringStruct {
return pair;
}
public restoreAccounts (json: EncryptedJson): void {
const accounts: KeyringJson[] = JSON.parse(u8aToString(jsonDecrypt(json))) as KeyringJson[];
accounts.forEach((account) => {
this.loadAccount(account, accountKey(account.address));
});
}
public saveAccount (pair: KeyringPair, password?: string): KeyringPair$Json {
this.addTimestamp(pair);