mirror of
https://github.com/pezkuwichain/pezkuwi-ui.git
synced 2026-06-09 20:11:04 +00:00
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:
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user