Merge branch 'development' into feature/addSubproviders

* development:
  Update README.md
  Inline network module
  Stop supporting different file extensions in abi-gen
  Refactor networkId out of web3Wrapper
  Update connect types in preperation for publishing
  Fix CI command
  Address feedback
  Refactor web3Wrapper to a separate package

# Conflicts:
#	package.json
#	packages/website/ts/blockchain.ts
This commit is contained in:
Fabio Berger 2017-12-08 11:21:51 -06:00
commit af8d24d0eb
75 changed files with 404 additions and 331 deletions

View File

@ -19,7 +19,7 @@ jobs:
- run: wget https://s3.amazonaws.com/testrpc-shapshots/${CONTRACTS_COMMIT_HASH}.zip - run: wget https://s3.amazonaws.com/testrpc-shapshots/${CONTRACTS_COMMIT_HASH}.zip
- run: unzip ${CONTRACTS_COMMIT_HASH}.zip -d testrpc_snapshot - run: unzip ${CONTRACTS_COMMIT_HASH}.zip -d testrpc_snapshot
- run: node ./node_modules/lerna/bin/lerna.js bootstrap - run: node ./node_modules/lerna/bin/lerna.js bootstrap
- run: yarn lerna:run bootstrap - run: yarn lerna:run build
- run: - run:
name: testrpc name: testrpc
command: npm run testrpc -- --db testrpc_snapshot command: npm run testrpc -- --db testrpc_snapshot

View File

@ -17,7 +17,6 @@
"async-child-process": "^1.1.1", "async-child-process": "^1.1.1",
"semver-sort": "^0.0.4", "semver-sort": "^0.0.4",
"publish-release": "0xproject/publish-release", "publish-release": "0xproject/publish-release",
"es6-promisify": "^5.0.0",
"ethereumjs-testrpc": "6.0.3" "ethereumjs-testrpc": "6.0.3"
} }
} }

View File

@ -46,8 +46,7 @@
}, },
"devDependencies": { "devDependencies": {
"@0xproject/tslint-config": "^0.2.0", "@0xproject/tslint-config": "^0.2.0",
"abi-gen": "^0.0.0", "@0xproject/types": "^0.0.1",
"abi-gen-templates": "^0.0.0",
"@types/bintrees": "^1.0.2", "@types/bintrees": "^1.0.2",
"@types/jsonschema": "^1.1.1", "@types/jsonschema": "^1.1.1",
"@types/lodash": "^4.14.86", "@types/lodash": "^4.14.86",
@ -55,6 +54,8 @@
"@types/node": "^8.0.53", "@types/node": "^8.0.53",
"@types/sinon": "^2.2.2", "@types/sinon": "^2.2.2",
"@types/uuid": "^3.4.2", "@types/uuid": "^3.4.2",
"abi-gen": "^0.0.1",
"abi-gen-templates": "^0.0.1",
"awesome-typescript-loader": "^3.1.3", "awesome-typescript-loader": "^3.1.3",
"chai": "^4.0.1", "chai": "^4.0.1",
"chai-as-promised": "^7.1.0", "chai-as-promised": "^7.1.0",
@ -87,6 +88,8 @@
"dependencies": { "dependencies": {
"@0xproject/assert": "^0.0.6", "@0xproject/assert": "^0.0.6",
"@0xproject/json-schemas": "^0.6.9", "@0xproject/json-schemas": "^0.6.9",
"@0xproject/utils": "^0.0.1",
"@0xproject/web3-wrapper": "^0.0.1",
"bignumber.js": "~4.1.0", "bignumber.js": "~4.1.0",
"bintrees": "^1.0.2", "bintrees": "^1.0.2",
"bn.js": "^4.11.8", "bn.js": "^4.11.8",

View File

@ -1,4 +1,5 @@
import {schemas, SchemaValidator} from '@0xproject/json-schemas'; import {schemas, SchemaValidator} from '@0xproject/json-schemas';
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import BigNumber from 'bignumber.js'; import BigNumber from 'bignumber.js';
import * as ethUtil from 'ethereumjs-util'; import * as ethUtil from 'ethereumjs-util';
import * as _ from 'lodash'; import * as _ from 'lodash';
@ -29,7 +30,6 @@ import {intervalUtils} from './utils/interval_utils';
import {OrderStateUtils} from './utils/order_state_utils'; import {OrderStateUtils} from './utils/order_state_utils';
import {signatureUtils} from './utils/signature_utils'; import {signatureUtils} from './utils/signature_utils';
import {utils} from './utils/utils'; import {utils} from './utils/utils';
import {Web3Wrapper} from './web3_wrapper';
// Customize our BigNumber instances // Customize our BigNumber instances
bigNumberConfigs.configure(); bigNumberConfigs.configure();
@ -179,24 +179,31 @@ export class ZeroEx {
const defaults = { const defaults = {
gasPrice: config.gasPrice, gasPrice: config.gasPrice,
}; };
this._web3Wrapper = new Web3Wrapper(provider, config.networkId, defaults); this._web3Wrapper = new Web3Wrapper(provider, defaults);
this.proxy = new TokenTransferProxyWrapper( this.proxy = new TokenTransferProxyWrapper(
this._web3Wrapper, this._web3Wrapper,
config.networkId,
config.tokenTransferProxyContractAddress, config.tokenTransferProxyContractAddress,
); );
this.token = new TokenWrapper( this.token = new TokenWrapper(
this._web3Wrapper, this._web3Wrapper,
config.networkId,
this._abiDecoder, this._abiDecoder,
this.proxy, this.proxy,
); );
this.exchange = new ExchangeWrapper( this.exchange = new ExchangeWrapper(
this._web3Wrapper, this._web3Wrapper,
config.networkId,
this._abiDecoder, this._abiDecoder,
this.token, this.token,
config.exchangeContractAddress, config.exchangeContractAddress,
); );
this.tokenRegistry = new TokenRegistryWrapper(this._web3Wrapper, config.tokenRegistryContractAddress); this.tokenRegistry = new TokenRegistryWrapper(
this.etherToken = new EtherTokenWrapper(this._web3Wrapper, this.token, config.etherTokenContractAddress); this._web3Wrapper, config.networkId, config.tokenRegistryContractAddress,
);
this.etherToken = new EtherTokenWrapper(
this._web3Wrapper, config.networkId, this.token, config.etherTokenContractAddress,
);
this.orderStateWatcher = new OrderStateWatcher( this.orderStateWatcher = new OrderStateWatcher(
this._web3Wrapper, this._abiDecoder, this.token, this.exchange, config.orderWatcherConfig, this._web3Wrapper, this._abiDecoder, this.token, this.exchange, config.orderWatcherConfig,
); );

View File

@ -1,3 +1,4 @@
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import {Block, BlockAndLogStreamer} from 'ethereumjs-blockstream'; import {Block, BlockAndLogStreamer} from 'ethereumjs-blockstream';
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
@ -19,10 +20,19 @@ import {AbiDecoder} from '../utils/abi_decoder';
import {constants} from '../utils/constants'; import {constants} from '../utils/constants';
import {filterUtils} from '../utils/filter_utils'; import {filterUtils} from '../utils/filter_utils';
import {intervalUtils} from '../utils/interval_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 { export class ContractWrapper {
protected _web3Wrapper: Web3Wrapper; protected _web3Wrapper: Web3Wrapper;
private _networkId: number;
private _abiDecoder?: AbiDecoder; private _abiDecoder?: AbiDecoder;
private _blockAndLogStreamer: BlockAndLogStreamer|undefined; private _blockAndLogStreamer: BlockAndLogStreamer|undefined;
private _blockAndLogStreamInterval: NodeJS.Timer; private _blockAndLogStreamInterval: NodeJS.Timer;
@ -30,8 +40,9 @@ export class ContractWrapper {
private _filterCallbacks: {[filterToken: string]: EventCallback<ContractEventArgs>}; private _filterCallbacks: {[filterToken: string]: EventCallback<ContractEventArgs>};
private _onLogAddedSubscriptionToken: string|undefined; private _onLogAddedSubscriptionToken: string|undefined;
private _onLogRemovedSubscriptionToken: string|undefined; private _onLogRemovedSubscriptionToken: string|undefined;
constructor(web3Wrapper: Web3Wrapper, abiDecoder?: AbiDecoder) { constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder?: AbiDecoder) {
this._web3Wrapper = web3Wrapper; this._web3Wrapper = web3Wrapper;
this._networkId = networkId;
this._abiDecoder = abiDecoder; this._abiDecoder = abiDecoder;
this._filters = {}; this._filters = {};
this._filterCallbacks = {}; this._filterCallbacks = {};
@ -93,15 +104,27 @@ export class ContractWrapper {
protected async _instantiateContractIfExistsAsync( protected async _instantiateContractIfExistsAsync(
artifact: Artifact, addressIfExists?: string, artifact: Artifact, addressIfExists?: string,
): Promise<Web3.ContractInstance> { ): Promise<Web3.ContractInstance> {
const web3ContractInstance = await this._web3Wrapper.getContractInstanceFromArtifactAsync( let contractAddress: string;
artifact, addressIfExists, if (_.isUndefined(addressIfExists)) {
if (_.isUndefined(artifact.networks[this._networkId])) {
throw new Error(ZeroExError.ContractNotDeployedOnNetwork);
}
contractAddress = artifact.networks[this._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 { protected _getContractAddress(artifact: Artifact, addressIfExists?: string): string {
if (_.isUndefined(addressIfExists)) { if (_.isUndefined(addressIfExists)) {
const networkId = this._web3Wrapper.getNetworkId(); const contractAddress = artifact.networks[this._networkId].address;
const contractAddress = artifact.networks[networkId].address;
if (_.isUndefined(contractAddress)) { if (_.isUndefined(contractAddress)) {
throw new Error(ZeroExError.ExchangeContractDoesNotExist); throw new Error(ZeroExError.ExchangeContractDoesNotExist);
} }

View File

@ -1,10 +1,10 @@
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import BigNumber from 'bignumber.js'; import BigNumber from 'bignumber.js';
import * as _ from 'lodash'; import * as _ from 'lodash';
import {artifacts} from '../artifacts'; import {artifacts} from '../artifacts';
import {TransactionOpts, ZeroExError} from '../types'; import {TransactionOpts, ZeroExError} from '../types';
import {assert} from '../utils/assert'; import {assert} from '../utils/assert';
import {Web3Wrapper} from '../web3_wrapper';
import {ContractWrapper} from './contract_wrapper'; import {ContractWrapper} from './contract_wrapper';
import {EtherTokenContract} from './generated/ether_token'; import {EtherTokenContract} from './generated/ether_token';
@ -18,8 +18,9 @@ export class EtherTokenWrapper extends ContractWrapper {
private _etherTokenContractIfExists?: EtherTokenContract; private _etherTokenContractIfExists?: EtherTokenContract;
private _tokenWrapper: TokenWrapper; private _tokenWrapper: TokenWrapper;
private _contractAddressIfExists?: string; private _contractAddressIfExists?: string;
constructor(web3Wrapper: Web3Wrapper, tokenWrapper: TokenWrapper, contractAddressIfExists?: string) { constructor(web3Wrapper: Web3Wrapper, networkId: number, tokenWrapper: TokenWrapper,
super(web3Wrapper); contractAddressIfExists?: string) {
super(web3Wrapper, networkId);
this._tokenWrapper = tokenWrapper; this._tokenWrapper = tokenWrapper;
this._contractAddressIfExists = contractAddressIfExists; this._contractAddressIfExists = contractAddressIfExists;
} }

View File

@ -1,4 +1,5 @@
import {schemas} from '@0xproject/json-schemas'; import {schemas} from '@0xproject/json-schemas';
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import BigNumber from 'bignumber.js'; import BigNumber from 'bignumber.js';
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
@ -36,7 +37,6 @@ import {decorators} from '../utils/decorators';
import {ExchangeTransferSimulator} from '../utils/exchange_transfer_simulator'; import {ExchangeTransferSimulator} from '../utils/exchange_transfer_simulator';
import {OrderValidationUtils} from '../utils/order_validation_utils'; import {OrderValidationUtils} from '../utils/order_validation_utils';
import {utils} from '../utils/utils'; import {utils} from '../utils/utils';
import {Web3Wrapper} from '../web3_wrapper';
import {ContractWrapper} from './contract_wrapper'; import {ContractWrapper} from './contract_wrapper';
import {ExchangeContract} from './generated/exchange'; import {ExchangeContract} from './generated/exchange';
@ -84,9 +84,9 @@ export class ExchangeWrapper extends ContractWrapper {
]; ];
return [orderAddresses, orderValues]; return [orderAddresses, orderValues];
} }
constructor(web3Wrapper: Web3Wrapper, abiDecoder: AbiDecoder, constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder: AbiDecoder,
tokenWrapper: TokenWrapper, contractAddressIfExists?: string) { tokenWrapper: TokenWrapper, contractAddressIfExists?: string) {
super(web3Wrapper, abiDecoder); super(web3Wrapper, networkId, abiDecoder);
this._tokenWrapper = tokenWrapper; this._tokenWrapper = tokenWrapper;
this._orderValidationUtils = new OrderValidationUtils(tokenWrapper, this); this._orderValidationUtils = new OrderValidationUtils(tokenWrapper, this);
this._contractAddressIfExists = contractAddressIfExists; this._contractAddressIfExists = contractAddressIfExists;

View File

@ -2,12 +2,12 @@
* This file is auto-generated using abi-gen. Don't edit directly. * 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. * 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 {BigNumber} from 'bignumber.js';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
import {TxData, TxDataPayable} from '../../types'; import {TxData, TxDataPayable} from '../../types';
import {classUtils} from '../../utils/class_utils'; import {classUtils} from '../../utils/class_utils';
import {promisify} from '../../utils/promisify';
import {BaseContract} from './base_contract'; import {BaseContract} from './base_contract';

View File

@ -2,12 +2,12 @@
* This file is auto-generated using abi-gen. Don't edit directly. * 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. * 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 {BigNumber} from 'bignumber.js';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
import {TxData, TxDataPayable} from '../../types'; import {TxData, TxDataPayable} from '../../types';
import {classUtils} from '../../utils/class_utils'; import {classUtils} from '../../utils/class_utils';
import {promisify} from '../../utils/promisify';
import {BaseContract} from './base_contract'; import {BaseContract} from './base_contract';

View File

@ -2,12 +2,12 @@
* This file is auto-generated using abi-gen. Don't edit directly. * 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. * 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 {BigNumber} from 'bignumber.js';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
import {TxData, TxDataPayable} from '../../types'; import {TxData, TxDataPayable} from '../../types';
import {classUtils} from '../../utils/class_utils'; import {classUtils} from '../../utils/class_utils';
import {promisify} from '../../utils/promisify';
import {BaseContract} from './base_contract'; import {BaseContract} from './base_contract';

View File

@ -2,12 +2,12 @@
* This file is auto-generated using abi-gen. Don't edit directly. * 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. * 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 {BigNumber} from 'bignumber.js';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
import {TxData, TxDataPayable} from '../../types'; import {TxData, TxDataPayable} from '../../types';
import {classUtils} from '../../utils/class_utils'; import {classUtils} from '../../utils/class_utils';
import {promisify} from '../../utils/promisify';
import {BaseContract} from './base_contract'; import {BaseContract} from './base_contract';

View File

@ -2,12 +2,12 @@
* This file is auto-generated using abi-gen. Don't edit directly. * 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. * 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 {BigNumber} from 'bignumber.js';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
import {TxData, TxDataPayable} from '../../types'; import {TxData, TxDataPayable} from '../../types';
import {classUtils} from '../../utils/class_utils'; import {classUtils} from '../../utils/class_utils';
import {promisify} from '../../utils/promisify';
import {BaseContract} from './base_contract'; import {BaseContract} from './base_contract';

View File

@ -1,10 +1,10 @@
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import * as _ from 'lodash'; import * as _ from 'lodash';
import {artifacts} from '../artifacts'; import {artifacts} from '../artifacts';
import {Token, TokenMetadata, ZeroExError} from '../types'; import {Token, TokenMetadata, ZeroExError} from '../types';
import {assert} from '../utils/assert'; import {assert} from '../utils/assert';
import {constants} from '../utils/constants'; import {constants} from '../utils/constants';
import {Web3Wrapper} from '../web3_wrapper';
import {ContractWrapper} from './contract_wrapper'; import {ContractWrapper} from './contract_wrapper';
import {TokenRegistryContract} from './generated/token_registry'; import {TokenRegistryContract} from './generated/token_registry';
@ -27,8 +27,8 @@ export class TokenRegistryWrapper extends ContractWrapper {
}; };
return token; return token;
} }
constructor(web3Wrapper: Web3Wrapper, contractAddressIfExists?: string) { constructor(web3Wrapper: Web3Wrapper, networkId: number, contractAddressIfExists?: string) {
super(web3Wrapper); super(web3Wrapper, networkId);
this._contractAddressIfExists = contractAddressIfExists; this._contractAddressIfExists = contractAddressIfExists;
} }
/** /**

View File

@ -1,8 +1,8 @@
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import * as _ from 'lodash'; import * as _ from 'lodash';
import {artifacts} from '../artifacts'; import {artifacts} from '../artifacts';
import {ZeroExError} from '../types'; import {ZeroExError} from '../types';
import {Web3Wrapper} from '../web3_wrapper';
import {ContractWrapper} from './contract_wrapper'; import {ContractWrapper} from './contract_wrapper';
import {TokenTransferProxyContract} from './generated/token_transfer_proxy'; import {TokenTransferProxyContract} from './generated/token_transfer_proxy';
@ -13,8 +13,8 @@ import {TokenTransferProxyContract} from './generated/token_transfer_proxy';
export class TokenTransferProxyWrapper extends ContractWrapper { export class TokenTransferProxyWrapper extends ContractWrapper {
private _tokenTransferProxyContractIfExists?: TokenTransferProxyContract; private _tokenTransferProxyContractIfExists?: TokenTransferProxyContract;
private _contractAddressIfExists?: string; private _contractAddressIfExists?: string;
constructor(web3Wrapper: Web3Wrapper, contractAddressIfExists?: string) { constructor(web3Wrapper: Web3Wrapper, networkId: number, contractAddressIfExists?: string) {
super(web3Wrapper); super(web3Wrapper, networkId);
this._contractAddressIfExists = contractAddressIfExists; this._contractAddressIfExists = contractAddressIfExists;
} }
/** /**

View File

@ -1,4 +1,5 @@
import {schemas} from '@0xproject/json-schemas'; import {schemas} from '@0xproject/json-schemas';
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import BigNumber from 'bignumber.js'; import BigNumber from 'bignumber.js';
import * as _ from 'lodash'; import * as _ from 'lodash';
@ -17,7 +18,6 @@ import {
import {AbiDecoder} from '../utils/abi_decoder'; import {AbiDecoder} from '../utils/abi_decoder';
import {assert} from '../utils/assert'; import {assert} from '../utils/assert';
import {constants} from '../utils/constants'; import {constants} from '../utils/constants';
import {Web3Wrapper} from '../web3_wrapper';
import {ContractWrapper} from './contract_wrapper'; import {ContractWrapper} from './contract_wrapper';
import {TokenContract} from './generated/token'; import {TokenContract} from './generated/token';
@ -34,9 +34,9 @@ export class TokenWrapper extends ContractWrapper {
public UNLIMITED_ALLOWANCE_IN_BASE_UNITS = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS; public UNLIMITED_ALLOWANCE_IN_BASE_UNITS = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS;
private _tokenContractsByAddress: {[address: string]: TokenContract}; private _tokenContractsByAddress: {[address: string]: TokenContract};
private _tokenTransferProxyWrapper: TokenTransferProxyWrapper; private _tokenTransferProxyWrapper: TokenTransferProxyWrapper;
constructor(web3Wrapper: Web3Wrapper, abiDecoder: AbiDecoder, constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder: AbiDecoder,
tokenTransferProxyWrapper: TokenTransferProxyWrapper) { tokenTransferProxyWrapper: TokenTransferProxyWrapper) {
super(web3Wrapper, abiDecoder); super(web3Wrapper, networkId, abiDecoder);
this._tokenContractsByAddress = {}; this._tokenContractsByAddress = {};
this._tokenTransferProxyWrapper = tokenTransferProxyWrapper; this._tokenTransferProxyWrapper = tokenTransferProxyWrapper;
} }

View File

@ -1,3 +1,4 @@
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
@ -11,7 +12,6 @@ import {AbiDecoder} from '../utils/abi_decoder';
import {assert} from '../utils/assert'; import {assert} from '../utils/assert';
import {intervalUtils} from '../utils/interval_utils'; import {intervalUtils} from '../utils/interval_utils';
import {utils} from '../utils/utils'; import {utils} from '../utils/utils';
import {Web3Wrapper} from '../web3_wrapper';
const DEFAULT_EVENT_POLLING_INTERVAL_MS = 200; const DEFAULT_EVENT_POLLING_INTERVAL_MS = 200;

View File

@ -1,4 +1,5 @@
import {schemas} from '@0xproject/json-schemas'; import {schemas} from '@0xproject/json-schemas';
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import * as _ from 'lodash'; import * as _ from 'lodash';
import {ZeroEx} from '../0x'; import {ZeroEx} from '../0x';
@ -31,7 +32,6 @@ import {assert} from '../utils/assert';
import {intervalUtils} from '../utils/interval_utils'; import {intervalUtils} from '../utils/interval_utils';
import {OrderStateUtils} from '../utils/order_state_utils'; import {OrderStateUtils} from '../utils/order_state_utils';
import {utils} from '../utils/utils'; import {utils} from '../utils/utils';
import {Web3Wrapper} from '../web3_wrapper';
import {EventWatcher} from './event_watcher'; import {EventWatcher} from './event_watcher';
import {ExpirationWatcher} from './expiration_watcher'; import {ExpirationWatcher} from './expiration_watcher';

View File

@ -1,12 +1,12 @@
import {assert as sharedAssert} from '@0xproject/assert'; import {assert as sharedAssert} from '@0xproject/assert';
import {Schema, SchemaValidator} from '@0xproject/json-schemas'; import {Schema, SchemaValidator} from '@0xproject/json-schemas';
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import BigNumber from 'bignumber.js'; import BigNumber from 'bignumber.js';
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
import {ECSignature} from '../types'; import {ECSignature} from '../types';
import {signatureUtils} from '../utils/signature_utils'; import {signatureUtils} from '../utils/signature_utils';
import {Web3Wrapper} from '../web3_wrapper';
const HEX_REGEX = /^0x[0-9A-F]*$/i; const HEX_REGEX = /^0x[0-9A-F]*$/i;

View File

@ -1,3 +1,4 @@
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import BigNumber from 'bignumber.js'; import BigNumber from 'bignumber.js';
import * as chai from 'chai'; import * as chai from 'chai';
import * as _ from 'lodash'; import * as _ from 'lodash';
@ -12,7 +13,6 @@ import {
} from '../src'; } from '../src';
import {EventWatcher} from '../src/order_watcher/event_watcher'; import {EventWatcher} from '../src/order_watcher/event_watcher';
import {DoneCallback} from '../src/types'; import {DoneCallback} from '../src/types';
import {Web3Wrapper} from '../src/web3_wrapper';
import {chaiSetup} from './utils/chai_setup'; import {chaiSetup} from './utils/chai_setup';
import {constants} from './utils/constants'; import {constants} from './utils/constants';
@ -60,7 +60,7 @@ describe('EventWatcher', () => {
before(async () => { before(async () => {
web3 = web3Factory.create(); web3 = web3Factory.create();
const pollingIntervalMs = 10; const pollingIntervalMs = 10;
web3Wrapper = new Web3Wrapper(web3.currentProvider, constants.TESTRPC_NETWORK_ID); web3Wrapper = new Web3Wrapper(web3.currentProvider);
eventWatcher = new EventWatcher(web3Wrapper, pollingIntervalMs); eventWatcher = new EventWatcher(web3Wrapper, pollingIntervalMs);
}); });
afterEach(() => { afterEach(() => {

View File

@ -1,3 +1,4 @@
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import BigNumber from 'bignumber.js'; import BigNumber from 'bignumber.js';
import * as chai from 'chai'; import * as chai from 'chai';
import * as _ from 'lodash'; import * as _ from 'lodash';
@ -10,7 +11,6 @@ import {ExpirationWatcher} from '../src/order_watcher/expiration_watcher';
import {DoneCallback, Token} from '../src/types'; import {DoneCallback, Token} from '../src/types';
import {constants} from '../src/utils/constants'; import {constants} from '../src/utils/constants';
import {utils} from '../src/utils/utils'; import {utils} from '../src/utils/utils';
import {Web3Wrapper} from '../src/web3_wrapper';
import {BlockchainLifecycle} from './utils/blockchain_lifecycle'; import {BlockchainLifecycle} from './utils/blockchain_lifecycle';
import {chaiSetup} from './utils/chai_setup'; import {chaiSetup} from './utils/chai_setup';

View File

@ -1,3 +1,4 @@
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import BigNumber from 'bignumber.js'; import BigNumber from 'bignumber.js';
import * as chai from 'chai'; import * as chai from 'chai';
import * as _ from 'lodash'; import * as _ from 'lodash';
@ -19,7 +20,6 @@ import {
} from '../src'; } from '../src';
import {OrderStateWatcher} from '../src/order_watcher/order_state_watcher'; import {OrderStateWatcher} from '../src/order_watcher/order_state_watcher';
import {DoneCallback} from '../src/types'; import {DoneCallback} from '../src/types';
import {Web3Wrapper} from '../src/web3_wrapper';
import {BlockchainLifecycle} from './utils/blockchain_lifecycle'; import {BlockchainLifecycle} from './utils/blockchain_lifecycle';
import {chaiSetup} from './utils/chai_setup'; import {chaiSetup} from './utils/chai_setup';

View File

@ -1,3 +1,5 @@
import {promisify} from '@0xproject/utils';
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import BigNumber from 'bignumber.js'; import BigNumber from 'bignumber.js';
import * as chai from 'chai'; import * as chai from 'chai';
import 'mocha'; import 'mocha';
@ -18,8 +20,6 @@ import {
ZeroExError, ZeroExError,
} from '../src'; } from '../src';
import {BlockParamLiteral, DoneCallback} from '../src/types'; 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 {BlockchainLifecycle} from './utils/blockchain_lifecycle';
import {chaiSetup} from './utils/chai_setup'; import {chaiSetup} from './utils/chai_setup';
@ -46,7 +46,7 @@ describe('TokenWrapper', () => {
before(async () => { before(async () => {
web3 = web3Factory.create(); web3 = web3Factory.create();
zeroEx = new ZeroEx(web3.currentProvider, config); zeroEx = new ZeroEx(web3.currentProvider, config);
web3Wrapper = new Web3Wrapper(web3.currentProvider, config.networkId); web3Wrapper = new Web3Wrapper(web3.currentProvider);
userAddresses = await zeroEx.getAvailableAddressesAsync(); userAddresses = await zeroEx.getAvailableAddressesAsync();
tokens = await zeroEx.tokenRegistry.getTokensAsync(); tokens = await zeroEx.tokenRegistry.getTokensAsync();
tokenUtils = new TokenUtils(tokens); tokenUtils = new TokenUtils(tokens);

View File

@ -2,12 +2,12 @@
* This file is auto-generated using abi-gen. Don't edit directly. * 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. * 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 {BigNumber} from 'bignumber.js';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
import {TxData, TxDataPayable} from '../../types'; import {TxData, TxDataPayable} from '../../types';
import {classUtils} from '../../utils/class_utils'; import {classUtils} from '../../utils/class_utils';
import {promisify} from '../../utils/promisify';
import {BaseContract} from './base_contract'; import {BaseContract} from './base_contract';

View File

@ -1,7 +1,7 @@
{ {
"name": "abi-gen-templates", "name": "abi-gen-templates",
"private": true, "private": true,
"version": "0.0.0", "version": "0.0.1",
"description": "Handlebars templates to generate TS contract wrappers", "description": "Handlebars templates to generate TS contract wrappers",
"repository": { "repository": {
"type": "git", "type": "git",

View File

@ -1,6 +1,6 @@
# ABI Gen # 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. 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. You can write your custom handlebars templates which will allow you to seamlessly integrate the generated code into your existing codebase with existing conventions.
@ -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. [Here](https://github.com/0xProject/0x.js/tree/development/packages/abi-gen-templates) are the templates used to generate those files.
## Instalation ## Instalation
`yarn add -g abi-gen` `yarn add -g @0xproject/abi-gen`
## Usage ## Usage
``` ```
abi-gen abi-gen
@ -18,10 +18,9 @@ Options:
--abiGlob Glob pattern to search for ABI JSON files [string] [required] --abiGlob Glob pattern to search for ABI JSON files [string] [required]
--templates Folder where to search for templates [string] [required] --templates Folder where to search for templates [string] [required]
--output Folder where to put the output files [string] [required] --output Folder where to put the output files [string] [required]
--fileExtension The extension of the output file [string] [required]
``` ```
## ABI files ## 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. TL;DR - here is the example from 0x.js.
`--abiGlob 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken|TokenRegistry).json` `--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. 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. 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? ## 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 useful 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. 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
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. 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.

View File

@ -1,6 +1,6 @@
{ {
"name": "abi-gen", "name": "abi-gen",
"version": "0.0.0", "version": "0.0.1",
"description": "Generate contract wrappers from ABI and handlebars templates", "description": "Generate contract wrappers from ABI and handlebars templates",
"main": "lib/index.js", "main": "lib/index.js",
"types": "lib/index.d.ts", "types": "lib/index.d.ts",
@ -33,9 +33,9 @@
"yargs": "^10.0.3" "yargs": "^10.0.3"
}, },
"devDependencies": { "devDependencies": {
"@types/handlebars": "^4.0.36",
"@0xproject/tslint-config": "^0.2.0", "@0xproject/tslint-config": "^0.2.0",
"@types/glob": "^5.0.33", "@types/glob": "^5.0.33",
"@types/handlebars": "^4.0.36",
"@types/mkdirp": "^0.5.1", "@types/mkdirp": "^0.5.1",
"@types/node": "^8.0.53", "@types/node": "^8.0.53",
"@types/yargs": "^8.0.2", "@types/yargs": "^8.0.2",

View File

@ -33,16 +33,11 @@ const args = yargs
type: 'string', type: 'string',
demand: true, demand: true,
}) })
.option('fileExtension', {
describe: 'The extension of the output file',
type: 'string',
demand: true,
})
.argv; .argv;
function writeOutputFile(name: string, renderedTsCode: string): void { function writeOutputFile(name: string, renderedTsCode: string): void {
const fileName = toSnakeCase(name); const fileName = toSnakeCase(name);
const filePath = `${args.output}/${fileName}.${args.fileExtension}`; const filePath = `${args.output}/${fileName}.ts`;
fs.writeFileSync(filePath, renderedTsCode); fs.writeFileSync(filePath, renderedTsCode);
utils.log(`Created: ${chalk.bold(filePath)}`); utils.log(`Created: ${chalk.bold(filePath)}`);
} }

View File

@ -12,6 +12,6 @@
"include": [ "include": [
"./src/**/*", "./src/**/*",
"./test/**/*", "./test/**/*",
"../../node_modules/web3-typescript-typings/index.d.ts", "../../node_modules/web3-typescript-typings/index.d.ts"
] ]
} }

View File

@ -3,6 +3,7 @@
vx.x.x vx.x.x
------------------------ ------------------------
* Expose WebSocketOrderbookChannel and associated types to public interface (#251) * Expose WebSocketOrderbookChannel and associated types to public interface (#251)
* Remove tokenA and tokenB fields from OrdersRequest (#256)
v0.2.0 - _November 29, 2017_ v0.2.0 - _November 29, 2017_
------------------------ ------------------------

View File

@ -63,7 +63,7 @@ export interface OrderbookChannelHandler {
order: SignedOrder) => void; order: SignedOrder) => void;
onError: (channel: OrderbookChannel, subscriptionOpts: OrderbookChannelSubscriptionOpts, onError: (channel: OrderbookChannel, subscriptionOpts: OrderbookChannelSubscriptionOpts,
err: Error) => void; err: Error) => void;
onClose: (channel: OrderbookChannel) => void; onClose: (channel: OrderbookChannel, subscriptionOpts: OrderbookChannelSubscriptionOpts) => void;
} }
export type OrderbookChannelMessage = export type OrderbookChannelMessage =
@ -128,8 +128,6 @@ export interface OrdersRequest {
tokenAddress?: string; tokenAddress?: string;
makerTokenAddress?: string; makerTokenAddress?: string;
takerTokenAddress?: string; takerTokenAddress?: string;
tokenA?: string;
tokenB?: string;
maker?: string; maker?: string;
taker?: string; taker?: string;
trader?: string; trader?: string;

View File

@ -62,7 +62,7 @@ export class WebSocketOrderbookChannel implements OrderbookChannel {
handler.onError(this, subscriptionOpts, wsError); handler.onError(this, subscriptionOpts, wsError);
}); });
connection.on(WebsocketConnectionEventType.Close, () => { connection.on(WebsocketConnectionEventType.Close, () => {
handler.onClose(this); handler.onClose(this, subscriptionOpts);
}); });
connection.on(WebsocketConnectionEventType.Message, message => { connection.on(WebsocketConnectionEventType.Message, message => {
this._handleWebSocketMessage(subscribeMessage.requestId, subscriptionOpts, message, handler); this._handleWebSocketMessage(subscribeMessage.requestId, subscriptionOpts, message, handler);

View File

@ -61,12 +61,12 @@ describe('HttpClient', () => {
const orders = await relayerClient.getOrdersAsync(); const orders = await relayerClient.getOrdersAsync();
expect(orders).to.be.deep.equal(ordersResponse); 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 tokenAddress = '0x323b5d4c32345ced77393b3530b1eed0f346429d';
const ordersRequest = { const ordersRequest = {
tokenA: tokenAddress, tokenAddress,
}; };
const urlWithQuery = `${url}?tokenA=${tokenAddress}`; const urlWithQuery = `${url}?tokenAddress=${tokenAddress}`;
fetchMock.get(urlWithQuery, ordersResponseJSON); fetchMock.get(urlWithQuery, ordersResponseJSON);
const orders = await relayerClient.getOrdersAsync(ordersRequest); const orders = await relayerClient.getOrdersAsync(ordersRequest);
expect(orders).to.be.deep.equal(ordersResponse); expect(orders).to.be.deep.equal(ordersResponse);

View File

@ -1,9 +1,11 @@
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import {BigNumber} from 'bignumber.js';
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as path from 'path'; import * as path from 'path';
import * as Web3 from 'web3';
import * as yargs from 'yargs'; import * as yargs from 'yargs';
import {commands} from './src/commands'; import {commands} from './src/commands';
import {network} from './src/utils/network';
import { import {
CliOptions, CliOptions,
CompilerOptions, CompilerOptions,
@ -36,23 +38,26 @@ async function onCompileCommand(args: CliOptions): Promise<void> {
* @param argv Instance of process.argv provided by yargs. * @param argv Instance of process.argv provided by yargs.
*/ */
async function onMigrateCommand(argv: CliOptions): Promise<void> { async function onMigrateCommand(argv: CliOptions): Promise<void> {
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 = { const compilerOpts: CompilerOptions = {
contractsDir: argv.contractsDir, contractsDir: argv.contractsDir,
networkId: networkIdIfExists, networkId,
optimizerEnabled: argv.shouldOptimize ? 1 : 0, optimizerEnabled: argv.shouldOptimize ? 1 : 0,
artifactsDir: argv.artifactsDir, artifactsDir: argv.artifactsDir,
}; };
await commands.compileAsync(compilerOpts); await commands.compileAsync(compilerOpts);
const defaults = { const defaults = {
gasPrice: argv.gasPrice, gasPrice: new BigNumber(argv.gasPrice),
from: argv.account, from: argv.account,
}; };
const deployerOpts: DeployerOptions = { const deployerOpts = {
artifactsDir: argv.artifactsDir, artifactsDir: argv.artifactsDir,
jsonrpcPort: argv.jsonrpcPort, jsonrpcPort: argv.jsonrpcPort,
networkId: networkIdIfExists, networkId,
defaults, defaults,
}; };
await commands.migrateAsync(deployerOpts); await commands.migrateAsync(deployerOpts);
@ -62,23 +67,26 @@ async function onMigrateCommand(argv: CliOptions): Promise<void> {
* @param argv Instance of process.argv provided by yargs. * @param argv Instance of process.argv provided by yargs.
*/ */
async function onDeployCommand(argv: CliOptions): Promise<void> { async function onDeployCommand(argv: CliOptions): Promise<void> {
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 = { const compilerOpts: CompilerOptions = {
contractsDir: argv.contractsDir, contractsDir: argv.contractsDir,
networkId: networkIdIfExists, networkId,
optimizerEnabled: argv.shouldOptimize ? 1 : 0, optimizerEnabled: argv.shouldOptimize ? 1 : 0,
artifactsDir: argv.artifactsDir, artifactsDir: argv.artifactsDir,
}; };
await commands.compileAsync(compilerOpts); await commands.compileAsync(compilerOpts);
const defaults = { const defaults = {
gasPrice: argv.gasPrice, gasPrice: new BigNumber(argv.gasPrice),
from: argv.account, from: argv.account,
}; };
const deployerOpts: DeployerOptions = { const deployerOpts: DeployerOptions = {
artifactsDir: argv.artifactsDir, artifactsDir: argv.artifactsDir,
jsonrpcPort: argv.jsonrpcPort, jsonrpcPort: argv.jsonrpcPort,
networkId: networkIdIfExists, networkId,
defaults, defaults,
}; };
const deployerArgsString = argv.args; const deployerArgsString = argv.args;

View File

@ -1,3 +1,4 @@
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import {BigNumber} from 'bignumber.js'; import {BigNumber} from 'bignumber.js';
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
@ -5,7 +6,6 @@ import * as Web3 from 'web3';
import {Deployer} from './../src/deployer'; import {Deployer} from './../src/deployer';
import {constants} from './../src/utils/constants'; import {constants} from './../src/utils/constants';
import {Token} from './../src/utils/types'; import {Token} from './../src/utils/types';
import {Web3Wrapper} from './../src/utils/web3_wrapper';
import {tokenInfo} from './config/token_info'; import {tokenInfo} from './config/token_info';
export const migrator = { export const migrator = {

View File

@ -1,4 +1,4 @@
import promisify = require('es6-promisify'); import {promisify} from '@0xproject/utils';
import * as ethUtil from 'ethereumjs-util'; import * as ethUtil from 'ethereumjs-util';
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as path from 'path'; import * as path from 'path';

View File

@ -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 _ from 'lodash';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
@ -11,7 +13,6 @@ import {
DeployerOptions, DeployerOptions,
} from './utils/types'; } from './utils/types';
import {utils} from './utils/utils'; 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. // Gas added to gas estimate to make sure there is sufficient gas for deployment.
const EXTRA_GAS = 200000; const EXTRA_GAS = 200000;
@ -21,7 +22,7 @@ export class Deployer {
private artifactsDir: string; private artifactsDir: string;
private jsonrpcPort: number; private jsonrpcPort: number;
private networkId: number; private networkId: number;
private defaults: Partial<Web3.TxData>; private defaults: Partial<TxData>;
constructor(opts: DeployerOptions) { constructor(opts: DeployerOptions) {
this.artifactsDir = opts.artifactsDir; this.artifactsDir = opts.artifactsDir;
@ -171,7 +172,7 @@ export class Deployer {
const block = await this.web3Wrapper.getBlockAsync('latest'); const block = await this.web3Wrapper.getBlockAsync('latest');
let gas: number; let gas: number;
try { 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); gas = Math.min(gasEstimate + EXTRA_GAS, block.gasLimit);
} catch (err) { } catch (err) {
gas = block.gasLimit; gas = block.gasLimit;

View File

@ -1,5 +1,5 @@
import {schemas, SchemaValidator} from '@0xproject/json-schemas'; import {schemas, SchemaValidator} from '@0xproject/json-schemas';
import promisify = require('es6-promisify'); import {promisify} from '@0xproject/utils';
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as Web3 from 'web3'; import * as Web3 from 'web3';

View File

@ -1,11 +1,11 @@
import promisify = require('es6-promisify'); import {promisify} from '@0xproject/utils';
import * as fs from 'fs'; import * as fs from 'fs';
export const fsWrapper = { export const fsWrapper = {
readdirAsync: promisify(fs.readdir), readdirAsync: promisify<string[]>(fs.readdir),
readFileAsync: promisify(fs.readFile), readFileAsync: promisify<string>(fs.readFile),
writeFileAsync: promisify(fs.writeFile), writeFileAsync: promisify<undefined>(fs.writeFile),
mkdirAsync: promisify(fs.mkdir), mkdirAsync: promisify<undefined>(fs.mkdir),
doesPathExistSync: fs.existsSync, doesPathExistSync: fs.existsSync,
removeFileAsync: promisify(fs.unlink), removeFileAsync: promisify<undefined>(fs.unlink),
}; };

View File

@ -1,15 +0,0 @@
import promisify = require('es6-promisify');
import * as Web3 from 'web3';
import {Web3Wrapper} from './web3_wrapper';
export const network = {
async getNetworkIdIfExistsAsync(port: number): Promise<number> {
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;
},
};

View File

@ -1,3 +1,4 @@
import {TxData} from '@0xproject/types';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
export enum AbiType { export enum AbiType {
@ -54,7 +55,7 @@ export interface DeployerOptions {
artifactsDir: string; artifactsDir: string;
jsonrpcPort: number; jsonrpcPort: number;
networkId: number; networkId: number;
defaults: Partial<Web3.TxData>; defaults: Partial<TxData>;
} }
export interface ContractSources { export interface ContractSources {

View File

@ -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<Web3.TxData>;
private networkIdIfExists?: number;
private jsonRpcRequestId: number;
constructor(provider: Web3.Provider, defaults: Partial<Web3.TxData>) {
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<Web3.ContractInstance> {
const contract = this.web3.eth.contract(abi);
return contract;
}
public async isSenderAddressAvailableAsync(senderAddress: string): Promise<boolean> {
const addresses = await this.getAvailableAddressesAsync();
return _.includes(addresses, senderAddress);
}
public async getNodeVersionAsync(): Promise<string> {
const nodeVersion = await promisify(this.web3.version.getNode)();
return nodeVersion;
}
public async getTransactionReceiptAsync(txHash: string): Promise<Web3.TransactionReceipt> {
const transactionReceipt = await promisify(this.web3.eth.getTransactionReceipt)(txHash);
return transactionReceipt;
}
public getCurrentProvider(): Web3.Provider {
return this.web3.currentProvider;
}
public async getNetworkIdIfExistsAsync(): Promise<number|undefined> {
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<BigNumber> {
let balanceInWei = await promisify(this.web3.eth.getBalance)(owner);
balanceInWei = new BigNumber(balanceInWei);
return balanceInWei;
}
public async doesContractExistAtAddressAsync(address: string): Promise<boolean> {
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<string> {
const signData = await promisify(this.web3.eth.sign)(address, message);
return signData;
}
public async getBlockAsync(blockParam: string|Web3.BlockParam): Promise<Web3.BlockWithoutTransactionData> {
const block = await promisify(this.web3.eth.getBlock)(blockParam);
return block;
}
public async getBlockTimestampAsync(blockParam: string|Web3.BlockParam): Promise<number> {
const {timestamp} = await this.getBlockAsync(blockParam);
return timestamp;
}
public async getAvailableAddressesAsync(): Promise<string[]> {
const addresses: string[] = await promisify(this.web3.eth.getAccounts)();
return addresses;
}
public async getLogsAsync(filter: Web3.FilterObject): Promise<Web3.LogEntry[]> {
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<number> {
const gasEstimate = await promisify(this.web3.eth.estimateGas)(callData);
return gasEstimate;
}
private getContractInstance<A extends Web3.ContractInstance>(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<number> {
const networkId = await promisify(this.web3.version.getNetwork)();
return networkId;
}
private async sendRawPayloadAsync(payload: Web3.JSONRPCRequestPayload): Promise<any> {
const sendAsync = this.web3.currentProvider.sendAsync.bind(this.web3.currentProvider);
const response = await promisify(sendAsync)(payload);
const result = response.result;
return result;
}
}

View File

@ -19,7 +19,7 @@ const compilerOpts: CompilerOptions = {
optimizerEnabled: constants.optimizerEnabled, optimizerEnabled: constants.optimizerEnabled,
}; };
const compiler = new Compiler(compilerOpts); const compiler = new Compiler(compilerOpts);
const deployerOpts: DeployerOptions = { const deployerOpts = {
artifactsDir, artifactsDir,
networkId: constants.networkId, networkId: constants.networkId,
jsonrpcPort: constants.jsonrpcPort, jsonrpcPort: constants.jsonrpcPort,

View File

@ -1,8 +1,10 @@
import {BigNumber} from 'bignumber.js';
export const constants = { export const constants = {
networkId: 0, networkId: 0,
jsonrpcPort: 8545, jsonrpcPort: 8545,
optimizerEnabled: 0, optimizerEnabled: 0,
gasPrice: '20000000000', gasPrice: new BigNumber(20000000000),
timeoutMs: 12000, timeoutMs: 12000,
zrxTokenAddress: '0xe41d2489571d322189246dafa5ebde1f4699f498', zrxTokenAddress: '0xe41d2489571d322189246dafa5ebde1f4699f498',
tokenTransferProxyAddress: '0x8da0d80f5007ef1e431dd2127178d224e32c2ef4', tokenTransferProxyAddress: '0x8da0d80f5007ef1e431dd2127178d224e32c2ef4',

View File

@ -27,11 +27,6 @@ declare module 'solc' {
export function setupMethods(solcBin: any): any; export function setupMethods(solcBin: any): any;
} }
declare module 'es6-promisify' {
function promisify(original: any, settings?: any): ((...arg: any[]) => Promise<any>);
export = promisify;
}
declare module 'web3-eth-abi' { declare module 'web3-eth-abi' {
export function encodeParameters(typesArray: string[], parameters: any[]): string; 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 // Truffle injects the following into the global scope
declare var artifacts: any; declare var artifacts: any;
declare var contract: any; declare var contract: any;

View File

@ -13,7 +13,7 @@
"clean": "rm -rf ./lib", "clean": "rm -rf ./lib",
"migrate:truffle": "npm run build; truffle migrate", "migrate:truffle": "npm run build; truffle migrate",
"migrate": "npm run build; node lib/deploy/cli.js 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" "test:deployer": "npm run build; mocha lib/deploy/test/*_test.js"
}, },
"repository": { "repository": {
@ -28,6 +28,7 @@
"homepage": "https://github.com/0xProject/0x.js/packages/contracts/README.md", "homepage": "https://github.com/0xProject/0x.js/packages/contracts/README.md",
"devDependencies": { "devDependencies": {
"@0xproject/tslint-config": "^0.2.0", "@0xproject/tslint-config": "^0.2.0",
"@0xproject/types": "^0.0.1",
"@types/bluebird": "^3.5.3", "@types/bluebird": "^3.5.3",
"@types/isomorphic-fetch": "^0.0.34", "@types/isomorphic-fetch": "^0.0.34",
"@types/lodash": "^4.14.86", "@types/lodash": "^4.14.86",
@ -53,11 +54,12 @@
}, },
"dependencies": { "dependencies": {
"0x.js": "^0.22.6", "0x.js": "^0.22.6",
"@0xproject/web3-wrapper": "^0.0.1",
"@0xproject/json-schemas": "^0.6.9", "@0xproject/json-schemas": "^0.6.9",
"@0xproject/utils": "^0.0.1",
"bignumber.js": "~4.1.0", "bignumber.js": "~4.1.0",
"bluebird": "^3.5.0", "bluebird": "^3.5.0",
"bn.js": "^4.11.8", "bn.js": "^4.11.8",
"es6-promisify": "^5.0.0",
"ethereumjs-abi": "^0.6.4", "ethereumjs-abi": "^0.6.4",
"ethereumjs-util": "^5.1.1", "ethereumjs-util": "^5.1.1",
"isomorphic-fetch": "^2.2.1", "isomorphic-fetch": "^2.2.1",

View File

@ -1,7 +1,7 @@
import {ZeroEx, ZeroExError} from '0x.js'; import {ZeroEx, ZeroExError} from '0x.js';
import {promisify} from '@0xproject/utils';
import {BigNumber} from 'bignumber.js'; import {BigNumber} from 'bignumber.js';
import * as chai from 'chai'; import * as chai from 'chai';
import promisify = require('es6-promisify');
import Web3 = require('web3'); import Web3 = require('web3');
import {Artifacts} from '../../util/artifacts'; import {Artifacts} from '../../util/artifacts';
@ -30,9 +30,9 @@ contract('EtherToken', (accounts: string[]) => {
}); });
}); });
const sendTransactionAsync = promisify(web3.eth.sendTransaction); const sendTransactionAsync = promisify<string>(web3.eth.sendTransaction);
const getEthBalanceAsync = async (owner: string) => { const getEthBalanceAsync = async (owner: string) => {
const balanceStr = await promisify(web3.eth.getBalance)(owner); const balanceStr = await promisify<string>(web3.eth.getBalance)(owner);
const balance = new BigNumber(balanceStr); const balance = new BigNumber(balanceStr);
return balance; return balance;
}; };

View File

@ -1,6 +1,6 @@
import {promisify} from '@0xproject/utils';
import {BigNumber} from 'bignumber.js'; import {BigNumber} from 'bignumber.js';
import * as chai from 'chai'; import * as chai from 'chai';
import promisify = require('es6-promisify');
import Web3 = require('web3'); import Web3 = require('web3');
import * as multiSigWalletJSON from '../../build/contracts/MultiSigWalletWithTimeLock.json'; 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 () => { it('should set confirmation time with enough confirmations', async () => {
const res = await multiSig.confirmTransaction(txId, {from: owners[1]}); const res = await multiSig.confirmTransaction(txId, {from: owners[1]});
expect(res.logs).to.have.length(2); expect(res.logs).to.have.length(2);
const blockNum = await promisify(web3.eth.getBlockNumber)(); const blockNum = await promisify<number>(web3.eth.getBlockNumber)();
const blockInfo = await promisify(web3.eth.getBlock)(blockNum); const blockInfo = await promisify<Web3.BlockWithoutTransactionData>(web3.eth.getBlock)(blockNum);
const timestamp = new BigNumber(blockInfo.timestamp); const timestamp = new BigNumber(blockInfo.timestamp);
const confirmationTimeBigNum = new BigNumber(await multiSig.confirmationTimes.call(txId)); const confirmationTimeBigNum = new BigNumber(await multiSig.confirmationTimes.call(txId));

View File

@ -1,5 +1,5 @@
import {promisify} from '@0xproject/utils';
import {BigNumber} from 'bignumber.js'; import {BigNumber} from 'bignumber.js';
import promisify = require('es6-promisify');
import ethUtil = require('ethereumjs-util'); import ethUtil = require('ethereumjs-util');
import * as _ from 'lodash'; import * as _ from 'lodash';
import Web3 = require('web3'); import Web3 = require('web3');
@ -33,7 +33,7 @@ export class Order {
} }
public async signAsync() { public async signAsync() {
const orderHash = this.getOrderHash(); const orderHash = this.getOrderHash();
const signature = await promisify(web3.eth.sign)(this.params.maker, orderHash); const signature = await promisify<string>(web3.eth.sign)(this.params.maker, orderHash);
const {v, r, s} = ethUtil.fromRpcSig(signature); const {v, r, s} = ethUtil.fromRpcSig(signature);
this.params = _.assign(this.params, { this.params = _.assign(this.params, {
orderHashHex: orderHash, orderHashHex: orderHash,

View File

@ -5,7 +5,7 @@
"main": "lib/src/index.js", "main": "lib/src/index.js",
"types": "lib/src/index.d.ts", "types": "lib/src/index.d.ts",
"scripts": { "scripts": {
"lint": "tslint --project . src/*.ts test/*.ts", "lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
"test": "run-s clean build run_mocha", "test": "run-s clean build run_mocha",
"test:circleci": "yarn test", "test:circleci": "yarn test",
"run_mocha": "mocha lib/test/**/*_test.js", "run_mocha": "mocha lib/test/**/*_test.js",
@ -23,12 +23,12 @@
}, },
"homepage": "https://github.com/0xProject/0x.js/packages/json-schemas/README.md", "homepage": "https://github.com/0xProject/0x.js/packages/json-schemas/README.md",
"dependencies": { "dependencies": {
"es6-promisify": "^5.0.0",
"jsonschema": "^1.2.0", "jsonschema": "^1.2.0",
"lodash.values": "^4.3.0" "lodash.values": "^4.3.0"
}, },
"devDependencies": { "devDependencies": {
"@0xproject/tslint-config": "^0.2.0", "@0xproject/tslint-config": "^0.2.0",
"@0xproject/utils": "^0.0.1",
"@types/lodash.foreach": "^4.5.3", "@types/lodash.foreach": "^4.5.3",
"@types/lodash.values": "^4.3.3", "@types/lodash.values": "^4.3.3",
"@types/mocha": "^2.2.42", "@types/mocha": "^2.2.42",

View File

@ -1,7 +1 @@
declare module 'dirty-chai'; declare module 'dirty-chai';
// es6-promisify declarations
declare function promisify(original: any, settings?: any): ((...arg: any[]) => Promise<any>);
declare module 'es6-promisify' {
export = promisify;
}

View File

@ -1,7 +1,7 @@
import {promisify} from '@0xproject/utils';
import BigNumber from 'bignumber.js'; import BigNumber from 'bignumber.js';
import * as chai from 'chai'; import * as chai from 'chai';
import * as dirtyChai from 'dirty-chai'; import * as dirtyChai from 'dirty-chai';
import promisify = require('es6-promisify');
import forEach = require('lodash.foreach'); import forEach = require('lodash.foreach');
import 'mocha'; import 'mocha';

View File

@ -1,6 +1,6 @@
{ {
"name": "@0xproject/monorepo-scripts", "name": "@0xproject/monorepo-scripts",
"version": "0.0.0", "version": "0.0.1",
"private": true, "private": true,
"description": "Helper scripts for the monorepo", "description": "Helper scripts for the monorepo",
"scripts": { "scripts": {

View File

@ -1,4 +1,4 @@
import promisify = require('es6-promisify'); import {promisify} from '@0xproject/utils';
import * as _ from 'lodash'; import * as _ from 'lodash';
import RpcSubprovider = require('web3-provider-engine/subproviders/rpc'); import RpcSubprovider = require('web3-provider-engine/subproviders/rpc');

10
packages/types/README.md Normal file
View File

@ -0,0 +1,10 @@
0x types
------
TS types shared across 0x projects and packages
## Install
```bash
yarn add -D @0xproject/types
```

View File

@ -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"
}
}

View File

@ -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[];
}

View File

@ -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"
]
}

View File

@ -0,0 +1,5 @@
{
"extends": [
"@0xproject/tslint-config"
]
}

10
packages/utils/README.md Normal file
View File

@ -0,0 +1,10 @@
utils
------
Utils to be shared across 0x projects and packages
## Install
```bash
yarn add @0xproject/utils
```

View File

@ -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"
}
}

View File

@ -0,0 +1 @@
export {promisify} from './promisify';

View File

@ -0,0 +1,15 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"lib": [ "es2017", "dom"],
"outDir": "lib",
"sourceMap": true,
"declaration": true,
"noImplicitAny": true,
"strictNullChecks": true
},
"include": [
"./src/**/*"
]
}

View File

@ -0,0 +1,5 @@
{
"extends": [
"@0xproject/tslint-config"
]
}

View File

@ -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
```

View File

@ -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",
"@0xproject/types": "^0.0.1",
"@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",
"bignumber.js": "~4.1.0",
"lodash": "^4.17.4",
"web3": "^0.20.0"
}
}

View File

@ -1,10 +1,9 @@
import {TransactionReceipt, TxData} from '@0xproject/types';
import {promisify} from '@0xproject/utils';
import BigNumber from 'bignumber.js'; import BigNumber from 'bignumber.js';
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
import {Artifact, ArtifactContractName, TransactionReceipt, TxData, ZeroExError} from './types';
import {promisify} from './utils/promisify';
interface RawLogEntry { interface RawLogEntry {
logIndex: string|null; logIndex: string|null;
transactionIndex: string|null; transactionIndex: string|null;
@ -16,21 +15,11 @@ interface RawLogEntry {
topics: 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 { export class Web3Wrapper {
private web3: Web3; private web3: Web3;
private networkId: number;
private defaults: Partial<TxData>; private defaults: Partial<TxData>;
private jsonRpcRequestId: number; private jsonRpcRequestId: number;
constructor(provider: Web3.Provider, networkId: number, defaults?: Partial<TxData>) { constructor(provider: Web3.Provider, defaults?: Partial<TxData>) {
if (_.isUndefined((provider as any).sendAsync)) { if (_.isUndefined((provider as any).sendAsync)) {
// Web3@1.0 provider doesn't support synchronous http requests, // 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` // so it only has an async `send` method, instead of a `send` and `sendAsync` in web3@0.x.x`
@ -38,7 +27,6 @@ export class Web3Wrapper {
(provider as any).sendAsync = (provider as any).send; (provider as any).sendAsync = (provider as any).send;
} }
this.web3 = new Web3(); this.web3 = new Web3();
this.networkId = networkId;
this.web3.setProvider(provider); this.web3.setProvider(provider);
this.defaults = defaults || {}; this.defaults = defaults || {};
this.jsonRpcRequestId = 0; this.jsonRpcRequestId = 0;
@ -47,7 +35,6 @@ export class Web3Wrapper {
return this.defaults; return this.defaults;
} }
public setProvider(provider: Web3.Provider, networkId: number) { public setProvider(provider: Web3.Provider, networkId: number) {
this.networkId = networkId;
this.web3.setProvider(provider); this.web3.setProvider(provider);
} }
public isAddress(address: string): boolean { public isAddress(address: string): boolean {
@ -61,6 +48,11 @@ export class Web3Wrapper {
const nodeVersion = await promisify<string>(this.web3.version.getNode)(); const nodeVersion = await promisify<string>(this.web3.version.getNode)();
return nodeVersion; return nodeVersion;
} }
public async getNetworkIdAsync(): Promise<number> {
const networkIdStr = await promisify<string>(this.web3.version.getNetwork)();
const networkId = _.parseInt(networkIdStr);
return networkId;
}
public async getTransactionReceiptAsync(txHash: string): Promise<TransactionReceipt> { public async getTransactionReceiptAsync(txHash: string): Promise<TransactionReceipt> {
const transactionReceipt = await promisify<TransactionReceipt>(this.web3.eth.getTransactionReceipt)(txHash); const transactionReceipt = await promisify<TransactionReceipt>(this.web3.eth.getTransactionReceipt)(txHash);
if (!_.isNull(transactionReceipt)) { if (!_.isNull(transactionReceipt)) {
@ -71,37 +63,13 @@ export class Web3Wrapper {
public getCurrentProvider(): Web3.Provider { public getCurrentProvider(): Web3.Provider {
return this.web3.currentProvider; return this.web3.currentProvider;
} }
public getNetworkId(): number {
return this.networkId;
}
public async getContractInstanceFromArtifactAsync(
artifact: Artifact, address?: string,
): Promise<Web3.ContractInstance> {
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 { public toWei(ethAmount: BigNumber): BigNumber {
const balanceWei = this.web3.toWei(ethAmount, 'ether'); const balanceWei = this.web3.toWei(ethAmount, 'ether');
return balanceWei; return balanceWei;
} }
public async getBalanceInWeiAsync(owner: string): Promise<BigNumber> { public async getBalanceInWeiAsync(owner: string): Promise<BigNumber> {
let balanceInWei = await promisify<BigNumber>(this.web3.eth.getBalance)(owner); let balanceInWei = await promisify<BigNumber>(this.web3.eth.getBalance)(owner);
// Rewrap in a new BigNumber
balanceInWei = new BigNumber(balanceInWei); balanceInWei = new BigNumber(balanceInWei);
return balanceInWei; return balanceInWei;
} }
@ -155,13 +123,17 @@ export class Web3Wrapper {
const formattedLogs = _.map(rawLogs, this.formatLog.bind(this)); const formattedLogs = _.map(rawLogs, this.formatLog.bind(this));
return formattedLogs; return formattedLogs;
} }
private getContractInstance(abi: Web3.ContractAbi, address: string): Web3.ContractInstance { public getContractFromAbi(abi: Web3.ContractAbi): Web3.Contract<any> {
const web3ContractInstance = this.web3.eth.contract(abi).at(address); 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; return web3ContractInstance;
} }
private async getNetworkAsync(): Promise<number> { public async estimateGasAsync(data: string): Promise<number> {
const networkId = await promisify<number>(this.web3.version.getNetwork)(); const gas = await promisify<number>(this.web3.eth.estimateGas)({data});
return networkId; return gas;
} }
private async sendRawPayloadAsync<A>(payload: Web3.JSONRPCRequestPayload): Promise<A> { private async sendRawPayloadAsync<A>(payload: Web3.JSONRPCRequestPayload): Promise<A> {
const sendAsync = this.web3.currentProvider.sendAsync.bind(this.web3.currentProvider); const sendAsync = this.web3.currentProvider.sendAsync.bind(this.web3.currentProvider);

View File

@ -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"
]
}

View File

@ -0,0 +1,5 @@
{
"extends": [
"@0xproject/tslint-config"
]
}

View File

@ -28,7 +28,6 @@
"dateformat": "^2.0.0", "dateformat": "^2.0.0",
"deep-equal": "^1.0.1", "deep-equal": "^1.0.1",
"dharma-loan-frame": "^0.0.12", "dharma-loan-frame": "^0.0.12",
"es6-promisify": "^5.0.0",
"ethereum-address": "^0.0.4", "ethereum-address": "^0.0.4",
"ethereumjs-tx": "^1.3.3", "ethereumjs-tx": "^1.3.3",
"ethereumjs-util": "^5.1.1", "ethereumjs-util": "^5.1.1",

View File

@ -23,9 +23,9 @@ import {
LedgerWalletSubprovider, LedgerWalletSubprovider,
RedundantRPCSubprovider, RedundantRPCSubprovider,
} from '@0xproject/subproviders'; } from '@0xproject/subproviders';
import {promisify} from '@0xproject/utils';
import BigNumber from 'bignumber.js'; import BigNumber from 'bignumber.js';
import compareVersions = require('compare-versions'); import compareVersions = require('compare-versions');
import promisify = require('es6-promisify');
import ethUtil = require('ethereumjs-util'); import ethUtil = require('ethereumjs-util');
import findVersions = require('find-versions'); import findVersions = require('find-versions');
import * as _ from 'lodash'; import * as _ from 'lodash';
@ -68,7 +68,7 @@ export class Blockchain {
public nodeVersion: string; public nodeVersion: string;
private zeroEx: ZeroEx; private zeroEx: ZeroEx;
private dispatcher: Dispatcher; private dispatcher: Dispatcher;
private web3Wrapper: Web3Wrapper; private web3Wrapper?: Web3Wrapper;
private exchangeAddress: string; private exchangeAddress: string;
private tokenTransferProxy: ContractInstance; private tokenTransferProxy: ContractInstance;
private tokenRegistry: ContractInstance; private tokenRegistry: ContractInstance;
@ -631,7 +631,7 @@ export class Blockchain {
let networkIdIfExists: number; let networkIdIfExists: number;
if (!_.isUndefined(injectedWeb3)) { if (!_.isUndefined(injectedWeb3)) {
try { try {
networkIdIfExists = _.parseInt(await promisify(injectedWeb3.version.getNetwork)()); networkIdIfExists = _.parseInt(await promisify<string>(injectedWeb3.version.getNetwork)());
} catch (err) { } catch (err) {
// Ignore error and proceed with networkId undefined // Ignore error and proceed with networkId undefined
} }

View File

@ -1,6 +1,5 @@
declare module 'react-tooltip'; declare module 'react-tooltip';
declare module 'react-router-hash-link'; declare module 'react-router-hash-link';
declare module 'es6-promisify';
declare module 'truffle-contract'; declare module 'truffle-contract';
declare module 'ethereumjs-util'; declare module 'ethereumjs-util';
declare module 'keccak'; declare module 'keccak';

View File

@ -1,8 +1,8 @@
import {promisify} from '@0xproject/utils';
import BigNumber from 'bignumber.js'; import BigNumber from 'bignumber.js';
import promisify = require('es6-promisify');
import * as _ from 'lodash'; import * as _ from 'lodash';
import {Dispatcher} from 'ts/redux/dispatcher'; import {Dispatcher} from 'ts/redux/dispatcher';
import Web3 = require('web3'); import * as Web3 from 'web3';
export class Web3Wrapper { export class Web3Wrapper {
private dispatcher: Dispatcher; private dispatcher: Dispatcher;
@ -28,7 +28,7 @@ export class Web3Wrapper {
return this.web3.isAddress(address); return this.web3.isAddress(address);
} }
public async getAccountsAsync(): Promise<string[]> { public async getAccountsAsync(): Promise<string[]> {
const addresses = await promisify(this.web3.eth.getAccounts)(); const addresses = await promisify<string[]>(this.web3.eth.getAccounts)();
return addresses; return addresses;
} }
public async getFirstAccountIfExistsAsync() { public async getFirstAccountIfExistsAsync() {
@ -38,8 +38,8 @@ export class Web3Wrapper {
} }
return (addresses)[0]; return (addresses)[0];
} }
public async getNodeVersionAsync() { public async getNodeVersionAsync(): Promise<string> {
const nodeVersion = await promisify(this.web3.version.getNode)(); const nodeVersion = await promisify<string>(this.web3.version.getNode)();
return nodeVersion; return nodeVersion;
} }
public getProviderObj() { public getProviderObj() {
@ -54,24 +54,24 @@ export class Web3Wrapper {
} }
} }
public async getBalanceInEthAsync(owner: string): Promise<BigNumber> { public async getBalanceInEthAsync(owner: string): Promise<BigNumber> {
const balanceInWei: BigNumber = await promisify(this.web3.eth.getBalance)(owner); const balanceInWei: BigNumber = await promisify<BigNumber>(this.web3.eth.getBalance)(owner);
const balanceEthOldBigNumber = this.web3.fromWei(balanceInWei, 'ether'); const balanceEthOldBigNumber = this.web3.fromWei(balanceInWei, 'ether');
const balanceEth = new BigNumber(balanceEthOldBigNumber); const balanceEth = new BigNumber(balanceEthOldBigNumber);
return balanceEth; return balanceEth;
} }
public async doesContractExistAtAddressAsync(address: string): Promise<boolean> { public async doesContractExistAtAddressAsync(address: string): Promise<boolean> {
const code = await promisify(this.web3.eth.getCode)(address); const code = await promisify<string>(this.web3.eth.getCode)(address);
// Regex matches 0x0, 0x00, 0x in order to accomodate poorly implemented clients // Regex matches 0x0, 0x00, 0x in order to accomodate poorly implemented clients
const zeroHexAddressRegex = /^0[xX][0]*$/; const zeroHexAddressRegex = /^0[xX][0]*$/;
const didFindCode = _.isNull(code.match(zeroHexAddressRegex)); const didFindCode = _.isNull(code.match(zeroHexAddressRegex));
return didFindCode; return didFindCode;
} }
public async signTransactionAsync(address: string, message: string): Promise<string> { public async signTransactionAsync(address: string, message: string): Promise<string> {
const signData = await promisify(this.web3.eth.sign)(address, message); const signData = await promisify<string>(this.web3.eth.sign)(address, message);
return signData; return signData;
} }
public async getBlockTimestampAsync(blockHash: string): Promise<number> { public async getBlockTimestampAsync(blockHash: string): Promise<number> {
const {timestamp} = await promisify(this.web3.eth.getBlock)(blockHash); const {timestamp} = await promisify<Web3.BlockWithoutTransactionData>(this.web3.eth.getBlock)(blockHash);
return timestamp; return timestamp;
} }
public destroy() { public destroy() {

View File

@ -1,6 +1,6 @@
const execAsync = require('async-child-process').execAsync; const execAsync = require('async-child-process').execAsync;
const semverSort = require('semver-sort'); const semverSort = require('semver-sort');
const promisify = require('es6-promisify'); import {promisify} from '@0xproject/utils';
const publishRelease = require('publish-release'); const publishRelease = require('publish-release');
const publishReleaseAsync = promisify(publishRelease); const publishReleaseAsync = promisify(publishRelease);

View File

@ -1281,6 +1281,10 @@ bignumber.js@^4.0.2, bignumber.js@^4.1.0, bignumber.js@~4.1.0:
version "4.1.0" version "4.1.0"
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1" 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": "bignumber.js@git+https://github.com/debris/bignumber.js#master":
version "2.0.7" version "2.0.7"
resolved "git+https://github.com/debris/bignumber.js#c7a38de919ed75e6fb6ba38051986e294b328df9" resolved "git+https://github.com/debris/bignumber.js#c7a38de919ed75e6fb6ba38051986e294b328df9"
@ -5625,7 +5629,7 @@ normalize-url@^1.4.0:
query-string "^4.1.0" query-string "^4.1.0"
sort-keys "^1.0.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" version "4.1.2"
resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.2.tgz#90d62d078792d20669139e718621186656cea056" resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.2.tgz#90d62d078792d20669139e718621186656cea056"
dependencies: dependencies: