diff options
Diffstat (limited to 'packages/subproviders/src/subproviders/base_wallet_subprovider.ts')
-rw-r--r-- | packages/subproviders/src/subproviders/base_wallet_subprovider.ts | 151 |
1 files changed, 0 insertions, 151 deletions
diff --git a/packages/subproviders/src/subproviders/base_wallet_subprovider.ts b/packages/subproviders/src/subproviders/base_wallet_subprovider.ts deleted file mode 100644 index e9d104074..000000000 --- a/packages/subproviders/src/subproviders/base_wallet_subprovider.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { assert } from '@0x/assert'; -import { addressUtils } from '@0x/utils'; -import { JSONRPCRequestPayload, JSONRPCResponsePayload } from 'ethereum-types'; -import * as _ from 'lodash'; - -import { Callback, ErrorCallback, PartialTxParams, WalletSubproviderErrors } from '../types'; - -import { Subprovider } from './subprovider'; - -export abstract class BaseWalletSubprovider extends Subprovider { - protected static _validateTxParams(txParams: PartialTxParams): void { - if (!_.isUndefined(txParams.to)) { - assert.isETHAddressHex('to', txParams.to); - } - assert.isHexString('nonce', txParams.nonce); - } - private static _validateSender(sender: string): void { - if (_.isUndefined(sender) || !addressUtils.isAddress(sender)) { - throw new Error(WalletSubproviderErrors.SenderInvalidOrNotSupplied); - } - } - - public abstract async getAccountsAsync(): Promise<string[]>; - public abstract async signTransactionAsync(txParams: PartialTxParams): Promise<string>; - public abstract async signPersonalMessageAsync(data: string, address: string): Promise<string>; - public abstract async signTypedDataAsync(address: string, typedData: any): Promise<string>; - - /** - * This method conforms to the web3-provider-engine interface. - * It is called internally by the ProviderEngine when it is this subproviders - * turn to handle a JSON RPC request. - * @param payload JSON RPC payload - * @param next Callback to call if this subprovider decides not to handle the request - * @param end Callback to call if subprovider handled the request and wants to pass back the request. - */ - // tslint:disable-next-line:async-suffix - public async handleRequest(payload: JSONRPCRequestPayload, next: Callback, end: ErrorCallback): Promise<void> { - let accounts; - let txParams; - let address; - let typedData; - switch (payload.method) { - case 'eth_coinbase': - try { - accounts = await this.getAccountsAsync(); - end(null, accounts[0]); - } catch (err) { - end(err); - } - return; - - case 'eth_accounts': - try { - accounts = await this.getAccountsAsync(); - end(null, accounts); - } catch (err) { - end(err); - } - return; - - case 'eth_sendTransaction': - txParams = payload.params[0]; - try { - BaseWalletSubprovider._validateSender(txParams.from); - const filledParams = await this._populateMissingTxParamsAsync(txParams); - const signedTx = await this.signTransactionAsync(filledParams); - const response = await this._emitSendTransactionAsync(signedTx); - end(null, response.result); - } catch (err) { - end(err); - } - return; - - case 'eth_signTransaction': - txParams = payload.params[0]; - try { - const filledParams = await this._populateMissingTxParamsAsync(txParams); - const signedTx = await this.signTransactionAsync(filledParams); - const result = { - raw: signedTx, - tx: txParams, - }; - end(null, result); - } catch (err) { - end(err); - } - return; - - case 'eth_sign': - case 'personal_sign': - const data = payload.method === 'eth_sign' ? payload.params[1] : payload.params[0]; - address = payload.method === 'eth_sign' ? payload.params[0] : payload.params[1]; - try { - const ecSignatureHex = await this.signPersonalMessageAsync(data, address); - end(null, ecSignatureHex); - } catch (err) { - end(err); - } - return; - case 'eth_signTypedData': - [address, typedData] = payload.params; - try { - const signature = await this.signTypedDataAsync(address, typedData); - end(null, signature); - } catch (err) { - end(err); - } - return; - - default: - next(); - return; - } - } - private async _emitSendTransactionAsync(signedTx: string): Promise<JSONRPCResponsePayload> { - const payload = { - method: 'eth_sendRawTransaction', - params: [signedTx], - }; - const result = await this.emitPayloadAsync(payload); - return result; - } - private async _populateMissingTxParamsAsync(partialTxParams: PartialTxParams): Promise<PartialTxParams> { - let txParams = partialTxParams; - if (_.isUndefined(partialTxParams.gasPrice)) { - const gasPriceResult = await this.emitPayloadAsync({ - method: 'eth_gasPrice', - params: [], - }); - const gasPrice = gasPriceResult.result.toString(); - txParams = { ...txParams, gasPrice }; - } - if (_.isUndefined(partialTxParams.nonce)) { - const nonceResult = await this.emitPayloadAsync({ - method: 'eth_getTransactionCount', - params: [partialTxParams.from, 'pending'], - }); - const nonce = nonceResult.result; - txParams = { ...txParams, nonce }; - } - if (_.isUndefined(partialTxParams.gas)) { - const gasResult = await this.emitPayloadAsync({ - method: 'eth_estimateGas', - params: [partialTxParams], - }); - const gas = gasResult.result.toString(); - txParams = { ...txParams, gas }; - } - return txParams; - } -} |