Ledger transports arrays for node vs web vs rn (#214)

* Ledger transports arrays for node vs web vs rn

* Flatten requires
This commit is contained in:
Jaco Greeff
2019-09-18 12:38:30 +02:00
committed by GitHub
parent 77ad1b1901
commit 337f377ee9
8 changed files with 95 additions and 69 deletions
+6 -3
View File
@@ -10,14 +10,14 @@
"contributors": [],
"license": "Apache-2.0",
"browser": {
"@ledgerhq/hw-transport-node-hid": "@ledgerhq/hw-transport-u2f"
"./ledger/transportsNode": "./ledger/transportsEmpty"
},
"react-native": {
"@ledgerhq/hw-transport-node-hid": "@ledgerhq/hw-transport-u2f"
"./ledger/transportsNode": "./ledger/transportsEmpty",
"./ledger/transportsWeb": "./ledger/transportsEmpty"
},
"dependencies": {
"@babel/runtime": "^7.6.0",
"@ledgerhq/hw-transport-node-hid": "^4.70.0",
"@ledgerhq/hw-transport-u2f": "^4.70.0",
"@ledgerhq/hw-transport-webusb": "^4.70.0",
"@types/ledgerhq__hw-transport-node-hid": "^4.21.1",
@@ -35,6 +35,9 @@
"@polkadot/types": "^0.93.0-beta.7",
"@polkadot/util": "^1.4.1"
},
"optionalDependencies": {
"@ledgerhq/hw-transport-node-hid": "^4.70.0"
},
"peerDependencies": {
"@polkadot/keyring": "*",
"@polkadot/types": "*",
-36
View File
@@ -1,36 +0,0 @@
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: Buffer;
}
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: Buffer): Promise<ResponseSign>;
}
export default LedgerApp;
}
@@ -3,29 +3,13 @@
// 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 LedgerHid from '@ledgerhq/hw-transport-node-hid';
import LedgerU2F from '@ledgerhq/hw-transport-u2f';
import LedgerWebUSB from '@ledgerhq/hw-transport-webusb';
import { LedgerAddress, LedgerSignature, LedgerTypes, LedgerVersion, TransportDef } from './types';
import LedgerApp, { ResponseBase } from 'ledger-polkadot';
import { assert, bufferToU8a, u8aToBuffer, u8aToHex } from '@polkadot/util';
export type LedgerTypes = 'hid' | 'u2f' | 'webusb';
export interface LedgerAddress {
address: string;
publicKey: string;
}
export interface LedgerSignature {
signature: string;
}
export interface LedgerVersion {
isLocked: boolean;
isTestMode: boolean;
version: [number, number, number];
}
import allNode from './transportsNode';
import allWeb from './transportsWeb';
export const LEDGER_DEFAULT_ACCOUNT = 0x80000000;
@@ -35,6 +19,8 @@ export const LEDGER_DEFAULT_INDEX = 0x80000000;
const SUCCESS_CODE = 0x9000;
const transports = allNode.concat(allWeb);
// A very basic wrapper for a ledger app -
// - it connects automatically, creating an app as required
// - Promises return errors (instead of wrapper errors)
@@ -50,17 +36,12 @@ export default class Ledger {
private async getApp (): Promise<LedgerApp> {
if (!this.app) {
let transport: Transport;
const def = transports.find(({ type }): boolean => type === this.type);
if (this.type === 'hid') {
transport = await LedgerHid.create();
} else if (this.type === 'u2f') {
transport = await LedgerU2F.create();
} else if (this.type === 'webusb') {
transport = await LedgerWebUSB.create();
} else {
throw new Error(`Unable to create app for ${this.type}`);
}
assert(def, `Unable to find a transport for ${this.type}`);
// we have checked for undefined in the assert
const transport = await (def as TransportDef).create();
this.app = new LedgerApp(transport);
}
@@ -0,0 +1,9 @@
// 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 { TransportDef } from './types';
const transports: TransportDef[] = [];
export default transports;
@@ -0,0 +1,18 @@
// 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 { TransportDef } from './types';
import Transport from '@ledgerhq/hw-transport';
import LedgerHid from '@ledgerhq/hw-transport-node-hid';
const transports: TransportDef[] = [
{
create: (): Promise<Transport> =>
LedgerHid.create(),
type: 'hid'
}
];
export default transports;
@@ -0,0 +1,24 @@
// 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 { TransportDef } from './types';
import Transport from '@ledgerhq/hw-transport';
import LedgerU2F from '@ledgerhq/hw-transport-u2f';
import LedgerWebUSB from '@ledgerhq/hw-transport-webusb';
const transports: TransportDef[] = [
{
create: (): Promise<Transport> =>
LedgerU2F.create(),
type: 'u2f'
},
{
create: (): Promise<Transport> =>
LedgerWebUSB.create(),
type: 'webusb'
}
];
export default transports;
+27
View File
@@ -0,0 +1,27 @@
// 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';
export type LedgerTypes = 'hid' | 'u2f' | 'webusb';
export interface LedgerAddress {
address: string;
publicKey: string;
}
export interface LedgerSignature {
signature: string;
}
export interface LedgerVersion {
isLocked: boolean;
isTestMode: boolean;
version: [number, number, number];
}
export interface TransportDef {
create (): Promise<Transport>;
type: LedgerTypes;
}