From a8fd3f30cf87660f08fa7b1c249606b7f8872ba1 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 25 Aug 2017 11:59:23 +0200 Subject: Add a unit parameter to web3Wrapper.toWei --- src/web3_wrapper.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/web3_wrapper.ts b/src/web3_wrapper.ts index 61bac45c9..1f8038700 100644 --- a/src/web3_wrapper.ts +++ b/src/web3_wrapper.ts @@ -41,8 +41,8 @@ export class Web3Wrapper { return undefined; } } - public toWei(ethAmount: BigNumber.BigNumber): BigNumber.BigNumber { - const balanceWei = this.web3.toWei(ethAmount, 'ether'); + public toWei(amount: BigNumber.BigNumber, unit?: Web3.Unit): BigNumber.BigNumber { + const balanceWei = this.web3.toWei(amount, unit || 'ether'); return balanceWei; } public async getBalanceInWeiAsync(owner: string): Promise { -- cgit v1.2.3 From a6a16017997fbe53ac709f2f0d874e348da35621 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 25 Aug 2017 12:00:02 +0200 Subject: Allow user to specify the gas price --- src/0x.ts | 16 ++++++++++------ src/contract_wrappers/contract_wrapper.ts | 7 ++++++- src/contract_wrappers/ether_token_wrapper.ts | 4 ++-- src/contract_wrappers/exchange_wrapper.ts | 4 ++-- src/contract_wrappers/token_registry_wrapper.ts | 4 ++-- src/contract_wrappers/token_wrapper.ts | 4 ++-- src/globals.d.ts | 2 ++ 7 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/0x.ts b/src/0x.ts index e8b6b77b0..36ebb8ec2 100644 --- a/src/0x.ts +++ b/src/0x.ts @@ -159,15 +159,19 @@ export class ZeroEx { * Instantiates a new ZeroEx instance that provides the public interface to the 0x.js library. * @param provider The Web3.js Provider instance you would like the 0x.js library to use for interacting with * the Ethereum network. + * @param gasPrice The gas price to use for sending transactions. Defaults to 21 GWei. * @return An instance of the 0x.js ZeroEx class. */ - constructor(provider: Web3Provider) { + constructor(provider: Web3Provider, gasPrice?: BigNumber.BigNumber) { this._web3Wrapper = new Web3Wrapper(provider); - this.token = new TokenWrapper(this._web3Wrapper); - this.proxy = new TokenTransferProxyWrapper(this._web3Wrapper); - this.exchange = new ExchangeWrapper(this._web3Wrapper, this.token); - this.tokenRegistry = new TokenRegistryWrapper(this._web3Wrapper); - this.etherToken = new EtherTokenWrapper(this._web3Wrapper, this.token); + if (_.isUndefined(gasPrice)) { + gasPrice = this._web3Wrapper.toWei(new BigNumber(21), 'gwei'); + } + this.token = new TokenWrapper(this._web3Wrapper, gasPrice); + this.proxy = new TokenTransferProxyWrapper(this._web3Wrapper, gasPrice); + this.exchange = new ExchangeWrapper(this._web3Wrapper, this.token, gasPrice); + this.tokenRegistry = new TokenRegistryWrapper(this._web3Wrapper, gasPrice); + this.etherToken = new EtherTokenWrapper(this._web3Wrapper, this.token, gasPrice); } /** * Sets a new web3 provider for 0x.js. Updating the provider will stop all diff --git a/src/contract_wrappers/contract_wrapper.ts b/src/contract_wrappers/contract_wrapper.ts index 7efa229a5..015ed275a 100644 --- a/src/contract_wrappers/contract_wrapper.ts +++ b/src/contract_wrappers/contract_wrapper.ts @@ -6,11 +6,16 @@ import {utils} from '../utils/utils'; export class ContractWrapper { protected _web3Wrapper: Web3Wrapper; - constructor(web3Wrapper: Web3Wrapper) { + private _gasPrice: BigNumber.BigNumber; + constructor(web3Wrapper: Web3Wrapper, gasPrice: BigNumber.BigNumber) { this._web3Wrapper = web3Wrapper; + this._gasPrice = gasPrice; } protected async _instantiateContractIfExistsAsync(artifact: Artifact, address?: string): Promise { const c = await contract(artifact); + c.defaults({ + gasPrice: this._gasPrice, + }); const providerObj = this._web3Wrapper.getCurrentProvider(); c.setProvider(providerObj); diff --git a/src/contract_wrappers/ether_token_wrapper.ts b/src/contract_wrappers/ether_token_wrapper.ts index ee0ac2d8c..eae84feec 100644 --- a/src/contract_wrappers/ether_token_wrapper.ts +++ b/src/contract_wrappers/ether_token_wrapper.ts @@ -13,8 +13,8 @@ import * as EtherTokenArtifacts from '../artifacts/EtherToken.json'; export class EtherTokenWrapper extends ContractWrapper { private _etherTokenContractIfExists?: EtherTokenContract; private _tokenWrapper: TokenWrapper; - constructor(web3Wrapper: Web3Wrapper, tokenWrapper: TokenWrapper) { - super(web3Wrapper); + constructor(web3Wrapper: Web3Wrapper, tokenWrapper: TokenWrapper, gasPrice: BigNumber.BigNumber) { + super(web3Wrapper, gasPrice); this._tokenWrapper = tokenWrapper; } /** diff --git a/src/contract_wrappers/exchange_wrapper.ts b/src/contract_wrappers/exchange_wrapper.ts index a01940f4b..8ae51da43 100644 --- a/src/contract_wrappers/exchange_wrapper.ts +++ b/src/contract_wrappers/exchange_wrapper.ts @@ -73,8 +73,8 @@ export class ExchangeWrapper extends ContractWrapper { ]; return [orderAddresses, orderValues]; } - constructor(web3Wrapper: Web3Wrapper, tokenWrapper: TokenWrapper) { - super(web3Wrapper); + constructor(web3Wrapper: Web3Wrapper, tokenWrapper: TokenWrapper, gasPrice: BigNumber.BigNumber) { + super(web3Wrapper, gasPrice); this._tokenWrapper = tokenWrapper; this._orderValidationUtils = new OrderValidationUtils(tokenWrapper, this); this._exchangeLogEventEmitters = []; diff --git a/src/contract_wrappers/token_registry_wrapper.ts b/src/contract_wrappers/token_registry_wrapper.ts index 5fee1304e..5469b4a95 100644 --- a/src/contract_wrappers/token_registry_wrapper.ts +++ b/src/contract_wrappers/token_registry_wrapper.ts @@ -11,8 +11,8 @@ import * as TokenRegistryArtifacts from '../artifacts/TokenRegistry.json'; */ export class TokenRegistryWrapper extends ContractWrapper { private _tokenRegistryContractIfExists?: TokenRegistryContract; - constructor(web3Wrapper: Web3Wrapper) { - super(web3Wrapper); + constructor(web3Wrapper: Web3Wrapper, gasPrice: BigNumber.BigNumber) { + super(web3Wrapper, gasPrice); } /** * Retrieves all the tokens currently listed in the Token Registry smart contract diff --git a/src/contract_wrappers/token_wrapper.ts b/src/contract_wrappers/token_wrapper.ts index 51490359e..24f56a24a 100644 --- a/src/contract_wrappers/token_wrapper.ts +++ b/src/contract_wrappers/token_wrapper.ts @@ -31,8 +31,8 @@ export class TokenWrapper extends ContractWrapper { public UNLIMITED_ALLOWANCE_IN_BASE_UNITS = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS; private _tokenContractsByAddress: {[address: string]: TokenContract}; private _tokenLogEventEmitters: ContractEventEmitter[]; - constructor(web3Wrapper: Web3Wrapper) { - super(web3Wrapper); + constructor(web3Wrapper: Web3Wrapper, gasPrice: BigNumber.BigNumber) { + super(web3Wrapper, gasPrice); this._tokenContractsByAddress = {}; this._tokenLogEventEmitters = []; } diff --git a/src/globals.d.ts b/src/globals.d.ts index 9879a57ad..1ef70d679 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -39,6 +39,8 @@ declare interface ContractInstance { declare interface ContractFactory { setProvider: (providerObj: any) => void; deployed: () => ContractInstance; + // Both any's are Web3.CallData, but I was unable to import it in this file + defaults: (config: any) => any; at: (address: string) => ContractInstance; } declare interface Artifact { -- cgit v1.2.3 From dcfc0ecac6fe1b4f88ca81c91070b585ba00ac1e Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 25 Aug 2017 12:06:12 +0200 Subject: Specify gasPrice in WETH tests --- test/ether_token_wrapper_test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/ether_token_wrapper_test.ts b/test/ether_token_wrapper_test.ts index a8186499c..e93bab02c 100644 --- a/test/ether_token_wrapper_test.ts +++ b/test/ether_token_wrapper_test.ts @@ -26,9 +26,10 @@ describe('EtherTokenWrapper', () => { let wethContractAddress: string; let depositWeiAmount: BigNumber.BigNumber; let decimalPlaces: number; + const gasPrice = new BigNumber(1); before(async () => { web3 = web3Factory.create(); - zeroEx = new ZeroEx(web3.currentProvider); + zeroEx = new ZeroEx(web3.currentProvider, gasPrice); userAddresses = await promisify(web3.eth.getAccounts)(); addressWithETH = userAddresses[0]; wethContractAddress = await zeroEx.etherToken.getContractAddressAsync(); -- cgit v1.2.3 From 5b60d9f0f487719510e8d3463faf2fbad9d95d61 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 25 Aug 2017 12:10:56 +0200 Subject: Remove default value for gasPrice --- src/0x.ts | 3 --- src/contract_wrappers/contract_wrapper.ts | 4 ++-- src/contract_wrappers/ether_token_wrapper.ts | 2 +- src/contract_wrappers/exchange_wrapper.ts | 2 +- src/contract_wrappers/token_registry_wrapper.ts | 2 +- src/contract_wrappers/token_wrapper.ts | 2 +- 6 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/0x.ts b/src/0x.ts index 36ebb8ec2..904765633 100644 --- a/src/0x.ts +++ b/src/0x.ts @@ -164,9 +164,6 @@ export class ZeroEx { */ constructor(provider: Web3Provider, gasPrice?: BigNumber.BigNumber) { this._web3Wrapper = new Web3Wrapper(provider); - if (_.isUndefined(gasPrice)) { - gasPrice = this._web3Wrapper.toWei(new BigNumber(21), 'gwei'); - } this.token = new TokenWrapper(this._web3Wrapper, gasPrice); this.proxy = new TokenTransferProxyWrapper(this._web3Wrapper, gasPrice); this.exchange = new ExchangeWrapper(this._web3Wrapper, this.token, gasPrice); diff --git a/src/contract_wrappers/contract_wrapper.ts b/src/contract_wrappers/contract_wrapper.ts index 015ed275a..28df82cee 100644 --- a/src/contract_wrappers/contract_wrapper.ts +++ b/src/contract_wrappers/contract_wrapper.ts @@ -6,8 +6,8 @@ import {utils} from '../utils/utils'; export class ContractWrapper { protected _web3Wrapper: Web3Wrapper; - private _gasPrice: BigNumber.BigNumber; - constructor(web3Wrapper: Web3Wrapper, gasPrice: BigNumber.BigNumber) { + private _gasPrice?: BigNumber.BigNumber; + constructor(web3Wrapper: Web3Wrapper, gasPrice?: BigNumber.BigNumber) { this._web3Wrapper = web3Wrapper; this._gasPrice = gasPrice; } diff --git a/src/contract_wrappers/ether_token_wrapper.ts b/src/contract_wrappers/ether_token_wrapper.ts index eae84feec..3c282510f 100644 --- a/src/contract_wrappers/ether_token_wrapper.ts +++ b/src/contract_wrappers/ether_token_wrapper.ts @@ -13,7 +13,7 @@ import * as EtherTokenArtifacts from '../artifacts/EtherToken.json'; export class EtherTokenWrapper extends ContractWrapper { private _etherTokenContractIfExists?: EtherTokenContract; private _tokenWrapper: TokenWrapper; - constructor(web3Wrapper: Web3Wrapper, tokenWrapper: TokenWrapper, gasPrice: BigNumber.BigNumber) { + constructor(web3Wrapper: Web3Wrapper, tokenWrapper: TokenWrapper, gasPrice?: BigNumber.BigNumber) { super(web3Wrapper, gasPrice); this._tokenWrapper = tokenWrapper; } diff --git a/src/contract_wrappers/exchange_wrapper.ts b/src/contract_wrappers/exchange_wrapper.ts index 8ae51da43..d09df236b 100644 --- a/src/contract_wrappers/exchange_wrapper.ts +++ b/src/contract_wrappers/exchange_wrapper.ts @@ -73,7 +73,7 @@ export class ExchangeWrapper extends ContractWrapper { ]; return [orderAddresses, orderValues]; } - constructor(web3Wrapper: Web3Wrapper, tokenWrapper: TokenWrapper, gasPrice: BigNumber.BigNumber) { + constructor(web3Wrapper: Web3Wrapper, tokenWrapper: TokenWrapper, gasPrice?: BigNumber.BigNumber) { super(web3Wrapper, gasPrice); this._tokenWrapper = tokenWrapper; this._orderValidationUtils = new OrderValidationUtils(tokenWrapper, this); diff --git a/src/contract_wrappers/token_registry_wrapper.ts b/src/contract_wrappers/token_registry_wrapper.ts index 5469b4a95..822e69460 100644 --- a/src/contract_wrappers/token_registry_wrapper.ts +++ b/src/contract_wrappers/token_registry_wrapper.ts @@ -11,7 +11,7 @@ import * as TokenRegistryArtifacts from '../artifacts/TokenRegistry.json'; */ export class TokenRegistryWrapper extends ContractWrapper { private _tokenRegistryContractIfExists?: TokenRegistryContract; - constructor(web3Wrapper: Web3Wrapper, gasPrice: BigNumber.BigNumber) { + constructor(web3Wrapper: Web3Wrapper, gasPrice?: BigNumber.BigNumber) { super(web3Wrapper, gasPrice); } /** diff --git a/src/contract_wrappers/token_wrapper.ts b/src/contract_wrappers/token_wrapper.ts index 24f56a24a..f7070f1f4 100644 --- a/src/contract_wrappers/token_wrapper.ts +++ b/src/contract_wrappers/token_wrapper.ts @@ -31,7 +31,7 @@ export class TokenWrapper extends ContractWrapper { public UNLIMITED_ALLOWANCE_IN_BASE_UNITS = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS; private _tokenContractsByAddress: {[address: string]: TokenContract}; private _tokenLogEventEmitters: ContractEventEmitter[]; - constructor(web3Wrapper: Web3Wrapper, gasPrice: BigNumber.BigNumber) { + constructor(web3Wrapper: Web3Wrapper, gasPrice?: BigNumber.BigNumber) { super(web3Wrapper, gasPrice); this._tokenContractsByAddress = {}; this._tokenLogEventEmitters = []; -- cgit v1.2.3 From 8eb8037f9bb357e31d3a04dce145cb56628c2ec6 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 25 Aug 2017 12:11:13 +0200 Subject: Revert "Add a unit parameter to web3Wrapper.toWei" This reverts commit 4503c6a09dd9b97fb3b13f0222954b8f1f0db62e. --- src/web3_wrapper.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/web3_wrapper.ts b/src/web3_wrapper.ts index 1f8038700..61bac45c9 100644 --- a/src/web3_wrapper.ts +++ b/src/web3_wrapper.ts @@ -41,8 +41,8 @@ export class Web3Wrapper { return undefined; } } - public toWei(amount: BigNumber.BigNumber, unit?: Web3.Unit): BigNumber.BigNumber { - const balanceWei = this.web3.toWei(amount, unit || 'ether'); + public toWei(ethAmount: BigNumber.BigNumber): BigNumber.BigNumber { + const balanceWei = this.web3.toWei(ethAmount, 'ether'); return balanceWei; } public async getBalanceInWeiAsync(owner: string): Promise { -- cgit v1.2.3 From 0f646da97018d5a30435a650f7f55f4fde616058 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 25 Aug 2017 12:15:34 +0200 Subject: Update CHANGELOG --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03d0ab44c..3294d1802 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # CHANGELOG +vTBD - _TBD_ + * Added a possibility to specify `gasPrice` when instantiating `ZeroEx` (#139) + v0.11.0 - _August 24, 2017_ ------------------------ * Added `zeroEx.token.setUnlimitedProxyAllowanceAsync` (#137) -- cgit v1.2.3 From e372b0c61f4b861f238ad3a072d1bbe28410a5b1 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 25 Aug 2017 13:59:09 +0200 Subject: Fix CHANGELOG message --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3294d1802..dd639beb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # CHANGELOG vTBD - _TBD_ - * Added a possibility to specify `gasPrice` when instantiating `ZeroEx` (#139) + * Added the ability to specify `gasPrice` when instantiating `ZeroEx` (#139) v0.11.0 - _August 24, 2017_ ------------------------ -- cgit v1.2.3 From c765f115aeda3724460f02d4b31d77aa6fad0f1b Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 25 Aug 2017 14:06:49 +0200 Subject: Add ZeroExConfig type --- src/types.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/types.ts b/src/types.ts index 71227647b..2ccf573a9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -385,3 +385,7 @@ export interface JSONRPCPayload { params: any[]; method: string; } + +export interface ZeroExConfig { + gasPrice?: BigNumber.BigNumber; +} -- cgit v1.2.3 From 66dd659a2fbdc8c38bd24ef3ae2e489b36e5e84a Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 25 Aug 2017 14:07:02 +0200 Subject: Add ZeroExConfig type to public interface --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index 81523953e..6d6e4484c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -29,4 +29,5 @@ export { TokenContractEventArgs, ContractEventArgs, Web3Provider, + ZeroExConfig, } from './types'; -- cgit v1.2.3 From 836cea6fd778f76e61fbf2072684ce1b430cec5b Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 25 Aug 2017 14:08:10 +0200 Subject: Document gasPrice in ZeroExConfig --- src/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types.ts b/src/types.ts index 2ccf573a9..7c2f79538 100644 --- a/src/types.ts +++ b/src/types.ts @@ -387,5 +387,5 @@ export interface JSONRPCPayload { } export interface ZeroExConfig { - gasPrice?: BigNumber.BigNumber; + gasPrice?: BigNumber.BigNumber; // Gas price to use with every transaction } -- cgit v1.2.3 From a19b40b051f5d2a21c5b437ea450d81422e99d64 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 25 Aug 2017 14:08:28 +0200 Subject: Pass config object to a constructor instead of gasPrice --- src/0x.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/0x.ts b/src/0x.ts index 904765633..7fe6331c1 100644 --- a/src/0x.ts +++ b/src/0x.ts @@ -16,7 +16,7 @@ import {TokenRegistryWrapper} from './contract_wrappers/token_registry_wrapper'; import {EtherTokenWrapper} from './contract_wrappers/ether_token_wrapper'; import {TokenWrapper} from './contract_wrappers/token_wrapper'; import {TokenTransferProxyWrapper} from './contract_wrappers/token_transfer_proxy_wrapper'; -import {ECSignature, ZeroExError, Order, SignedOrder, Web3Provider} from './types'; +import {ECSignature, ZeroExError, Order, SignedOrder, Web3Provider, ZeroExConfig} from './types'; // Customize our BigNumber instances bigNumberConfigs.configure(); @@ -159,11 +159,12 @@ export class ZeroEx { * Instantiates a new ZeroEx instance that provides the public interface to the 0x.js library. * @param provider The Web3.js Provider instance you would like the 0x.js library to use for interacting with * the Ethereum network. - * @param gasPrice The gas price to use for sending transactions. Defaults to 21 GWei. + * @param config The configuration object. Look up the type for the description. * @return An instance of the 0x.js ZeroEx class. */ - constructor(provider: Web3Provider, gasPrice?: BigNumber.BigNumber) { + constructor(provider: Web3Provider, config?: ZeroExConfig) { this._web3Wrapper = new Web3Wrapper(provider); + const gasPrice = _.isUndefined(config) ? undefined : config.gasPrice; this.token = new TokenWrapper(this._web3Wrapper, gasPrice); this.proxy = new TokenTransferProxyWrapper(this._web3Wrapper, gasPrice); this.exchange = new ExchangeWrapper(this._web3Wrapper, this.token, gasPrice); -- cgit v1.2.3 From bfac0210859cc0a6d972c470588f260a4fdb574c Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 25 Aug 2017 14:09:59 +0200 Subject: Use zeroExConfig in tests --- test/ether_token_wrapper_test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/ether_token_wrapper_test.ts b/test/ether_token_wrapper_test.ts index e93bab02c..b40061a41 100644 --- a/test/ether_token_wrapper_test.ts +++ b/test/ether_token_wrapper_test.ts @@ -27,9 +27,12 @@ describe('EtherTokenWrapper', () => { let depositWeiAmount: BigNumber.BigNumber; let decimalPlaces: number; const gasPrice = new BigNumber(1); + const zeroExConfig = { + gasPrice, + }; before(async () => { web3 = web3Factory.create(); - zeroEx = new ZeroEx(web3.currentProvider, gasPrice); + zeroEx = new ZeroEx(web3.currentProvider, zeroExConfig); userAddresses = await promisify(web3.eth.getAccounts)(); addressWithETH = userAddresses[0]; wethContractAddress = await zeroEx.etherToken.getContractAddressAsync(); -- cgit v1.2.3 From 9516a50f645587bcc79ec5e17b8a353221f1d7e2 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 25 Aug 2017 14:11:53 +0200 Subject: Document changes in CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd639beb7..6c859a097 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # CHANGELOG vTBD - _TBD_ + * Added the optional `zeroExConfig` parameter to the constructor of `ZeroEx` (#139) * Added the ability to specify `gasPrice` when instantiating `ZeroEx` (#139) v0.11.0 - _August 24, 2017_ -- cgit v1.2.3