Add Ledger interfaces (#211)

This commit is contained in:
Jaco Greeff
2019-09-17 13:21:18 +02:00
committed by GitHub
parent 34b0350501
commit 425ca93aa0
8 changed files with 161 additions and 4 deletions
+4
View File
@@ -11,9 +11,13 @@
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.6.0",
"@ledgerhq/hw-transport-u2f": "^4.70.0",
"@ledgerhq/hw-transport-webusb": "^4.70.0",
"@types/ledgerhq__hw-transport-u2f": "^4.21.1",
"@types/mkdirp": "^0.5.2",
"@types/store": "^2.0.2",
"extensionizer": "^1.0.1",
"ledger-polkadot": "^0.0.3",
"mkdirp": "^0.5.1",
"store": "^2.0.12",
"styled-components": "^4.3.1"
+3 -1
View File
@@ -5,11 +5,13 @@
import { assertSingletonPackage } from '@polkadot/util';
import keyring, { Keyring } from './Keyring';
import { openLedger } from './ledger';
assertSingletonPackage('@polkadot/ui-keyring');
export default keyring;
export {
Keyring
Keyring,
openLedger
};
+36
View File
@@ -0,0 +1,36 @@
declare module 'ledger-polkadot' {
import Transport from '@ledgerhq/hw-transport';
export interface ResponseBase {
error_message: string;
return_code: number;
}
export interface ReponseAddress extends ResponseBase {
address: string;
pubKey: string;
}
export interface ResponseVersion extends ResponseBase {
device_locked: boolean;
major: number;
minor: number;
patch: number;
test_mode: boolean;
}
export interface ResponseSign extends ResponseBase {
signature: string;
}
declare class LedgerApp {
constructor (transport: Transport, scrambleKey?: string);
getVersion (): Promise<ResponseVersion>;
getAddress (account: number, change: number, addressIndex: number, requireConfirmation?: boolean): Promise<ResponseAddress>;
signSendChunk (chunkIdx: number, chunkNum: number, chunk: Buffer): Promise<ResponseSign>;
sign (account: number, change: number, addressIndex: number, message: Uint8Array): Promise<ResponseSign>;
}
export default LedgerApp;
}
+22
View File
@@ -0,0 +1,22 @@
// Copyright 2017-2019 @polkadot/ui-keyring authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
import Transport from '@ledgerhq/hw-transport';
import LedgerU2F from '@ledgerhq/hw-transport-u2f';
import LedgerWebUSB from '@ledgerhq/hw-transport-webusb';
import LedgerApp from 'ledger-polkadot';
export async function openLedger (type: 'u2f' | 'webusb'): Promise<LedgerApp> {
let transport: Transport;
if (type === 'u2f') {
transport = await LedgerU2F.create(7500);
} else if (type === 'webusb') {
transport = await LedgerWebUSB.create();
} else {
throw new Error(`Unsupported transport ${type}`);
}
return new LedgerApp(transport);
}
@@ -0,0 +1 @@
declare module '@ledgerhq/hw-transport-webusb';
+16 -1
View File
@@ -2,15 +2,21 @@
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
import EventEmitter from 'eventemitter3';
import store from 'store';
import { isUndefined } from '@polkadot/util';
import { CRYPTOS, ENDPOINT_DEFAULT, ENDPOINTS, ICON_DEFAULT, ICONS, LANGUAGE_DEFAULT, LANGUAGES, LEDGER_CONN, LEDGER_CONN_DEFAULT, LOCKING_DEFAULT, LOCKING, PREFIX_DEFAULT, PREFIXES, UIMODE_DEFAULT, UIMODES, UITHEME_DEFAULT, UITHEMES } from './defaults';
import { Option, SettingsStruct } from './types';
type ChangeCallback = (settings: SettingsStruct) => void;
type OnTypes = 'change';
export class Settings implements SettingsStruct {
private _apiUrl: string;
private _emitter: EventEmitter;
private _i18nLang: string;
private _icon: string;
@@ -28,6 +34,8 @@ export class Settings implements SettingsStruct {
public constructor () {
const settings = store.get('settings') || {};
this._emitter = new EventEmitter();
this._apiUrl = settings.apiUrl || process.env.WS_URL || ENDPOINT_DEFAULT;
this._ledgerConn = settings.ledgerConn || LEDGER_CONN_DEFAULT;
this._i18nLang = settings.i18nLang || LANGUAGE_DEFAULT;
@@ -129,7 +137,14 @@ export class Settings implements SettingsStruct {
this._uiMode = settings.uiMode || this._uiMode;
this._uiTheme = settings.uiTheme || this._uiTheme;
store.set('settings', this.get());
const newValues = this.get();
store.set('settings', newValues);
this._emitter.emit('change', newValues);
}
public on (type: OnTypes, cb: ChangeCallback): void {
this._emitter.on(type, cb);
}
}