From bb4c748bf1e93d1f2c98514c574ba67678b0ed59 Mon Sep 17 00:00:00 2001 From: Cavan Date: Thu, 7 Jun 2018 09:42:50 -0600 Subject: Formatting and standards updates --- packages/subproviders/src/index.ts | 1 + .../src/subproviders/eth_lightwallet.ts | 88 ++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 packages/subproviders/src/subproviders/eth_lightwallet.ts (limited to 'packages/subproviders/src') diff --git a/packages/subproviders/src/index.ts b/packages/subproviders/src/index.ts index 6cc650a4d..0e1579706 100644 --- a/packages/subproviders/src/index.ts +++ b/packages/subproviders/src/index.ts @@ -15,6 +15,7 @@ export { Subprovider } from './subproviders/subprovider'; export { NonceTrackerSubprovider } from './subproviders/nonce_tracker'; export { PrivateKeyWalletSubprovider } from './subproviders/private_key_wallet'; export { MnemonicWalletSubprovider } from './subproviders/mnemonic_wallet'; +export { EthLightwalletSubprovider } from './subproviders/eth_lightwallet'; export { Callback, ErrorCallback, diff --git a/packages/subproviders/src/subproviders/eth_lightwallet.ts b/packages/subproviders/src/subproviders/eth_lightwallet.ts new file mode 100644 index 000000000..af4ea77e9 --- /dev/null +++ b/packages/subproviders/src/subproviders/eth_lightwallet.ts @@ -0,0 +1,88 @@ +import { assert } from '@0xproject/assert'; +import { ECSignatureBuffer } from '@0xproject/types'; +import { addressUtils } from '@0xproject/utils'; +import * as lightwallet from 'eth-lightwallet'; +import EthereumTx = require('ethereumjs-tx'); +import * as _ from 'lodash'; + +import { PartialTxParams, WalletSubproviderErrors } from '../types'; + +import { BaseWalletSubprovider } from './base_wallet_subprovider'; + +/* + * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface. + * This subprovider intercepts all account related RPC requests (e.g message/transaction signing, etc...) and + * re-routes them to [eth-lightwallet](https://github.com/ConsenSys/eth-lightwallet). + */ +export class EthLightwalletSubprovider extends BaseWalletSubprovider { + private _signing: lightwallet.signing; + private _keystore: lightwallet.keystore; + private _pwDerivedKey: Uint8Array; + /** + * Instantiates a EthLightwalletSubprovider + * @param signing The lightwallet module containing signing functions + * @param keystore An instance of the lightwallet keystore + * @param pwDerivedKey The users password derived key + */ + constructor(signing: lightwallet.signing, keystore: lightwallet.keystore, pwDerivedKey: Uint8Array) { + super(); + + this._signing = signing; + this._keystore = keystore; + this._pwDerivedKey = pwDerivedKey; + } + /** + * Retrieve the accounts associated with the eth-lightwallet instance. + * This method is implicitly called when issuing a `eth_accounts` JSON RPC request + * via your providerEngine instance. + * + * @return An array of accounts + */ + public async getAccountsAsync(): Promise { + const accounts = this._keystore.getAddresses(); + return accounts; + } + /** + * Signs a transaction with the account specificed by the `from` field in txParams. + * If you've added this Subprovider to your app's provider, you can simply send + * an `eth_sendTransaction` JSON RPC request, and this method will be called auto-magically. + * If you are not using this via a ProviderEngine instance, you can call it directly. + * @param txParams Parameters of the transaction to sign + * @return Signed transaction hex string + */ + public async signTransactionAsync(txParams: PartialTxParams): Promise { + if (_.isUndefined(txParams.from) || !addressUtils.isAddress(txParams.from)) { + throw new Error(WalletSubproviderErrors.FromAddressMissingOrInvalid); + } + + const tx = new EthereumTx(txParams); + const txHex = tx.serialize().toString('hex'); + let signedTxHex: string = this._signing.signTx(this._keystore, this._pwDerivedKey, txHex, txParams.from); + + signedTxHex = `0x${signedTxHex}`; + + return signedTxHex; + } + /** + * Sign a personal Ethereum signed message. The signing account will be the account + * associated with the provided address. + * If you've added the EthLightwalletSubprovider to your app's provider, you can simply send an `eth_sign` + * or `personal_sign` JSON RPC request, and this method will be called auto-magically. + * If you are not using this via a ProviderEngine instance, you can call it directly. + * @param data Hex string message to sign + * @param address Address of the account to sign with + * @return Signature hex string (order: rsv) + */ + public async signPersonalMessageAsync(data: string, address: string): Promise { + if (_.isUndefined(data)) { + throw new Error(WalletSubproviderErrors.DataMissingForSignPersonalMessage); + } + assert.isHexString('data', data); + assert.isETHAddressHex('address', address); + const result: ECSignatureBuffer = this._signing.signMsgHash(this._keystore, this._pwDerivedKey, data, address); + + const signature = this._signing.concatSig(result); + + return signature; + } +} -- cgit v1.2.3 From 76f4d67f33af208e83eea5bcfa8802ce0e482901 Mon Sep 17 00:00:00 2001 From: Cavan Date: Wed, 6 Jun 2018 00:01:19 -0600 Subject: Remove timestamps and fix typings --- packages/subproviders/src/subproviders/eth_lightwallet.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'packages/subproviders/src') diff --git a/packages/subproviders/src/subproviders/eth_lightwallet.ts b/packages/subproviders/src/subproviders/eth_lightwallet.ts index af4ea77e9..fedcc9578 100644 --- a/packages/subproviders/src/subproviders/eth_lightwallet.ts +++ b/packages/subproviders/src/subproviders/eth_lightwallet.ts @@ -57,7 +57,12 @@ export class EthLightwalletSubprovider extends BaseWalletSubprovider { const tx = new EthereumTx(txParams); const txHex = tx.serialize().toString('hex'); - let signedTxHex: string = this._signing.signTx(this._keystore, this._pwDerivedKey, txHex, txParams.from); + let signedTxHex: string = this._signing.signTx( + this._keystore, + this._pwDerivedKey, + txHex, + txParams.from, + ); signedTxHex = `0x${signedTxHex}`; @@ -79,7 +84,12 @@ export class EthLightwalletSubprovider extends BaseWalletSubprovider { } assert.isHexString('data', data); assert.isETHAddressHex('address', address); - const result: ECSignatureBuffer = this._signing.signMsgHash(this._keystore, this._pwDerivedKey, data, address); + const result: ECSignatureBuffer = await this._signing.signMsgHash( + this._keystore, + this._pwDerivedKey, + data, + address, + ); const signature = this._signing.concatSig(result); -- cgit v1.2.3 From 235d78565e4d809d3ec1b91174fd0a831c126202 Mon Sep 17 00:00:00 2001 From: Cavan Date: Mon, 4 Jun 2018 16:24:37 -0600 Subject: Format subprovider using prettier --- packages/subproviders/src/subproviders/eth_lightwallet.ts | 2 ++ 1 file changed, 2 insertions(+) (limited to 'packages/subproviders/src') diff --git a/packages/subproviders/src/subproviders/eth_lightwallet.ts b/packages/subproviders/src/subproviders/eth_lightwallet.ts index fedcc9578..970c5d981 100644 --- a/packages/subproviders/src/subproviders/eth_lightwallet.ts +++ b/packages/subproviders/src/subproviders/eth_lightwallet.ts @@ -62,6 +62,7 @@ export class EthLightwalletSubprovider extends BaseWalletSubprovider { this._pwDerivedKey, txHex, txParams.from, + this._keystore.hdPathString, ); signedTxHex = `0x${signedTxHex}`; @@ -89,6 +90,7 @@ export class EthLightwalletSubprovider extends BaseWalletSubprovider { this._pwDerivedKey, data, address, + this._keystore.hdPathString, ); const signature = this._signing.concatSig(result); -- cgit v1.2.3 From 7ce1e9b18d30cb76dd61f3859164cb09d091a3dd Mon Sep 17 00:00:00 2001 From: Cavan Date: Mon, 4 Jun 2018 14:48:18 -0600 Subject: Add eth-lightwallet subprovider and tests --- packages/subproviders/src/globals.d.ts | 28 +++++++ packages/subproviders/src/index.ts | 2 +- .../subproviders/eth_lightwallet_subprovider.ts | 88 ++++++++++++++++++++++ 3 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts (limited to 'packages/subproviders/src') diff --git a/packages/subproviders/src/globals.d.ts b/packages/subproviders/src/globals.d.ts index 4b3ecdf3c..1e104053f 100644 --- a/packages/subproviders/src/globals.d.ts +++ b/packages/subproviders/src/globals.d.ts @@ -16,6 +16,11 @@ interface ECSignature { r: string; s: string; } +interface ECSignatureBuffer { + v: number; + r: Buffer; + s: Buffer; +} interface LedgerTransport { close(): Promise; @@ -57,3 +62,26 @@ declare module '*.json' { export default json; /* tslint:enable */ } + +// eth-lightwallet declarations +declare module 'eth-lightwallet' { + export class signing { + public static signTx(keystore: keystore, pwDerivedKey: Uint8Array, rawTx: string, signingAddress: string): string; + public static signMsg(keystore: keystore, pwDerivedKey: Uint8Array, rawMsg: string, signingAddress: string): ECSignatureBuffer; + public static signMsgHash(keystore: keystore, pwDerivedKey: Uint8Array, msgHash: string, signingAddress: string): ECSignatureBuffer; + public static concatSig(signature: any): string; + } + export class keystore { + public static createVault(options: any, callback?: (error: Error, keystore: keystore) => void): keystore; + public static generateRandomSeed(): string; + public static isSeedValid(seed: string): boolean; + public static deserialize(keystore: string): keystore; + public serialize(): string; + public keyFromPassword(password: string, callback?: (error: Error, pwDerivedKey: Uint8Array) => void): Uint8Array; + public isDerivedKeyCorrect(pwDerivedKey: Uint8Array): boolean; + public generateNewAddress(pwDerivedKey: Uint8Array, numberOfAddresses: number): void; + public getSeed(pwDerivedKey: Uint8Array): string; + public exportPrivateKey(address: string, pwDerivedKey: Uint8Array): string; + public getAddresses(): string[]; + } +} diff --git a/packages/subproviders/src/index.ts b/packages/subproviders/src/index.ts index 0e1579706..06d5871f9 100644 --- a/packages/subproviders/src/index.ts +++ b/packages/subproviders/src/index.ts @@ -15,7 +15,7 @@ export { Subprovider } from './subproviders/subprovider'; export { NonceTrackerSubprovider } from './subproviders/nonce_tracker'; export { PrivateKeyWalletSubprovider } from './subproviders/private_key_wallet'; export { MnemonicWalletSubprovider } from './subproviders/mnemonic_wallet'; -export { EthLightwalletSubprovider } from './subproviders/eth_lightwallet'; +export { EthLightwalletSubprovider } from './subproviders/eth_lightwallet_subprovider'; export { Callback, ErrorCallback, diff --git a/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts new file mode 100644 index 000000000..7507eeb49 --- /dev/null +++ b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts @@ -0,0 +1,88 @@ +import { assert } from '@0xproject/assert'; +import { addressUtils } from '@0xproject/utils'; +import * as lightwallet from 'eth-lightwallet'; +import EthereumTx = require('ethereumjs-tx'); +import * as _ from 'lodash'; + +import { PartialTxParams, WalletSubproviderErrors } from '../types'; + +import { BaseWalletSubprovider } from './base_wallet_subprovider'; + +/* + * This class implements the web3-provider-engine subprovider interface and forwards + * requests involving user accounts and signing operations to eth-lightwallet + * + * Source: https://github.com/MetaMask/provider-engine/blob/master/subproviders/subprovider.js + */ +export class EthLightwalletSubprovider extends BaseWalletSubprovider { + private _signing: any; + private _keystore: any; + private _pwDerivedKey: Uint8Array; + + constructor(signing: lightwallet.signing, keystore: lightwallet.keystore, pwDerivedKey: Uint8Array) { + super(); + + this._signing = signing; + this._keystore = keystore; + this._pwDerivedKey = pwDerivedKey; + } + + /** + * Retrieve the accounts associated with the eth-lightwallet instance. + * This method is implicitly called when issuing a `eth_accounts` JSON RPC request + * via your providerEngine instance. + * + * @return An array of accounts + */ + public async getAccountsAsync(): Promise { + const accounts = this._keystore.getAddresses(); + return accounts; + } + + /** + * Signs a transaction with the account specificed by the `from` field in txParams. + * If you've added this Subprovider to your app's provider, you can simply send + * an `eth_sendTransaction` JSON RPC request, and this method will be called auto-magically. + * If you are not using this via a ProviderEngine instance, you can call it directly. + * @param txParams Parameters of the transaction to sign + * @return Signed transaction hex string + */ + public async signTransactionAsync(txParams: PartialTxParams): Promise { + if (_.isUndefined(txParams.from) || !addressUtils.isAddress(txParams.from)) { + throw new Error(WalletSubproviderErrors.FromAddressMissingOrInvalid); + } + + const tx = new EthereumTx(txParams); + const txHex = tx.serialize().toString('hex'); + let signedTxHex: string = this._signing.signTx( + this._keystore, this._pwDerivedKey, txHex, txParams.from, this._keystore.hdPathString); + + signedTxHex = `0x${signedTxHex}`; + + return signedTxHex; + } + + /** + * Sign a personal Ethereum signed message. The signing account will be the account + * associated with the provided address. + * If you've added the MnemonicWalletSubprovider to your app's provider, you can simply send an `eth_sign` + * or `personal_sign` JSON RPC request, and this method will be called auto-magically. + * If you are not using this via a ProviderEngine instance, you can call it directly. + * @param data Hex string message to sign + * @param address Address of the account to sign with + * @return Signature hex string (order: rsv) + */ + public async signPersonalMessageAsync(data: string, address: string): Promise { + if (_.isUndefined(data)) { + throw new Error(WalletSubproviderErrors.DataMissingForSignPersonalMessage); + } + assert.isHexString('data', data); + assert.isETHAddressHex('address', address); + const result: ECSignatureBuffer = await this._signing.signMsgHash( + this._keystore, this._pwDerivedKey, data, address, this._keystore.hdPathString); + + const signature = this._signing.concatSig(result); + + return signature; + } +} -- cgit v1.2.3 From 1dd9ec4d5af3de37a9f7defd11265795d04c9604 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Mon, 25 Jun 2018 22:58:50 +0200 Subject: Remove duplicate type --- packages/subproviders/src/globals.d.ts | 23 ----------------------- 1 file changed, 23 deletions(-) (limited to 'packages/subproviders/src') diff --git a/packages/subproviders/src/globals.d.ts b/packages/subproviders/src/globals.d.ts index 1e104053f..287d5e0fe 100644 --- a/packages/subproviders/src/globals.d.ts +++ b/packages/subproviders/src/globals.d.ts @@ -62,26 +62,3 @@ declare module '*.json' { export default json; /* tslint:enable */ } - -// eth-lightwallet declarations -declare module 'eth-lightwallet' { - export class signing { - public static signTx(keystore: keystore, pwDerivedKey: Uint8Array, rawTx: string, signingAddress: string): string; - public static signMsg(keystore: keystore, pwDerivedKey: Uint8Array, rawMsg: string, signingAddress: string): ECSignatureBuffer; - public static signMsgHash(keystore: keystore, pwDerivedKey: Uint8Array, msgHash: string, signingAddress: string): ECSignatureBuffer; - public static concatSig(signature: any): string; - } - export class keystore { - public static createVault(options: any, callback?: (error: Error, keystore: keystore) => void): keystore; - public static generateRandomSeed(): string; - public static isSeedValid(seed: string): boolean; - public static deserialize(keystore: string): keystore; - public serialize(): string; - public keyFromPassword(password: string, callback?: (error: Error, pwDerivedKey: Uint8Array) => void): Uint8Array; - public isDerivedKeyCorrect(pwDerivedKey: Uint8Array): boolean; - public generateNewAddress(pwDerivedKey: Uint8Array, numberOfAddresses: number): void; - public getSeed(pwDerivedKey: Uint8Array): string; - public exportPrivateKey(address: string, pwDerivedKey: Uint8Array): string; - public getAddresses(): string[]; - } -} -- cgit v1.2.3 From b2e32aaf588196b21a453fe7f7e38eb6eb154c22 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Mon, 25 Jun 2018 22:59:24 +0200 Subject: Remove legacy named subprovider --- .../src/subproviders/eth_lightwallet.ts | 100 --------------------- 1 file changed, 100 deletions(-) delete mode 100644 packages/subproviders/src/subproviders/eth_lightwallet.ts (limited to 'packages/subproviders/src') diff --git a/packages/subproviders/src/subproviders/eth_lightwallet.ts b/packages/subproviders/src/subproviders/eth_lightwallet.ts deleted file mode 100644 index 970c5d981..000000000 --- a/packages/subproviders/src/subproviders/eth_lightwallet.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { assert } from '@0xproject/assert'; -import { ECSignatureBuffer } from '@0xproject/types'; -import { addressUtils } from '@0xproject/utils'; -import * as lightwallet from 'eth-lightwallet'; -import EthereumTx = require('ethereumjs-tx'); -import * as _ from 'lodash'; - -import { PartialTxParams, WalletSubproviderErrors } from '../types'; - -import { BaseWalletSubprovider } from './base_wallet_subprovider'; - -/* - * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface. - * This subprovider intercepts all account related RPC requests (e.g message/transaction signing, etc...) and - * re-routes them to [eth-lightwallet](https://github.com/ConsenSys/eth-lightwallet). - */ -export class EthLightwalletSubprovider extends BaseWalletSubprovider { - private _signing: lightwallet.signing; - private _keystore: lightwallet.keystore; - private _pwDerivedKey: Uint8Array; - /** - * Instantiates a EthLightwalletSubprovider - * @param signing The lightwallet module containing signing functions - * @param keystore An instance of the lightwallet keystore - * @param pwDerivedKey The users password derived key - */ - constructor(signing: lightwallet.signing, keystore: lightwallet.keystore, pwDerivedKey: Uint8Array) { - super(); - - this._signing = signing; - this._keystore = keystore; - this._pwDerivedKey = pwDerivedKey; - } - /** - * Retrieve the accounts associated with the eth-lightwallet instance. - * This method is implicitly called when issuing a `eth_accounts` JSON RPC request - * via your providerEngine instance. - * - * @return An array of accounts - */ - public async getAccountsAsync(): Promise { - const accounts = this._keystore.getAddresses(); - return accounts; - } - /** - * Signs a transaction with the account specificed by the `from` field in txParams. - * If you've added this Subprovider to your app's provider, you can simply send - * an `eth_sendTransaction` JSON RPC request, and this method will be called auto-magically. - * If you are not using this via a ProviderEngine instance, you can call it directly. - * @param txParams Parameters of the transaction to sign - * @return Signed transaction hex string - */ - public async signTransactionAsync(txParams: PartialTxParams): Promise { - if (_.isUndefined(txParams.from) || !addressUtils.isAddress(txParams.from)) { - throw new Error(WalletSubproviderErrors.FromAddressMissingOrInvalid); - } - - const tx = new EthereumTx(txParams); - const txHex = tx.serialize().toString('hex'); - let signedTxHex: string = this._signing.signTx( - this._keystore, - this._pwDerivedKey, - txHex, - txParams.from, - this._keystore.hdPathString, - ); - - signedTxHex = `0x${signedTxHex}`; - - return signedTxHex; - } - /** - * Sign a personal Ethereum signed message. The signing account will be the account - * associated with the provided address. - * If you've added the EthLightwalletSubprovider to your app's provider, you can simply send an `eth_sign` - * or `personal_sign` JSON RPC request, and this method will be called auto-magically. - * If you are not using this via a ProviderEngine instance, you can call it directly. - * @param data Hex string message to sign - * @param address Address of the account to sign with - * @return Signature hex string (order: rsv) - */ - public async signPersonalMessageAsync(data: string, address: string): Promise { - if (_.isUndefined(data)) { - throw new Error(WalletSubproviderErrors.DataMissingForSignPersonalMessage); - } - assert.isHexString('data', data); - assert.isETHAddressHex('address', address); - const result: ECSignatureBuffer = await this._signing.signMsgHash( - this._keystore, - this._pwDerivedKey, - data, - address, - this._keystore.hdPathString, - ); - - const signature = this._signing.concatSig(result); - - return signature; - } -} -- cgit v1.2.3 From 31e3b9ff8baac145be3e00eedc6d0ae065474b8d Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Mon, 25 Jun 2018 22:59:41 +0200 Subject: Fix and imprrove ethLightWalletSubprovider --- .../src/subproviders/eth_lightwallet_subprovider.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'packages/subproviders/src') diff --git a/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts index 7507eeb49..a908ab5fc 100644 --- a/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts +++ b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts @@ -15,14 +15,12 @@ import { BaseWalletSubprovider } from './base_wallet_subprovider'; * Source: https://github.com/MetaMask/provider-engine/blob/master/subproviders/subprovider.js */ export class EthLightwalletSubprovider extends BaseWalletSubprovider { - private _signing: any; - private _keystore: any; + private _keystore: lightwallet.keystore; private _pwDerivedKey: Uint8Array; - constructor(signing: lightwallet.signing, keystore: lightwallet.keystore, pwDerivedKey: Uint8Array) { + constructor(keystore: lightwallet.keystore, pwDerivedKey: Uint8Array) { super(); - this._signing = signing; this._keystore = keystore; this._pwDerivedKey = pwDerivedKey; } @@ -54,8 +52,7 @@ export class EthLightwalletSubprovider extends BaseWalletSubprovider { const tx = new EthereumTx(txParams); const txHex = tx.serialize().toString('hex'); - let signedTxHex: string = this._signing.signTx( - this._keystore, this._pwDerivedKey, txHex, txParams.from, this._keystore.hdPathString); + let signedTxHex: string = lightwallet.signing.signTx(this._keystore, this._pwDerivedKey, txHex, txParams.from); signedTxHex = `0x${signedTxHex}`; @@ -78,10 +75,14 @@ export class EthLightwalletSubprovider extends BaseWalletSubprovider { } assert.isHexString('data', data); assert.isETHAddressHex('address', address); - const result: ECSignatureBuffer = await this._signing.signMsgHash( - this._keystore, this._pwDerivedKey, data, address, this._keystore.hdPathString); + const result: ECSignatureBuffer = lightwallet.signing.signMsgHash( + this._keystore, + this._pwDerivedKey, + data, + address, + ); - const signature = this._signing.concatSig(result); + const signature = lightwallet.signing.concatSig(result); return signature; } -- cgit v1.2.3 From 6bb2203f790923a83f6f0665d47d29a90817b371 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Mon, 25 Jun 2018 23:07:27 +0200 Subject: Small stylistic tweaks --- .../subproviders/src/subproviders/eth_lightwallet_subprovider.ts | 6 ------ 1 file changed, 6 deletions(-) (limited to 'packages/subproviders/src') diff --git a/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts index a908ab5fc..64d984996 100644 --- a/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts +++ b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts @@ -17,14 +17,11 @@ import { BaseWalletSubprovider } from './base_wallet_subprovider'; export class EthLightwalletSubprovider extends BaseWalletSubprovider { private _keystore: lightwallet.keystore; private _pwDerivedKey: Uint8Array; - constructor(keystore: lightwallet.keystore, pwDerivedKey: Uint8Array) { super(); - this._keystore = keystore; this._pwDerivedKey = pwDerivedKey; } - /** * Retrieve the accounts associated with the eth-lightwallet instance. * This method is implicitly called when issuing a `eth_accounts` JSON RPC request @@ -36,7 +33,6 @@ export class EthLightwalletSubprovider extends BaseWalletSubprovider { const accounts = this._keystore.getAddresses(); return accounts; } - /** * Signs a transaction with the account specificed by the `from` field in txParams. * If you've added this Subprovider to your app's provider, you can simply send @@ -58,7 +54,6 @@ export class EthLightwalletSubprovider extends BaseWalletSubprovider { return signedTxHex; } - /** * Sign a personal Ethereum signed message. The signing account will be the account * associated with the provided address. @@ -83,7 +78,6 @@ export class EthLightwalletSubprovider extends BaseWalletSubprovider { ); const signature = lightwallet.signing.concatSig(result); - return signature; } } -- cgit v1.2.3 From b9165c03af40983d885af2b18e729f11746de91d Mon Sep 17 00:00:00 2001 From: Jacob Evans Date: Mon, 2 Jul 2018 11:07:51 +1000 Subject: Use PrivateKeySubprovider inside eth lightwallet There's a loss of information when hex encoding and passing to eth light wallet (chain id is lost). This results in a different signature. While it may work on testnets it is not sufficient for our test cases. We can export the private key and use it in our PrivateKeyWalletSubprovider --- .../subproviders/eth_lightwallet_subprovider.ts | 40 ++++++++-------------- 1 file changed, 15 insertions(+), 25 deletions(-) (limited to 'packages/subproviders/src') diff --git a/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts index 64d984996..b594ffb24 100644 --- a/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts +++ b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts @@ -2,11 +2,13 @@ import { assert } from '@0xproject/assert'; import { addressUtils } from '@0xproject/utils'; import * as lightwallet from 'eth-lightwallet'; import EthereumTx = require('ethereumjs-tx'); +import * as ethUtil from 'ethereumjs-util'; import * as _ from 'lodash'; import { PartialTxParams, WalletSubproviderErrors } from '../types'; import { BaseWalletSubprovider } from './base_wallet_subprovider'; +import { PrivateKeyWalletSubprovider } from './private_key_wallet'; /* * This class implements the web3-provider-engine subprovider interface and forwards @@ -42,17 +44,14 @@ export class EthLightwalletSubprovider extends BaseWalletSubprovider { * @return Signed transaction hex string */ public async signTransactionAsync(txParams: PartialTxParams): Promise { - if (_.isUndefined(txParams.from) || !addressUtils.isAddress(txParams.from)) { - throw new Error(WalletSubproviderErrors.FromAddressMissingOrInvalid); - } - - const tx = new EthereumTx(txParams); - const txHex = tx.serialize().toString('hex'); - let signedTxHex: string = lightwallet.signing.signTx(this._keystore, this._pwDerivedKey, txHex, txParams.from); - - signedTxHex = `0x${signedTxHex}`; - - return signedTxHex; + // Lightwallet loses the chain id information when hex encoding the transaction + // this results in a different signature on certain networks. PrivateKeyWallet + // respects this as it uses the parameters passed in + let privKey = this._keystore.exportPrivateKey(txParams.from, this._pwDerivedKey); + const privKeyWallet = new PrivateKeyWalletSubprovider(privKey); + const privKeySignature = await privKeyWallet.signTransactionAsync(txParams); + privKey = ''; + return privKeySignature; } /** * Sign a personal Ethereum signed message. The signing account will be the account @@ -65,19 +64,10 @@ export class EthLightwalletSubprovider extends BaseWalletSubprovider { * @return Signature hex string (order: rsv) */ public async signPersonalMessageAsync(data: string, address: string): Promise { - if (_.isUndefined(data)) { - throw new Error(WalletSubproviderErrors.DataMissingForSignPersonalMessage); - } - assert.isHexString('data', data); - assert.isETHAddressHex('address', address); - const result: ECSignatureBuffer = lightwallet.signing.signMsgHash( - this._keystore, - this._pwDerivedKey, - data, - address, - ); - - const signature = lightwallet.signing.concatSig(result); - return signature; + let privKey = this._keystore.exportPrivateKey(address, this._pwDerivedKey); + const privKeyWallet = new PrivateKeyWalletSubprovider(privKey); + privKey = ''; + const result = privKeyWallet.signPersonalMessageAsync(data, address); + return result; } } -- cgit v1.2.3 From 687802394a6959ca5058ae1a4445d513d04062c6 Mon Sep 17 00:00:00 2001 From: Jacob Evans Date: Mon, 2 Jul 2018 18:09:05 +1000 Subject: Remove duplicate type definitions. Clear private key earlier Fix changelog in typescript-typings from bad merge --- packages/subproviders/src/globals.d.ts | 58 ---------------------- .../subproviders/eth_lightwallet_subprovider.ts | 2 +- 2 files changed, 1 insertion(+), 59 deletions(-) (limited to 'packages/subproviders/src') diff --git a/packages/subproviders/src/globals.d.ts b/packages/subproviders/src/globals.d.ts index 287d5e0fe..94e63a32d 100644 --- a/packages/subproviders/src/globals.d.ts +++ b/packages/subproviders/src/globals.d.ts @@ -1,61 +1,3 @@ -// tslint:disable:max-classes-per-file -// tslint:disable:class-name -// tslint:disable:async-suffix -// tslint:disable:completed-docs - -// Ethereumjs-tx declarations - -// Ledgerco declarations -interface ECSignatureString { - v: string; - r: string; - s: string; -} -interface ECSignature { - v: number; - r: string; - s: string; -} -interface ECSignatureBuffer { - v: number; - r: Buffer; - s: Buffer; -} - -interface LedgerTransport { - close(): Promise; -} - -declare module '@ledgerhq/hw-app-eth' { - class Eth { - public transport: LedgerTransport; - constructor(transport: LedgerTransport); - public getAddress( - path: string, - boolDisplay?: boolean, - boolChaincode?: boolean, - ): Promise<{ publicKey: string; address: string; chainCode: string }>; - public signTransaction(path: string, rawTxHex: string): Promise; - public getAppConfiguration(): Promise<{ arbitraryDataEnabled: number; version: string }>; - public signPersonalMessage(path: string, messageHex: string): Promise; - } - export default Eth; -} - -declare module '@ledgerhq/hw-transport-u2f' { - export default class TransportU2F implements LedgerTransport { - public static create(): Promise; - public close(): Promise; - } -} - -declare module '@ledgerhq/hw-transport-node-hid' { - export default class TransportNodeHid implements LedgerTransport { - public static create(): Promise; - public close(): Promise; - } -} - declare module '*.json' { const json: any; /* tslint:disable */ diff --git a/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts index b594ffb24..3cd94dac3 100644 --- a/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts +++ b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts @@ -49,8 +49,8 @@ export class EthLightwalletSubprovider extends BaseWalletSubprovider { // respects this as it uses the parameters passed in let privKey = this._keystore.exportPrivateKey(txParams.from, this._pwDerivedKey); const privKeyWallet = new PrivateKeyWalletSubprovider(privKey); - const privKeySignature = await privKeyWallet.signTransactionAsync(txParams); privKey = ''; + const privKeySignature = await privKeyWallet.signTransactionAsync(txParams); return privKeySignature; } /** -- cgit v1.2.3 From 27c03cffe2c1fe7f6c70cab286594840ef37d6e2 Mon Sep 17 00:00:00 2001 From: Jacob Evans Date: Tue, 3 Jul 2018 17:01:08 +1000 Subject: Fix unused imports --- .../subproviders/src/subproviders/eth_lightwallet_subprovider.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'packages/subproviders/src') diff --git a/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts index 3cd94dac3..a9ebbb790 100644 --- a/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts +++ b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts @@ -1,11 +1,6 @@ -import { assert } from '@0xproject/assert'; -import { addressUtils } from '@0xproject/utils'; import * as lightwallet from 'eth-lightwallet'; -import EthereumTx = require('ethereumjs-tx'); -import * as ethUtil from 'ethereumjs-util'; -import * as _ from 'lodash'; -import { PartialTxParams, WalletSubproviderErrors } from '../types'; +import { PartialTxParams } from '../types'; import { BaseWalletSubprovider } from './base_wallet_subprovider'; import { PrivateKeyWalletSubprovider } from './private_key_wallet'; -- cgit v1.2.3