William O'Beirne cb92f59e57 Electron Ledger + Trezor Support (#1836)
* Initial scaffold of enclave

* Cleanup types

* Add comments

* Do not truncate errors, pretty output

* Introduce helpers for sagas

* Update yarn lock

* Convert enclave into its own lib. Implement client and server.

* Check in progress

* Initial types

* Remove unused lib

* Finish types

* cleanup

* Switch over to using electron protocol, remove code thats no longer necessary

* Refactor Ledger and Trezor wallets to provide all functionality via libs. Run chain code generation thru Enclave.

* Check in trezor work

* Transaction signing

* Message signing

* Display address

* Fix deallocation of trezor

* Adjust API

* Remove unused getAddresses

* Fix imports and filenames to cooperate with internal typings

* Fix type uncertainty

* Add persistent message to Ledger unlock.

* Update ledger help link to kb

* Convert ledger over to updated libs

* Fix jest config

* Enclave README

* Unnecessary assertion

* Adjust tip

* Type ledger errors

* Reduce enclave client code.

* No default exports

* l18n user facing enclave errors

* Reduce repeated enclave code by splitting it into its own wallet lib. Fix some types

* tslint

* Reduce repeated enclave code by splitting it into its own wallet lib. Fix some types and error messages.

* Electron TREZOR Support (#1946)

* Type trezor connect.

* Check in trezor code

* Implement TREZOR wallet

* Convert TREZOR to use enclave class like Ledger.

* Switch to mycrypto fork of trezor lib. Remove unused dependencies.

* remove unnecessary window attachment

* tslint
2018-06-15 18:25:29 -05:00

67 lines
1.8 KiB
TypeScript

import EthTx from 'ethereumjs-tx';
import EnclaveAPI, { WalletTypes } from 'shared/enclave/client';
import { getTransactionFields } from 'libs/transaction';
import { HardwareWallet, ChainCodeResponse } from './hardware';
import { IFullWallet } from '../IWallet';
import { translateRaw } from 'translations';
const walletTypeNames = {
[WalletTypes.LEDGER]: 'X_LEDGER',
[WalletTypes.TREZOR]: 'X_TREZOR',
[WalletTypes.KEEPKEY]: 'X_KEEPKEY'
};
export function makeEnclaveWallet(walletType: WalletTypes) {
class EnclaveWallet extends HardwareWallet implements IFullWallet {
public static async getChainCode(dpath: string): Promise<ChainCodeResponse> {
return EnclaveAPI.getChainCode({
walletType,
dpath
});
}
constructor(address: string, dPath: string, index: number) {
super(address, dPath, index);
}
public async signRawTransaction(t: EthTx): Promise<Buffer> {
const txFields = getTransactionFields(t);
const res = await EnclaveAPI.signTransaction({
walletType,
transaction: txFields,
path: this.getPath()
});
return new EthTx(res.signedTransaction).serialize();
}
public async signMessage(msg: string): Promise<string> {
if (!msg) {
throw Error('No message to sign');
}
const res = await EnclaveAPI.signMessage({
walletType,
message: msg,
path: this.getPath()
});
return res.signedMessage;
}
public async displayAddress() {
const path = `${this.dPath}/${this.index}`;
return EnclaveAPI.displayAddress({
walletType,
path
})
.then(res => res.success)
.catch(() => false);
}
public getWalletType(): string {
return translateRaw(walletTypeNames[walletType]);
}
}
return EnclaveWallet;
}