Compare commits
240 Commits
contracts@
...
@0xproject
Author | SHA1 | Date | |
---|---|---|---|
|
b987b5988d | ||
|
6ba6bec105 | ||
|
d95b1e2db4 | ||
|
c1d6c7ff66 | ||
|
6e12794765 | ||
|
0f4b05e374 | ||
|
695b697cdf | ||
|
3aea0e3b2f | ||
|
c0e92d511e | ||
|
51f2a20b2a | ||
|
333a23f222 | ||
|
3bf3f479f5 | ||
|
6241d06f27 | ||
|
9e81d3c87b | ||
|
a9b2838c5f | ||
|
fbc39614c0 | ||
|
b2d6ac8dba | ||
|
b090b7b1f2 | ||
|
ba0696a0d7 | ||
|
b57850a225 | ||
|
4d9029bb0e | ||
|
bc49dde4d5 | ||
|
afe07b2926 | ||
|
2411bfc20f | ||
|
4d4ea8a4d0 | ||
|
595517e68b | ||
|
40ab2de393 | ||
|
723276ae3f | ||
|
76c5945017 | ||
|
01c6fd92e8 | ||
|
3f230a8fdb | ||
|
2a6a71ea6c | ||
|
cd23f220a0 | ||
|
fab88ea2cc | ||
|
688f8615ff | ||
|
d187a31e38 | ||
|
c6f85464ce | ||
|
a220b56736 | ||
|
0e33f45f3d | ||
|
ff7c3012a5 | ||
|
20fec2943b | ||
|
08b30b0706 | ||
|
bf52ce7e72 | ||
|
1bac5019e8 | ||
|
19454a92dc | ||
|
cdbb3a015f | ||
|
644da2b0cb | ||
|
57446d78f1 | ||
|
3e285c0ef1 | ||
|
a322148631 | ||
|
33ec9fdf47 | ||
|
323826111a | ||
|
ddd3d284d9 | ||
|
f55a300f43 | ||
|
08a69ebd6e | ||
|
ddb8e26bec | ||
|
57ca611e12 | ||
|
1eff120f49 | ||
|
4bc6096ec0 | ||
|
95eb114051 | ||
|
9c856de49c | ||
|
d502f79303 | ||
|
5224337323 | ||
|
ef49192170 | ||
|
c9df388731 | ||
|
870da2ab22 | ||
|
6122840241 | ||
|
03b00ef8da | ||
|
84b820abc6 | ||
|
cc4ff568a9 | ||
|
665011174b | ||
|
37f210e9f0 | ||
|
9c01e3a8a0 | ||
|
c4dd9658e7 | ||
|
29aa09e448 | ||
|
1337b6928a | ||
|
ac35d8127e | ||
|
a6ae1efadb | ||
|
bd7b5c51b2 | ||
|
397cd77ef9 | ||
|
743c3dbe01 | ||
|
9f1c212596 | ||
|
defd249565 | ||
|
8926dac78c | ||
|
18cac3f092 | ||
|
01e27426d6 | ||
|
0b09cc36b0 | ||
|
f3cb484f82 | ||
|
0053762760 | ||
|
d72b7299c6 | ||
|
eb89ef79eb | ||
|
066d13f5b7 | ||
|
ec06d8d606 | ||
|
a2e4aaa9a3 | ||
|
26e9696ddb | ||
|
343191e936 | ||
|
3e3b667366 | ||
|
3b45d4727b | ||
|
b4f3450d4a | ||
|
0a8b7cb494 | ||
|
125ace3519 | ||
|
109fc41474 | ||
|
f30353087f | ||
|
d106079d9b | ||
|
dc3be992a3 | ||
|
bed7d87b7f | ||
|
05daab5dea | ||
|
170e5589f9 | ||
|
538914aa52 | ||
|
81deb68c8e | ||
|
36986fe9c9 | ||
|
5791632933 | ||
|
289359bf0d | ||
|
81f6487865 | ||
|
21b797c3f9 | ||
|
de8450d5c9 | ||
|
bcb9ee4cc2 | ||
|
7c87447241 | ||
|
b39d87f357 | ||
|
552b14b1fa | ||
|
5779ffd01b | ||
|
a7c24a17f4 | ||
|
8743c40911 | ||
|
7ef6bd4b14 | ||
|
6af0f08dfc | ||
|
54ae94dde0 | ||
|
c570f3865f | ||
|
ed9d1da297 | ||
|
beb483ea85 | ||
|
46b7fecafe | ||
|
e476682922 | ||
|
8478dc8d6d | ||
|
9f8e41cbfa | ||
|
3916383dd0 | ||
|
a60c8f7d8c | ||
|
4e5cd472c2 | ||
|
e1341bc6d9 | ||
|
d437a66019 | ||
|
542b46a22f | ||
|
6fef533fff | ||
|
ec219fc395 | ||
|
a555a8a374 | ||
|
78e9c48803 | ||
|
18d3e5458a | ||
|
ac25764d12 | ||
|
c55e7fa91a | ||
|
e31ba2e12e | ||
|
73f8ae9a47 | ||
|
32b85625c1 | ||
|
629edd3108 | ||
|
ee77b81551 | ||
|
2c7fdac5cd | ||
|
d118116548 | ||
|
8d01956c3e | ||
|
1dda8c1468 | ||
|
111f7e917e | ||
|
477daf4168 | ||
|
8b52793f2f | ||
|
18b9fe5256 | ||
|
439e864085 | ||
|
f45191d0e8 | ||
|
32feadee42 | ||
|
c4b4bb9e8e | ||
|
8fd705d2af | ||
|
3c36135d6c | ||
|
02ede26893 | ||
|
af21ad1615 | ||
|
07fa01528b | ||
|
38f716bd77 | ||
|
6a410b03ff | ||
|
3cd7bce0a3 | ||
|
6693540f43 | ||
|
647bc5a63e | ||
|
4f76bb2a12 | ||
|
9991ddecc2 | ||
|
3cf2cb89bb | ||
|
2875cfa8c7 | ||
|
87cbbdad72 | ||
|
07de3a1d94 | ||
|
27880a6059 | ||
|
0367e4117a | ||
|
ec582d6e46 | ||
|
4ca706d4e6 | ||
|
72671c1014 | ||
|
a3c31f4f4a | ||
|
db8be4a66e | ||
|
2f7c19e80d | ||
|
7d9c357409 | ||
|
abf41b073c | ||
|
c9b07107f3 | ||
|
773be348a3 | ||
|
b7bb8d9b2a | ||
|
c7c12371ef | ||
|
fb40b10501 | ||
|
d4dce41d3a | ||
|
293b55e51f | ||
|
11bac66046 | ||
|
2a438419ab | ||
|
0f0aca7de5 | ||
|
f699b9a73f | ||
|
214096de9e | ||
|
a0ccb609cd | ||
|
4e05554b3e | ||
|
04c08b9fc8 | ||
|
86c1c8082d | ||
|
c5afc5feb5 | ||
|
5468358f21 | ||
|
87044313c2 | ||
|
794b155827 | ||
|
4941ffd354 | ||
|
aa8a3ee055 | ||
|
c1d17c83f8 | ||
|
db030016fa | ||
|
ae04f55882 | ||
|
b40fab35f6 | ||
|
644deee8b5 | ||
|
c7302c46e5 | ||
|
4948551703 | ||
|
d7bf003d51 | ||
|
5a827eb3d4 | ||
|
b37076136b | ||
|
3574ab253f | ||
|
312a30578b | ||
|
8243e73413 | ||
|
5175fe8107 | ||
|
8d1e27a1a5 | ||
|
e4ea6e1ec3 | ||
|
f9ad97b978 | ||
|
b145a17d11 | ||
|
3430e2bdac | ||
|
cdcf925378 | ||
|
76029cbf09 | ||
|
b9c1653c1c | ||
|
9593739938 | ||
|
28d63ad8e1 | ||
|
56eeea1e63 | ||
|
642a2cf165 | ||
|
a86f8a81a2 | ||
|
ba9a734ba7 | ||
|
b08374f0ba |
@@ -27,6 +27,15 @@ jobs:
|
|||||||
key: repo-{{ .Environment.CIRCLE_SHA1 }}
|
key: repo-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
paths:
|
paths:
|
||||||
- ~/repo
|
- ~/repo
|
||||||
|
test-installation:
|
||||||
|
docker:
|
||||||
|
- image: circleci/node:6.12
|
||||||
|
working_directory: ~/repo
|
||||||
|
steps:
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- run: yarn test:installation
|
||||||
test-0xjs:
|
test-0xjs:
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/node:6.12
|
- image: circleci/node:6.12
|
||||||
@@ -174,6 +183,9 @@ workflows:
|
|||||||
main:
|
main:
|
||||||
jobs:
|
jobs:
|
||||||
- build
|
- build
|
||||||
|
- test-installation:
|
||||||
|
requires:
|
||||||
|
- build
|
||||||
- test-0xjs:
|
- test-0xjs:
|
||||||
requires:
|
requires:
|
||||||
- build
|
- build
|
||||||
|
8
.gitignore
vendored
8
.gitignore
vendored
@@ -76,5 +76,13 @@ bin/
|
|||||||
# generated contract artifacts
|
# generated contract artifacts
|
||||||
packages/contracts/src/artifacts
|
packages/contracts/src/artifacts
|
||||||
|
|
||||||
|
# generated contract wrappers
|
||||||
|
packages/0x.js/src/contract_wrappers/generated/
|
||||||
|
packages/contracts/src/contract_wrappers/generated/
|
||||||
|
packages/metacoin/src/contract_wrappers
|
||||||
|
|
||||||
|
# solc-bin in deployer
|
||||||
|
packages/deployer/solc_bin/
|
||||||
|
|
||||||
# Monorepo scripts
|
# Monorepo scripts
|
||||||
packages/*/scripts/
|
packages/*/scripts/
|
||||||
|
34
README.md
34
README.md
@@ -19,7 +19,7 @@ This repository is a monorepo including the 0x protocol smart contracts and nume
|
|||||||
### Published Packages
|
### Published Packages
|
||||||
|
|
||||||
| Package | Version | Description |
|
| Package | Version | Description |
|
||||||
| ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
|
| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
|
||||||
| [`0x.js`](/packages/0x.js) | [](https://www.npmjs.com/package/0x.js) | A Javascript library for interacting with the 0x protocol |
|
| [`0x.js`](/packages/0x.js) | [](https://www.npmjs.com/package/0x.js) | A Javascript library for interacting with the 0x protocol |
|
||||||
| [`@0xproject/abi-gen`](/packages/abi-gen) | [](https://www.npmjs.com/package/@0xproject/abi-gen) | Tool to generate TS wrappers from smart contract ABIs |
|
| [`@0xproject/abi-gen`](/packages/abi-gen) | [](https://www.npmjs.com/package/@0xproject/abi-gen) | Tool to generate TS wrappers from smart contract ABIs |
|
||||||
| [`@0xproject/assert`](/packages/assert) | [](https://www.npmjs.com/package/@0xproject/assert) | Type and schema assertions used by our packages |
|
| [`@0xproject/assert`](/packages/assert) | [](https://www.npmjs.com/package/@0xproject/assert) | Type and schema assertions used by our packages |
|
||||||
@@ -36,18 +36,10 @@ This repository is a monorepo including the 0x protocol smart contracts and nume
|
|||||||
| [`@0xproject/subproviders`](/packages/subproviders) | [](https://www.npmjs.com/package/@0xproject/subproviders) | Useful web3 subproviders (e.g LedgerSubprovider) |
|
| [`@0xproject/subproviders`](/packages/subproviders) | [](https://www.npmjs.com/package/@0xproject/subproviders) | Useful web3 subproviders (e.g LedgerSubprovider) |
|
||||||
| [`@0xproject/tslint-config`](/packages/tslint-config) | [](https://www.npmjs.com/package/@0xproject/tslint-config) | Custom 0x development TSLint rules |
|
| [`@0xproject/tslint-config`](/packages/tslint-config) | [](https://www.npmjs.com/package/@0xproject/tslint-config) | Custom 0x development TSLint rules |
|
||||||
| [`@0xproject/types`](/packages/types) | [](https://www.npmjs.com/package/@0xproject/types) | Shared type declarations |
|
| [`@0xproject/types`](/packages/types) | [](https://www.npmjs.com/package/@0xproject/types) | Shared type declarations |
|
||||||
|
| [`@0xproject/typescript-typings`](/packages/typescript-typings) | [](https://www.npmjs.com/package/@0xproject/typescript-typings) | Repository of types for external packages |
|
||||||
| [`@0xproject/utils`](/packages/utils) | [](https://www.npmjs.com/package/@0xproject/utils) | Shared utilities |
|
| [`@0xproject/utils`](/packages/utils) | [](https://www.npmjs.com/package/@0xproject/utils) | Shared utilities |
|
||||||
| [`@0xproject/web3-wrapper`](/packages/web3-wrapper) | [](https://www.npmjs.com/package/@0xproject/web3-wrapper) | Web3 wrapper |
|
| [`@0xproject/web3-wrapper`](/packages/web3-wrapper) | [](https://www.npmjs.com/package/@0xproject/web3-wrapper) | Web3 wrapper |
|
||||||
|
|
||||||
### TypeScript Typings
|
|
||||||
|
|
||||||
| Package | Version | Description |
|
|
||||||
| -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
|
|
||||||
| [`chai-as-promised-typescript-typings`](/packages/chai-as-promised-typescript-typings) | [](https://www.npmjs.com/package/chai-as-promised-typescript-typings) | Chai as promised typescript typings |
|
|
||||||
| [`chai-typescript-typings`](/packages/chai-typescript-typings) | [](https://www.npmjs.com/package/chai-typescript-typings) | Chai typescript typings |
|
|
||||||
| [`ethers-typescript-typings`](/packages/ethers-typescript-typings) | [](https://www.npmjs.com/package/ethers-typescript-typings) | [Ethers.js](https://github.com/ethers-io/ethers.js/) typescript typings |
|
|
||||||
| [`web3-typescript-typings`](/packages/web3-typescript-typings) | [](https://www.npmjs.com/package/web3-typescript-typings) | Web3 typescript typings |
|
|
||||||
|
|
||||||
### Private Packages
|
### Private Packages
|
||||||
|
|
||||||
| Package | Description |
|
| Package | Description |
|
||||||
@@ -64,8 +56,20 @@ Dedicated documentation pages:
|
|||||||
* [0x.js Library](https://0xproject.com/docs/0xjs)
|
* [0x.js Library](https://0xproject.com/docs/0xjs)
|
||||||
* [0x Connect](https://0xproject.com/docs/connect)
|
* [0x Connect](https://0xproject.com/docs/connect)
|
||||||
* [Smart contracts](https://0xproject.com/docs/contracts)
|
* [Smart contracts](https://0xproject.com/docs/contracts)
|
||||||
|
* [Subproviders](https://0xproject.com/docs/subproviders)
|
||||||
|
* [Deployer](https://0xproject.com/docs/deployer)
|
||||||
|
* [Web3-wrapper](https://0xproject.com/docs/web3-wrapper)
|
||||||
|
* [JSON-schemas](https://0xproject.com/docs/json-schemas)
|
||||||
|
* [Sol-cov](https://0xproject.com/docs/sol-cov)
|
||||||
* [Standard Relayer API](https://github.com/0xProject/standard-relayer-api/blob/master/README.md)
|
* [Standard Relayer API](https://github.com/0xProject/standard-relayer-api/blob/master/README.md)
|
||||||
|
|
||||||
|
Most of the packages require additional typings for external dependencies.
|
||||||
|
You can include those by prepending @0xproject/typescript-typings package to your [`typeRoots`](http://www.typescriptlang.org/docs/handbook/tsconfig-json.html) config.
|
||||||
|
|
||||||
|
```json
|
||||||
|
"typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
|
||||||
|
```
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
|
We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
|
||||||
@@ -88,13 +92,17 @@ yarn install
|
|||||||
|
|
||||||
### Build
|
### Build
|
||||||
|
|
||||||
Build all packages
|
Build all packages. You need to do this before working on any given package. Although these packages
|
||||||
|
as independent, when run from within the monorepo, they are internally symlinked, to make development
|
||||||
|
easier. You can change several packages and run the changes without publishing them first to NPM. When
|
||||||
|
running `rebuild`, Lerna will figure out the dependency order of all the packages, and build them in
|
||||||
|
this order.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yarn lerna:run build
|
yarn lerna:rebuild
|
||||||
```
|
```
|
||||||
|
|
||||||
Continuously rebuild on exchange
|
Or continuously rebuild on change:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yarn dev
|
yarn dev
|
||||||
|
18
package.json
18
package.json
@@ -1,28 +1,36 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"name": "0x-monorepo",
|
"name": "0x-monorepo",
|
||||||
"workspaces": ["packages/*"],
|
"workspaces": [
|
||||||
|
"packages/*"
|
||||||
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "lerna run --parallel build:watch",
|
"dev": "lerna run --parallel build:watch",
|
||||||
"testrpc": "testrpc -p 8545 --networkId 50 -m \"${npm_package_config_mnemonic}\"",
|
"testrpc": "testrpc -p 8545 --networkId 50 -m \"${npm_package_config_mnemonic}\"",
|
||||||
"prettier": "prettier --write '**/*.{ts,tsx,json,md}' --config .prettierrc",
|
"prettier": "prettier --write '**/*.{ts,tsx,json,md}' --config .prettierrc",
|
||||||
"prettier:ci": "prettier --list-different '**/*.{ts,tsx,json,md}' --config .prettierrc",
|
"prettier:ci": "prettier --list-different '**/*.{ts,tsx,json,md}' --config .prettierrc",
|
||||||
"report_coverage": "lcov-result-merger 'packages/*/coverage/lcov.info' | coveralls",
|
"report_coverage": "lcov-result-merger 'packages/*/coverage/lcov.info' | coveralls",
|
||||||
|
"test:installation": "node ./packages/monorepo-scripts/lib/test_installation.js",
|
||||||
|
"lerna:install": "yarn install",
|
||||||
"lerna:run": "lerna run",
|
"lerna:run": "lerna run",
|
||||||
"lerna:rebuild": "lerna run clean; lerna run build;",
|
"lerna:clean": "lerna run clean",
|
||||||
"lerna:publish":
|
"lerna:build": "lerna run build",
|
||||||
"yarn install; lerna run clean; lerna run build; lerna publish --registry=https://registry.npmjs.org/"
|
"lerna:rebuild": "run-s lerna:clean lerna:build",
|
||||||
|
"lerna:publish": "run-s lerna:install lerna:rebuild script:publish",
|
||||||
|
"lerna:publish:dry": "run-s lerna:install lerna:rebuild script:publish:dry",
|
||||||
|
"script:publish": "node ./packages/monorepo-scripts/lib/publish.js",
|
||||||
|
"script:publish:dry": "IS_DRY_RUN=true yarn script:publish"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"mnemonic": "concert load couple harbor equip island argue ramp clarify fence smart topic"
|
"mnemonic": "concert load couple harbor equip island argue ramp clarify fence smart topic"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0xproject/utils": "^0.4.2",
|
|
||||||
"async-child-process": "^1.1.1",
|
"async-child-process": "^1.1.1",
|
||||||
"coveralls": "^3.0.0",
|
"coveralls": "^3.0.0",
|
||||||
"ethereumjs-testrpc": "^6.0.3",
|
"ethereumjs-testrpc": "^6.0.3",
|
||||||
"lcov-result-merger": "^2.0.0",
|
"lcov-result-merger": "^2.0.0",
|
||||||
"lerna": "^2.5.1",
|
"lerna": "^2.5.1",
|
||||||
|
"npm-run-all": "^4.1.2",
|
||||||
"prettier": "^1.11.1"
|
"prettier": "^1.11.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -8,3 +8,4 @@ test/
|
|||||||
/contract_templates/
|
/contract_templates/
|
||||||
/generated_docs/
|
/generated_docs/
|
||||||
/scripts/
|
/scripts/
|
||||||
|
/lib/src/monorepo_scripts/
|
||||||
|
1023
packages/0x.js/CHANGELOG.json
Normal file
1023
packages/0x.js/CHANGELOG.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,15 +1,31 @@
|
|||||||
# CHANGELOG
|
<!--
|
||||||
|
This file is auto-generated using the monorepo-scripts package. Don't edit directly.
|
||||||
|
Edit the package's CHANGELOG.json file only.
|
||||||
|
-->
|
||||||
|
|
||||||
## v0.33.2 - _March 18, 2018_
|
CHANGELOG
|
||||||
|
|
||||||
|
## v0.35.0 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Removed `ZeroExError.TransactionMiningTimeout` and moved it to '@0xproject/web3_wrapper' `Web3WrapperErrors.TransactionMiningTimeout` (#485)
|
||||||
|
|
||||||
|
## v0.34.0 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Fix the bug causing `zeroEx.exchange.fillOrdersUpToAsync` validation to fail if there were some extra orders passed (#470)
|
||||||
|
* Remove automatic instantiation of `zeroEx.orderStateWatcher` (#488)
|
||||||
|
* Add `zeroEx.createOrderStateWatcher` to allow creating arbitrary number of OrderStateWatchers (#488)
|
||||||
|
* Added `stateLayer` setting to `OrderStateWatcherConfig` so OrderStateWatcher can be set to monitor different blockchain state layers (#488)
|
||||||
|
|
||||||
|
## v0.33.2 - _March 17, 2018_
|
||||||
|
|
||||||
* Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
|
* Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
|
||||||
* Consolidate `Order`, `SignedOrder`, and `ECSignature` into the `@0xproject/types` package (#456)
|
* Consolidate `Order`, `SignedOrder`, and `ECSignature` into the `@0xproject/types` package (#456)
|
||||||
|
|
||||||
## v0.33.1 - _March 8, 2018_
|
## v0.33.1 - _March 7, 2018_
|
||||||
|
|
||||||
* Add missing EthersJs typescript typings as dependency
|
* Add missing EthersJs typescript typings as dependency
|
||||||
|
|
||||||
## v0.33.0 - _March 4, 2018_
|
## v0.33.0 - _March 3, 2018_
|
||||||
|
|
||||||
* Validate and lowercase all addresses in public methods (#373)
|
* Validate and lowercase all addresses in public methods (#373)
|
||||||
* Improve validation to force passing contract addresses on private networks (#385)
|
* Improve validation to force passing contract addresses on private networks (#385)
|
||||||
@@ -17,57 +33,54 @@
|
|||||||
* Rename all public `_unsubscribeAll` methods to `unsubscribeAll` (#415)
|
* Rename all public `_unsubscribeAll` methods to `unsubscribeAll` (#415)
|
||||||
* Move web3 typings from devDep to dep since cannot use this package without it (#429)
|
* Move web3 typings from devDep to dep since cannot use this package without it (#429)
|
||||||
|
|
||||||
## v0.32.2 - _February 9, 2018_
|
## v0.32.2 - _February 8, 2018_
|
||||||
|
|
||||||
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
||||||
|
|
||||||
## v0.32.1 - _February 7, 2018_
|
## v0.32.1 - _February 6, 2018_
|
||||||
|
|
||||||
* Reorganized `BlockParamLiteral` export into `@0xproject/types` package (#355)
|
* Reorganized `BlockParamLiteral` export into `@0xproject/types` package (#355)
|
||||||
* Now using `abi-gen` package to generate ContractEventArgs types (#371)
|
* Now using `abi-gen` package to generate ContractEventArgs types (#371)
|
||||||
|
|
||||||
## v0.32.0 - _February 5, 2018_
|
## v0.32.0 - _February 4, 2018_
|
||||||
|
|
||||||
* Add `zeroEx.etherToken.getContractAddressIfExists` (#350)
|
* Add `zeroEx.etherToken.getContractAddressIfExists` (#350)
|
||||||
* Fixed the bug causing order watcher to throw if there is an event with the same signature but different indexed fields (#366)
|
* Fixed the bug causing order watcher to throw if there is an event with the same signature but different indexed fields (#366)
|
||||||
|
|
||||||
## v0.31.1 - _February 1, 2018_
|
## v0.31.1 - _January 31, 2018_
|
||||||
|
|
||||||
* Fix the bug causing order watcher to throw if makerToken === zrx (#357)
|
* Fix the bug causing order watcher to throw if makerToken === zrx (#357)
|
||||||
|
|
||||||
## v0.31.0 - _January 30, 2018_
|
## v0.31.0 - _January 29, 2018_
|
||||||
|
|
||||||
* Add the `shouldAddPersonalMessagePrefix` parameter to `signOrderHashAsync` so that the
|
* Add the `shouldAddPersonalMessagePrefix` parameter to `signOrderHashAsync` so that the caller can decide on whether to add the personalMessage prefix before relaying the request to the signer. Parity Signer, Ledger and TestRPC add the prefix themselves, Metamask expects it to have already been added. (#349)
|
||||||
caller can decide on whether to add the personalMessage prefix before relaying the request
|
|
||||||
to the signer. Parity Signer, Ledger and TestRPC add the prefix themselves, Metamask expects
|
|
||||||
it to have already been added. (#349)
|
|
||||||
|
|
||||||
## v0.30.2 - _January 29, 2018_
|
## v0.30.2 - _January 28, 2018_
|
||||||
|
|
||||||
* Add Rinkeby testnet addresses to artifacts (#337)
|
* Add Rinkeby testnet addresses to artifacts (#337)
|
||||||
* Move @0xproject/types to dependencies from devDependencies fixing missing type errors
|
* Move @0xproject/types to dependencies from devDependencies fixing missing type errors
|
||||||
|
|
||||||
## v0.30.1 - _January 24, 2018_
|
## v0.30.1 - _January 23, 2018_
|
||||||
|
|
||||||
* Fix a bug allowing negative fill values (#212)
|
* Fix a bug allowing negative fill values (#212)
|
||||||
* Fix a bug that made it impossible to pass a custom ZRX address (#341)
|
* Fix a bug that made it impossible to pass a custom ZRX address (#341)
|
||||||
|
|
||||||
## v0.30.0 - _January 17, 2018_
|
## v0.30.0 - _January 16, 2018_
|
||||||
|
|
||||||
* Add an error parameter to the order watcher callback (#312)
|
* Add an error parameter to the order watcher callback (#312)
|
||||||
* Fix a bug making it impossible to catch some errors from awaitTransactionMinedAsync (#312)
|
* Fix a bug making it impossible to catch some errors from awaitTransactionMinedAsync (#312)
|
||||||
* Fix a bug in fillOrdersUpTo validation making it impossible to fill up to if user doesn't have enough balance to fully fill all the orders (#321)
|
* Fix a bug in fillOrdersUpTo validation making it impossible to fill up to if user doesn't have enough balance to fully fill all the orders (#321)
|
||||||
|
|
||||||
## v0.29.1 - _January 11, 2018_
|
## v0.29.1 - _January 10, 2018_
|
||||||
|
|
||||||
* Fixed bignumber config issue #301 (#305)
|
* Fixed bignumber config issue #301 (#305)
|
||||||
|
|
||||||
## v0.29.0 - _December 28, 2017_
|
## v0.29.0 - _December 27, 2017_
|
||||||
|
|
||||||
* Assert baseUnit amount supplied to `toUnitAmount` is integer amount. (#287)
|
* Assert baseUnit amount supplied to `toUnitAmount` is integer amount. (#287)
|
||||||
* `toBaseUnitAmount` throws if amount supplied has too many decimals (#287)
|
* `toBaseUnitAmount` throws if amount supplied has too many decimals (#287)
|
||||||
|
|
||||||
## v0.28.0 - _December 20, 2017_
|
## v0.28.0 - _December 19, 2017_
|
||||||
|
|
||||||
* Add `etherTokenAddress` arg to `depositAsync` and `withdrawAsync` methods on `zeroEx.etherToken` (#267)
|
* Add `etherTokenAddress` arg to `depositAsync` and `withdrawAsync` methods on `zeroEx.etherToken` (#267)
|
||||||
* Removed accidentally included `unsubscribeAll` method from `zeroEx.proxy`, `zeroEx.etherToken` and `zeroEx.tokenRegistry` (#267)
|
* Removed accidentally included `unsubscribeAll` method from `zeroEx.proxy`, `zeroEx.etherToken` and `zeroEx.tokenRegistry` (#267)
|
||||||
@@ -79,11 +92,11 @@
|
|||||||
* Support `Deposit` and `Withdraw` events on etherToken (#277)
|
* Support `Deposit` and `Withdraw` events on etherToken (#277)
|
||||||
* Improve the error message when taker is not a string (#278)
|
* Improve the error message when taker is not a string (#278)
|
||||||
|
|
||||||
## v0.27.1 - _November 28, 2017_
|
## v0.27.1 - _November 27, 2017_
|
||||||
|
|
||||||
* Export `TransactionOpts` type
|
* Export `TransactionOpts` type
|
||||||
|
|
||||||
## v0.27.0 - _November 28, 2017_
|
## v0.27.0 - _November 27, 2017_
|
||||||
|
|
||||||
* Make `ZeroExConfig` required parameter of `ZeroEx` constructor (#233)
|
* Make `ZeroExConfig` required parameter of `ZeroEx` constructor (#233)
|
||||||
* Add a required property `networkId` to `ZeroExConfig` (#233)
|
* Add a required property `networkId` to `ZeroExConfig` (#233)
|
||||||
@@ -95,65 +108,65 @@
|
|||||||
* All transaction sending methods now call `estimateGas` if no gas amount was supplied (#235)
|
* All transaction sending methods now call `estimateGas` if no gas amount was supplied (#235)
|
||||||
* Modify order validation methods to validate against the `latest` block, not against the `pending` block (#236)
|
* Modify order validation methods to validate against the `latest` block, not against the `pending` block (#236)
|
||||||
|
|
||||||
## v0.26.0 - _November 21, 2017_
|
## v0.26.0 - _November 20, 2017_
|
||||||
|
|
||||||
* Add post-formatter for logs converting `blockNumber`, `logIndex`, `transactionIndex` from hexes to numbers (#231)
|
* Add post-formatter for logs converting `blockNumber`, `logIndex`, `transactionIndex` from hexes to numbers (#231)
|
||||||
* Remove support for Async callback types when used in Subscribe functions (#222)
|
* Remove support for Async callback types when used in Subscribe functions (#222)
|
||||||
* In OrderWatcher subscribe to ZRX Token Transfer and Approval events when maker token is different (#225)
|
* In OrderWatcher subscribe to ZRX Token Transfer and Approval events when maker token is different (#225)
|
||||||
|
|
||||||
## v0.25.1 - _November 13, 2017_
|
## v0.25.1 - _November 12, 2017_
|
||||||
|
|
||||||
* Standardise on Cancelled over Canceled (#217)
|
* Standardise on Cancelled over Canceled (#217)
|
||||||
* Add missing `DecodedLogEvent` type to exported types (#205)
|
* Add missing `DecodedLogEvent` type to exported types (#205)
|
||||||
* Normalized the transactionReceipt status to be `null|0|1`, 1 meaning transaction execution successful, 0 unsuccessful and `null` if it is a pre-byzantinium transaction. (#200)
|
* Normalized the transactionReceipt status to be `null|0|1`, 1 meaning transaction execution successful, 0 unsuccessful and `null` if it is a pre-byzantinium transaction. (#200)
|
||||||
|
|
||||||
## v0.23.0 - _November 12, 2017_
|
## v0.23.0 - _November 11, 2017_
|
||||||
|
|
||||||
* Fixed unhandled promise rejection error in subscribe methods (#209)
|
* Fixed unhandled promise rejection error in subscribe methods (#209)
|
||||||
* Subscribe callbacks now receive an error object as their first argument
|
* Subscribe callbacks now receive an error object as their first argument
|
||||||
|
|
||||||
## v0.22.6 - _November 10, 2017_
|
## v0.22.6 - _November 9, 2017_
|
||||||
|
|
||||||
* Add a timeout parameter to transaction awaiting (#206)
|
* Add a timeout parameter to transaction awaiting (#206)
|
||||||
|
|
||||||
## v0.22.5 - _November 7, 2017_
|
## v0.22.5 - _November 6, 2017_
|
||||||
|
|
||||||
* Re-publish v0.22.4 to fix publishing issue
|
* Re-publish v0.22.4 to fix publishing issue
|
||||||
|
|
||||||
## v0.22.4 - _October 25, 2017_
|
## v0.22.4 - _October 24, 2017_
|
||||||
|
|
||||||
* Upgraded bignumber.js to a new version that ships with native typings
|
* Upgraded bignumber.js to a new version that ships with native typings
|
||||||
|
|
||||||
## v0.22.3 - _October 25, 2017_
|
## v0.22.3 - _October 24, 2017_
|
||||||
|
|
||||||
* Fixed an issue with new version of testrpc and unlimited proxy allowance (#199)
|
* Fixed an issue with new version of testrpc and unlimited proxy allowance (#199)
|
||||||
|
|
||||||
## v0.22.2 - _October 24, 2017_
|
## v0.22.2 - _October 23, 2017_
|
||||||
|
|
||||||
* Fixed rounding of maker fill amount and incorrect validation of partial fees (#197)
|
* Fixed rounding of maker fill amount and incorrect validation of partial fees (#197)
|
||||||
|
|
||||||
## v0.22.0 - _October 16, 2017_
|
## v0.22.0 - _October 15, 2017_
|
||||||
|
|
||||||
* Started using `OrderFillRequest` interface instead of `OrderFillOrKillRequest` interface for `zeroEx.exchange.batchFillOrKill` (#187)
|
* Started using `OrderFillRequest` interface instead of `OrderFillOrKillRequest` interface for `zeroEx.exchange.batchFillOrKill` (#187)
|
||||||
* Removed `OrderFillOrKillRequest` (#187)
|
* Removed `OrderFillOrKillRequest` (#187)
|
||||||
|
|
||||||
## v0.21.4 - _October 13, 2017_
|
## v0.21.4 - _October 12, 2017_
|
||||||
|
|
||||||
* Made 0x.js more type-safe by making `getLogsAsync` and `subscribe/subscribeAsync` generics parametrized with arg type (#194)
|
* Made 0x.js more type-safe by making `getLogsAsync` and `subscribe/subscribeAsync` generics parametrized with arg type (#194)
|
||||||
|
|
||||||
## v0.21.3 - _October 12, 2017_
|
## v0.21.3 - _October 11, 2017_
|
||||||
|
|
||||||
* Fixed a bug causing order fills to throw `INSUFFICIENT_TAKER_ALLOWANCE` (#193)
|
* Fixed a bug causing order fills to throw `INSUFFICIENT_TAKER_ALLOWANCE` (#193)
|
||||||
|
|
||||||
## v0.21.2 - _October 11, 2017_
|
## v0.21.2 - _October 10, 2017_
|
||||||
|
|
||||||
* Exported `ContractEventArg` as a public type (#190)
|
* Exported `ContractEventArg` as a public type (#190)
|
||||||
|
|
||||||
## v0.21.1 - _October 11, 2017_
|
## v0.21.1 - _October 10, 2017_
|
||||||
|
|
||||||
* Fixed a bug in subscriptions (#189)
|
* Fixed a bug in subscriptions (#189)
|
||||||
|
|
||||||
## v0.21.0 - _October 10, 2017_
|
## v0.21.0 - _October 9, 2017_
|
||||||
|
|
||||||
* Complete rewrite of subscription logic (#182)
|
* Complete rewrite of subscription logic (#182)
|
||||||
* Subscriptions no longer return historical logs. If you want them - use `getLogsAsync`
|
* Subscriptions no longer return historical logs. If you want them - use `getLogsAsync`
|
||||||
@@ -168,27 +181,27 @@
|
|||||||
* Renamed `zeroEx.token.stopWatchingAllEventsAsync` to `zeroEx.token.unsubscribeAll`
|
* Renamed `zeroEx.token.stopWatchingAllEventsAsync` to `zeroEx.token.unsubscribeAll`
|
||||||
* Fixed the batch fills validation by emulating all balance & proxy allowance changes (#185)
|
* Fixed the batch fills validation by emulating all balance & proxy allowance changes (#185)
|
||||||
|
|
||||||
## v0.20.0 - _October 5, 2017_
|
## v0.20.0 - _October 4, 2017_
|
||||||
|
|
||||||
* Add `zeroEx.token.getLogsAsync` (#178)
|
* Add `zeroEx.token.getLogsAsync` (#178)
|
||||||
* Add `zeroEx.exchange.getLogsAsync` (#178)
|
* Add `zeroEx.exchange.getLogsAsync` (#178)
|
||||||
* Fixed fees validation when one of the tokens transferred is ZRX (#181)
|
* Fixed fees validation when one of the tokens transferred is ZRX (#181)
|
||||||
|
|
||||||
## v0.19.0 - _September 29, 2017_
|
## v0.19.0 - _September 28, 2017_
|
||||||
|
|
||||||
* Made order validation optional (#172)
|
* Made order validation optional (#172)
|
||||||
* Added Ropsten testnet support (#173)
|
* Added Ropsten testnet support (#173)
|
||||||
* Fixed a bug causing awaitTransactionMinedAsync to DDos backend nodes (#175)
|
* Fixed a bug causing awaitTransactionMinedAsync to DDos backend nodes (#175)
|
||||||
|
|
||||||
## v0.18.0 - _September 26, 2017_
|
## v0.18.0 - _September 25, 2017_
|
||||||
|
|
||||||
* Added `zeroEx.exchange.validateOrderFillableOrThrowAsync` to simplify orderbook pruning (#170)
|
* Added `zeroEx.exchange.validateOrderFillableOrThrowAsync` to simplify orderbook pruning (#170)
|
||||||
|
|
||||||
## v0.17.0 - _September 26, 2017_
|
## v0.17.0 - _September 25, 2017_
|
||||||
|
|
||||||
* Made `zeroEx.exchange.getZRXTokenAddressAsync` public (#171)
|
* Made `zeroEx.exchange.getZRXTokenAddressAsync` public (#171)
|
||||||
|
|
||||||
## v0.16.0 - _September 20, 2017_
|
## v0.16.0 - _September 19, 2017_
|
||||||
|
|
||||||
* Added the ability to specify custom contract addresses to be used with 0x.js (#165)
|
* Added the ability to specify custom contract addresses to be used with 0x.js (#165)
|
||||||
* ZeroExConfig.exchangeContractAddress
|
* ZeroExConfig.exchangeContractAddress
|
||||||
@@ -196,48 +209,48 @@
|
|||||||
* ZeroExConfig.etherTokenContractAddress
|
* ZeroExConfig.etherTokenContractAddress
|
||||||
* Added `zeroEx.tokenRegistry.getContractAddressAsync` (#165)
|
* Added `zeroEx.tokenRegistry.getContractAddressAsync` (#165)
|
||||||
|
|
||||||
## v0.15.0 - _September 8, 2017_
|
## v0.15.0 - _September 7, 2017_
|
||||||
|
|
||||||
* Added the ability to specify a historical `blockNumber` at which to query the blockchain's state when calling a token or exchange method (#161)
|
* Added the ability to specify a historical `blockNumber` at which to query the blockchain's state when calling a token or exchange method (#161)
|
||||||
|
|
||||||
## v0.14.2 - _September 7, 2017_
|
## v0.14.2 - _September 6, 2017_
|
||||||
|
|
||||||
* Fixed an issue with bignumber.js types not found (#160)
|
* Fixed an issue with bignumber.js types not found (#160)
|
||||||
|
|
||||||
## v0.14.1 - _September 7, 2017_
|
## v0.14.1 - _September 6, 2017_
|
||||||
|
|
||||||
* Fixed an issue with Artifact type not found (#159)
|
* Fixed an issue with Artifact type not found (#159)
|
||||||
|
|
||||||
## v0.14.0 - _September 6, 2017_
|
## v0.14.0 - _September 5, 2017_
|
||||||
|
|
||||||
* Added `zeroEx.exchange.throwLogErrorsAsErrors` method to public interface (#157)
|
* Added `zeroEx.exchange.throwLogErrorsAsErrors` method to public interface (#157)
|
||||||
* Fixed an issue with overlapping async intervals in `zeroEx.awaitTransactionMinedAsync` (#157)
|
* Fixed an issue with overlapping async intervals in `zeroEx.awaitTransactionMinedAsync` (#157)
|
||||||
* Fixed an issue with log decoder returning `BigNumber`s as `strings` (#157)
|
* Fixed an issue with log decoder returning `BigNumber`s as `strings` (#157)
|
||||||
|
|
||||||
## v0.13.0 - _September 6, 2017_
|
## v0.13.0 - _September 5, 2017_
|
||||||
|
|
||||||
* Made all the functions submitting transactions to the network to immediately return transaction hash (#151)
|
* Made all the functions submitting transactions to the network to immediately return transaction hash (#151)
|
||||||
* Added `zeroEx.awaitTransactionMinedAsync` (#151)
|
* Added `zeroEx.awaitTransactionMinedAsync` (#151)
|
||||||
* Added `TransactionReceiptWithDecodedLogs`, `LogWithDecodedArgs`, `DecodedLogArgs` to public types (#151)
|
* Added `TransactionReceiptWithDecodedLogs`, `LogWithDecodedArgs`, `DecodedLogArgs` to public types (#151)
|
||||||
* Added signature validation to `validateFillOrderThrowIfInvalidAsync` (#152)
|
* Added signature validation to `validateFillOrderThrowIfInvalidAsync` (#152)
|
||||||
|
|
||||||
## v0.12.1 - _September 2, 2017_
|
## v0.12.1 - _September 1, 2017_
|
||||||
|
|
||||||
* Added the support for web3@1.x.x provider (#142)
|
* Added the support for web3@1.x.x provider (#142)
|
||||||
* Added the optional `zeroExConfig` parameter to the constructor of `ZeroEx` (#139)
|
* Added the optional `zeroExConfig` parameter to the constructor of `ZeroEx` (#139)
|
||||||
* Added the ability to specify `gasPrice` when instantiating `ZeroEx` (#139)
|
* Added the ability to specify `gasPrice` when instantiating `ZeroEx` (#139)
|
||||||
|
|
||||||
## v0.11.0 - _August 24, 2017_
|
## v0.11.0 - _August 23, 2017_
|
||||||
|
|
||||||
* Added `zeroEx.token.setUnlimitedProxyAllowanceAsync` (#137)
|
* Added `zeroEx.token.setUnlimitedProxyAllowanceAsync` (#137)
|
||||||
* Added `zeroEx.token.setUnlimitedAllowanceAsync` (#137)
|
* Added `zeroEx.token.setUnlimitedAllowanceAsync` (#137)
|
||||||
* Added `zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS` (#137)
|
* Added `zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS` (#137)
|
||||||
|
|
||||||
## v0.10.4 - _Aug 24, 2017_
|
## v0.10.4 - _August 23, 2017_
|
||||||
|
|
||||||
* Fixed a bug where checksummed addresses were being pulled from artifacts and not lower-cased. (#135)
|
* Fixed a bug where checksummed addresses were being pulled from artifacts and not lower-cased. (#135)
|
||||||
|
|
||||||
## v0.10.1 - _Aug 24, 2017_
|
## v0.10.1 - _August 23, 2017_
|
||||||
|
|
||||||
* Added `zeroEx.exchange.validateFillOrderThrowIfInvalidAsync` (#128)
|
* Added `zeroEx.exchange.validateFillOrderThrowIfInvalidAsync` (#128)
|
||||||
* Added `zeroEx.exchange.validateFillOrKillOrderThrowIfInvalidAsync` (#128)
|
* Added `zeroEx.exchange.validateFillOrKillOrderThrowIfInvalidAsync` (#128)
|
||||||
@@ -252,20 +265,20 @@
|
|||||||
* Added clear error message when checksummed address is passed to a public method (#124)
|
* Added clear error message when checksummed address is passed to a public method (#124)
|
||||||
* Fixes the description of `shouldThrowOnInsufficientBalanceOrAllowance` in docs (#127)
|
* Fixes the description of `shouldThrowOnInsufficientBalanceOrAllowance` in docs (#127)
|
||||||
|
|
||||||
## v0.9.3 - _Aug 22, 2017_
|
## v0.9.3 - _August 21, 2017_
|
||||||
|
|
||||||
* Update contract artifacts to include latest Kovan and Mainnet deploys (#118)
|
* Update contract artifacts to include latest Kovan and Mainnet deploys (#118)
|
||||||
|
|
||||||
## v0.9.2 - _Aug 21, 2017_
|
## v0.9.2 - _August 20, 2017_
|
||||||
|
|
||||||
* *This version was unpublished because of a publishing issue.*
|
* *This version was unpublished because of a publishing issue.*
|
||||||
* Update contract artifacts to include latest Kovan and Mainnet deploys (#118)
|
* Update contract artifacts to include latest Kovan and Mainnet deploys (#118)
|
||||||
|
|
||||||
## v0.9.1 - _Aug. 16, 2017_
|
## v0.9.1 - _August 15, 2017_
|
||||||
|
|
||||||
* Fixed the bug causing `zeroEx.token.getBalanceAsync()` to fail if no addresses available (#120)
|
* Fixed the bug causing `zeroEx.token.getBalanceAsync()` to fail if no addresses available (#120)
|
||||||
|
|
||||||
## v0.9.0 - _Jul. 26, 2017_
|
## v0.9.0 - _July 25, 2017_
|
||||||
|
|
||||||
* Migrated to the new version of smart contracts (#101)
|
* Migrated to the new version of smart contracts (#101)
|
||||||
* Removed the ability to call methods on multiple authorized Exchange smart contracts (#106)
|
* Removed the ability to call methods on multiple authorized Exchange smart contracts (#106)
|
||||||
@@ -276,7 +289,7 @@
|
|||||||
* Updated to typescript v2.4 (#104)
|
* Updated to typescript v2.4 (#104)
|
||||||
* Fixed an issue with incorrect balance/allowance validation when ZRX is one of the tokens traded (#109)
|
* Fixed an issue with incorrect balance/allowance validation when ZRX is one of the tokens traded (#109)
|
||||||
|
|
||||||
## v0.8.0 - _Jul. 4, 2017_
|
## v0.8.0 - _July 3, 2017_
|
||||||
|
|
||||||
* Added the ability to call methods on different authorized versions of the Exchange smart contract (#82)
|
* Added the ability to call methods on different authorized versions of the Exchange smart contract (#82)
|
||||||
* Updated contract artifacts to reflect latest changes to the smart contracts (0xproject/contracts#59)
|
* Updated contract artifacts to reflect latest changes to the smart contracts (0xproject/contracts#59)
|
||||||
@@ -289,35 +302,35 @@
|
|||||||
* `zeroEx.tokenRegistry.invalidateContractInstance`
|
* `zeroEx.tokenRegistry.invalidateContractInstance`
|
||||||
* Fixed the bug where `zeroEx.setProviderAsync` didn't invalidate etherToken contract's instance
|
* Fixed the bug where `zeroEx.setProviderAsync` didn't invalidate etherToken contract's instance
|
||||||
|
|
||||||
## v0.7.1 - _Jun. 26, 2017_
|
## v0.7.1 - _June 25, 2017_
|
||||||
|
|
||||||
* Added the ability to convert Ether to wrapped Ether tokens and back via `zeroEx.etherToken.depostAsync` and `zeroEx.etherToken.withdrawAsync` (#81)
|
* Added the ability to convert Ether to wrapped Ether tokens and back via `zeroEx.etherToken.depostAsync` and `zeroEx.etherToken.withdrawAsync` (#81)
|
||||||
|
|
||||||
## v0.7.0 - _Jun. 22, 2017_
|
## v0.7.0 - _June 21, 2017_
|
||||||
|
|
||||||
* Added Kovan smart contract artifacts (#78)
|
* Added Kovan smart contract artifacts (#78)
|
||||||
* Started returning fillAmount from `fillOrderAsync` and `fillUpToAsync` (#72)
|
* Started returning fillAmount from `fillOrderAsync` and `fillUpToAsync` (#72)
|
||||||
* Started returning cancelledAmount from `cancelOrderAsync` (#72)
|
* Started returning cancelledAmount from `cancelOrderAsync` (#72)
|
||||||
* Renamed type `LogCancelArgs` to `LogCancelContractEventArgs` and `LogFillArgs` to `LogFillContractEventArgs`
|
* Renamed type `LogCancelArgs` to `LogCancelContractEventArgs` and `LogFillArgs` to `LogFillContractEventArgs`
|
||||||
|
|
||||||
## v0.6.2 - _Jun. 21, 2017_
|
## v0.6.2 - _June 20, 2017_
|
||||||
|
|
||||||
* Reduced bundle size
|
* Reduced bundle size
|
||||||
* Improved documentation
|
* Improved documentation
|
||||||
|
|
||||||
## v0.6.1 - _Jun. 19, 2017_
|
## v0.6.1 - _June 18, 2017_
|
||||||
|
|
||||||
* Improved documentation
|
* Improved documentation
|
||||||
|
|
||||||
## v0.6.0 - _Jun. 19, 2017_
|
## v0.6.0 - _June 18, 2017_
|
||||||
|
|
||||||
* Made `ZeroEx` class accept `Web3Provider` instance instead of `Web3` instance
|
* Made `ZeroEx` class accept `Web3Provider` instance instead of `Web3` instance
|
||||||
* Added types for contract event arguments
|
* Added types for contract event arguments
|
||||||
|
|
||||||
## v0.5.2 - _Jun. 15, 2017_
|
## v0.5.2 - _June 14, 2017_
|
||||||
|
|
||||||
* Fixed the bug in `postpublish` script that caused that only unminified UMD bundle was uploaded to release page
|
* Fixed the bug in `postpublish` script that caused that only unminified UMD bundle was uploaded to release page
|
||||||
|
|
||||||
## v0.5.1 - _Jun. 15, 2017_
|
## v0.5.1 - _June 14, 2017_
|
||||||
|
|
||||||
* Added `postpublish` script to publish to Github Releases with assets.
|
* Added `postpublish` script to publish to Github Releases with assets.
|
||||||
|
@@ -20,11 +20,10 @@ import { ZeroEx } from '0x.js';
|
|||||||
|
|
||||||
If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
|
If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
|
||||||
|
|
||||||
```
|
```json
|
||||||
"include": [
|
"compilerOptions": {
|
||||||
"./node_modules/web3-typescript-typings/index.d.ts",
|
"typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
|
||||||
"./node_modules/ethers-typescript-typings/index.d.ts"
|
}
|
||||||
]
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### UMD:
|
#### UMD:
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "0x.js",
|
"name": "0x.js",
|
||||||
"version": "0.33.3",
|
"version": "0.35.0",
|
||||||
"description": "A javascript library for interacting with the 0x protocol",
|
"description": "A javascript library for interacting with the 0x protocol",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"0x.js",
|
"0x.js",
|
||||||
@@ -15,8 +15,6 @@
|
|||||||
"build:watch": "tsc -w",
|
"build:watch": "tsc -w",
|
||||||
"prebuild": "run-s clean generate_contract_wrappers",
|
"prebuild": "run-s clean generate_contract_wrappers",
|
||||||
"build": "run-p build:umd:prod build:commonjs; exit 0;",
|
"build": "run-p build:umd:prod build:commonjs; exit 0;",
|
||||||
"docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
|
|
||||||
"upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json",
|
|
||||||
"generate_contract_wrappers": "node ../abi-gen/lib/index.js --abis 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken|TokenRegistry|DummyToken).json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated --backend ethers && prettier --write 'src/contract_wrappers/generated/**.ts'",
|
"generate_contract_wrappers": "node ../abi-gen/lib/index.js --abis 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken|TokenRegistry|DummyToken).json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated --backend ethers && prettier --write 'src/contract_wrappers/generated/**.ts'",
|
||||||
"lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
|
"lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
|
||||||
"test:circleci": "run-s test:coverage",
|
"test:circleci": "run-s test:coverage",
|
||||||
@@ -28,7 +26,11 @@
|
|||||||
"build:umd:prod": "NODE_ENV=production webpack",
|
"build:umd:prod": "NODE_ENV=production webpack",
|
||||||
"build:commonjs": "tsc && copyfiles -u 2 './src/artifacts/**/*.json' ./lib/src/artifacts && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
|
"build:commonjs": "tsc && copyfiles -u 2 './src/artifacts/**/*.json' ./lib/src/artifacts && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
|
||||||
"test:commonjs": "run-s build:commonjs run_mocha",
|
"test:commonjs": "run-s build:commonjs run_mocha",
|
||||||
"run_mocha": "mocha lib/test/**/*_test.js --timeout 10000 --bail --exit"
|
"run_mocha": "mocha lib/test/**/*_test.js --timeout 10000 --bail --exit",
|
||||||
|
"manual:postpublish": "yarn build; node ./scripts/postpublish.js",
|
||||||
|
"docs:stage": "yarn build && node ./scripts/stage_docs.js",
|
||||||
|
"docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
|
||||||
|
"upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"artifacts": "TokenTransferProxy Exchange TokenRegistry Token EtherToken",
|
"artifacts": "TokenTransferProxy Exchange TokenRegistry Token EtherToken",
|
||||||
@@ -39,10 +41,13 @@
|
|||||||
],
|
],
|
||||||
"docPublishConfigs": {
|
"docPublishConfigs": {
|
||||||
"extraFileIncludes": [
|
"extraFileIncludes": [
|
||||||
"../types/src/index.ts"
|
"../types/src/index.ts",
|
||||||
|
"./src/contract_wrappers/generated/ether_token.ts",
|
||||||
|
"./src/contract_wrappers/generated/token.ts",
|
||||||
|
"./src/contract_wrappers/generated/exchange.ts"
|
||||||
],
|
],
|
||||||
"s3BucketPath": "s3://0xjs-docs-jsons/",
|
"s3BucketPath": "s3://doc-jsons/0x.js/",
|
||||||
"s3StagingBucketPath": "s3://staging-0xjs-docs-jsons/"
|
"s3StagingBucketPath": "s3://staging-doc-jsons/0x.js/"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -55,13 +60,13 @@
|
|||||||
"node": ">=6.0.0"
|
"node": ">=6.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0xproject/abi-gen": "^0.2.7",
|
"@0xproject/abi-gen": "^0.2.9",
|
||||||
"@0xproject/dev-utils": "^0.3.1",
|
"@0xproject/dev-utils": "^0.3.4",
|
||||||
"@0xproject/monorepo-scripts": "^0.1.14",
|
"@0xproject/monorepo-scripts": "^0.1.16",
|
||||||
"@0xproject/tslint-config": "^0.4.12",
|
"@0xproject/tslint-config": "^0.4.14",
|
||||||
"@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.104",
|
||||||
"@types/mocha": "^2.2.42",
|
"@types/mocha": "^2.2.42",
|
||||||
"@types/node": "^8.0.53",
|
"@types/node": "^8.0.53",
|
||||||
"@types/sinon": "^2.2.2",
|
"@types/sinon": "^2.2.2",
|
||||||
@@ -69,9 +74,7 @@
|
|||||||
"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",
|
||||||
"chai-as-promised-typescript-typings": "^0.0.12",
|
|
||||||
"chai-bignumber": "^2.0.1",
|
"chai-bignumber": "^2.0.1",
|
||||||
"chai-typescript-typings": "^0.0.6",
|
|
||||||
"copyfiles": "^1.2.0",
|
"copyfiles": "^1.2.0",
|
||||||
"dirty-chai": "^2.0.1",
|
"dirty-chai": "^2.0.1",
|
||||||
"json-loader": "^0.5.4",
|
"json-loader": "^0.5.4",
|
||||||
@@ -88,30 +91,28 @@
|
|||||||
"truffle-hdwallet-provider": "^0.0.3",
|
"truffle-hdwallet-provider": "^0.0.3",
|
||||||
"tslint": "5.8.0",
|
"tslint": "5.8.0",
|
||||||
"typedoc": "0xProject/typedoc",
|
"typedoc": "0xProject/typedoc",
|
||||||
"types-bn": "^0.0.1",
|
|
||||||
"typescript": "2.7.1",
|
"typescript": "2.7.1",
|
||||||
"web3-provider-engine": "^13.0.1",
|
"web3-provider-engine": "^13.0.1",
|
||||||
"webpack": "^3.1.0"
|
"webpack": "^3.1.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0xproject/assert": "^0.2.2",
|
"@0xproject/assert": "^0.2.5",
|
||||||
"@0xproject/base-contract": "^0.0.5",
|
"@0xproject/base-contract": "^0.1.0",
|
||||||
"@0xproject/json-schemas": "^0.7.16",
|
"@0xproject/json-schemas": "^0.7.19",
|
||||||
"@0xproject/types": "^0.4.1",
|
"@0xproject/types": "^0.5.0",
|
||||||
"@0xproject/utils": "^0.4.3",
|
"@0xproject/typescript-typings": "^0.0.3",
|
||||||
"@0xproject/web3-wrapper": "^0.3.1",
|
"@0xproject/utils": "^0.5.0",
|
||||||
|
"@0xproject/web3-wrapper": "^0.5.0",
|
||||||
"bintrees": "^1.0.2",
|
"bintrees": "^1.0.2",
|
||||||
"bn.js": "^4.11.8",
|
"bn.js": "^4.11.8",
|
||||||
"ethereumjs-abi": "^0.6.4",
|
"ethereumjs-abi": "^0.6.4",
|
||||||
"ethereumjs-blockstream": "^2.0.6",
|
"ethereumjs-blockstream": "^2.0.6",
|
||||||
"ethereumjs-util": "^5.1.1",
|
"ethereumjs-util": "^5.1.1",
|
||||||
"ethers-contracts": "^2.2.1",
|
"ethers-contracts": "^2.2.1",
|
||||||
"ethers-typescript-typings": "^0.0.4",
|
|
||||||
"js-sha3": "^0.7.0",
|
"js-sha3": "^0.7.0",
|
||||||
"lodash": "^4.17.4",
|
"lodash": "^4.17.4",
|
||||||
"uuid": "^3.1.0",
|
"uuid": "^3.1.0",
|
||||||
"web3": "^0.20.0",
|
"web3": "^0.20.0"
|
||||||
"web3-typescript-typings": "^0.10.2"
|
|
||||||
},
|
},
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public"
|
||||||
|
@@ -15,7 +15,7 @@ import { OrderStateWatcher } from './order_watcher/order_state_watcher';
|
|||||||
import { zeroExConfigSchema } from './schemas/zero_ex_config_schema';
|
import { zeroExConfigSchema } from './schemas/zero_ex_config_schema';
|
||||||
import { zeroExPrivateNetworkConfigSchema } from './schemas/zero_ex_private_network_config_schema';
|
import { zeroExPrivateNetworkConfigSchema } from './schemas/zero_ex_private_network_config_schema';
|
||||||
import { zeroExPublicNetworkConfigSchema } from './schemas/zero_ex_public_network_config_schema';
|
import { zeroExPublicNetworkConfigSchema } from './schemas/zero_ex_public_network_config_schema';
|
||||||
import { Web3Provider, ZeroExConfig, ZeroExError } from './types';
|
import { OrderStateWatcherConfig, Web3Provider, ZeroExConfig, ZeroExError } from './types';
|
||||||
import { assert } from './utils/assert';
|
import { assert } from './utils/assert';
|
||||||
import { constants } from './utils/constants';
|
import { constants } from './utils/constants';
|
||||||
import { decorators } from './utils/decorators';
|
import { decorators } from './utils/decorators';
|
||||||
@@ -57,13 +57,7 @@ export class ZeroEx {
|
|||||||
* tokenTransferProxy smart contract.
|
* tokenTransferProxy smart contract.
|
||||||
*/
|
*/
|
||||||
public proxy: TokenTransferProxyWrapper;
|
public proxy: TokenTransferProxyWrapper;
|
||||||
/**
|
|
||||||
* An instance of the OrderStateWatcher class containing methods for watching a set of orders for relevant
|
|
||||||
* blockchain state changes.
|
|
||||||
*/
|
|
||||||
public orderStateWatcher: OrderStateWatcher;
|
|
||||||
private _web3Wrapper: Web3Wrapper;
|
private _web3Wrapper: Web3Wrapper;
|
||||||
private _abiDecoder: AbiDecoder;
|
|
||||||
/**
|
/**
|
||||||
* Verifies that the elliptic curve signature `signature` was generated
|
* Verifies that the elliptic curve signature `signature` was generated
|
||||||
* by signing `data` with the private key corresponding to the `signerAddress` address.
|
* by signing `data` with the private key corresponding to the `signerAddress` address.
|
||||||
@@ -83,7 +77,7 @@ export class ZeroEx {
|
|||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Generates a pseudo-random 256-bit salt.
|
* Generates a pseudo-random 256-bit salt.
|
||||||
* The salt can be included in an 0x order, ensuring that the order generates a unique orderHash
|
* The salt can be included in a 0x order, ensuring that the order generates a unique orderHash
|
||||||
* and will not collide with other outstanding orders that are identical in all other parameters.
|
* and will not collide with other outstanding orders that are identical in all other parameters.
|
||||||
* @return A pseudo-random 256-bit number that can be used as a salt.
|
* @return A pseudo-random 256-bit number that can be used as a salt.
|
||||||
*/
|
*/
|
||||||
@@ -172,21 +166,22 @@ export class ZeroEx {
|
|||||||
]);
|
]);
|
||||||
const artifactJSONs = _.values(artifacts);
|
const artifactJSONs = _.values(artifacts);
|
||||||
const abiArrays = _.map(artifactJSONs, artifact => artifact.abi);
|
const abiArrays = _.map(artifactJSONs, artifact => artifact.abi);
|
||||||
this._abiDecoder = new AbiDecoder(abiArrays);
|
|
||||||
const defaults = {
|
const defaults = {
|
||||||
gasPrice: config.gasPrice,
|
gasPrice: config.gasPrice,
|
||||||
};
|
};
|
||||||
this._web3Wrapper = new Web3Wrapper(provider, defaults);
|
this._web3Wrapper = new Web3Wrapper(provider, defaults);
|
||||||
|
_.forEach(abiArrays, abi => {
|
||||||
|
this._web3Wrapper.abiDecoder.addABI(abi);
|
||||||
|
});
|
||||||
this.proxy = new TokenTransferProxyWrapper(
|
this.proxy = new TokenTransferProxyWrapper(
|
||||||
this._web3Wrapper,
|
this._web3Wrapper,
|
||||||
config.networkId,
|
config.networkId,
|
||||||
config.tokenTransferProxyContractAddress,
|
config.tokenTransferProxyContractAddress,
|
||||||
);
|
);
|
||||||
this.token = new TokenWrapper(this._web3Wrapper, config.networkId, this._abiDecoder, this.proxy);
|
this.token = new TokenWrapper(this._web3Wrapper, config.networkId, this.proxy);
|
||||||
this.exchange = new ExchangeWrapper(
|
this.exchange = new ExchangeWrapper(
|
||||||
this._web3Wrapper,
|
this._web3Wrapper,
|
||||||
config.networkId,
|
config.networkId,
|
||||||
this._abiDecoder,
|
|
||||||
this.token,
|
this.token,
|
||||||
config.exchangeContractAddress,
|
config.exchangeContractAddress,
|
||||||
config.zrxContractAddress,
|
config.zrxContractAddress,
|
||||||
@@ -196,14 +191,7 @@ export class ZeroEx {
|
|||||||
config.networkId,
|
config.networkId,
|
||||||
config.tokenRegistryContractAddress,
|
config.tokenRegistryContractAddress,
|
||||||
);
|
);
|
||||||
this.etherToken = new EtherTokenWrapper(this._web3Wrapper, config.networkId, this._abiDecoder, this.token);
|
this.etherToken = new EtherTokenWrapper(this._web3Wrapper, config.networkId, this.token);
|
||||||
this.orderStateWatcher = new OrderStateWatcher(
|
|
||||||
this._web3Wrapper,
|
|
||||||
this._abiDecoder,
|
|
||||||
this.token,
|
|
||||||
this.exchange,
|
|
||||||
config.orderWatcherConfig,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Sets a new web3 provider for 0x.js. Updating the provider will stop all
|
* Sets a new web3 provider for 0x.js. Updating the provider will stop all
|
||||||
@@ -260,7 +248,7 @@ export class ZeroEx {
|
|||||||
msgHashHex = ethUtil.bufferToHex(msgHashBuff);
|
msgHashHex = ethUtil.bufferToHex(msgHashBuff);
|
||||||
}
|
}
|
||||||
|
|
||||||
const signature = await this._web3Wrapper.signTransactionAsync(normalizedSignerAddress, msgHashHex);
|
const signature = await this._web3Wrapper.signMessageAsync(normalizedSignerAddress, msgHashHex);
|
||||||
|
|
||||||
// HACK: There is no consensus on whether the signatureHex string should be formatted as
|
// HACK: There is no consensus on whether the signatureHex string should be formatted as
|
||||||
// v + r + s OR r + s + v, and different clients (even different versions of the same client)
|
// v + r + s OR r + s + v, and different clients (even different versions of the same client)
|
||||||
@@ -297,44 +285,21 @@ export class ZeroEx {
|
|||||||
pollingIntervalMs = 1000,
|
pollingIntervalMs = 1000,
|
||||||
timeoutMs?: number,
|
timeoutMs?: number,
|
||||||
): Promise<TransactionReceiptWithDecodedLogs> {
|
): Promise<TransactionReceiptWithDecodedLogs> {
|
||||||
let timeoutExceeded = false;
|
const transactionReceiptWithDecodedLogs = await this._web3Wrapper.awaitTransactionMinedAsync(
|
||||||
if (timeoutMs) {
|
txHash,
|
||||||
setTimeout(() => (timeoutExceeded = true), timeoutMs);
|
|
||||||
}
|
|
||||||
|
|
||||||
const txReceiptPromise = new Promise(
|
|
||||||
(resolve: (receipt: TransactionReceiptWithDecodedLogs) => void, reject) => {
|
|
||||||
const intervalId = intervalUtils.setAsyncExcludingInterval(
|
|
||||||
async () => {
|
|
||||||
if (timeoutExceeded) {
|
|
||||||
intervalUtils.clearAsyncExcludingInterval(intervalId);
|
|
||||||
return reject(ZeroExError.TransactionMiningTimeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
const transactionReceipt = await this._web3Wrapper.getTransactionReceiptAsync(txHash);
|
|
||||||
if (!_.isNull(transactionReceipt)) {
|
|
||||||
intervalUtils.clearAsyncExcludingInterval(intervalId);
|
|
||||||
const logsWithDecodedArgs = _.map(
|
|
||||||
transactionReceipt.logs,
|
|
||||||
this._abiDecoder.tryToDecodeLogOrNoop.bind(this._abiDecoder),
|
|
||||||
);
|
|
||||||
const transactionReceiptWithDecodedLogArgs: TransactionReceiptWithDecodedLogs = {
|
|
||||||
...transactionReceipt,
|
|
||||||
logs: logsWithDecodedArgs,
|
|
||||||
};
|
|
||||||
resolve(transactionReceiptWithDecodedLogArgs);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
pollingIntervalMs,
|
pollingIntervalMs,
|
||||||
(err: Error) => {
|
timeoutMs,
|
||||||
intervalUtils.clearAsyncExcludingInterval(intervalId);
|
|
||||||
reject(err);
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
},
|
return transactionReceiptWithDecodedLogs;
|
||||||
);
|
}
|
||||||
const txReceipt = await txReceiptPromise;
|
/**
|
||||||
return txReceipt;
|
* Instantiates and returns a new OrderStateWatcher instance.
|
||||||
|
* Defaults to watching the pending state.
|
||||||
|
* @param config The configuration object. Look up the type for the description.
|
||||||
|
* @return An instance of the 0x.js OrderStateWatcher class.
|
||||||
|
*/
|
||||||
|
public createOrderStateWatcher(config?: OrderStateWatcherConfig) {
|
||||||
|
return new OrderStateWatcher(this._web3Wrapper, this.token, this.exchange, config);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* HACK: `TokenWrapper` needs a token transfer proxy address. `TokenTransferProxy` address is fetched from
|
* HACK: `TokenWrapper` needs a token transfer proxy address. `TokenTransferProxy` address is fetched from
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { BlockParamLiteral, LogWithDecodedArgs, RawLog } from '@0xproject/types';
|
import { BlockParamLiteral, ContractAbi, FilterObject, LogEntry, LogWithDecodedArgs, RawLog } from '@0xproject/types';
|
||||||
import { AbiDecoder, intervalUtils } from '@0xproject/utils';
|
import { AbiDecoder, intervalUtils } from '@0xproject/utils';
|
||||||
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
import { Block, BlockAndLogStreamer } from 'ethereumjs-blockstream';
|
import { Block, BlockAndLogStreamer } from 'ethereumjs-blockstream';
|
||||||
@@ -32,19 +32,17 @@ const CONTRACT_NAME_TO_NOT_FOUND_ERROR: {
|
|||||||
export class ContractWrapper {
|
export class ContractWrapper {
|
||||||
protected _web3Wrapper: Web3Wrapper;
|
protected _web3Wrapper: Web3Wrapper;
|
||||||
protected _networkId: number;
|
protected _networkId: number;
|
||||||
private _abiDecoder?: AbiDecoder;
|
|
||||||
private _blockAndLogStreamerIfExists?: BlockAndLogStreamer;
|
private _blockAndLogStreamerIfExists?: BlockAndLogStreamer;
|
||||||
private _blockAndLogStreamIntervalIfExists?: NodeJS.Timer;
|
private _blockAndLogStreamIntervalIfExists?: NodeJS.Timer;
|
||||||
private _filters: { [filterToken: string]: Web3.FilterObject };
|
private _filters: { [filterToken: string]: FilterObject };
|
||||||
private _filterCallbacks: {
|
private _filterCallbacks: {
|
||||||
[filterToken: string]: EventCallback<ContractEventArgs>;
|
[filterToken: string]: EventCallback<ContractEventArgs>;
|
||||||
};
|
};
|
||||||
private _onLogAddedSubscriptionToken: string | undefined;
|
private _onLogAddedSubscriptionToken: string | undefined;
|
||||||
private _onLogRemovedSubscriptionToken: string | undefined;
|
private _onLogRemovedSubscriptionToken: string | undefined;
|
||||||
constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder?: AbiDecoder) {
|
constructor(web3Wrapper: Web3Wrapper, networkId: number) {
|
||||||
this._web3Wrapper = web3Wrapper;
|
this._web3Wrapper = web3Wrapper;
|
||||||
this._networkId = networkId;
|
this._networkId = networkId;
|
||||||
this._abiDecoder = abiDecoder;
|
|
||||||
this._filters = {};
|
this._filters = {};
|
||||||
this._filterCallbacks = {};
|
this._filterCallbacks = {};
|
||||||
this._blockAndLogStreamerIfExists = undefined;
|
this._blockAndLogStreamerIfExists = undefined;
|
||||||
@@ -75,7 +73,7 @@ export class ContractWrapper {
|
|||||||
address: string,
|
address: string,
|
||||||
eventName: ContractEvents,
|
eventName: ContractEvents,
|
||||||
indexFilterValues: IndexedFilterValues,
|
indexFilterValues: IndexedFilterValues,
|
||||||
abi: Web3.ContractAbi,
|
abi: ContractAbi,
|
||||||
callback: EventCallback<ArgsType>,
|
callback: EventCallback<ArgsType>,
|
||||||
): string {
|
): string {
|
||||||
const filter = filterUtils.getFilter(address, eventName, indexFilterValues, abi);
|
const filter = filterUtils.getFilter(address, eventName, indexFilterValues, abi);
|
||||||
@@ -92,7 +90,7 @@ export class ContractWrapper {
|
|||||||
eventName: ContractEvents,
|
eventName: ContractEvents,
|
||||||
blockRange: BlockRange,
|
blockRange: BlockRange,
|
||||||
indexFilterValues: IndexedFilterValues,
|
indexFilterValues: IndexedFilterValues,
|
||||||
abi: Web3.ContractAbi,
|
abi: ContractAbi,
|
||||||
): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
|
): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
|
||||||
const filter = filterUtils.getFilter(address, eventName, indexFilterValues, abi, blockRange);
|
const filter = filterUtils.getFilter(address, eventName, indexFilterValues, abi, blockRange);
|
||||||
const logs = await this._web3Wrapper.getLogsAsync(filter);
|
const logs = await this._web3Wrapper.getLogsAsync(filter);
|
||||||
@@ -100,18 +98,18 @@ export class ContractWrapper {
|
|||||||
return logsWithDecodedArguments;
|
return logsWithDecodedArguments;
|
||||||
}
|
}
|
||||||
protected _tryToDecodeLogOrNoop<ArgsType extends ContractEventArgs>(
|
protected _tryToDecodeLogOrNoop<ArgsType extends ContractEventArgs>(
|
||||||
log: Web3.LogEntry,
|
log: LogEntry,
|
||||||
): LogWithDecodedArgs<ArgsType> | RawLog {
|
): LogWithDecodedArgs<ArgsType> | RawLog {
|
||||||
if (_.isUndefined(this._abiDecoder)) {
|
if (_.isUndefined(this._web3Wrapper.abiDecoder)) {
|
||||||
throw new Error(InternalZeroExError.NoAbiDecoder);
|
throw new Error(InternalZeroExError.NoAbiDecoder);
|
||||||
}
|
}
|
||||||
const logWithDecodedArgs = this._abiDecoder.tryToDecodeLogOrNoop(log);
|
const logWithDecodedArgs = this._web3Wrapper.abiDecoder.tryToDecodeLogOrNoop(log);
|
||||||
return logWithDecodedArgs;
|
return logWithDecodedArgs;
|
||||||
}
|
}
|
||||||
protected async _getContractAbiAndAddressFromArtifactsAsync(
|
protected async _getContractAbiAndAddressFromArtifactsAsync(
|
||||||
artifact: Artifact,
|
artifact: Artifact,
|
||||||
addressIfExists?: string,
|
addressIfExists?: string,
|
||||||
): Promise<[Web3.ContractAbi, string]> {
|
): Promise<[ContractAbi, string]> {
|
||||||
let contractAddress: string;
|
let contractAddress: string;
|
||||||
if (_.isUndefined(addressIfExists)) {
|
if (_.isUndefined(addressIfExists)) {
|
||||||
if (_.isUndefined(artifact.networks[this._networkId])) {
|
if (_.isUndefined(artifact.networks[this._networkId])) {
|
||||||
@@ -125,7 +123,7 @@ export class ContractWrapper {
|
|||||||
if (!doesContractExist) {
|
if (!doesContractExist) {
|
||||||
throw new Error(CONTRACT_NAME_TO_NOT_FOUND_ERROR[artifact.contract_name]);
|
throw new Error(CONTRACT_NAME_TO_NOT_FOUND_ERROR[artifact.contract_name]);
|
||||||
}
|
}
|
||||||
const abiAndAddress: [Web3.ContractAbi, string] = [artifact.abi, contractAddress];
|
const abiAndAddress: [ContractAbi, string] = [artifact.abi, contractAddress];
|
||||||
return abiAndAddress;
|
return abiAndAddress;
|
||||||
}
|
}
|
||||||
protected _getContractAddress(artifact: Artifact, addressIfExists?: string): string {
|
protected _getContractAddress(artifact: Artifact, addressIfExists?: string): string {
|
||||||
@@ -139,8 +137,8 @@ export class ContractWrapper {
|
|||||||
return addressIfExists;
|
return addressIfExists;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private _onLogStateChanged<ArgsType extends ContractEventArgs>(isRemoved: boolean, log: Web3.LogEntry): void {
|
private _onLogStateChanged<ArgsType extends ContractEventArgs>(isRemoved: boolean, log: LogEntry): void {
|
||||||
_.forEach(this._filters, (filter: Web3.FilterObject, filterToken: string) => {
|
_.forEach(this._filters, (filter: FilterObject, filterToken: string) => {
|
||||||
if (filterUtils.matchesFilter(log, filter)) {
|
if (filterUtils.matchesFilter(log, filter)) {
|
||||||
const decodedLog = this._tryToDecodeLogOrNoop(log) as LogWithDecodedArgs<ArgsType>;
|
const decodedLog = this._tryToDecodeLogOrNoop(log) as LogWithDecodedArgs<ArgsType>;
|
||||||
const logEvent = {
|
const logEvent = {
|
||||||
|
@@ -21,8 +21,8 @@ export class EtherTokenWrapper extends ContractWrapper {
|
|||||||
[address: string]: EtherTokenContract;
|
[address: string]: EtherTokenContract;
|
||||||
} = {};
|
} = {};
|
||||||
private _tokenWrapper: TokenWrapper;
|
private _tokenWrapper: TokenWrapper;
|
||||||
constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder: AbiDecoder, tokenWrapper: TokenWrapper) {
|
constructor(web3Wrapper: Web3Wrapper, networkId: number, tokenWrapper: TokenWrapper) {
|
||||||
super(web3Wrapper, networkId, abiDecoder);
|
super(web3Wrapper, networkId);
|
||||||
this._tokenWrapper = tokenWrapper;
|
this._tokenWrapper = tokenWrapper;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -64,7 +64,7 @@ export class EtherTokenWrapper extends ContractWrapper {
|
|||||||
* equivalent number of wrapped ETH tokens.
|
* equivalent number of wrapped ETH tokens.
|
||||||
* @param etherTokenAddress EtherToken address you wish to withdraw from.
|
* @param etherTokenAddress EtherToken address you wish to withdraw from.
|
||||||
* @param amountInWei Amount of ETH in Wei the caller wishes to withdraw.
|
* @param amountInWei Amount of ETH in Wei the caller wishes to withdraw.
|
||||||
* @param withdrawer The hex encoded user Ethereum address that would like to make the withdrawl.
|
* @param withdrawer The hex encoded user Ethereum address that would like to make the withdrawal.
|
||||||
* @param txOpts Transaction parameters.
|
* @param txOpts Transaction parameters.
|
||||||
* @return Transaction hash.
|
* @return Transaction hash.
|
||||||
*/
|
*/
|
||||||
@@ -96,7 +96,7 @@ export class EtherTokenWrapper extends ContractWrapper {
|
|||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Gets historical logs without creating a subscription
|
* Gets historical logs without creating a subscription
|
||||||
* @param etherTokenAddress An address of the ether token that emmited the logs.
|
* @param etherTokenAddress An address of the ether token that emitted the logs.
|
||||||
* @param eventName The ether token contract event you would like to subscribe to.
|
* @param eventName The ether token contract event you would like to subscribe to.
|
||||||
* @param blockRange Block range to get logs from.
|
* @param blockRange Block range to get logs from.
|
||||||
* @param indexFilterValues An object where the keys are indexed args returned by the event and
|
* @param indexFilterValues An object where the keys are indexed args returned by the event and
|
||||||
|
@@ -3,6 +3,7 @@ import {
|
|||||||
BlockParamLiteral,
|
BlockParamLiteral,
|
||||||
DecodedLogArgs,
|
DecodedLogArgs,
|
||||||
ECSignature,
|
ECSignature,
|
||||||
|
LogEntry,
|
||||||
LogWithDecodedArgs,
|
LogWithDecodedArgs,
|
||||||
Order,
|
Order,
|
||||||
SignedOrder,
|
SignedOrder,
|
||||||
@@ -10,7 +11,6 @@ import {
|
|||||||
import { AbiDecoder, BigNumber } from '@0xproject/utils';
|
import { AbiDecoder, BigNumber } from '@0xproject/utils';
|
||||||
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as Web3 from 'web3';
|
|
||||||
|
|
||||||
import { artifacts } from '../artifacts';
|
import { artifacts } from '../artifacts';
|
||||||
import {
|
import {
|
||||||
@@ -87,12 +87,11 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
constructor(
|
constructor(
|
||||||
web3Wrapper: Web3Wrapper,
|
web3Wrapper: Web3Wrapper,
|
||||||
networkId: number,
|
networkId: number,
|
||||||
abiDecoder: AbiDecoder,
|
|
||||||
tokenWrapper: TokenWrapper,
|
tokenWrapper: TokenWrapper,
|
||||||
contractAddressIfExists?: string,
|
contractAddressIfExists?: string,
|
||||||
zrxContractAddressIfExists?: string,
|
zrxContractAddressIfExists?: string,
|
||||||
) {
|
) {
|
||||||
super(web3Wrapper, networkId, abiDecoder);
|
super(web3Wrapper, networkId);
|
||||||
this._tokenWrapper = tokenWrapper;
|
this._tokenWrapper = tokenWrapper;
|
||||||
this._orderValidationUtils = new OrderValidationUtils(this);
|
this._orderValidationUtils = new OrderValidationUtils(this);
|
||||||
this._contractAddressIfExists = contractAddressIfExists;
|
this._contractAddressIfExists = contractAddressIfExists;
|
||||||
@@ -281,6 +280,9 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
zrxTokenAddress,
|
zrxTokenAddress,
|
||||||
);
|
);
|
||||||
filledTakerTokenAmount = filledTakerTokenAmount.plus(singleFilledTakerTokenAmount);
|
filledTakerTokenAmount = filledTakerTokenAmount.plus(singleFilledTakerTokenAmount);
|
||||||
|
if (filledTakerTokenAmount.eq(fillTakerTokenAmount)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -857,10 +859,10 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
return isRoundingError;
|
return isRoundingError;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Checks if logs contain LogError, which is emmited by Exchange contract on transaction failure.
|
* Checks if logs contain LogError, which is emitted by Exchange contract on transaction failure.
|
||||||
* @param logs Transaction logs as returned by `zeroEx.awaitTransactionMinedAsync`
|
* @param logs Transaction logs as returned by `zeroEx.awaitTransactionMinedAsync`
|
||||||
*/
|
*/
|
||||||
public throwLogErrorsAsErrors(logs: Array<LogWithDecodedArgs<DecodedLogArgs> | Web3.LogEntry>): void {
|
public throwLogErrorsAsErrors(logs: Array<LogWithDecodedArgs<DecodedLogArgs> | LogEntry>): void {
|
||||||
const errLog = _.find(logs, {
|
const errLog = _.find(logs, {
|
||||||
event: ExchangeEvents.LogError,
|
event: ExchangeEvents.LogError,
|
||||||
});
|
});
|
||||||
|
@@ -1 +0,0 @@
|
|||||||
*
|
|
@@ -22,13 +22,8 @@ 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(
|
constructor(web3Wrapper: Web3Wrapper, networkId: number, tokenTransferProxyWrapper: TokenTransferProxyWrapper) {
|
||||||
web3Wrapper: Web3Wrapper,
|
super(web3Wrapper, networkId);
|
||||||
networkId: number,
|
|
||||||
abiDecoder: AbiDecoder,
|
|
||||||
tokenTransferProxyWrapper: TokenTransferProxyWrapper,
|
|
||||||
) {
|
|
||||||
super(web3Wrapper, networkId, abiDecoder);
|
|
||||||
this._tokenContractsByAddress = {};
|
this._tokenContractsByAddress = {};
|
||||||
this._tokenTransferProxyWrapper = tokenTransferProxyWrapper;
|
this._tokenTransferProxyWrapper = tokenTransferProxyWrapper;
|
||||||
}
|
}
|
||||||
@@ -385,7 +380,7 @@ export class TokenWrapper extends ContractWrapper {
|
|||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Gets historical logs without creating a subscription
|
* Gets historical logs without creating a subscription
|
||||||
* @param tokenAddress An address of the token that emmited the logs.
|
* @param tokenAddress An address of the token that emitted the logs.
|
||||||
* @param eventName The token contract event you would like to subscribe to.
|
* @param eventName The token contract event you would like to subscribe to.
|
||||||
* @param blockRange Block range to get logs from.
|
* @param blockRange Block range to get logs from.
|
||||||
* @param indexFilterValues An object where the keys are indexed args returned by the event and
|
* @param indexFilterValues An object where the keys are indexed args returned by the event and
|
||||||
|
35
packages/0x.js/src/globals.d.ts
vendored
35
packages/0x.js/src/globals.d.ts
vendored
@@ -1,49 +1,14 @@
|
|||||||
declare module 'web3_beta';
|
declare module 'web3_beta';
|
||||||
declare module 'chai-bignumber';
|
|
||||||
declare module 'dirty-chai';
|
|
||||||
declare module 'request-promise-native';
|
declare module 'request-promise-native';
|
||||||
declare module 'web3-provider-engine';
|
|
||||||
declare module 'web3-provider-engine/subproviders/rpc';
|
|
||||||
declare module 'publish-release';
|
|
||||||
|
|
||||||
// semver-sort declarations
|
// semver-sort declarations
|
||||||
declare module 'semver-sort' {
|
declare module 'semver-sort' {
|
||||||
const desc: (versions: string[]) => string[];
|
const desc: (versions: string[]) => string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
// HACK: In order to merge the bignumber declaration added by chai-bignumber to the chai Assertion
|
|
||||||
// interface we must use `namespace` as the Chai definitelyTyped definition does. Since we otherwise
|
|
||||||
// disallow `namespace`, we disable tslint for the following.
|
|
||||||
/* tslint:disable */
|
|
||||||
declare namespace Chai {
|
|
||||||
interface Assertion {
|
|
||||||
bignumber: Assertion;
|
|
||||||
// HACK: In order to comply with chai-as-promised we make eventually a `PromisedAssertion` not an `Assertion`
|
|
||||||
eventually: PromisedAssertion;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* tslint:enable */
|
|
||||||
|
|
||||||
declare module '*.json' {
|
declare module '*.json' {
|
||||||
const json: any;
|
const json: any;
|
||||||
/* tslint:disable */
|
/* tslint:disable */
|
||||||
export default json;
|
export default json;
|
||||||
/* tslint:enable */
|
/* tslint:enable */
|
||||||
}
|
}
|
||||||
|
|
||||||
declare module 'ethereumjs-abi' {
|
|
||||||
const soliditySHA3: (argTypes: string[], args: any[]) => Buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
// truffle-hdwallet-provider declarations
|
|
||||||
declare module 'truffle-hdwallet-provider' {
|
|
||||||
import * as Web3 from 'web3';
|
|
||||||
class HDWalletProvider implements Web3.Provider {
|
|
||||||
constructor(mnemonic: string, rpcUrl: string);
|
|
||||||
public sendAsync(
|
|
||||||
payload: Web3.JSONRPCRequestPayload,
|
|
||||||
callback: (err: Error, result: Web3.JSONRPCResponsePayload) => void,
|
|
||||||
): void;
|
|
||||||
}
|
|
||||||
export = HDWalletProvider;
|
|
||||||
}
|
|
||||||
|
23
packages/0x.js/src/globalsAugment.d.ts
vendored
23
packages/0x.js/src/globalsAugment.d.ts
vendored
@@ -1,23 +0,0 @@
|
|||||||
import { BigNumber } from '@0xproject/utils';
|
|
||||||
|
|
||||||
// HACK: This module overrides the Chai namespace so that we can use BigNumber types inside.
|
|
||||||
// Source: https://github.com/Microsoft/TypeScript/issues/7352#issuecomment-191547232
|
|
||||||
declare global {
|
|
||||||
// HACK: In order to merge the bignumber declaration added by chai-bignumber to the chai Assertion
|
|
||||||
// interface we must use `namespace` as the Chai definitelyTyped definition does. Since we otherwise
|
|
||||||
// disallow `namespace`, we disable tslint for the following.
|
|
||||||
/* tslint:disable */
|
|
||||||
namespace Chai {
|
|
||||||
interface NumberComparer {
|
|
||||||
(value: number | BigNumber, message?: string): Assertion;
|
|
||||||
}
|
|
||||||
interface NumericComparison {
|
|
||||||
greaterThan: NumberComparer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* tslint:enable */
|
|
||||||
interface DecodedLogArg {
|
|
||||||
name: string;
|
|
||||||
value: string | BigNumber;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -16,7 +16,6 @@ export {
|
|||||||
MethodOpts,
|
MethodOpts,
|
||||||
OrderTransactionOpts,
|
OrderTransactionOpts,
|
||||||
TransactionOpts,
|
TransactionOpts,
|
||||||
FilterObject,
|
|
||||||
LogEvent,
|
LogEvent,
|
||||||
DecodedLogEvent,
|
DecodedLogEvent,
|
||||||
EventWatcherCallback,
|
EventWatcherCallback,
|
||||||
@@ -28,6 +27,7 @@ export {
|
|||||||
|
|
||||||
export {
|
export {
|
||||||
BlockParamLiteral,
|
BlockParamLiteral,
|
||||||
|
FilterObject,
|
||||||
BlockParam,
|
BlockParam,
|
||||||
ContractEventArg,
|
ContractEventArg,
|
||||||
LogWithDecodedArgs,
|
LogWithDecodedArgs,
|
||||||
|
@@ -1,9 +1,7 @@
|
|||||||
|
import { BlockParamLiteral, LogEntry } from '@0xproject/types';
|
||||||
import { intervalUtils } from '@0xproject/utils';
|
import { intervalUtils } from '@0xproject/utils';
|
||||||
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as Web3 from 'web3';
|
|
||||||
|
|
||||||
import { BlockParamLiteral } from '@0xproject/types';
|
|
||||||
|
|
||||||
import { EventWatcherCallback, ZeroExError } from '../types';
|
import { EventWatcherCallback, ZeroExError } from '../types';
|
||||||
import { assert } from '../utils/assert';
|
import { assert } from '../utils/assert';
|
||||||
@@ -23,9 +21,15 @@ export class EventWatcher {
|
|||||||
private _web3Wrapper: Web3Wrapper;
|
private _web3Wrapper: Web3Wrapper;
|
||||||
private _pollingIntervalMs: number;
|
private _pollingIntervalMs: number;
|
||||||
private _intervalIdIfExists?: NodeJS.Timer;
|
private _intervalIdIfExists?: NodeJS.Timer;
|
||||||
private _lastEvents: Web3.LogEntry[] = [];
|
private _lastEvents: LogEntry[] = [];
|
||||||
constructor(web3Wrapper: Web3Wrapper, pollingIntervalIfExistsMs: undefined | number) {
|
private _stateLayer: BlockParamLiteral;
|
||||||
|
constructor(
|
||||||
|
web3Wrapper: Web3Wrapper,
|
||||||
|
pollingIntervalIfExistsMs: undefined | number,
|
||||||
|
stateLayer: BlockParamLiteral = BlockParamLiteral.Latest,
|
||||||
|
) {
|
||||||
this._web3Wrapper = web3Wrapper;
|
this._web3Wrapper = web3Wrapper;
|
||||||
|
this._stateLayer = stateLayer;
|
||||||
this._pollingIntervalMs = _.isUndefined(pollingIntervalIfExistsMs)
|
this._pollingIntervalMs = _.isUndefined(pollingIntervalIfExistsMs)
|
||||||
? DEFAULT_EVENT_POLLING_INTERVAL_MS
|
? DEFAULT_EVENT_POLLING_INTERVAL_MS
|
||||||
: pollingIntervalIfExistsMs;
|
: pollingIntervalIfExistsMs;
|
||||||
@@ -69,16 +73,16 @@ export class EventWatcher {
|
|||||||
await this._emitDifferencesAsync(newEvents, LogEventState.Added, callback);
|
await this._emitDifferencesAsync(newEvents, LogEventState.Added, callback);
|
||||||
this._lastEvents = pendingEvents;
|
this._lastEvents = pendingEvents;
|
||||||
}
|
}
|
||||||
private async _getEventsAsync(): Promise<Web3.LogEntry[]> {
|
private async _getEventsAsync(): Promise<LogEntry[]> {
|
||||||
const eventFilter = {
|
const eventFilter = {
|
||||||
fromBlock: BlockParamLiteral.Pending,
|
fromBlock: this._stateLayer,
|
||||||
toBlock: BlockParamLiteral.Pending,
|
toBlock: this._stateLayer,
|
||||||
};
|
};
|
||||||
const events = await this._web3Wrapper.getLogsAsync(eventFilter);
|
const events = await this._web3Wrapper.getLogsAsync(eventFilter);
|
||||||
return events;
|
return events;
|
||||||
}
|
}
|
||||||
private async _emitDifferencesAsync(
|
private async _emitDifferencesAsync(
|
||||||
logs: Web3.LogEntry[],
|
logs: LogEntry[],
|
||||||
logEventState: LogEventState,
|
logEventState: LogEventState,
|
||||||
callback: EventWatcherCallback,
|
callback: EventWatcherCallback,
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
|
@@ -59,7 +59,7 @@ const DEFAULT_CLEANUP_JOB_INTERVAL_MS = 1000 * 60 * 60; // 1h
|
|||||||
/**
|
/**
|
||||||
* This class includes all the functionality related to watching a set of orders
|
* This class includes all the functionality related to watching a set of orders
|
||||||
* for potential changes in order validity/fillability. The orderWatcher notifies
|
* for potential changes in order validity/fillability. The orderWatcher notifies
|
||||||
* the subscriber of these changes so that a final decison can be made on whether
|
* the subscriber of these changes so that a final decision can be made on whether
|
||||||
* the order should be deemed invalid.
|
* the order should be deemed invalid.
|
||||||
*/
|
*/
|
||||||
export class OrderStateWatcher {
|
export class OrderStateWatcher {
|
||||||
@@ -69,7 +69,6 @@ export class OrderStateWatcher {
|
|||||||
private _callbackIfExists?: OnOrderStateChangeCallback;
|
private _callbackIfExists?: OnOrderStateChangeCallback;
|
||||||
private _eventWatcher: EventWatcher;
|
private _eventWatcher: EventWatcher;
|
||||||
private _web3Wrapper: Web3Wrapper;
|
private _web3Wrapper: Web3Wrapper;
|
||||||
private _abiDecoder: AbiDecoder;
|
|
||||||
private _expirationWatcher: ExpirationWatcher;
|
private _expirationWatcher: ExpirationWatcher;
|
||||||
private _orderStateUtils: OrderStateUtils;
|
private _orderStateUtils: OrderStateUtils;
|
||||||
private _orderFilledCancelledLazyStore: OrderFilledCancelledLazyStore;
|
private _orderFilledCancelledLazyStore: OrderFilledCancelledLazyStore;
|
||||||
@@ -78,19 +77,16 @@ export class OrderStateWatcher {
|
|||||||
private _cleanupJobIntervalIdIfExists?: NodeJS.Timer;
|
private _cleanupJobIntervalIdIfExists?: NodeJS.Timer;
|
||||||
constructor(
|
constructor(
|
||||||
web3Wrapper: Web3Wrapper,
|
web3Wrapper: Web3Wrapper,
|
||||||
abiDecoder: AbiDecoder,
|
|
||||||
token: TokenWrapper,
|
token: TokenWrapper,
|
||||||
exchange: ExchangeWrapper,
|
exchange: ExchangeWrapper,
|
||||||
config?: OrderStateWatcherConfig,
|
config?: OrderStateWatcherConfig,
|
||||||
) {
|
) {
|
||||||
this._abiDecoder = abiDecoder;
|
|
||||||
this._web3Wrapper = web3Wrapper;
|
this._web3Wrapper = web3Wrapper;
|
||||||
const pollingIntervalIfExistsMs = _.isUndefined(config) ? undefined : config.eventPollingIntervalMs;
|
const pollingIntervalIfExistsMs = _.isUndefined(config) ? undefined : config.eventPollingIntervalMs;
|
||||||
this._eventWatcher = new EventWatcher(web3Wrapper, pollingIntervalIfExistsMs);
|
const stateLayer =
|
||||||
this._balanceAndProxyAllowanceLazyStore = new BalanceAndProxyAllowanceLazyStore(
|
_.isUndefined(config) || _.isUndefined(config.stateLayer) ? BlockParamLiteral.Latest : config.stateLayer;
|
||||||
token,
|
this._eventWatcher = new EventWatcher(web3Wrapper, pollingIntervalIfExistsMs, stateLayer);
|
||||||
BlockParamLiteral.Pending,
|
this._balanceAndProxyAllowanceLazyStore = new BalanceAndProxyAllowanceLazyStore(token, stateLayer);
|
||||||
);
|
|
||||||
this._orderFilledCancelledLazyStore = new OrderFilledCancelledLazyStore(exchange);
|
this._orderFilledCancelledLazyStore = new OrderFilledCancelledLazyStore(exchange);
|
||||||
this._orderStateUtils = new OrderStateUtils(
|
this._orderStateUtils = new OrderStateUtils(
|
||||||
this._balanceAndProxyAllowanceLazyStore,
|
this._balanceAndProxyAllowanceLazyStore,
|
||||||
@@ -231,7 +227,7 @@ export class OrderStateWatcher {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const log = logIfExists as LogEvent; // At this moment we are sure that no error occured and log is defined.
|
const log = logIfExists as LogEvent; // At this moment we are sure that no error occured and log is defined.
|
||||||
const maybeDecodedLog = this._abiDecoder.tryToDecodeLogOrNoop<ContractEventArgs>(log);
|
const maybeDecodedLog = this._web3Wrapper.abiDecoder.tryToDecodeLogOrNoop<ContractEventArgs>(log);
|
||||||
const isLogDecoded = !_.isUndefined(((maybeDecodedLog as any) as LogWithDecodedArgs<ContractEventArgs>).event);
|
const isLogDecoded = !_.isUndefined(((maybeDecodedLog as any) as LogWithDecodedArgs<ContractEventArgs>).event);
|
||||||
if (!isLogDecoded) {
|
if (!isLogDecoded) {
|
||||||
return; // noop
|
return; // noop
|
||||||
|
@@ -3,7 +3,10 @@ import { BigNumber } from '@0xproject/utils';
|
|||||||
import {
|
import {
|
||||||
BlockParam,
|
BlockParam,
|
||||||
BlockParamLiteral,
|
BlockParamLiteral,
|
||||||
|
ContractAbi,
|
||||||
ContractEventArg,
|
ContractEventArg,
|
||||||
|
FilterObject,
|
||||||
|
LogEntryEvent,
|
||||||
LogWithDecodedArgs,
|
LogWithDecodedArgs,
|
||||||
Order,
|
Order,
|
||||||
SignedOrder,
|
SignedOrder,
|
||||||
@@ -35,7 +38,6 @@ export enum ZeroExError {
|
|||||||
NoNetworkId = 'NO_NETWORK_ID',
|
NoNetworkId = 'NO_NETWORK_ID',
|
||||||
SubscriptionNotFound = 'SUBSCRIPTION_NOT_FOUND',
|
SubscriptionNotFound = 'SUBSCRIPTION_NOT_FOUND',
|
||||||
SubscriptionAlreadyPresent = 'SUBSCRIPTION_ALREADY_PRESENT',
|
SubscriptionAlreadyPresent = 'SUBSCRIPTION_ALREADY_PRESENT',
|
||||||
TransactionMiningTimeout = 'TRANSACTION_MINING_TIMEOUT',
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum InternalZeroExError {
|
export enum InternalZeroExError {
|
||||||
@@ -48,7 +50,7 @@ export type OrderAddresses = [string, string, string, string, string];
|
|||||||
|
|
||||||
export type OrderValues = [BigNumber, BigNumber, BigNumber, BigNumber, BigNumber, BigNumber];
|
export type OrderValues = [BigNumber, BigNumber, BigNumber, BigNumber, BigNumber, BigNumber];
|
||||||
|
|
||||||
export type LogEvent = Web3.LogEntryEvent;
|
export type LogEvent = LogEntryEvent;
|
||||||
export interface DecodedLogEvent<ArgsType> {
|
export interface DecodedLogEvent<ArgsType> {
|
||||||
isRemoved: boolean;
|
isRemoved: boolean;
|
||||||
log: LogWithDecodedArgs<ArgsType>;
|
log: LogWithDecodedArgs<ArgsType>;
|
||||||
@@ -162,16 +164,18 @@ export type Web3Provider = Web3.Provider;
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* orderExpirationCheckingIntervalMs: How often to check for expired orders. Default: 50
|
* orderExpirationCheckingIntervalMs: How often to check for expired orders. Default: 50
|
||||||
* eventPollingIntervalMs: How often to poll the Ethereum node for new events. Defaults: 200
|
* eventPollingIntervalMs: How often to poll the Ethereum node for new events. Default: 200
|
||||||
* expirationMarginMs: Amount of time before order expiry that you'd like to be notified
|
* expirationMarginMs: Amount of time before order expiry that you'd like to be notified
|
||||||
* of an orders expiration. Defaults: 0
|
* of an orders expiration. Default: 0
|
||||||
* cleanupJobIntervalMs: How often to run a cleanup job which revalidates all the orders. Defaults: 1h
|
* cleanupJobIntervalMs: How often to run a cleanup job which revalidates all the orders. Defaults: 1h
|
||||||
|
* stateLayer: Optional blockchain state layer OrderWatcher will monitor for new events. Default: latest
|
||||||
*/
|
*/
|
||||||
export interface OrderStateWatcherConfig {
|
export interface OrderStateWatcherConfig {
|
||||||
orderExpirationCheckingIntervalMs?: number;
|
orderExpirationCheckingIntervalMs?: number;
|
||||||
eventPollingIntervalMs?: number;
|
eventPollingIntervalMs?: number;
|
||||||
expirationMarginMs?: number;
|
expirationMarginMs?: number;
|
||||||
cleanupJobIntervalMs?: number;
|
cleanupJobIntervalMs?: number;
|
||||||
|
stateLayer: BlockParamLiteral;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -197,7 +201,7 @@ export type ArtifactContractName = 'ZRX' | 'TokenTransferProxy' | 'TokenRegistry
|
|||||||
|
|
||||||
export interface Artifact {
|
export interface Artifact {
|
||||||
contract_name: ArtifactContractName;
|
contract_name: ArtifactContractName;
|
||||||
abi: Web3.ContractAbi;
|
abi: ContractAbi;
|
||||||
networks: {
|
networks: {
|
||||||
[networkId: number]: {
|
[networkId: number]: {
|
||||||
address: string;
|
address: string;
|
||||||
@@ -222,7 +226,7 @@ export interface ValidateOrderFillableOpts {
|
|||||||
* flag when running Parity).
|
* flag when running Parity).
|
||||||
*/
|
*/
|
||||||
export interface MethodOpts {
|
export interface MethodOpts {
|
||||||
defaultBlock?: Web3.BlockParam;
|
defaultBlock?: BlockParam;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -242,8 +246,6 @@ export interface OrderTransactionOpts extends TransactionOpts {
|
|||||||
shouldValidate?: boolean;
|
shouldValidate?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type FilterObject = Web3.FilterObject;
|
|
||||||
|
|
||||||
export enum TradeSide {
|
export enum TradeSide {
|
||||||
Maker = 'maker',
|
Maker = 'maker',
|
||||||
Taker = 'taker',
|
Taker = 'taker',
|
||||||
|
@@ -1,8 +1,16 @@
|
|||||||
|
import {
|
||||||
|
ConstructorAbi,
|
||||||
|
ContractAbi,
|
||||||
|
EventAbi,
|
||||||
|
FallbackAbi,
|
||||||
|
FilterObject,
|
||||||
|
LogEntry,
|
||||||
|
MethodAbi,
|
||||||
|
} from '@0xproject/types';
|
||||||
import * as ethUtil from 'ethereumjs-util';
|
import * as ethUtil from 'ethereumjs-util';
|
||||||
import * as jsSHA3 from 'js-sha3';
|
import * as jsSHA3 from 'js-sha3';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as uuid from 'uuid/v4';
|
import * as uuid from 'uuid/v4';
|
||||||
import * as Web3 from 'web3';
|
|
||||||
|
|
||||||
import { BlockRange, ContractEvents, IndexedFilterValues } from '../types';
|
import { BlockRange, ContractEvents, IndexedFilterValues } from '../types';
|
||||||
|
|
||||||
@@ -16,15 +24,15 @@ export const filterUtils = {
|
|||||||
address: string,
|
address: string,
|
||||||
eventName: ContractEvents,
|
eventName: ContractEvents,
|
||||||
indexFilterValues: IndexedFilterValues,
|
indexFilterValues: IndexedFilterValues,
|
||||||
abi: Web3.ContractAbi,
|
abi: ContractAbi,
|
||||||
blockRange?: BlockRange,
|
blockRange?: BlockRange,
|
||||||
): Web3.FilterObject {
|
): FilterObject {
|
||||||
const eventAbi = _.find(abi, { name: eventName }) as Web3.EventAbi;
|
const eventAbi = _.find(abi, { name: eventName }) as EventAbi;
|
||||||
const eventSignature = filterUtils.getEventSignatureFromAbiByName(eventAbi, eventName);
|
const eventSignature = filterUtils.getEventSignatureFromAbiByName(eventAbi, eventName);
|
||||||
const topicForEventSignature = ethUtil.addHexPrefix(jsSHA3.keccak256(eventSignature));
|
const topicForEventSignature = ethUtil.addHexPrefix(jsSHA3.keccak256(eventSignature));
|
||||||
const topicsForIndexedArgs = filterUtils.getTopicsForIndexedArgs(eventAbi, indexFilterValues);
|
const topicsForIndexedArgs = filterUtils.getTopicsForIndexedArgs(eventAbi, indexFilterValues);
|
||||||
const topics = [topicForEventSignature, ...topicsForIndexedArgs];
|
const topics = [topicForEventSignature, ...topicsForIndexedArgs];
|
||||||
let filter: Web3.FilterObject = {
|
let filter: FilterObject = {
|
||||||
address,
|
address,
|
||||||
topics,
|
topics,
|
||||||
};
|
};
|
||||||
@@ -36,12 +44,12 @@ export const filterUtils = {
|
|||||||
}
|
}
|
||||||
return filter;
|
return filter;
|
||||||
},
|
},
|
||||||
getEventSignatureFromAbiByName(eventAbi: Web3.EventAbi, eventName: ContractEvents): string {
|
getEventSignatureFromAbiByName(eventAbi: EventAbi, eventName: ContractEvents): string {
|
||||||
const types = _.map(eventAbi.inputs, 'type');
|
const types = _.map(eventAbi.inputs, 'type');
|
||||||
const signature = `${eventAbi.name}(${types.join(',')})`;
|
const signature = `${eventAbi.name}(${types.join(',')})`;
|
||||||
return signature;
|
return signature;
|
||||||
},
|
},
|
||||||
getTopicsForIndexedArgs(abi: Web3.EventAbi, indexFilterValues: IndexedFilterValues): Array<string | null> {
|
getTopicsForIndexedArgs(abi: EventAbi, indexFilterValues: IndexedFilterValues): Array<string | null> {
|
||||||
const topics: Array<string | null> = [];
|
const topics: Array<string | null> = [];
|
||||||
for (const eventInput of abi.inputs) {
|
for (const eventInput of abi.inputs) {
|
||||||
if (!eventInput.indexed) {
|
if (!eventInput.indexed) {
|
||||||
@@ -60,7 +68,7 @@ export const filterUtils = {
|
|||||||
}
|
}
|
||||||
return topics;
|
return topics;
|
||||||
},
|
},
|
||||||
matchesFilter(log: Web3.LogEntry, filter: Web3.FilterObject): boolean {
|
matchesFilter(log: LogEntry, filter: FilterObject): boolean {
|
||||||
if (!_.isUndefined(filter.address) && log.address !== filter.address) {
|
if (!_.isUndefined(filter.address) && log.address !== filter.address) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -41,11 +41,11 @@ describe('ZeroEx library', () => {
|
|||||||
expect((zeroEx.tokenRegistry as any)._tokenRegistryContractIfExists).to.be.undefined();
|
expect((zeroEx.tokenRegistry as any)._tokenRegistryContractIfExists).to.be.undefined();
|
||||||
|
|
||||||
// Check that all nested web3 wrapper instances return the updated provider
|
// Check that all nested web3 wrapper instances return the updated provider
|
||||||
const nestedWeb3WrapperProvider = (zeroEx as any)._web3Wrapper.getCurrentProvider();
|
const nestedWeb3WrapperProvider = (zeroEx as any)._web3Wrapper.getProvider();
|
||||||
expect(nestedWeb3WrapperProvider.zeroExTestId).to.be.a('number');
|
expect(nestedWeb3WrapperProvider.zeroExTestId).to.be.a('number');
|
||||||
const exchangeWeb3WrapperProvider = (zeroEx.exchange as any)._web3Wrapper.getCurrentProvider();
|
const exchangeWeb3WrapperProvider = (zeroEx.exchange as any)._web3Wrapper.getProvider();
|
||||||
expect(exchangeWeb3WrapperProvider.zeroExTestId).to.be.a('number');
|
expect(exchangeWeb3WrapperProvider.zeroExTestId).to.be.a('number');
|
||||||
const tokenRegistryWeb3WrapperProvider = (zeroEx.tokenRegistry as any)._web3Wrapper.getCurrentProvider();
|
const tokenRegistryWeb3WrapperProvider = (zeroEx.tokenRegistry as any)._web3Wrapper.getProvider();
|
||||||
expect(tokenRegistryWeb3WrapperProvider.zeroExTestId).to.be.a('number');
|
expect(tokenRegistryWeb3WrapperProvider.zeroExTestId).to.be.a('number');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -216,7 +216,7 @@ describe('ZeroEx library', () => {
|
|||||||
s: '0x050aa3cc1f2c435e67e114cdce54b9527b4f50548342401bc5d2b77adbdacb02',
|
s: '0x050aa3cc1f2c435e67e114cdce54b9527b4f50548342401bc5d2b77adbdacb02',
|
||||||
};
|
};
|
||||||
stubs = [
|
stubs = [
|
||||||
Sinon.stub((zeroEx as any)._web3Wrapper, 'signTransactionAsync').returns(Promise.resolve(signature)),
|
Sinon.stub((zeroEx as any)._web3Wrapper, 'signMessageAsync').returns(Promise.resolve(signature)),
|
||||||
Sinon.stub(ZeroEx, 'isValidSignature').returns(true),
|
Sinon.stub(ZeroEx, 'isValidSignature').returns(true),
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -237,7 +237,7 @@ describe('ZeroEx library', () => {
|
|||||||
s: '0x2dea66f25a608bbae457e020fb6decb763deb8b7192abab624997242da248960',
|
s: '0x2dea66f25a608bbae457e020fb6decb763deb8b7192abab624997242da248960',
|
||||||
};
|
};
|
||||||
stubs = [
|
stubs = [
|
||||||
Sinon.stub((zeroEx as any)._web3Wrapper, 'signTransactionAsync').returns(Promise.resolve(signature)),
|
Sinon.stub((zeroEx as any)._web3Wrapper, 'signMessageAsync').returns(Promise.resolve(signature)),
|
||||||
Sinon.stub(ZeroEx, 'isValidSignature').returns(true),
|
Sinon.stub(ZeroEx, 'isValidSignature').returns(true),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@@ -137,7 +137,7 @@ describe('EtherTokenWrapper', () => {
|
|||||||
gasCost = expectedETHBalance.minus(postETHBalance);
|
gasCost = expectedETHBalance.minus(postETHBalance);
|
||||||
expect(gasCost).to.be.bignumber.lte(MAX_REASONABLE_GAS_COST_IN_WEI);
|
expect(gasCost).to.be.bignumber.lte(MAX_REASONABLE_GAS_COST_IN_WEI);
|
||||||
});
|
});
|
||||||
it('should throw if user has insufficient WETH balance for withdrawl', async () => {
|
it('should throw if user has insufficient WETH balance for withdrawal', async () => {
|
||||||
const preWETHBalance = await zeroEx.token.getBalanceAsync(wethContractAddress, addressWithETH);
|
const preWETHBalance = await zeroEx.token.getBalanceAsync(wethContractAddress, addressWithETH);
|
||||||
expect(preWETHBalance).to.be.bignumber.equal(0);
|
expect(preWETHBalance).to.be.bignumber.equal(0);
|
||||||
|
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
import { web3Factory } from '@0xproject/dev-utils';
|
import { web3Factory } from '@0xproject/dev-utils';
|
||||||
|
import { LogEntry } from '@0xproject/types';
|
||||||
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
import * as chai from 'chai';
|
import * as chai from 'chai';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
@@ -21,7 +22,7 @@ describe('EventWatcher', () => {
|
|||||||
let stubs: Sinon.SinonStub[] = [];
|
let stubs: Sinon.SinonStub[] = [];
|
||||||
let eventWatcher: EventWatcher;
|
let eventWatcher: EventWatcher;
|
||||||
let web3Wrapper: Web3Wrapper;
|
let web3Wrapper: Web3Wrapper;
|
||||||
const logA: Web3.LogEntry = {
|
const logA: LogEntry = {
|
||||||
address: '0x71d271f8b14adef568f8f28f1587ce7271ac4ca5',
|
address: '0x71d271f8b14adef568f8f28f1587ce7271ac4ca5',
|
||||||
blockHash: null,
|
blockHash: null,
|
||||||
blockNumber: null,
|
blockNumber: null,
|
||||||
@@ -31,7 +32,7 @@ describe('EventWatcher', () => {
|
|||||||
transactionHash: '0x004881d38cd4a8f72f1a0d68c8b9b8124504706041ff37019c1d1ed6bfda8e17',
|
transactionHash: '0x004881d38cd4a8f72f1a0d68c8b9b8124504706041ff37019c1d1ed6bfda8e17',
|
||||||
transactionIndex: 0,
|
transactionIndex: 0,
|
||||||
};
|
};
|
||||||
const logB: Web3.LogEntry = {
|
const logB: LogEntry = {
|
||||||
address: '0x8d12a197cb00d4747a1fe03395095ce2a5cc6819',
|
address: '0x8d12a197cb00d4747a1fe03395095ce2a5cc6819',
|
||||||
blockHash: null,
|
blockHash: null,
|
||||||
blockNumber: null,
|
blockNumber: null,
|
||||||
@@ -41,7 +42,7 @@ describe('EventWatcher', () => {
|
|||||||
transactionHash: '0x01ef3c048b18d9b09ea195b4ed94cf8dd5f3d857a1905ff886b152cfb1166f25',
|
transactionHash: '0x01ef3c048b18d9b09ea195b4ed94cf8dd5f3d857a1905ff886b152cfb1166f25',
|
||||||
transactionIndex: 0,
|
transactionIndex: 0,
|
||||||
};
|
};
|
||||||
const logC: Web3.LogEntry = {
|
const logC: LogEntry = {
|
||||||
address: '0x1d271f8b174adef58f1587ce68f8f27271ac4ca5',
|
address: '0x1d271f8b174adef58f1587ce68f8f27271ac4ca5',
|
||||||
blockHash: null,
|
blockHash: null,
|
||||||
blockNumber: null,
|
blockNumber: null,
|
||||||
@@ -64,7 +65,7 @@ describe('EventWatcher', () => {
|
|||||||
eventWatcher.unsubscribe();
|
eventWatcher.unsubscribe();
|
||||||
});
|
});
|
||||||
it('correctly emits initial log events', (done: DoneCallback) => {
|
it('correctly emits initial log events', (done: DoneCallback) => {
|
||||||
const logs: Web3.LogEntry[] = [logA, logB];
|
const logs: LogEntry[] = [logA, logB];
|
||||||
const expectedLogEvents = [
|
const expectedLogEvents = [
|
||||||
{
|
{
|
||||||
removed: false,
|
removed: false,
|
||||||
@@ -89,8 +90,8 @@ describe('EventWatcher', () => {
|
|||||||
eventWatcher.subscribe(callback);
|
eventWatcher.subscribe(callback);
|
||||||
});
|
});
|
||||||
it('correctly computes the difference and emits only changes', (done: DoneCallback) => {
|
it('correctly computes the difference and emits only changes', (done: DoneCallback) => {
|
||||||
const initialLogs: Web3.LogEntry[] = [logA, logB];
|
const initialLogs: LogEntry[] = [logA, logB];
|
||||||
const changedLogs: Web3.LogEntry[] = [logA, logC];
|
const changedLogs: LogEntry[] = [logA, logC];
|
||||||
const expectedLogEvents = [
|
const expectedLogEvents = [
|
||||||
{
|
{
|
||||||
removed: false,
|
removed: false,
|
||||||
|
@@ -596,6 +596,19 @@ describe('ExchangeWrapper', () => {
|
|||||||
const remainingFillAmount = fillableAmount.minus(1);
|
const remainingFillAmount = fillableAmount.minus(1);
|
||||||
expect(anotherFilledAmount).to.be.bignumber.equal(remainingFillAmount);
|
expect(anotherFilledAmount).to.be.bignumber.equal(remainingFillAmount);
|
||||||
});
|
});
|
||||||
|
it('should successfully fill up to specified amount and leave the rest of the orders untouched', async () => {
|
||||||
|
const txHash = await zeroEx.exchange.fillOrdersUpToAsync(
|
||||||
|
signedOrders,
|
||||||
|
fillableAmount,
|
||||||
|
shouldThrowOnInsufficientBalanceOrAllowance,
|
||||||
|
takerAddress,
|
||||||
|
);
|
||||||
|
await zeroEx.awaitTransactionMinedAsync(txHash);
|
||||||
|
const filledAmount = await zeroEx.exchange.getFilledTakerAmountAsync(signedOrderHashHex);
|
||||||
|
const zeroAmount = await zeroEx.exchange.getFilledTakerAmountAsync(anotherOrderHashHex);
|
||||||
|
expect(filledAmount).to.be.bignumber.equal(fillableAmount);
|
||||||
|
expect(zeroAmount).to.be.bignumber.equal(0);
|
||||||
|
});
|
||||||
it('should successfully fill up to specified amount even if filling all orders would fail', async () => {
|
it('should successfully fill up to specified amount even if filling all orders would fail', async () => {
|
||||||
const missingBalance = new BigNumber(1); // User will still have enough balance to fill up to 9,
|
const missingBalance = new BigNumber(1); // User will still have enough balance to fill up to 9,
|
||||||
// but won't have 10 to fully fill all orders in a batch.
|
// but won't have 10 to fully fill all orders in a batch.
|
||||||
|
@@ -15,6 +15,7 @@ import {
|
|||||||
ZeroEx,
|
ZeroEx,
|
||||||
ZeroExError,
|
ZeroExError,
|
||||||
} from '../src';
|
} from '../src';
|
||||||
|
import { OrderStateWatcher } from '../src/order_watcher/order_state_watcher';
|
||||||
import { DoneCallback } from '../src/types';
|
import { DoneCallback } from '../src/types';
|
||||||
|
|
||||||
import { chaiSetup } from './utils/chai_setup';
|
import { chaiSetup } from './utils/chai_setup';
|
||||||
@@ -43,6 +44,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
let maker: string;
|
let maker: string;
|
||||||
let taker: string;
|
let taker: string;
|
||||||
let signedOrder: SignedOrder;
|
let signedOrder: SignedOrder;
|
||||||
|
let orderStateWatcher: OrderStateWatcher;
|
||||||
const config = {
|
const config = {
|
||||||
networkId: constants.TESTRPC_NETWORK_ID,
|
networkId: constants.TESTRPC_NETWORK_ID,
|
||||||
};
|
};
|
||||||
@@ -50,6 +52,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
const fillableAmount = ZeroEx.toBaseUnitAmount(new BigNumber(5), decimals);
|
const fillableAmount = ZeroEx.toBaseUnitAmount(new BigNumber(5), decimals);
|
||||||
before(async () => {
|
before(async () => {
|
||||||
zeroEx = new ZeroEx(web3.currentProvider, config);
|
zeroEx = new ZeroEx(web3.currentProvider, config);
|
||||||
|
orderStateWatcher = zeroEx.createOrderStateWatcher();
|
||||||
exchangeContractAddress = zeroEx.exchange.getContractAddress();
|
exchangeContractAddress = zeroEx.exchange.getContractAddress();
|
||||||
userAddresses = await zeroEx.getAvailableAddressesAsync();
|
userAddresses = await zeroEx.getAvailableAddressesAsync();
|
||||||
[, maker, taker] = userAddresses;
|
[, maker, taker] = userAddresses;
|
||||||
@@ -76,17 +79,17 @@ describe('OrderStateWatcher', () => {
|
|||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
expect((zeroEx.orderStateWatcher as any)._orderByOrderHash).to.include({
|
expect((orderStateWatcher as any)._orderByOrderHash).to.include({
|
||||||
[orderHash]: signedOrder,
|
[orderHash]: signedOrder,
|
||||||
});
|
});
|
||||||
let dependentOrderHashes = (zeroEx.orderStateWatcher as any)._dependentOrderHashes;
|
let dependentOrderHashes = (orderStateWatcher as any)._dependentOrderHashes;
|
||||||
expect(dependentOrderHashes[signedOrder.maker][signedOrder.makerTokenAddress]).to.have.keys(orderHash);
|
expect(dependentOrderHashes[signedOrder.maker][signedOrder.makerTokenAddress]).to.have.keys(orderHash);
|
||||||
zeroEx.orderStateWatcher.removeOrder(orderHash);
|
orderStateWatcher.removeOrder(orderHash);
|
||||||
expect((zeroEx.orderStateWatcher as any)._orderByOrderHash).to.not.include({
|
expect((orderStateWatcher as any)._orderByOrderHash).to.not.include({
|
||||||
[orderHash]: signedOrder,
|
[orderHash]: signedOrder,
|
||||||
});
|
});
|
||||||
dependentOrderHashes = (zeroEx.orderStateWatcher as any)._dependentOrderHashes;
|
dependentOrderHashes = (orderStateWatcher as any)._dependentOrderHashes;
|
||||||
expect(dependentOrderHashes[signedOrder.maker]).to.be.undefined();
|
expect(dependentOrderHashes[signedOrder.maker]).to.be.undefined();
|
||||||
});
|
});
|
||||||
it('should no-op when removing a non-existing order', async () => {
|
it('should no-op when removing a non-existing order', async () => {
|
||||||
@@ -103,23 +106,23 @@ describe('OrderStateWatcher', () => {
|
|||||||
.split('')
|
.split('')
|
||||||
.reverse()
|
.reverse()
|
||||||
.join('')}`;
|
.join('')}`;
|
||||||
zeroEx.orderStateWatcher.removeOrder(nonExistentOrderHash);
|
orderStateWatcher.removeOrder(nonExistentOrderHash);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
describe('#subscribe', async () => {
|
describe('#subscribe', async () => {
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
zeroEx.orderStateWatcher.unsubscribe();
|
orderStateWatcher.unsubscribe();
|
||||||
});
|
});
|
||||||
it('should fail when trying to subscribe twice', async () => {
|
it('should fail when trying to subscribe twice', async () => {
|
||||||
zeroEx.orderStateWatcher.subscribe(_.noop);
|
orderStateWatcher.subscribe(_.noop);
|
||||||
expect(() => zeroEx.orderStateWatcher.subscribe(_.noop)).to.throw(ZeroExError.SubscriptionAlreadyPresent);
|
expect(() => orderStateWatcher.subscribe(_.noop)).to.throw(ZeroExError.SubscriptionAlreadyPresent);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
describe('tests with cleanup', async () => {
|
describe('tests with cleanup', async () => {
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
zeroEx.orderStateWatcher.unsubscribe();
|
orderStateWatcher.unsubscribe();
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.removeOrder(orderHash);
|
orderStateWatcher.removeOrder(orderHash);
|
||||||
});
|
});
|
||||||
it('should emit orderStateInvalid when maker allowance set to 0 for watched order', (done: DoneCallback) => {
|
it('should emit orderStateInvalid when maker allowance set to 0 for watched order', (done: DoneCallback) => {
|
||||||
(async () => {
|
(async () => {
|
||||||
@@ -131,14 +134,14 @@ describe('OrderStateWatcher', () => {
|
|||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.false();
|
expect(orderState.isValid).to.be.false();
|
||||||
const invalidOrderState = orderState as OrderStateInvalid;
|
const invalidOrderState = orderState as OrderStateInvalid;
|
||||||
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
||||||
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerAllowance);
|
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerAllowance);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.token.setProxyAllowanceAsync(makerToken.address, maker, new BigNumber(0));
|
await zeroEx.token.setProxyAllowanceAsync(makerToken.address, maker, new BigNumber(0));
|
||||||
})().catch(done);
|
})().catch(done);
|
||||||
});
|
});
|
||||||
@@ -151,11 +154,11 @@ describe('OrderStateWatcher', () => {
|
|||||||
taker,
|
taker,
|
||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
throw new Error('OrderState callback fired for irrelevant order');
|
throw new Error('OrderState callback fired for irrelevant order');
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
const notTheMaker = userAddresses[0];
|
const notTheMaker = userAddresses[0];
|
||||||
const anyRecipient = taker;
|
const anyRecipient = taker;
|
||||||
const transferAmount = new BigNumber(2);
|
const transferAmount = new BigNumber(2);
|
||||||
@@ -175,14 +178,14 @@ describe('OrderStateWatcher', () => {
|
|||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.false();
|
expect(orderState.isValid).to.be.false();
|
||||||
const invalidOrderState = orderState as OrderStateInvalid;
|
const invalidOrderState = orderState as OrderStateInvalid;
|
||||||
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
||||||
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerBalance);
|
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerBalance);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
const anyRecipient = taker;
|
const anyRecipient = taker;
|
||||||
const makerBalance = await zeroEx.token.getBalanceAsync(makerToken.address, maker);
|
const makerBalance = await zeroEx.token.getBalanceAsync(makerToken.address, maker);
|
||||||
await zeroEx.token.transferAsync(makerToken.address, maker, anyRecipient, makerBalance);
|
await zeroEx.token.transferAsync(makerToken.address, maker, anyRecipient, makerBalance);
|
||||||
@@ -198,7 +201,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.false();
|
expect(orderState.isValid).to.be.false();
|
||||||
@@ -206,7 +209,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
||||||
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderRemainingFillAmountZero);
|
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderRemainingFillAmountZero);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
|
|
||||||
const shouldThrowOnInsufficientBalanceOrAllowance = true;
|
const shouldThrowOnInsufficientBalanceOrAllowance = true;
|
||||||
await zeroEx.exchange.fillOrderAsync(
|
await zeroEx.exchange.fillOrderAsync(
|
||||||
@@ -230,7 +233,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
const makerBalance = await zeroEx.token.getBalanceAsync(makerToken.address, maker);
|
const makerBalance = await zeroEx.token.getBalanceAsync(makerToken.address, maker);
|
||||||
const fillAmountInBaseUnits = new BigNumber(2);
|
const fillAmountInBaseUnits = new BigNumber(2);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.true();
|
expect(orderState.isValid).to.be.true();
|
||||||
@@ -247,7 +250,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
);
|
);
|
||||||
expect(orderRelevantState.makerBalance).to.be.bignumber.equal(remainingMakerBalance);
|
expect(orderRelevantState.makerBalance).to.be.bignumber.equal(remainingMakerBalance);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
const shouldThrowOnInsufficientBalanceOrAllowance = true;
|
const shouldThrowOnInsufficientBalanceOrAllowance = true;
|
||||||
await zeroEx.exchange.fillOrderAsync(
|
await zeroEx.exchange.fillOrderAsync(
|
||||||
signedOrder,
|
signedOrder,
|
||||||
@@ -272,8 +275,8 @@ describe('OrderStateWatcher', () => {
|
|||||||
taker,
|
taker,
|
||||||
);
|
);
|
||||||
const callback = reportNodeCallbackErrors(done)();
|
const callback = reportNodeCallbackErrors(done)();
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.token.setProxyAllowanceAsync(zrxTokenAddress, maker, new BigNumber(0));
|
await zeroEx.token.setProxyAllowanceAsync(zrxTokenAddress, maker, new BigNumber(0));
|
||||||
})().catch(done);
|
})().catch(done);
|
||||||
});
|
});
|
||||||
@@ -292,7 +295,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
);
|
);
|
||||||
const fillAmountInBaseUnits = ZeroEx.toBaseUnitAmount(new BigNumber(2), decimals);
|
const fillAmountInBaseUnits = ZeroEx.toBaseUnitAmount(new BigNumber(2), decimals);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.true();
|
expect(orderState.isValid).to.be.true();
|
||||||
const validOrderState = orderState as OrderStateValid;
|
const validOrderState = orderState as OrderStateValid;
|
||||||
@@ -305,7 +308,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
ZeroEx.toBaseUnitAmount(new BigNumber(8), decimals),
|
ZeroEx.toBaseUnitAmount(new BigNumber(8), decimals),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
const shouldThrowOnInsufficientBalanceOrAllowance = true;
|
const shouldThrowOnInsufficientBalanceOrAllowance = true;
|
||||||
await zeroEx.exchange.fillOrderAsync(
|
await zeroEx.exchange.fillOrderAsync(
|
||||||
signedOrder,
|
signedOrder,
|
||||||
@@ -326,7 +329,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const changedMakerApprovalAmount = ZeroEx.toBaseUnitAmount(new BigNumber(3), decimals);
|
const changedMakerApprovalAmount = ZeroEx.toBaseUnitAmount(new BigNumber(3), decimals);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
const validOrderState = orderState as OrderStateValid;
|
const validOrderState = orderState as OrderStateValid;
|
||||||
@@ -338,7 +341,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
changedMakerApprovalAmount,
|
changedMakerApprovalAmount,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.token.setProxyAllowanceAsync(makerToken.address, maker, changedMakerApprovalAmount);
|
await zeroEx.token.setProxyAllowanceAsync(makerToken.address, maker, changedMakerApprovalAmount);
|
||||||
})().catch(done);
|
})().catch(done);
|
||||||
});
|
});
|
||||||
@@ -356,7 +359,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
|
|
||||||
const remainingAmount = ZeroEx.toBaseUnitAmount(new BigNumber(1), decimals);
|
const remainingAmount = ZeroEx.toBaseUnitAmount(new BigNumber(1), decimals);
|
||||||
const transferAmount = makerBalance.sub(remainingAmount);
|
const transferAmount = makerBalance.sub(remainingAmount);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.true();
|
expect(orderState.isValid).to.be.true();
|
||||||
@@ -369,7 +372,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
remainingAmount,
|
remainingAmount,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.token.transferAsync(makerToken.address, maker, ZeroEx.NULL_ADDRESS, transferAmount);
|
await zeroEx.token.transferAsync(makerToken.address, maker, ZeroEx.NULL_ADDRESS, transferAmount);
|
||||||
})().catch(done);
|
})().catch(done);
|
||||||
});
|
});
|
||||||
@@ -391,7 +394,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
|
|
||||||
const remainingTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(4), decimals);
|
const remainingTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(4), decimals);
|
||||||
const transferTokenAmount = makerFee.sub(remainingTokenAmount);
|
const transferTokenAmount = makerFee.sub(remainingTokenAmount);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.true();
|
expect(orderState.isValid).to.be.true();
|
||||||
@@ -401,7 +404,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
remainingTokenAmount,
|
remainingTokenAmount,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.exchange.cancelOrderAsync(signedOrder, transferTokenAmount);
|
await zeroEx.exchange.cancelOrderAsync(signedOrder, transferTokenAmount);
|
||||||
})().catch(done);
|
})().catch(done);
|
||||||
});
|
});
|
||||||
@@ -425,7 +428,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
|
|
||||||
const remainingTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(4), decimals);
|
const remainingTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(4), decimals);
|
||||||
const transferTokenAmount = makerFee.sub(remainingTokenAmount);
|
const transferTokenAmount = makerFee.sub(remainingTokenAmount);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
const validOrderState = orderState as OrderStateValid;
|
const validOrderState = orderState as OrderStateValid;
|
||||||
@@ -434,7 +437,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
remainingFeeAmount,
|
remainingFeeAmount,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.token.setProxyAllowanceAsync(zrxTokenAddress, maker, remainingFeeAmount);
|
await zeroEx.token.setProxyAllowanceAsync(zrxTokenAddress, maker, remainingFeeAmount);
|
||||||
await zeroEx.token.transferAsync(
|
await zeroEx.token.transferAsync(
|
||||||
makerToken.address,
|
makerToken.address,
|
||||||
@@ -460,7 +463,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
feeRecipient,
|
feeRecipient,
|
||||||
);
|
);
|
||||||
|
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
const validOrderState = orderState as OrderStateValid;
|
const validOrderState = orderState as OrderStateValid;
|
||||||
@@ -469,7 +472,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.token.setProxyAllowanceAsync(
|
await zeroEx.token.setProxyAllowanceAsync(
|
||||||
makerToken.address,
|
makerToken.address,
|
||||||
maker,
|
maker,
|
||||||
@@ -488,7 +491,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.false();
|
expect(orderState.isValid).to.be.false();
|
||||||
@@ -496,7 +499,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
||||||
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderRemainingFillAmountZero);
|
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderRemainingFillAmountZero);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
|
|
||||||
await zeroEx.exchange.cancelOrderAsync(signedOrder, fillableAmount);
|
await zeroEx.exchange.cancelOrderAsync(signedOrder, fillableAmount);
|
||||||
})().catch(done);
|
})().catch(done);
|
||||||
@@ -512,7 +515,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.false();
|
expect(orderState.isValid).to.be.false();
|
||||||
@@ -520,7 +523,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
||||||
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderFillRoundingError);
|
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderFillRoundingError);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.exchange.cancelOrderAsync(
|
await zeroEx.exchange.cancelOrderAsync(
|
||||||
signedOrder,
|
signedOrder,
|
||||||
fillableAmount.minus(remainingFillableAmountInBaseUnits),
|
fillableAmount.minus(remainingFillableAmountInBaseUnits),
|
||||||
@@ -539,7 +542,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
|
|
||||||
const cancelAmountInBaseUnits = new BigNumber(2);
|
const cancelAmountInBaseUnits = new BigNumber(2);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.true();
|
expect(orderState.isValid).to.be.true();
|
||||||
@@ -548,7 +551,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
const orderRelevantState = validOrderState.orderRelevantState;
|
const orderRelevantState = validOrderState.orderRelevantState;
|
||||||
expect(orderRelevantState.cancelledTakerTokenAmount).to.be.bignumber.equal(cancelAmountInBaseUnits);
|
expect(orderRelevantState.cancelledTakerTokenAmount).to.be.bignumber.equal(cancelAmountInBaseUnits);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.exchange.cancelOrderAsync(signedOrder, cancelAmountInBaseUnits);
|
await zeroEx.exchange.cancelOrderAsync(signedOrder, cancelAmountInBaseUnits);
|
||||||
})().catch(done);
|
})().catch(done);
|
||||||
});
|
});
|
||||||
|
@@ -1,17 +1,7 @@
|
|||||||
{
|
{
|
||||||
"extends": "../../tsconfig",
|
"extends": "../../tsconfig",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "lib",
|
"outDir": "lib"
|
||||||
"noImplicitThis": false
|
|
||||||
},
|
},
|
||||||
"include": [
|
"include": ["./src/**/*", "./test/**/*"]
|
||||||
"./src/**/*",
|
|
||||||
"./test/**/*",
|
|
||||||
"../../node_modules/types-bn/index.d.ts",
|
|
||||||
"../../node_modules/types-ethereumjs-util/index.d.ts",
|
|
||||||
"../../node_modules/ethers-typescript-typings/index.d.ts",
|
|
||||||
"../../node_modules/web3-typescript-typings/index.d.ts",
|
|
||||||
"../../node_modules/chai-typescript-typings/index.d.ts",
|
|
||||||
"../../node_modules/chai-as-promised-typescript-typings/index.d.ts"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
@@ -3,3 +3,4 @@ yarn-error.log
|
|||||||
/src/
|
/src/
|
||||||
/scripts/
|
/scripts/
|
||||||
tsconfig.json
|
tsconfig.json
|
||||||
|
/lib/monorepo_scripts/
|
||||||
|
99
packages/abi-gen/CHANGELOG.json
Normal file
99
packages/abi-gen/CHANGELOG.json
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1522673609,
|
||||||
|
"version": "0.2.9",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1522658513,
|
||||||
|
"version": "0.2.8",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.2.5",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package",
|
||||||
|
"pr": 452
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1521298800,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.2.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Add a `backend` parameter that allows you to specify the Ethereum library you use in your templates (`web3` or `ethers`). Ethers auto-converts small ints to numbers whereas Web3 doesn't. Defaults to `web3`",
|
||||||
|
"pr": 413
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Add support for [tuple types](https://solidity.readthedocs.io/en/develop/abi-spec.html#handling-tuple-types)",
|
||||||
|
"pr": 413
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add `hasReturnValue` to context data",
|
||||||
|
"pr": 413
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1520089200,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.2.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fix publishing issue where .npmignore was not properly excluding undesired content",
|
||||||
|
"pr": 389
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1518102000,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Added CLI options for explicit specifying location of partials and main template",
|
||||||
|
"pr": 346
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Added CLI option to specify networkId, adding support for the JSON artifact format found in @0xproject/contracts",
|
||||||
|
"pr": 388
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1517929200,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.1.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fixed array typings with union types",
|
||||||
|
"pr": 295
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add event ABIs to context data passed to templates",
|
||||||
|
"pr": 302
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add constructor ABIs to context data passed to templates",
|
||||||
|
"pr": 304
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1515596400,
|
||||||
|
"isPublished": true
|
||||||
|
}
|
||||||
|
]
|
@@ -1,25 +1,38 @@
|
|||||||
# CHANGELOG
|
<!--
|
||||||
|
This file is auto-generated using the monorepo-scripts package. Don't edit directly.
|
||||||
|
Edit the package's CHANGELOG.json file only.
|
||||||
|
-->
|
||||||
|
|
||||||
## v0.2.5 - _March 18, 2018_
|
CHANGELOG
|
||||||
|
|
||||||
|
## v0.2.9 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v0.2.8 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v0.2.5 - _March 17, 2018_
|
||||||
|
|
||||||
* Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
|
* Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
|
||||||
|
|
||||||
## v0.2.4 - _March 4, 2018_
|
## v0.2.4 - _March 3, 2018_
|
||||||
|
|
||||||
* Add a `backend` parameter that allows you to specify the Ethereum library you use in your templates (`web3` or `ethers`). Ethers auto-converts small ints to numbers whereas Web3 doesn't. Defaults to `web3` (#413)
|
* Add a `backend` parameter that allows you to specify the Ethereum library you use in your templates (`web3` or `ethers`). Ethers auto-converts small ints to numbers whereas Web3 doesn't. Defaults to `web3` (#413)
|
||||||
* Add support for [tuple types](https://solidity.readthedocs.io/en/develop/abi-spec.html#handling-tuple-types) (#413)
|
* Add support for [tuple types](https://solidity.readthedocs.io/en/develop/abi-spec.html#handling-tuple-types) (#413)
|
||||||
* Add `hasReturnValue` to context data (#413)
|
* Add `hasReturnValue` to context data (#413)
|
||||||
|
|
||||||
## v0.2.1 - _February 9, 2018_
|
## v0.2.1 - _February 8, 2018_
|
||||||
|
|
||||||
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
||||||
|
|
||||||
## v0.2.0 - _February 7, 2018_
|
## v0.2.0 - _February 6, 2018_
|
||||||
|
|
||||||
* Added CLI options for explicit specifying location of partials and main template (#346)
|
* Added CLI options for explicit specifying location of partials and main template (#346)
|
||||||
* Added CLI option to specify networkId, adding support for the JSON artifact format found in @0xproject/contracts (#388)
|
* Added CLI option to specify networkId, adding support for the JSON artifact format found in @0xproject/contracts (#388)
|
||||||
|
|
||||||
## v0.1.0 - _January 11, 2018_
|
## v0.1.0 - _January 10, 2018_
|
||||||
|
|
||||||
* Fixed array typings with union types (#295)
|
* Fixed array typings with union types (#295)
|
||||||
* Add event ABIs to context data passed to templates (#302)
|
* Add event ABIs to context data passed to templates (#302)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0xproject/abi-gen",
|
"name": "@0xproject/abi-gen",
|
||||||
"version": "0.2.7",
|
"version": "0.2.9",
|
||||||
"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",
|
||||||
@@ -8,7 +8,8 @@
|
|||||||
"build:watch": "tsc -w",
|
"build:watch": "tsc -w",
|
||||||
"lint": "tslint --project . 'src/**/*.ts'",
|
"lint": "tslint --project . 'src/**/*.ts'",
|
||||||
"clean": "shx rm -rf lib scripts",
|
"clean": "shx rm -rf lib scripts",
|
||||||
"build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts"
|
"build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
|
||||||
|
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"abi-gen": "lib/index.js"
|
"abi-gen": "lib/index.js"
|
||||||
@@ -23,19 +24,20 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/0x-monorepo/packages/abi-gen/README.md",
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/abi-gen/README.md",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0xproject/utils": "^0.4.3",
|
"@0xproject/types": "^0.5.0",
|
||||||
|
"@0xproject/typescript-typings": "^0.0.3",
|
||||||
|
"@0xproject/utils": "^0.5.0",
|
||||||
"chalk": "^2.3.0",
|
"chalk": "^2.3.0",
|
||||||
"glob": "^7.1.2",
|
"glob": "^7.1.2",
|
||||||
"handlebars": "^4.0.11",
|
"handlebars": "^4.0.11",
|
||||||
"lodash": "^4.17.4",
|
"lodash": "^4.17.4",
|
||||||
"mkdirp": "^0.5.1",
|
"mkdirp": "^0.5.1",
|
||||||
"to-snake-case": "^1.0.0",
|
"to-snake-case": "^1.0.0",
|
||||||
"web3": "^0.20.0",
|
|
||||||
"yargs": "^10.0.3"
|
"yargs": "^10.0.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0xproject/monorepo-scripts": "^0.1.14",
|
"@0xproject/monorepo-scripts": "^0.1.16",
|
||||||
"@0xproject/tslint-config": "^0.4.12",
|
"@0xproject/tslint-config": "^0.4.14",
|
||||||
"@types/glob": "^5.0.33",
|
"@types/glob": "^5.0.33",
|
||||||
"@types/handlebars": "^4.0.36",
|
"@types/handlebars": "^4.0.36",
|
||||||
"@types/mkdirp": "^0.5.1",
|
"@types/mkdirp": "^0.5.1",
|
||||||
@@ -45,8 +47,7 @@
|
|||||||
"npm-run-all": "^4.1.2",
|
"npm-run-all": "^4.1.2",
|
||||||
"shx": "^0.2.2",
|
"shx": "^0.2.2",
|
||||||
"tslint": "5.8.0",
|
"tslint": "5.8.0",
|
||||||
"typescript": "2.7.1",
|
"typescript": "2.7.1"
|
||||||
"web3-typescript-typings": "^0.10.2"
|
|
||||||
},
|
},
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public"
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
import { AbiDefinition, ConstructorAbi, EventAbi, MethodAbi } from '@0xproject/types';
|
||||||
import { logUtils } from '@0xproject/utils';
|
import { logUtils } from '@0xproject/utils';
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
@@ -10,7 +11,6 @@ import * as mkdirp from 'mkdirp';
|
|||||||
import * as yargs from 'yargs';
|
import * as yargs from 'yargs';
|
||||||
|
|
||||||
import toSnakeCase = require('to-snake-case');
|
import toSnakeCase = require('to-snake-case');
|
||||||
import * as Web3 from 'web3';
|
|
||||||
|
|
||||||
import { ContextData, ContractsBackend, ParamKind } from './types';
|
import { ContextData, ContractsBackend, ParamKind } from './types';
|
||||||
import { utils } from './utils';
|
import { utils } from './utils';
|
||||||
@@ -120,12 +120,12 @@ for (const abiFileName of abiFileNames) {
|
|||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
let ctor = ABI.find((abi: Web3.AbiDefinition) => abi.type === ABI_TYPE_CONSTRUCTOR) as Web3.ConstructorAbi;
|
let ctor = ABI.find((abi: AbiDefinition) => abi.type === ABI_TYPE_CONSTRUCTOR) as ConstructorAbi;
|
||||||
if (_.isUndefined(ctor)) {
|
if (_.isUndefined(ctor)) {
|
||||||
ctor = utils.getEmptyConstructor(); // The constructor exists, but it's implicit in JSON's ABI definition
|
ctor = utils.getEmptyConstructor(); // The constructor exists, but it's implicit in JSON's ABI definition
|
||||||
}
|
}
|
||||||
|
|
||||||
const methodAbis = ABI.filter((abi: Web3.AbiDefinition) => abi.type === ABI_TYPE_METHOD) as Web3.MethodAbi[];
|
const methodAbis = ABI.filter((abi: AbiDefinition) => abi.type === ABI_TYPE_METHOD) as MethodAbi[];
|
||||||
const methodsData = _.map(methodAbis, methodAbi => {
|
const methodsData = _.map(methodAbis, methodAbi => {
|
||||||
_.map(methodAbi.inputs, (input, i: number) => {
|
_.map(methodAbi.inputs, (input, i: number) => {
|
||||||
if (_.isEmpty(input.name)) {
|
if (_.isEmpty(input.name)) {
|
||||||
@@ -142,7 +142,7 @@ for (const abiFileName of abiFileNames) {
|
|||||||
return methodData;
|
return methodData;
|
||||||
});
|
});
|
||||||
|
|
||||||
const eventAbis = ABI.filter((abi: Web3.AbiDefinition) => abi.type === ABI_TYPE_EVENT) as Web3.EventAbi[];
|
const eventAbis = ABI.filter((abi: AbiDefinition) => abi.type === ABI_TYPE_EVENT) as EventAbi[];
|
||||||
|
|
||||||
const contextData = {
|
const contextData = {
|
||||||
contractName: namedContent.name,
|
contractName: namedContent.name,
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import * as Web3 from 'web3';
|
import { EventAbi, MethodAbi } from '@0xproject/types';
|
||||||
|
|
||||||
export enum ParamKind {
|
export enum ParamKind {
|
||||||
Input = 'input',
|
Input = 'input',
|
||||||
@@ -17,7 +17,7 @@ export enum ContractsBackend {
|
|||||||
Ethers = 'ethers',
|
Ethers = 'ethers',
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Method extends Web3.MethodAbi {
|
export interface Method extends MethodAbi {
|
||||||
singleReturnValue: boolean;
|
singleReturnValue: boolean;
|
||||||
hasReturnValue: boolean;
|
hasReturnValue: boolean;
|
||||||
}
|
}
|
||||||
@@ -25,5 +25,5 @@ export interface Method extends Web3.MethodAbi {
|
|||||||
export interface ContextData {
|
export interface ContextData {
|
||||||
contractName: string;
|
contractName: string;
|
||||||
methods: Method[];
|
methods: Method[];
|
||||||
events: Web3.EventAbi[];
|
events: EventAbi[];
|
||||||
}
|
}
|
||||||
|
@@ -1,17 +1,12 @@
|
|||||||
|
import { ConstructorAbi, DataItem } from '@0xproject/types';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as Web3 from 'web3';
|
|
||||||
|
|
||||||
import { AbiType, ContractsBackend, ParamKind } from './types';
|
import { AbiType, ContractsBackend, ParamKind } from './types';
|
||||||
|
|
||||||
export const utils = {
|
export const utils = {
|
||||||
solTypeToTsType(
|
solTypeToTsType(paramKind: ParamKind, backend: ContractsBackend, solType: string, components?: DataItem[]): string {
|
||||||
paramKind: ParamKind,
|
|
||||||
backend: ContractsBackend,
|
|
||||||
solType: string,
|
|
||||||
components?: Web3.DataItem[],
|
|
||||||
): string {
|
|
||||||
const trailingArrayRegex = /\[\d*\]$/;
|
const trailingArrayRegex = /\[\d*\]$/;
|
||||||
if (solType.match(trailingArrayRegex)) {
|
if (solType.match(trailingArrayRegex)) {
|
||||||
const arrayItemSolType = solType.replace(trailingArrayRegex, '');
|
const arrayItemSolType = solType.replace(trailingArrayRegex, '');
|
||||||
@@ -89,7 +84,7 @@ export const utils = {
|
|||||||
throw new Error(`Failed to read ${filename}: ${err}`);
|
throw new Error(`Failed to read ${filename}: ${err}`);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
getEmptyConstructor(): Web3.ConstructorAbi {
|
getEmptyConstructor(): ConstructorAbi {
|
||||||
return {
|
return {
|
||||||
type: AbiType.Constructor,
|
type: AbiType.Constructor,
|
||||||
stateMutability: 'nonpayable',
|
stateMutability: 'nonpayable',
|
||||||
|
@@ -3,5 +3,5 @@
|
|||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "lib"
|
"outDir": "lib"
|
||||||
},
|
},
|
||||||
"include": ["./src/**/*", "./test/**/*", "../../node_modules/web3-typescript-typings/index.d.ts"]
|
"include": ["./src/**/*", "./test/**/*"]
|
||||||
}
|
}
|
||||||
|
@@ -4,3 +4,4 @@ yarn-error.log
|
|||||||
/scripts/
|
/scripts/
|
||||||
test/
|
test/
|
||||||
tsconfig.json
|
tsconfig.json
|
||||||
|
/lib/src/monorepo_scripts/
|
||||||
|
72
packages/assert/CHANGELOG.json
Normal file
72
packages/assert/CHANGELOG.json
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1522673609,
|
||||||
|
"version": "0.2.5",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1522658513,
|
||||||
|
"version": "0.2.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Rename `isHttpUrl` to `isWebUri`",
|
||||||
|
"pr": 412
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1520434800,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.1.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Remove isETHAddressHex checksum address check and assume address will be lowercased ",
|
||||||
|
"pr": 373
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add an optional parameter `subSchemas` to `doesConformToSchema` method",
|
||||||
|
"pr": 385
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1520089200,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.0.18",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fix publishing issue where .npmignore was not properly excluding undesired content",
|
||||||
|
"pr": 389
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1486566000,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.0.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Re-publish Assert previously published under NPM package @0xproject/0x-assert"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Added assertion isValidBaseUnitAmount which checks both that the value is a valid bigNumber and that it does not contain decimals."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1510585200,
|
||||||
|
"isPublished": true
|
||||||
|
}
|
||||||
|
]
|
@@ -1,19 +1,32 @@
|
|||||||
# CHANGELOG
|
<!--
|
||||||
|
This file is auto-generated using the monorepo-scripts package. Don't edit directly.
|
||||||
|
Edit the package's CHANGELOG.json file only.
|
||||||
|
-->
|
||||||
|
|
||||||
## v0.2.0 - _March 8, 2018_
|
CHANGELOG
|
||||||
|
|
||||||
|
## v0.2.5 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v0.2.4 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v0.2.0 - _March 7, 2018_
|
||||||
|
|
||||||
* Rename `isHttpUrl` to `isWebUri` (#412)
|
* Rename `isHttpUrl` to `isWebUri` (#412)
|
||||||
|
|
||||||
## v0.1.0 - _March 4, 2018_
|
## v0.1.0 - _March 3, 2018_
|
||||||
|
|
||||||
* Remove isETHAddressHex checksum address check and assume address will be lowercased (#373)
|
* Remove isETHAddressHex checksum address check and assume address will be lowercased (#373)
|
||||||
* Add an optional parameter `subSchemas` to `doesConformToSchema` method (#385)
|
* Add an optional parameter `subSchemas` to `doesConformToSchema` method (#385)
|
||||||
|
|
||||||
## v0.0.18 - _February 9, 2017_
|
## v0.0.18 - _February 8, 2017_
|
||||||
|
|
||||||
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
||||||
|
|
||||||
## v0.0.4 - _November 14, 2017_
|
## v0.0.4 - _November 13, 2017_
|
||||||
|
|
||||||
* Re-publish Assert previously published under NPM package @0xproject/0x-assert
|
* Re-publish Assert previously published under NPM package @0xproject/0x-assert
|
||||||
* Added assertion isValidBaseUnitAmount which checks both that the value is a valid bigNumber and that it does not contain decimals.
|
* Added assertion isValidBaseUnitAmount which checks both that the value is a valid bigNumber and that it does not contain decimals.
|
||||||
|
@@ -8,14 +8,6 @@ Standard type and schema assertions to be used across all 0x projects and packag
|
|||||||
yarn add @0xproject/assert
|
yarn add @0xproject/assert
|
||||||
```
|
```
|
||||||
|
|
||||||
If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
|
|
||||||
|
|
||||||
```
|
|
||||||
"include": [
|
|
||||||
"./node_modules/web3-typescript-typings/index.d.ts",
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
@@ -24,6 +16,14 @@ import { assert } from '@0xproject/assert';
|
|||||||
assert.isValidBaseUnitAmount('baseUnitAmount', baseUnitAmount);
|
assert.isValidBaseUnitAmount('baseUnitAmount', baseUnitAmount);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"compilerOptions": {
|
||||||
|
"typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
|
We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
|
||||||
|
@@ -1,20 +1,21 @@
|
|||||||
{
|
{
|
||||||
"name": "@0xproject/assert",
|
"name": "@0xproject/assert",
|
||||||
"version": "0.2.2",
|
"version": "0.2.5",
|
||||||
"description": "Provides a standard way of performing type and schema validation across 0x projects",
|
"description": "Provides a standard way of performing type and schema validation across 0x projects",
|
||||||
"main": "lib/src/index.js",
|
"main": "lib/src/index.js",
|
||||||
"types": "lib/src/index.d.ts",
|
"types": "lib/src/index.d.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build:watch": "tsc -w",
|
"build:watch": "tsc -w",
|
||||||
"build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
|
"build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
|
||||||
"clean": "shx rm -rf _bundles lib test_temp scripts",
|
"clean": "shx rm -rf lib test_temp scripts",
|
||||||
"lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
|
"lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
|
||||||
"run_mocha": "mocha lib/test/**/*_test.js",
|
"run_mocha": "mocha lib/test/**/*_test.js",
|
||||||
"prepublishOnly": "run-p build",
|
"prepublishOnly": "run-p build",
|
||||||
"test": "run-s clean build run_mocha",
|
"test": "run-s clean build run_mocha",
|
||||||
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
|
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
|
||||||
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
|
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
|
||||||
"test:circleci": "yarn test:coverage"
|
"test:circleci": "yarn test:coverage",
|
||||||
|
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
|
||||||
},
|
},
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -26,13 +27,12 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/0x-monorepo/packages/assert/README.md",
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/assert/README.md",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0xproject/monorepo-scripts": "^0.1.14",
|
"@0xproject/monorepo-scripts": "^0.1.16",
|
||||||
"@0xproject/tslint-config": "^0.4.12",
|
"@0xproject/tslint-config": "^0.4.14",
|
||||||
"@types/lodash": "^4.14.86",
|
"@types/lodash": "4.14.104",
|
||||||
"@types/mocha": "^2.2.42",
|
"@types/mocha": "^2.2.42",
|
||||||
"@types/valid-url": "^1.0.2",
|
"@types/valid-url": "^1.0.2",
|
||||||
"chai": "^4.0.1",
|
"chai": "^4.0.1",
|
||||||
"chai-typescript-typings": "^0.0.6",
|
|
||||||
"copyfiles": "^1.2.0",
|
"copyfiles": "^1.2.0",
|
||||||
"dirty-chai": "^2.0.1",
|
"dirty-chai": "^2.0.1",
|
||||||
"mocha": "^4.0.1",
|
"mocha": "^4.0.1",
|
||||||
@@ -43,8 +43,9 @@
|
|||||||
"typescript": "2.7.1"
|
"typescript": "2.7.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0xproject/json-schemas": "^0.7.16",
|
"@0xproject/json-schemas": "^0.7.19",
|
||||||
"@0xproject/utils": "^0.4.3",
|
"@0xproject/typescript-typings": "^0.0.3",
|
||||||
|
"@0xproject/utils": "^0.5.0",
|
||||||
"lodash": "^4.17.4",
|
"lodash": "^4.17.4",
|
||||||
"valid-url": "^1.0.9"
|
"valid-url": "^1.0.9"
|
||||||
},
|
},
|
||||||
|
2
packages/assert/src/globals.d.ts
vendored
2
packages/assert/src/globals.d.ts
vendored
@@ -1,5 +1,3 @@
|
|||||||
declare module 'dirty-chai';
|
|
||||||
|
|
||||||
declare module '*.json' {
|
declare module '*.json' {
|
||||||
const json: any;
|
const json: any;
|
||||||
/* tslint:disable */
|
/* tslint:disable */
|
||||||
|
@@ -3,10 +3,5 @@
|
|||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "lib"
|
"outDir": "lib"
|
||||||
},
|
},
|
||||||
"include": [
|
"include": ["./src/**/*", "./test/**/*"]
|
||||||
"./src/**/*",
|
|
||||||
"./test/**/*",
|
|
||||||
"../../node_modules/web3-typescript-typings/index.d.ts",
|
|
||||||
"../../node_modules/chai-typescript-typings/index.d.ts"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
@@ -3,3 +3,4 @@ yarn-error.log
|
|||||||
/scripts/
|
/scripts/
|
||||||
/src/
|
/src/
|
||||||
tsconfig.json
|
tsconfig.json
|
||||||
|
/lib/monorepo_scripts/
|
||||||
|
40
packages/base-contract/CHANGELOG.json
Normal file
40
packages/base-contract/CHANGELOG.json
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"version": "0.1.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add tests for traversing ABI tree",
|
||||||
|
"pr": 485
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Fix ABI tuples traversing",
|
||||||
|
"pr": 485
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Fix ABI arrays traversing",
|
||||||
|
"pr": 485
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1522673609
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1522658513,
|
||||||
|
"version": "0.0.6",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.0.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Initial release"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1520089200,
|
||||||
|
"isPublished": true
|
||||||
|
}
|
||||||
|
]
|
@@ -1,5 +1,20 @@
|
|||||||
# CHANGELOG
|
<!--
|
||||||
|
This file is auto-generated using the monorepo-scripts package. Don't edit directly.
|
||||||
|
Edit the package's CHANGELOG.json file only.
|
||||||
|
-->
|
||||||
|
|
||||||
## v0.0.2 - _March 4, 2018_
|
CHANGELOG
|
||||||
|
|
||||||
|
## v0.1.0 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Add tests for traversing ABI tree (#485)
|
||||||
|
* Fix ABI tuples traversing (#485)
|
||||||
|
* Fix ABI arrays traversing (#485)
|
||||||
|
|
||||||
|
## v0.0.6 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v0.0.2 - _March 3, 2018_
|
||||||
|
|
||||||
* Initial release
|
* Initial release
|
||||||
|
@@ -10,11 +10,10 @@ yarn add @0xproject/base-contract
|
|||||||
|
|
||||||
If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
|
If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
|
||||||
|
|
||||||
```
|
```json
|
||||||
"include": [
|
"compilerOptions": {
|
||||||
"./node_modules/web3-typescript-typings/index.d.ts",
|
"typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
|
||||||
"./node_modules/ethers-typescript-typings/index.d.ts"
|
}
|
||||||
]
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
0
packages/base-contract/coverage/.gitkeep
Normal file
0
packages/base-contract/coverage/.gitkeep
Normal file
@@ -1,14 +1,20 @@
|
|||||||
{
|
{
|
||||||
"name": "@0xproject/base-contract",
|
"name": "@0xproject/base-contract",
|
||||||
"version": "0.0.5",
|
"version": "0.1.0",
|
||||||
"description": "0x Base TS contract",
|
"description": "0x Base TS contract",
|
||||||
"main": "lib/index.js",
|
"main": "lib/src/index.js",
|
||||||
"types": "lib/index.d.ts",
|
"types": "lib/src/index.d.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build:watch": "tsc -w",
|
"build:watch": "tsc -w",
|
||||||
"build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
|
"build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
|
||||||
"clean": "shx rm -rf lib scripts",
|
"clean": "shx rm -rf lib scripts",
|
||||||
"lint": "tslint --project . 'src/**/*.ts'"
|
"test": "run-s clean build run_mocha",
|
||||||
|
"test:circleci": "yarn test:coverage",
|
||||||
|
"run_mocha": "mocha lib/test/**/*_test.js --bail --exit",
|
||||||
|
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
|
||||||
|
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
|
||||||
|
"lint": "tslint --project .",
|
||||||
|
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
|
||||||
},
|
},
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -20,23 +26,24 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/0x-monorepo/packages/base-contract/README.md",
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/base-contract/README.md",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0xproject/monorepo-scripts": "^0.1.14",
|
"@0xproject/monorepo-scripts": "^0.1.16",
|
||||||
"@0xproject/tslint-config": "^0.4.12",
|
"@0xproject/tslint-config": "^0.4.14",
|
||||||
"@types/lodash": "^4.14.86",
|
"@types/lodash": "4.14.104",
|
||||||
|
"chai": "^4.0.1",
|
||||||
"copyfiles": "^1.2.0",
|
"copyfiles": "^1.2.0",
|
||||||
|
"mocha": "^4.0.1",
|
||||||
"npm-run-all": "^4.1.2",
|
"npm-run-all": "^4.1.2",
|
||||||
"shx": "^0.2.2",
|
"shx": "^0.2.2",
|
||||||
"tslint": "5.8.0",
|
"tslint": "5.8.0",
|
||||||
"typescript": "2.7.1"
|
"typescript": "2.7.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0xproject/types": "^0.4.1",
|
"@0xproject/types": "^0.5.0",
|
||||||
"@0xproject/web3-wrapper": "^0.3.1",
|
"@0xproject/typescript-typings": "^0.0.3",
|
||||||
|
"@0xproject/utils": "^0.5.0",
|
||||||
|
"@0xproject/web3-wrapper": "^0.5.0",
|
||||||
"ethers-contracts": "^2.2.1",
|
"ethers-contracts": "^2.2.1",
|
||||||
"ethers-typescript-typings": "^0.0.4",
|
"lodash": "^4.17.4"
|
||||||
"lodash": "^4.17.4",
|
|
||||||
"web3": "^0.20.0",
|
|
||||||
"web3-typescript-typings": "^0.10.2"
|
|
||||||
},
|
},
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public"
|
||||||
|
@@ -1,41 +1,31 @@
|
|||||||
import { TxData, TxDataPayable } from '@0xproject/types';
|
import { ContractAbi, DataItem, TxData, TxDataPayable } from '@0xproject/types';
|
||||||
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
import * as ethersContracts from 'ethers-contracts';
|
import * as ethersContracts from 'ethers-contracts';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as Web3 from 'web3';
|
|
||||||
|
import { formatABIDataItem } from './utils';
|
||||||
|
|
||||||
export class BaseContract {
|
export class BaseContract {
|
||||||
protected _ethersInterface: ethersContracts.Interface;
|
protected _ethersInterface: ethersContracts.Interface;
|
||||||
protected _web3Wrapper: Web3Wrapper;
|
protected _web3Wrapper: Web3Wrapper;
|
||||||
public abi: Web3.ContractAbi;
|
public abi: ContractAbi;
|
||||||
public address: string;
|
public address: string;
|
||||||
protected static _transformABIData(
|
protected static _formatABIDataItemList(
|
||||||
abis: Web3.DataItem[],
|
abis: DataItem[],
|
||||||
values: any[],
|
values: any[],
|
||||||
transformation: (type: string, value: any) => any,
|
formatter: (type: string, value: any) => any,
|
||||||
): any {
|
): any {
|
||||||
return _.map(values, (value: any, i: number) =>
|
return _.map(values, (value: any, i: number) => formatABIDataItem(abis[i], value, formatter));
|
||||||
BaseContract._transformTypedData(abis[i].type, value, transformation),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
protected static _lowercaseAddress(type: string, value: string): string {
|
protected static _lowercaseAddress(type: string, value: string): string {
|
||||||
return type === 'address' ? value.toLowerCase() : value;
|
return type === 'address' ? value.toLowerCase() : value;
|
||||||
}
|
}
|
||||||
protected static _bigNumberToString(type: string, value: string): string {
|
protected static _bigNumberToString(type: string, value: any): any {
|
||||||
return _.isObject(value) && (value as any).isBigNumber ? value.toString() : value;
|
return _.isObject(value) && value.isBigNumber ? value.toString() : value;
|
||||||
}
|
|
||||||
private static _transformTypedData(
|
|
||||||
type: string,
|
|
||||||
values: any,
|
|
||||||
transformation: (type: string, value: any) => any,
|
|
||||||
): any {
|
|
||||||
const trailingArrayRegex = /\[\d*\]$/;
|
|
||||||
if (type.match(trailingArrayRegex)) {
|
|
||||||
const arrayItemType = type.replace(trailingArrayRegex, '');
|
|
||||||
return _.map(values, value => this._transformTypedData(arrayItemType, value, transformation));
|
|
||||||
} else {
|
|
||||||
return transformation(type, values);
|
|
||||||
}
|
}
|
||||||
|
protected static _bnToBigNumber(type: string, value: any): any {
|
||||||
|
return _.isObject(value) && value._bn ? new BigNumber(value.toString()) : value;
|
||||||
}
|
}
|
||||||
protected async _applyDefaultsToTxDataAsync<T extends Partial<TxData | TxDataPayable>>(
|
protected async _applyDefaultsToTxDataAsync<T extends Partial<TxData | TxDataPayable>>(
|
||||||
txData: T,
|
txData: T,
|
||||||
@@ -46,20 +36,20 @@ export class BaseContract {
|
|||||||
// 2. Global config passed in at library instantiation
|
// 2. Global config passed in at library instantiation
|
||||||
// 3. Gas estimate calculation + safety margin
|
// 3. Gas estimate calculation + safety margin
|
||||||
const removeUndefinedProperties = _.pickBy;
|
const removeUndefinedProperties = _.pickBy;
|
||||||
const txDataWithDefaults = {
|
const txDataWithDefaults = ({
|
||||||
to: this.address,
|
to: this.address,
|
||||||
...removeUndefinedProperties(this._web3Wrapper.getContractDefaults()),
|
...removeUndefinedProperties(this._web3Wrapper.getContractDefaults()),
|
||||||
...removeUndefinedProperties(txData as any),
|
...removeUndefinedProperties(txData as any),
|
||||||
// HACK: TS can't prove that T is spreadable.
|
// HACK: TS can't prove that T is spreadable.
|
||||||
// Awaiting https://github.com/Microsoft/TypeScript/pull/13288 to be merged
|
// Awaiting https://github.com/Microsoft/TypeScript/pull/13288 to be merged
|
||||||
};
|
} as any) as TxData;
|
||||||
if (_.isUndefined(txDataWithDefaults.gas) && !_.isUndefined(estimateGasAsync)) {
|
if (_.isUndefined(txDataWithDefaults.gas) && !_.isUndefined(estimateGasAsync)) {
|
||||||
const estimatedGas = await estimateGasAsync(txData);
|
const estimatedGas = await estimateGasAsync(txData);
|
||||||
txDataWithDefaults.gas = estimatedGas;
|
txDataWithDefaults.gas = estimatedGas;
|
||||||
}
|
}
|
||||||
return txDataWithDefaults;
|
return txDataWithDefaults;
|
||||||
}
|
}
|
||||||
constructor(web3Wrapper: Web3Wrapper, abi: Web3.ContractAbi, address: string) {
|
constructor(web3Wrapper: Web3Wrapper, abi: ContractAbi, address: string) {
|
||||||
this._web3Wrapper = web3Wrapper;
|
this._web3Wrapper = web3Wrapper;
|
||||||
this.abi = abi;
|
this.abi = abi;
|
||||||
this.address = address;
|
this.address = address;
|
||||||
|
25
packages/base-contract/src/utils.ts
Normal file
25
packages/base-contract/src/utils.ts
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import { DataItem } from '@0xproject/types';
|
||||||
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
|
// tslint:disable-next-line:completed-docs
|
||||||
|
export function formatABIDataItem(abi: DataItem, value: any, formatter: (type: string, value: any) => any): any {
|
||||||
|
const trailingArrayRegex = /\[\d*\]$/;
|
||||||
|
if (abi.type.match(trailingArrayRegex)) {
|
||||||
|
const arrayItemType = abi.type.replace(trailingArrayRegex, '');
|
||||||
|
return _.map(value, val => {
|
||||||
|
const arrayItemAbi = {
|
||||||
|
...abi,
|
||||||
|
type: arrayItemType,
|
||||||
|
};
|
||||||
|
return formatABIDataItem(arrayItemAbi, val, formatter);
|
||||||
|
});
|
||||||
|
} else if (abi.type === 'tuple') {
|
||||||
|
const formattedTuple: { [componentName: string]: DataItem } = {};
|
||||||
|
_.forEach(abi.components, componentABI => {
|
||||||
|
formattedTuple[componentABI.name] = formatABIDataItem(componentABI, value[componentABI.name], formatter);
|
||||||
|
});
|
||||||
|
return formattedTuple;
|
||||||
|
} else {
|
||||||
|
return formatter(abi.type, value);
|
||||||
|
}
|
||||||
|
}
|
108
packages/base-contract/test/utils_test.ts
Normal file
108
packages/base-contract/test/utils_test.ts
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
import { BigNumber } from '@0xproject/utils';
|
||||||
|
import * as chai from 'chai';
|
||||||
|
import 'mocha';
|
||||||
|
|
||||||
|
import { formatABIDataItem } from '../src/utils';
|
||||||
|
|
||||||
|
const { expect } = chai;
|
||||||
|
|
||||||
|
describe('Utils tests', () => {
|
||||||
|
describe('#formatABIDataItem', () => {
|
||||||
|
it('correctly handles arrays', () => {
|
||||||
|
const calls: Array<{ type: string; value: any }> = [];
|
||||||
|
const abi = {
|
||||||
|
name: 'values',
|
||||||
|
type: 'uint256[]',
|
||||||
|
};
|
||||||
|
const val = [1, 2, 3];
|
||||||
|
const formatted = formatABIDataItem(abi, val, (type: string, value: any) => {
|
||||||
|
calls.push({ type, value });
|
||||||
|
return value; // no-op
|
||||||
|
});
|
||||||
|
expect(formatted).to.be.deep.equal(val);
|
||||||
|
expect(calls).to.be.deep.equal([
|
||||||
|
{ type: 'uint256', value: 1 },
|
||||||
|
{ type: 'uint256', value: 2 },
|
||||||
|
{ type: 'uint256', value: 3 },
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
it('correctly handles tuples', () => {
|
||||||
|
const calls: Array<{ type: string; value: any }> = [];
|
||||||
|
const abi = {
|
||||||
|
components: [
|
||||||
|
{
|
||||||
|
name: 'to',
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'amount',
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
name: 'data',
|
||||||
|
type: 'tuple',
|
||||||
|
};
|
||||||
|
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
||||||
|
const val = { to: ZERO_ADDRESS, amount: new BigNumber(1) };
|
||||||
|
const formatted = formatABIDataItem(abi, val, (type: string, value: any) => {
|
||||||
|
calls.push({ type, value });
|
||||||
|
return value; // no-op
|
||||||
|
});
|
||||||
|
expect(formatted).to.be.deep.equal(val);
|
||||||
|
expect(calls).to.be.deep.equal([
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
value: val.to,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
value: val.amount,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
it('correctly handles nested arrays of tuples', () => {
|
||||||
|
const calls: Array<{ type: string; value: any }> = [];
|
||||||
|
const abi = {
|
||||||
|
components: [
|
||||||
|
{
|
||||||
|
name: 'to',
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'amount',
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
name: 'data',
|
||||||
|
type: 'tuple[2][]',
|
||||||
|
};
|
||||||
|
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
||||||
|
const val = [
|
||||||
|
[{ to: ZERO_ADDRESS, amount: new BigNumber(1) }, { to: ZERO_ADDRESS, amount: new BigNumber(2) }],
|
||||||
|
];
|
||||||
|
const formatted = formatABIDataItem(abi, val, (type: string, value: any) => {
|
||||||
|
calls.push({ type, value });
|
||||||
|
return value; // no-op
|
||||||
|
});
|
||||||
|
expect(formatted).to.be.deep.equal(val);
|
||||||
|
expect(calls).to.be.deep.equal([
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
value: val[0][0].to,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
value: val[0][0].amount,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
value: val[0][1].to,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
value: val[0][1].amount,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@@ -3,9 +3,5 @@
|
|||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "lib"
|
"outDir": "lib"
|
||||||
},
|
},
|
||||||
"include": [
|
"include": ["src/**/*", "test/**/*"]
|
||||||
"./src/**/*",
|
|
||||||
"../../node_modules/web3-typescript-typings/index.d.ts",
|
|
||||||
"../../node_modules/ethers-typescript-typings/index.d.ts"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
@@ -1,3 +0,0 @@
|
|||||||
.*
|
|
||||||
yarn-error.log
|
|
||||||
/scripts/
|
|
@@ -1,3 +0,0 @@
|
|||||||
# CHANGELOG
|
|
||||||
|
|
||||||
## v0.x.x - _TBD, 2018_
|
|
@@ -1,3 +0,0 @@
|
|||||||
# CHANGELOG
|
|
||||||
|
|
||||||
## v0.x.x - _TBD, 2018_
|
|
@@ -1,43 +0,0 @@
|
|||||||
## chai-typescript-typings
|
|
||||||
|
|
||||||
Fork of type definitions for chai that includes changes made by dirty-chai
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yarn add -D chai-typescript-typings
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
Add the following line within an `include` section of your `tsconfig.json`
|
|
||||||
|
|
||||||
```json
|
|
||||||
"./node_modules/chai-typescript-typings/index.d.ts"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
|
|
||||||
|
|
||||||
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
|
|
||||||
|
|
||||||
### Install Dependencies
|
|
||||||
|
|
||||||
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yarn config set workspaces-experimental true
|
|
||||||
```
|
|
||||||
|
|
||||||
Then install dependencies
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yarn install
|
|
||||||
```
|
|
||||||
|
|
||||||
### Lint
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yarn lint
|
|
||||||
```
|
|
@@ -1,6 +0,0 @@
|
|||||||
declare module '*.json' {
|
|
||||||
const json: any;
|
|
||||||
/* tslint:disable */
|
|
||||||
export default json;
|
|
||||||
/* tslint:enable */
|
|
||||||
}
|
|
@@ -1,28 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "chai-typescript-typings",
|
|
||||||
"version": "0.0.6",
|
|
||||||
"description": "Typescript type definitions for chai",
|
|
||||||
"main": "index.d.ts",
|
|
||||||
"types": "index.d.ts",
|
|
||||||
"scripts": {
|
|
||||||
"build": "tsc && copyfiles -u 1 './lib/**/*' ./scripts",
|
|
||||||
"clean": "shx rm -rf scripts"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/0xProject/0x-monorepo.git"
|
|
||||||
},
|
|
||||||
"license": "Apache-2.0",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/0xProject/0x-monorepo/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/0xProject/0x-monorepo/packages/chai-typescript-typings#readme",
|
|
||||||
"devDependencies": {
|
|
||||||
"@0xproject/monorepo-scripts": "^0.1.14",
|
|
||||||
"copyfiles": "^1.2.0",
|
|
||||||
"shx": "^0.2.2"
|
|
||||||
},
|
|
||||||
"publishConfig": {
|
|
||||||
"access": "public"
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "../../tsconfig",
|
|
||||||
"compilerOptions": {
|
|
||||||
"outDir": "lib"
|
|
||||||
},
|
|
||||||
"include": ["./monorepo_scripts/**/*"]
|
|
||||||
}
|
|
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": ["tslint-config-0xproject"]
|
|
||||||
}
|
|
@@ -5,3 +5,4 @@ yarn-error.log
|
|||||||
/generated_docs/
|
/generated_docs/
|
||||||
test/
|
test/
|
||||||
tsconfig.json
|
tsconfig.json
|
||||||
|
/lib/src/monorepo_scripts/
|
||||||
|
140
packages/connect/CHANGELOG.json
Normal file
140
packages/connect/CHANGELOG.json
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1522673609,
|
||||||
|
"version": "0.6.8",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1522658513,
|
||||||
|
"version": "0.6.7",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.6.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Consolidate `Order`, `SignedOrder`, and `ECSignature` into the `@0xproject/types` package",
|
||||||
|
"pr": 456
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1521298800,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.6.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fix JSON parse empty response",
|
||||||
|
"pr": 407
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1518706800,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.6.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add pagination options to HttpClient methods",
|
||||||
|
"pr": 393
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add heartbeat configuration to WebSocketOrderbookChannel constructor",
|
||||||
|
"pr": 406
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1518706800,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.5.7",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fix publishing issue where .npmignore was not properly excluding undesired content",
|
||||||
|
"pr": 389
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1518102000,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.5.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Sanitize api endpoint url and remove trailing slashes",
|
||||||
|
"pr": 318
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Improve error message text in HttpClient",
|
||||||
|
"pr": 318
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Stop appending '/v0' to api endpoint url in HttpClient",
|
||||||
|
"pr": 318
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1516114800,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.4.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Prevent getFeesAsync method on HttpClient from mutating input",
|
||||||
|
"pr": 296
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1515596400,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.3.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Expose WebSocketOrderbookChannel and associated types to public interface",
|
||||||
|
"pr": 251
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Remove tokenA and tokenB fields from OrdersRequest",
|
||||||
|
"pr": 256
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1512658800,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add SignedOrder and TokenTradeInfo to the public interface"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add ECSignature and Order to the public interface"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Remove dependency on 0x.js"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1511881200,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.1.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Provide a HttpClient class for interacting with standard relayer api compliant HTTP urls"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1511276400,
|
||||||
|
"isPublished": true
|
||||||
|
}
|
||||||
|
]
|
@@ -1,43 +1,56 @@
|
|||||||
# CHANGELOG
|
<!--
|
||||||
|
This file is auto-generated using the monorepo-scripts package. Don't edit directly.
|
||||||
|
Edit the package's CHANGELOG.json file only.
|
||||||
|
-->
|
||||||
|
|
||||||
## v0.6.4 - _March 18, 2018_
|
CHANGELOG
|
||||||
|
|
||||||
|
## v0.6.8 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v0.6.7 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v0.6.4 - _March 17, 2018_
|
||||||
|
|
||||||
* Consolidate `Order`, `SignedOrder`, and `ECSignature` into the `@0xproject/types` package (#456)
|
* Consolidate `Order`, `SignedOrder`, and `ECSignature` into the `@0xproject/types` package (#456)
|
||||||
|
|
||||||
## v0.6.2 - _February 16, 2018_
|
## v0.6.2 - _February 15, 2018_
|
||||||
|
|
||||||
* Fix JSON parse empty response (#407)
|
* Fix JSON parse empty response (#407)
|
||||||
|
|
||||||
## v0.6.0 - _February 16, 2018_
|
## v0.6.0 - _February 15, 2018_
|
||||||
|
|
||||||
* Add pagination options to HttpClient methods (#393)
|
* Add pagination options to HttpClient methods (#393)
|
||||||
* Add heartbeat configuration to WebSocketOrderbookChannel constructor (#406)
|
* Add heartbeat configuration to WebSocketOrderbookChannel constructor (#406)
|
||||||
|
|
||||||
## v0.5.7 - _February 9, 2018_
|
## v0.5.7 - _February 8, 2018_
|
||||||
|
|
||||||
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
||||||
|
|
||||||
## v0.5.0 - _January 17, 2018_
|
## v0.5.0 - _January 16, 2018_
|
||||||
|
|
||||||
* Sanitize api endpoint url and remove trailing slashes (#318)
|
* Sanitize api endpoint url and remove trailing slashes (#318)
|
||||||
* Improve error message text in HttpClient (#318)
|
* Improve error message text in HttpClient (#318)
|
||||||
* Stop appending '/v0' to api endpoint url in HttpClient (#318)
|
* Stop appending '/v0' to api endpoint url in HttpClient (#318)
|
||||||
|
|
||||||
## v0.4.0 - _January 11, 2018_
|
## v0.4.0 - _January 10, 2018_
|
||||||
|
|
||||||
* Prevent getFeesAsync method on HttpClient from mutating input (#296)
|
* Prevent getFeesAsync method on HttpClient from mutating input (#296)
|
||||||
|
|
||||||
## v0.3.0 - _December 8, 2017_
|
## v0.3.0 - _December 7, 2017_
|
||||||
|
|
||||||
* 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)
|
* Remove tokenA and tokenB fields from OrdersRequest (#256)
|
||||||
|
|
||||||
## v0.2.0 - _November 29, 2017_
|
## v0.2.0 - _November 28, 2017_
|
||||||
|
|
||||||
* Add SignedOrder and TokenTradeInfo to the public interface
|
* Add SignedOrder and TokenTradeInfo to the public interface
|
||||||
* Add ECSignature and Order to the public interface
|
* Add ECSignature and Order to the public interface
|
||||||
* Remove dependency on 0x.js
|
* Remove dependency on 0x.js
|
||||||
|
|
||||||
## v0.1.0 - _November 22, 2017_
|
## v0.1.0 - _November 21, 2017_
|
||||||
|
|
||||||
* Provide a HttpClient class for interacting with standard relayer api compliant HTTP urls
|
* Provide a HttpClient class for interacting with standard relayer api compliant HTTP urls
|
||||||
|
@@ -10,10 +10,10 @@ yarn add @0xproject/connect
|
|||||||
|
|
||||||
If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
|
If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
|
||||||
|
|
||||||
```
|
```json
|
||||||
"include": [
|
"compilerOptions": {
|
||||||
"./node_modules/web3-typescript-typings/index.d.ts",
|
"typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
|
||||||
]
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0xproject/connect",
|
"name": "@0xproject/connect",
|
||||||
"version": "0.6.5",
|
"version": "0.6.8",
|
||||||
"description": "A javascript library for interacting with the standard relayer api",
|
"description": "A javascript library for interacting with the standard relayer api",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"connect",
|
"connect",
|
||||||
@@ -14,26 +14,25 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"build:watch": "tsc -w",
|
"build:watch": "tsc -w",
|
||||||
"build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
|
"build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
|
||||||
"clean": "shx rm -rf _bundles lib test_temp scripts",
|
"clean": "shx rm -rf lib test_temp scripts",
|
||||||
"docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
|
|
||||||
"upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json",
|
|
||||||
"copy_test_fixtures": "copyfiles -u 2 './test/fixtures/**/*.json' ./lib/test/fixtures",
|
"copy_test_fixtures": "copyfiles -u 2 './test/fixtures/**/*.json' ./lib/test/fixtures",
|
||||||
"lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
|
"lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
|
||||||
"run_mocha": "mocha lib/test/**/*_test.js",
|
"run_mocha": "mocha lib/test/**/*_test.js",
|
||||||
"test": "run-s clean build copy_test_fixtures run_mocha",
|
"test": "run-s clean build copy_test_fixtures run_mocha",
|
||||||
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
|
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
|
||||||
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
|
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
|
||||||
"test:circleci": "yarn test:coverage"
|
"test:circleci": "yarn test:coverage",
|
||||||
|
"manual:postpublish": "yarn build; node ./scripts/postpublish.js",
|
||||||
|
"docs:stage": "yarn build && node ./scripts/stage_docs.js",
|
||||||
|
"docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
|
||||||
|
"upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"postpublish": {
|
"postpublish": {
|
||||||
"assets": [
|
"assets": [],
|
||||||
"packages/connect/_bundles/index.js",
|
|
||||||
"packages/connect/_bundles/index.min.js"
|
|
||||||
],
|
|
||||||
"docPublishConfigs": {
|
"docPublishConfigs": {
|
||||||
"s3BucketPath": "s3://connect-docs-jsons/",
|
"s3BucketPath": "s3://doc-jsons/connect/",
|
||||||
"s3StagingBucketPath": "s3://staging-connect-docs-jsons/"
|
"s3StagingBucketPath": "s3://staging-doc-jsons/connect/"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -51,28 +50,27 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/0x-monorepo/packages/connect/README.md",
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/connect/README.md",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0xproject/assert": "^0.2.2",
|
"@0xproject/assert": "^0.2.5",
|
||||||
"@0xproject/json-schemas": "^0.7.16",
|
"@0xproject/json-schemas": "^0.7.19",
|
||||||
"@0xproject/types": "^0.4.1",
|
"@0xproject/types": "^0.5.0",
|
||||||
"@0xproject/utils": "^0.4.3",
|
"@0xproject/typescript-typings": "^0.0.3",
|
||||||
|
"@0xproject/utils": "^0.5.0",
|
||||||
"isomorphic-fetch": "^2.2.1",
|
"isomorphic-fetch": "^2.2.1",
|
||||||
"lodash": "^4.17.4",
|
"lodash": "^4.17.4",
|
||||||
"query-string": "^5.0.1",
|
"query-string": "^5.0.1",
|
||||||
"websocket": "^1.0.25"
|
"websocket": "^1.0.25"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0xproject/monorepo-scripts": "^0.1.14",
|
"@0xproject/monorepo-scripts": "^0.1.16",
|
||||||
"@0xproject/tslint-config": "^0.4.12",
|
"@0xproject/tslint-config": "^0.4.14",
|
||||||
"@types/fetch-mock": "^5.12.1",
|
"@types/fetch-mock": "^5.12.1",
|
||||||
"@types/lodash": "^4.14.86",
|
"@types/lodash": "4.14.104",
|
||||||
"@types/mocha": "^2.2.42",
|
"@types/mocha": "^2.2.42",
|
||||||
"@types/query-string": "^5.0.1",
|
"@types/query-string": "^5.0.1",
|
||||||
"@types/websocket": "^0.0.34",
|
"@types/websocket": "^0.0.34",
|
||||||
"async-child-process": "^1.1.1",
|
"async-child-process": "^1.1.1",
|
||||||
"chai": "^4.0.1",
|
"chai": "^4.0.1",
|
||||||
"chai-as-promised": "^7.1.0",
|
"chai-as-promised": "^7.1.0",
|
||||||
"chai-as-promised-typescript-typings": "^0.0.12",
|
|
||||||
"chai-typescript-typings": "^0.0.6",
|
|
||||||
"copyfiles": "^1.2.0",
|
"copyfiles": "^1.2.0",
|
||||||
"dirty-chai": "^2.0.1",
|
"dirty-chai": "^2.0.1",
|
||||||
"fetch-mock": "^5.13.1",
|
"fetch-mock": "^5.13.1",
|
||||||
@@ -82,8 +80,7 @@
|
|||||||
"shx": "^0.2.2",
|
"shx": "^0.2.2",
|
||||||
"tslint": "5.8.0",
|
"tslint": "5.8.0",
|
||||||
"typedoc": "~0.8.0",
|
"typedoc": "~0.8.0",
|
||||||
"typescript": "2.7.1",
|
"typescript": "2.7.1"
|
||||||
"web3-typescript-typings": "^0.10.2"
|
|
||||||
},
|
},
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public"
|
||||||
|
1
packages/connect/src/globals.d.ts
vendored
1
packages/connect/src/globals.d.ts
vendored
@@ -1,5 +1,4 @@
|
|||||||
declare module 'async-child-process';
|
declare module 'async-child-process';
|
||||||
declare module 'dirty-chai';
|
|
||||||
|
|
||||||
declare module '*.json' {
|
declare module '*.json' {
|
||||||
const value: any;
|
const value: any;
|
||||||
|
@@ -3,11 +3,5 @@
|
|||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "lib"
|
"outDir": "lib"
|
||||||
},
|
},
|
||||||
"include": [
|
"include": ["./src/**/*", "./test/**/*"]
|
||||||
"./src/**/*",
|
|
||||||
"./test/**/*",
|
|
||||||
"../../node_modules/web3-typescript-typings/index.d.ts",
|
|
||||||
"../../node_modules/chai-as-promised-typescript-typings/index.d.ts",
|
|
||||||
"../../node_modules/chai-typescript-typings/index.d.ts"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
@@ -5,12 +5,11 @@
|
|||||||
// tslint:disable:no-consecutive-blank-lines
|
// tslint:disable:no-consecutive-blank-lines
|
||||||
// tslint:disable-next-line:no-unused-variable
|
// tslint:disable-next-line:no-unused-variable
|
||||||
import { BaseContract } from '@0xproject/base-contract';
|
import { BaseContract } from '@0xproject/base-contract';
|
||||||
import { TxData, TxDataPayable } from '@0xproject/types';
|
import { BlockParam, BlockParamLiteral, CallData, ContractAbi, DataItem, MethodAbi, TxData, TxDataPayable } from '@0xproject/types';
|
||||||
import { BigNumber, classUtils, promisify } from '@0xproject/utils';
|
import { BigNumber, classUtils, promisify } from '@0xproject/utils';
|
||||||
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
import * as ethersContracts from 'ethers-contracts';
|
import * as ethersContracts from 'ethers-contracts';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as Web3 from 'web3';
|
|
||||||
|
|
||||||
{{#if events}}
|
{{#if events}}
|
||||||
export type {{contractName}}ContractEventArgs =
|
export type {{contractName}}ContractEventArgs =
|
||||||
@@ -40,7 +39,7 @@ export class {{contractName}}Contract extends BaseContract {
|
|||||||
{{> tx contractName=../contractName}}
|
{{> tx contractName=../contractName}}
|
||||||
{{/this.constant}}
|
{{/this.constant}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
constructor(web3Wrapper: Web3Wrapper, abi: Web3.ContractAbi, address: string) {
|
constructor(web3Wrapper: Web3Wrapper, abi: ContractAbi, address: string) {
|
||||||
super(web3Wrapper, abi, address);
|
super(web3Wrapper, abi, address);
|
||||||
classUtils.bindAll(this, ['_ethersInterface', 'address', 'abi', '_web3Wrapper']);
|
classUtils.bindAll(this, ['_ethersInterface', 'address', 'abi', '_web3Wrapper']);
|
||||||
}
|
}
|
||||||
|
@@ -1,30 +1,26 @@
|
|||||||
{{#hasReturnValue}}
|
{{#hasReturnValue}}
|
||||||
async callAsync(
|
async callAsync(
|
||||||
{{> typed_params inputs=inputs}}
|
{{> typed_params inputs=inputs}}
|
||||||
{{#this.payable}}
|
callData: Partial<CallData> = {},
|
||||||
txData: TxDataPayable = {},
|
defaultBlock?: BlockParam,
|
||||||
{{/this.payable}}
|
|
||||||
{{^this.payable}}
|
|
||||||
txData: TxData = {},
|
|
||||||
{{/this.payable}}
|
|
||||||
defaultBlock?: Web3.BlockParam,
|
|
||||||
): Promise<{{> return_type outputs=outputs}}> {
|
): Promise<{{> return_type outputs=outputs}}> {
|
||||||
const self = this as {{contractName}}Contract;
|
const self = this as any as {{contractName}}Contract;
|
||||||
const inputAbi = _.find(this.abi, {name: '{{this.name}}'}).inputs;
|
const inputAbi = (_.find(self.abi, {name: '{{this.name}}'}) as MethodAbi).inputs;
|
||||||
[{{> params inputs=inputs}}] = BaseContract._transformABIData(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(this));
|
[{{> params inputs=inputs}}] = BaseContract._formatABIDataItemList(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(self));
|
||||||
const encodedData = self._ethersInterface.functions.{{this.name}}(
|
const encodedData = self._ethersInterface.functions.{{this.name}}(
|
||||||
{{> params inputs=inputs}}
|
{{> params inputs=inputs}}
|
||||||
).data;
|
).data;
|
||||||
const callData = await self._applyDefaultsToTxDataAsync(
|
const callDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
||||||
{
|
{
|
||||||
data: encodedData,
|
data: encodedData,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
const rawCallResult = await self._web3Wrapper.callAsync(callData, defaultBlock);
|
const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock);
|
||||||
const outputAbi = _.find(this.abi, {name: '{{this.name}}'}).outputs as Web3.DataItem[];
|
const outputAbi = (_.find(self.abi, {name: '{{this.name}}'}) as MethodAbi).outputs;
|
||||||
const outputParamsTypes = _.map(outputAbi, 'type');
|
const outputParamsTypes = _.map(outputAbi, 'type');
|
||||||
let resultArray = ethersContracts.Interface.decodeParams(outputParamsTypes, rawCallResult) as any;
|
let resultArray = ethersContracts.Interface.decodeParams(outputParamsTypes, rawCallResult) as any;
|
||||||
resultArray = BaseContract._transformABIData(outputAbi, resultArray, BaseContract._lowercaseAddress.bind(this));
|
resultArray = BaseContract._formatABIDataItemList(outputAbi, resultArray, BaseContract._lowercaseAddress.bind(this));
|
||||||
|
resultArray = BaseContract._formatABIDataItemList(outputAbi, resultArray, BaseContract._bnToBigNumber.bind(this));
|
||||||
return resultArray{{#singleReturnValue}}[0]{{/singleReturnValue}};
|
return resultArray{{#singleReturnValue}}[0]{{/singleReturnValue}};
|
||||||
},
|
},
|
||||||
{{/hasReturnValue}}
|
{{/hasReturnValue}}
|
||||||
|
@@ -2,16 +2,16 @@ public {{this.name}} = {
|
|||||||
async sendTransactionAsync(
|
async sendTransactionAsync(
|
||||||
{{> typed_params inputs=inputs}}
|
{{> typed_params inputs=inputs}}
|
||||||
{{#this.payable}}
|
{{#this.payable}}
|
||||||
txData: TxDataPayable = {},
|
txData: Partial<TxDataPayable> = {},
|
||||||
{{/this.payable}}
|
{{/this.payable}}
|
||||||
{{^this.payable}}
|
{{^this.payable}}
|
||||||
txData: TxData = {},
|
txData: Partial<TxData> = {},
|
||||||
{{/this.payable}}
|
{{/this.payable}}
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
const self = this as {{contractName}}Contract;
|
const self = this as any as {{contractName}}Contract;
|
||||||
const inputAbi = _.find(this.abi, {name: '{{this.name}}'}).inputs;
|
const inputAbi = (_.find(self.abi, {name: '{{this.name}}'}) as MethodAbi).inputs;
|
||||||
[{{> params inputs=inputs}}] = BaseContract._transformABIData(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(this));
|
[{{> params inputs=inputs}}] = BaseContract._formatABIDataItemList(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(self));
|
||||||
const encodedData = this._ethersInterface.functions.{{this.name}}(
|
const encodedData = self._ethersInterface.functions.{{this.name}}(
|
||||||
{{> params inputs=inputs}}
|
{{> params inputs=inputs}}
|
||||||
).data
|
).data
|
||||||
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
||||||
@@ -24,17 +24,17 @@ public {{this.name}} = {
|
|||||||
{{> params inputs=inputs}}
|
{{> params inputs=inputs}}
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
const txHash = await this._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
const txHash = await self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
||||||
return txHash;
|
return txHash;
|
||||||
},
|
},
|
||||||
async estimateGasAsync(
|
async estimateGasAsync(
|
||||||
{{> typed_params inputs=inputs}}
|
{{> typed_params inputs=inputs}}
|
||||||
txData: TxData = {},
|
txData: Partial<TxData> = {},
|
||||||
): Promise<number> {
|
): Promise<number> {
|
||||||
const self = this as {{contractName}}Contract;
|
const self = this as any as {{contractName}}Contract;
|
||||||
const inputAbi = _.find(this.abi, {name: '{{this.name}}'}).inputs;
|
const inputAbi = (_.find(self.abi, {name: '{{this.name}}'}) as MethodAbi).inputs;
|
||||||
[{{> params inputs=inputs}}] = BaseContract._transformABIData(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(this));
|
[{{> params inputs=inputs}}] = BaseContract._formatABIDataItemList(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(this));
|
||||||
const encodedData = this._ethersInterface.functions.{{this.name}}(
|
const encodedData = self._ethersInterface.functions.{{this.name}}(
|
||||||
{{> params inputs=inputs}}
|
{{> params inputs=inputs}}
|
||||||
).data
|
).data
|
||||||
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
||||||
@@ -43,17 +43,16 @@ public {{this.name}} = {
|
|||||||
data: encodedData,
|
data: encodedData,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
const gas = await this._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
const gas = await self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
||||||
return gas;
|
return gas;
|
||||||
},
|
},
|
||||||
getABIEncodedTransactionData(
|
getABIEncodedTransactionData(
|
||||||
{{> typed_params inputs=inputs}}
|
{{> typed_params inputs=inputs}}
|
||||||
txData: TxData = {},
|
|
||||||
): string {
|
): string {
|
||||||
const self = this as {{contractName}}Contract;
|
const self = this as any as {{contractName}}Contract;
|
||||||
const inputAbi = _.find(this.abi, {name: '{{this.name}}'}).inputs;
|
const inputAbi = (_.find(self.abi, {name: '{{this.name}}'}) as MethodAbi).inputs;
|
||||||
[{{> params inputs=inputs}}] = BaseContract._transformABIData(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(this));
|
[{{> params inputs=inputs}}] = BaseContract._formatABIDataItemList(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(self));
|
||||||
const abiEncodedTransactionData = this._ethersInterface.functions.{{this.name}}(
|
const abiEncodedTransactionData = self._ethersInterface.functions.{{this.name}}(
|
||||||
{{> params inputs=inputs}}
|
{{> params inputs=inputs}}
|
||||||
).data
|
).data
|
||||||
return abiEncodedTransactionData;
|
return abiEncodedTransactionData;
|
||||||
|
29
packages/contracts/globals.d.ts
vendored
29
packages/contracts/globals.d.ts
vendored
@@ -1,35 +1,6 @@
|
|||||||
declare module 'chai-bignumber';
|
|
||||||
declare module 'dirty-chai';
|
|
||||||
|
|
||||||
// HACK: In order to merge the bignumber declaration added by chai-bignumber to the chai Assertion
|
|
||||||
// interface we must use `namespace` as the Chai definitelyTyped definition does. Since we otherwise
|
|
||||||
// disallow `namespace`, we disable tslint for the following.
|
|
||||||
/* tslint:disable */
|
|
||||||
declare namespace Chai {
|
|
||||||
interface Assertion {
|
|
||||||
bignumber: Assertion;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* tslint:enable */
|
|
||||||
|
|
||||||
declare module '*.json' {
|
declare module '*.json' {
|
||||||
const json: any;
|
const json: any;
|
||||||
/* tslint:disable */
|
/* tslint:disable */
|
||||||
export default json;
|
export default json;
|
||||||
/* tslint:enable */
|
/* tslint:enable */
|
||||||
}
|
}
|
||||||
|
|
||||||
declare module 'solc' {
|
|
||||||
export function compile(sources: any, optimizerEnabled: number, findImports: (importPath: string) => any): any;
|
|
||||||
export function setupMethods(solcBin: any): any;
|
|
||||||
}
|
|
||||||
|
|
||||||
declare module 'web3-eth-abi' {
|
|
||||||
export function encodeParameters(typesArray: string[], parameters: any[]): string;
|
|
||||||
}
|
|
||||||
|
|
||||||
declare module 'ethereumjs-abi' {
|
|
||||||
const soliditySHA3: (argTypes: string[], args: any[]) => Buffer;
|
|
||||||
const soliditySHA256: (argTypes: string[], args: any[]) => Buffer;
|
|
||||||
const methodID: (name: string, types: string[]) => Buffer;
|
|
||||||
}
|
|
||||||
|
19
packages/contracts/globalsAugment.d.ts
vendored
19
packages/contracts/globalsAugment.d.ts
vendored
@@ -1,19 +0,0 @@
|
|||||||
import { BigNumber } from '@0xproject/utils';
|
|
||||||
|
|
||||||
// HACK: This module overrides the Chai namespace so that we can use BigNumber types inside.
|
|
||||||
// Source: https://github.com/Microsoft/TypeScript/issues/7352#issuecomment-191547232
|
|
||||||
declare global {
|
|
||||||
// HACK: In order to merge the bignumber declaration added by chai-bignumber to the chai Assertion
|
|
||||||
// interface we must use `namespace` as the Chai definitelyTyped definition does. Since we otherwise
|
|
||||||
// disallow `namespace`, we disable tslint for the following.
|
|
||||||
/* tslint:disable */
|
|
||||||
namespace Chai {
|
|
||||||
interface NumberComparer {
|
|
||||||
(value: number | BigNumber, message?: string): Assertion;
|
|
||||||
}
|
|
||||||
interface NumericComparison {
|
|
||||||
greaterThan: NumberComparer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* tslint:enable */
|
|
||||||
}
|
|
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"name": "contracts",
|
"name": "contracts",
|
||||||
"version": "2.1.17",
|
"version": "2.1.21",
|
||||||
"description": "Smart contract components of 0x protocol",
|
"description": "Smart contract components of 0x protocol",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"directories": {
|
"directories": {
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
"compile:comment": "Yarn workspaces do not link binaries correctly so we need to reference them directly https://github.com/yarnpkg/yarn/issues/3846",
|
"compile:comment": "Yarn workspaces do not link binaries correctly so we need to reference them directly https://github.com/yarnpkg/yarn/issues/3846",
|
||||||
"compile": "node ../deployer/lib/src/cli.js compile --contracts ${npm_package_config_contracts} --contracts-dir src/contracts --artifacts-dir src/artifacts",
|
"compile": "node ../deployer/lib/src/cli.js compile --contracts ${npm_package_config_contracts} --contracts-dir src/contracts --artifacts-dir src/artifacts",
|
||||||
"clean": "shx rm -rf ./lib",
|
"clean": "shx rm -rf ./lib",
|
||||||
"generate_contract_wrappers": "node ../abi-gen/lib/index.js --abis 'src/artifacts/@(DummyToken|TokenTransferProxy|Exchange|TokenRegistry|MultiSigWallet|MultiSigWalletWithTimeLock|MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress|TokenRegistry|ZRXToken|Arbitrage|EtherDelta|AccountLevels).json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated --backend ethers && prettier --write 'src/contract_wrappers/generated/**.ts'",
|
"generate_contract_wrappers": "node ../abi-gen/lib/index.js --abis ${npm_package_config_abis} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated --backend ethers && prettier --write 'src/contract_wrappers/generated/**.ts'",
|
||||||
"migrate": "yarn build && yarn compile && node ./lib/migrations/index.js",
|
"migrate": "yarn build && yarn compile && node ./lib/migrations/index.js",
|
||||||
"lint": "tslint --project . 'migrations/**/*.ts' 'test/**/*.ts' 'util/**/*.ts' 'deploy/**/*.ts'",
|
"lint": "tslint --project . 'migrations/**/*.ts' 'test/**/*.ts' 'util/**/*.ts' 'deploy/**/*.ts'",
|
||||||
"coverage:report:text": "istanbul report text",
|
"coverage:report:text": "istanbul report text",
|
||||||
@@ -27,6 +27,7 @@
|
|||||||
"test:circleci": "yarn test:coverage"
|
"test:circleci": "yarn test:coverage"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
|
"abis": "src/artifacts/@(DummyToken|TokenTransferProxy|Exchange|TokenRegistry|MultiSigWallet|MultiSigWalletWithTimeLock|MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress|TokenRegistry|ZRXToken|Arbitrage|EtherDelta|AccountLevels).json",
|
||||||
"contracts": "Exchange,DummyToken,ZRXToken,Token,WETH9,TokenTransferProxy,MultiSigWallet,MultiSigWalletWithTimeLock,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,MaliciousToken,TokenRegistry,Arbitrage,EtherDelta,AccountLevels"
|
"contracts": "Exchange,DummyToken,ZRXToken,Token,WETH9,TokenTransferProxy,MultiSigWallet,MultiSigWalletWithTimeLock,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,MaliciousToken,TokenRegistry,Arbitrage,EtherDelta,AccountLevels"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -40,39 +41,35 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/0x-monorepo/packages/contracts/README.md",
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/contracts/README.md",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0xproject/dev-utils": "^0.3.1",
|
"@0xproject/dev-utils": "^0.3.4",
|
||||||
"@0xproject/tslint-config": "^0.4.12",
|
"@0xproject/tslint-config": "^0.4.14",
|
||||||
"@types/bluebird": "^3.5.3",
|
"@types/bluebird": "^3.5.3",
|
||||||
"@types/lodash": "^4.14.86",
|
"@types/lodash": "4.14.104",
|
||||||
"@types/node": "^8.0.53",
|
"@types/node": "^8.0.53",
|
||||||
"@types/request-promise-native": "^1.0.2",
|
"@types/request-promise-native": "^1.0.2",
|
||||||
"@types/yargs": "^10.0.0",
|
"@types/yargs": "^10.0.0",
|
||||||
"chai": "^4.0.1",
|
"chai": "^4.0.1",
|
||||||
"chai-as-promised": "^7.1.0",
|
"chai-as-promised": "^7.1.0",
|
||||||
"chai-as-promised-typescript-typings": "^0.0.12",
|
|
||||||
"chai-bignumber": "^2.0.1",
|
"chai-bignumber": "^2.0.1",
|
||||||
"chai-typescript-typings": "^0.0.6",
|
|
||||||
"copyfiles": "^1.2.0",
|
"copyfiles": "^1.2.0",
|
||||||
"dirty-chai": "^2.0.1",
|
"dirty-chai": "^2.0.1",
|
||||||
"ethers-typescript-typings": "^0.0.4",
|
|
||||||
"mocha": "^4.0.1",
|
"mocha": "^4.0.1",
|
||||||
"npm-run-all": "^4.1.2",
|
"npm-run-all": "^4.1.2",
|
||||||
|
"prettier": "^1.11.1",
|
||||||
"shx": "^0.2.2",
|
"shx": "^0.2.2",
|
||||||
"solc": "^0.4.18",
|
"solc": "^0.4.18",
|
||||||
"tslint": "5.8.0",
|
"tslint": "5.8.0",
|
||||||
"types-bn": "^0.0.1",
|
|
||||||
"types-ethereumjs-util": "0xProject/types-ethereumjs-util",
|
|
||||||
"typescript": "2.7.1",
|
"typescript": "2.7.1",
|
||||||
"web3-typescript-typings": "^0.10.2",
|
|
||||||
"yargs": "^10.0.3"
|
"yargs": "^10.0.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"0x.js": "^0.33.3",
|
"0x.js": "^0.35.0",
|
||||||
"@0xproject/deployer": "^0.3.1",
|
"@0xproject/deployer": "^0.3.5",
|
||||||
"@0xproject/json-schemas": "^0.7.16",
|
"@0xproject/json-schemas": "^0.7.19",
|
||||||
"@0xproject/types": "^0.4.1",
|
"@0xproject/types": "^0.5.0",
|
||||||
"@0xproject/utils": "^0.4.3",
|
"@0xproject/typescript-typings": "^0.0.3",
|
||||||
"@0xproject/web3-wrapper": "^0.3.1",
|
"@0xproject/utils": "^0.5.0",
|
||||||
|
"@0xproject/web3-wrapper": "^0.5.0",
|
||||||
"bluebird": "^3.5.0",
|
"bluebird": "^3.5.0",
|
||||||
"bn.js": "^4.11.8",
|
"bn.js": "^4.11.8",
|
||||||
"ethereumjs-abi": "^0.6.4",
|
"ethereumjs-abi": "^0.6.4",
|
||||||
|
@@ -1 +0,0 @@
|
|||||||
*
|
|
@@ -4,22 +4,8 @@
|
|||||||
"outDir": "lib",
|
"outDir": "lib",
|
||||||
"baseUrl": ".",
|
"baseUrl": ".",
|
||||||
"declaration": false,
|
"declaration": false,
|
||||||
"noImplicitThis": false,
|
|
||||||
"allowJs": true
|
"allowJs": true
|
||||||
},
|
},
|
||||||
"include": [
|
"include": ["./globals.d.ts", "./src/**/*", "./util/**/*", "./test/**/*", "./migrations/**/*"],
|
||||||
"../../node_modules/types-ethereumjs-util/index.d.ts",
|
|
||||||
"../../node_modules/chai-typescript-typings/index.d.ts",
|
|
||||||
"../../node_modules/web3-typescript-typings/index.d.ts",
|
|
||||||
"../../node_modules/ethers-typescript-typings/index.d.ts",
|
|
||||||
"../../node_modules/chai-as-promised-typescript-typings/index.d.ts",
|
|
||||||
"../../node_modules/types-ethereumjs-util/index.d.ts",
|
|
||||||
"../../node_modules/types-bn/index.d.ts",
|
|
||||||
"./globals.d.ts",
|
|
||||||
"./src/**/*",
|
|
||||||
"./util/**/*",
|
|
||||||
"./test/**/*",
|
|
||||||
"./migrations/**/*"
|
|
||||||
],
|
|
||||||
"exclude": ["./deploy/solc/solc_bin"]
|
"exclude": ["./deploy/solc/solc_bin"]
|
||||||
}
|
}
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
import { AbiDefinition, MethodAbi } from '@0xproject/types';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import ABI = require('ethereumjs-abi');
|
import ABI = require('ethereumjs-abi');
|
||||||
import ethUtil = require('ethereumjs-util');
|
import ethUtil = require('ethereumjs-util');
|
||||||
@@ -10,8 +11,8 @@ import { TransactionDataParams } from './types';
|
|||||||
|
|
||||||
export class MultiSigWrapper {
|
export class MultiSigWrapper {
|
||||||
private _multiSig: MultiSigWalletContract;
|
private _multiSig: MultiSigWalletContract;
|
||||||
public static encodeFnArgs(name: string, abi: Web3.AbiDefinition[], args: any[]) {
|
public static encodeFnArgs(name: string, abi: AbiDefinition[], args: any[]) {
|
||||||
const abiEntity = _.find(abi, { name }) as Web3.MethodAbi;
|
const abiEntity = _.find(abi, { name }) as MethodAbi;
|
||||||
if (_.isUndefined(abiEntity)) {
|
if (_.isUndefined(abiEntity)) {
|
||||||
throw new Error(`Did not find abi entry for name: ${name}`);
|
throw new Error(`Did not find abi entry for name: ${name}`);
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
|
import { AbiDefinition, ContractAbi } from '@0xproject/types';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import * as Web3 from 'web3';
|
|
||||||
|
|
||||||
export interface BalancesByOwner {
|
export interface BalancesByOwner {
|
||||||
[ownerAddress: string]: {
|
[ownerAddress: string]: {
|
||||||
@@ -51,7 +51,7 @@ export interface DefaultOrderParams {
|
|||||||
|
|
||||||
export interface TransactionDataParams {
|
export interface TransactionDataParams {
|
||||||
name: string;
|
name: string;
|
||||||
abi: Web3.AbiDefinition[];
|
abi: AbiDefinition[];
|
||||||
args: any[];
|
args: any[];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ export interface Artifact {
|
|||||||
contract_name: ContractName;
|
contract_name: ContractName;
|
||||||
networks: {
|
networks: {
|
||||||
[networkId: number]: {
|
[networkId: number]: {
|
||||||
abi: Web3.ContractAbi;
|
abi: ContractAbi;
|
||||||
solc_version: string;
|
solc_version: string;
|
||||||
keccak256: string;
|
keccak256: string;
|
||||||
optimizer_enabled: number;
|
optimizer_enabled: number;
|
||||||
|
@@ -4,3 +4,4 @@ yarn-error.log
|
|||||||
/scripts/
|
/scripts/
|
||||||
test/
|
test/
|
||||||
tsconfig.json
|
tsconfig.json
|
||||||
|
/lib/src/monorepo_scripts/
|
||||||
|
118
packages/deployer/CHANGELOG.json
Normal file
118
packages/deployer/CHANGELOG.json
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"version": "0.3.5",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Don't try to write contract artifact if an error occured",
|
||||||
|
"pr": 485
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1522673609
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.3.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Create solc_bin directory if does not exist before attempting to compile",
|
||||||
|
"pr": 491
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1522658513,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.3.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add TS types for `yargs`"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1521298800,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.3.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add support for Solidity 0.4.20 and 0.4.21"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Replace `jsonrpcPort` config with `jsonrpcUrl`",
|
||||||
|
"pr": 426
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Replace `jsonrpc-port` CLI option with `jsonrpc-url`",
|
||||||
|
"pr": 426
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Export the `Compiler`",
|
||||||
|
"pr": 426
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Load solc from remote source instead of having it locally",
|
||||||
|
"pr": 426
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Add `bytecode`, `runtime_bytecode`, `source_map`, `source_map_runtime` and `sources` fields to artifacts",
|
||||||
|
"pr": 426
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Remove 0x-specific `migrate` command",
|
||||||
|
"pr": 426
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Allow deployer to accept a provider instead of port and host. This makes it possible to run it with in-process ganache-core",
|
||||||
|
"pr": 426
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package",
|
||||||
|
"pr": 452
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add `#!/usr/bin/env node` pragma above `cli.ts` script to fix command-line error."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1521298800,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Check dependencies when determining if contracts should be recompiled",
|
||||||
|
"pr": 408
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Improve an error message for when deployer is supplied with an incorrect number of constructor arguments",
|
||||||
|
"pr": 419
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1520089200,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.1.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add the ability to pass in specific contracts to compile in CLI",
|
||||||
|
"pr": 400
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1518706800,
|
||||||
|
"isPublished": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.0.8",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fix publishing issue where .npmignore was not properly excluding undesired content",
|
||||||
|
"pr": 389
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1518102000,
|
||||||
|
"isPublished": true
|
||||||
|
}
|
||||||
|
]
|
@@ -1,10 +1,23 @@
|
|||||||
# CHANGELOG
|
<!--
|
||||||
|
This file is auto-generated using the monorepo-scripts package. Don't edit directly.
|
||||||
|
Edit the package's CHANGELOG.json file only.
|
||||||
|
-->
|
||||||
|
|
||||||
## v0.3.1 - _March 18, 2018_
|
CHANGELOG
|
||||||
|
|
||||||
|
## v0.3.5 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Don't try to write contract artifact if an error occured (#485)
|
||||||
|
|
||||||
|
## v0.3.4 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Create solc_bin directory if does not exist before attempting to compile (#491)
|
||||||
|
|
||||||
|
## v0.3.1 - _March 17, 2018_
|
||||||
|
|
||||||
* Add TS types for `yargs`
|
* Add TS types for `yargs`
|
||||||
|
|
||||||
## v0.3.0 - _March 18, 2018_
|
## v0.3.0 - _March 17, 2018_
|
||||||
|
|
||||||
* Add support for Solidity 0.4.20 and 0.4.21
|
* Add support for Solidity 0.4.20 and 0.4.21
|
||||||
* Replace `jsonrpcPort` config with `jsonrpcUrl` (#426)
|
* Replace `jsonrpcPort` config with `jsonrpcUrl` (#426)
|
||||||
@@ -17,15 +30,15 @@
|
|||||||
* Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
|
* Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
|
||||||
* Add `#!/usr/bin/env node` pragma above `cli.ts` script to fix command-line error.
|
* Add `#!/usr/bin/env node` pragma above `cli.ts` script to fix command-line error.
|
||||||
|
|
||||||
## v0.2.0 - _March 4, 2018_
|
## v0.2.0 - _March 3, 2018_
|
||||||
|
|
||||||
* Check dependencies when determining if contracts should be recompiled (#408)
|
* Check dependencies when determining if contracts should be recompiled (#408)
|
||||||
* Improve an error message for when deployer is supplied with an incorrect number of constructor arguments (#419)
|
* Improve an error message for when deployer is supplied with an incorrect number of constructor arguments (#419)
|
||||||
|
|
||||||
## v0.1.0 - _February 16, 2018_
|
## v0.1.0 - _February 15, 2018_
|
||||||
|
|
||||||
* Add the ability to pass in specific contracts to compile in CLI (#400)
|
* Add the ability to pass in specific contracts to compile in CLI (#400)
|
||||||
|
|
||||||
## v0.0.8 - _February 9, 2018_
|
## v0.0.8 - _February 8, 2018_
|
||||||
|
|
||||||
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
||||||
|
@@ -2,66 +2,42 @@
|
|||||||
|
|
||||||
This repository contains a CLI tool that facilitates compiling and deployment of smart contracts.
|
This repository contains a CLI tool that facilitates compiling and deployment of smart contracts.
|
||||||
|
|
||||||
|
### Read the [Documentation](0xproject.com/docs/deployer).
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
#### CLI Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn global add @0xproject/deployer
|
||||||
|
```
|
||||||
|
|
||||||
|
#### API Installation
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yarn add @0xproject/deployer
|
yarn add @0xproject/deployer
|
||||||
```
|
```
|
||||||
|
|
||||||
## Usage
|
If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
|
||||||
|
|
||||||
### CLI Usage
|
```json
|
||||||
|
"compilerOptions": {
|
||||||
```bash
|
"typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
|
||||||
node ./node_modules/@0xproject/deployer/lib/cli.js --help
|
}
|
||||||
cli.js [command]
|
|
||||||
|
|
||||||
Commands:
|
|
||||||
cli.js compile compile contracts
|
|
||||||
cli.js deploy deploy a single contract with provided arguments
|
|
||||||
|
|
||||||
Options:
|
|
||||||
--version Show version number [boolean]
|
|
||||||
--contracts-dir path of contracts directory to compile
|
|
||||||
[string] [default: "/Users/leonidlogvinov/Dev/0x/contracts"]
|
|
||||||
--network-id mainnet=1, kovan=42, testrpc=50 [number] [default: 50]
|
|
||||||
--should-optimize enable optimizer [boolean] [default: false]
|
|
||||||
--artifacts-dir path to write contracts artifacts to
|
|
||||||
[string] [default: "/Users/leonidlogvinov/Dev/0x/build/artifacts/"]
|
|
||||||
--jsonrpc-port port connected to JSON RPC [number] [default: 8545]
|
|
||||||
--gas-price gasPrice to be used for transactions
|
|
||||||
[string] [default: "2000000000"]
|
|
||||||
--account account to use for deploying contracts [string]
|
|
||||||
--help Show help [boolean]
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### API Usage
|
**Import**
|
||||||
|
|
||||||
## Migrations
|
|
||||||
|
|
||||||
You might want to write a migration scripts (similar to `truffle migrate`), that deploys multiple contracts and configures them. Below you'll find a simple example of such a script to help you get started.
|
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
import { Deployer } from '@0xproject/deployer';
|
import { Deployer, Compiler } from '@0xproject/deployer';
|
||||||
import * as path from 'path';
|
|
||||||
|
|
||||||
const deployerOpts = {
|
|
||||||
artifactsDir: path.resolve('src', 'artifacts'),
|
|
||||||
jsonrpcUrl: 'http://localhost:8545',
|
|
||||||
networkId: 50,
|
|
||||||
defaults: {
|
|
||||||
gas: 1000000,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const deployer = new Deployer(deployerOpts);
|
|
||||||
|
|
||||||
(async () => {
|
|
||||||
const etherToken = await deployer.deployAndSaveAsync('WETH9');
|
|
||||||
})().catch(console.log);
|
|
||||||
```
|
```
|
||||||
|
|
||||||
A more sophisticated example can be found [here](https://github.com/0xProject/0x-monorepo/tree/development/packages/contracts/migrations)
|
or
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var Deployer = require('@0xproject/deployer').Deployer;
|
||||||
|
var Compiler = require('@0xproject/deployer').Compiler;
|
||||||
|
```
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
@@ -1,20 +1,37 @@
|
|||||||
{
|
{
|
||||||
"name": "@0xproject/deployer",
|
"name": "@0xproject/deployer",
|
||||||
"version": "0.3.1",
|
"version": "0.3.5",
|
||||||
"description": "Smart contract deployer of 0x protocol",
|
"description": "Smart contract deployer of 0x protocol",
|
||||||
"main": "lib/src/index.js",
|
"main": "lib/src/index.js",
|
||||||
"types": "lib/src/index.d.ts",
|
"types": "lib/src/index.d.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build:watch": "tsc -w",
|
"build:watch": "tsc -w",
|
||||||
"build": "yarn clean && copyfiles 'test/fixtures/contracts/**/*' ./lib && tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
|
"build": "yarn clean && copyfiles 'test/fixtures/contracts/**/*' ./lib && tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
|
||||||
"test": "npm run build; mocha lib/test/*_test.js",
|
"test": "run-s build run_mocha",
|
||||||
|
"run_mocha": "mocha lib/test/*_test.js",
|
||||||
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
|
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
|
||||||
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
|
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
|
||||||
"compile": "npm run build; node lib/src/cli.js compile",
|
"compile": "npm run build; node lib/src/cli.js compile",
|
||||||
"clean": "shx rm -rf lib scripts",
|
"clean": "shx rm -rf lib scripts",
|
||||||
"migrate": "npm run build; node lib/src/cli.js migrate",
|
"migrate": "npm run build; node lib/src/cli.js migrate",
|
||||||
"lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
|
"lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
|
||||||
"test:circleci": "yarn test:coverage"
|
"test:circleci": "yarn test:coverage",
|
||||||
|
"docs:stage": "yarn build && node ./scripts/stage_docs.js",
|
||||||
|
"manual:postpublish": "yarn build; node ./scripts/postpublish.js",
|
||||||
|
"docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
|
||||||
|
"upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json"
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"postpublish": {
|
||||||
|
"assets": [],
|
||||||
|
"docPublishConfigs": {
|
||||||
|
"extraFileIncludes": [
|
||||||
|
"../types/src/index.ts"
|
||||||
|
],
|
||||||
|
"s3BucketPath": "s3://doc-jsons/deployer/",
|
||||||
|
"s3StagingBucketPath": "s3://staging-doc-jsons/deployer/"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"0x-deployer": "lib/src/cli.js"
|
"0x-deployer": "lib/src/cli.js"
|
||||||
@@ -30,30 +47,35 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/0x-monorepo/packages/deployer/README.md",
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/deployer/README.md",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0xproject/monorepo-scripts": "^0.1.14",
|
"@0xproject/monorepo-scripts": "^0.1.16",
|
||||||
"@0xproject/tslint-config": "^0.4.12",
|
"@0xproject/tslint-config": "^0.4.14",
|
||||||
"@types/require-from-string": "^1.2.0",
|
"@types/require-from-string": "^1.2.0",
|
||||||
|
"@types/semver": "^5.5.0",
|
||||||
"@types/yargs": "^11.0.0",
|
"@types/yargs": "^11.0.0",
|
||||||
"chai": "^4.0.1",
|
"chai": "^4.0.1",
|
||||||
"copyfiles": "^1.2.0",
|
"copyfiles": "^1.2.0",
|
||||||
"ethers-typescript-typings": "^0.0.4",
|
"dirty-chai": "^2.0.1",
|
||||||
"mocha": "^4.0.1",
|
"mocha": "^4.0.1",
|
||||||
|
"npm-run-all": "^4.1.2",
|
||||||
"nyc": "^11.0.1",
|
"nyc": "^11.0.1",
|
||||||
"shx": "^0.2.2",
|
"shx": "^0.2.2",
|
||||||
"tslint": "5.8.0",
|
"tslint": "5.8.0",
|
||||||
|
"typedoc": "0xProject/typedoc",
|
||||||
"types-bn": "^0.0.1",
|
"types-bn": "^0.0.1",
|
||||||
"typescript": "2.7.1",
|
"typescript": "2.7.1",
|
||||||
"web3-typescript-typings": "^0.10.2"
|
"web3-typescript-typings": "^0.10.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0xproject/json-schemas": "^0.7.16",
|
"@0xproject/json-schemas": "^0.7.19",
|
||||||
"@0xproject/types": "^0.4.1",
|
"@0xproject/types": "^0.5.0",
|
||||||
"@0xproject/utils": "^0.4.3",
|
"@0xproject/typescript-typings": "^0.0.3",
|
||||||
"@0xproject/web3-wrapper": "^0.3.1",
|
"@0xproject/utils": "^0.5.0",
|
||||||
|
"@0xproject/web3-wrapper": "^0.5.0",
|
||||||
"ethereumjs-util": "^5.1.1",
|
"ethereumjs-util": "^5.1.1",
|
||||||
"isomorphic-fetch": "^2.2.1",
|
"isomorphic-fetch": "^2.2.1",
|
||||||
"lodash": "^4.17.4",
|
"lodash": "^4.17.4",
|
||||||
"require-from-string": "^2.0.1",
|
"require-from-string": "^2.0.1",
|
||||||
|
"semver": "^5.5.0",
|
||||||
"solc": "^0.4.18",
|
"solc": "^0.4.18",
|
||||||
"web3": "^0.20.0",
|
"web3": "^0.20.0",
|
||||||
"web3-eth-abi": "^1.0.0-beta.24",
|
"web3-eth-abi": "^1.0.0-beta.24",
|
||||||
|
1
packages/deployer/solc_bin/.gitignore
vendored
1
packages/deployer/solc_bin/.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
*.js
|
|
0
packages/deployer/solc_bin/.gitkeep
Normal file
0
packages/deployer/solc_bin/.gitkeep
Normal file
@@ -10,6 +10,7 @@ import * as yargs from 'yargs';
|
|||||||
|
|
||||||
import { commands } from './commands';
|
import { commands } from './commands';
|
||||||
import { constants } from './utils/constants';
|
import { constants } from './utils/constants';
|
||||||
|
import { consoleReporter } from './utils/error_reporter';
|
||||||
import { CliOptions, CompilerOptions, DeployerOptions } from './utils/types';
|
import { CliOptions, CompilerOptions, DeployerOptions } from './utils/types';
|
||||||
|
|
||||||
const DEFAULT_OPTIMIZER_ENABLED = false;
|
const DEFAULT_OPTIMIZER_ENABLED = false;
|
||||||
@@ -24,11 +25,11 @@ const DEFAULT_CONTRACTS_LIST = '*';
|
|||||||
* Compiles all contracts with options passed in through CLI.
|
* Compiles all contracts with options passed in through CLI.
|
||||||
* @param argv Instance of process.argv provided by yargs.
|
* @param argv Instance of process.argv provided by yargs.
|
||||||
*/
|
*/
|
||||||
async function onCompileCommand(argv: CliOptions): Promise<void> {
|
async function onCompileCommandAsync(argv: CliOptions): Promise<void> {
|
||||||
const opts: CompilerOptions = {
|
const opts: CompilerOptions = {
|
||||||
contractsDir: argv.contractsDir,
|
contractsDir: argv.contractsDir,
|
||||||
networkId: argv.networkId,
|
networkId: argv.networkId,
|
||||||
optimizerEnabled: argv.shouldOptimize ? 1 : 0,
|
optimizerEnabled: argv.shouldOptimize,
|
||||||
artifactsDir: argv.artifactsDir,
|
artifactsDir: argv.artifactsDir,
|
||||||
specifiedContracts: getContractsSetFromList(argv.contracts),
|
specifiedContracts: getContractsSetFromList(argv.contracts),
|
||||||
};
|
};
|
||||||
@@ -38,7 +39,7 @@ async function onCompileCommand(argv: CliOptions): Promise<void> {
|
|||||||
* Deploys a single contract with provided name and args.
|
* Deploys a single contract with provided name and args.
|
||||||
* @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 onDeployCommandAsync(argv: CliOptions): Promise<void> {
|
||||||
const url = argv.jsonrpcUrl;
|
const url = argv.jsonrpcUrl;
|
||||||
const web3Provider = new Web3.providers.HttpProvider(url);
|
const web3Provider = new Web3.providers.HttpProvider(url);
|
||||||
const web3Wrapper = new Web3Wrapper(web3Provider);
|
const web3Wrapper = new Web3Wrapper(web3Provider);
|
||||||
@@ -46,7 +47,7 @@ async function onDeployCommand(argv: CliOptions): Promise<void> {
|
|||||||
const compilerOpts: CompilerOptions = {
|
const compilerOpts: CompilerOptions = {
|
||||||
contractsDir: argv.contractsDir,
|
contractsDir: argv.contractsDir,
|
||||||
networkId,
|
networkId,
|
||||||
optimizerEnabled: argv.shouldOptimize ? 1 : 0,
|
optimizerEnabled: argv.shouldOptimize,
|
||||||
artifactsDir: argv.artifactsDir,
|
artifactsDir: argv.artifactsDir,
|
||||||
specifiedContracts: getContractsSetFromList(argv.contracts),
|
specifiedContracts: getContractsSetFromList(argv.contracts),
|
||||||
};
|
};
|
||||||
@@ -62,9 +63,9 @@ async function onDeployCommand(argv: CliOptions): Promise<void> {
|
|||||||
networkId,
|
networkId,
|
||||||
defaults,
|
defaults,
|
||||||
};
|
};
|
||||||
const deployerArgsString = argv.args;
|
const deployerArgsString = argv.args as string;
|
||||||
const deployerArgs = deployerArgsString.split(',');
|
const deployerArgs = deployerArgsString.split(',');
|
||||||
await commands.deployAsync(argv.contract, deployerArgs, deployerOpts);
|
await commands.deployAsync(argv.contract as string, deployerArgs, deployerOpts);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Creates a set of contracts to compile.
|
* Creates a set of contracts to compile.
|
||||||
@@ -142,7 +143,12 @@ function deployCommandBuilder(yargsInstance: any) {
|
|||||||
default: DEFAULT_CONTRACTS_LIST,
|
default: DEFAULT_CONTRACTS_LIST,
|
||||||
description: 'comma separated list of contracts to compile',
|
description: 'comma separated list of contracts to compile',
|
||||||
})
|
})
|
||||||
.command('compile', 'compile contracts', identityCommandBuilder, onCompileCommand)
|
.command('compile', 'compile contracts', identityCommandBuilder, consoleReporter(onCompileCommandAsync))
|
||||||
.command('deploy', 'deploy a single contract with provided arguments', deployCommandBuilder, onDeployCommand)
|
.command(
|
||||||
|
'deploy',
|
||||||
|
'deploy a single contract with provided arguments',
|
||||||
|
deployCommandBuilder,
|
||||||
|
consoleReporter(onDeployCommandAsync),
|
||||||
|
)
|
||||||
.help().argv;
|
.help().argv;
|
||||||
})();
|
})();
|
||||||
|
@@ -5,7 +5,7 @@ import { CompilerOptions, DeployerOptions } from './utils/types';
|
|||||||
export const commands = {
|
export const commands = {
|
||||||
async compileAsync(opts: CompilerOptions): Promise<void> {
|
async compileAsync(opts: CompilerOptions): Promise<void> {
|
||||||
const compiler = new Compiler(opts);
|
const compiler = new Compiler(opts);
|
||||||
await compiler.compileAllAsync();
|
await compiler.compileAsync();
|
||||||
},
|
},
|
||||||
async deployAsync(contractName: string, args: any[], opts: DeployerOptions): Promise<void> {
|
async deployAsync(contractName: string, args: any[], opts: DeployerOptions): Promise<void> {
|
||||||
const deployer = new Deployer(opts);
|
const deployer = new Deployer(opts);
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
import { ContractAbi } from '@0xproject/types';
|
||||||
import { logUtils, promisify } from '@0xproject/utils';
|
import { logUtils, promisify } from '@0xproject/utils';
|
||||||
import * as ethUtil from 'ethereumjs-util';
|
import * as ethUtil from 'ethereumjs-util';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
@@ -5,10 +6,18 @@ import 'isomorphic-fetch';
|
|||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as requireFromString from 'require-from-string';
|
import * as requireFromString from 'require-from-string';
|
||||||
|
import * as semver from 'semver';
|
||||||
import solc = require('solc');
|
import solc = require('solc');
|
||||||
import * as Web3 from 'web3';
|
|
||||||
|
|
||||||
import { binPaths } from './solc/bin_paths';
|
import { binPaths } from './solc/bin_paths';
|
||||||
|
import {
|
||||||
|
createDirIfDoesNotExistAsync,
|
||||||
|
findImportIfExist,
|
||||||
|
getContractArtifactIfExistsAsync,
|
||||||
|
getNormalizedErrMsg,
|
||||||
|
parseDependencies,
|
||||||
|
parseSolidityVersionRange,
|
||||||
|
} from './utils/compiler';
|
||||||
import { constants } from './utils/constants';
|
import { constants } from './utils/constants';
|
||||||
import { fsWrapper } from './utils/fs_wrapper';
|
import { fsWrapper } from './utils/fs_wrapper';
|
||||||
import {
|
import {
|
||||||
@@ -23,18 +32,19 @@ import {
|
|||||||
import { utils } from './utils/utils';
|
import { utils } from './utils/utils';
|
||||||
|
|
||||||
const ALL_CONTRACTS_IDENTIFIER = '*';
|
const ALL_CONTRACTS_IDENTIFIER = '*';
|
||||||
const SOLIDITY_VERSION_REGEX = /(?:solidity\s\^?)(\d+\.\d+\.\d+)/;
|
const SOLC_BIN_DIR = path.join(__dirname, '..', '..', 'solc_bin');
|
||||||
const SOLIDITY_FILE_EXTENSION_REGEX = /(.*\.sol)/;
|
|
||||||
const IMPORT_REGEX = /(import\s)/;
|
|
||||||
const DEPENDENCY_PATH_REGEX = /"([^"]+)"/; // Source: https://github.com/BlockChainCompany/soljitsu/blob/master/lib/shared.js
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Compiler facilitates compiling Solidity smart contracts and saves the results
|
||||||
|
* to artifact files.
|
||||||
|
*/
|
||||||
export class Compiler {
|
export class Compiler {
|
||||||
private _contractsDir: string;
|
private _contractsDir: string;
|
||||||
private _networkId: number;
|
private _networkId: number;
|
||||||
private _optimizerEnabled: number;
|
private _optimizerEnabled: boolean;
|
||||||
private _artifactsDir: string;
|
private _artifactsDir: string;
|
||||||
private _contractSources?: ContractSources;
|
// This get's set in the beggining of `compileAsync` function. It's not called from a constructor, but it's the only public method of that class and could as well be.
|
||||||
private _solcErrors: Set<string> = new Set();
|
private _contractSources!: ContractSources;
|
||||||
private _specifiedContracts: Set<string> = new Set();
|
private _specifiedContracts: Set<string> = new Set();
|
||||||
private _contractSourceData: ContractSourceData = {};
|
private _contractSourceData: ContractSourceData = {};
|
||||||
/**
|
/**
|
||||||
@@ -77,64 +87,6 @@ export class Compiler {
|
|||||||
}
|
}
|
||||||
return sources;
|
return sources;
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* Gets contract dependendencies and keccak256 hash from source.
|
|
||||||
* @param source Source code of contract.
|
|
||||||
* @return Object with contract dependencies and keccak256 hash of source.
|
|
||||||
*/
|
|
||||||
private static _getContractSpecificSourceData(source: string): ContractSpecificSourceData {
|
|
||||||
const dependencies: string[] = [];
|
|
||||||
const sourceHash = ethUtil.sha3(source);
|
|
||||||
const solcVersion = Compiler._parseSolidityVersion(source);
|
|
||||||
const contractSpecificSourceData: ContractSpecificSourceData = {
|
|
||||||
dependencies,
|
|
||||||
solcVersion,
|
|
||||||
sourceHash,
|
|
||||||
};
|
|
||||||
const lines = source.split('\n');
|
|
||||||
_.forEach(lines, line => {
|
|
||||||
if (!_.isNull(line.match(IMPORT_REGEX))) {
|
|
||||||
const dependencyMatch = line.match(DEPENDENCY_PATH_REGEX);
|
|
||||||
if (!_.isNull(dependencyMatch)) {
|
|
||||||
const dependencyPath = dependencyMatch[1];
|
|
||||||
const fileName = path.basename(dependencyPath);
|
|
||||||
contractSpecificSourceData.dependencies.push(fileName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return contractSpecificSourceData;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Searches Solidity source code for compiler version.
|
|
||||||
* @param source Source code of contract.
|
|
||||||
* @return Solc compiler version.
|
|
||||||
*/
|
|
||||||
private static _parseSolidityVersion(source: string): string {
|
|
||||||
const solcVersionMatch = source.match(SOLIDITY_VERSION_REGEX);
|
|
||||||
if (_.isNull(solcVersionMatch)) {
|
|
||||||
throw new Error('Could not find Solidity version in source');
|
|
||||||
}
|
|
||||||
const solcVersion = solcVersionMatch[1];
|
|
||||||
return solcVersion;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Normalizes the path found in the error message.
|
|
||||||
* Example: converts 'base/Token.sol:6:46: Warning: Unused local variable'
|
|
||||||
* to 'Token.sol:6:46: Warning: Unused local variable'
|
|
||||||
* This is used to prevent logging the same error multiple times.
|
|
||||||
* @param errMsg An error message from the compiled output.
|
|
||||||
* @return The error message with directories truncated from the contract path.
|
|
||||||
*/
|
|
||||||
private static _getNormalizedErrMsg(errMsg: string): string {
|
|
||||||
const errPathMatch = errMsg.match(SOLIDITY_FILE_EXTENSION_REGEX);
|
|
||||||
if (_.isNull(errPathMatch)) {
|
|
||||||
throw new Error('Could not find a path in error message');
|
|
||||||
}
|
|
||||||
const errPath = errPathMatch[0];
|
|
||||||
const baseContract = path.basename(errPath);
|
|
||||||
const normalizedErrMsg = errMsg.replace(errPath, baseContract);
|
|
||||||
return normalizedErrMsg;
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new instance of the Compiler class.
|
* Instantiates a new instance of the Compiler class.
|
||||||
* @param opts Options specifying directories, network, and optimization settings.
|
* @param opts Options specifying directories, network, and optimization settings.
|
||||||
@@ -148,24 +100,19 @@ export class Compiler {
|
|||||||
this._specifiedContracts = opts.specifiedContracts;
|
this._specifiedContracts = opts.specifiedContracts;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Compiles all Solidity files found in contractsDir and writes JSON artifacts to artifactsDir.
|
* Compiles selected Solidity files found in `contractsDir` and writes JSON artifacts to `artifactsDir`.
|
||||||
*/
|
*/
|
||||||
public async compileAllAsync(): Promise<void> {
|
public async compileAsync(): Promise<void> {
|
||||||
await this._createArtifactsDirIfDoesNotExistAsync();
|
await createDirIfDoesNotExistAsync(this._artifactsDir);
|
||||||
|
await createDirIfDoesNotExistAsync(SOLC_BIN_DIR);
|
||||||
this._contractSources = await Compiler._getContractSourcesAsync(this._contractsDir);
|
this._contractSources = await Compiler._getContractSourcesAsync(this._contractsDir);
|
||||||
_.forIn(this._contractSources, (source, fileName) => {
|
_.forIn(this._contractSources, this._setContractSpecificSourceData.bind(this));
|
||||||
this._contractSourceData[fileName] = Compiler._getContractSpecificSourceData(source);
|
|
||||||
});
|
|
||||||
const fileNames = this._specifiedContracts.has(ALL_CONTRACTS_IDENTIFIER)
|
const fileNames = this._specifiedContracts.has(ALL_CONTRACTS_IDENTIFIER)
|
||||||
? _.keys(this._contractSources)
|
? _.keys(this._contractSources)
|
||||||
: Array.from(this._specifiedContracts.values());
|
: Array.from(this._specifiedContracts.values());
|
||||||
_.forEach(fileNames, fileName => {
|
for (const fileName of fileNames) {
|
||||||
this._setSourceTreeHash(fileName);
|
await this._compileContractAsync(fileName);
|
||||||
});
|
}
|
||||||
await Promise.all(_.map(fileNames, async fileName => this._compileContractAsync(fileName)));
|
|
||||||
this._solcErrors.forEach(errMsg => {
|
|
||||||
logUtils.log(errMsg);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Compiles contract and saves artifact to artifactsDir.
|
* Compiles contract and saves artifact to artifactsDir.
|
||||||
@@ -176,20 +123,29 @@ export class Compiler {
|
|||||||
throw new Error('Contract sources not yet initialized');
|
throw new Error('Contract sources not yet initialized');
|
||||||
}
|
}
|
||||||
const contractSpecificSourceData = this._contractSourceData[fileName];
|
const contractSpecificSourceData = this._contractSourceData[fileName];
|
||||||
const currentArtifactIfExists = (await this._getContractArtifactIfExistsAsync(fileName)) as ContractArtifact;
|
const currentArtifactIfExists = await getContractArtifactIfExistsAsync(this._artifactsDir, fileName);
|
||||||
const sourceHash = `0x${contractSpecificSourceData.sourceHash.toString('hex')}`;
|
const sourceHash = `0x${contractSpecificSourceData.sourceHash.toString('hex')}`;
|
||||||
const sourceTreeHash = `0x${contractSpecificSourceData.sourceTreeHashIfExists.toString('hex')}`;
|
const sourceTreeHash = `0x${contractSpecificSourceData.sourceTreeHash.toString('hex')}`;
|
||||||
|
|
||||||
const shouldCompile =
|
let shouldCompile = false;
|
||||||
_.isUndefined(currentArtifactIfExists) ||
|
if (_.isUndefined(currentArtifactIfExists)) {
|
||||||
currentArtifactIfExists.networks[this._networkId].optimizer_enabled !== this._optimizerEnabled ||
|
shouldCompile = true;
|
||||||
currentArtifactIfExists.networks[this._networkId].source_tree_hash !== sourceTreeHash;
|
} else {
|
||||||
|
const currentArtifact = currentArtifactIfExists as ContractArtifact;
|
||||||
|
shouldCompile =
|
||||||
|
currentArtifact.networks[this._networkId].optimizer_enabled !== this._optimizerEnabled ||
|
||||||
|
currentArtifact.networks[this._networkId].source_tree_hash !== sourceTreeHash;
|
||||||
|
}
|
||||||
if (!shouldCompile) {
|
if (!shouldCompile) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
const availableCompilerVersions = _.keys(binPaths);
|
||||||
const fullSolcVersion = binPaths[contractSpecificSourceData.solcVersion];
|
const solcVersion = semver.maxSatisfying(
|
||||||
const compilerBinFilename = path.join(__dirname, '../../solc_bin', fullSolcVersion);
|
availableCompilerVersions,
|
||||||
|
contractSpecificSourceData.solcVersionRange,
|
||||||
|
);
|
||||||
|
const fullSolcVersion = binPaths[solcVersion];
|
||||||
|
const compilerBinFilename = path.join(SOLC_BIN_DIR, fullSolcVersion);
|
||||||
let solcjs: string;
|
let solcjs: string;
|
||||||
const isCompilerAvailableLocally = fs.existsSync(compilerBinFilename);
|
const isCompilerAvailableLocally = fs.existsSync(compilerBinFilename);
|
||||||
if (isCompilerAvailableLocally) {
|
if (isCompilerAvailableLocally) {
|
||||||
@@ -206,7 +162,7 @@ export class Compiler {
|
|||||||
}
|
}
|
||||||
const solcInstance = solc.setupMethods(requireFromString(solcjs, compilerBinFilename));
|
const solcInstance = solc.setupMethods(requireFromString(solcjs, compilerBinFilename));
|
||||||
|
|
||||||
logUtils.log(`Compiling ${fileName}...`);
|
logUtils.log(`Compiling ${fileName} with Solidity v${solcVersion}...`);
|
||||||
const source = this._contractSources[fileName];
|
const source = this._contractSources[fileName];
|
||||||
const input = {
|
const input = {
|
||||||
[fileName]: source,
|
[fileName]: source,
|
||||||
@@ -214,21 +170,37 @@ export class Compiler {
|
|||||||
const sourcesToCompile = {
|
const sourcesToCompile = {
|
||||||
sources: input,
|
sources: input,
|
||||||
};
|
};
|
||||||
const compiled = solcInstance.compile(
|
const compiled = solcInstance.compile(sourcesToCompile, Number(this._optimizerEnabled), importPath =>
|
||||||
sourcesToCompile,
|
findImportIfExist(this._contractSources, importPath),
|
||||||
this._optimizerEnabled,
|
|
||||||
this._findImportsIfSourcesExist.bind(this),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!_.isUndefined(compiled.errors)) {
|
if (!_.isUndefined(compiled.errors)) {
|
||||||
_.forEach(compiled.errors, errMsg => {
|
const SOLIDITY_WARNING_PREFIX = 'Warning';
|
||||||
const normalizedErrMsg = Compiler._getNormalizedErrMsg(errMsg);
|
const isError = (errorOrWarning: string) => !errorOrWarning.includes(SOLIDITY_WARNING_PREFIX);
|
||||||
this._solcErrors.add(normalizedErrMsg);
|
const isWarning = (errorOrWarning: string) => errorOrWarning.includes(SOLIDITY_WARNING_PREFIX);
|
||||||
|
const errors = _.filter(compiled.errors, isError);
|
||||||
|
const warnings = _.filter(compiled.errors, isWarning);
|
||||||
|
if (!_.isEmpty(errors)) {
|
||||||
|
errors.forEach(errMsg => {
|
||||||
|
const normalizedErrMsg = getNormalizedErrMsg(errMsg);
|
||||||
|
logUtils.log(normalizedErrMsg);
|
||||||
});
|
});
|
||||||
|
process.exit(1);
|
||||||
|
} else {
|
||||||
|
warnings.forEach(errMsg => {
|
||||||
|
const normalizedErrMsg = getNormalizedErrMsg(errMsg);
|
||||||
|
logUtils.log(normalizedErrMsg);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
const contractName = path.basename(fileName, constants.SOLIDITY_FILE_EXTENSION);
|
const contractName = path.basename(fileName, constants.SOLIDITY_FILE_EXTENSION);
|
||||||
const contractIdentifier = `${fileName}:${contractName}`;
|
const contractIdentifier = `${fileName}:${contractName}`;
|
||||||
const abi: Web3.ContractAbi = JSON.parse(compiled.contracts[contractIdentifier].interface);
|
if (_.isUndefined(compiled.contracts[contractIdentifier])) {
|
||||||
|
throw new Error(
|
||||||
|
`Contract ${contractName} not found in ${fileName}. Please make sure your contract has the same name as it's file name`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const abi: ContractAbi = JSON.parse(compiled.contracts[contractIdentifier].interface);
|
||||||
const bytecode = `0x${compiled.contracts[contractIdentifier].bytecode}`;
|
const bytecode = `0x${compiled.contracts[contractIdentifier].bytecode}`;
|
||||||
const runtimeBytecode = `0x${compiled.contracts[contractIdentifier].runtimeBytecode}`;
|
const runtimeBytecode = `0x${compiled.contracts[contractIdentifier].runtimeBytecode}`;
|
||||||
const sourceMap = compiled.contracts[contractIdentifier].srcmap;
|
const sourceMap = compiled.contracts[contractIdentifier].srcmap;
|
||||||
@@ -236,7 +208,7 @@ export class Compiler {
|
|||||||
const sources = _.keys(compiled.sources);
|
const sources = _.keys(compiled.sources);
|
||||||
const updated_at = Date.now();
|
const updated_at = Date.now();
|
||||||
const contractNetworkData: ContractNetworkData = {
|
const contractNetworkData: ContractNetworkData = {
|
||||||
solc_version: contractSpecificSourceData.solcVersion,
|
solc_version: solcVersion,
|
||||||
keccak256: sourceHash,
|
keccak256: sourceHash,
|
||||||
source_tree_hash: sourceTreeHash,
|
source_tree_hash: sourceTreeHash,
|
||||||
optimizer_enabled: this._optimizerEnabled,
|
optimizer_enabled: this._optimizerEnabled,
|
||||||
@@ -251,10 +223,11 @@ export class Compiler {
|
|||||||
|
|
||||||
let newArtifact: ContractArtifact;
|
let newArtifact: ContractArtifact;
|
||||||
if (!_.isUndefined(currentArtifactIfExists)) {
|
if (!_.isUndefined(currentArtifactIfExists)) {
|
||||||
|
const currentArtifact = currentArtifactIfExists as ContractArtifact;
|
||||||
newArtifact = {
|
newArtifact = {
|
||||||
...currentArtifactIfExists,
|
...currentArtifact,
|
||||||
networks: {
|
networks: {
|
||||||
...currentArtifactIfExists.networks,
|
...currentArtifact.networks,
|
||||||
[this._networkId]: contractNetworkData,
|
[this._networkId]: contractNetworkData,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -273,79 +246,42 @@ export class Compiler {
|
|||||||
logUtils.log(`${fileName} artifact saved!`);
|
logUtils.log(`${fileName} artifact saved!`);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Sets the source tree hash for a file and its dependencies.
|
* Gets contract dependendencies and keccak256 hash from source.
|
||||||
* @param fileName Name of contract file.
|
* @param source Source code of contract.
|
||||||
|
* @return Object with contract dependencies and keccak256 hash of source.
|
||||||
*/
|
*/
|
||||||
private _setSourceTreeHash(fileName: string): void {
|
private _setContractSpecificSourceData(source: string, fileName: string): void {
|
||||||
const contractSpecificSourceData = this._contractSourceData[fileName];
|
if (!_.isUndefined(this._contractSourceData[fileName])) {
|
||||||
if (_.isUndefined(contractSpecificSourceData)) {
|
return;
|
||||||
throw new Error(`Contract data for ${fileName} not yet set`);
|
|
||||||
}
|
}
|
||||||
if (_.isUndefined(contractSpecificSourceData.sourceTreeHashIfExists)) {
|
const sourceHash = ethUtil.sha3(source);
|
||||||
const dependencies = contractSpecificSourceData.dependencies;
|
const solcVersionRange = parseSolidityVersionRange(source);
|
||||||
if (dependencies.length === 0) {
|
const dependencies = parseDependencies(source);
|
||||||
contractSpecificSourceData.sourceTreeHashIfExists = contractSpecificSourceData.sourceHash;
|
const sourceTreeHash = this._getSourceTreeHash(fileName, sourceHash, dependencies);
|
||||||
} else {
|
this._contractSourceData[fileName] = {
|
||||||
_.forEach(dependencies, dependency => {
|
|
||||||
this._setSourceTreeHash(dependency);
|
|
||||||
});
|
|
||||||
const dependencySourceTreeHashes = _.map(
|
|
||||||
dependencies,
|
dependencies,
|
||||||
dependency => this._contractSourceData[dependency].sourceTreeHashIfExists,
|
solcVersionRange,
|
||||||
);
|
sourceHash,
|
||||||
const sourceTreeHashesBuffer = Buffer.concat([
|
sourceTreeHash,
|
||||||
contractSpecificSourceData.sourceHash,
|
|
||||||
...dependencySourceTreeHashes,
|
|
||||||
]);
|
|
||||||
contractSpecificSourceData.sourceTreeHashIfExists = ethUtil.sha3(sourceTreeHashesBuffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Callback to resolve dependencies with `solc.compile`.
|
|
||||||
* Throws error if contractSources not yet initialized.
|
|
||||||
* @param importPath Path to an imported dependency.
|
|
||||||
* @return Import contents object containing source code of dependency.
|
|
||||||
*/
|
|
||||||
private _findImportsIfSourcesExist(importPath: string): solc.ImportContents {
|
|
||||||
const fileName = path.basename(importPath);
|
|
||||||
const source = this._contractSources[fileName];
|
|
||||||
if (_.isUndefined(source)) {
|
|
||||||
throw new Error(`Contract source not found for ${fileName}`);
|
|
||||||
}
|
|
||||||
const importContents: solc.ImportContents = {
|
|
||||||
contents: source,
|
|
||||||
};
|
};
|
||||||
return importContents;
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Creates the artifacts directory if it does not already exist.
|
* Gets the source tree hash for a file and its dependencies.
|
||||||
*/
|
|
||||||
private async _createArtifactsDirIfDoesNotExistAsync(): Promise<void> {
|
|
||||||
if (!fsWrapper.doesPathExistSync(this._artifactsDir)) {
|
|
||||||
logUtils.log('Creating artifacts directory...');
|
|
||||||
await fsWrapper.mkdirAsync(this._artifactsDir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Gets contract data on network or returns if an artifact does not exist.
|
|
||||||
* @param fileName Name of contract file.
|
* @param fileName Name of contract file.
|
||||||
* @return Contract data on network or undefined.
|
|
||||||
*/
|
*/
|
||||||
private async _getContractArtifactIfExistsAsync(fileName: string): Promise<ContractArtifact | void> {
|
private _getSourceTreeHash(fileName: string, sourceHash: Buffer, dependencies: string[]): Buffer {
|
||||||
let contractArtifact;
|
if (dependencies.length === 0) {
|
||||||
const contractName = path.basename(fileName, constants.SOLIDITY_FILE_EXTENSION);
|
return sourceHash;
|
||||||
const currentArtifactPath = `${this._artifactsDir}/${contractName}.json`;
|
} else {
|
||||||
try {
|
const dependencySourceTreeHashes = _.map(dependencies, dependency => {
|
||||||
const opts = {
|
const source = this._contractSources[dependency];
|
||||||
encoding: 'utf8',
|
this._setContractSpecificSourceData(source, dependency);
|
||||||
};
|
const sourceData = this._contractSourceData[dependency];
|
||||||
const contractArtifactString = await fsWrapper.readFileAsync(currentArtifactPath, opts);
|
return this._getSourceTreeHash(dependency, sourceData.sourceHash, sourceData.dependencies);
|
||||||
contractArtifact = JSON.parse(contractArtifactString);
|
});
|
||||||
return contractArtifact;
|
const sourceTreeHashesBuffer = Buffer.concat([sourceHash, ...dependencySourceTreeHashes]);
|
||||||
} catch (err) {
|
const sourceTreeHash = ethUtil.sha3(sourceTreeHashesBuffer);
|
||||||
logUtils.log(`Artifact for ${fileName} does not exist`);
|
return sourceTreeHash;
|
||||||
return undefined;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { AbiType, TxData } from '@0xproject/types';
|
import { AbiType, ConstructorAbi, ContractAbi, TxData } from '@0xproject/types';
|
||||||
import { logUtils } from '@0xproject/utils';
|
import { logUtils } from '@0xproject/utils';
|
||||||
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
@@ -19,12 +19,21 @@ import { utils } from './utils/utils';
|
|||||||
// 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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Deployer facilitates deploying Solidity smart contracts to the blockchain.
|
||||||
|
* It can be used to build custom migration scripts.
|
||||||
|
*/
|
||||||
export class Deployer {
|
export class Deployer {
|
||||||
public web3Wrapper: Web3Wrapper;
|
public web3Wrapper: Web3Wrapper;
|
||||||
private _artifactsDir: string;
|
private _artifactsDir: string;
|
||||||
private _networkId: number;
|
private _networkId: number;
|
||||||
private _defaults: Partial<TxData>;
|
private _defaults: Partial<TxData>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiate a new instance of the Deployer class.
|
||||||
|
* @param opts Deployer options, including either an RPC url or Provider instance.
|
||||||
|
* @returns A Deployer instance
|
||||||
|
*/
|
||||||
constructor(opts: DeployerOptions) {
|
constructor(opts: DeployerOptions) {
|
||||||
this._artifactsDir = opts.artifactsDir;
|
this._artifactsDir = opts.artifactsDir;
|
||||||
this._networkId = opts.networkId;
|
this._networkId = opts.networkId;
|
||||||
@@ -42,8 +51,8 @@ export class Deployer {
|
|||||||
this.web3Wrapper = new Web3Wrapper(web3Provider, this._defaults);
|
this.web3Wrapper = new Web3Wrapper(web3Provider, this._defaults);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Loads contract artifact and deploys contract with given arguments.
|
* Loads a contract's corresponding artifacts and deploys it with the supplied constructor arguments.
|
||||||
* @param contractName Name of the contract to deploy. Must match name of an artifact in artifacts directory.
|
* @param contractName Name of the contract to deploy. Must match name of an artifact in supplied artifacts directory.
|
||||||
* @param args Array of contract constructor arguments.
|
* @param args Array of contract constructor arguments.
|
||||||
* @return Deployed contract instance.
|
* @return Deployed contract instance.
|
||||||
*/
|
*/
|
||||||
@@ -62,7 +71,7 @@ export class Deployer {
|
|||||||
gas,
|
gas,
|
||||||
};
|
};
|
||||||
const abi = contractNetworkDataIfExists.abi;
|
const abi = contractNetworkDataIfExists.abi;
|
||||||
const constructorAbi = _.find(abi, { type: AbiType.Constructor }) as Web3.ConstructorAbi;
|
const constructorAbi = _.find(abi, { type: AbiType.Constructor }) as ConstructorAbi;
|
||||||
const constructorArgs = _.isUndefined(constructorAbi) ? [] : constructorAbi.inputs;
|
const constructorArgs = _.isUndefined(constructorAbi) ? [] : constructorAbi.inputs;
|
||||||
if (constructorArgs.length !== args.length) {
|
if (constructorArgs.length !== args.length) {
|
||||||
const constructorSignature = `constructor(${_.map(constructorArgs, arg => `${arg.type} ${arg.name}`).join(
|
const constructorSignature = `constructor(${_.map(constructorArgs, arg => `${arg.type} ${arg.name}`).join(
|
||||||
@@ -80,7 +89,8 @@ export class Deployer {
|
|||||||
return contractInstance;
|
return contractInstance;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Loads contract artifact, deploys with given arguments, and saves updated data to artifact.
|
* Loads a contract's artifact, deploys it with supplied constructor arguments, and saves the updated data
|
||||||
|
* back to the artifact file.
|
||||||
* @param contractName Name of the contract to deploy. Must match name of an artifact in artifacts directory.
|
* @param contractName Name of the contract to deploy. Must match name of an artifact in artifacts directory.
|
||||||
* @param args Array of contract constructor arguments.
|
* @param args Array of contract constructor arguments.
|
||||||
* @return Deployed contract instance.
|
* @return Deployed contract instance.
|
||||||
@@ -97,7 +107,7 @@ export class Deployer {
|
|||||||
* @param txData Tx options used for deployment.
|
* @param txData Tx options used for deployment.
|
||||||
* @return Promise that resolves to a web3 contract instance.
|
* @return Promise that resolves to a web3 contract instance.
|
||||||
*/
|
*/
|
||||||
private async _deployFromAbiAsync(abi: Web3.ContractAbi, args: any[], txData: Web3.TxData): Promise<any> {
|
private async _deployFromAbiAsync(abi: ContractAbi, args: any[], txData: TxData): Promise<any> {
|
||||||
const contract: Web3.Contract<Web3.ContractInstance> = this.web3Wrapper.getContractFromAbi(abi);
|
const contract: Web3.Contract<Web3.ContractInstance> = this.web3Wrapper.getContractFromAbi(abi);
|
||||||
const deployPromise = new Promise((resolve, reject) => {
|
const deployPromise = new Promise((resolve, reject) => {
|
||||||
/**
|
/**
|
||||||
|
45
packages/deployer/src/globals.d.ts
vendored
45
packages/deployer/src/globals.d.ts
vendored
@@ -1,48 +1,3 @@
|
|||||||
// tslint:disable:completed-docs
|
|
||||||
declare module 'solc' {
|
|
||||||
import * as Web3 from 'web3';
|
|
||||||
export interface ContractCompilationResult {
|
|
||||||
srcmap: string;
|
|
||||||
srcmapRuntime: string;
|
|
||||||
bytecode: string;
|
|
||||||
runtimeBytecode: string;
|
|
||||||
interface: string;
|
|
||||||
}
|
|
||||||
export interface CompilationResult {
|
|
||||||
errors: string[];
|
|
||||||
contracts: {
|
|
||||||
[contractIdentifier: string]: ContractCompilationResult;
|
|
||||||
};
|
|
||||||
sources: {
|
|
||||||
[sourceName: string]: {
|
|
||||||
AST: any;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
sourceList: string[];
|
|
||||||
}
|
|
||||||
export interface ImportContents {
|
|
||||||
contents: string;
|
|
||||||
}
|
|
||||||
export interface InputSources {
|
|
||||||
sources: {
|
|
||||||
[fileName: string]: string;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
export interface SolcInstance {
|
|
||||||
compile(
|
|
||||||
sources: InputSources,
|
|
||||||
optimizerEnabled: number,
|
|
||||||
findImports: (importPath: string) => ImportContents,
|
|
||||||
): CompilationResult;
|
|
||||||
}
|
|
||||||
export function loadRemoteVersion(versionName: string, cb: (err: Error | null, res?: SolcInstance) => void): void;
|
|
||||||
export function setupMethods(solcBin: any): SolcInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
declare module 'web3-eth-abi' {
|
|
||||||
export function encodeParameters(typesArray: string[], parameters: any[]): string;
|
|
||||||
}
|
|
||||||
|
|
||||||
declare module '*.json' {
|
declare module '*.json' {
|
||||||
const json: any;
|
const json: any;
|
||||||
/* tslint:disable */
|
/* tslint:disable */
|
||||||
|
@@ -5,4 +5,4 @@ import * as tsConfigJSON from '../tsconfig.json';
|
|||||||
|
|
||||||
const cwd = `${__dirname}/..`;
|
const cwd = `${__dirname}/..`;
|
||||||
// tslint:disable-next-line:no-floating-promises
|
// tslint:disable-next-line:no-floating-promises
|
||||||
postpublishUtils.runAsync(packageJSON, tsConfigJSON, cwd);
|
postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd);
|
123
packages/deployer/src/utils/compiler.ts
Normal file
123
packages/deployer/src/utils/compiler.ts
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
import { logUtils } from '@0xproject/utils';
|
||||||
|
import * as _ from 'lodash';
|
||||||
|
import * as path from 'path';
|
||||||
|
import * as solc from 'solc';
|
||||||
|
|
||||||
|
import { constants } from './constants';
|
||||||
|
import { fsWrapper } from './fs_wrapper';
|
||||||
|
import { ContractArtifact, ContractSources } from './types';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets contract data on network or returns if an artifact does not exist.
|
||||||
|
* @param artifactsDir Path to the artifacts directory.
|
||||||
|
* @param fileName Name of contract file.
|
||||||
|
* @return Contract data on network or undefined.
|
||||||
|
*/
|
||||||
|
export async function getContractArtifactIfExistsAsync(
|
||||||
|
artifactsDir: string,
|
||||||
|
fileName: string,
|
||||||
|
): Promise<ContractArtifact | void> {
|
||||||
|
let contractArtifact;
|
||||||
|
const contractName = path.basename(fileName, constants.SOLIDITY_FILE_EXTENSION);
|
||||||
|
const currentArtifactPath = `${artifactsDir}/${contractName}.json`;
|
||||||
|
try {
|
||||||
|
const opts = {
|
||||||
|
encoding: 'utf8',
|
||||||
|
};
|
||||||
|
const contractArtifactString = await fsWrapper.readFileAsync(currentArtifactPath, opts);
|
||||||
|
contractArtifact = JSON.parse(contractArtifactString);
|
||||||
|
return contractArtifact;
|
||||||
|
} catch (err) {
|
||||||
|
logUtils.log(`Artifact for ${fileName} does not exist`);
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a directory if it does not already exist.
|
||||||
|
* @param artifactsDir Path to the directory.
|
||||||
|
*/
|
||||||
|
export async function createDirIfDoesNotExistAsync(dirPath: string): Promise<void> {
|
||||||
|
if (!fsWrapper.doesPathExistSync(dirPath)) {
|
||||||
|
logUtils.log(`Creating directory at ${dirPath}...`);
|
||||||
|
await fsWrapper.mkdirAsync(dirPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Searches Solidity source code for compiler version range.
|
||||||
|
* @param source Source code of contract.
|
||||||
|
* @return Solc compiler version range.
|
||||||
|
*/
|
||||||
|
export function parseSolidityVersionRange(source: string): string {
|
||||||
|
const SOLIDITY_VERSION_RANGE_REGEX = /pragma\s+solidity\s+(.*);/;
|
||||||
|
const solcVersionRangeMatch = source.match(SOLIDITY_VERSION_RANGE_REGEX);
|
||||||
|
if (_.isNull(solcVersionRangeMatch)) {
|
||||||
|
throw new Error('Could not find Solidity version range in source');
|
||||||
|
}
|
||||||
|
const solcVersionRange = solcVersionRangeMatch[1];
|
||||||
|
return solcVersionRange;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalizes the path found in the error message.
|
||||||
|
* Example: converts 'base/Token.sol:6:46: Warning: Unused local variable'
|
||||||
|
* to 'Token.sol:6:46: Warning: Unused local variable'
|
||||||
|
* This is used to prevent logging the same error multiple times.
|
||||||
|
* @param errMsg An error message from the compiled output.
|
||||||
|
* @return The error message with directories truncated from the contract path.
|
||||||
|
*/
|
||||||
|
export function getNormalizedErrMsg(errMsg: string): string {
|
||||||
|
const SOLIDITY_FILE_EXTENSION_REGEX = /(.*\.sol)/;
|
||||||
|
const errPathMatch = errMsg.match(SOLIDITY_FILE_EXTENSION_REGEX);
|
||||||
|
if (_.isNull(errPathMatch)) {
|
||||||
|
throw new Error('Could not find a path in error message');
|
||||||
|
}
|
||||||
|
const errPath = errPathMatch[0];
|
||||||
|
const baseContract = path.basename(errPath);
|
||||||
|
const normalizedErrMsg = errMsg.replace(errPath, baseContract);
|
||||||
|
return normalizedErrMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the contract source code and extracts the dendencies
|
||||||
|
* @param source Contract source code
|
||||||
|
* @return List of dependendencies
|
||||||
|
*/
|
||||||
|
export function parseDependencies(source: string): string[] {
|
||||||
|
// TODO: Use a proper parser
|
||||||
|
const IMPORT_REGEX = /(import\s)/;
|
||||||
|
const DEPENDENCY_PATH_REGEX = /"([^"]+)"/; // Source: https://github.com/BlockChainCompany/soljitsu/blob/master/lib/shared.js
|
||||||
|
const dependencies: string[] = [];
|
||||||
|
const lines = source.split('\n');
|
||||||
|
_.forEach(lines, line => {
|
||||||
|
if (!_.isNull(line.match(IMPORT_REGEX))) {
|
||||||
|
const dependencyMatch = line.match(DEPENDENCY_PATH_REGEX);
|
||||||
|
if (!_.isNull(dependencyMatch)) {
|
||||||
|
const dependencyPath = dependencyMatch[1];
|
||||||
|
const basenName = path.basename(dependencyPath);
|
||||||
|
dependencies.push(basenName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return dependencies;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback to resolve dependencies with `solc.compile`.
|
||||||
|
* Throws error if contractSources not yet initialized.
|
||||||
|
* @param contractSources Source codes of contracts.
|
||||||
|
* @param importPath Path to an imported dependency.
|
||||||
|
* @return Import contents object containing source code of dependency.
|
||||||
|
*/
|
||||||
|
export function findImportIfExist(contractSources: ContractSources, importPath: string): solc.ImportContents {
|
||||||
|
const fileName = path.basename(importPath);
|
||||||
|
const source = contractSources[fileName];
|
||||||
|
if (_.isUndefined(source)) {
|
||||||
|
throw new Error(`Contract source not found for ${fileName}`);
|
||||||
|
}
|
||||||
|
const importContents: solc.ImportContents = {
|
||||||
|
contents: source,
|
||||||
|
};
|
||||||
|
return importContents;
|
||||||
|
}
|
@@ -1,4 +1,5 @@
|
|||||||
import { schemas, SchemaValidator } from '@0xproject/json-schemas';
|
import { schemas, SchemaValidator } from '@0xproject/json-schemas';
|
||||||
|
import { ContractAbi, EventAbi, FunctionAbi, MethodAbi, TxData } from '@0xproject/types';
|
||||||
import { promisify } from '@0xproject/utils';
|
import { promisify } from '@0xproject/utils';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as Web3 from 'web3';
|
import * as Web3 from 'web3';
|
||||||
@@ -7,14 +8,14 @@ import { AbiType } from './types';
|
|||||||
|
|
||||||
export class Contract implements Web3.ContractInstance {
|
export class Contract implements Web3.ContractInstance {
|
||||||
public address: string;
|
public address: string;
|
||||||
public abi: Web3.ContractAbi;
|
public abi: ContractAbi;
|
||||||
private _contract: Web3.ContractInstance;
|
private _contract: Web3.ContractInstance;
|
||||||
private _defaults: Partial<Web3.TxData>;
|
private _defaults: Partial<TxData>;
|
||||||
private _validator: SchemaValidator;
|
private _validator: SchemaValidator;
|
||||||
// This class instance is going to be populated with functions and events depending on the ABI
|
// This class instance is going to be populated with functions and events depending on the ABI
|
||||||
// and we don't know their types in advance
|
// and we don't know their types in advance
|
||||||
[name: string]: any;
|
[name: string]: any;
|
||||||
constructor(web3ContractInstance: Web3.ContractInstance, defaults: Partial<Web3.TxData>) {
|
constructor(web3ContractInstance: Web3.ContractInstance, defaults: Partial<TxData>) {
|
||||||
this._contract = web3ContractInstance;
|
this._contract = web3ContractInstance;
|
||||||
this.address = web3ContractInstance.address;
|
this.address = web3ContractInstance.address;
|
||||||
this.abi = web3ContractInstance.abi;
|
this.abi = web3ContractInstance.abi;
|
||||||
@@ -24,8 +25,8 @@ export class Contract implements Web3.ContractInstance {
|
|||||||
this._validator = new SchemaValidator();
|
this._validator = new SchemaValidator();
|
||||||
}
|
}
|
||||||
private _populateFunctions(): void {
|
private _populateFunctions(): void {
|
||||||
const functionsAbi = _.filter(this.abi, abiPart => abiPart.type === AbiType.Function) as Web3.FunctionAbi[];
|
const functionsAbi = _.filter(this.abi, abiPart => abiPart.type === AbiType.Function) as FunctionAbi[];
|
||||||
_.forEach(functionsAbi, (functionAbi: Web3.MethodAbi) => {
|
_.forEach(functionsAbi, (functionAbi: MethodAbi) => {
|
||||||
if (functionAbi.constant) {
|
if (functionAbi.constant) {
|
||||||
const cbStyleCallFunction = this._contract[functionAbi.name].call;
|
const cbStyleCallFunction = this._contract[functionAbi.name].call;
|
||||||
this[functionAbi.name] = promisify(cbStyleCallFunction, this._contract);
|
this[functionAbi.name] = promisify(cbStyleCallFunction, this._contract);
|
||||||
@@ -42,8 +43,8 @@ export class Contract implements Web3.ContractInstance {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
private _populateEvents(): void {
|
private _populateEvents(): void {
|
||||||
const eventsAbi = _.filter(this.abi, abiPart => abiPart.type === AbiType.Event) as Web3.EventAbi[];
|
const eventsAbi = _.filter(this.abi, abiPart => abiPart.type === AbiType.Event) as EventAbi[];
|
||||||
_.forEach(eventsAbi, (eventAbi: Web3.EventAbi) => {
|
_.forEach(eventsAbi, (eventAbi: EventAbi) => {
|
||||||
this[eventAbi.name] = this._contract[eventAbi.name];
|
this[eventAbi.name] = this._contract[eventAbi.name];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -51,7 +52,7 @@ export class Contract implements Web3.ContractInstance {
|
|||||||
const promisifiedWithDefaultParams = async (...args: any[]) => {
|
const promisifiedWithDefaultParams = async (...args: any[]) => {
|
||||||
const promise = new Promise((resolve, reject) => {
|
const promise = new Promise((resolve, reject) => {
|
||||||
const lastArg = args[args.length - 1];
|
const lastArg = args[args.length - 1];
|
||||||
let txData: Partial<Web3.TxData> = {};
|
let txData: Partial<TxData> = {};
|
||||||
if (this._isTxData(lastArg)) {
|
if (this._isTxData(lastArg)) {
|
||||||
txData = args.pop();
|
txData = args.pop();
|
||||||
}
|
}
|
||||||
|
@@ -1,15 +1,15 @@
|
|||||||
|
import { AbiDefinition, ContractAbi, DataItem } from '@0xproject/types';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as Web3 from 'web3';
|
|
||||||
import * as web3Abi from 'web3-eth-abi';
|
import * as web3Abi from 'web3-eth-abi';
|
||||||
|
|
||||||
import { AbiType } from './types';
|
import { AbiType } from './types';
|
||||||
|
|
||||||
export const encoder = {
|
export const encoder = {
|
||||||
encodeConstructorArgsFromAbi(args: any[], abi: Web3.ContractAbi): string {
|
encodeConstructorArgsFromAbi(args: any[], abi: ContractAbi): string {
|
||||||
const constructorTypes: string[] = [];
|
const constructorTypes: string[] = [];
|
||||||
_.each(abi, (element: Web3.AbiDefinition) => {
|
_.each(abi, (element: AbiDefinition) => {
|
||||||
if (element.type === AbiType.Constructor) {
|
if (element.type === AbiType.Constructor) {
|
||||||
_.each(element.inputs, (input: Web3.DataItem) => {
|
_.each(element.inputs, (input: DataItem) => {
|
||||||
constructorTypes.push(input.type);
|
constructorTypes.push(input.type);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
18
packages/deployer/src/utils/error_reporter.ts
Normal file
18
packages/deployer/src/utils/error_reporter.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import { logUtils } from '@0xproject/utils';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes an async function no-throw printing errors to the console
|
||||||
|
* @param asyncFn async function to wrap
|
||||||
|
* @return Wrapped version of the passed function
|
||||||
|
*/
|
||||||
|
export function consoleReporter<T>(asyncFn: (arg: T) => Promise<void>): (arg: T) => Promise<void> {
|
||||||
|
const noThrowFnAsync = async (arg: T) => {
|
||||||
|
try {
|
||||||
|
const result = await asyncFn(arg);
|
||||||
|
return result;
|
||||||
|
} catch (err) {
|
||||||
|
logUtils.log(`${err}`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return noThrowFnAsync;
|
||||||
|
}
|
@@ -7,5 +7,6 @@ export const fsWrapper = {
|
|||||||
writeFileAsync: promisify<undefined>(fs.writeFile),
|
writeFileAsync: promisify<undefined>(fs.writeFile),
|
||||||
mkdirAsync: promisify<undefined>(fs.mkdir),
|
mkdirAsync: promisify<undefined>(fs.mkdir),
|
||||||
doesPathExistSync: fs.existsSync,
|
doesPathExistSync: fs.existsSync,
|
||||||
|
rmdirSync: fs.rmdirSync,
|
||||||
removeFileAsync: promisify<undefined>(fs.unlink),
|
removeFileAsync: promisify<undefined>(fs.unlink),
|
||||||
};
|
};
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { TxData } from '@0xproject/types';
|
import { ContractAbi, TxData } from '@0xproject/types';
|
||||||
import * as Web3 from 'web3';
|
import * as Web3 from 'web3';
|
||||||
import * as yargs from 'yargs';
|
import * as yargs from 'yargs';
|
||||||
|
|
||||||
@@ -20,10 +20,10 @@ export interface ContractNetworks {
|
|||||||
|
|
||||||
export interface ContractNetworkData {
|
export interface ContractNetworkData {
|
||||||
solc_version: string;
|
solc_version: string;
|
||||||
optimizer_enabled: number;
|
optimizer_enabled: boolean;
|
||||||
keccak256: string;
|
keccak256: string;
|
||||||
source_tree_hash: string;
|
source_tree_hash: string;
|
||||||
abi: Web3.ContractAbi;
|
abi: ContractAbi;
|
||||||
bytecode: string;
|
bytecode: string;
|
||||||
runtime_bytecode: string;
|
runtime_bytecode: string;
|
||||||
address?: string;
|
address?: string;
|
||||||
@@ -53,7 +53,7 @@ export interface CliOptions extends yargs.Arguments {
|
|||||||
export interface CompilerOptions {
|
export interface CompilerOptions {
|
||||||
contractsDir: string;
|
contractsDir: string;
|
||||||
networkId: number;
|
networkId: number;
|
||||||
optimizerEnabled: number;
|
optimizerEnabled: boolean;
|
||||||
artifactsDir: string;
|
artifactsDir: string;
|
||||||
specifiedContracts: Set<string>;
|
specifiedContracts: Set<string>;
|
||||||
}
|
}
|
||||||
@@ -84,27 +84,9 @@ export interface ContractSourceData {
|
|||||||
|
|
||||||
export interface ContractSpecificSourceData {
|
export interface ContractSpecificSourceData {
|
||||||
dependencies: string[];
|
dependencies: string[];
|
||||||
solcVersion: string;
|
solcVersionRange: string;
|
||||||
sourceHash: Buffer;
|
sourceHash: Buffer;
|
||||||
sourceTreeHashIfExists?: Buffer;
|
sourceTreeHash: Buffer;
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Consolidate with 0x.js definitions once types are moved into a separate package.
|
|
||||||
export enum ZeroExError {
|
|
||||||
ContractDoesNotExist = 'CONTRACT_DOES_NOT_EXIST',
|
|
||||||
ExchangeContractDoesNotExist = 'EXCHANGE_CONTRACT_DOES_NOT_EXIST',
|
|
||||||
UnhandledError = 'UNHANDLED_ERROR',
|
|
||||||
UserHasNoAssociatedAddress = 'USER_HAS_NO_ASSOCIATED_ADDRESSES',
|
|
||||||
InvalidSignature = 'INVALID_SIGNATURE',
|
|
||||||
ContractNotDeployedOnNetwork = 'CONTRACT_NOT_DEPLOYED_ON_NETWORK',
|
|
||||||
InsufficientAllowanceForTransfer = 'INSUFFICIENT_ALLOWANCE_FOR_TRANSFER',
|
|
||||||
InsufficientBalanceForTransfer = 'INSUFFICIENT_BALANCE_FOR_TRANSFER',
|
|
||||||
InsufficientEthBalanceForDeposit = 'INSUFFICIENT_ETH_BALANCE_FOR_DEPOSIT',
|
|
||||||
InsufficientWEthBalanceForWithdrawal = 'INSUFFICIENT_WETH_BALANCE_FOR_WITHDRAWAL',
|
|
||||||
InvalidJump = 'INVALID_JUMP',
|
|
||||||
OutOfGas = 'OUT_OF_GAS',
|
|
||||||
NoNetworkId = 'NO_NETWORK_ID',
|
|
||||||
SubscriptionNotFound = 'SUBSCRIPTION_NOT_FOUND',
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Token {
|
export interface Token {
|
||||||
|
47
packages/deployer/test/compiler_test.ts
Normal file
47
packages/deployer/test/compiler_test.ts
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
import * as chai from 'chai';
|
||||||
|
import 'mocha';
|
||||||
|
|
||||||
|
import { Compiler } from '../src/compiler';
|
||||||
|
import { fsWrapper } from '../src/utils/fs_wrapper';
|
||||||
|
import { CompilerOptions, ContractArtifact, ContractNetworkData, DoneCallback } from '../src/utils/types';
|
||||||
|
|
||||||
|
import { exchange_binary } from './fixtures/exchange_bin';
|
||||||
|
import { constants } from './util/constants';
|
||||||
|
|
||||||
|
const expect = chai.expect;
|
||||||
|
|
||||||
|
describe('#Compiler', function() {
|
||||||
|
this.timeout(constants.timeoutMs);
|
||||||
|
const artifactsDir = `${__dirname}/fixtures/artifacts`;
|
||||||
|
const contractsDir = `${__dirname}/fixtures/contracts`;
|
||||||
|
const exchangeArtifactPath = `${artifactsDir}/Exchange.json`;
|
||||||
|
const compilerOpts: CompilerOptions = {
|
||||||
|
artifactsDir,
|
||||||
|
contractsDir,
|
||||||
|
networkId: constants.networkId,
|
||||||
|
optimizerEnabled: constants.optimizerEnabled,
|
||||||
|
specifiedContracts: new Set(constants.specifiedContracts),
|
||||||
|
};
|
||||||
|
const compiler = new Compiler(compilerOpts);
|
||||||
|
beforeEach((done: DoneCallback) => {
|
||||||
|
(async () => {
|
||||||
|
if (fsWrapper.doesPathExistSync(exchangeArtifactPath)) {
|
||||||
|
await fsWrapper.removeFileAsync(exchangeArtifactPath);
|
||||||
|
}
|
||||||
|
await compiler.compileAsync();
|
||||||
|
done();
|
||||||
|
})().catch(done);
|
||||||
|
});
|
||||||
|
it('should create an Exchange artifact with the correct unlinked binary', async () => {
|
||||||
|
const opts = {
|
||||||
|
encoding: 'utf8',
|
||||||
|
};
|
||||||
|
const exchangeArtifactString = await fsWrapper.readFileAsync(exchangeArtifactPath, opts);
|
||||||
|
const exchangeArtifact: ContractArtifact = JSON.parse(exchangeArtifactString);
|
||||||
|
const exchangeContractData: ContractNetworkData = exchangeArtifact.networks[constants.networkId];
|
||||||
|
// The last 43 bytes of the binaries are metadata which may not be equivalent
|
||||||
|
const unlinkedBinaryWithoutMetadata = exchangeContractData.bytecode.slice(0, -86);
|
||||||
|
const exchangeBinaryWithoutMetadata = exchange_binary.slice(0, -86);
|
||||||
|
expect(unlinkedBinaryWithoutMetadata).to.equal(exchangeBinaryWithoutMetadata);
|
||||||
|
});
|
||||||
|
});
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user