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 --- package.json | 3 +- 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 +- scripts/postpublish_utils.js | 2 +- yarn.lock | 12 +- 71 files changed, 553 insertions(+), 462 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 diff --git a/package.json b/package.json index 091ae1069..dcaf34eba 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ "lerna": "^2.5.1", "async-child-process": "^1.1.1", "semver-sort": "^0.0.4", - "publish-release": "0xproject/publish-release", - "es6-promisify": "^5.0.0" + "publish-release": "0xproject/publish-release" } } 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() { diff --git a/scripts/postpublish_utils.js b/scripts/postpublish_utils.js index e2c23ee14..e9563a51c 100644 --- a/scripts/postpublish_utils.js +++ b/scripts/postpublish_utils.js @@ -1,6 +1,6 @@ const execAsync = require('async-child-process').execAsync; const semverSort = require('semver-sort'); -const promisify = require('es6-promisify'); +import {promisify} from '@0xproject/utils'; const publishRelease = require('publish-release'); const publishReleaseAsync = promisify(publishRelease); diff --git a/yarn.lock b/yarn.lock index a232f3318..7adc2837b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -102,6 +102,10 @@ version "4.6.2" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.6.2.tgz#12cfaba693ba20f114ed5765467ff25fdf67ddb0" +"@types/isomorphic-fetch@^0.0.34": + version "0.0.34" + resolved "https://registry.yarnpkg.com/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.34.tgz#3c3483e606c041378438e951464f00e4e60706d6" + "@types/jsonschema@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/jsonschema/-/jsonschema-1.1.1.tgz#08703dfe074010e8e829123111594af731f57b1a" @@ -163,7 +167,7 @@ dependencies: moment "*" -"@types/node@*", "@types/node@^8.0.1": +"@types/node@*": version "8.0.51" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.51.tgz#b31d716fb8d58eeb95c068a039b9b6292817d5fb" @@ -1277,6 +1281,10 @@ bignumber.js@^4.0.2, bignumber.js@^4.1.0, bignumber.js@~4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1" +bignumber.js@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-5.0.0.tgz#fbce63f09776b3000a83185badcde525daf34833" + "bignumber.js@git+https://github.com/debris/bignumber.js#master": version "2.0.7" resolved "git+https://github.com/debris/bignumber.js#c7a38de919ed75e6fb6ba38051986e294b328df9" @@ -5617,7 +5625,7 @@ normalize-url@^1.4.0: query-string "^4.1.0" sort-keys "^1.0.0" -npm-run-all@^4.1.2: +npm-run-all@^4.1.1, npm-run-all@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.2.tgz#90d62d078792d20669139e718621186656cea056" dependencies: -- cgit v1.2.3