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

106 lines
2.2 KiB
TypeScript

// Enclave enums
export enum EnclaveMethods {
GET_CHAIN_CODE = 'get-chain-code',
SIGN_TRANSACTION = 'sign-transaction',
SIGN_MESSAGE = 'sign-message',
DISPLAY_ADDRESS = 'display-address'
}
export enum WalletTypes {
LEDGER = 'ledger',
TREZOR = 'trezor',
KEEPKEY = 'keepkey'
}
export interface RawTransaction {
chainId: number;
gasLimit: string;
gasPrice: string;
to: string;
nonce: string;
data: string;
value: string;
}
// Get chain code request
export interface GetChainCodeParams {
walletType: WalletTypes;
dpath: string;
}
export interface GetChainCodeResponse {
publicKey: string;
chainCode: string;
}
// Sign Transaction Request
export interface SignTransactionParams {
walletType: WalletTypes;
transaction: RawTransaction;
path: string;
}
export interface SignTransactionResponse {
signedTransaction: string;
}
// Sign Message Request
export interface SignMessageParams {
walletType: WalletTypes;
message: string;
path: string;
}
export interface SignMessageResponse {
signedMessage: string;
}
// Display Address Request
export interface DisplayAddressParams {
walletType: WalletTypes;
path: string;
}
export interface DisplayAddressResponse {
success: boolean;
}
// All Requests & Responses
export type EnclaveMethodParams =
| GetChainCodeParams
| SignTransactionParams
| SignMessageParams
| DisplayAddressParams;
export type EnclaveMethodResponse =
| GetChainCodeResponse
| SignTransactionResponse
| SignMessageResponse
| DisplayAddressResponse;
// RPC requests, responses & failures
export interface EnclaveSuccessResponse<T = EnclaveMethodResponse> {
data: T;
error?: undefined;
}
export interface EnclaveErrorResponse {
data?: undefined;
error: {
code: number;
type: string;
message: string;
};
}
export type EnclaveResponse<T = EnclaveMethodResponse> =
| EnclaveSuccessResponse<T>
| EnclaveErrorResponse;
// Wallet lib
export interface WalletLib {
getChainCode(dpath: string): Promise<GetChainCodeResponse>;
signTransaction(transaction: RawTransaction, path: string): Promise<SignTransactionResponse>;
signMessage(msg: string, path: string): Promise<SignMessageResponse>;
displayAddress(path: string): Promise<DisplayAddressResponse>;
}