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: unzip ${CONTRACTS_COMMIT_HASH}.zip -d testrpc_snapshot
- run: node ./node_modules/lerna/bin/lerna.js bootstrap
- run: yarn lerna:run bootstrap
- run: yarn lerna:run build
- run:
name: testrpc
command: npm run testrpc -- --db testrpc_snapshot

View File

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

View File

@ -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",
@ -87,6 +88,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",

View File

@ -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();
@ -179,24 +179,31 @@ export class ZeroEx {
const defaults = {
gasPrice: config.gasPrice,
};
this._web3Wrapper = new Web3Wrapper(provider, config.networkId, defaults);
this._web3Wrapper = new Web3Wrapper(provider, defaults);
this.proxy = new TokenTransferProxyWrapper(
this._web3Wrapper,
config.networkId,
config.tokenTransferProxyContractAddress,
);
this.token = new TokenWrapper(
this._web3Wrapper,
config.networkId,
this._abiDecoder,
this.proxy,
);
this.exchange = new ExchangeWrapper(
this._web3Wrapper,
config.networkId,
this._abiDecoder,
this.token,
config.exchangeContractAddress,
);
this.tokenRegistry = new TokenRegistryWrapper(this._web3Wrapper, config.tokenRegistryContractAddress);
this.etherToken = new EtherTokenWrapper(this._web3Wrapper, this.token, config.etherTokenContractAddress);
this.tokenRegistry = new TokenRegistryWrapper(
this._web3Wrapper, config.networkId, config.tokenRegistryContractAddress,
);
this.etherToken = new EtherTokenWrapper(
this._web3Wrapper, config.networkId, this.token, config.etherTokenContractAddress,
);
this.orderStateWatcher = new OrderStateWatcher(
this._web3Wrapper, this._abiDecoder, this.token, this.exchange, config.orderWatcherConfig,
);

View File

@ -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,10 +20,19 @@ 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;
private _networkId: number;
private _abiDecoder?: AbiDecoder;
private _blockAndLogStreamer: BlockAndLogStreamer|undefined;
private _blockAndLogStreamInterval: NodeJS.Timer;
@ -30,8 +40,9 @@ export class ContractWrapper {
private _filterCallbacks: {[filterToken: string]: EventCallback<ContractEventArgs>};
private _onLogAddedSubscriptionToken: string|undefined;
private _onLogRemovedSubscriptionToken: string|undefined;
constructor(web3Wrapper: Web3Wrapper, abiDecoder?: AbiDecoder) {
constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder?: AbiDecoder) {
this._web3Wrapper = web3Wrapper;
this._networkId = networkId;
this._abiDecoder = abiDecoder;
this._filters = {};
this._filterCallbacks = {};
@ -93,15 +104,27 @@ export class ContractWrapper {
protected async _instantiateContractIfExistsAsync(
artifact: Artifact, addressIfExists?: string,
): Promise<Web3.ContractInstance> {
const web3ContractInstance = await this._web3Wrapper.getContractInstanceFromArtifactAsync(
artifact, addressIfExists,
let contractAddress: string;
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 {
if (_.isUndefined(addressIfExists)) {
const networkId = this._web3Wrapper.getNetworkId();
const contractAddress = artifact.networks[networkId].address;
const contractAddress = artifact.networks[this._networkId].address;
if (_.isUndefined(contractAddress)) {
throw new Error(ZeroExError.ExchangeContractDoesNotExist);
}

View File

@ -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';
@ -18,8 +18,9 @@ export class EtherTokenWrapper extends ContractWrapper {
private _etherTokenContractIfExists?: EtherTokenContract;
private _tokenWrapper: TokenWrapper;
private _contractAddressIfExists?: string;
constructor(web3Wrapper: Web3Wrapper, tokenWrapper: TokenWrapper, contractAddressIfExists?: string) {
super(web3Wrapper);
constructor(web3Wrapper: Web3Wrapper, networkId: number, tokenWrapper: TokenWrapper,
contractAddressIfExists?: string) {
super(web3Wrapper, networkId);
this._tokenWrapper = tokenWrapper;
this._contractAddressIfExists = contractAddressIfExists;
}

View File

@ -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';
@ -84,9 +84,9 @@ export class ExchangeWrapper extends ContractWrapper {
];
return [orderAddresses, orderValues];
}
constructor(web3Wrapper: Web3Wrapper, abiDecoder: AbiDecoder,
constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder: AbiDecoder,
tokenWrapper: TokenWrapper, contractAddressIfExists?: string) {
super(web3Wrapper, abiDecoder);
super(web3Wrapper, networkId, abiDecoder);
this._tokenWrapper = tokenWrapper;
this._orderValidationUtils = new OrderValidationUtils(tokenWrapper, this);
this._contractAddressIfExists = contractAddressIfExists;

View File

@ -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';

View File

@ -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';

View File

@ -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';

View File

@ -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';

View File

@ -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';

View File

@ -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';
@ -27,8 +27,8 @@ export class TokenRegistryWrapper extends ContractWrapper {
};
return token;
}
constructor(web3Wrapper: Web3Wrapper, contractAddressIfExists?: string) {
super(web3Wrapper);
constructor(web3Wrapper: Web3Wrapper, networkId: number, contractAddressIfExists?: string) {
super(web3Wrapper, networkId);
this._contractAddressIfExists = contractAddressIfExists;
}
/**

View File

@ -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';
@ -13,8 +13,8 @@ import {TokenTransferProxyContract} from './generated/token_transfer_proxy';
export class TokenTransferProxyWrapper extends ContractWrapper {
private _tokenTransferProxyContractIfExists?: TokenTransferProxyContract;
private _contractAddressIfExists?: string;
constructor(web3Wrapper: Web3Wrapper, contractAddressIfExists?: string) {
super(web3Wrapper);
constructor(web3Wrapper: Web3Wrapper, networkId: number, contractAddressIfExists?: string) {
super(web3Wrapper, networkId);
this._contractAddressIfExists = contractAddressIfExists;
}
/**

View File

@ -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';
@ -34,9 +34,9 @@ export class TokenWrapper extends ContractWrapper {
public UNLIMITED_ALLOWANCE_IN_BASE_UNITS = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS;
private _tokenContractsByAddress: {[address: string]: TokenContract};
private _tokenTransferProxyWrapper: TokenTransferProxyWrapper;
constructor(web3Wrapper: Web3Wrapper, abiDecoder: AbiDecoder,
constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder: AbiDecoder,
tokenTransferProxyWrapper: TokenTransferProxyWrapper) {
super(web3Wrapper, abiDecoder);
super(web3Wrapper, networkId, abiDecoder);
this._tokenContractsByAddress = {};
this._tokenTransferProxyWrapper = tokenTransferProxyWrapper;
}

View File

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

View File

@ -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';

View File

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

View File

@ -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';
@ -60,7 +60,7 @@ describe('EventWatcher', () => {
before(async () => {
web3 = web3Factory.create();
const pollingIntervalMs = 10;
web3Wrapper = new Web3Wrapper(web3.currentProvider, constants.TESTRPC_NETWORK_ID);
web3Wrapper = new Web3Wrapper(web3.currentProvider);
eventWatcher = new EventWatcher(web3Wrapper, pollingIntervalMs);
});
afterEach(() => {

View File

@ -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';

View File

@ -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';

View File

@ -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';
@ -46,7 +46,7 @@ describe('TokenWrapper', () => {
before(async () => {
web3 = web3Factory.create();
zeroEx = new ZeroEx(web3.currentProvider, config);
web3Wrapper = new Web3Wrapper(web3.currentProvider, config.networkId);
web3Wrapper = new Web3Wrapper(web3.currentProvider);
userAddresses = await zeroEx.getAvailableAddressesAsync();
tokens = await zeroEx.tokenRegistry.getTokensAsync();
tokenUtils = new TokenUtils(tokens);

View File

@ -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';

View File

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

View File

@ -1,6 +1,6 @@
# ABI Gen
This package allows you to generate contract wrappers in any language from ABI files.
This package allows you to generate TypeScript contract wrappers from ABI files.
It's heavily inspired by [Geth abigen](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) but takes a different approach.
You can write your custom handlebars templates which will allow you to seamlessly integrate the generated code into your existing codebase with existing conventions.
@ -8,7 +8,7 @@ For an example of the generated [wrapper files](https://github.com/0xProject/0x.
[Here](https://github.com/0xProject/0x.js/tree/development/packages/abi-gen-templates) are the templates used to generate those files.
## Instalation
`yarn add -g abi-gen`
`yarn add -g @0xproject/abi-gen`
## Usage
```
abi-gen
@ -18,10 +18,9 @@ Options:
--abiGlob Glob pattern to search for ABI JSON files [string] [required]
--templates Folder where to search for templates [string] [required]
--output Folder where to put the output files [string] [required]
--fileExtension The extension of the output file [string] [required]
```
## ABI files
You're required to pass a [glob](https://en.wikipedia.org/wiki/Glob_(programming) template where your abi files are located.
You're required to pass a [glob](https://en.wikipedia.org/wiki/Glob_(programming)) template where your abi files are located.
TL;DR - here is the example from 0x.js.
`--abiGlob 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken|TokenRegistry).json`
@ -34,7 +33,7 @@ The best way to get started is to copy [0x.js templates](https://github.com/0xPr
We use [handlebars](handlebarsjs.com) template engine under the hood.
You need to have a master template called `contract.mustache`. it will be used to generate each contract wrapper. Although - you don't need and probably shouldn't write all your logic in a single template file. You can write [partial templates](http://handlebarsjs.com/partials.html) and as long as they are within a partials folder - they will be registered and available.
## Which data/context do I get in my templates?
For now you don't get much on top of methods abi and a contract name because it was enough for our use-case, but if you need something else - create a PR.
[Type definition](https://github.com/0xProject/0x.js/tree/development/packages/abi-gen/src/types.ts) of what we pass to a render method.
For now you don't get much on top of methods abi, some useful helpers and a contract name because it was enough for our use-case, but if you need something else - create a PR.
See the [type definition](https://github.com/0xProject/0x.js/tree/development/packages/abi-gen/src/types.ts) of what we pass to the render method.
## Output files
Output files will be generated within an output folder with names converted to camel case and taken from abi file names. If you already have some files in that folder they will be overwritten.

View File

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

View File

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

View File

@ -12,6 +12,6 @@
"include": [
"./src/**/*",
"./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
------------------------
* Expose WebSocketOrderbookChannel and associated types to public interface (#251)
* Remove tokenA and tokenB fields from OrdersRequest (#256)
v0.2.0 - _November 29, 2017_
------------------------

View File

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

View File

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

View File

@ -61,12 +61,12 @@ describe('HttpClient', () => {
const orders = await relayerClient.getOrdersAsync();
expect(orders).to.be.deep.equal(ordersResponse);
});
it('gets specfic orders for request', async () => {
it('gets specific orders for request', async () => {
const tokenAddress = '0x323b5d4c32345ced77393b3530b1eed0f346429d';
const ordersRequest = {
tokenA: tokenAddress,
tokenAddress,
};
const urlWithQuery = `${url}?tokenA=${tokenAddress}`;
const urlWithQuery = `${url}?tokenAddress=${tokenAddress}`;
fetchMock.get(urlWithQuery, ordersResponseJSON);
const orders = await relayerClient.getOrdersAsync(ordersRequest);
expect(orders).to.be.deep.equal(ordersResponse);

View File

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

View File

@ -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 = {

View File

@ -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';

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 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<Web3.TxData>;
private defaults: Partial<TxData>;
constructor(opts: DeployerOptions) {
this.artifactsDir = opts.artifactsDir;
@ -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;

View File

@ -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';

View File

@ -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<string[]>(fs.readdir),
readFileAsync: promisify<string>(fs.readFile),
writeFileAsync: promisify<undefined>(fs.writeFile),
mkdirAsync: promisify<undefined>(fs.mkdir),
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';
export enum AbiType {
@ -54,7 +55,7 @@ export interface DeployerOptions {
artifactsDir: string;
jsonrpcPort: number;
networkId: number;
defaults: Partial<Web3.TxData>;
defaults: Partial<TxData>;
}
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,
};
const compiler = new Compiler(compilerOpts);
const deployerOpts: DeployerOptions = {
const deployerOpts = {
artifactsDir,
networkId: constants.networkId,
jsonrpcPort: constants.jsonrpcPort,

View File

@ -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',

View File

@ -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<any>);
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;

View File

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

View File

@ -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<string>(web3.eth.sendTransaction);
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);
return balance;
};

View File

@ -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<number>(web3.eth.getBlockNumber)();
const blockInfo = await promisify<Web3.BlockWithoutTransactionData>(web3.eth.getBlock)(blockNum);
const timestamp = new BigNumber(blockInfo.timestamp);
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 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<string>(web3.eth.sign)(this.params.maker, orderHash);
const {v, r, s} = ethUtil.fromRpcSig(signature);
this.params = _.assign(this.params, {
orderHashHex: orderHash,

View File

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

View File

@ -1,7 +1 @@
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 * as chai from 'chai';
import * as dirtyChai from 'dirty-chai';
import promisify = require('es6-promisify');
import forEach = require('lodash.foreach');
import 'mocha';

View File

@ -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": {

View File

@ -1,4 +1,4 @@
import promisify = require('es6-promisify');
import {promisify} from '@0xproject/utils';
import * as _ from 'lodash';
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 * 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;
@ -16,21 +15,11 @@ interface RawLogEntry {
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<TxData>;
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)) {
// 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`
@ -38,7 +27,6 @@ export class Web3Wrapper {
(provider as any).sendAsync = (provider as any).send;
}
this.web3 = new Web3();
this.networkId = networkId;
this.web3.setProvider(provider);
this.defaults = defaults || {};
this.jsonRpcRequestId = 0;
@ -47,7 +35,6 @@ export class Web3Wrapper {
return this.defaults;
}
public setProvider(provider: Web3.Provider, networkId: number) {
this.networkId = networkId;
this.web3.setProvider(provider);
}
public isAddress(address: string): boolean {
@ -61,6 +48,11 @@ export class Web3Wrapper {
const nodeVersion = await promisify<string>(this.web3.version.getNode)();
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> {
const transactionReceipt = await promisify<TransactionReceipt>(this.web3.eth.getTransactionReceipt)(txHash);
if (!_.isNull(transactionReceipt)) {
@ -71,37 +63,13 @@ export class Web3Wrapper {
public getCurrentProvider(): Web3.Provider {
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 {
const balanceWei = this.web3.toWei(ethAmount, 'ether');
return balanceWei;
}
public async getBalanceInWeiAsync(owner: string): Promise<BigNumber> {
let balanceInWei = await promisify<BigNumber>(this.web3.eth.getBalance)(owner);
// Rewrap in a new BigNumber
balanceInWei = new BigNumber(balanceInWei);
return balanceInWei;
}
@ -155,13 +123,17 @@ export class Web3Wrapper {
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);
public getContractFromAbi(abi: Web3.ContractAbi): Web3.Contract<any> {
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;
}
private async getNetworkAsync(): Promise<number> {
const networkId = await promisify<number>(this.web3.version.getNetwork)();
return networkId;
public async estimateGasAsync(data: string): Promise<number> {
const gas = await promisify<number>(this.web3.eth.estimateGas)({data});
return gas;
}
private async sendRawPayloadAsync<A>(payload: Web3.JSONRPCRequestPayload): Promise<A> {
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",
"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",

View File

@ -23,9 +23,9 @@ import {
LedgerWalletSubprovider,
RedundantRPCSubprovider,
} from '@0xproject/subproviders';
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';
@ -68,7 +68,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;
@ -631,7 +631,7 @@ export class Blockchain {
let networkIdIfExists: number;
if (!_.isUndefined(injectedWeb3)) {
try {
networkIdIfExists = _.parseInt(await promisify(injectedWeb3.version.getNetwork)());
networkIdIfExists = _.parseInt(await promisify<string>(injectedWeb3.version.getNetwork)());
} catch (err) {
// Ignore error and proceed with networkId undefined
}

View File

@ -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';

View File

@ -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<string[]> {
const addresses = await promisify(this.web3.eth.getAccounts)();
const addresses = await promisify<string[]>(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<string> {
const nodeVersion = await promisify<string>(this.web3.version.getNode)();
return nodeVersion;
}
public getProviderObj() {
@ -54,24 +54,24 @@ export class Web3Wrapper {
}
}
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 balanceEth = new BigNumber(balanceEthOldBigNumber);
return balanceEth;
}
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
const zeroHexAddressRegex = /^0[xX][0]*$/;
const didFindCode = _.isNull(code.match(zeroHexAddressRegex));
return didFindCode;
}
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;
}
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;
}
public destroy() {

View File

@ -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);

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"
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"
@ -5625,7 +5629,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: