Add contracts to ui-keyring (#137)

* add contracts to keyring

* genesisHash

* requested changes + allPlus option type

* remove duplicate fn

* add contracts to keyring

* genesisHash

* requested changes + allPlus option type

* remove duplicate fn

* changes

* contract key

* prefixes
This commit is contained in:
kwingram25
2019-06-06 13:57:07 +02:00
committed by Jaco Greeff
parent 091ab41242
commit bdfbb69946
8 changed files with 151 additions and 17 deletions
+71 -11
View File
@@ -12,7 +12,7 @@ import { hexToU8a, isHex, isString, u8aToHex } from '@polkadot/util';
import env from './observable/development';
import Base from './Base';
import { accountKey, addressKey, accountRegex, addressRegex } from './defaults';
import { accountKey, addressKey, accountRegex, addressRegex, contractKey, contractRegex } from './defaults';
import keyringOption from './options';
const RECENT_EXPIRY = 24 * 60 * 60;
@@ -101,6 +101,10 @@ export class Keyring extends Base implements KeyringStruct {
this.addresses.remove(this._store, address);
}
forgetContract (address: string): void {
this.contracts.remove(this._store, address);
}
getAccount (address: string | Uint8Array): KeyringAddress {
return this.getAddress(address, 'account');
}
@@ -114,14 +118,21 @@ export class Keyring extends Base implements KeyringStruct {
.filter((account) => env.isDevelopment() || account.getMeta().isTesting !== true);
}
getAddress (_address: string | Uint8Array, type: 'account' | 'address' = 'address'): KeyringAddress {
getAddress (_address: string | Uint8Array, type: 'account' | 'address' | 'contract' = 'address'): KeyringAddress {
const address = isString(_address)
? _address
: this.encodeAddress(_address);
const publicKey = this.decodeAddress(address);
const subject = type === 'account'
? this.accounts.subject
: this.addresses.subject;
const subject = (() => {
switch (type) {
case 'account':
return this.accounts.subject;
case 'address':
return this.addresses.subject;
case 'contract':
return this.contracts.subject;
}
})();
return {
address: (): string =>
@@ -143,6 +154,22 @@ export class Keyring extends Base implements KeyringStruct {
.map((address) => this.getAddress(address));
}
getContract (address: string | Uint8Array): KeyringAddress {
return this.getAddress(address, 'contract');
}
getContracts (): Array<KeyringAddress> {
const available = this.contracts.subject.getValue();
return Object
.entries(available)
.filter(([, data]) => {
const { json: { meta: { contract } } } = data;
return contract && contract.genesisHash === this.genesisHash;
})
.map(([address]) => this.getContract(address));
}
private rewriteKey (json: KeyringJson, key: string, hexAddr: string, creator: (addr: string) => string) {
if (hexAddr.substr(0, 2) === '0x') {
return;
@@ -185,6 +212,16 @@ export class Keyring extends Base implements KeyringStruct {
this.rewriteKey(json, key, hexAddr, addressKey);
}
private loadContract (json: KeyringJson, key: string) {
const address = this.encodeAddress(
this.decodeAddress(json.address)
);
const [, hexAddr] = key.split(':');
this.contracts.add(this._store, address, json);
this.rewriteKey(json, key, hexAddr, contractKey);
}
private loadInjected (address: string, meta: KeyringJson$Meta) {
const json = {
address,
@@ -202,10 +239,20 @@ export class Keyring extends Base implements KeyringStruct {
super.initKeyring(options);
this._store.all((key: string, json: KeyringJson) => {
if (accountRegex.test(key)) {
this.loadAccount(json, key);
} else if (addressRegex.test(key)) {
this.loadAddress(json, key);
if (options.filter ? options.filter(json) : true) {
if (accountRegex.test(key)) {
this.loadAccount(json, key);
} else if (addressRegex.test(key)) {
this.loadAddress(json, key);
} else if (contractRegex.test(key)) {
if (
json.meta && json.meta.contract &&
this.genesisHash &&
this.genesisHash === json.meta.contract.genesisHash
) {
this.loadContract(json, key);
}
}
}
});
@@ -258,7 +305,7 @@ export class Keyring extends Base implements KeyringStruct {
});
}
saveAddress (address: string, meta: KeyringPair$Meta): KeyringPair$Json {
saveAddress (address: string, meta: KeyringPair$Meta, type: 'address' | 'contract' = 'address'): KeyringPair$Json {
const available = this.addresses.subject.getValue();
const json = (available[address] && available[address].json) || {
@@ -275,11 +322,24 @@ export class Keyring extends Base implements KeyringStruct {
delete json.meta.isRecent;
this.addresses.add(this._store, address, json);
const key = (() => {
switch (type) {
case 'contract':
return 'contracts';
default:
return 'addresses';
}
})();
this[key].add(this._store, address, json);
return json as KeyringPair$Json;
}
saveContract (address: string, meta: KeyringPair$Meta): KeyringPair$Json {
return this.saveAddress(address, meta, 'contract');
}
saveRecent (address: string): SingleAddress {
const available = this.addresses.subject.getValue();