From f1b267cc9fe7f6e5566dc2535b064b92aef92df1 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Wed, 6 Dec 2017 20:55:09 +0300 Subject: Refactor web3Wrapper to a separate package --- packages/0x.js/package.json | 7 +- packages/0x.js/src/0x.ts | 2 +- .../src/contract_wrappers/contract_wrapper.ts | 31 +++- .../src/contract_wrappers/ether_token_wrapper.ts | 2 +- .../src/contract_wrappers/exchange_wrapper.ts | 2 +- .../src/contract_wrappers/generated/ether_token.ts | 2 +- .../src/contract_wrappers/generated/exchange.ts | 2 +- .../0x.js/src/contract_wrappers/generated/token.ts | 2 +- .../contract_wrappers/generated/token_registry.ts | 2 +- .../generated/token_transfer_proxy.ts | 2 +- .../contract_wrappers/token_registry_wrapper.ts | 2 +- .../token_transfer_proxy_wrapper.ts | 2 +- .../0x.js/src/contract_wrappers/token_wrapper.ts | 2 +- packages/0x.js/src/order_watcher/event_watcher.ts | 2 +- .../0x.js/src/order_watcher/order_state_watcher.ts | 2 +- packages/0x.js/src/utils/assert.ts | 2 +- packages/0x.js/src/utils/promisify.ts | 24 --- packages/0x.js/src/web3_wrapper.ts | 202 --------------------- packages/0x.js/test/event_watcher_test.ts | 2 +- packages/0x.js/test/expiration_watcher_test.ts | 2 +- packages/0x.js/test/order_state_watcher_test.ts | 2 +- packages/0x.js/test/token_wrapper_test.ts | 4 +- packages/abi-gen-templates/contract.mustache | 2 +- packages/abi-gen-templates/package.json | 2 +- packages/abi-gen/package.json | 4 +- packages/abi-gen/tsconfig.json | 2 +- packages/contracts/deploy/cli.ts | 8 +- packages/contracts/deploy/migrations/migrate.ts | 2 +- packages/contracts/deploy/src/compiler.ts | 2 +- packages/contracts/deploy/src/deployer.ts | 11 +- packages/contracts/deploy/src/utils/contract.ts | 2 +- packages/contracts/deploy/src/utils/fs_wrapper.ts | 12 +- packages/contracts/deploy/src/utils/network.ts | 13 +- packages/contracts/deploy/src/utils/types.ts | 3 +- .../contracts/deploy/src/utils/web3_wrapper.ts | 132 -------------- packages/contracts/deploy/test/deploy_test.ts | 2 +- packages/contracts/deploy/test/util/constants.ts | 4 +- packages/contracts/globals.d.ts | 6 - packages/contracts/package.json | 6 +- packages/contracts/test/ts/ether_token.ts | 6 +- .../contracts/test/ts/multi_sig_with_time_lock.ts | 6 +- packages/contracts/util/order.ts | 4 +- packages/json-schemas/package.json | 4 +- packages/json-schemas/src/globals.d.ts | 6 - packages/json-schemas/test/schema_test.ts | 2 +- packages/monorepo-scripts/package.json | 2 +- packages/types/README.md | 10 + packages/types/package.json | 32 ++++ packages/types/src/index.ts | 23 +++ packages/types/tsconfig.json | 16 ++ packages/types/tslint.json | 5 + packages/utils/README.md | 10 + packages/utils/package.json | 33 ++++ packages/utils/src/index.ts | 1 + packages/utils/src/promisify.ts | 24 +++ packages/utils/tsconfig.json | 15 ++ packages/utils/tslint.json | 5 + packages/web3-wrapper/README.md | 10 + packages/web3-wrapper/package.json | 37 ++++ packages/web3-wrapper/src/index.ts | 181 ++++++++++++++++++ packages/web3-wrapper/tsconfig.json | 16 ++ packages/web3-wrapper/tslint.json | 5 + packages/website/package.json | 1 - packages/website/ts/blockchain.ts | 6 +- .../ts/components/ui/lifecycle_raised_button.tsx | 2 +- packages/website/ts/globals.d.ts | 1 - .../ts/subproviders/redundant_rpc_subprovider.ts | 2 +- packages/website/ts/web3_wrapper.ts | 18 +- 68 files changed, 541 insertions(+), 457 deletions(-) delete mode 100644 packages/0x.js/src/utils/promisify.ts delete mode 100644 packages/0x.js/src/web3_wrapper.ts delete mode 100644 packages/contracts/deploy/src/utils/web3_wrapper.ts create mode 100644 packages/types/README.md create mode 100644 packages/types/package.json create mode 100644 packages/types/src/index.ts create mode 100644 packages/types/tsconfig.json create mode 100644 packages/types/tslint.json create mode 100644 packages/utils/README.md create mode 100644 packages/utils/package.json create mode 100644 packages/utils/src/index.ts create mode 100644 packages/utils/src/promisify.ts create mode 100644 packages/utils/tsconfig.json create mode 100644 packages/utils/tslint.json create mode 100644 packages/web3-wrapper/README.md create mode 100644 packages/web3-wrapper/package.json create mode 100644 packages/web3-wrapper/src/index.ts create mode 100644 packages/web3-wrapper/tsconfig.json create mode 100644 packages/web3-wrapper/tslint.json (limited to 'packages') diff --git a/packages/0x.js/package.json b/packages/0x.js/package.json index 8f8376a75..4468bae09 100644 --- a/packages/0x.js/package.json +++ b/packages/0x.js/package.json @@ -46,8 +46,7 @@ }, "devDependencies": { "@0xproject/tslint-config": "^0.2.0", - "abi-gen": "^0.0.0", - "abi-gen-templates": "^0.0.0", + "@0xproject/types": "^0.0.1", "@types/bintrees": "^1.0.2", "@types/jsonschema": "^1.1.1", "@types/lodash": "^4.14.86", @@ -55,6 +54,8 @@ "@types/node": "^8.0.53", "@types/sinon": "^2.2.2", "@types/uuid": "^3.4.2", + "abi-gen": "^0.0.1", + "abi-gen-templates": "^0.0.1", "awesome-typescript-loader": "^3.1.3", "chai": "^4.0.1", "chai-as-promised": "^7.1.0", @@ -88,6 +89,8 @@ "dependencies": { "@0xproject/assert": "^0.0.6", "@0xproject/json-schemas": "^0.6.9", + "@0xproject/utils": "^0.0.1", + "@0xproject/web3-wrapper": "^0.0.1", "bignumber.js": "~4.1.0", "bintrees": "^1.0.2", "bn.js": "^4.11.8", diff --git a/packages/0x.js/src/0x.ts b/packages/0x.js/src/0x.ts index 0616b3078..1cbfaed0c 100644 --- a/packages/0x.js/src/0x.ts +++ b/packages/0x.js/src/0x.ts @@ -1,4 +1,5 @@ import {schemas, SchemaValidator} from '@0xproject/json-schemas'; +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import BigNumber from 'bignumber.js'; import * as ethUtil from 'ethereumjs-util'; import * as _ from 'lodash'; @@ -29,7 +30,6 @@ import {intervalUtils} from './utils/interval_utils'; import {OrderStateUtils} from './utils/order_state_utils'; import {signatureUtils} from './utils/signature_utils'; import {utils} from './utils/utils'; -import {Web3Wrapper} from './web3_wrapper'; // Customize our BigNumber instances bigNumberConfigs.configure(); diff --git a/packages/0x.js/src/contract_wrappers/contract_wrapper.ts b/packages/0x.js/src/contract_wrappers/contract_wrapper.ts index 5e5a38f8c..0b6fc031a 100644 --- a/packages/0x.js/src/contract_wrappers/contract_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/contract_wrapper.ts @@ -1,3 +1,4 @@ +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import {Block, BlockAndLogStreamer} from 'ethereumjs-blockstream'; import * as _ from 'lodash'; import * as Web3 from 'web3'; @@ -19,7 +20,15 @@ import {AbiDecoder} from '../utils/abi_decoder'; import {constants} from '../utils/constants'; import {filterUtils} from '../utils/filter_utils'; import {intervalUtils} from '../utils/interval_utils'; -import {Web3Wrapper} from '../web3_wrapper'; + +const CONTRACT_NAME_TO_NOT_FOUND_ERROR: {[contractName: string]: ZeroExError} = { + ZRX: ZeroExError.ZRXContractDoesNotExist, + EtherToken: ZeroExError.EtherTokenContractDoesNotExist, + Token: ZeroExError.TokenContractDoesNotExist, + TokenRegistry: ZeroExError.TokenRegistryContractDoesNotExist, + TokenTransferProxy: ZeroExError.TokenTransferProxyContractDoesNotExist, + Exchange: ZeroExError.ExchangeContractDoesNotExist, +}; export class ContractWrapper { protected _web3Wrapper: Web3Wrapper; @@ -93,10 +102,24 @@ export class ContractWrapper { protected async _instantiateContractIfExistsAsync( artifact: Artifact, addressIfExists?: string, ): Promise { - const web3ContractInstance = await this._web3Wrapper.getContractInstanceFromArtifactAsync( - artifact, addressIfExists, + let contractAddress: string; + if (_.isUndefined(addressIfExists)) { + const networkId = this._web3Wrapper.getNetworkId(); + if (_.isUndefined(artifact.networks[networkId])) { + throw new Error(ZeroExError.ContractNotDeployedOnNetwork); + } + contractAddress = artifact.networks[networkId].address.toLowerCase(); + } else { + contractAddress = addressIfExists; + } + const doesContractExist = await this._web3Wrapper.doesContractExistAtAddressAsync(contractAddress); + if (!doesContractExist) { + throw new Error(CONTRACT_NAME_TO_NOT_FOUND_ERROR[artifact.contract_name]); + } + const contractInstance = this._web3Wrapper.getContractInstance( + artifact.abi, contractAddress, ); - return web3ContractInstance; + return contractInstance; } protected _getContractAddress(artifact: Artifact, addressIfExists?: string): string { if (_.isUndefined(addressIfExists)) { diff --git a/packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts b/packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts index 26025f6f9..685ae9a9e 100644 --- a/packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts @@ -1,10 +1,10 @@ +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import BigNumber from 'bignumber.js'; import * as _ from 'lodash'; import {artifacts} from '../artifacts'; import {TransactionOpts, ZeroExError} from '../types'; import {assert} from '../utils/assert'; -import {Web3Wrapper} from '../web3_wrapper'; import {ContractWrapper} from './contract_wrapper'; import {EtherTokenContract} from './generated/ether_token'; diff --git a/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts b/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts index aaf6256a3..433d99e4c 100644 --- a/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts @@ -1,4 +1,5 @@ import {schemas} from '@0xproject/json-schemas'; +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import BigNumber from 'bignumber.js'; import * as _ from 'lodash'; import * as Web3 from 'web3'; @@ -36,7 +37,6 @@ import {decorators} from '../utils/decorators'; import {ExchangeTransferSimulator} from '../utils/exchange_transfer_simulator'; import {OrderValidationUtils} from '../utils/order_validation_utils'; import {utils} from '../utils/utils'; -import {Web3Wrapper} from '../web3_wrapper'; import {ContractWrapper} from './contract_wrapper'; import {ExchangeContract} from './generated/exchange'; diff --git a/packages/0x.js/src/contract_wrappers/generated/ether_token.ts b/packages/0x.js/src/contract_wrappers/generated/ether_token.ts index eed5e4686..ce3f9f527 100644 --- a/packages/0x.js/src/contract_wrappers/generated/ether_token.ts +++ b/packages/0x.js/src/contract_wrappers/generated/ether_token.ts @@ -2,12 +2,12 @@ * This file is auto-generated using abi-gen. Don't edit directly. * Templates can be found at https://github.com/0xProject/0x.js/tree/development/packages/abi-gen-templates. */ +import {promisify} from '@0xproject/utils'; import {BigNumber} from 'bignumber.js'; import * as Web3 from 'web3'; import {TxData, TxDataPayable} from '../../types'; import {classUtils} from '../../utils/class_utils'; -import {promisify} from '../../utils/promisify'; import {BaseContract} from './base_contract'; diff --git a/packages/0x.js/src/contract_wrappers/generated/exchange.ts b/packages/0x.js/src/contract_wrappers/generated/exchange.ts index 8c25ca014..e06ed960c 100644 --- a/packages/0x.js/src/contract_wrappers/generated/exchange.ts +++ b/packages/0x.js/src/contract_wrappers/generated/exchange.ts @@ -2,12 +2,12 @@ * This file is auto-generated using abi-gen. Don't edit directly. * Templates can be found at https://github.com/0xProject/0x.js/tree/development/packages/abi-gen-templates. */ +import {promisify} from '@0xproject/utils'; import {BigNumber} from 'bignumber.js'; import * as Web3 from 'web3'; import {TxData, TxDataPayable} from '../../types'; import {classUtils} from '../../utils/class_utils'; -import {promisify} from '../../utils/promisify'; import {BaseContract} from './base_contract'; diff --git a/packages/0x.js/src/contract_wrappers/generated/token.ts b/packages/0x.js/src/contract_wrappers/generated/token.ts index 30b06292f..83a4ead34 100644 --- a/packages/0x.js/src/contract_wrappers/generated/token.ts +++ b/packages/0x.js/src/contract_wrappers/generated/token.ts @@ -2,12 +2,12 @@ * This file is auto-generated using abi-gen. Don't edit directly. * Templates can be found at https://github.com/0xProject/0x.js/tree/development/packages/abi-gen-templates. */ +import {promisify} from '@0xproject/utils'; import {BigNumber} from 'bignumber.js'; import * as Web3 from 'web3'; import {TxData, TxDataPayable} from '../../types'; import {classUtils} from '../../utils/class_utils'; -import {promisify} from '../../utils/promisify'; import {BaseContract} from './base_contract'; diff --git a/packages/0x.js/src/contract_wrappers/generated/token_registry.ts b/packages/0x.js/src/contract_wrappers/generated/token_registry.ts index 6aacc4336..5d9ad9016 100644 --- a/packages/0x.js/src/contract_wrappers/generated/token_registry.ts +++ b/packages/0x.js/src/contract_wrappers/generated/token_registry.ts @@ -2,12 +2,12 @@ * This file is auto-generated using abi-gen. Don't edit directly. * Templates can be found at https://github.com/0xProject/0x.js/tree/development/packages/abi-gen-templates. */ +import {promisify} from '@0xproject/utils'; import {BigNumber} from 'bignumber.js'; import * as Web3 from 'web3'; import {TxData, TxDataPayable} from '../../types'; import {classUtils} from '../../utils/class_utils'; -import {promisify} from '../../utils/promisify'; import {BaseContract} from './base_contract'; diff --git a/packages/0x.js/src/contract_wrappers/generated/token_transfer_proxy.ts b/packages/0x.js/src/contract_wrappers/generated/token_transfer_proxy.ts index 50f1c8f25..fd50a5894 100644 --- a/packages/0x.js/src/contract_wrappers/generated/token_transfer_proxy.ts +++ b/packages/0x.js/src/contract_wrappers/generated/token_transfer_proxy.ts @@ -2,12 +2,12 @@ * This file is auto-generated using abi-gen. Don't edit directly. * Templates can be found at https://github.com/0xProject/0x.js/tree/development/packages/abi-gen-templates. */ +import {promisify} from '@0xproject/utils'; import {BigNumber} from 'bignumber.js'; import * as Web3 from 'web3'; import {TxData, TxDataPayable} from '../../types'; import {classUtils} from '../../utils/class_utils'; -import {promisify} from '../../utils/promisify'; import {BaseContract} from './base_contract'; diff --git a/packages/0x.js/src/contract_wrappers/token_registry_wrapper.ts b/packages/0x.js/src/contract_wrappers/token_registry_wrapper.ts index 27ecb8bde..80b4c0f85 100644 --- a/packages/0x.js/src/contract_wrappers/token_registry_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/token_registry_wrapper.ts @@ -1,10 +1,10 @@ +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import * as _ from 'lodash'; import {artifacts} from '../artifacts'; import {Token, TokenMetadata, ZeroExError} from '../types'; import {assert} from '../utils/assert'; import {constants} from '../utils/constants'; -import {Web3Wrapper} from '../web3_wrapper'; import {ContractWrapper} from './contract_wrapper'; import {TokenRegistryContract} from './generated/token_registry'; diff --git a/packages/0x.js/src/contract_wrappers/token_transfer_proxy_wrapper.ts b/packages/0x.js/src/contract_wrappers/token_transfer_proxy_wrapper.ts index edc702672..7d6943aea 100644 --- a/packages/0x.js/src/contract_wrappers/token_transfer_proxy_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/token_transfer_proxy_wrapper.ts @@ -1,8 +1,8 @@ +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import * as _ from 'lodash'; import {artifacts} from '../artifacts'; import {ZeroExError} from '../types'; -import {Web3Wrapper} from '../web3_wrapper'; import {ContractWrapper} from './contract_wrapper'; import {TokenTransferProxyContract} from './generated/token_transfer_proxy'; diff --git a/packages/0x.js/src/contract_wrappers/token_wrapper.ts b/packages/0x.js/src/contract_wrappers/token_wrapper.ts index 630ab6e3b..1ae26edaa 100644 --- a/packages/0x.js/src/contract_wrappers/token_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/token_wrapper.ts @@ -1,4 +1,5 @@ import {schemas} from '@0xproject/json-schemas'; +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import BigNumber from 'bignumber.js'; import * as _ from 'lodash'; @@ -17,7 +18,6 @@ import { import {AbiDecoder} from '../utils/abi_decoder'; import {assert} from '../utils/assert'; import {constants} from '../utils/constants'; -import {Web3Wrapper} from '../web3_wrapper'; import {ContractWrapper} from './contract_wrapper'; import {TokenContract} from './generated/token'; diff --git a/packages/0x.js/src/order_watcher/event_watcher.ts b/packages/0x.js/src/order_watcher/event_watcher.ts index 831f19da5..d5b30d567 100644 --- a/packages/0x.js/src/order_watcher/event_watcher.ts +++ b/packages/0x.js/src/order_watcher/event_watcher.ts @@ -1,3 +1,4 @@ +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import * as _ from 'lodash'; import * as Web3 from 'web3'; @@ -11,7 +12,6 @@ import {AbiDecoder} from '../utils/abi_decoder'; import {assert} from '../utils/assert'; import {intervalUtils} from '../utils/interval_utils'; import {utils} from '../utils/utils'; -import {Web3Wrapper} from '../web3_wrapper'; const DEFAULT_EVENT_POLLING_INTERVAL_MS = 200; diff --git a/packages/0x.js/src/order_watcher/order_state_watcher.ts b/packages/0x.js/src/order_watcher/order_state_watcher.ts index 1ce111708..08f52d6e1 100644 --- a/packages/0x.js/src/order_watcher/order_state_watcher.ts +++ b/packages/0x.js/src/order_watcher/order_state_watcher.ts @@ -1,4 +1,5 @@ import {schemas} from '@0xproject/json-schemas'; +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import * as _ from 'lodash'; import {ZeroEx} from '../0x'; @@ -31,7 +32,6 @@ import {assert} from '../utils/assert'; import {intervalUtils} from '../utils/interval_utils'; import {OrderStateUtils} from '../utils/order_state_utils'; import {utils} from '../utils/utils'; -import {Web3Wrapper} from '../web3_wrapper'; import {EventWatcher} from './event_watcher'; import {ExpirationWatcher} from './expiration_watcher'; diff --git a/packages/0x.js/src/utils/assert.ts b/packages/0x.js/src/utils/assert.ts index 3cff9d2cf..4cf6caf77 100644 --- a/packages/0x.js/src/utils/assert.ts +++ b/packages/0x.js/src/utils/assert.ts @@ -1,12 +1,12 @@ import {assert as sharedAssert} from '@0xproject/assert'; import {Schema, SchemaValidator} from '@0xproject/json-schemas'; +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import BigNumber from 'bignumber.js'; import * as _ from 'lodash'; import * as Web3 from 'web3'; import {ECSignature} from '../types'; import {signatureUtils} from '../utils/signature_utils'; -import {Web3Wrapper} from '../web3_wrapper'; const HEX_REGEX = /^0x[0-9A-F]*$/i; diff --git a/packages/0x.js/src/utils/promisify.ts b/packages/0x.js/src/utils/promisify.ts deleted file mode 100644 index c114cf32f..000000000 --- a/packages/0x.js/src/utils/promisify.ts +++ /dev/null @@ -1,24 +0,0 @@ -import * as _ from 'lodash'; - -/** - * Transforms callback-based function -- func(arg1, arg2 .. argN, callback) -- into an ES6-compatible Promise. - * Promisify provides a default callback of the form (error, result) and rejects when `error` is not null. You can also - * supply thisArg object as the second argument which will be passed to `apply`. - */ -export function promisify( - originalFn: ( - ...args: any[], - // HACK: This can't be properly typed without variadic kinds https://github.com/Microsoft/TypeScript/issues/5453 - ) => void, - thisArg?: any, -): (...callArgs: any[]) => Promise { - const promisifiedFunction = async (...callArgs: any[]): Promise => { - return new Promise((resolve, reject) => { - const callback = (err: Error|null, data?: T) => { - _.isNull(err) ? resolve(data) : reject(err); - }; - originalFn.apply(thisArg, [...callArgs, callback]); - }); - }; - return promisifiedFunction; -} diff --git a/packages/0x.js/src/web3_wrapper.ts b/packages/0x.js/src/web3_wrapper.ts deleted file mode 100644 index 6a6b4e760..000000000 --- a/packages/0x.js/src/web3_wrapper.ts +++ /dev/null @@ -1,202 +0,0 @@ -import BigNumber from 'bignumber.js'; -import * as _ from 'lodash'; -import * as Web3 from 'web3'; - -import {Artifact, ArtifactContractName, TransactionReceipt, TxData, ZeroExError} from './types'; -import {promisify} from './utils/promisify'; - -interface RawLogEntry { - logIndex: string|null; - transactionIndex: string|null; - transactionHash: string; - blockHash: string|null; - blockNumber: string|null; - address: string; - data: string; - topics: string[]; -} - -const CONTRACT_NAME_TO_NOT_FOUND_ERROR: {[contractName: string]: ZeroExError} = { - ZRX: ZeroExError.ZRXContractDoesNotExist, - EtherToken: ZeroExError.EtherTokenContractDoesNotExist, - Token: ZeroExError.TokenContractDoesNotExist, - TokenRegistry: ZeroExError.TokenRegistryContractDoesNotExist, - TokenTransferProxy: ZeroExError.TokenTransferProxyContractDoesNotExist, - Exchange: ZeroExError.ExchangeContractDoesNotExist, -}; - -export class Web3Wrapper { - private web3: Web3; - private networkId: number; - private defaults: Partial; - private jsonRpcRequestId: number; - constructor(provider: Web3.Provider, networkId: number, defaults?: Partial) { - if (_.isUndefined((provider as any).sendAsync)) { - // Web3@1.0 provider doesn't support synchronous http requests, - // so it only has an async `send` method, instead of a `send` and `sendAsync` in web3@0.x.x` - // We re-assign the send method so that Web3@1.0 providers work with 0x.js - (provider as any).sendAsync = (provider as any).send; - } - this.web3 = new Web3(); - this.networkId = networkId; - this.web3.setProvider(provider); - this.defaults = defaults || {}; - this.jsonRpcRequestId = 0; - } - public getContractDefaults(): Partial { - return this.defaults; - } - public setProvider(provider: Web3.Provider, networkId: number) { - this.networkId = networkId; - this.web3.setProvider(provider); - } - public isAddress(address: string): boolean { - return this.web3.isAddress(address); - } - public async isSenderAddressAvailableAsync(senderAddress: string): Promise { - const addresses = await this.getAvailableAddressesAsync(); - return _.includes(addresses, senderAddress); - } - public async getNodeVersionAsync(): Promise { - const nodeVersion = await promisify(this.web3.version.getNode)(); - return nodeVersion; - } - public async getTransactionReceiptAsync(txHash: string): Promise { - const transactionReceipt = await promisify(this.web3.eth.getTransactionReceipt)(txHash); - if (!_.isNull(transactionReceipt)) { - transactionReceipt.status = this.normalizeTxReceiptStatus(transactionReceipt.status); - } - return transactionReceipt; - } - public getCurrentProvider(): Web3.Provider { - return this.web3.currentProvider; - } - public getNetworkId(): number { - return this.networkId; - } - public async getContractInstanceFromArtifactAsync( - artifact: Artifact, address?: string, - ): Promise { - let contractAddress: string; - if (_.isUndefined(address)) { - const networkId = this.getNetworkId(); - if (_.isUndefined(artifact.networks[networkId])) { - throw new Error(ZeroExError.ContractNotDeployedOnNetwork); - } - contractAddress = artifact.networks[networkId].address.toLowerCase(); - } else { - contractAddress = address; - } - const doesContractExist = await this.doesContractExistAtAddressAsync(contractAddress); - if (!doesContractExist) { - throw new Error(CONTRACT_NAME_TO_NOT_FOUND_ERROR[artifact.contract_name]); - } - const contractInstance = this.getContractInstance( - artifact.abi, contractAddress, - ); - return contractInstance; - } - public toWei(ethAmount: BigNumber): BigNumber { - const balanceWei = this.web3.toWei(ethAmount, 'ether'); - return balanceWei; - } - public async getBalanceInWeiAsync(owner: string): Promise { - let balanceInWei = await promisify(this.web3.eth.getBalance)(owner); - balanceInWei = new BigNumber(balanceInWei); - return balanceInWei; - } - public async doesContractExistAtAddressAsync(address: string): Promise { - const code = await promisify(this.web3.eth.getCode)(address); - // Regex matches 0x0, 0x00, 0x in order to accommodate poorly implemented clients - const codeIsEmpty = /^0x0{0,40}$/i.test(code); - return !codeIsEmpty; - } - public async signTransactionAsync(address: string, message: string): Promise { - const signData = await promisify(this.web3.eth.sign)(address, message); - return signData; - } - public async getBlockNumberAsync(): Promise { - const blockNumber = await promisify(this.web3.eth.getBlockNumber)(); - return blockNumber; - } - public async getBlockAsync(blockParam: string|Web3.BlockParam): Promise { - const block = await promisify(this.web3.eth.getBlock)(blockParam); - return block; - } - public async getBlockTimestampAsync(blockParam: string|Web3.BlockParam): Promise { - const {timestamp} = await this.getBlockAsync(blockParam); - return timestamp; - } - public async getAvailableAddressesAsync(): Promise { - const addresses = await promisify(this.web3.eth.getAccounts)(); - return addresses; - } - public async getLogsAsync(filter: Web3.FilterObject): Promise { - let fromBlock = filter.fromBlock; - if (_.isNumber(fromBlock)) { - fromBlock = this.web3.toHex(fromBlock); - } - let toBlock = filter.toBlock; - if (_.isNumber(toBlock)) { - toBlock = this.web3.toHex(toBlock); - } - const serializedFilter = { - ...filter, - fromBlock, - toBlock, - }; - const payload = { - jsonrpc: '2.0', - id: this.jsonRpcRequestId++, - method: 'eth_getLogs', - params: [serializedFilter], - }; - const rawLogs = await this.sendRawPayloadAsync(payload); - const formattedLogs = _.map(rawLogs, this.formatLog.bind(this)); - return formattedLogs; - } - private getContractInstance(abi: Web3.ContractAbi, address: string): Web3.ContractInstance { - const web3ContractInstance = this.web3.eth.contract(abi).at(address); - return web3ContractInstance; - } - private async getNetworkAsync(): Promise { - const networkId = await promisify(this.web3.version.getNetwork)(); - return networkId; - } - private async sendRawPayloadAsync(payload: Web3.JSONRPCRequestPayload): Promise { - const sendAsync = this.web3.currentProvider.sendAsync.bind(this.web3.currentProvider); - const response = await promisify(sendAsync)(payload); - const result = response.result; - return result; - } - private normalizeTxReceiptStatus(status: undefined|null|string|0|1): null|0|1 { - // Transaction status might have four values - // undefined - Testrpc and other old clients - // null - New clients on old transactions - // number - Parity - // hex - Geth - if (_.isString(status)) { - return this.web3.toDecimal(status) as 0|1; - } else if (_.isUndefined(status)) { - return null; - } else { - return status; - } - } - private formatLog(rawLog: RawLogEntry): Web3.LogEntry { - const formattedLog = { - ...rawLog, - logIndex: this.hexToDecimal(rawLog.logIndex), - blockNumber: this.hexToDecimal(rawLog.blockNumber), - transactionIndex: this.hexToDecimal(rawLog.transactionIndex), - }; - return formattedLog; - } - private hexToDecimal(hex: string|null): number|null { - if (_.isNull(hex)) { - return null; - } - const decimal = this.web3.toDecimal(hex); - return decimal; - } -} diff --git a/packages/0x.js/test/event_watcher_test.ts b/packages/0x.js/test/event_watcher_test.ts index f27a7da2c..41fca4e97 100644 --- a/packages/0x.js/test/event_watcher_test.ts +++ b/packages/0x.js/test/event_watcher_test.ts @@ -1,3 +1,4 @@ +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import BigNumber from 'bignumber.js'; import * as chai from 'chai'; import * as _ from 'lodash'; @@ -12,7 +13,6 @@ import { } from '../src'; import {EventWatcher} from '../src/order_watcher/event_watcher'; import {DoneCallback} from '../src/types'; -import {Web3Wrapper} from '../src/web3_wrapper'; import {chaiSetup} from './utils/chai_setup'; import {constants} from './utils/constants'; diff --git a/packages/0x.js/test/expiration_watcher_test.ts b/packages/0x.js/test/expiration_watcher_test.ts index c60b5dc6c..d4581259d 100644 --- a/packages/0x.js/test/expiration_watcher_test.ts +++ b/packages/0x.js/test/expiration_watcher_test.ts @@ -1,3 +1,4 @@ +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import BigNumber from 'bignumber.js'; import * as chai from 'chai'; import * as _ from 'lodash'; @@ -10,7 +11,6 @@ import {ExpirationWatcher} from '../src/order_watcher/expiration_watcher'; import {DoneCallback, Token} from '../src/types'; import {constants} from '../src/utils/constants'; import {utils} from '../src/utils/utils'; -import {Web3Wrapper} from '../src/web3_wrapper'; import {BlockchainLifecycle} from './utils/blockchain_lifecycle'; import {chaiSetup} from './utils/chai_setup'; diff --git a/packages/0x.js/test/order_state_watcher_test.ts b/packages/0x.js/test/order_state_watcher_test.ts index 1e5bc1a35..b5968dc24 100644 --- a/packages/0x.js/test/order_state_watcher_test.ts +++ b/packages/0x.js/test/order_state_watcher_test.ts @@ -1,3 +1,4 @@ +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import BigNumber from 'bignumber.js'; import * as chai from 'chai'; import * as _ from 'lodash'; @@ -19,7 +20,6 @@ import { } from '../src'; import {OrderStateWatcher} from '../src/order_watcher/order_state_watcher'; import {DoneCallback} from '../src/types'; -import {Web3Wrapper} from '../src/web3_wrapper'; import {BlockchainLifecycle} from './utils/blockchain_lifecycle'; import {chaiSetup} from './utils/chai_setup'; diff --git a/packages/0x.js/test/token_wrapper_test.ts b/packages/0x.js/test/token_wrapper_test.ts index 421bd0a8c..57cfbea18 100644 --- a/packages/0x.js/test/token_wrapper_test.ts +++ b/packages/0x.js/test/token_wrapper_test.ts @@ -1,3 +1,5 @@ +import {promisify} from '@0xproject/utils'; +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import BigNumber from 'bignumber.js'; import * as chai from 'chai'; import 'mocha'; @@ -18,8 +20,6 @@ import { ZeroExError, } from '../src'; import {BlockParamLiteral, DoneCallback} from '../src/types'; -import {promisify} from '../src/utils/promisify'; -import {Web3Wrapper} from '../src/web3_wrapper'; import {BlockchainLifecycle} from './utils/blockchain_lifecycle'; import {chaiSetup} from './utils/chai_setup'; diff --git a/packages/abi-gen-templates/contract.mustache b/packages/abi-gen-templates/contract.mustache index 27783fb6e..ec06df507 100644 --- a/packages/abi-gen-templates/contract.mustache +++ b/packages/abi-gen-templates/contract.mustache @@ -2,12 +2,12 @@ * This file is auto-generated using abi-gen. Don't edit directly. * Templates can be found at https://github.com/0xProject/0x.js/tree/development/packages/abi-gen-templates. */ +import {promisify} from '@0xproject/utils'; import {BigNumber} from 'bignumber.js'; import * as Web3 from 'web3'; import {TxData, TxDataPayable} from '../../types'; import {classUtils} from '../../utils/class_utils'; -import {promisify} from '../../utils/promisify'; import {BaseContract} from './base_contract'; diff --git a/packages/abi-gen-templates/package.json b/packages/abi-gen-templates/package.json index 104013c05..e45da3bf1 100644 --- a/packages/abi-gen-templates/package.json +++ b/packages/abi-gen-templates/package.json @@ -1,7 +1,7 @@ { "name": "abi-gen-templates", "private": true, - "version": "0.0.0", + "version": "0.0.1", "description": "Handlebars templates to generate TS contract wrappers", "repository": { "type": "git", diff --git a/packages/abi-gen/package.json b/packages/abi-gen/package.json index defe4a621..0d61891e0 100644 --- a/packages/abi-gen/package.json +++ b/packages/abi-gen/package.json @@ -1,6 +1,6 @@ { "name": "abi-gen", - "version": "0.0.0", + "version": "0.0.1", "description": "Generate contract wrappers from ABI and handlebars templates", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -33,9 +33,9 @@ "yargs": "^10.0.3" }, "devDependencies": { - "@types/handlebars": "^4.0.36", "@0xproject/tslint-config": "^0.2.0", "@types/glob": "^5.0.33", + "@types/handlebars": "^4.0.36", "@types/mkdirp": "^0.5.1", "@types/node": "^8.0.53", "@types/yargs": "^8.0.2", diff --git a/packages/abi-gen/tsconfig.json b/packages/abi-gen/tsconfig.json index 2a3667890..695f2a47e 100644 --- a/packages/abi-gen/tsconfig.json +++ b/packages/abi-gen/tsconfig.json @@ -12,6 +12,6 @@ "include": [ "./src/**/*", "./test/**/*", - "../../node_modules/web3-typescript-typings/index.d.ts", + "../../node_modules/web3-typescript-typings/index.d.ts" ] } diff --git a/packages/contracts/deploy/cli.ts b/packages/contracts/deploy/cli.ts index 73a43b247..df3ae33b4 100644 --- a/packages/contracts/deploy/cli.ts +++ b/packages/contracts/deploy/cli.ts @@ -1,3 +1,5 @@ +import {TxData} from '@0xproject/types'; +import {BigNumber} from 'bignumber.js'; import * as _ from 'lodash'; import * as path from 'path'; import * as yargs from 'yargs'; @@ -46,10 +48,10 @@ async function onMigrateCommand(argv: CliOptions): Promise { await commands.compileAsync(compilerOpts); const defaults = { - gasPrice: argv.gasPrice, + gasPrice: new BigNumber(argv.gasPrice), from: argv.account, }; - const deployerOpts: DeployerOptions = { + const deployerOpts = { artifactsDir: argv.artifactsDir, jsonrpcPort: argv.jsonrpcPort, networkId: networkIdIfExists, @@ -72,7 +74,7 @@ async function onDeployCommand(argv: CliOptions): Promise { await commands.compileAsync(compilerOpts); const defaults = { - gasPrice: argv.gasPrice, + gasPrice: new BigNumber(argv.gasPrice), from: argv.account, }; const deployerOpts: DeployerOptions = { diff --git a/packages/contracts/deploy/migrations/migrate.ts b/packages/contracts/deploy/migrations/migrate.ts index ea91febe4..c3d38875e 100644 --- a/packages/contracts/deploy/migrations/migrate.ts +++ b/packages/contracts/deploy/migrations/migrate.ts @@ -1,3 +1,4 @@ +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import {BigNumber} from 'bignumber.js'; import * as _ from 'lodash'; import * as Web3 from 'web3'; @@ -5,7 +6,6 @@ import * as Web3 from 'web3'; import {Deployer} from './../src/deployer'; import {constants} from './../src/utils/constants'; import {Token} from './../src/utils/types'; -import {Web3Wrapper} from './../src/utils/web3_wrapper'; import {tokenInfo} from './config/token_info'; export const migrator = { diff --git a/packages/contracts/deploy/src/compiler.ts b/packages/contracts/deploy/src/compiler.ts index 70b88b514..8a44e94a3 100644 --- a/packages/contracts/deploy/src/compiler.ts +++ b/packages/contracts/deploy/src/compiler.ts @@ -1,4 +1,4 @@ -import promisify = require('es6-promisify'); +import {promisify} from '@0xproject/utils'; import * as ethUtil from 'ethereumjs-util'; import * as _ from 'lodash'; import * as path from 'path'; diff --git a/packages/contracts/deploy/src/deployer.ts b/packages/contracts/deploy/src/deployer.ts index 48d175a42..2d4f31949 100644 --- a/packages/contracts/deploy/src/deployer.ts +++ b/packages/contracts/deploy/src/deployer.ts @@ -1,4 +1,6 @@ -import promisify = require('es6-promisify'); +import {TxData} from '@0xproject/types'; +import {promisify} from '@0xproject/utils'; +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import * as _ from 'lodash'; import * as Web3 from 'web3'; @@ -11,7 +13,6 @@ import { DeployerOptions, } from './utils/types'; import {utils} from './utils/utils'; -import {Web3Wrapper} from './utils/web3_wrapper'; // Gas added to gas estimate to make sure there is sufficient gas for deployment. const EXTRA_GAS = 200000; @@ -21,7 +22,7 @@ export class Deployer { private artifactsDir: string; private jsonrpcPort: number; private networkId: number; - private defaults: Partial; + private defaults: Partial; constructor(opts: DeployerOptions) { this.artifactsDir = opts.artifactsDir; @@ -30,7 +31,7 @@ export class Deployer { const jsonrpcUrl = `http://localhost:${this.jsonrpcPort}`; const web3Provider = new Web3.providers.HttpProvider(jsonrpcUrl); this.defaults = opts.defaults; - this.web3Wrapper = new Web3Wrapper(web3Provider, this.defaults); + this.web3Wrapper = new Web3Wrapper(web3Provider, this.networkId, this.defaults); } /** * Loads contract artifact and deploys contract with given arguments. @@ -171,7 +172,7 @@ export class Deployer { const block = await this.web3Wrapper.getBlockAsync('latest'); let gas: number; try { - const gasEstimate: number = await this.web3Wrapper.estimateGasAsync({data}); + const gasEstimate: number = await this.web3Wrapper.estimateGasAsync(data); gas = Math.min(gasEstimate + EXTRA_GAS, block.gasLimit); } catch (err) { gas = block.gasLimit; diff --git a/packages/contracts/deploy/src/utils/contract.ts b/packages/contracts/deploy/src/utils/contract.ts index e9c49c9f1..7b6098cea 100644 --- a/packages/contracts/deploy/src/utils/contract.ts +++ b/packages/contracts/deploy/src/utils/contract.ts @@ -1,5 +1,5 @@ import {schemas, SchemaValidator} from '@0xproject/json-schemas'; -import promisify = require('es6-promisify'); +import {promisify} from '@0xproject/utils'; import * as _ from 'lodash'; import * as Web3 from 'web3'; diff --git a/packages/contracts/deploy/src/utils/fs_wrapper.ts b/packages/contracts/deploy/src/utils/fs_wrapper.ts index 6b4fd625c..90785d0dd 100644 --- a/packages/contracts/deploy/src/utils/fs_wrapper.ts +++ b/packages/contracts/deploy/src/utils/fs_wrapper.ts @@ -1,11 +1,11 @@ -import promisify = require('es6-promisify'); +import {promisify} from '@0xproject/utils'; import * as fs from 'fs'; export const fsWrapper = { - readdirAsync: promisify(fs.readdir), - readFileAsync: promisify(fs.readFile), - writeFileAsync: promisify(fs.writeFile), - mkdirAsync: promisify(fs.mkdir), + readdirAsync: promisify(fs.readdir), + readFileAsync: promisify(fs.readFile), + writeFileAsync: promisify(fs.writeFile), + mkdirAsync: promisify(fs.mkdir), doesPathExistSync: fs.existsSync, - removeFileAsync: promisify(fs.unlink), + removeFileAsync: promisify(fs.unlink), }; diff --git a/packages/contracts/deploy/src/utils/network.ts b/packages/contracts/deploy/src/utils/network.ts index 74123e6a5..fcb78287c 100644 --- a/packages/contracts/deploy/src/utils/network.ts +++ b/packages/contracts/deploy/src/utils/network.ts @@ -1,15 +1,14 @@ -import promisify = require('es6-promisify'); +import {promisify} from '@0xproject/utils'; +import {Web3Wrapper} from '@0xproject/web3-wrapper'; +import * as _ from 'lodash'; import * as Web3 from 'web3'; -import {Web3Wrapper} from './web3_wrapper'; - export const network = { async getNetworkIdIfExistsAsync(port: number): Promise { const url = `http://localhost:${port}`; const web3Provider = new Web3.providers.HttpProvider(url); - const defaults = {}; - const web3Wrapper = new Web3Wrapper(web3Provider, defaults); - const networkIdIfExists = await web3Wrapper.getNetworkIdIfExistsAsync(); - return networkIdIfExists; + const web3 = new Web3(web3Provider); + const networkId = _.parseInt(await promisify(web3.version.getNetwork)()); + return networkId; }, }; diff --git a/packages/contracts/deploy/src/utils/types.ts b/packages/contracts/deploy/src/utils/types.ts index 855f1e849..f6b9de6e9 100644 --- a/packages/contracts/deploy/src/utils/types.ts +++ b/packages/contracts/deploy/src/utils/types.ts @@ -1,3 +1,4 @@ +import {TxData} from '@0xproject/types'; import * as Web3 from 'web3'; export enum AbiType { @@ -54,7 +55,7 @@ export interface DeployerOptions { artifactsDir: string; jsonrpcPort: number; networkId: number; - defaults: Partial; + defaults: Partial; } export interface ContractSources { diff --git a/packages/contracts/deploy/src/utils/web3_wrapper.ts b/packages/contracts/deploy/src/utils/web3_wrapper.ts deleted file mode 100644 index 0209da26d..000000000 --- a/packages/contracts/deploy/src/utils/web3_wrapper.ts +++ /dev/null @@ -1,132 +0,0 @@ -import BigNumber from 'bignumber.js'; -import promisify = require('es6-promisify'); -import * as _ from 'lodash'; -import * as Web3 from 'web3'; - -import {Contract} from './contract'; -import {ZeroExError} from './types'; - -export class Web3Wrapper { - private web3: Web3; - private defaults: Partial; - private networkIdIfExists?: number; - private jsonRpcRequestId: number; - constructor(provider: Web3.Provider, defaults: Partial) { - this.web3 = new Web3(); - this.web3.setProvider(provider); - this.defaults = defaults; - this.jsonRpcRequestId = 0; - } - public setProvider(provider: Web3.Provider) { - delete this.networkIdIfExists; - this.web3.setProvider(provider); - } - public isAddress(address: string): boolean { - return this.web3.isAddress(address); - } - public getContractFromAbi(abi: Web3.ContractAbi): Web3.Contract { - const contract = this.web3.eth.contract(abi); - return contract; - } - public async isSenderAddressAvailableAsync(senderAddress: string): Promise { - const addresses = await this.getAvailableAddressesAsync(); - return _.includes(addresses, senderAddress); - } - public async getNodeVersionAsync(): Promise { - const nodeVersion = await promisify(this.web3.version.getNode)(); - return nodeVersion; - } - public async getTransactionReceiptAsync(txHash: string): Promise { - const transactionReceipt = await promisify(this.web3.eth.getTransactionReceipt)(txHash); - return transactionReceipt; - } - public getCurrentProvider(): Web3.Provider { - return this.web3.currentProvider; - } - public async getNetworkIdIfExistsAsync(): Promise { - if (!_.isUndefined(this.networkIdIfExists)) { - return this.networkIdIfExists; - } - - try { - const networkId = await this.getNetworkAsync(); - this.networkIdIfExists = Number(networkId); - return this.networkIdIfExists; - } catch (err) { - return undefined; - } - } - public toWei(ethAmount: BigNumber): BigNumber { - const balanceWei = this.web3.toWei(ethAmount, 'ether'); - return balanceWei; - } - public async getBalanceInWeiAsync(owner: string): Promise { - let balanceInWei = await promisify(this.web3.eth.getBalance)(owner); - balanceInWei = new BigNumber(balanceInWei); - return balanceInWei; - } - public async doesContractExistAtAddressAsync(address: string): Promise { - const code = await promisify(this.web3.eth.getCode)(address); - // Regex matches 0x0, 0x00, 0x in order to accommodate poorly implemented clients - const codeIsEmpty = /^0x0{0,40}$/i.test(code); - return !codeIsEmpty; - } - public async signTransactionAsync(address: string, message: string): Promise { - const signData = await promisify(this.web3.eth.sign)(address, message); - return signData; - } - public async getBlockAsync(blockParam: string|Web3.BlockParam): Promise { - const block = await promisify(this.web3.eth.getBlock)(blockParam); - return block; - } - public async getBlockTimestampAsync(blockParam: string|Web3.BlockParam): Promise { - const {timestamp} = await this.getBlockAsync(blockParam); - return timestamp; - } - public async getAvailableAddressesAsync(): Promise { - const addresses: string[] = await promisify(this.web3.eth.getAccounts)(); - return addresses; - } - public async getLogsAsync(filter: Web3.FilterObject): Promise { - let fromBlock = filter.fromBlock; - if (_.isNumber(fromBlock)) { - fromBlock = this.web3.toHex(fromBlock); - } - let toBlock = filter.toBlock; - if (_.isNumber(toBlock)) { - toBlock = this.web3.toHex(toBlock); - } - const serializedFilter = { - ...filter, - fromBlock, - toBlock, - }; - const payload = { - jsonrpc: '2.0', - id: this.jsonRpcRequestId++, - method: 'eth_getLogs', - params: [serializedFilter], - }; - const logs = await this.sendRawPayloadAsync(payload); - return logs; - } - public async estimateGasAsync(callData: Web3.CallData): Promise { - const gasEstimate = await promisify(this.web3.eth.estimateGas)(callData); - return gasEstimate; - } - private getContractInstance(abi: Web3.ContractAbi, address: string): A { - const web3ContractInstance = this.web3.eth.contract(abi).at(address); - const contractInstance = new Contract(web3ContractInstance, this.defaults) as any as A; - return contractInstance; - } - private async getNetworkAsync(): Promise { - const networkId = await promisify(this.web3.version.getNetwork)(); - return networkId; - } - private async sendRawPayloadAsync(payload: Web3.JSONRPCRequestPayload): Promise { - const sendAsync = this.web3.currentProvider.sendAsync.bind(this.web3.currentProvider); - const response = await promisify(sendAsync)(payload); - const result = response.result; - return result; - } -} diff --git a/packages/contracts/deploy/test/deploy_test.ts b/packages/contracts/deploy/test/deploy_test.ts index 28cbd4586..7e7b98f90 100644 --- a/packages/contracts/deploy/test/deploy_test.ts +++ b/packages/contracts/deploy/test/deploy_test.ts @@ -19,7 +19,7 @@ const compilerOpts: CompilerOptions = { optimizerEnabled: constants.optimizerEnabled, }; const compiler = new Compiler(compilerOpts); -const deployerOpts: DeployerOptions = { +const deployerOpts = { artifactsDir, networkId: constants.networkId, jsonrpcPort: constants.jsonrpcPort, diff --git a/packages/contracts/deploy/test/util/constants.ts b/packages/contracts/deploy/test/util/constants.ts index 226c5a205..a2de44b63 100644 --- a/packages/contracts/deploy/test/util/constants.ts +++ b/packages/contracts/deploy/test/util/constants.ts @@ -1,8 +1,10 @@ +import {BigNumber} from 'bignumber.js'; + export const constants = { networkId: 0, jsonrpcPort: 8545, optimizerEnabled: 0, - gasPrice: '20000000000', + gasPrice: new BigNumber(20000000000), timeoutMs: 12000, zrxTokenAddress: '0xe41d2489571d322189246dafa5ebde1f4699f498', tokenTransferProxyAddress: '0x8da0d80f5007ef1e431dd2127178d224e32c2ef4', diff --git a/packages/contracts/globals.d.ts b/packages/contracts/globals.d.ts index 8bc5b5c3f..df53e9372 100644 --- a/packages/contracts/globals.d.ts +++ b/packages/contracts/globals.d.ts @@ -27,11 +27,6 @@ declare module 'solc' { export function setupMethods(solcBin: any): any; } -declare module 'es6-promisify' { - function promisify(original: any, settings?: any): ((...arg: any[]) => Promise); - export = promisify; -} - declare module 'web3-eth-abi' { export function encodeParameters(typesArray: string[], parameters: any[]): string; } @@ -39,4 +34,3 @@ declare module 'web3-eth-abi' { // Truffle injects the following into the global scope declare var artifacts: any; declare var contract: any; - diff --git a/packages/contracts/package.json b/packages/contracts/package.json index efa2d94c6..92a9da53e 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -13,7 +13,7 @@ "clean": "rm -rf ./lib", "migrate:truffle": "npm run build; truffle migrate", "migrate": "npm run build; node lib/deploy/cli.js migrate", - "lint": "tslint --project . 'migrations/*.ts' 'test/**/*.ts' 'util/*.ts' 'deploy/**/*.ts'", + "lint": "tslint --project . 'migrations/**/*.ts' 'test/**/*.ts' 'util/**/*.ts' 'deploy/**/*.ts'", "test:deployer": "npm run build; mocha lib/deploy/test/*_test.js" }, "repository": { @@ -28,6 +28,7 @@ "homepage": "https://github.com/0xProject/0x.js/packages/contracts/README.md", "devDependencies": { "@0xproject/tslint-config": "^0.2.0", + "@0xproject/types": "^0.0.1", "@types/bluebird": "^3.5.3", "@types/isomorphic-fetch": "^0.0.34", "@types/lodash": "^4.14.86", @@ -53,11 +54,12 @@ }, "dependencies": { "0x.js": "^0.22.6", + "@0xproject/web3-wrapper": "^0.0.1", "@0xproject/json-schemas": "^0.6.9", + "@0xproject/utils": "^0.0.1", "bignumber.js": "~4.1.0", "bluebird": "^3.5.0", "bn.js": "^4.11.8", - "es6-promisify": "^5.0.0", "ethereumjs-abi": "^0.6.4", "ethereumjs-util": "^5.1.1", "isomorphic-fetch": "^2.2.1", diff --git a/packages/contracts/test/ts/ether_token.ts b/packages/contracts/test/ts/ether_token.ts index 857371578..dbb4d2ee6 100644 --- a/packages/contracts/test/ts/ether_token.ts +++ b/packages/contracts/test/ts/ether_token.ts @@ -1,7 +1,7 @@ import {ZeroEx, ZeroExError} from '0x.js'; +import {promisify} from '@0xproject/utils'; import {BigNumber} from 'bignumber.js'; import * as chai from 'chai'; -import promisify = require('es6-promisify'); import Web3 = require('web3'); import {Artifacts} from '../../util/artifacts'; @@ -30,9 +30,9 @@ contract('EtherToken', (accounts: string[]) => { }); }); - const sendTransactionAsync = promisify(web3.eth.sendTransaction); + const sendTransactionAsync = promisify(web3.eth.sendTransaction); const getEthBalanceAsync = async (owner: string) => { - const balanceStr = await promisify(web3.eth.getBalance)(owner); + const balanceStr = await promisify(web3.eth.getBalance)(owner); const balance = new BigNumber(balanceStr); return balance; }; diff --git a/packages/contracts/test/ts/multi_sig_with_time_lock.ts b/packages/contracts/test/ts/multi_sig_with_time_lock.ts index 6ab3014ab..6dd4dc3b2 100644 --- a/packages/contracts/test/ts/multi_sig_with_time_lock.ts +++ b/packages/contracts/test/ts/multi_sig_with_time_lock.ts @@ -1,6 +1,6 @@ +import {promisify} from '@0xproject/utils'; import {BigNumber} from 'bignumber.js'; import * as chai from 'chai'; -import promisify = require('es6-promisify'); import Web3 = require('web3'); import * as multiSigWalletJSON from '../../build/contracts/MultiSigWalletWithTimeLock.json'; @@ -64,8 +64,8 @@ contract('MultiSigWalletWithTimeLock', (accounts: string[]) => { it('should set confirmation time with enough confirmations', async () => { const res = await multiSig.confirmTransaction(txId, {from: owners[1]}); expect(res.logs).to.have.length(2); - const blockNum = await promisify(web3.eth.getBlockNumber)(); - const blockInfo = await promisify(web3.eth.getBlock)(blockNum); + const blockNum = await promisify(web3.eth.getBlockNumber)(); + const blockInfo = await promisify(web3.eth.getBlock)(blockNum); const timestamp = new BigNumber(blockInfo.timestamp); const confirmationTimeBigNum = new BigNumber(await multiSig.confirmationTimes.call(txId)); diff --git a/packages/contracts/util/order.ts b/packages/contracts/util/order.ts index 8e3822188..ec5362b66 100644 --- a/packages/contracts/util/order.ts +++ b/packages/contracts/util/order.ts @@ -1,5 +1,5 @@ +import {promisify} from '@0xproject/utils'; import {BigNumber} from 'bignumber.js'; -import promisify = require('es6-promisify'); import ethUtil = require('ethereumjs-util'); import * as _ from 'lodash'; import Web3 = require('web3'); @@ -33,7 +33,7 @@ export class Order { } public async signAsync() { const orderHash = this.getOrderHash(); - const signature = await promisify(web3.eth.sign)(this.params.maker, orderHash); + const signature = await promisify(web3.eth.sign)(this.params.maker, orderHash); const {v, r, s} = ethUtil.fromRpcSig(signature); this.params = _.assign(this.params, { orderHashHex: orderHash, diff --git a/packages/json-schemas/package.json b/packages/json-schemas/package.json index 0181e4dd4..52deb2254 100644 --- a/packages/json-schemas/package.json +++ b/packages/json-schemas/package.json @@ -5,7 +5,7 @@ "main": "lib/src/index.js", "types": "lib/src/index.d.ts", "scripts": { - "lint": "tslint --project . src/*.ts test/*.ts", + "lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'", "test": "run-s clean build run_mocha", "test:circleci": "yarn test", "run_mocha": "mocha lib/test/**/*_test.js", @@ -23,12 +23,12 @@ }, "homepage": "https://github.com/0xProject/0x.js/packages/json-schemas/README.md", "dependencies": { - "es6-promisify": "^5.0.0", "jsonschema": "^1.2.0", "lodash.values": "^4.3.0" }, "devDependencies": { "@0xproject/tslint-config": "^0.2.0", + "@0xproject/utils": "^0.0.1", "@types/lodash.foreach": "^4.5.3", "@types/lodash.values": "^4.3.3", "@types/mocha": "^2.2.42", diff --git a/packages/json-schemas/src/globals.d.ts b/packages/json-schemas/src/globals.d.ts index 157705f57..91ed2021e 100644 --- a/packages/json-schemas/src/globals.d.ts +++ b/packages/json-schemas/src/globals.d.ts @@ -1,7 +1 @@ declare module 'dirty-chai'; - -// es6-promisify declarations -declare function promisify(original: any, settings?: any): ((...arg: any[]) => Promise); -declare module 'es6-promisify' { - export = promisify; -} diff --git a/packages/json-schemas/test/schema_test.ts b/packages/json-schemas/test/schema_test.ts index 758ccac61..8a2f9407d 100644 --- a/packages/json-schemas/test/schema_test.ts +++ b/packages/json-schemas/test/schema_test.ts @@ -1,7 +1,7 @@ +import {promisify} from '@0xproject/utils'; import BigNumber from 'bignumber.js'; import * as chai from 'chai'; import * as dirtyChai from 'dirty-chai'; -import promisify = require('es6-promisify'); import forEach = require('lodash.foreach'); import 'mocha'; diff --git a/packages/monorepo-scripts/package.json b/packages/monorepo-scripts/package.json index 3c49429e9..ebd3c60ea 100644 --- a/packages/monorepo-scripts/package.json +++ b/packages/monorepo-scripts/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/monorepo-scripts", - "version": "0.0.0", + "version": "0.0.1", "private": true, "description": "Helper scripts for the monorepo", "scripts": { diff --git a/packages/types/README.md b/packages/types/README.md new file mode 100644 index 000000000..0df8c6333 --- /dev/null +++ b/packages/types/README.md @@ -0,0 +1,10 @@ +Web3 wrapper +------ + +Wrapped version of web3 with nicer interface to be used across 0x projects and packages + +## Install + +```bash +yarn add @0xproject/web3-wrapper +``` diff --git a/packages/types/package.json b/packages/types/package.json new file mode 100644 index 000000000..f55be284e --- /dev/null +++ b/packages/types/package.json @@ -0,0 +1,32 @@ +{ + "name": "@0xproject/types", + "version": "0.0.1", + "description": "0x types", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "scripts": { + "build": "tsc", + "clean": "shx rm -rf lib", + "lint": "tslint --project . 'src/**/*.ts'" + }, + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/0xProject/0x.js.git" + }, + "bugs": { + "url": "https://github.com/0xProject/0x.js/issues" + }, + "homepage": "https://github.com/0xProject/0x.js/packages/types/README.md", + "devDependencies": { + "@0xproject/tslint-config": "^0.2.0", + "bignumber.js": "^5.0.0", + "shx": "^0.2.2", + "tslint": "5.8.0", + "typescript": "~2.6.1" + }, + "dependencies": { + "bignumber.js": "~4.1.0", + "web3": "^0.20.0" + } +} diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts new file mode 100644 index 000000000..8d69af63d --- /dev/null +++ b/packages/types/src/index.ts @@ -0,0 +1,23 @@ +import {BigNumber} from 'bignumber.js'; +import * as Web3 from 'web3'; + +export interface TxData { + from?: string; + gas?: number; + gasPrice?: BigNumber; + nonce?: number; +} + +export interface TransactionReceipt { + blockHash: string; + blockNumber: number; + transactionHash: string; + transactionIndex: number; + from: string; + to: string; + status: null|0|1; + cumulativeGasUsed: number; + gasUsed: number; + contractAddress: string|null; + logs: Web3.LogEntry[]; +} diff --git a/packages/types/tsconfig.json b/packages/types/tsconfig.json new file mode 100644 index 000000000..de186cfc4 --- /dev/null +++ b/packages/types/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es5", + "lib": [ "es2017", "dom"], + "outDir": "lib", + "sourceMap": true, + "declaration": true, + "noImplicitAny": true, + "strictNullChecks": true + }, + "include": [ + "./src/**/*", + "../../node_modules/web3-typescript-typings/index.d.ts" + ] +} diff --git a/packages/types/tslint.json b/packages/types/tslint.json new file mode 100644 index 000000000..a07795151 --- /dev/null +++ b/packages/types/tslint.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "@0xproject/tslint-config" + ] +} diff --git a/packages/utils/README.md b/packages/utils/README.md new file mode 100644 index 000000000..5191e0350 --- /dev/null +++ b/packages/utils/README.md @@ -0,0 +1,10 @@ +utils +------ + +Utils to be shared across 0x projects and packages + +## Install + +```bash +yarn add @0xproject/utils +``` diff --git a/packages/utils/package.json b/packages/utils/package.json new file mode 100644 index 000000000..f49a95f28 --- /dev/null +++ b/packages/utils/package.json @@ -0,0 +1,33 @@ +{ + "name": "@0xproject/utils", + "version": "0.0.1", + "description": "0x TS utils", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "scripts": { + "build": "tsc", + "clean": "shx rm -rf lib", + "lint": "tslint --project . 'src/**/*.ts'" + }, + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/0xProject/0x.js.git" + }, + "bugs": { + "url": "https://github.com/0xProject/0x.js/issues" + }, + "homepage": "https://github.com/0xProject/0x.js/packages/utils/README.md", + "devDependencies": { + "@0xproject/tslint-config": "^0.2.0", + "@types/lodash": "^4.14.86", + "npm-run-all": "^4.1.2", + "shx": "^0.2.2", + "tslint": "5.8.0", + "typescript": "~2.6.1" + }, + "dependencies": { + "bignumber.js": "~4.1.0", + "lodash": "^4.17.4" + } +} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts new file mode 100644 index 000000000..a61f04ad2 --- /dev/null +++ b/packages/utils/src/index.ts @@ -0,0 +1 @@ +export {promisify} from './promisify'; diff --git a/packages/utils/src/promisify.ts b/packages/utils/src/promisify.ts new file mode 100644 index 000000000..c114cf32f --- /dev/null +++ b/packages/utils/src/promisify.ts @@ -0,0 +1,24 @@ +import * as _ from 'lodash'; + +/** + * Transforms callback-based function -- func(arg1, arg2 .. argN, callback) -- into an ES6-compatible Promise. + * Promisify provides a default callback of the form (error, result) and rejects when `error` is not null. You can also + * supply thisArg object as the second argument which will be passed to `apply`. + */ +export function promisify( + originalFn: ( + ...args: any[], + // HACK: This can't be properly typed without variadic kinds https://github.com/Microsoft/TypeScript/issues/5453 + ) => void, + thisArg?: any, +): (...callArgs: any[]) => Promise { + const promisifiedFunction = async (...callArgs: any[]): Promise => { + return new Promise((resolve, reject) => { + const callback = (err: Error|null, data?: T) => { + _.isNull(err) ? resolve(data) : reject(err); + }; + originalFn.apply(thisArg, [...callArgs, callback]); + }); + }; + return promisifiedFunction; +} diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json new file mode 100644 index 000000000..111df6d3b --- /dev/null +++ b/packages/utils/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es5", + "lib": [ "es2017", "dom"], + "outDir": "lib", + "sourceMap": true, + "declaration": true, + "noImplicitAny": true, + "strictNullChecks": true + }, + "include": [ + "./src/**/*" + ] +} diff --git a/packages/utils/tslint.json b/packages/utils/tslint.json new file mode 100644 index 000000000..a07795151 --- /dev/null +++ b/packages/utils/tslint.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "@0xproject/tslint-config" + ] +} diff --git a/packages/web3-wrapper/README.md b/packages/web3-wrapper/README.md new file mode 100644 index 000000000..0df8c6333 --- /dev/null +++ b/packages/web3-wrapper/README.md @@ -0,0 +1,10 @@ +Web3 wrapper +------ + +Wrapped version of web3 with nicer interface to be used across 0x projects and packages + +## Install + +```bash +yarn add @0xproject/web3-wrapper +``` diff --git a/packages/web3-wrapper/package.json b/packages/web3-wrapper/package.json new file mode 100644 index 000000000..dd1cd54fb --- /dev/null +++ b/packages/web3-wrapper/package.json @@ -0,0 +1,37 @@ +{ + "name": "@0xproject/web3-wrapper", + "version": "0.0.1", + "description": "Wraps around web3 and gives a nicer interface", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "scripts": { + "build": "tsc", + "clean": "shx rm -rf lib", + "lint": "tslint --project . 'src/**/*.ts'" + }, + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/0xProject/0x.js.git" + }, + "bugs": { + "url": "https://github.com/0xProject/0x.js/issues" + }, + "homepage": "https://github.com/0xProject/0x.js/packages/web3-wrapper/README.md", + "devDependencies": { + "@0xproject/tslint-config": "^0.2.0", + "@types/lodash": "^4.14.86", + "npm-run-all": "^4.1.2", + "shx": "^0.2.2", + "tslint": "5.8.0", + "typescript": "~2.6.1", + "web3-typescript-typings": "^0.7.2" + }, + "dependencies": { + "@0xproject/utils": "^0.0.1", + "@0xproject/types": "^0.0.1", + "bignumber.js": "~4.1.0", + "lodash": "^4.17.4", + "web3": "^0.20.0" + } +} diff --git a/packages/web3-wrapper/src/index.ts b/packages/web3-wrapper/src/index.ts new file mode 100644 index 000000000..9b37e5a0d --- /dev/null +++ b/packages/web3-wrapper/src/index.ts @@ -0,0 +1,181 @@ +import {TransactionReceipt, TxData} from '@0xproject/types'; +import {promisify} from '@0xproject/utils'; +import BigNumber from 'bignumber.js'; +import * as _ from 'lodash'; +import * as Web3 from 'web3'; + +interface RawLogEntry { + logIndex: string|null; + transactionIndex: string|null; + transactionHash: string; + blockHash: string|null; + blockNumber: string|null; + address: string; + data: string; + topics: string[]; +} + +export class Web3Wrapper { + private web3: Web3; + private networkId: number; + private defaults: Partial; + private jsonRpcRequestId: number; + constructor(provider: Web3.Provider, networkId: number, defaults?: Partial) { + if (_.isUndefined((provider as any).sendAsync)) { + // Web3@1.0 provider doesn't support synchronous http requests, + // so it only has an async `send` method, instead of a `send` and `sendAsync` in web3@0.x.x` + // We re-assign the send method so that Web3@1.0 providers work with 0x.js + (provider as any).sendAsync = (provider as any).send; + } + this.web3 = new Web3(); + this.networkId = networkId; + this.web3.setProvider(provider); + this.defaults = defaults || {}; + this.jsonRpcRequestId = 0; + } + public getContractDefaults(): Partial { + return this.defaults; + } + public setProvider(provider: Web3.Provider, networkId: number) { + this.networkId = networkId; + this.web3.setProvider(provider); + } + public isAddress(address: string): boolean { + return this.web3.isAddress(address); + } + public async isSenderAddressAvailableAsync(senderAddress: string): Promise { + const addresses = await this.getAvailableAddressesAsync(); + return _.includes(addresses, senderAddress); + } + public async getNodeVersionAsync(): Promise { + const nodeVersion = await promisify(this.web3.version.getNode)(); + return nodeVersion; + } + public async getTransactionReceiptAsync(txHash: string): Promise { + const transactionReceipt = await promisify(this.web3.eth.getTransactionReceipt)(txHash); + if (!_.isNull(transactionReceipt)) { + transactionReceipt.status = this.normalizeTxReceiptStatus(transactionReceipt.status); + } + return transactionReceipt; + } + public getCurrentProvider(): Web3.Provider { + return this.web3.currentProvider; + } + public getNetworkId(): number { + return this.networkId; + } + public toWei(ethAmount: BigNumber): BigNumber { + const balanceWei = this.web3.toWei(ethAmount, 'ether'); + return balanceWei; + } + public async getBalanceInWeiAsync(owner: string): Promise { + let balanceInWei = await promisify(this.web3.eth.getBalance)(owner); + // Rewrap in a new BigNumber + balanceInWei = new BigNumber(balanceInWei); + return balanceInWei; + } + public async getBalanceInEthAsync(owner: string): Promise { + const balanceInWei = await this.getBalanceInWeiAsync(owner); + const balanceEthOldBigNumber = this.web3.fromWei(balanceInWei, 'ether'); + const balanceEth = new BigNumber(balanceEthOldBigNumber); + return balanceEth; + } + public async doesContractExistAtAddressAsync(address: string): Promise { + const code = await promisify(this.web3.eth.getCode)(address); + // Regex matches 0x0, 0x00, 0x in order to accommodate poorly implemented clients + const codeIsEmpty = /^0x0{0,40}$/i.test(code); + return !codeIsEmpty; + } + public async signTransactionAsync(address: string, message: string): Promise { + const signData = await promisify(this.web3.eth.sign)(address, message); + return signData; + } + public async getBlockNumberAsync(): Promise { + const blockNumber = await promisify(this.web3.eth.getBlockNumber)(); + return blockNumber; + } + public async getBlockAsync(blockParam: string|Web3.BlockParam): Promise { + const block = await promisify(this.web3.eth.getBlock)(blockParam); + return block; + } + public async getBlockTimestampAsync(blockParam: string|Web3.BlockParam): Promise { + const {timestamp} = await this.getBlockAsync(blockParam); + return timestamp; + } + public async getAvailableAddressesAsync(): Promise { + const addresses = await promisify(this.web3.eth.getAccounts)(); + return addresses; + } + public async getLogsAsync(filter: Web3.FilterObject): Promise { + let fromBlock = filter.fromBlock; + if (_.isNumber(fromBlock)) { + fromBlock = this.web3.toHex(fromBlock); + } + let toBlock = filter.toBlock; + if (_.isNumber(toBlock)) { + toBlock = this.web3.toHex(toBlock); + } + const serializedFilter = { + ...filter, + fromBlock, + toBlock, + }; + const payload = { + jsonrpc: '2.0', + id: this.jsonRpcRequestId++, + method: 'eth_getLogs', + params: [serializedFilter], + }; + const rawLogs = await this.sendRawPayloadAsync(payload); + const formattedLogs = _.map(rawLogs, this.formatLog.bind(this)); + return formattedLogs; + } + public getContractFromAbi(abi: Web3.ContractAbi): Web3.Contract { + const web3Contract = this.web3.eth.contract(abi); + return web3Contract; + } + public getContractInstance(abi: Web3.ContractAbi, address: string): Web3.ContractInstance { + const web3ContractInstance = this.getContractFromAbi(abi).at(address); + return web3ContractInstance; + } + public async estimateGasAsync(data: string): Promise { + const gas = await promisify(this.web3.eth.estimateGas)({data}); + return gas; + } + private async sendRawPayloadAsync(payload: Web3.JSONRPCRequestPayload): Promise { + const sendAsync = this.web3.currentProvider.sendAsync.bind(this.web3.currentProvider); + const response = await promisify(sendAsync)(payload); + const result = response.result; + return result; + } + private normalizeTxReceiptStatus(status: undefined|null|string|0|1): null|0|1 { + // Transaction status might have four values + // undefined - Testrpc and other old clients + // null - New clients on old transactions + // number - Parity + // hex - Geth + if (_.isString(status)) { + return this.web3.toDecimal(status) as 0|1; + } else if (_.isUndefined(status)) { + return null; + } else { + return status; + } + } + private formatLog(rawLog: RawLogEntry): Web3.LogEntry { + const formattedLog = { + ...rawLog, + logIndex: this.hexToDecimal(rawLog.logIndex), + blockNumber: this.hexToDecimal(rawLog.blockNumber), + transactionIndex: this.hexToDecimal(rawLog.transactionIndex), + }; + return formattedLog; + } + private hexToDecimal(hex: string|null): number|null { + if (_.isNull(hex)) { + return null; + } + const decimal = this.web3.toDecimal(hex); + return decimal; + } +} diff --git a/packages/web3-wrapper/tsconfig.json b/packages/web3-wrapper/tsconfig.json new file mode 100644 index 000000000..de186cfc4 --- /dev/null +++ b/packages/web3-wrapper/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es5", + "lib": [ "es2017", "dom"], + "outDir": "lib", + "sourceMap": true, + "declaration": true, + "noImplicitAny": true, + "strictNullChecks": true + }, + "include": [ + "./src/**/*", + "../../node_modules/web3-typescript-typings/index.d.ts" + ] +} diff --git a/packages/web3-wrapper/tslint.json b/packages/web3-wrapper/tslint.json new file mode 100644 index 000000000..a07795151 --- /dev/null +++ b/packages/web3-wrapper/tslint.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "@0xproject/tslint-config" + ] +} diff --git a/packages/website/package.json b/packages/website/package.json index 68e9e8f47..fdc5de5d7 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -27,7 +27,6 @@ "dateformat": "^2.0.0", "deep-equal": "^1.0.1", "dharma-loan-frame": "^0.0.12", - "es6-promisify": "^5.0.0", "ethereum-address": "^0.0.4", "ethereumjs-tx": "^1.3.3", "ethereumjs-util": "^5.1.1", diff --git a/packages/website/ts/blockchain.ts b/packages/website/ts/blockchain.ts index 31d725a41..9136dc916 100644 --- a/packages/website/ts/blockchain.ts +++ b/packages/website/ts/blockchain.ts @@ -16,9 +16,9 @@ import { ZeroEx, ZeroExError, } from '0x.js'; +import {promisify} from '@0xproject/utils'; import BigNumber from 'bignumber.js'; import compareVersions = require('compare-versions'); -import promisify = require('es6-promisify'); import ethUtil = require('ethereumjs-util'); import findVersions = require('find-versions'); import * as _ from 'lodash'; @@ -65,7 +65,7 @@ export class Blockchain { public nodeVersion: string; private zeroEx: ZeroEx; private dispatcher: Dispatcher; - private web3Wrapper: Web3Wrapper; + private web3Wrapper?: Web3Wrapper; private exchangeAddress: string; private tokenTransferProxy: ContractInstance; private tokenRegistry: ContractInstance; @@ -624,7 +624,7 @@ export class Blockchain { let networkId: number; if (!_.isUndefined(injectedWeb3)) { try { - networkId = _.parseInt(await promisify(injectedWeb3.version.getNetwork)()); + networkId = _.parseInt(await promisify(injectedWeb3.version.getNetwork)()); } catch (err) { // Ignore error and proceed with networkId undefined } diff --git a/packages/website/ts/components/ui/lifecycle_raised_button.tsx b/packages/website/ts/components/ui/lifecycle_raised_button.tsx index 338a3bf76..cba94ca8c 100644 --- a/packages/website/ts/components/ui/lifecycle_raised_button.tsx +++ b/packages/website/ts/components/ui/lifecycle_raised_button.tsx @@ -20,7 +20,7 @@ interface LifeCycleRaisedButtonProps { labelReady: React.ReactNode|string; labelLoading: React.ReactNode|string; labelComplete: React.ReactNode|string; - onClickAsyncFn: () => boolean; + onClickAsyncFn: () => Promise; backgroundColor?: string; labelColor?: string; } diff --git a/packages/website/ts/globals.d.ts b/packages/website/ts/globals.d.ts index c5b94dc45..7bbbb3a98 100644 --- a/packages/website/ts/globals.d.ts +++ b/packages/website/ts/globals.d.ts @@ -1,6 +1,5 @@ declare module 'react-tooltip'; declare module 'react-router-hash-link'; -declare module 'es6-promisify'; declare module 'truffle-contract'; declare module 'ethereumjs-util'; declare module 'keccak'; diff --git a/packages/website/ts/subproviders/redundant_rpc_subprovider.ts b/packages/website/ts/subproviders/redundant_rpc_subprovider.ts index 8dffd4437..d540e6e7b 100644 --- a/packages/website/ts/subproviders/redundant_rpc_subprovider.ts +++ b/packages/website/ts/subproviders/redundant_rpc_subprovider.ts @@ -1,4 +1,4 @@ -import promisify = require('es6-promisify'); +import {promisify} from '@0xproject/utils'; import * as _ from 'lodash'; import {JSONRPCPayload} from 'ts/types'; import RpcSubprovider = require('web3-provider-engine/subproviders/rpc'); diff --git a/packages/website/ts/web3_wrapper.ts b/packages/website/ts/web3_wrapper.ts index c43436c7e..b713f8a33 100644 --- a/packages/website/ts/web3_wrapper.ts +++ b/packages/website/ts/web3_wrapper.ts @@ -1,8 +1,8 @@ +import {promisify} from '@0xproject/utils'; import BigNumber from 'bignumber.js'; -import promisify = require('es6-promisify'); import * as _ from 'lodash'; import {Dispatcher} from 'ts/redux/dispatcher'; -import Web3 = require('web3'); +import * as Web3 from 'web3'; export class Web3Wrapper { private dispatcher: Dispatcher; @@ -28,7 +28,7 @@ export class Web3Wrapper { return this.web3.isAddress(address); } public async getAccountsAsync(): Promise { - const addresses = await promisify(this.web3.eth.getAccounts)(); + const addresses = await promisify(this.web3.eth.getAccounts)(); return addresses; } public async getFirstAccountIfExistsAsync() { @@ -38,8 +38,8 @@ export class Web3Wrapper { } return (addresses)[0]; } - public async getNodeVersionAsync() { - const nodeVersion = await promisify(this.web3.version.getNode)(); + public async getNodeVersionAsync(): Promise { + const nodeVersion = await promisify(this.web3.version.getNode)(); return nodeVersion; } public getProviderObj() { @@ -54,24 +54,24 @@ export class Web3Wrapper { } } public async getBalanceInEthAsync(owner: string): Promise { - const balanceInWei: BigNumber = await promisify(this.web3.eth.getBalance)(owner); + const balanceInWei: BigNumber = await promisify(this.web3.eth.getBalance)(owner); const balanceEthOldBigNumber = this.web3.fromWei(balanceInWei, 'ether'); const balanceEth = new BigNumber(balanceEthOldBigNumber); return balanceEth; } public async doesContractExistAtAddressAsync(address: string): Promise { - const code = await promisify(this.web3.eth.getCode)(address); + const code = await promisify(this.web3.eth.getCode)(address); // Regex matches 0x0, 0x00, 0x in order to accomodate poorly implemented clients const zeroHexAddressRegex = /^0[xX][0]*$/; const didFindCode = _.isNull(code.match(zeroHexAddressRegex)); return didFindCode; } public async signTransactionAsync(address: string, message: string): Promise { - const signData = await promisify(this.web3.eth.sign)(address, message); + const signData = await promisify(this.web3.eth.sign)(address, message); return signData; } public async getBlockTimestampAsync(blockHash: string): Promise { - const {timestamp} = await promisify(this.web3.eth.getBlock)(blockHash); + const {timestamp} = await promisify(this.web3.eth.getBlock)(blockHash); return timestamp; } public destroy() { -- cgit v1.2.3 From 825402b0f91ce266b310aed78e4fa73ae1359d36 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Thu, 7 Dec 2017 01:15:15 +0300 Subject: Address feedback --- packages/contracts/deploy/cli.ts | 1 - packages/contracts/deploy/src/utils/network.ts | 1 - packages/types/README.md | 6 +++--- packages/web3-wrapper/package.json | 2 +- packages/web3-wrapper/src/index.ts | 6 ------ 5 files changed, 4 insertions(+), 12 deletions(-) (limited to 'packages') diff --git a/packages/contracts/deploy/cli.ts b/packages/contracts/deploy/cli.ts index df3ae33b4..0fdf85a9f 100644 --- a/packages/contracts/deploy/cli.ts +++ b/packages/contracts/deploy/cli.ts @@ -1,4 +1,3 @@ -import {TxData} from '@0xproject/types'; import {BigNumber} from 'bignumber.js'; import * as _ from 'lodash'; import * as path from 'path'; diff --git a/packages/contracts/deploy/src/utils/network.ts b/packages/contracts/deploy/src/utils/network.ts index fcb78287c..fc8709e0f 100644 --- a/packages/contracts/deploy/src/utils/network.ts +++ b/packages/contracts/deploy/src/utils/network.ts @@ -1,5 +1,4 @@ import {promisify} from '@0xproject/utils'; -import {Web3Wrapper} from '@0xproject/web3-wrapper'; import * as _ from 'lodash'; import * as Web3 from 'web3'; diff --git a/packages/types/README.md b/packages/types/README.md index 0df8c6333..d4d48b1fe 100644 --- a/packages/types/README.md +++ b/packages/types/README.md @@ -1,10 +1,10 @@ -Web3 wrapper +0x types ------ -Wrapped version of web3 with nicer interface to be used across 0x projects and packages +TS types shared across 0x projects and packages ## Install ```bash -yarn add @0xproject/web3-wrapper +yarn add -D @0xproject/types ``` diff --git a/packages/web3-wrapper/package.json b/packages/web3-wrapper/package.json index dd1cd54fb..4eea7ed31 100644 --- a/packages/web3-wrapper/package.json +++ b/packages/web3-wrapper/package.json @@ -20,6 +20,7 @@ "homepage": "https://github.com/0xProject/0x.js/packages/web3-wrapper/README.md", "devDependencies": { "@0xproject/tslint-config": "^0.2.0", + "@0xproject/types": "^0.0.1", "@types/lodash": "^4.14.86", "npm-run-all": "^4.1.2", "shx": "^0.2.2", @@ -29,7 +30,6 @@ }, "dependencies": { "@0xproject/utils": "^0.0.1", - "@0xproject/types": "^0.0.1", "bignumber.js": "~4.1.0", "lodash": "^4.17.4", "web3": "^0.20.0" diff --git a/packages/web3-wrapper/src/index.ts b/packages/web3-wrapper/src/index.ts index 9b37e5a0d..b823c5c15 100644 --- a/packages/web3-wrapper/src/index.ts +++ b/packages/web3-wrapper/src/index.ts @@ -74,12 +74,6 @@ export class Web3Wrapper { balanceInWei = new BigNumber(balanceInWei); return balanceInWei; } - public async getBalanceInEthAsync(owner: string): Promise { - const balanceInWei = await this.getBalanceInWeiAsync(owner); - const balanceEthOldBigNumber = this.web3.fromWei(balanceInWei, 'ether'); - const balanceEth = new BigNumber(balanceEthOldBigNumber); - return balanceEth; - } public async doesContractExistAtAddressAsync(address: string): Promise { const code = await promisify(this.web3.eth.getCode)(address); // Regex matches 0x0, 0x00, 0x in order to accommodate poorly implemented clients -- cgit v1.2.3 From 3c64b33f5c12e565b1567095034ff4cee86005b4 Mon Sep 17 00:00:00 2001 From: Brandon Millman Date: Thu, 7 Dec 2017 10:35:18 -0800 Subject: Update connect types in preperation for publishing --- packages/connect/CHANGELOG.md | 1 + packages/connect/src/types.ts | 4 +--- packages/connect/src/ws_orderbook_channel.ts | 2 +- packages/connect/test/http_client_test.ts | 6 +++--- 4 files changed, 6 insertions(+), 7 deletions(-) (limited to 'packages') diff --git a/packages/connect/CHANGELOG.md b/packages/connect/CHANGELOG.md index 3637ed2d1..cf507dbe6 100644 --- a/packages/connect/CHANGELOG.md +++ b/packages/connect/CHANGELOG.md @@ -3,6 +3,7 @@ vx.x.x ------------------------ * Expose WebSocketOrderbookChannel and associated types to public interface (#251) + * Remove tokenA and tokenB fields from OrdersRequest (#256) v0.2.0 - _November 29, 2017_ ------------------------ diff --git a/packages/connect/src/types.ts b/packages/connect/src/types.ts index 0657a1d63..d02444a3e 100644 --- a/packages/connect/src/types.ts +++ b/packages/connect/src/types.ts @@ -63,7 +63,7 @@ export interface OrderbookChannelHandler { order: SignedOrder) => void; onError: (channel: OrderbookChannel, subscriptionOpts: OrderbookChannelSubscriptionOpts, err: Error) => void; - onClose: (channel: OrderbookChannel) => void; + onClose: (channel: OrderbookChannel, subscriptionOpts: OrderbookChannelSubscriptionOpts) => void; } export type OrderbookChannelMessage = @@ -128,8 +128,6 @@ export interface OrdersRequest { tokenAddress?: string; makerTokenAddress?: string; takerTokenAddress?: string; - tokenA?: string; - tokenB?: string; maker?: string; taker?: string; trader?: string; diff --git a/packages/connect/src/ws_orderbook_channel.ts b/packages/connect/src/ws_orderbook_channel.ts index 346be20c0..6687025c0 100644 --- a/packages/connect/src/ws_orderbook_channel.ts +++ b/packages/connect/src/ws_orderbook_channel.ts @@ -62,7 +62,7 @@ export class WebSocketOrderbookChannel implements OrderbookChannel { handler.onError(this, subscriptionOpts, wsError); }); connection.on(WebsocketConnectionEventType.Close, () => { - handler.onClose(this); + handler.onClose(this, subscriptionOpts); }); connection.on(WebsocketConnectionEventType.Message, message => { this._handleWebSocketMessage(subscribeMessage.requestId, subscriptionOpts, message, handler); diff --git a/packages/connect/test/http_client_test.ts b/packages/connect/test/http_client_test.ts index 3d72ca185..21e7abb69 100644 --- a/packages/connect/test/http_client_test.ts +++ b/packages/connect/test/http_client_test.ts @@ -61,12 +61,12 @@ describe('HttpClient', () => { const orders = await relayerClient.getOrdersAsync(); expect(orders).to.be.deep.equal(ordersResponse); }); - it('gets specfic orders for request', async () => { + it('gets specific orders for request', async () => { const tokenAddress = '0x323b5d4c32345ced77393b3530b1eed0f346429d'; const ordersRequest = { - tokenA: tokenAddress, + tokenAddress, }; - const urlWithQuery = `${url}?tokenA=${tokenAddress}`; + const urlWithQuery = `${url}?tokenAddress=${tokenAddress}`; fetchMock.get(urlWithQuery, ordersResponseJSON); const orders = await relayerClient.getOrdersAsync(ordersRequest); expect(orders).to.be.deep.equal(ordersResponse); -- cgit v1.2.3 From b362e2c28e9cafa7335bced17ec61fba93b018e6 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 8 Dec 2017 12:51:46 +0300 Subject: Refactor networkId out of web3Wrapper --- packages/0x.js/src/0x.ts | 13 ++++++++++--- packages/0x.js/src/contract_wrappers/contract_wrapper.ts | 12 ++++++------ packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts | 5 +++-- packages/0x.js/src/contract_wrappers/exchange_wrapper.ts | 4 ++-- .../0x.js/src/contract_wrappers/token_registry_wrapper.ts | 4 ++-- .../src/contract_wrappers/token_transfer_proxy_wrapper.ts | 4 ++-- packages/0x.js/src/contract_wrappers/token_wrapper.ts | 4 ++-- packages/0x.js/test/event_watcher_test.ts | 2 +- packages/0x.js/test/token_wrapper_test.ts | 2 +- packages/contracts/deploy/src/deployer.ts | 2 +- packages/contracts/deploy/src/utils/network.ts | 5 +++-- packages/web3-wrapper/src/index.ts | 13 ++++++------- 12 files changed, 39 insertions(+), 31 deletions(-) (limited to 'packages') diff --git a/packages/0x.js/src/0x.ts b/packages/0x.js/src/0x.ts index 1cbfaed0c..935e4ac1a 100644 --- a/packages/0x.js/src/0x.ts +++ b/packages/0x.js/src/0x.ts @@ -179,24 +179,31 @@ export class ZeroEx { const defaults = { gasPrice: config.gasPrice, }; - this._web3Wrapper = new Web3Wrapper(provider, config.networkId, defaults); + this._web3Wrapper = new Web3Wrapper(provider, defaults); this.proxy = new TokenTransferProxyWrapper( this._web3Wrapper, + config.networkId, config.tokenTransferProxyContractAddress, ); this.token = new TokenWrapper( this._web3Wrapper, + config.networkId, this._abiDecoder, this.proxy, ); this.exchange = new ExchangeWrapper( this._web3Wrapper, + config.networkId, this._abiDecoder, this.token, config.exchangeContractAddress, ); - this.tokenRegistry = new TokenRegistryWrapper(this._web3Wrapper, config.tokenRegistryContractAddress); - this.etherToken = new EtherTokenWrapper(this._web3Wrapper, this.token, config.etherTokenContractAddress); + this.tokenRegistry = new TokenRegistryWrapper( + this._web3Wrapper, config.networkId, config.tokenRegistryContractAddress, + ); + this.etherToken = new EtherTokenWrapper( + this._web3Wrapper, config.networkId, this.token, config.etherTokenContractAddress, + ); this.orderStateWatcher = new OrderStateWatcher( this._web3Wrapper, this._abiDecoder, this.token, this.exchange, config.orderWatcherConfig, ); diff --git a/packages/0x.js/src/contract_wrappers/contract_wrapper.ts b/packages/0x.js/src/contract_wrappers/contract_wrapper.ts index 0b6fc031a..d56b8632d 100644 --- a/packages/0x.js/src/contract_wrappers/contract_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/contract_wrapper.ts @@ -32,6 +32,7 @@ const CONTRACT_NAME_TO_NOT_FOUND_ERROR: {[contractName: string]: ZeroExError} = export class ContractWrapper { protected _web3Wrapper: Web3Wrapper; + private _networkId: number; private _abiDecoder?: AbiDecoder; private _blockAndLogStreamer: BlockAndLogStreamer|undefined; private _blockAndLogStreamInterval: NodeJS.Timer; @@ -39,8 +40,9 @@ export class ContractWrapper { private _filterCallbacks: {[filterToken: string]: EventCallback}; private _onLogAddedSubscriptionToken: string|undefined; private _onLogRemovedSubscriptionToken: string|undefined; - constructor(web3Wrapper: Web3Wrapper, abiDecoder?: AbiDecoder) { + constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder?: AbiDecoder) { this._web3Wrapper = web3Wrapper; + this._networkId = networkId; this._abiDecoder = abiDecoder; this._filters = {}; this._filterCallbacks = {}; @@ -104,11 +106,10 @@ export class ContractWrapper { ): Promise { let contractAddress: string; if (_.isUndefined(addressIfExists)) { - const networkId = this._web3Wrapper.getNetworkId(); - if (_.isUndefined(artifact.networks[networkId])) { + if (_.isUndefined(artifact.networks[this._networkId])) { throw new Error(ZeroExError.ContractNotDeployedOnNetwork); } - contractAddress = artifact.networks[networkId].address.toLowerCase(); + contractAddress = artifact.networks[this._networkId].address.toLowerCase(); } else { contractAddress = addressIfExists; } @@ -123,8 +124,7 @@ export class ContractWrapper { } protected _getContractAddress(artifact: Artifact, addressIfExists?: string): string { if (_.isUndefined(addressIfExists)) { - const networkId = this._web3Wrapper.getNetworkId(); - const contractAddress = artifact.networks[networkId].address; + const contractAddress = artifact.networks[this._networkId].address; if (_.isUndefined(contractAddress)) { throw new Error(ZeroExError.ExchangeContractDoesNotExist); } diff --git a/packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts b/packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts index 685ae9a9e..896cfde3d 100644 --- a/packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts @@ -18,8 +18,9 @@ export class EtherTokenWrapper extends ContractWrapper { private _etherTokenContractIfExists?: EtherTokenContract; private _tokenWrapper: TokenWrapper; private _contractAddressIfExists?: string; - constructor(web3Wrapper: Web3Wrapper, tokenWrapper: TokenWrapper, contractAddressIfExists?: string) { - super(web3Wrapper); + constructor(web3Wrapper: Web3Wrapper, networkId: number, tokenWrapper: TokenWrapper, + contractAddressIfExists?: string) { + super(web3Wrapper, networkId); this._tokenWrapper = tokenWrapper; this._contractAddressIfExists = contractAddressIfExists; } diff --git a/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts b/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts index 433d99e4c..1e9865395 100644 --- a/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts @@ -84,9 +84,9 @@ export class ExchangeWrapper extends ContractWrapper { ]; return [orderAddresses, orderValues]; } - constructor(web3Wrapper: Web3Wrapper, abiDecoder: AbiDecoder, + constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder: AbiDecoder, tokenWrapper: TokenWrapper, contractAddressIfExists?: string) { - super(web3Wrapper, abiDecoder); + super(web3Wrapper, networkId, abiDecoder); this._tokenWrapper = tokenWrapper; this._orderValidationUtils = new OrderValidationUtils(tokenWrapper, this); this._contractAddressIfExists = contractAddressIfExists; diff --git a/packages/0x.js/src/contract_wrappers/token_registry_wrapper.ts b/packages/0x.js/src/contract_wrappers/token_registry_wrapper.ts index 80b4c0f85..064b826d8 100644 --- a/packages/0x.js/src/contract_wrappers/token_registry_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/token_registry_wrapper.ts @@ -27,8 +27,8 @@ export class TokenRegistryWrapper extends ContractWrapper { }; return token; } - constructor(web3Wrapper: Web3Wrapper, contractAddressIfExists?: string) { - super(web3Wrapper); + constructor(web3Wrapper: Web3Wrapper, networkId: number, contractAddressIfExists?: string) { + super(web3Wrapper, networkId); this._contractAddressIfExists = contractAddressIfExists; } /** diff --git a/packages/0x.js/src/contract_wrappers/token_transfer_proxy_wrapper.ts b/packages/0x.js/src/contract_wrappers/token_transfer_proxy_wrapper.ts index 7d6943aea..1a16e3540 100644 --- a/packages/0x.js/src/contract_wrappers/token_transfer_proxy_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/token_transfer_proxy_wrapper.ts @@ -13,8 +13,8 @@ import {TokenTransferProxyContract} from './generated/token_transfer_proxy'; export class TokenTransferProxyWrapper extends ContractWrapper { private _tokenTransferProxyContractIfExists?: TokenTransferProxyContract; private _contractAddressIfExists?: string; - constructor(web3Wrapper: Web3Wrapper, contractAddressIfExists?: string) { - super(web3Wrapper); + constructor(web3Wrapper: Web3Wrapper, networkId: number, contractAddressIfExists?: string) { + super(web3Wrapper, networkId); this._contractAddressIfExists = contractAddressIfExists; } /** diff --git a/packages/0x.js/src/contract_wrappers/token_wrapper.ts b/packages/0x.js/src/contract_wrappers/token_wrapper.ts index 1ae26edaa..684f291a5 100644 --- a/packages/0x.js/src/contract_wrappers/token_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/token_wrapper.ts @@ -34,9 +34,9 @@ export class TokenWrapper extends ContractWrapper { public UNLIMITED_ALLOWANCE_IN_BASE_UNITS = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS; private _tokenContractsByAddress: {[address: string]: TokenContract}; private _tokenTransferProxyWrapper: TokenTransferProxyWrapper; - constructor(web3Wrapper: Web3Wrapper, abiDecoder: AbiDecoder, + constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder: AbiDecoder, tokenTransferProxyWrapper: TokenTransferProxyWrapper) { - super(web3Wrapper, abiDecoder); + super(web3Wrapper, networkId, abiDecoder); this._tokenContractsByAddress = {}; this._tokenTransferProxyWrapper = tokenTransferProxyWrapper; } diff --git a/packages/0x.js/test/event_watcher_test.ts b/packages/0x.js/test/event_watcher_test.ts index 41fca4e97..3d92c62a3 100644 --- a/packages/0x.js/test/event_watcher_test.ts +++ b/packages/0x.js/test/event_watcher_test.ts @@ -60,7 +60,7 @@ describe('EventWatcher', () => { before(async () => { web3 = web3Factory.create(); const pollingIntervalMs = 10; - web3Wrapper = new Web3Wrapper(web3.currentProvider, constants.TESTRPC_NETWORK_ID); + web3Wrapper = new Web3Wrapper(web3.currentProvider); eventWatcher = new EventWatcher(web3Wrapper, pollingIntervalMs); }); afterEach(() => { diff --git a/packages/0x.js/test/token_wrapper_test.ts b/packages/0x.js/test/token_wrapper_test.ts index 57cfbea18..ae6016869 100644 --- a/packages/0x.js/test/token_wrapper_test.ts +++ b/packages/0x.js/test/token_wrapper_test.ts @@ -46,7 +46,7 @@ describe('TokenWrapper', () => { before(async () => { web3 = web3Factory.create(); zeroEx = new ZeroEx(web3.currentProvider, config); - web3Wrapper = new Web3Wrapper(web3.currentProvider, config.networkId); + web3Wrapper = new Web3Wrapper(web3.currentProvider); userAddresses = await zeroEx.getAvailableAddressesAsync(); tokens = await zeroEx.tokenRegistry.getTokensAsync(); tokenUtils = new TokenUtils(tokens); diff --git a/packages/contracts/deploy/src/deployer.ts b/packages/contracts/deploy/src/deployer.ts index 2d4f31949..4c8018ecc 100644 --- a/packages/contracts/deploy/src/deployer.ts +++ b/packages/contracts/deploy/src/deployer.ts @@ -31,7 +31,7 @@ export class Deployer { const jsonrpcUrl = `http://localhost:${this.jsonrpcPort}`; const web3Provider = new Web3.providers.HttpProvider(jsonrpcUrl); this.defaults = opts.defaults; - this.web3Wrapper = new Web3Wrapper(web3Provider, this.networkId, this.defaults); + this.web3Wrapper = new Web3Wrapper(web3Provider, this.defaults); } /** * Loads contract artifact and deploys contract with given arguments. diff --git a/packages/contracts/deploy/src/utils/network.ts b/packages/contracts/deploy/src/utils/network.ts index fc8709e0f..f9776bb97 100644 --- a/packages/contracts/deploy/src/utils/network.ts +++ b/packages/contracts/deploy/src/utils/network.ts @@ -1,4 +1,5 @@ import {promisify} from '@0xproject/utils'; +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import * as _ from 'lodash'; import * as Web3 from 'web3'; @@ -6,8 +7,8 @@ export const network = { async getNetworkIdIfExistsAsync(port: number): Promise { const url = `http://localhost:${port}`; const web3Provider = new Web3.providers.HttpProvider(url); - const web3 = new Web3(web3Provider); - const networkId = _.parseInt(await promisify(web3.version.getNetwork)()); + const web3Wrapper = new Web3Wrapper(web3Provider); + const networkId = web3Wrapper.getNetworkIdAsync(); return networkId; }, }; diff --git a/packages/web3-wrapper/src/index.ts b/packages/web3-wrapper/src/index.ts index b823c5c15..7df24e9a5 100644 --- a/packages/web3-wrapper/src/index.ts +++ b/packages/web3-wrapper/src/index.ts @@ -17,10 +17,9 @@ interface RawLogEntry { export class Web3Wrapper { private web3: Web3; - private networkId: number; private defaults: Partial; private jsonRpcRequestId: number; - constructor(provider: Web3.Provider, networkId: number, defaults?: Partial) { + constructor(provider: Web3.Provider, defaults?: Partial) { if (_.isUndefined((provider as any).sendAsync)) { // Web3@1.0 provider doesn't support synchronous http requests, // so it only has an async `send` method, instead of a `send` and `sendAsync` in web3@0.x.x` @@ -28,7 +27,6 @@ export class Web3Wrapper { (provider as any).sendAsync = (provider as any).send; } this.web3 = new Web3(); - this.networkId = networkId; this.web3.setProvider(provider); this.defaults = defaults || {}; this.jsonRpcRequestId = 0; @@ -37,7 +35,6 @@ export class Web3Wrapper { return this.defaults; } public setProvider(provider: Web3.Provider, networkId: number) { - this.networkId = networkId; this.web3.setProvider(provider); } public isAddress(address: string): boolean { @@ -51,6 +48,11 @@ export class Web3Wrapper { const nodeVersion = await promisify(this.web3.version.getNode)(); return nodeVersion; } + public async getNetworkIdAsync(): Promise { + const networkIdStr = await promisify(this.web3.version.getNetwork)(); + const networkId = _.parseInt(networkIdStr); + return networkId; + } public async getTransactionReceiptAsync(txHash: string): Promise { const transactionReceipt = await promisify(this.web3.eth.getTransactionReceipt)(txHash); if (!_.isNull(transactionReceipt)) { @@ -61,9 +63,6 @@ export class Web3Wrapper { public getCurrentProvider(): Web3.Provider { return this.web3.currentProvider; } - public getNetworkId(): number { - return this.networkId; - } public toWei(ethAmount: BigNumber): BigNumber { const balanceWei = this.web3.toWei(ethAmount, 'ether'); return balanceWei; -- cgit v1.2.3 From 72ced622d7fddac4d17b7814f45aeea01db23959 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 8 Dec 2017 13:25:00 +0300 Subject: Stop supporting different file extensions in abi-gen --- packages/abi-gen/README.md | 7 +++---- packages/abi-gen/src/index.ts | 7 +------ 2 files changed, 4 insertions(+), 10 deletions(-) (limited to 'packages') diff --git a/packages/abi-gen/README.md b/packages/abi-gen/README.md index f1f8bd08f..b3e996269 100644 --- a/packages/abi-gen/README.md +++ b/packages/abi-gen/README.md @@ -1,6 +1,6 @@ # ABI Gen -This package allows you to generate contract wrappers in any language from ABI files. +This package allows you to generate TypeScript contract wrappers from ABI files. It's heavily inspired by [Geth abigen](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) but takes a different approach. You can write your custom handlebars templates which will allow you to seamlessly integrate the generated code into your existing codebase with existing conventions. @@ -18,10 +18,9 @@ Options: --abiGlob Glob pattern to search for ABI JSON files [string] [required] --templates Folder where to search for templates [string] [required] --output Folder where to put the output files [string] [required] - --fileExtension The extension of the output file [string] [required] ``` ## ABI files -You're required to pass a [glob](https://en.wikipedia.org/wiki/Glob_(programming) template where your abi files are located. +You're required to pass a [glob](https://en.wikipedia.org/wiki/Glob_(programming)) template where your abi files are located. TL;DR - here is the example from 0x.js. `--abiGlob 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken|TokenRegistry).json` @@ -34,7 +33,7 @@ The best way to get started is to copy [0x.js templates](https://github.com/0xPr We use [handlebars](handlebarsjs.com) template engine under the hood. You need to have a master template called `contract.mustache`. it will be used to generate each contract wrapper. Although - you don't need and probably shouldn't write all your logic in a single template file. You can write [partial templates](http://handlebarsjs.com/partials.html) and as long as they are within a partials folder - they will be registered and available. ## Which data/context do I get in my templates? -For now you don't get much on top of methods abi and a contract name because it was enough for our use-case, but if you need something else - create a PR. +For now you don't get much on top of methods abi, some usefull helpers and a contract name because it was enough for our use-case, but if you need something else - create a PR. [Type definition](https://github.com/0xProject/0x.js/tree/development/packages/abi-gen/src/types.ts) of what we pass to a render method. ## 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. diff --git a/packages/abi-gen/src/index.ts b/packages/abi-gen/src/index.ts index 12b78f96f..19d289e49 100644 --- a/packages/abi-gen/src/index.ts +++ b/packages/abi-gen/src/index.ts @@ -33,16 +33,11 @@ const args = yargs type: 'string', demand: true, }) - .option('fileExtension', { - describe: 'The extension of the output file', - type: 'string', - demand: true, - }) .argv; function writeOutputFile(name: string, renderedTsCode: string): void { const fileName = toSnakeCase(name); - const filePath = `${args.output}/${fileName}.${args.fileExtension}`; + const filePath = `${args.output}/${fileName}.ts`; fs.writeFileSync(filePath, renderedTsCode); utils.log(`Created: ${chalk.bold(filePath)}`); } -- cgit v1.2.3 From e0d79bd332a3f8a9cad5147f33b2bfaf49e6a5c7 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 8 Dec 2017 18:47:50 +0300 Subject: Inline network module --- packages/contracts/deploy/cli.ts | 21 ++++++++++++++------- packages/contracts/deploy/src/utils/network.ts | 14 -------------- 2 files changed, 14 insertions(+), 21 deletions(-) delete mode 100644 packages/contracts/deploy/src/utils/network.ts (limited to 'packages') diff --git a/packages/contracts/deploy/cli.ts b/packages/contracts/deploy/cli.ts index 0fdf85a9f..423523e21 100644 --- a/packages/contracts/deploy/cli.ts +++ b/packages/contracts/deploy/cli.ts @@ -1,10 +1,11 @@ +import {Web3Wrapper} from '@0xproject/web3-wrapper'; import {BigNumber} from 'bignumber.js'; import * as _ from 'lodash'; import * as path from 'path'; +import * as Web3 from 'web3'; import * as yargs from 'yargs'; import {commands} from './src/commands'; -import {network} from './src/utils/network'; import { CliOptions, CompilerOptions, @@ -37,10 +38,13 @@ async function onCompileCommand(args: CliOptions): Promise { * @param argv Instance of process.argv provided by yargs. */ async function onMigrateCommand(argv: CliOptions): Promise { - const networkIdIfExists = await network.getNetworkIdIfExistsAsync(argv.jsonrpcPort); + const url = `http://localhost:${argv.jsonrpcPort}`; + const web3Provider = new Web3.providers.HttpProvider(url); + const web3Wrapper = new Web3Wrapper(web3Provider); + const networkId = await web3Wrapper.getNetworkIdAsync(); const compilerOpts: CompilerOptions = { contractsDir: argv.contractsDir, - networkId: networkIdIfExists, + networkId, optimizerEnabled: argv.shouldOptimize ? 1 : 0, artifactsDir: argv.artifactsDir, }; @@ -53,7 +57,7 @@ async function onMigrateCommand(argv: CliOptions): Promise { const deployerOpts = { artifactsDir: argv.artifactsDir, jsonrpcPort: argv.jsonrpcPort, - networkId: networkIdIfExists, + networkId, defaults, }; await commands.migrateAsync(deployerOpts); @@ -63,10 +67,13 @@ async function onMigrateCommand(argv: CliOptions): Promise { * @param argv Instance of process.argv provided by yargs. */ async function onDeployCommand(argv: CliOptions): Promise { - const networkIdIfExists = await network.getNetworkIdIfExistsAsync(argv.jsonrpcPort); + const url = `http://localhost:${argv.jsonrpcPort}`; + const web3Provider = new Web3.providers.HttpProvider(url); + const web3Wrapper = new Web3Wrapper(web3Provider); + const networkId = await web3Wrapper.getNetworkIdAsync(); const compilerOpts: CompilerOptions = { contractsDir: argv.contractsDir, - networkId: networkIdIfExists, + networkId, optimizerEnabled: argv.shouldOptimize ? 1 : 0, artifactsDir: argv.artifactsDir, }; @@ -79,7 +86,7 @@ async function onDeployCommand(argv: CliOptions): Promise { const deployerOpts: DeployerOptions = { artifactsDir: argv.artifactsDir, jsonrpcPort: argv.jsonrpcPort, - networkId: networkIdIfExists, + networkId, defaults, }; const deployerArgsString = argv.args; diff --git a/packages/contracts/deploy/src/utils/network.ts b/packages/contracts/deploy/src/utils/network.ts deleted file mode 100644 index f9776bb97..000000000 --- a/packages/contracts/deploy/src/utils/network.ts +++ /dev/null @@ -1,14 +0,0 @@ -import {promisify} from '@0xproject/utils'; -import {Web3Wrapper} from '@0xproject/web3-wrapper'; -import * as _ from 'lodash'; -import * as Web3 from 'web3'; - -export const network = { - async getNetworkIdIfExistsAsync(port: number): Promise { - const url = `http://localhost:${port}`; - const web3Provider = new Web3.providers.HttpProvider(url); - const web3Wrapper = new Web3Wrapper(web3Provider); - const networkId = web3Wrapper.getNetworkIdAsync(); - return networkId; - }, -}; -- cgit v1.2.3 From 5eea829be9f5e8669c40dac965231051b668ed37 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Fri, 8 Dec 2017 11:05:53 -0600 Subject: Update README.md --- packages/abi-gen/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'packages') diff --git a/packages/abi-gen/README.md b/packages/abi-gen/README.md index b3e996269..16dd9b969 100644 --- a/packages/abi-gen/README.md +++ b/packages/abi-gen/README.md @@ -8,7 +8,7 @@ For an example of the generated [wrapper files](https://github.com/0xProject/0x. [Here](https://github.com/0xProject/0x.js/tree/development/packages/abi-gen-templates) are the templates used to generate those files. ## Instalation -`yarn add -g abi-gen` +`yarn add -g @0xproject/abi-gen` ## Usage ``` abi-gen @@ -33,7 +33,7 @@ The best way to get started is to copy [0x.js templates](https://github.com/0xPr We use [handlebars](handlebarsjs.com) template engine under the hood. You need to have a master template called `contract.mustache`. it will be used to generate each contract wrapper. Although - you don't need and probably shouldn't write all your logic in a single template file. You can write [partial templates](http://handlebarsjs.com/partials.html) and as long as they are within a partials folder - they will be registered and available. ## Which data/context do I get in my templates? -For now you don't get much on top of methods abi, some usefull helpers and a contract name because it was enough for our use-case, but if you need something else - create a PR. -[Type definition](https://github.com/0xProject/0x.js/tree/development/packages/abi-gen/src/types.ts) of what we pass to a render method. +For now you don't get much on top of methods abi, some useful helpers and a contract name because it was enough for our use-case, but if you need something else - create a PR. +See the [type definition](https://github.com/0xProject/0x.js/tree/development/packages/abi-gen/src/types.ts) of what we pass to the render method. ## 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. -- cgit v1.2.3