aboutsummaryrefslogtreecommitdiffstats
path: root/packages/subproviders/src
diff options
context:
space:
mode:
authorJacob Evans <dekz@dekz.net>2018-07-04 18:49:25 +0800
committerGitHub <noreply@github.com>2018-07-04 18:49:25 +0800
commitade620f4f7d9ac1e5726681aefcbddf742915a84 (patch)
tree2d973f3b39d19247855a6320cc48858f0011df40 /packages/subproviders/src
parentaeea3817a48473aec0eb378b0ad6cbe7e7877044 (diff)
parent5915f8430c252a341cac9c5ef645836efd4d7e92 (diff)
downloaddexon-sol-tools-ade620f4f7d9ac1e5726681aefcbddf742915a84.tar
dexon-sol-tools-ade620f4f7d9ac1e5726681aefcbddf742915a84.tar.gz
dexon-sol-tools-ade620f4f7d9ac1e5726681aefcbddf742915a84.tar.bz2
dexon-sol-tools-ade620f4f7d9ac1e5726681aefcbddf742915a84.tar.lz
dexon-sol-tools-ade620f4f7d9ac1e5726681aefcbddf742915a84.tar.xz
dexon-sol-tools-ade620f4f7d9ac1e5726681aefcbddf742915a84.tar.zst
dexon-sol-tools-ade620f4f7d9ac1e5726681aefcbddf742915a84.zip
Merge pull request #775 from RadarRelay/eth-lightwallet-subprovider-final
Eth lightwallet subprovider (replaces #660)
Diffstat (limited to 'packages/subproviders/src')
-rw-r--r--packages/subproviders/src/globals.d.ts5
-rw-r--r--packages/subproviders/src/index.ts1
-rw-r--r--packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts68
3 files changed, 69 insertions, 5 deletions
diff --git a/packages/subproviders/src/globals.d.ts b/packages/subproviders/src/globals.d.ts
index c00dc4099..94e63a32d 100644
--- a/packages/subproviders/src/globals.d.ts
+++ b/packages/subproviders/src/globals.d.ts
@@ -1,8 +1,3 @@
-// tslint:disable:max-classes-per-file
-// tslint:disable:class-name
-// tslint:disable:async-suffix
-// tslint:disable:completed-docs
-
declare module '*.json' {
const json: any;
/* tslint:disable */
diff --git a/packages/subproviders/src/index.ts b/packages/subproviders/src/index.ts
index 9194c1341..802a27cb1 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_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..a9ebbb790
--- /dev/null
+++ b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts
@@ -0,0 +1,68 @@
+import * as lightwallet from 'eth-lightwallet';
+
+import { PartialTxParams } 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
+ * 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 _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
+ * 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> {
+ // 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);
+ privKey = '';
+ const privKeySignature = await privKeyWallet.signTransactionAsync(txParams);
+ return privKeySignature;
+ }
+ /**
+ * 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<string> {
+ let privKey = this._keystore.exportPrivateKey(address, this._pwDerivedKey);
+ const privKeyWallet = new PrivateKeyWalletSubprovider(privKey);
+ privKey = '';
+ const result = privKeyWallet.signPersonalMessageAsync(data, address);
+ return result;
+ }
+}