diff options
author | Cavan <cavan@radarrelay.com> | 2018-06-07 23:42:50 +0800 |
---|---|---|
committer | Fabio Berger <me@fabioberger.com> | 2018-06-26 00:42:13 +0800 |
commit | bb4c748bf1e93d1f2c98514c574ba67678b0ed59 (patch) | |
tree | 7dd84ea5a86b42f8a08bc65be513220cc3e58122 /packages/subproviders/src | |
parent | f8bde5ab9b8e5d4ec8b9532dfbf18d1202dbfb29 (diff) | |
download | dexon-sol-tools-bb4c748bf1e93d1f2c98514c574ba67678b0ed59.tar dexon-sol-tools-bb4c748bf1e93d1f2c98514c574ba67678b0ed59.tar.gz dexon-sol-tools-bb4c748bf1e93d1f2c98514c574ba67678b0ed59.tar.bz2 dexon-sol-tools-bb4c748bf1e93d1f2c98514c574ba67678b0ed59.tar.lz dexon-sol-tools-bb4c748bf1e93d1f2c98514c574ba67678b0ed59.tar.xz dexon-sol-tools-bb4c748bf1e93d1f2c98514c574ba67678b0ed59.tar.zst dexon-sol-tools-bb4c748bf1e93d1f2c98514c574ba67678b0ed59.zip |
Formatting and standards updates
Diffstat (limited to 'packages/subproviders/src')
-rw-r--r-- | packages/subproviders/src/index.ts | 1 | ||||
-rw-r--r-- | packages/subproviders/src/subproviders/eth_lightwallet.ts | 88 |
2 files changed, 89 insertions, 0 deletions
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<string[]> { + 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<string> { + 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<string> { + 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; + } +} |