From 250d97a7c4eacceb8d6be0b23a640e22cec5a43c Mon Sep 17 00:00:00 2001 From: Brandon Millman Date: Tue, 3 Apr 2018 11:12:55 -0700 Subject: [PATCH 01/12] Implement initial relayer grid --- packages/website/ts/components/portal.tsx | 19 ++- .../website/ts/components/portal_menu.tsx | 26 ++-- .../relayer_index/relayer_grid_tile.tsx | 84 +++++++++++++ .../relayer_index/relayer_index.tsx | 118 ++++++++++++++++++ .../relayer_index/relayer_top_tokens.tsx | 46 +++++++ .../website/ts/components/wallet/wallet.tsx | 4 +- packages/website/ts/types.ts | 8 ++ 7 files changed, 294 insertions(+), 11 deletions(-) create mode 100644 packages/website/ts/components/relayer_index/relayer_grid_tile.tsx create mode 100644 packages/website/ts/components/relayer_index/relayer_index.tsx create mode 100644 packages/website/ts/components/relayer_index/relayer_top_tokens.tsx diff --git a/packages/website/ts/components/portal.tsx b/packages/website/ts/components/portal.tsx index ceb0ecc72a..b79f5e288c 100644 --- a/packages/website/ts/components/portal.tsx +++ b/packages/website/ts/components/portal.tsx @@ -15,6 +15,7 @@ import { EthWrappers } from 'ts/components/eth_wrappers'; import { FillOrder } from 'ts/components/fill_order'; import { Footer } from 'ts/components/footer'; import { PortalMenu } from 'ts/components/portal_menu'; +import { RelayerIndex } from 'ts/components/relayer_index/relayer_index'; import { TokenBalances } from 'ts/components/token_balances'; import { TopBar } from 'ts/components/top_bar/top_bar'; import { TradeHistory } from 'ts/components/trade_history/trade_history'; @@ -155,6 +156,7 @@ export class Portal extends React.Component { const updateShouldBlockchainErrDialogBeOpen = this.props.dispatcher.updateShouldBlockchainErrDialogBeOpen.bind( this.props.dispatcher, ); + const isDevelopment = configs.ENVIRONMENT === Environments.DEVELOPMENT; const portalStyle: React.CSSProperties = { minHeight: '100vh', display: 'flex', @@ -204,12 +206,18 @@ export class Portal extends React.Component {
{this.props.blockchainIsLoaded ? ( - {configs.ENVIRONMENT === Environments.DEVELOPMENT && ( + {isDevelopment && ( )} + {isDevelopment && ( + + )} {
); } + private _renderRelayers() { + return ( +
+
+ +
+
+ ); + } private _renderEthWrapper() { return ( {configs.ENVIRONMENT === Environments.DEVELOPMENT && ( - - {this._renderMenuItemWithIcon('Wallet', 'zmdi-balance-wallet')} - +
+ + {this._renderMenuItemWithIcon('Wallet', 'zmdi-balance-wallet')} + + + {this._renderMenuItemWithIcon('Relayers', 'zmdi-input-antenna')} + +
)} ); diff --git a/packages/website/ts/components/relayer_index/relayer_grid_tile.tsx b/packages/website/ts/components/relayer_index/relayer_grid_tile.tsx new file mode 100644 index 0000000000..530576828c --- /dev/null +++ b/packages/website/ts/components/relayer_index/relayer_grid_tile.tsx @@ -0,0 +1,84 @@ +import { colors, Styles } from '@0xproject/react-shared'; +import * as _ from 'lodash'; +import { GridTile } from 'material-ui/GridList'; +import * as React from 'react'; + +import { TopTokens } from 'ts/components/relayer_index/relayer_top_tokens'; +import { TokenIcon } from 'ts/components/ui/token_icon'; +import { RelayerInfo, Token } from 'ts/types'; + +export interface RelayerGridTileProps { + relayerInfo: RelayerInfo; + networkId: number; +} + +const styles: Styles = { + root: { + backgroundColor: colors.white, + borderBottomRightRadius: 10, + borderBottomLeftRadius: 10, + borderTopRightRadius: 10, + borderTopLeftRadius: 10, + boxShadow: `0px 4px 6px ${colors.walletBoxShadow}`, + overflow: 'hidden', + boxSizing: 'border-box', + }, + innerDiv: { + padding: 6, + height: '100%', + boxSizing: 'border-box', + }, + header: { + height: '50%', + width: '100%', + objectFit: 'cover', + borderBottomRightRadius: 4, + borderBottomLeftRadius: 4, + borderTopRightRadius: 4, + borderTopLeftRadius: 4, + }, + body: { + paddingLeft: 6, + paddingRight: 6, + height: '50%', + width: '100%', + boxSizing: 'border-box', + }, + marketShareBar: { + height: 14, + width: '100%', + backgroundColor: colors.mediumBlue, + }, + subLabel: { + fontSize: 12, + color: colors.lightGrey, + }, + relayerNameLabel: { + fontSize: 16, + fontWeight: 'bold', + color: colors.black, + }, +}; + +export const RelayerGridTile: React.StatelessComponent = (props: RelayerGridTileProps) => { + return ( + +
+ +
+
+ {props.relayerInfo.name} +
+
+
+ Market share +
+ +
+ Top tokens +
+
+
+ + ); +}; diff --git a/packages/website/ts/components/relayer_index/relayer_index.tsx b/packages/website/ts/components/relayer_index/relayer_index.tsx new file mode 100644 index 0000000000..db3cf07b51 --- /dev/null +++ b/packages/website/ts/components/relayer_index/relayer_index.tsx @@ -0,0 +1,118 @@ +import { colors, Styles } from '@0xproject/react-shared'; +import { GridList } from 'material-ui/GridList'; +import * as React from 'react'; + +import { RelayerGridTile } from 'ts/components/relayer_index/relayer_grid_tile'; +import { RelayerInfo } from 'ts/types'; + +export interface RelayerIndexProps { + networkId: number; +} + +const styles: Styles = { + root: { + width: '100%', + }, + item: { + backgroundColor: colors.white, + borderBottomRightRadius: 10, + borderBottomLeftRadius: 10, + borderTopRightRadius: 10, + borderTopLeftRadius: 10, + boxShadow: `0px 4px 6px ${colors.walletBoxShadow}`, + overflow: 'hidden', + padding: 4, + }, +}; + +// TODO: replace fake data with real, remote data +const topTokens = [ + { + address: '0x1dad4783cf3fe3085c1426157ab175a6119a04ba', + decimals: 18, + iconUrl: '/images/token_icons/makerdao.png', + isRegistered: true, + isTracked: true, + name: 'Maker DAO', + symbol: 'MKR', + }, + { + address: '0x323b5d4c32345ced77393b3530b1eed0f346429d', + decimals: 18, + iconUrl: '/images/token_icons/melon.png', + isRegistered: true, + isTracked: true, + name: 'Melon Token', + symbol: 'MLN', + }, + { + address: '0xb18845c260f680d5b9d84649638813e342e4f8c9', + decimals: 18, + iconUrl: '/images/token_icons/augur.png', + isRegistered: true, + isTracked: true, + name: 'Augur Reputation Token', + symbol: 'REP', + }, +]; + +const relayerInfos: RelayerInfo[] = [ + { + id: '1', + headerUrl: '/images/og_image.png', + name: 'Radar Relay', + marketShare: 0.5, + topTokens, + }, + { + id: '2', + headerUrl: '/images/og_image.png', + name: 'Paradex', + marketShare: 0.5, + topTokens, + }, + { + id: '3', + headerUrl: '/images/og_image.png', + name: 'yo', + marketShare: 0.5, + topTokens, + }, + { + id: '4', + headerUrl: '/images/og_image.png', + name: 'test', + marketShare: 0.5, + topTokens, + }, + { + id: '5', + headerUrl: '/images/og_image.png', + name: 'blahg', + marketShare: 0.5, + topTokens, + }, + { + id: '6', + headerUrl: '/images/og_image.png', + name: 'hello', + marketShare: 0.5, + topTokens, + }, +]; + +const CELL_HEIGHT = 260; +const NUMBER_OF_COLUMNS = 4; +const GRID_PADDING = 16; + +export const RelayerIndex: React.StatelessComponent = (props: RelayerIndexProps) => { + return ( +
+ + {relayerInfos.map((relayerInfo: RelayerInfo) => ( + + ))} + +
+ ); +}; diff --git a/packages/website/ts/components/relayer_index/relayer_top_tokens.tsx b/packages/website/ts/components/relayer_index/relayer_top_tokens.tsx new file mode 100644 index 0000000000..233590b784 --- /dev/null +++ b/packages/website/ts/components/relayer_index/relayer_top_tokens.tsx @@ -0,0 +1,46 @@ +import { colors, EtherscanLinkSuffixes, Styles, utils as sharedUtils } from '@0xproject/react-shared'; +import * as _ from 'lodash'; +import * as React from 'react'; + +import { TokenIcon } from 'ts/components/ui/token_icon'; +import { Token } from 'ts/types'; + +export interface TopTokensProps { + tokens: Token[]; + networkId: number; +} + +const styles: Styles = { + tokenLabel: { + textDecoration: 'none', + color: colors.mediumBlue, + }, + followingTokenLabel: { + paddingLeft: 16, + }, +}; + +export const TopTokens: React.StatelessComponent = (props: TopTokensProps) => { + return ( +
+ {_.map(props.tokens, (token: Token, index: number) => { + const firstItemStyle = { ...styles.tokenLabel, ...styles.followingTokenLabel }; + const style = index !== 0 ? firstItemStyle : styles.tokenLabel; + return ( + + {token.symbol} + + ); + })} +
+ ); +}; + +function tokenLinkFromToken(token: Token, networkId: number) { + return sharedUtils.getEtherScanLinkIfExists(token.address, networkId, EtherscanLinkSuffixes.Address); +} diff --git a/packages/website/ts/components/wallet/wallet.tsx b/packages/website/ts/components/wallet/wallet.tsx index 39c95d31cf..8bda279253 100644 --- a/packages/website/ts/components/wallet/wallet.tsx +++ b/packages/website/ts/components/wallet/wallet.tsx @@ -71,7 +71,7 @@ interface AccessoryItemConfig { } const styles: Styles = { - wallet: { + root: { width: 346, backgroundColor: colors.white, borderBottomRightRadius: 10, @@ -174,7 +174,7 @@ export class Wallet extends React.Component { } public render() { const isReadyToRender = this.props.blockchainIsLoaded && this.props.blockchainErr === BlockchainErrs.NoError; - return
{isReadyToRender && this._renderRows()}
; + return
{isReadyToRender && this._renderRows()}
; } private _renderRows() { const isAddressAvailable = !_.isEmpty(this.props.userAddress); diff --git a/packages/website/ts/types.ts b/packages/website/ts/types.ts index 901483327c..dba59f7044 100644 --- a/packages/website/ts/types.ts +++ b/packages/website/ts/types.ts @@ -490,4 +490,12 @@ export interface TokenState { allowance: BigNumber; isLoaded: boolean; } + +export interface RelayerInfo { + headerUrl: string; + id: string; + name: string; + marketShare: number; + topTokens: Token[]; +} // tslint:disable:max-file-line-count From cbe61ac315ba214090b85b9e0ce848fb01075c07 Mon Sep 17 00:00:00 2001 From: Brandon Millman Date: Wed, 4 Apr 2018 13:35:08 -0700 Subject: [PATCH 02/12] Fix missing key warnings in wallet component --- packages/website/ts/components/wallet/wallet.tsx | 13 ++++++++++--- .../ts/components/wallet/wrap_ether_item.tsx | 6 ++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/website/ts/components/wallet/wallet.tsx b/packages/website/ts/components/wallet/wallet.tsx index 39c95d31cf..64e8bb53fc 100644 --- a/packages/website/ts/components/wallet/wallet.tsx +++ b/packages/website/ts/components/wallet/wallet.tsx @@ -121,6 +121,10 @@ const ZRX_TOKEN_SYMBOL = 'ZRX'; const ETHER_SYMBOL = 'ETH'; const ICON_DIMENSION = 24; const TOKEN_AMOUNT_DISPLAY_PRECISION = 3; +const HEADER_ITEM_KEY = 'HEADER'; +const FOOTER_ITEM_KEY = 'FOOTER'; +const DISCONNECTED_ITEM_KEY = 'DISCONNECTED'; +const ETHER_ITEM_KEY = 'ETHER'; export class Wallet extends React.Component { private _isUnmounted: boolean; @@ -196,6 +200,7 @@ export class Wallet extends React.Component { const primaryText = 'wallet'; return ( } style={styles.paddedItem} @@ -206,6 +211,7 @@ export class Wallet extends React.Component { private _renderDisconnectedRows() { return ( { const primaryText = utils.getAddressBeginAndEnd(userAddress); return ( } style={{ ...styles.paddedItem, ...styles.borderedItem }} @@ -226,7 +233,7 @@ export class Wallet extends React.Component { } private _renderFooterRows() { const primaryText = '+ other tokens'; - return ; + return ; } private _renderEthRows() { const primaryText = this._renderAmount( @@ -245,7 +252,7 @@ export class Wallet extends React.Component { : { ...styles.tokenItem, ...styles.borderedItem, ...styles.paddedItem }; const etherToken = this._getEthToken(); return ( -
+
} @@ -304,7 +311,7 @@ export class Wallet extends React.Component { : { ...styles.tokenItem, ...styles.borderedItem, ...styles.paddedItem }; const etherToken = this._getEthToken(); return ( -
+
); @@ -123,10 +123,12 @@ export class WrapEtherItem extends React.Component
+ ) : ( + undefined ); } private _renderWrapEtherConfirmationButton() { From d76bc18bb7ccaa18f31df6e48722502e21610bdf Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 5 Apr 2018 09:57:21 +0900 Subject: [PATCH 03/12] Improve contributing section of all packages so they include building entire monorepo on first contribution --- packages/0x.js/README.md | 70 +++++++++++++++++++++++++-- packages/abi-gen/README.md | 58 ++++++++++++++++++++++ packages/assert/README.md | 32 ++++++++++-- packages/connect/README.md | 32 ++++++++++-- packages/contracts/README.md | 16 +++++- packages/deployer/README.md | 28 +++++++++-- packages/dev-utils/README.md | 64 ++++++++++++++++++++++++ packages/json-schemas/README.md | 28 +++++++++-- packages/monorepo-scripts/README.md | 28 +++++++++-- packages/react-docs-example/README.md | 22 ++++++++- packages/react-docs/README.md | 32 ++++++++++-- packages/react-shared/README.md | 38 +++++++++++---- packages/sol-cov/README.md | 44 +++++++++++++++-- packages/sra-report/README.md | 32 ++++++++++-- packages/subproviders/README.md | 24 +++++++-- packages/testnet-faucets/README.md | 52 ++++++++++++++++---- packages/tslint-config/README.md | 28 +++++++++-- packages/types/README.md | 30 ++++++++++-- packages/typescript-typings/README.md | 38 +++++++++++++-- packages/utils/README.md | 28 +++++++++-- packages/web3-wrapper/README.md | 28 +++++++++-- packages/website/README.md | 16 +++--- 22 files changed, 684 insertions(+), 84 deletions(-) diff --git a/packages/0x.js/README.md b/packages/0x.js/README.md index 5b17dac8b8..f37fb04549 100644 --- a/packages/0x.js/README.md +++ b/packages/0x.js/README.md @@ -1,5 +1,9 @@ ## 0x.js +A TypeScript/Javascript library for interacting with the 0x protocol. + +### Read the [Documentation](0xproject.com/docs/0xjs). + ## Installation 0x.js ships as both a [UMD](https://github.com/umdjs/umd) module and a [CommonJS](https://en.wikipedia.org/wiki/CommonJS) package. @@ -38,10 +42,66 @@ Download the UMD module from our [releases page](https://github.com/0xProject/0x ``` -## Documentation +## Contributing -Extensive documentation of 0x.js can be found on [our website][docs-url]. +We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. -[website-url]: https://0xproject.com/ -[whitepaper-url]: https://0xproject.com/pdfs/0x_white_paper.pdf -[docs-url]: https://0xproject.com/docs/0xjs +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. + +### Install dependencies + +If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: + +```bash +yarn config set workspaces-experimental true +``` + +Then install dependencies + +```bash +yarn install +``` + +### Build + +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + +```bash +yarn build +``` + +or continuously rebuild on change: + +```bash +yarn build:watch +``` + +### Clean + +```bash +yarn clean +``` + +### Lint + +```bash +yarn lint +``` + +### Run Tests + +```bash +yarn test +``` diff --git a/packages/abi-gen/README.md b/packages/abi-gen/README.md index 899b4845e4..e193c6fccb 100644 --- a/packages/abi-gen/README.md +++ b/packages/abi-gen/README.md @@ -57,3 +57,61 @@ See the [type definition](https://github.com/0xProject/0x-monorepo/tree/developm ## Output files Output files will be generated within an output folder with names converted to camel case and taken from abi file names. If you already have some files in that folder they will be overwritten. + +## Contributing + +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. + +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. + +### Install dependencies + +If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: + +```bash +yarn config set workspaces-experimental true +``` + +Then install dependencies + +```bash +yarn install +``` + +### Build + +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + +```bash +yarn build +``` + +or continuously rebuild on change: + +```bash +yarn build:watch +``` + +### Clean + +```bash +yarn clean +``` + +### Lint + +```bash +yarn lint +``` diff --git a/packages/assert/README.md b/packages/assert/README.md index 7f80e7e5da..cbf78ad531 100644 --- a/packages/assert/README.md +++ b/packages/assert/README.md @@ -26,11 +26,11 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol ## Contributing -We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: @@ -46,10 +46,36 @@ yarn install ### Build +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + ```bash yarn build ``` +or continuously rebuild on change: + +```bash +yarn build:watch +``` + +### Clean + +```bash +yarn clean +``` + ### Lint ```bash diff --git a/packages/connect/README.md b/packages/connect/README.md index 7087214d67..02d166d618 100644 --- a/packages/connect/README.md +++ b/packages/connect/README.md @@ -23,11 +23,11 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol ## Contributing -We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: @@ -43,10 +43,36 @@ yarn install ### Build +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + ```bash yarn build ``` +or continuously rebuild on change: + +```bash +yarn build:watch +``` + +### Clean + +```bash +yarn clean +``` + ### Lint ```bash diff --git a/packages/contracts/README.md b/packages/contracts/README.md index 7628b057b7..286ef019cf 100644 --- a/packages/contracts/README.md +++ b/packages/contracts/README.md @@ -34,11 +34,25 @@ yarn install ### Build +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + ```bash yarn build ``` -or +or continuously rebuild on change: ```bash yarn build:watch diff --git a/packages/deployer/README.md b/packages/deployer/README.md index 812e8c31b8..22848bddeb 100644 --- a/packages/deployer/README.md +++ b/packages/deployer/README.md @@ -41,11 +41,11 @@ var Compiler = require('@0xproject/deployer').Compiler; ## Contributing -We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: @@ -61,16 +61,36 @@ yarn install ### Build +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + ```bash yarn build ``` -or +or continuously rebuild on change: ```bash yarn build:watch ``` +### Clean + +```bash +yarn clean +``` + ### Lint ```bash diff --git a/packages/dev-utils/README.md b/packages/dev-utils/README.md index d7e580d9f4..ce03a740e9 100644 --- a/packages/dev-utils/README.md +++ b/packages/dev-utils/README.md @@ -26,3 +26,67 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol "typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"], } ``` + +## Contributing + +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. + +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. + +### Install dependencies + +If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: + +```bash +yarn config set workspaces-experimental true +``` + +Then install dependencies + +```bash +yarn install +``` + +### Build + +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + +```bash +yarn build +``` + +or continuously rebuild on change: + +```bash +yarn build:watch +``` + +### Clean + +```bash +yarn clean +``` + +### Lint + +```bash +yarn lint +``` + +### Run Tests + +```bash +yarn test +``` diff --git a/packages/json-schemas/README.md b/packages/json-schemas/README.md index 980d174163..fa9da3b775 100644 --- a/packages/json-schemas/README.md +++ b/packages/json-schemas/README.md @@ -32,11 +32,11 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol ## Contributing -We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: @@ -52,16 +52,36 @@ yarn install ### Build +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + ```bash yarn build ``` -or +or continuously rebuild on change: ```bash yarn build:watch ``` +### Clean + +```bash +yarn clean +``` + ### Lint ```bash diff --git a/packages/monorepo-scripts/README.md b/packages/monorepo-scripts/README.md index dbdfdf1353..4f4f13b212 100644 --- a/packages/monorepo-scripts/README.md +++ b/packages/monorepo-scripts/README.md @@ -16,11 +16,11 @@ This will list out any dependencies that differ in versions between packages. ## Contributing -We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: @@ -36,11 +36,25 @@ yarn install ### Build +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + ```bash yarn build ``` -or +or continuously rebuild on change: ```bash yarn build:watch @@ -57,3 +71,9 @@ yarn clean ```bash yarn lint ``` + +### Run Tests + +```bash +yarn test +``` diff --git a/packages/react-docs-example/README.md b/packages/react-docs-example/README.md index 7b2547b20d..7eeade9600 100644 --- a/packages/react-docs-example/README.md +++ b/packages/react-docs-example/README.md @@ -20,10 +20,22 @@ Then install dependencies yarn install ``` -#### Start the dev server +### Initial setup + +The **first** time you work with this package, you must build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: ```bash -yarn dev +yarn lerna:rebuild +``` + +Note: If you move this package out of the monorepo, it will work without this step. Make sure you copy it out on the `master` branch since the `development` version might rely on not-yet published changes to other packages. + +### Run dev server + +The the `react-docs-example` root directory, run: + +```bash +yarn run dev ``` ### Deploy Example to S3 bucket @@ -42,6 +54,12 @@ yarn deploy_example yarn build ``` +### Clean + +```bash +yarn clean +``` + ### Lint ```bash diff --git a/packages/react-docs/README.md b/packages/react-docs/README.md index 9be370f10c..479a24cc32 100644 --- a/packages/react-docs/README.md +++ b/packages/react-docs/README.md @@ -51,11 +51,11 @@ Feel free to contribute to these improvements! ## Contributing -We strongly encourage the community to help us make improvements. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: @@ -71,10 +71,36 @@ yarn install ### Build +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + ```bash yarn build ``` +or continuously rebuild on change: + +```bash +yarn build:watch +``` + +### Clean + +```bash +yarn clean +``` + ### Lint ```bash diff --git a/packages/react-shared/README.md b/packages/react-shared/README.md index 9165cf78de..ad32a41a21 100644 --- a/packages/react-shared/README.md +++ b/packages/react-shared/README.md @@ -18,11 +18,11 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol ## Contributing -We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: @@ -38,18 +38,38 @@ yarn install ### Build +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + ```bash yarn build ``` +or continuously rebuild on change: + +```bash +yarn build:watch +``` + +### Clean + +```bash +yarn clean +``` + ### Lint ```bash yarn lint ``` - -### Run Tests - -```bash -yarn test -``` diff --git a/packages/sol-cov/README.md b/packages/sol-cov/README.md index 5591b9731e..130db039e9 100644 --- a/packages/sol-cov/README.md +++ b/packages/sol-cov/README.md @@ -24,11 +24,11 @@ var CoverageSubprovider = require('@0xproject/sol-cov').CoverageSubprovider; ## Contributing -We strongly encourage the community to help us make improvements. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: @@ -42,8 +42,46 @@ Then install dependencies yarn install ``` +### Build + +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + +```bash +yarn build +``` + +or continuously rebuild on change: + +```bash +yarn build:watch +``` + +### Clean + +```bash +yarn clean +``` + ### Lint ```bash yarn lint ``` + +### Run Tests + +```bash +yarn test +``` diff --git a/packages/sra-report/README.md b/packages/sra-report/README.md index 299d575d81..48d56a09bd 100644 --- a/packages/sra-report/README.md +++ b/packages/sra-report/README.md @@ -87,11 +87,11 @@ In order to provide a custom environment to the tool, perform the following step ## Contributing -We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: @@ -107,10 +107,36 @@ yarn install ### Build +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + ```bash yarn build ``` +or continuously rebuild on change: + +```bash +yarn build:watch +``` + +### Clean + +```bash +yarn clean +``` + ### Lint ```bash diff --git a/packages/subproviders/README.md b/packages/subproviders/README.md index ac92b89d24..60fd41fc65 100644 --- a/packages/subproviders/README.md +++ b/packages/subproviders/README.md @@ -22,11 +22,11 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol ## Contributing -We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: @@ -34,17 +34,33 @@ If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: yarn config set workspaces-experimental true ``` +Then install dependencies + ```bash yarn install ``` ### Build +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + ```bash yarn build ``` -or +or continuously rebuild on change: ```bash yarn build:watch diff --git a/packages/testnet-faucets/README.md b/packages/testnet-faucets/README.md index 2f6ae347f6..0ae1667a36 100644 --- a/packages/testnet-faucets/README.md +++ b/packages/testnet-faucets/README.md @@ -4,15 +4,15 @@ This faucet dispenses 0.1 test ether to one recipient per second and 0.1 test ZR ## Installation -This is a private package and therefore is not published to npm. In order to build and run this package locally, see the [Install Dependencies](#Install-Dependencies) section and onwards below. +This is a private package and therefore is not published to npm. In order to build and run this package locally, see the contributing instructions below. ## Contributing -We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: @@ -26,6 +26,44 @@ Then install dependencies yarn install ``` +### Build + +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + +```bash +yarn build +``` + +or continuously rebuild on change: + +```bash +yarn build:watch +``` + +### Clean + +```bash +yarn clean +``` + +### Lint + +```bash +yarn lint +``` + ### Start Set the following environment variables: @@ -125,9 +163,3 @@ docker run -d \ -e INFURA_API_KEY=$INFURA_API_KEY \ testnet-faucets ``` - -### Lint - -```bash -yarn lint -``` diff --git a/packages/tslint-config/README.md b/packages/tslint-config/README.md index b517f2d956..e9aa5025c3 100644 --- a/packages/tslint-config/README.md +++ b/packages/tslint-config/README.md @@ -20,11 +20,11 @@ Add the following to your `tslint.json` file ## Contributing -We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: @@ -40,16 +40,36 @@ yarn install ### Build +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + ```bash yarn build ``` -or +or continuously rebuild on change: ```bash yarn build:watch ``` +### Clean + +```bash +yarn clean +``` + ### Lint ```bash diff --git a/packages/types/README.md b/packages/types/README.md index b971eaee7f..b51cf3f3a0 100644 --- a/packages/types/README.md +++ b/packages/types/README.md @@ -24,13 +24,13 @@ import { TransactionReceipt, TxData, TxDataPayable } from '@0xproject/types'; ## Contributing -We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies -If you don't have yarn workspaces e`nabled (Yarn < v1.0) - enable them: +If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: ```bash yarn config set workspaces-experimental true @@ -44,16 +44,36 @@ yarn install ### Build +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + ```bash yarn build ``` -or +or continuously rebuild on change: ```bash yarn build:watch ``` +### Clean + +```bash +yarn clean +``` + ### Lint ```bash diff --git a/packages/typescript-typings/README.md b/packages/typescript-typings/README.md index 9a74739f39..5586137bee 100644 --- a/packages/typescript-typings/README.md +++ b/packages/typescript-typings/README.md @@ -20,11 +20,11 @@ This will allow the TS compiler to first look into that repo and then fallback t ## Contributing -We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: @@ -38,6 +38,38 @@ Then install dependencies yarn install ``` +### Build + +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + +```bash +yarn build +``` + +or continuously rebuild on change: + +```bash +yarn build:watch +``` + +### Clean + +```bash +yarn clean +``` + ### Lint ```bash diff --git a/packages/utils/README.md b/packages/utils/README.md index fde0780a9b..acda45c230 100644 --- a/packages/utils/README.md +++ b/packages/utils/README.md @@ -24,11 +24,11 @@ import { addressUtils, bigNumberConfigs, classUtils, intervalUtils, promisify } ## Contributing -We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: @@ -44,16 +44,36 @@ yarn install ### Build +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + ```bash yarn build ``` -or +or continuously rebuild on change: ```bash yarn build:watch ``` +### Clean + +```bash +yarn clean +``` + ### Lint ```bash diff --git a/packages/web3-wrapper/README.md b/packages/web3-wrapper/README.md index e7491acb0f..10cbb6a7ef 100644 --- a/packages/web3-wrapper/README.md +++ b/packages/web3-wrapper/README.md @@ -20,11 +20,11 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol ## Contributing -We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. +We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. -### Install Dependencies +### Install dependencies If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: @@ -40,16 +40,36 @@ yarn install ### Build +If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + +Or continuously rebuild on change: + +```bash +yarn dev +``` + +You can also build this specific package by running the following from within its directory: + ```bash yarn build ``` -or +or continuously rebuild on change: ```bash yarn build:watch ``` +### Clean + +```bash +yarn clean +``` + ### Lint ```bash diff --git a/packages/website/README.md b/packages/website/README.md index 042df52de5..0e23b02dfc 100644 --- a/packages/website/README.md +++ b/packages/website/README.md @@ -28,20 +28,24 @@ Add the following to your `/etc/hosts` file: yarn install ``` +### Initial setup + +The **first** time you work with this package, you must build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory: + +```bash +yarn lerna:rebuild +``` + ### Run dev server +The the `website` root directory, run: + ```bash yarn run dev ``` Visit [0xproject.localhost:3572](http://0xproject.localhost:3572) in your browser. -### Build - -```bash -yarn build -``` - ### Clean ```bash From 29d38593d6313412fb820f2311bb9accb66e6684 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 5 Apr 2018 10:01:41 +0900 Subject: [PATCH 04/12] Fix contributing links --- packages/0x.js/README.md | 2 +- packages/abi-gen/README.md | 2 +- packages/assert/README.md | 2 +- packages/connect/README.md | 2 +- packages/deployer/README.md | 2 +- packages/dev-utils/README.md | 2 +- packages/json-schemas/README.md | 2 +- packages/monorepo-scripts/README.md | 2 +- packages/react-docs-example/README.md | 2 +- packages/react-docs/README.md | 2 +- packages/react-shared/README.md | 2 +- packages/sol-cov/README.md | 2 +- packages/sra-report/README.md | 2 +- packages/subproviders/README.md | 2 +- packages/testnet-faucets/README.md | 2 +- packages/tslint-config/README.md | 2 +- packages/types/README.md | 2 +- packages/typescript-typings/README.md | 2 +- packages/utils/README.md | 2 +- packages/web3-wrapper/README.md | 2 +- packages/website/README.md | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/0x.js/README.md b/packages/0x.js/README.md index f37fb04549..46848cbdd3 100644 --- a/packages/0x.js/README.md +++ b/packages/0x.js/README.md @@ -46,7 +46,7 @@ Download the UMD module from our [releases page](https://github.com/0xProject/0x We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/abi-gen/README.md b/packages/abi-gen/README.md index e193c6fccb..301bd709f5 100644 --- a/packages/abi-gen/README.md +++ b/packages/abi-gen/README.md @@ -62,7 +62,7 @@ Output files will be generated within an output folder with names converted to c We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/assert/README.md b/packages/assert/README.md index cbf78ad531..598fee613b 100644 --- a/packages/assert/README.md +++ b/packages/assert/README.md @@ -28,7 +28,7 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/connect/README.md b/packages/connect/README.md index 02d166d618..a57fefa598 100644 --- a/packages/connect/README.md +++ b/packages/connect/README.md @@ -25,7 +25,7 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/deployer/README.md b/packages/deployer/README.md index 22848bddeb..d8b049bdfe 100644 --- a/packages/deployer/README.md +++ b/packages/deployer/README.md @@ -43,7 +43,7 @@ var Compiler = require('@0xproject/deployer').Compiler; We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/dev-utils/README.md b/packages/dev-utils/README.md index ce03a740e9..2b183f1c78 100644 --- a/packages/dev-utils/README.md +++ b/packages/dev-utils/README.md @@ -31,7 +31,7 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/json-schemas/README.md b/packages/json-schemas/README.md index fa9da3b775..e8cece63b2 100644 --- a/packages/json-schemas/README.md +++ b/packages/json-schemas/README.md @@ -34,7 +34,7 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/monorepo-scripts/README.md b/packages/monorepo-scripts/README.md index 4f4f13b212..a740ba28a3 100644 --- a/packages/monorepo-scripts/README.md +++ b/packages/monorepo-scripts/README.md @@ -18,7 +18,7 @@ This will list out any dependencies that differ in versions between packages. We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/react-docs-example/README.md b/packages/react-docs-example/README.md index 7eeade9600..ff821dba83 100644 --- a/packages/react-docs-example/README.md +++ b/packages/react-docs-example/README.md @@ -35,7 +35,7 @@ Note: If you move this package out of the monorepo, it will work without this st The the `react-docs-example` root directory, run: ```bash -yarn run dev +yarn dev ``` ### Deploy Example to S3 bucket diff --git a/packages/react-docs/README.md b/packages/react-docs/README.md index 479a24cc32..5a46b84f06 100644 --- a/packages/react-docs/README.md +++ b/packages/react-docs/README.md @@ -53,7 +53,7 @@ Feel free to contribute to these improvements! We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/react-shared/README.md b/packages/react-shared/README.md index ad32a41a21..0b4188180c 100644 --- a/packages/react-shared/README.md +++ b/packages/react-shared/README.md @@ -20,7 +20,7 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/sol-cov/README.md b/packages/sol-cov/README.md index 130db039e9..8cc7dca6c3 100644 --- a/packages/sol-cov/README.md +++ b/packages/sol-cov/README.md @@ -26,7 +26,7 @@ var CoverageSubprovider = require('@0xproject/sol-cov').CoverageSubprovider; We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/sra-report/README.md b/packages/sra-report/README.md index 48d56a09bd..806ac3bf48 100644 --- a/packages/sra-report/README.md +++ b/packages/sra-report/README.md @@ -89,7 +89,7 @@ In order to provide a custom environment to the tool, perform the following step We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/subproviders/README.md b/packages/subproviders/README.md index 60fd41fc65..2936be545c 100644 --- a/packages/subproviders/README.md +++ b/packages/subproviders/README.md @@ -24,7 +24,7 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/testnet-faucets/README.md b/packages/testnet-faucets/README.md index 0ae1667a36..93f97e1b7a 100644 --- a/packages/testnet-faucets/README.md +++ b/packages/testnet-faucets/README.md @@ -10,7 +10,7 @@ This is a private package and therefore is not published to npm. In order to bui We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/tslint-config/README.md b/packages/tslint-config/README.md index e9aa5025c3..d90b3cf738 100644 --- a/packages/tslint-config/README.md +++ b/packages/tslint-config/README.md @@ -22,7 +22,7 @@ Add the following to your `tslint.json` file We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/types/README.md b/packages/types/README.md index b51cf3f3a0..665701ea4f 100644 --- a/packages/types/README.md +++ b/packages/types/README.md @@ -26,7 +26,7 @@ import { TransactionReceipt, TxData, TxDataPayable } from '@0xproject/types'; We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/typescript-typings/README.md b/packages/typescript-typings/README.md index 5586137bee..968b2e87cc 100644 --- a/packages/typescript-typings/README.md +++ b/packages/typescript-typings/README.md @@ -22,7 +22,7 @@ This will allow the TS compiler to first look into that repo and then fallback t We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/utils/README.md b/packages/utils/README.md index acda45c230..914404937d 100644 --- a/packages/utils/README.md +++ b/packages/utils/README.md @@ -26,7 +26,7 @@ import { addressUtils, bigNumberConfigs, classUtils, intervalUtils, promisify } We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/web3-wrapper/README.md b/packages/web3-wrapper/README.md index 10cbb6a7ef..1ff85420a8 100644 --- a/packages/web3-wrapper/README.md +++ b/packages/web3-wrapper/README.md @@ -22,7 +22,7 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository. -Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started. +Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. ### Install dependencies diff --git a/packages/website/README.md b/packages/website/README.md index 0e23b02dfc..d93d189358 100644 --- a/packages/website/README.md +++ b/packages/website/README.md @@ -41,7 +41,7 @@ yarn lerna:rebuild The the `website` root directory, run: ```bash -yarn run dev +yarn dev ``` Visit [0xproject.localhost:3572](http://0xproject.localhost:3572) in your browser. From 9745dfe2f4f15f0c23c150f3b375ff9ed2ace063 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 5 Apr 2018 11:43:48 +0900 Subject: [PATCH 05/12] Use depcheck async support --- .../monorepo-scripts/src/find_unused_dependencies.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/packages/monorepo-scripts/src/find_unused_dependencies.ts b/packages/monorepo-scripts/src/find_unused_dependencies.ts index 374cba2e3b..fa6088a7d0 100644 --- a/packages/monorepo-scripts/src/find_unused_dependencies.ts +++ b/packages/monorepo-scripts/src/find_unused_dependencies.ts @@ -1,6 +1,6 @@ #!/usr/bin/env node -import * as depcheck from 'depcheck'; +import * as depcheckAsync from 'depcheck'; import * as fs from 'fs'; import lernaGetPackages = require('lerna-get-packages'); import * as _ from 'lodash'; @@ -35,11 +35,3 @@ const IGNORE_PACKAGES = ['@0xproject/deployer']; utils.log(err); process.exit(1); }); - -async function depcheckAsync(path: string, opts: any): Promise { - return new Promise((resolve, reject) => { - depcheck(path, opts, (unused: any) => { - resolve(unused); - }); - }); -} From 9d18f751c8822910391e55c29fc2b1912a1ee108 Mon Sep 17 00:00:00 2001 From: Jacob Evans Date: Thu, 5 Apr 2018 15:01:56 +1000 Subject: [PATCH 06/12] Create a private key subprovider --- packages/subproviders/CHANGELOG.json | 10 + packages/subproviders/src/index.ts | 1 + .../subproviders/base_wallet_subprovider.ts | 134 +++++++++++++ .../subproviders/src/subproviders/ledger.ts | 158 +-------------- .../src/subproviders/pk_wallet_subprovider.ts | 68 +++++++ packages/subproviders/src/types.ts | 6 +- .../integration/ledger_subprovider_test.ts | 4 +- .../test/unit/ledger_subprovider_test.ts | 11 +- .../test/unit/pk_wallet_subprovider_test.ts | 188 ++++++++++++++++++ 9 files changed, 424 insertions(+), 156 deletions(-) create mode 100644 packages/subproviders/src/subproviders/base_wallet_subprovider.ts create mode 100644 packages/subproviders/src/subproviders/pk_wallet_subprovider.ts create mode 100644 packages/subproviders/test/unit/pk_wallet_subprovider_test.ts diff --git a/packages/subproviders/CHANGELOG.json b/packages/subproviders/CHANGELOG.json index 54eb323786..0c299e90ae 100644 --- a/packages/subproviders/CHANGELOG.json +++ b/packages/subproviders/CHANGELOG.json @@ -1,4 +1,14 @@ [ + { + "timestamp": 1522904386, + "version": "0.8.5", + "changes": [ + { + "note": "Add Prive Key Subprovider and refactor Provider Engine usage into Base Wallet Subprovider", + "pr": 506 + } + ] + }, { "timestamp": 1522673609, "version": "0.8.4", diff --git a/packages/subproviders/src/index.ts b/packages/subproviders/src/index.ts index 9786347e67..3541ac6f59 100644 --- a/packages/subproviders/src/index.ts +++ b/packages/subproviders/src/index.ts @@ -12,6 +12,7 @@ export { LedgerSubprovider } from './subproviders/ledger'; export { GanacheSubprovider } from './subproviders/ganache'; export { Subprovider } from './subproviders/subprovider'; export { NonceTrackerSubprovider } from './subproviders/nonce_tracker'; +export { PKWalletSubprovider } from './subproviders/pk_wallet_subprovider'; export { Callback, ErrorCallback, diff --git a/packages/subproviders/src/subproviders/base_wallet_subprovider.ts b/packages/subproviders/src/subproviders/base_wallet_subprovider.ts new file mode 100644 index 0000000000..83b0da52fc --- /dev/null +++ b/packages/subproviders/src/subproviders/base_wallet_subprovider.ts @@ -0,0 +1,134 @@ +import { JSONRPCRequestPayload, JSONRPCResponsePayload } from '@0xproject/types'; +import { addressUtils } from '@0xproject/utils'; +import * as _ from 'lodash'; + +import { Callback, PartialTxParams, ResponseWithTxParams, WalletSubproviderErrors } from '../types'; + +import { Subprovider } from './subprovider'; + +export abstract class BaseWalletSubprovider extends Subprovider { + protected static _validateSender(sender: string) { + if (_.isUndefined(sender) || !addressUtils.isAddress(sender)) { + throw new Error(WalletSubproviderErrors.SenderInvalidOrNotSupplied); + } + } + + public abstract async getAccountsAsync(): Promise; + public abstract async signTransactionAsync(txParams: PartialTxParams): Promise; + public abstract async signPersonalMessageAsync(dataIfExists: string): Promise; + + /** + * 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: (err: Error | null, result?: any) => void, + ) { + let accounts; + let txParams; + 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]; + try { + const ecSignatureHex = await this.signPersonalMessageAsync(data); + end(null, ecSignatureHex); + } catch (err) { + end(err); + } + return; + + default: + next(); + return; + } + } + private async _emitSendTransactionAsync(signedTx: string): Promise { + const payload = { + method: 'eth_sendRawTransaction', + params: [signedTx], + }; + const result = await this.emitPayloadAsync(payload); + return result; + } + private async _populateMissingTxParamsAsync(txParams: PartialTxParams): Promise { + if (_.isUndefined(txParams.gasPrice)) { + const gasPriceResult = await this.emitPayloadAsync({ + method: 'eth_gasPrice', + params: [], + }); + const gasPrice = gasPriceResult.result.toString(); + txParams.gasPrice = gasPrice; + } + if (_.isUndefined(txParams.nonce)) { + const nonceResult = await this.emitPayloadAsync({ + method: 'eth_getTransactionCount', + params: [txParams.from, 'pending'], + }); + const nonce = nonceResult.result; + txParams.nonce = nonce; + } + if (_.isUndefined(txParams.gas)) { + const gasResult = await this.emitPayloadAsync({ + method: 'eth_estimateGas', + params: [txParams], + }); + const gas = gasResult.result.toString(); + txParams.gas = gas; + } + return txParams; + } +} diff --git a/packages/subproviders/src/subproviders/ledger.ts b/packages/subproviders/src/subproviders/ledger.ts index 95784a3910..71864f19cb 100644 --- a/packages/subproviders/src/subproviders/ledger.ts +++ b/packages/subproviders/src/subproviders/ledger.ts @@ -15,9 +15,10 @@ import { LedgerSubproviderErrors, PartialTxParams, ResponseWithTxParams, + WalletSubproviderErrors, } from '../types'; -import { Subprovider } from './subprovider'; +import { BaseWalletSubprovider } from './base_wallet_subprovider'; const DEFAULT_DERIVATION_PATH = `44'/60'/0'`; const DEFAULT_NUM_ADDRESSES_TO_FETCH = 10; @@ -29,7 +30,7 @@ const SHOULD_GET_CHAIN_CODE = true; * This subprovider intercepts all account related RPC requests (e.g message/transaction signing, etc...) and * re-routes them to a Ledger device plugged into the users computer. */ -export class LedgerSubprovider extends Subprovider { +export class LedgerSubprovider extends BaseWalletSubprovider { private _nonceLock = new Lock(); private _connectionLock = new Lock(); private _networkId: number; @@ -38,11 +39,6 @@ export class LedgerSubprovider extends Subprovider { private _ledgerEthereumClientFactoryAsync: LedgerEthereumClientFactoryAsync; private _ledgerClientIfExists?: LedgerEthereumClient; private _shouldAlwaysAskForConfirmation: boolean; - private static _validateSender(sender: string) { - if (_.isUndefined(sender) || !addressUtils.isAddress(sender)) { - throw new Error(LedgerSubproviderErrors.SenderInvalidOrNotSupplied); - } - } /** * Instantiates a LedgerSubprovider. Defaults to derivationPath set to `44'/60'/0'`. * TestRPC/Ganache defaults to `m/44'/60'/0'/0`, so set this in the configs if desired. @@ -168,7 +164,7 @@ export class LedgerSubprovider extends Subprovider { } } /** - * Sign a personal Ethereum signed message. The signing address will be to one + * Sign a personal Ethereum signed message. The signing address will be the one * retrieved given a derivationPath and pathIndex set on the subprovider. * The Ledger adds the Ethereum signed message prefix on-device. If you've added * the LedgerSubprovider to your app's provider, you can simply send an `eth_sign` @@ -178,6 +174,10 @@ export class LedgerSubprovider extends Subprovider { * @return Signature hex string (order: rsv) */ public async signPersonalMessageAsync(data: string): Promise { + if (_.isUndefined(data)) { + throw new Error(WalletSubproviderErrors.DataMissingForSignPersonalMessage); + } + assert.isHexString('data', data); this._ledgerClientIfExists = await this._createLedgerClientAsync(); try { const derivationPath = this._getDerivationPath(); @@ -198,82 +198,6 @@ export class LedgerSubprovider extends Subprovider { throw err; } } - /** - * 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: (err: Error | null, result?: any) => void, - ) { - let accounts; - let txParams; - 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 { - LedgerSubprovider._validateSender(txParams.from); - const result = await this._sendTransactionAsync(txParams); - end(null, result); - } catch (err) { - end(err); - } - return; - - case 'eth_signTransaction': - txParams = payload.params[0]; - try { - const result = await this._signTransactionWithoutSendingAsync(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]; - try { - if (_.isUndefined(data)) { - throw new Error(LedgerSubproviderErrors.DataMissingForSignPersonalMessage); - } - assert.isHexString('data', data); - const ecSignatureHex = await this.signPersonalMessageAsync(data); - end(null, ecSignatureHex); - } catch (err) { - end(err); - } - return; - - default: - next(); - return; - } - } private _getDerivationPath() { const derivationPath = `${this.getPath()}/${this._derivationPathIndex}`; return derivationPath; @@ -298,70 +222,4 @@ export class LedgerSubprovider extends Subprovider { this._ledgerClientIfExists = undefined; this._connectionLock.release(); } - private async _sendTransactionAsync(txParams: PartialTxParams): Promise { - await this._nonceLock.acquire(); - try { - // fill in the extras - const filledParams = await this._populateMissingTxParamsAsync(txParams); - // sign it - const signedTx = await this.signTransactionAsync(filledParams); - // emit a submit - const payload = { - method: 'eth_sendRawTransaction', - params: [signedTx], - }; - const result = await this.emitPayloadAsync(payload); - this._nonceLock.release(); - return result.result; - } catch (err) { - this._nonceLock.release(); - throw err; - } - } - private async _signTransactionWithoutSendingAsync(txParams: PartialTxParams): Promise { - await this._nonceLock.acquire(); - try { - // fill in the extras - const filledParams = await this._populateMissingTxParamsAsync(txParams); - // sign it - const signedTx = await this.signTransactionAsync(filledParams); - - this._nonceLock.release(); - const result = { - raw: signedTx, - tx: txParams, - }; - return result; - } catch (err) { - this._nonceLock.release(); - throw err; - } - } - private async _populateMissingTxParamsAsync(txParams: PartialTxParams): Promise { - if (_.isUndefined(txParams.gasPrice)) { - const gasPriceResult = await this.emitPayloadAsync({ - method: 'eth_gasPrice', - params: [], - }); - const gasPrice = gasPriceResult.result.toString(); - txParams.gasPrice = gasPrice; - } - if (_.isUndefined(txParams.nonce)) { - const nonceResult = await this.emitPayloadAsync({ - method: 'eth_getTransactionCount', - params: [txParams.from, 'pending'], - }); - const nonce = nonceResult.result; - txParams.nonce = nonce; - } - if (_.isUndefined(txParams.gas)) { - const gasResult = await this.emitPayloadAsync({ - method: 'eth_estimateGas', - params: [txParams], - }); - const gas = gasResult.result.toString(); - txParams.gas = gas; - } - return txParams; - } } diff --git a/packages/subproviders/src/subproviders/pk_wallet_subprovider.ts b/packages/subproviders/src/subproviders/pk_wallet_subprovider.ts new file mode 100644 index 0000000000..06dc39237e --- /dev/null +++ b/packages/subproviders/src/subproviders/pk_wallet_subprovider.ts @@ -0,0 +1,68 @@ +import { assert } from '@0xproject/assert'; +import { JSONRPCRequestPayload } from '@0xproject/types'; +import EthereumTx = require('ethereumjs-tx'); +import * as ethUtil from 'ethereumjs-util'; +import * as _ from 'lodash'; + +import { Callback, ErrorCallback, PartialTxParams, ResponseWithTxParams, WalletSubproviderErrors } from '../types'; + +import { BaseWalletSubprovider } from './base_wallet_subprovider'; +import { Subprovider } from './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...) + */ +export class PKWalletSubprovider extends BaseWalletSubprovider { + private _address: string; + private _privateKeyBuffer: Buffer; + constructor(privateKey: string) { + super(); + this._privateKeyBuffer = new Buffer(privateKey, 'hex'); + this._address = `0x${ethUtil.privateToAddress(this._privateKeyBuffer).toString('hex')}`; + } + /** + * Retrieve the account calcuated from the private key. + * This method is automatically called when issuing a `eth_accounts` JSON RPC request + * via your providerEngine instance. + * @return An array of accounts + */ + public async getAccountsAsync(): Promise { + return [this._address]; + } + /** + * Sign a transaction with the private key. 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 { + const tx = new EthereumTx(txParams); + tx.sign(this._privateKeyBuffer); + const rawTx = `0x${tx.serialize().toString('hex')}`; + return rawTx; + } + /** + * Sign a personal Ethereum signed message. The signing address will be + * calculated from the private key. + * If you've added the PKWalletSubprovider 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 Message to sign + * @return Signature hex string (order: rsv) + */ + public async signPersonalMessageAsync(dataIfExists: string): Promise { + if (_.isUndefined(dataIfExists)) { + throw new Error(WalletSubproviderErrors.DataMissingForSignPersonalMessage); + } + assert.isHexString('data', dataIfExists); + const dataBuff = ethUtil.toBuffer(dataIfExists); + const msgHashBuff = ethUtil.hashPersonalMessage(dataBuff); + const sig = ethUtil.ecsign(msgHashBuff, this._privateKeyBuffer); + const rpcSig = ethUtil.toRpcSig(sig.v, sig.r, sig.s); + + return rpcSig; + } +} diff --git a/packages/subproviders/src/types.ts b/packages/subproviders/src/types.ts index a1fec1882a..bacb7091b4 100644 --- a/packages/subproviders/src/types.ts +++ b/packages/subproviders/src/types.ts @@ -95,11 +95,13 @@ export interface ResponseWithTxParams { tx: PartialTxParams; } +export enum WalletSubproviderErrors { + DataMissingForSignPersonalMessage = 'DATA_MISSING_FOR_SIGN_PERSONAL_MESSAGE', + SenderInvalidOrNotSupplied = 'SENDER_INVALID_OR_NOT_SUPPLIED', +} export enum LedgerSubproviderErrors { TooOldLedgerFirmware = 'TOO_OLD_LEDGER_FIRMWARE', FromAddressMissingOrInvalid = 'FROM_ADDRESS_MISSING_OR_INVALID', - DataMissingForSignPersonalMessage = 'DATA_MISSING_FOR_SIGN_PERSONAL_MESSAGE', - SenderInvalidOrNotSupplied = 'SENDER_INVALID_OR_NOT_SUPPLIED', MultipleOpenConnectionsDisallowed = 'MULTIPLE_OPEN_CONNECTIONS_DISALLOWED', } diff --git a/packages/subproviders/test/integration/ledger_subprovider_test.ts b/packages/subproviders/test/integration/ledger_subprovider_test.ts index bc60b43303..3039bd560b 100644 --- a/packages/subproviders/test/integration/ledger_subprovider_test.ts +++ b/packages/subproviders/test/integration/ledger_subprovider_test.ts @@ -58,7 +58,9 @@ describe('LedgerSubprovider', () => { const data = ethUtils.bufferToHex(ethUtils.toBuffer('hello world')); const ecSignatureHex = await ledgerSubprovider.signPersonalMessageAsync(data); expect(ecSignatureHex.length).to.be.equal(132); - expect(ecSignatureHex.substr(0, 2)).to.be.equal('0x'); + expect(ecSignatureHex).to.be.equal( + '0x1b0ec5e2908e993d0c8ab6b46da46be2688fdf03c7ea6686075de37392e50a7d7fcc531446699132fbda915bd989882e0064d417018773a315fb8d43ed063c9b00', + ); }); it('signs a transaction', async () => { const tx = { diff --git a/packages/subproviders/test/unit/ledger_subprovider_test.ts b/packages/subproviders/test/unit/ledger_subprovider_test.ts index 3cb487f020..66cb39a489 100644 --- a/packages/subproviders/test/unit/ledger_subprovider_test.ts +++ b/packages/subproviders/test/unit/ledger_subprovider_test.ts @@ -7,7 +7,12 @@ import Web3ProviderEngine = require('web3-provider-engine'); import RpcSubprovider = require('web3-provider-engine/subproviders/rpc'); import { LedgerSubprovider } from '../../src'; -import { DoneCallback, LedgerCommunicationClient, LedgerSubproviderErrors } from '../../src/types'; +import { + DoneCallback, + LedgerCommunicationClient, + LedgerSubproviderErrors, + WalletSubproviderErrors, +} from '../../src/types'; import { chaiSetup } from '../chai_setup'; import { reportCallbackErrors } from '../utils/report_callback_errors'; @@ -222,7 +227,7 @@ describe('LedgerSubprovider', () => { }; const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => { expect(err).to.not.be.a('null'); - expect(err.message).to.be.equal(LedgerSubproviderErrors.SenderInvalidOrNotSupplied); + expect(err.message).to.be.equal(WalletSubproviderErrors.SenderInvalidOrNotSupplied); done(); }); provider.sendAsync(payload, callback); @@ -241,7 +246,7 @@ describe('LedgerSubprovider', () => { }; const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => { expect(err).to.not.be.a('null'); - expect(err.message).to.be.equal(LedgerSubproviderErrors.SenderInvalidOrNotSupplied); + expect(err.message).to.be.equal(WalletSubproviderErrors.SenderInvalidOrNotSupplied); done(); }); provider.sendAsync(payload, callback); diff --git a/packages/subproviders/test/unit/pk_wallet_subprovider_test.ts b/packages/subproviders/test/unit/pk_wallet_subprovider_test.ts new file mode 100644 index 0000000000..6dd96399a8 --- /dev/null +++ b/packages/subproviders/test/unit/pk_wallet_subprovider_test.ts @@ -0,0 +1,188 @@ +import { JSONRPCResponsePayload } from '@0xproject/types'; +import * as chai from 'chai'; +import * as ethUtils from 'ethereumjs-util'; +import * as _ from 'lodash'; +import Web3ProviderEngine = require('web3-provider-engine'); + +import { GanacheSubprovider, PKWalletSubprovider } from '../../src/'; +import { + DoneCallback, + LedgerCommunicationClient, + LedgerSubproviderErrors, + WalletSubproviderErrors, +} from '../../src/types'; +import { chaiSetup } from '../chai_setup'; +import { reportCallbackErrors } from '../utils/report_callback_errors'; + +chaiSetup.configure(); +const expect = chai.expect; +const TEST_RPC_ACCOUNT_0 = '0x5409ed021d9299bf6814279a6a1411a7e866a631'; +const TEST_ACCOUNT_PRIVATE_KEY = 'F2F48EE19680706196E2E339E5DA3491186E0C4C5030670656B0E0164837257D'; + +describe('PKWalletSubprovider', () => { + let subprovider: PKWalletSubprovider; + before(async () => { + subprovider = new PKWalletSubprovider(TEST_ACCOUNT_PRIVATE_KEY); + }); + describe('direct method calls', () => { + describe('success cases', () => { + it('returns the account', async () => { + const accounts = await subprovider.getAccountsAsync(); + expect(accounts[0]).to.be.equal(TEST_RPC_ACCOUNT_0); + expect(accounts.length).to.be.equal(1); + }); + it('signs a personal message', async () => { + const data = ethUtils.bufferToHex(ethUtils.toBuffer('hello world')); + const ecSignatureHex = await subprovider.signPersonalMessageAsync(data); + expect(ecSignatureHex).to.be.equal( + '0x1b0ec5e2908e993d0c8ab6b46da46be2688fdf03c7ea6686075de37392e50a7d7fcc531446699132fbda915bd989882e0064d417018773a315fb8d43ed063c9b00', + ); + }); + it('signs a transaction', async () => { + const tx = { + nonce: '0x00', + gasPrice: '0x0', + gas: '0x2710', + to: '0x0000000000000000000000000000000000000000', + value: '0x00', + chainId: 3, + from: TEST_RPC_ACCOUNT_0, + }; + const txHex = await subprovider.signTransactionAsync(tx); + expect(txHex).to.be.equal( + '0xf85f808082271094000000000000000000000000000000000000000080802aa018894834d89899f71f6d8e74e6992fea34914c3b6d8090495f738086ca18f15da056e3333ec6c7465512a49558a84b56ec358718feaf0b162bda9aa6c40824ede4', + ); + }); + }); + }); + describe('calls through a provider', () => { + let provider: Web3ProviderEngine; + before(() => { + provider = new Web3ProviderEngine(); + provider.addProvider(subprovider); + const ganacheSubprovider = new GanacheSubprovider({}); + provider.addProvider(ganacheSubprovider); + provider.start(); + }); + describe('success cases', () => { + it('returns a list of accounts', (done: DoneCallback) => { + const payload = { + jsonrpc: '2.0', + method: 'eth_accounts', + params: [], + id: 1, + }; + const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => { + expect(err).to.be.a('null'); + expect(response.result[0]).to.be.equal(TEST_RPC_ACCOUNT_0); + expect(response.result.length).to.be.equal(1); + done(); + }); + provider.sendAsync(payload, callback); + }); + it('signs a personal message with eth_sign', (done: DoneCallback) => { + const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer('hello world')); + const payload = { + jsonrpc: '2.0', + method: 'eth_sign', + params: ['0x0000000000000000000000000000000000000000', messageHex], + id: 1, + }; + const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => { + expect(err).to.be.a('null'); + expect(response.result).to.be.equal( + '0x1b0ec5e2908e993d0c8ab6b46da46be2688fdf03c7ea6686075de37392e50a7d7fcc531446699132fbda915bd989882e0064d417018773a315fb8d43ed063c9b00', + ); + done(); + }); + provider.sendAsync(payload, callback); + }); + it('signs a personal message with personal_sign', (done: DoneCallback) => { + const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer('hello world')); + const payload = { + jsonrpc: '2.0', + method: 'personal_sign', + params: [messageHex, '0x0000000000000000000000000000000000000000'], + id: 1, + }; + const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => { + expect(err).to.be.a('null'); + expect(response.result).to.be.equal( + '0x1b0ec5e2908e993d0c8ab6b46da46be2688fdf03c7ea6686075de37392e50a7d7fcc531446699132fbda915bd989882e0064d417018773a315fb8d43ed063c9b00', + ); + done(); + }); + provider.sendAsync(payload, callback); + }); + }); + describe('failure cases', () => { + it('should throw if `data` param not hex when calling eth_sign', (done: DoneCallback) => { + const nonHexMessage = 'hello world'; + const payload = { + jsonrpc: '2.0', + method: 'eth_sign', + params: ['0x0000000000000000000000000000000000000000', nonHexMessage], + id: 1, + }; + const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => { + expect(err).to.not.be.a('null'); + expect(err.message).to.be.equal('Expected data to be of type HexString, encountered: hello world'); + done(); + }); + provider.sendAsync(payload, callback); + }); + it('should throw if `data` param not hex when calling personal_sign', (done: DoneCallback) => { + const nonHexMessage = 'hello world'; + const payload = { + jsonrpc: '2.0', + method: 'personal_sign', + params: [nonHexMessage, '0x0000000000000000000000000000000000000000'], + id: 1, + }; + const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => { + expect(err).to.not.be.a('null'); + expect(err.message).to.be.equal('Expected data to be of type HexString, encountered: hello world'); + done(); + }); + provider.sendAsync(payload, callback); + }); + it('should throw if `from` param missing when calling eth_sendTransaction', (done: DoneCallback) => { + const tx = { + to: '0xafa3f8684e54059998bc3a7b0d2b0da075154d66', + value: '0xde0b6b3a7640000', + }; + const payload = { + jsonrpc: '2.0', + method: 'eth_sendTransaction', + params: [tx], + id: 1, + }; + const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => { + expect(err).to.not.be.a('null'); + expect(err.message).to.be.equal(WalletSubproviderErrors.SenderInvalidOrNotSupplied); + done(); + }); + provider.sendAsync(payload, callback); + }); + it('should throw if `from` param invalid address when calling eth_sendTransaction', (done: DoneCallback) => { + const tx = { + to: '0xafa3f8684e54059998bc3a7b0d2b0da075154d66', + from: '0xIncorrectEthereumAddress', + value: '0xde0b6b3a7640000', + }; + const payload = { + jsonrpc: '2.0', + method: 'eth_sendTransaction', + params: [tx], + id: 1, + }; + const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => { + expect(err).to.not.be.a('null'); + expect(err.message).to.be.equal(WalletSubproviderErrors.SenderInvalidOrNotSupplied); + done(); + }); + provider.sendAsync(payload, callback); + }); + }); + }); +}); From ea47613d901cb0e8d9543f37d7f591c91ef986c4 Mon Sep 17 00:00:00 2001 From: Jacob Evans Date: Thu, 5 Apr 2018 15:25:26 +1000 Subject: [PATCH 07/12] Use PKWalletSubprovider in testnet faucet --- packages/testnet-faucets/src/ts/handler.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/testnet-faucets/src/ts/handler.ts b/packages/testnet-faucets/src/ts/handler.ts index f9ac484dec..9c8e592485 100644 --- a/packages/testnet-faucets/src/ts/handler.ts +++ b/packages/testnet-faucets/src/ts/handler.ts @@ -9,7 +9,7 @@ import * as Web3 from 'web3'; // we are not running in a browser env. // Filed issue: https://github.com/ethereum/web3.js/issues/844 (global as any).XMLHttpRequest = undefined; -import { NonceTrackerSubprovider } from '@0xproject/subproviders'; +import { NonceTrackerSubprovider, PKWalletSubprovider } from '@0xproject/subproviders'; import ProviderEngine = require('web3-provider-engine'); import HookedWalletSubprovider = require('web3-provider-engine/subproviders/hooked-wallet'); import RpcSubprovider = require('web3-provider-engine/subproviders/rpc'); @@ -41,9 +41,12 @@ const FIVE_DAYS_IN_MS = 4.32e8; // TODO: make this configurable export class Handler { private _networkConfigByNetworkId: ItemByNetworkId = {}; private static _createProviderEngine(rpcUrl: string) { + if (_.isUndefined(configs.DISPENSER_PRIVATE_KEY)) { + throw new Error('Dispenser Private key not found'); + } const engine = new ProviderEngine(); engine.addProvider(new NonceTrackerSubprovider()); - engine.addProvider(new HookedWalletSubprovider(idManagement)); + engine.addProvider(new PKWalletSubprovider(configs.DISPENSER_PRIVATE_KEY)); engine.addProvider( new RpcSubprovider({ rpcUrl, From c396be42b9365b5f2e6274d0a4e25e3e6e25cdd0 Mon Sep 17 00:00:00 2001 From: Brandon Millman Date: Thu, 5 Apr 2018 12:13:55 -0700 Subject: [PATCH 08/12] Change undefined to null --- packages/website/ts/components/wallet/wrap_ether_item.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/website/ts/components/wallet/wrap_ether_item.tsx b/packages/website/ts/components/wallet/wrap_ether_item.tsx index be394afb9f..a381637708 100644 --- a/packages/website/ts/components/wallet/wrap_ether_item.tsx +++ b/packages/website/ts/components/wallet/wrap_ether_item.tsx @@ -127,9 +127,7 @@ export class WrapEtherItem extends React.Component
- ) : ( - undefined - ); + ) : null; } private _renderWrapEtherConfirmationButton() { const isWrappingEth = this.props.direction === Side.Deposit; From 774ab8a8efa1ff5914896d9435c0362a4586c2ef Mon Sep 17 00:00:00 2001 From: Jacob Evans Date: Fri, 6 Apr 2018 14:55:03 +1000 Subject: [PATCH 09/12] Feedback remove id management from testnet faucet spread over txParams rather than modify in place --- packages/subproviders/CHANGELOG.json | 3 +- packages/subproviders/src/index.ts | 2 +- .../subproviders/base_wallet_subprovider.ts | 37 ++++++++++--------- .../subproviders/src/subproviders/ledger.ts | 1 + ...r.ts => private_key_wallet_subprovider.ts} | 12 +++--- .../integration/ledger_subprovider_test.ts | 18 ++++----- ...=> private_key_wallet_subprovider_test.ts} | 35 +++++++----------- .../subproviders/test/utils/fixture_data.ts | 8 ++++ packages/testnet-faucets/src/ts/handler.ts | 6 +-- .../testnet-faucets/src/ts/id_management.ts | 35 ------------------ 10 files changed, 61 insertions(+), 96 deletions(-) rename packages/subproviders/src/subproviders/{pk_wallet_subprovider.ts => private_key_wallet_subprovider.ts} (86%) rename packages/subproviders/test/unit/{pk_wallet_subprovider_test.ts => private_key_wallet_subprovider_test.ts} (84%) create mode 100644 packages/subproviders/test/utils/fixture_data.ts delete mode 100644 packages/testnet-faucets/src/ts/id_management.ts diff --git a/packages/subproviders/CHANGELOG.json b/packages/subproviders/CHANGELOG.json index 0c299e90ae..f0702cd5dd 100644 --- a/packages/subproviders/CHANGELOG.json +++ b/packages/subproviders/CHANGELOG.json @@ -1,10 +1,9 @@ [ { - "timestamp": 1522904386, "version": "0.8.5", "changes": [ { - "note": "Add Prive Key Subprovider and refactor Provider Engine usage into Base Wallet Subprovider", + "note": "Add private key subprovider and refactor shared functionality into a base wallet subprovider", "pr": 506 } ] diff --git a/packages/subproviders/src/index.ts b/packages/subproviders/src/index.ts index 3541ac6f59..dd553fde45 100644 --- a/packages/subproviders/src/index.ts +++ b/packages/subproviders/src/index.ts @@ -12,7 +12,7 @@ export { LedgerSubprovider } from './subproviders/ledger'; export { GanacheSubprovider } from './subproviders/ganache'; export { Subprovider } from './subproviders/subprovider'; export { NonceTrackerSubprovider } from './subproviders/nonce_tracker'; -export { PKWalletSubprovider } from './subproviders/pk_wallet_subprovider'; +export { PrivateKeyWalletSubprovider } from './subproviders/private_key_wallet_subprovider'; export { Callback, ErrorCallback, diff --git a/packages/subproviders/src/subproviders/base_wallet_subprovider.ts b/packages/subproviders/src/subproviders/base_wallet_subprovider.ts index 83b0da52fc..034f83e7fb 100644 --- a/packages/subproviders/src/subproviders/base_wallet_subprovider.ts +++ b/packages/subproviders/src/subproviders/base_wallet_subprovider.ts @@ -1,13 +1,19 @@ +import { assert } from '@0xproject/assert'; import { JSONRPCRequestPayload, JSONRPCResponsePayload } from '@0xproject/types'; import { addressUtils } from '@0xproject/utils'; import * as _ from 'lodash'; -import { Callback, PartialTxParams, ResponseWithTxParams, WalletSubproviderErrors } from '../types'; +import { Callback, ErrorCallback, PartialTxParams, ResponseWithTxParams, WalletSubproviderErrors } from '../types'; import { Subprovider } from './subprovider'; export abstract class BaseWalletSubprovider extends Subprovider { - protected static _validateSender(sender: string) { + protected static _validateTxParams(txParams: PartialTxParams) { + assert.isETHAddressHex('to', txParams.to); + assert.isHexString('nonce', txParams.nonce); + assert.isHexString('gas', txParams.gas); + } + private static _validateSender(sender: string) { if (_.isUndefined(sender) || !addressUtils.isAddress(sender)) { throw new Error(WalletSubproviderErrors.SenderInvalidOrNotSupplied); } @@ -15,7 +21,7 @@ export abstract class BaseWalletSubprovider extends Subprovider { public abstract async getAccountsAsync(): Promise; public abstract async signTransactionAsync(txParams: PartialTxParams): Promise; - public abstract async signPersonalMessageAsync(dataIfExists: string): Promise; + public abstract async signPersonalMessageAsync(data: string): Promise; /** * This method conforms to the web3-provider-engine interface. @@ -26,11 +32,7 @@ export abstract class BaseWalletSubprovider extends Subprovider { * @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: (err: Error | null, result?: any) => void, - ) { + public async handleRequest(payload: JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { let accounts; let txParams; switch (payload.method) { @@ -104,30 +106,31 @@ export abstract class BaseWalletSubprovider extends Subprovider { const result = await this.emitPayloadAsync(payload); return result; } - private async _populateMissingTxParamsAsync(txParams: PartialTxParams): Promise { - if (_.isUndefined(txParams.gasPrice)) { + private async _populateMissingTxParamsAsync(partialTxParams: PartialTxParams): Promise { + let txParams = partialTxParams; + if (_.isUndefined(partialTxParams.gasPrice)) { const gasPriceResult = await this.emitPayloadAsync({ method: 'eth_gasPrice', params: [], }); const gasPrice = gasPriceResult.result.toString(); - txParams.gasPrice = gasPrice; + txParams = { ...txParams, gasPrice }; } - if (_.isUndefined(txParams.nonce)) { + if (_.isUndefined(partialTxParams.nonce)) { const nonceResult = await this.emitPayloadAsync({ method: 'eth_getTransactionCount', - params: [txParams.from, 'pending'], + params: [partialTxParams.from, 'pending'], }); const nonce = nonceResult.result; - txParams.nonce = nonce; + txParams = { ...txParams, nonce }; } - if (_.isUndefined(txParams.gas)) { + if (_.isUndefined(partialTxParams.gas)) { const gasResult = await this.emitPayloadAsync({ method: 'eth_estimateGas', - params: [txParams], + params: [partialTxParams], }); const gas = gasResult.result.toString(); - txParams.gas = gas; + txParams = { ...txParams, gas }; } return txParams; } diff --git a/packages/subproviders/src/subproviders/ledger.ts b/packages/subproviders/src/subproviders/ledger.ts index 71864f19cb..aa86bf6c0a 100644 --- a/packages/subproviders/src/subproviders/ledger.ts +++ b/packages/subproviders/src/subproviders/ledger.ts @@ -129,6 +129,7 @@ export class LedgerSubprovider extends BaseWalletSubprovider { * @return Signed transaction hex string */ public async signTransactionAsync(txParams: PartialTxParams): Promise { + LedgerSubprovider._validateTxParams(txParams); this._ledgerClientIfExists = await this._createLedgerClientAsync(); const tx = new EthereumTx(txParams); diff --git a/packages/subproviders/src/subproviders/pk_wallet_subprovider.ts b/packages/subproviders/src/subproviders/private_key_wallet_subprovider.ts similarity index 86% rename from packages/subproviders/src/subproviders/pk_wallet_subprovider.ts rename to packages/subproviders/src/subproviders/private_key_wallet_subprovider.ts index 06dc39237e..c3a53773ab 100644 --- a/packages/subproviders/src/subproviders/pk_wallet_subprovider.ts +++ b/packages/subproviders/src/subproviders/private_key_wallet_subprovider.ts @@ -11,19 +11,21 @@ import { Subprovider } from './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...) + * This subprovider intercepts all account related RPC requests (e.g message/transaction signing, etc...) and handles + * all requests with the supplied Ethereum private key. */ -export class PKWalletSubprovider extends BaseWalletSubprovider { +export class PrivateKeyWalletSubprovider extends BaseWalletSubprovider { private _address: string; private _privateKeyBuffer: Buffer; constructor(privateKey: string) { + assert.isString('privateKey', privateKey); super(); this._privateKeyBuffer = new Buffer(privateKey, 'hex'); this._address = `0x${ethUtil.privateToAddress(this._privateKeyBuffer).toString('hex')}`; } /** - * Retrieve the account calcuated from the private key. - * This method is automatically called when issuing a `eth_accounts` JSON RPC request + * Retrieve the account associated with the supplied private key. + * This method is implicitly called when issuing a `eth_accounts` JSON RPC request * via your providerEngine instance. * @return An array of accounts */ @@ -39,6 +41,7 @@ export class PKWalletSubprovider extends BaseWalletSubprovider { * @return Signed transaction hex string */ public async signTransactionAsync(txParams: PartialTxParams): Promise { + PrivateKeyWalletSubprovider._validateTxParams(txParams); const tx = new EthereumTx(txParams); tx.sign(this._privateKeyBuffer); const rawTx = `0x${tx.serialize().toString('hex')}`; @@ -62,7 +65,6 @@ export class PKWalletSubprovider extends BaseWalletSubprovider { const msgHashBuff = ethUtil.hashPersonalMessage(dataBuff); const sig = ethUtil.ecsign(msgHashBuff, this._privateKeyBuffer); const rpcSig = ethUtil.toRpcSig(sig.v, sig.r, sig.s); - return rpcSig; } } diff --git a/packages/subproviders/test/integration/ledger_subprovider_test.ts b/packages/subproviders/test/integration/ledger_subprovider_test.ts index 3039bd560b..da858b6b38 100644 --- a/packages/subproviders/test/integration/ledger_subprovider_test.ts +++ b/packages/subproviders/test/integration/ledger_subprovider_test.ts @@ -14,6 +14,7 @@ import RpcSubprovider = require('web3-provider-engine/subproviders/rpc'); import { LedgerSubprovider } from '../../src'; import { DoneCallback, LedgerEthereumClient } from '../../src/types'; import { chaiSetup } from '../chai_setup'; +import { fixtureData } from '../utils/fixture_data'; import { reportCallbackErrors } from '../utils/report_callback_errors'; chaiSetup.configure(); @@ -25,9 +26,6 @@ async function ledgerEthereumNodeJsClientFactoryAsync(): Promise { let ledgerSubprovider: LedgerSubprovider; const networkId: number = 42; @@ -35,7 +33,7 @@ describe('LedgerSubprovider', () => { ledgerSubprovider = new LedgerSubprovider({ networkId, ledgerEthereumClientFactoryAsync: ledgerEthereumNodeJsClientFactoryAsync, - derivationPath: TESTRPC_DERIVATION_PATH, + derivationPath: fixtureData.TESTRPC_DERIVATION_PATH, }); }); describe('direct method calls', () => { @@ -46,7 +44,7 @@ describe('LedgerSubprovider', () => { }); it('returns the expected first account from a ledger set up with the test mnemonic', async () => { const accounts = await ledgerSubprovider.getAccountsAsync(); - expect(accounts[0]).to.be.equal(TEST_RPC_ACCOUNT_0); + expect(accounts[0]).to.be.equal(fixtureData.TEST_RPC_ACCOUNT_0); }); it('returns requested number of accounts', async () => { const numberOfAccounts = 20; @@ -55,12 +53,10 @@ describe('LedgerSubprovider', () => { expect(accounts.length).to.be.equal(numberOfAccounts); }); it('signs a personal message', async () => { - const data = ethUtils.bufferToHex(ethUtils.toBuffer('hello world')); + const data = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING)); const ecSignatureHex = await ledgerSubprovider.signPersonalMessageAsync(data); expect(ecSignatureHex.length).to.be.equal(132); - expect(ecSignatureHex).to.be.equal( - '0x1b0ec5e2908e993d0c8ab6b46da46be2688fdf03c7ea6686075de37392e50a7d7fcc531446699132fbda915bd989882e0064d417018773a315fb8d43ed063c9b00', - ); + expect(ecSignatureHex).to.be.equal(fixtureData.PERSONAL_MESSAGE_SIGNED_RESULT); }); it('signs a transaction', async () => { const tx = { @@ -69,7 +65,7 @@ describe('LedgerSubprovider', () => { to: '0x0000000000000000000000000000000000000000', value: '0x00', chainId: 3, - from: TEST_RPC_ACCOUNT_0, + from: fixtureData.TEST_RPC_ACCOUNT_0, }; const txHex = await ledgerSubprovider.signTransactionAsync(tx); expect(txHex).to.be.equal( @@ -173,7 +169,7 @@ describe('LedgerSubprovider', () => { // Give first account on Ledger sufficient ETH to complete tx send let tx = { to: accounts[0], - from: TEST_RPC_ACCOUNT_0, + from: fixtureData.TEST_RPC_ACCOUNT_0, value: '0x8ac7230489e80000', // 10 ETH }; let payload = { diff --git a/packages/subproviders/test/unit/pk_wallet_subprovider_test.ts b/packages/subproviders/test/unit/private_key_wallet_subprovider_test.ts similarity index 84% rename from packages/subproviders/test/unit/pk_wallet_subprovider_test.ts rename to packages/subproviders/test/unit/private_key_wallet_subprovider_test.ts index 6dd96399a8..32650b3a08 100644 --- a/packages/subproviders/test/unit/pk_wallet_subprovider_test.ts +++ b/packages/subproviders/test/unit/private_key_wallet_subprovider_test.ts @@ -4,7 +4,7 @@ import * as ethUtils from 'ethereumjs-util'; import * as _ from 'lodash'; import Web3ProviderEngine = require('web3-provider-engine'); -import { GanacheSubprovider, PKWalletSubprovider } from '../../src/'; +import { GanacheSubprovider, PrivateKeyWalletSubprovider } from '../../src/'; import { DoneCallback, LedgerCommunicationClient, @@ -12,31 +12,28 @@ import { WalletSubproviderErrors, } from '../../src/types'; import { chaiSetup } from '../chai_setup'; +import { fixtureData } from '../utils/fixture_data'; import { reportCallbackErrors } from '../utils/report_callback_errors'; chaiSetup.configure(); const expect = chai.expect; -const TEST_RPC_ACCOUNT_0 = '0x5409ed021d9299bf6814279a6a1411a7e866a631'; -const TEST_ACCOUNT_PRIVATE_KEY = 'F2F48EE19680706196E2E339E5DA3491186E0C4C5030670656B0E0164837257D'; -describe('PKWalletSubprovider', () => { - let subprovider: PKWalletSubprovider; +describe('PrivateKeyWalletSubprovider', () => { + let subprovider: PrivateKeyWalletSubprovider; before(async () => { - subprovider = new PKWalletSubprovider(TEST_ACCOUNT_PRIVATE_KEY); + subprovider = new PrivateKeyWalletSubprovider(fixtureData.TEST_ACCOUNT_PRIVATE_KEY); }); describe('direct method calls', () => { describe('success cases', () => { it('returns the account', async () => { const accounts = await subprovider.getAccountsAsync(); - expect(accounts[0]).to.be.equal(TEST_RPC_ACCOUNT_0); + expect(accounts[0]).to.be.equal(fixtureData.TEST_RPC_ACCOUNT_0); expect(accounts.length).to.be.equal(1); }); it('signs a personal message', async () => { - const data = ethUtils.bufferToHex(ethUtils.toBuffer('hello world')); + const data = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING)); const ecSignatureHex = await subprovider.signPersonalMessageAsync(data); - expect(ecSignatureHex).to.be.equal( - '0x1b0ec5e2908e993d0c8ab6b46da46be2688fdf03c7ea6686075de37392e50a7d7fcc531446699132fbda915bd989882e0064d417018773a315fb8d43ed063c9b00', - ); + expect(ecSignatureHex).to.be.equal(fixtureData.PERSONAL_MESSAGE_SIGNED_RESULT); }); it('signs a transaction', async () => { const tx = { @@ -46,7 +43,7 @@ describe('PKWalletSubprovider', () => { to: '0x0000000000000000000000000000000000000000', value: '0x00', chainId: 3, - from: TEST_RPC_ACCOUNT_0, + from: fixtureData.TEST_RPC_ACCOUNT_0, }; const txHex = await subprovider.signTransactionAsync(tx); expect(txHex).to.be.equal( @@ -74,14 +71,14 @@ describe('PKWalletSubprovider', () => { }; const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => { expect(err).to.be.a('null'); - expect(response.result[0]).to.be.equal(TEST_RPC_ACCOUNT_0); + expect(response.result[0]).to.be.equal(fixtureData.TEST_RPC_ACCOUNT_0); expect(response.result.length).to.be.equal(1); done(); }); provider.sendAsync(payload, callback); }); it('signs a personal message with eth_sign', (done: DoneCallback) => { - const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer('hello world')); + const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING)); const payload = { jsonrpc: '2.0', method: 'eth_sign', @@ -90,15 +87,13 @@ describe('PKWalletSubprovider', () => { }; const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => { expect(err).to.be.a('null'); - expect(response.result).to.be.equal( - '0x1b0ec5e2908e993d0c8ab6b46da46be2688fdf03c7ea6686075de37392e50a7d7fcc531446699132fbda915bd989882e0064d417018773a315fb8d43ed063c9b00', - ); + expect(response.result).to.be.equal(fixtureData.PERSONAL_MESSAGE_SIGNED_RESULT); done(); }); provider.sendAsync(payload, callback); }); it('signs a personal message with personal_sign', (done: DoneCallback) => { - const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer('hello world')); + const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING)); const payload = { jsonrpc: '2.0', method: 'personal_sign', @@ -107,9 +102,7 @@ describe('PKWalletSubprovider', () => { }; const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => { expect(err).to.be.a('null'); - expect(response.result).to.be.equal( - '0x1b0ec5e2908e993d0c8ab6b46da46be2688fdf03c7ea6686075de37392e50a7d7fcc531446699132fbda915bd989882e0064d417018773a315fb8d43ed063c9b00', - ); + expect(response.result).to.be.equal(fixtureData.PERSONAL_MESSAGE_SIGNED_RESULT); done(); }); provider.sendAsync(payload, callback); diff --git a/packages/subproviders/test/utils/fixture_data.ts b/packages/subproviders/test/utils/fixture_data.ts new file mode 100644 index 0000000000..3b6ab123e5 --- /dev/null +++ b/packages/subproviders/test/utils/fixture_data.ts @@ -0,0 +1,8 @@ +export const fixtureData = { + TEST_RPC_ACCOUNT_0: '0x5409ed021d9299bf6814279a6a1411a7e866a631', + TEST_ACCOUNT_PRIVATE_KEY: 'F2F48EE19680706196E2E339E5DA3491186E0C4C5030670656B0E0164837257D', + PERSONAL_MESSAGE_STRING: 'hello world', + PERSONAL_MESSAGE_SIGNED_RESULT: + '0x1b0ec5e2908e993d0c8ab6b46da46be2688fdf03c7ea6686075de37392e50a7d7fcc531446699132fbda915bd989882e0064d417018773a315fb8d43ed063c9b00', + TESTRPC_DERIVATION_PATH: `m/44'/60'/0'/0`, +}; diff --git a/packages/testnet-faucets/src/ts/handler.ts b/packages/testnet-faucets/src/ts/handler.ts index 9c8e592485..a6e786552c 100644 --- a/packages/testnet-faucets/src/ts/handler.ts +++ b/packages/testnet-faucets/src/ts/handler.ts @@ -9,15 +9,13 @@ import * as Web3 from 'web3'; // we are not running in a browser env. // Filed issue: https://github.com/ethereum/web3.js/issues/844 (global as any).XMLHttpRequest = undefined; -import { NonceTrackerSubprovider, PKWalletSubprovider } from '@0xproject/subproviders'; +import { NonceTrackerSubprovider, PrivateKeyWalletSubprovider } from '@0xproject/subproviders'; import ProviderEngine = require('web3-provider-engine'); -import HookedWalletSubprovider = require('web3-provider-engine/subproviders/hooked-wallet'); import RpcSubprovider = require('web3-provider-engine/subproviders/rpc'); import { configs } from './configs'; import { DispatchQueue } from './dispatch_queue'; import { dispenseAssetTasks } from './dispense_asset_tasks'; -import { idManagement } from './id_management'; import { rpcUrls } from './rpc_urls'; interface NetworkConfig { @@ -46,7 +44,7 @@ export class Handler { } const engine = new ProviderEngine(); engine.addProvider(new NonceTrackerSubprovider()); - engine.addProvider(new PKWalletSubprovider(configs.DISPENSER_PRIVATE_KEY)); + engine.addProvider(new PrivateKeyWalletSubprovider(configs.DISPENSER_PRIVATE_KEY)); engine.addProvider( new RpcSubprovider({ rpcUrl, diff --git a/packages/testnet-faucets/src/ts/id_management.ts b/packages/testnet-faucets/src/ts/id_management.ts deleted file mode 100644 index 7c598f91c4..0000000000 --- a/packages/testnet-faucets/src/ts/id_management.ts +++ /dev/null @@ -1,35 +0,0 @@ -import EthereumTx = require('ethereumjs-tx'); -import * as ethUtil from 'ethereumjs-util'; -import * as _ from 'lodash'; - -import { configs } from './configs'; - -type Callback = (err: Error | null, result: any) => void; - -export const idManagement = { - getAccounts(callback: Callback) { - callback(null, [configs.DISPENSER_ADDRESS]); - }, - approveTransaction(txData: object, callback: Callback) { - callback(null, true); - }, - signTransaction(txData: object, callback: Callback) { - const tx = new EthereumTx(txData); - const privateKeyBuffer = new Buffer(configs.DISPENSER_PRIVATE_KEY as string, 'hex'); - tx.sign(privateKeyBuffer); - const rawTx = `0x${tx.serialize().toString('hex')}`; - callback(null, rawTx); - }, - signMessage(message: object, callback: Callback) { - const dataIfExists = _.get(message, 'data'); - if (_.isUndefined(dataIfExists)) { - callback(new Error('NO_DATA_TO_SIGN'), null); - } - const privateKeyBuffer = new Buffer(configs.DISPENSER_PRIVATE_KEY as string, 'hex'); - const dataBuff = ethUtil.toBuffer(dataIfExists); - const msgHashBuff = ethUtil.hashPersonalMessage(dataBuff); - const sig = ethUtil.ecsign(msgHashBuff, privateKeyBuffer); - const rpcSig = ethUtil.toRpcSig(sig.v, sig.r, sig.s); - callback(null, rpcSig); - }, -}; From a0fac663f72feafbac98c2949578ec48b8d2ec0a Mon Sep 17 00:00:00 2001 From: Jacob Evans Date: Fri, 6 Apr 2018 16:07:00 +1000 Subject: [PATCH 10/12] Update shared fixture data for network 42 --- .../integration/ledger_subprovider_test.ts | 25 ++++--------------- .../test/unit/ledger_subprovider_test.ts | 5 ++-- .../private_key_wallet_subprovider_test.ts | 17 +++---------- .../subproviders/test/utils/fixture_data.ts | 19 ++++++++++++-- 4 files changed, 28 insertions(+), 38 deletions(-) diff --git a/packages/subproviders/test/integration/ledger_subprovider_test.ts b/packages/subproviders/test/integration/ledger_subprovider_test.ts index da858b6b38..503618089d 100644 --- a/packages/subproviders/test/integration/ledger_subprovider_test.ts +++ b/packages/subproviders/test/integration/ledger_subprovider_test.ts @@ -28,7 +28,7 @@ async function ledgerEthereumNodeJsClientFactoryAsync(): Promise { let ledgerSubprovider: LedgerSubprovider; - const networkId: number = 42; + const networkId: number = fixtureData.NETWORK_ID; before(async () => { ledgerSubprovider = new LedgerSubprovider({ networkId, @@ -59,18 +59,8 @@ describe('LedgerSubprovider', () => { expect(ecSignatureHex).to.be.equal(fixtureData.PERSONAL_MESSAGE_SIGNED_RESULT); }); it('signs a transaction', async () => { - const tx = { - nonce: '0x00', - gas: '0x2710', - to: '0x0000000000000000000000000000000000000000', - value: '0x00', - chainId: 3, - from: fixtureData.TEST_RPC_ACCOUNT_0, - }; - const txHex = await ledgerSubprovider.signTransactionAsync(tx); - expect(txHex).to.be.equal( - '0xf85f8080822710940000000000000000000000000000000000000000808078a0712854c73c69445cc1b22a7c3d7312ff9a97fe4ffba35fd636e8236b211b6e7ca0647cee031615e52d916c7c707025bc64ad525d8f1b9876c3435a863b42743178', - ); + const txHex = await ledgerSubprovider.signTransactionAsync(fixtureData.TX_DATA); + expect(txHex).to.be.equal(fixtureData.TX_DATA_SIGNED_RESULT); }); }); describe('calls through a provider', () => { @@ -144,20 +134,15 @@ describe('LedgerSubprovider', () => { })().catch(done); }); it('signs a transaction', (done: DoneCallback) => { - const tx = { - to: '0xafa3f8684e54059998bc3a7b0d2b0da075154d66', - value: '0x00', - }; const payload = { jsonrpc: '2.0', method: 'eth_signTransaction', - params: [tx], + params: [fixtureData.TX_DATA], id: 1, }; const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => { expect(err).to.be.a('null'); - expect(response.result.raw.length).to.be.equal(206); - expect(response.result.raw.substr(0, 2)).to.be.equal('0x'); + expect(response.result.raw).to.be.equal(fixtureData.TX_DATA_SIGNED_RESULT); done(); }); ledgerProvider.sendAsync(payload, callback); diff --git a/packages/subproviders/test/unit/ledger_subprovider_test.ts b/packages/subproviders/test/unit/ledger_subprovider_test.ts index 66cb39a489..c18506681d 100644 --- a/packages/subproviders/test/unit/ledger_subprovider_test.ts +++ b/packages/subproviders/test/unit/ledger_subprovider_test.ts @@ -14,6 +14,7 @@ import { WalletSubproviderErrors, } from '../../src/types'; import { chaiSetup } from '../chai_setup'; +import { fixtureData } from '../utils/fixture_data'; import { reportCallbackErrors } from '../utils/report_callback_errors'; chaiSetup.configure(); @@ -80,7 +81,7 @@ describe('LedgerSubprovider', () => { expect(accounts.length).to.be.equal(numberOfAccounts); }); it('signs a personal message', async () => { - const data = ethUtils.bufferToHex(ethUtils.toBuffer('hello world')); + const data = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING)); const ecSignatureHex = await ledgerSubprovider.signPersonalMessageAsync(data); expect(ecSignatureHex).to.be.equal( '0xa6cc284bff14b42bdf5e9286730c152be91719d478605ec46b3bebcd0ae491480652a1a7b742ceb0213d1e744316e285f41f878d8af0b8e632cbca4c279132d001', @@ -144,7 +145,7 @@ describe('LedgerSubprovider', () => { provider.sendAsync(payload, callback); }); it('signs a personal message with personal_sign', (done: DoneCallback) => { - const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer('hello world')); + const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING)); const payload = { jsonrpc: '2.0', method: 'personal_sign', diff --git a/packages/subproviders/test/unit/private_key_wallet_subprovider_test.ts b/packages/subproviders/test/unit/private_key_wallet_subprovider_test.ts index 32650b3a08..ca06658719 100644 --- a/packages/subproviders/test/unit/private_key_wallet_subprovider_test.ts +++ b/packages/subproviders/test/unit/private_key_wallet_subprovider_test.ts @@ -21,7 +21,7 @@ const expect = chai.expect; describe('PrivateKeyWalletSubprovider', () => { let subprovider: PrivateKeyWalletSubprovider; before(async () => { - subprovider = new PrivateKeyWalletSubprovider(fixtureData.TEST_ACCOUNT_PRIVATE_KEY); + subprovider = new PrivateKeyWalletSubprovider(fixtureData.TEST_RPC_ACCOUNT_0_ACCOUNT_PRIVATE_KEY); }); describe('direct method calls', () => { describe('success cases', () => { @@ -36,19 +36,8 @@ describe('PrivateKeyWalletSubprovider', () => { expect(ecSignatureHex).to.be.equal(fixtureData.PERSONAL_MESSAGE_SIGNED_RESULT); }); it('signs a transaction', async () => { - const tx = { - nonce: '0x00', - gasPrice: '0x0', - gas: '0x2710', - to: '0x0000000000000000000000000000000000000000', - value: '0x00', - chainId: 3, - from: fixtureData.TEST_RPC_ACCOUNT_0, - }; - const txHex = await subprovider.signTransactionAsync(tx); - expect(txHex).to.be.equal( - '0xf85f808082271094000000000000000000000000000000000000000080802aa018894834d89899f71f6d8e74e6992fea34914c3b6d8090495f738086ca18f15da056e3333ec6c7465512a49558a84b56ec358718feaf0b162bda9aa6c40824ede4', - ); + const txHex = await subprovider.signTransactionAsync(fixtureData.TX_DATA); + expect(txHex).to.be.equal(fixtureData.TX_DATA_SIGNED_RESULT); }); }); }); diff --git a/packages/subproviders/test/utils/fixture_data.ts b/packages/subproviders/test/utils/fixture_data.ts index 3b6ab123e5..890573d0d1 100644 --- a/packages/subproviders/test/utils/fixture_data.ts +++ b/packages/subproviders/test/utils/fixture_data.ts @@ -1,8 +1,23 @@ +const TEST_RPC_ACCOUNT_0 = '0x5409ed021d9299bf6814279a6a1411a7e866a631'; +const networkId = 42; export const fixtureData = { - TEST_RPC_ACCOUNT_0: '0x5409ed021d9299bf6814279a6a1411a7e866a631', - TEST_ACCOUNT_PRIVATE_KEY: 'F2F48EE19680706196E2E339E5DA3491186E0C4C5030670656B0E0164837257D', + TEST_RPC_ACCOUNT_0, + TEST_RPC_ACCOUNT_0_ACCOUNT_PRIVATE_KEY: 'F2F48EE19680706196E2E339E5DA3491186E0C4C5030670656B0E0164837257D', PERSONAL_MESSAGE_STRING: 'hello world', PERSONAL_MESSAGE_SIGNED_RESULT: '0x1b0ec5e2908e993d0c8ab6b46da46be2688fdf03c7ea6686075de37392e50a7d7fcc531446699132fbda915bd989882e0064d417018773a315fb8d43ed063c9b00', TESTRPC_DERIVATION_PATH: `m/44'/60'/0'/0`, + NETWORK_ID: networkId, + TX_DATA: { + nonce: '0x00', + gasPrice: '0x0', + gas: '0x2710', + to: '0x0000000000000000000000000000000000000000', + value: '0x00', + chainId: networkId, + from: TEST_RPC_ACCOUNT_0, + }, + // This is the signed result of the abouve Transaction Data + TX_DATA_SIGNED_RESULT: + '0xf85f8080822710940000000000000000000000000000000000000000808078a0712854c73c69445cc1b22a7c3d7312ff9a97fe4ffba35fd636e8236b211b6e7ca0647cee031615e52d916c7c707025bc64ad525d8f1b9876c3435a863b42743178', }; From 68e8d6f3040d93b8c42992c46c84c50c1a4fbbef Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Sat, 7 Apr 2018 10:24:47 +0900 Subject: [PATCH 11/12] Update ERCDex logo --- .../images/landing/project_logos/ercdex.png | Bin 5726 -> 3929 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/website/public/images/landing/project_logos/ercdex.png b/packages/website/public/images/landing/project_logos/ercdex.png index 1367837e01596718cf709e2ec3d1148060cd8501..31d137be753b9b0ff20ba3df0bfe5bad52e8e19f 100644 GIT binary patch literal 3929 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 a_sy+%6YuL2z<(dc0M(b8FUl1xgZ~99T=rG~ From 073bf738ddb271b6b4158798baf4cac3cb0608e9 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Sat, 7 Apr 2018 10:41:43 +0900 Subject: [PATCH 12/12] Since we moved Web3Wrapper class from index to it's own file, we need to update doc mapping --- packages/website/ts/containers/web3_wrapper_documentation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/website/ts/containers/web3_wrapper_documentation.ts b/packages/website/ts/containers/web3_wrapper_documentation.ts index 289006f107..b0adad5366 100644 --- a/packages/website/ts/containers/web3_wrapper_documentation.ts +++ b/packages/website/ts/containers/web3_wrapper_documentation.ts @@ -39,7 +39,7 @@ const docsInfoConfig: DocsInfoConfig = { [docSections.installation]: InstallationMarkdown, }, sectionNameToModulePath: { - [docSections.web3Wrapper]: ['"web3-wrapper/src/index"'], + [docSections.web3Wrapper]: ['"web3-wrapper/src/web3_wrapper"'], [docSections.types]: ['"types/src/index"'], }, menuSubsectionToVersionWhenIntroduced: {},