Compare commits

..

120 Commits

Author SHA1 Message Date
Leonid Logvinov
ef32822b31 Move @0xproject/types to dependencies 2018-01-29 21:16:10 +01:00
Amir Bandeali
e588f6f8c3 Merge pull request #338 from joincivil/feature/transaction-receipt
Fix getTransactionReceipt not returning null
2018-01-26 09:04:18 -08:00
Olaf Tomalka
d227f2ad7c Updated web3-typescript-typings changelog 2018-01-25 23:53:38 +01:00
Olaf Tomalka
97c228031a Fixed getTransactionReceipt not returning null 2018-01-25 23:52:24 +01:00
Amir Bandeali
ad85011d62 Merge pull request #337 from 0xProject/feature/0x.js/update-artifacts
Add Rinkeby addresses to artifacts
2018-01-25 12:03:58 -08:00
Amir Bandeali
a70379625d Run prettier 2018-01-25 10:55:06 -08:00
Amir Bandeali
7350333129 Update changelog 2018-01-25 10:53:44 -08:00
Amir Bandeali
216420fdc5 Add Rinkeby addresses to artifacts 2018-01-25 10:53:44 -08:00
Brandon Millman
c559fbbe8c Merge pull request #339 from 0xProject/feature/kovan-faucets/all-testnet-support
Add support for all testnets to the faucet
2018-01-25 10:48:41 -08:00
Brandon Millman
390534497e Fix bad merge on package.json 2018-01-24 22:33:33 -08:00
Brandon Millman
3f0ec89f11 Merge branch 'development' into feature/kovan-faucets/all-testnet-support
* development:
  Publish
  Update yarn.lock
  Update the CHANGELOG
  Fix the bug making it impossible to specify the custom ZRX address
2018-01-24 17:13:16 -08:00
Brandon Millman
d3aa4f2bc7 Respond to GH comments and add /info endpoint 2018-01-24 17:11:14 -08:00
Leonid Logvinov
f58f0ddb67 Publish
- 0x.js@0.30.1
 - @0xproject/abi-gen@0.1.3
 - @0xproject/assert@0.0.12
 - chai-as-promised-typescript-typings@0.0.5
 - @0xproject/connect@0.5.1
 - contracts@2.1.5
 - @0xproject/deployer@0.0.2
 - @0xproject/dev-utils@0.0.6
 - @0xproject/json-schemas@0.7.4
 - @0xproject/kovan_faucets@1.0.6
 - @0xproject/monorepo-scripts@0.1.5
 - @0xproject/subproviders@0.3.2
 - @0xproject/tslint-config@0.4.3
 - @0xproject/types@0.1.5
 - @0xproject/utils@0.2.1
 - web3-typescript-typings@0.9.5
 - @0xproject/web3-wrapper@0.1.6
 - @0xproject/website@0.0.8
2018-01-24 17:02:13 +01:00
Leonid Logvinov
633e3129d4 Update yarn.lock 2018-01-24 17:01:27 +01:00
Leonid
877bdce4c8 Merge pull request #341 from 0xProject/fix/zrx-address
Fix the bug making it impossible to specify the custom ZRX address
2018-01-24 15:25:29 +01:00
Leonid Logvinov
6e1fbd2d97 Update the CHANGELOG 2018-01-24 15:20:03 +01:00
Leonid Logvinov
36bfe62a8f Fix the bug making it impossible to specify the custom ZRX address 2018-01-24 15:17:56 +01:00
Brandon Millman
b08bd0f9ab Change package name to @0xproject/testnet-faucets 2018-01-23 18:02:30 -08:00
Brandon Millman
3998b47d84 Implement testnet faucets for any testnet available via infura 2018-01-23 17:42:35 -08:00
Brandon Millman
d965fdb11d Rename to testnet-faucets 2018-01-23 10:10:43 -08:00
Fabio Berger
8a858501f2 Fix fill/cancel order by looking for NoError instead of empty blockchainErr given the BlockchainErrs type refactor 2018-01-21 17:48:32 +01:00
Leonid
e1af25c8a6 Merge pull request #323 from 0xProject/feature/separate-deployer
Move deployer to a separate package
2018-01-19 13:43:32 +01:00
Leonid
6091f818da Merge branch 'development' into feature/separate-deployer 2018-01-19 13:39:57 +01:00
Leonid Logvinov
a45f9b4802 Add a comment about a yarn bug 2018-01-19 13:37:41 +01:00
Fabio Berger
9ccf63b44a Add our mainnet and kovan nodes as backups for Portal requests 2018-01-19 11:33:35 +08:00
Fabio Berger
d34135ae43 Fix bug hiding the user info from topBar 2018-01-19 11:26:03 +08:00
Jacob Evans
a81f6f9ad1 Merge pull request #328 from 0xProject/fix/website/alphanumeric-token-symbol
Allow Token symbols to be alphanumeric
2018-01-19 13:41:29 +11:00
Brandon Millman
8a80b10cc2 Add dev-utils package to top level README 2018-01-18 17:23:29 -08:00
Jacob Evans
22b1ee132a Merge pull request #324 from 0xProject/fix/0x.js/negativeFillValues
Reject negative amounts in public methods
2018-01-19 12:19:14 +11:00
Jacob Evans
ab7f681f15 Prettier newline 2018-01-19 11:35:02 +11:00
Jacob Evans
2ac806ef08 Prettier 2018-01-19 10:51:57 +11:00
Jacob Evans
13ec8ed03c Allow Token symbols to be alphanumeric 2018-01-19 10:42:37 +11:00
Jacob Evans
fb77817c2d Update CHANGELOG, rebase on development 2018-01-19 10:33:25 +11:00
Jacob Evans
ceb8a492b1 Should not -> cannot 2018-01-19 10:31:06 +11:00
Jacob Evans
cfc868bf4d Reject negative amounts in isValidBaseUnitAmount 2018-01-19 10:31:06 +11:00
Fabio Berger
7b4e2257d8 Re-add changelog for 0x.js 2018-01-19 10:31:06 +11:00
Brandon Millman
4ac6e5477d Merge pull request #326 from 0xProject/greenkeeper/@0xproject/utils-0.2.0
Update @0xproject/utils to the latest version 🚀
2018-01-18 14:50:15 -08:00
Leonid Logvinov
614ea14a7f Fix prettier 2018-01-18 16:18:25 +01:00
Leonid Logvinov
ce45f99006 Update yarn.lock 2018-01-18 15:58:46 +01:00
Leonid
9203813a61 Merge pull request #325 from 0xProject/fix/portal-bugs
Small Fixes/Additions
2018-01-18 15:27:01 +01:00
Leonid Logvinov
ba987b0574 Move tests to a separate folder 2018-01-18 15:17:17 +01:00
Leonid Logvinov
b20f34adb7 Change file layout 2018-01-18 15:12:56 +01:00
Leonid Logvinov
63d0d810b1 Add bin definition 2018-01-18 14:44:53 +01:00
Leonid Logvinov
5491400684 Add postpublish scripts and README 2018-01-18 14:43:10 +01:00
Leonid Logvinov
6a5165e9b3 Fix a link 2018-01-18 14:39:41 +01:00
Leonid Logvinov
9a7c4442d2 Fix scopes 2018-01-18 14:34:35 +01:00
Leonid Logvinov
0e5363b5c3 Update yarn.lock 2018-01-18 14:26:32 +01:00
Leonid Logvinov
d41bce36be Fix merge conflicts 2018-01-18 14:23:54 +01:00
Leonid Logvinov
1380cd811e Fix CI config 2018-01-18 14:22:49 +01:00
Leonid Logvinov
d99bb3a87c Fix merge conflicts 2018-01-18 14:21:15 +01:00
Leonid Logvinov
4b9501318d Move deployer to a separate package 2018-01-18 14:18:51 +01:00
Leonid
e5eec04f92 Merge pull request #322 from 0xProject/fix/ci-time
Speed-up CI
2018-01-18 14:16:53 +01:00
Fabio Berger
f9c21efc30 Use intervalUtils.clearAsyncExcludingInterval instead of calling clearInterval directly for grepability 2018-01-18 19:29:54 +08:00
greenkeeper[bot]
ae72b71895 chore(package): update @0xproject/utils to version 0.2.0 2018-01-18 10:09:13 +00:00
Brandon Millman
87e3fe725d Run prettier to revert formatting changes made by the lerna publish step 2018-01-18 00:21:52 -08:00
Fabio Berger
807d9e3eef Add discourse forum to Community section of website footer 2018-01-18 15:20:34 +08:00
Fabio Berger
9e569b3791 Remove dead-code 2018-01-18 15:20:15 +08:00
Fabio Berger
024f093585 Fix Portal topbar so that it displays the mobile menu 2018-01-18 15:02:53 +08:00
Fabio Berger
996e9e9102 Add missing onError callbacks 2018-01-18 15:02:36 +08:00
Brandon Millman
d58bfb46cf Publish
- 0x.js@0.30.0
 - @0xproject/abi-gen@0.1.2
 - @0xproject/assert@0.0.11
 - chai-as-promised-typescript-typings@0.0.4
 - chai-typescript-typings@0.0.2
 - @0xproject/connect@0.5.0
 - contracts@2.1.4
 - @0xproject/dev-utils@0.0.5
 - @0xproject/json-schemas@0.7.3
 - @0xproject/kovan_faucets@1.0.5
 - @0xproject/monorepo-scripts@0.1.4
 - @0xproject/subproviders@0.3.1
 - @0xproject/tslint-config@0.4.2
 - @0xproject/types@0.1.4
 - @0xproject/utils@0.2.0
 - web3-typescript-typings@0.9.4
 - @0xproject/web3-wrapper@0.1.5
 - @0xproject/website@0.0.7
2018-01-17 22:45:09 -08:00
Fabio Berger
eb0d7df50b Fix balance page copy to refer to the Wrap ETH tab instead of a "convert" button 2018-01-18 14:27:12 +08:00
Brandon Millman
547bee38c0 Update CHANGELOG 2018-01-17 21:55:04 -08:00
Leonid
60614ba250 Merge pull request #321 from 0xProject/fix/fill-up-to-validation
Fix fillOrdersUpTo validation
2018-01-17 23:56:08 +01:00
Leonid Logvinov
278f68ae77 Fix the typos 2018-01-17 16:22:47 +01:00
Leonid Logvinov
b4375d6f64 Enable restrict-plus-operands and fix issues detected 2018-01-17 16:14:25 +01:00
Leonid Logvinov
9f47c72d31 Remove unused dependencies 2018-01-17 16:07:49 +01:00
Leonid Logvinov
de3bf03f42 Add --frozen-lockfile flag on CI 2018-01-17 15:55:58 +01:00
Leonid Logvinov
59a39ac57d Fix a stupid RPC bug which caused the port togo over 65535 2018-01-17 15:35:14 +01:00
Leonid Logvinov
df9c2b193e Remove trailing slash 2018-01-16 21:28:26 +01:00
Leonid Logvinov
3894311d68 Test deployer separately from contracts 2018-01-16 21:11:30 +01:00
Leonid Logvinov
35501dd4fc Fix ignore configuration 2018-01-16 16:17:20 +01:00
Leonid Logvinov
e2ca713658 Fix the glob pattern for exclusion 2018-01-16 16:03:06 +01:00
Leonid Logvinov
a45de6d427 Return is pensing events are undefined 2018-01-16 15:50:15 +01:00
Leonid Logvinov
a350638526 Upgrade testrpc to 6.0.3 to avoid some race-conditions 2018-01-16 15:40:20 +01:00
Leonid Logvinov
59f9605ed9 Run testrpc for rest tests 2018-01-16 15:26:15 +01:00
Leonid Logvinov
9521bf8d4f Separate contracts tests from others 2018-01-16 15:20:15 +01:00
Leonid Logvinov
7c1c94d39b Change cached directory 2018-01-16 14:36:04 +01:00
Leonid Logvinov
8a74963815 Respore dependency cache 2018-01-16 14:31:28 +01:00
Leonid Logvinov
3ebd8b7f45 Revert "Don't run testrpc for the rest of the tests"
This reverts commit ae8cb2e6a8.
2018-01-16 14:11:17 +01:00
Leonid Logvinov
ae8cb2e6a8 Don't run testrpc for the rest of the tests 2018-01-16 14:05:11 +01:00
Leonid Logvinov
1ccb978612 Split tests into two bundles 2018-01-16 14:04:02 +01:00
Leonid Logvinov
7040a01cf2 Remove umd tests 2018-01-16 14:01:46 +01:00
Leonid Logvinov
6bc0e815e9 Add caching between steps 2018-01-16 13:54:13 +01:00
Leonid Logvinov
593f7e826c Specify the executor 2018-01-16 13:45:36 +01:00
Leonid Logvinov
835fa0af13 Test workflow 2018-01-16 13:44:38 +01:00
Leonid
0e3bd0c6c1 Merge pull request #320 from joincivil/feature/default-account
Fix web3 typing defaultAccount not allowing `undefined`
2018-01-16 13:34:14 +01:00
Olaf Tomalka
86668eb7b9 Added PR number to web3 typings changelog 2018-01-16 13:24:53 +01:00
Leonid Logvinov
771f65c858 Update the CHANGELOG 2018-01-16 11:25:31 +01:00
Leonid Logvinov
89d6326a83 Fix fillOrdersUpTo balances validation 2018-01-16 11:22:04 +01:00
Leonid Logvinov
8b81ea162f Add a regression test for fillUpToValidation 2018-01-16 11:08:17 +01:00
Olaf Tomalka
a53e6db537 Fix web3 typing defaultAccount not allowing undefined
The default value for the defaultAccount property is undefined,
this happens in real-life scenarios, and so the type should
explicitly warn users about it
2018-01-15 16:02:42 +01:00
Leonid
62e3feeb94 Merge pull request #319 from 0xProject/feature/final-monorepo
Import last TS packages into the monorepo
2018-01-13 02:03:22 +01:00
Leonid
a950494503 Merge pull request #312 from 0xProject/feature/error-reporting-intervals
Better error handling on async/sync intervals
2018-01-13 00:51:23 +01:00
Leonid Logvinov
3cb310122e Sort packages alphabetically in README 2018-01-13 00:50:07 +01:00
Leonid Logvinov
feace988b4 Add postpublish scripts 2018-01-12 22:16:45 +01:00
Leonid Logvinov
6a56f20928 Return after checking for an error and add an explanatory comment 2018-01-12 21:39:51 +01:00
Brandon Millman
80a46d14be Merge pull request #318 from 0xProject/feature/httpClientErrorImprovements
Improve HttpClient errors
2018-01-12 12:18:03 -08:00
Brandon Millman
fbcbf066cd Stop appending /v0 to HttpClient api endpoint urls 2018-01-12 11:53:14 -08:00
Leonid Logvinov
4d30e1115f Add chai-as-promised-typescript-typings 2018-01-12 17:48:15 +01:00
Leonid Logvinov
897cfb491c Remove redundant type refs 2018-01-12 17:23:59 +01:00
Brandon Millman
c2c7512431 Improve HttpClient errors 2018-01-12 08:01:41 -08:00
Leonid Logvinov
568cf4d182 Add web3-typescript-typings and chai-as-promised-typescript-typings to the main monorepo 2018-01-12 16:55:16 +01:00
Leonid Logvinov
f54330f1c5 Import chai-as-promised-typescript-typings 2018-01-12 16:49:48 +01:00
Leonid Logvinov
97e01d7a42 Fix @bmilman linkedin link 2018-01-12 15:32:29 +01:00
Leonid
4be3e000e1 Merge pull request #317 from 0xProject/feature/new-team-members
[WIP] Add @tom and @dekz while removing @PhABC
2018-01-12 15:25:05 +01:00
Leonid Logvinov
b47baa9ee1 Add new team photos 2018-01-12 15:22:44 +01:00
Leonid Logvinov
f6c98112df Add a CHANGELOG to a website 2018-01-11 17:45:51 +01:00
Leonid Logvinov
94d29ab22e Add @tom and @dekz while removing @PhABC 2018-01-11 17:45:51 +01:00
Leonid Logvinov
b0b179550a Prettify package.json files 2018-01-11 17:45:36 +01:00
Leonid Logvinov
41c7ab4f9c Update dependencies in yarn.lock 2018-01-11 17:38:22 +01:00
Leonid Logvinov
432c7c63fe Fix a version in web3-typescript-typings CHANGELOG 2018-01-11 14:44:30 +01:00
Leonid Logvinov
2bba1ae292 Publish
- 0x.js@0.29.2
 - @0xproject/abi-gen@0.1.1
 - @0xproject/connect@0.4.1
 - contracts@2.1.3
 - @0xproject/kovan_faucets@1.0.4
 - web3-typescript-typings@0.9.3
 - @0xproject/web3-wrapper@0.1.4
 - @0xproject/website@0.0.6
2018-01-11 14:43:58 +01:00
Leonid Logvinov
7830d518e0 Add types for getData on a web3 contract 2018-01-11 14:40:16 +01:00
Leonid Logvinov
571b3c4da8 Add types for getData on a web3 contract 2018-01-11 14:25:49 +01:00
Leonid Logvinov
5b6f8d4c3f Apply prettier 2018-01-11 13:44:01 +01:00
Leonid Logvinov
ae57b21b98 Update the CHANGELOG 2018-01-11 13:22:37 +01:00
Leonid Logvinov
292c3bbff8 Make some callbacks failable and add error handling 2018-01-11 13:22:04 +01:00
Leonid Logvinov
065570ebf5 Add an error handler parameter to intervals 2018-01-11 13:22:04 +01:00
Leonid Logvinov
1f5dfd71d5 Add forgotten CHANGELOG changes 2018-01-11 13:16:58 +01:00
Leonid Logvinov
31b3ac4b98 Publish
- 0x.js@0.29.1
 - @0xproject/abi-gen@0.1.0
 - @0xproject/assert@0.0.10
 - @0xproject/connect@0.4.0
 - contracts@2.1.2
 - @0xproject/dev-utils@0.0.4
 - @0xproject/json-schemas@0.7.2
 - @0xproject/kovan_faucets@1.0.3
 - @0xproject/monorepo-scripts@0.1.3
 - @0xproject/subproviders@0.3.0
 - @0xproject/tslint-config@0.4.1
 - @0xproject/types@0.1.3
 - @0xproject/utils@0.1.3
 - web3-typescript-typings@0.9.1
 - @0xproject/web3-wrapper@0.1.3
 - @0xproject/website@0.0.5
2018-01-11 13:05:49 +01:00
147 changed files with 2892 additions and 519 deletions

View File

@@ -6,24 +6,117 @@ jobs:
- image: circleci/node:6.12
environment:
CONTRACTS_COMMIT_HASH: '9ed05f5'
working_directory: ~/repo
steps:
- checkout
- run: echo 'export PATH=$HOME/CIRCLE_PROJECT_REPONAME/node_modules/.bin:$PATH' >> $BASH_ENV
- restore_cache:
key: dependency-cache-{{ checksum "package.json" }}
- run:
name: yarn
command: yarn
command: yarn --frozen-lockfile
- save_cache:
key: dependency-cache-{{ checksum "package.json" }}
paths:
- ~/.cache/yarn
- ./node_modules
- run: wget https://s3.amazonaws.com/testrpc-shapshots/${CONTRACTS_COMMIT_HASH}.zip
- run: unzip ${CONTRACTS_COMMIT_HASH}.zip -d testrpc_snapshot
- run: node ./node_modules/lerna/bin/lerna.js bootstrap
- run: yarn lerna:run build
- save_cache:
key: repo-{{ .Environment.CIRCLE_SHA1 }}
paths:
- ~/repo
test-0xjs:
docker:
- image: circleci/node:6.12
working_directory: ~/repo
steps:
- restore_cache:
keys:
- repo-{{ .Environment.CIRCLE_SHA1 }}
- run:
name: testrpc
command: npm run testrpc -- --db testrpc_snapshot
background: true
- run: yarn lerna:run test:circleci
- run: yarn lerna:run --scope 0x.js test:circleci
test-contracts:
docker:
- image: circleci/node:6.12
working_directory: ~/repo
steps:
- restore_cache:
keys:
- repo-{{ .Environment.CIRCLE_SHA1 }}
- run:
name: testrpc
command: npm run testrpc -- --db testrpc_snapshot
background: true
- run: yarn lerna:run --scope contracts test:circleci
test-deployer:
docker:
- image: circleci/node:6.12
working_directory: ~/repo
steps:
- restore_cache:
keys:
- repo-{{ .Environment.CIRCLE_SHA1 }}
- run:
name: testrpc
command: npm run testrpc -- --db testrpc_snapshot
background: true
- run: yarn lerna:run --scope @0xproject/deployer test:circleci
test-rest:
docker:
- image: circleci/node:6.12
working_directory: ~/repo
steps:
- restore_cache:
keys:
- repo-{{ .Environment.CIRCLE_SHA1 }}
- run:
name: testrpc
command: npm run testrpc -- --db testrpc_snapshot
background: true
- run: yarn lerna:run --ignore contracts --ignore 0x.js --ignore @0xproject/deployer test:circleci
lint:
working_directory: ~/repo
docker:
- image: circleci/node:6.12
steps:
- restore_cache:
keys:
- repo-{{ .Environment.CIRCLE_SHA1 }}
- run: yarn lerna:run lint
prettier:
working_directory: ~/repo
docker:
- image: circleci/node:6.12
steps:
- restore_cache:
keys:
- repo-{{ .Environment.CIRCLE_SHA1 }}
- run: yarn prettier:ci
workflows:
version: 2
main:
jobs:
- build
- test-0xjs:
requires:
- build
- test-contracts:
requires:
- build
- test-deployer:
requires:
- build
- test-rest:
requires:
- build
- prettier:
requires:
- build
- lint:
requires:
- build

View File

@@ -18,26 +18,30 @@ This repository contains all the 0x developer tools written in TypeScript. Our h
### Published Packages
| Package | Version | Description |
| ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ |
| [`0x.js`](/packages/0x.js) | [![npm](https://img.shields.io/npm/v/0x.js.svg)](https://www.npmjs.com/package/0x.js) | A Javascript library for interacting with the 0x protocol |
| [`@0xproject/abi-gen`](/packages/abi-gen) | [![npm](https://img.shields.io/npm/v/@0xproject/abi-gen.svg)](https://www.npmjs.com/package/@0xproject/abi-gen) | Tool to generate TS wrappers from smart contract ABIs |
| [`@0xproject/assert`](/packages/assert) | [![npm](https://img.shields.io/npm/v/@0xproject/assert.svg)](https://www.npmjs.com/package/@0xproject/assert) | Type and schema assertions used by our packages |
| [`@0xproject/connect`](/packages/connect) | [![npm](https://img.shields.io/npm/v/@0xproject/connect.svg)](https://www.npmjs.com/package/@0xproject/connect) | A Javascript library for interacting with the standard relayer api |
| [`@0xproject/json-schemas`](/packages/json-schemas) | [![npm](https://img.shields.io/npm/v/@0xproject/json-schemas.svg)](https://www.npmjs.com/package/@0xproject/json-schemas) | 0x-related json schemas |
| [`@0xproject/subproviders`](/packages/subproviders) | [![npm](https://img.shields.io/npm/v/@0xproject/subproviders.svg)](https://www.npmjs.com/package/@0xproject/subproviders) | Useful web3 subproviders (e.g LedgerSubprovider) |
| [`@0xproject/tslint-config`](/packages/tslint-config) | [![npm](https://img.shields.io/npm/v/@0xproject/tslint-config.svg)](https://www.npmjs.com/package/@0xproject/tslint-config) | Custom 0x development TSLint rules |
| [`@0xproject/types`](/packages/types) | [![npm](https://img.shields.io/npm/v/@0xproject/types.svg)](https://www.npmjs.com/package/@0xproject/types) | Shared type declarations |
| [`@0xproject/utils`](/packages/utils) | [![npm](https://img.shields.io/npm/v/@0xproject/utils.svg)](https://www.npmjs.com/package/@0xproject/utils) | Shared utilities |
| [`@0xproject/web3-wrapper`](/packages/web3-wrapper) | [![npm](https://img.shields.io/npm/v/@0xproject/web3-wrapper.svg)](https://www.npmjs.com/package/@0xproject/web3-wrapper) | Web3 wrapper |
| Package | Version | Description |
| -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ |
| [`0x.js`](/packages/0x.js) | [![npm](https://img.shields.io/npm/v/0x.js.svg)](https://www.npmjs.com/package/0x.js) | A Javascript library for interacting with the 0x protocol |
| [`chai-as-promised-typescript-typings`](/packages/chai-as-promised-typescript-typings) | [![npm](https://img.shields.io/npm/v/chai-as-promised-typescript-typings.svg)](https://www.npmjs.com/package/chai-as-promised-typescript-typings) | Chai as promised typescript typings |
| [`chai-typescript-typings`](/packages/chai-typescript-typings) | [![npm](https://img.shields.io/npm/v/chai-typescript-typings.svg)](https://www.npmjs.com/package/chai-typescript-typings) | Chai typescript typings |
| [`web3-typescript-typings`](/packages/web3-typescript-typings) | [![npm](https://img.shields.io/npm/v/web3-typescript-typings.svg)](https://www.npmjs.com/package/web3-typescript-typings) | Web3 typescript typings |
| [`@0xproject/abi-gen`](/packages/abi-gen) | [![npm](https://img.shields.io/npm/v/@0xproject/abi-gen.svg)](https://www.npmjs.com/package/@0xproject/abi-gen) | Tool to generate TS wrappers from smart contract ABIs |
| [`@0xproject/assert`](/packages/assert) | [![npm](https://img.shields.io/npm/v/@0xproject/assert.svg)](https://www.npmjs.com/package/@0xproject/assert) | Type and schema assertions used by our packages |
| [`@0xproject/connect`](/packages/connect) | [![npm](https://img.shields.io/npm/v/@0xproject/connect.svg)](https://www.npmjs.com/package/@0xproject/connect) | A Javascript library for interacting with the standard relayer api |
| [`@0xproject/dev-utils`](/packages/dev-utils) | [![npm](https://img.shields.io/npm/v/@0xproject/dev-utils.svg)](https://www.npmjs.com/package/@0xproject/dev-utils) | Dev utils to be shared across 0x projects and packages |
| [`@0xproject/json-schemas`](/packages/json-schemas) | [![npm](https://img.shields.io/npm/v/@0xproject/json-schemas.svg)](https://www.npmjs.com/package/@0xproject/json-schemas) | 0x-related json schemas |
| [`@0xproject/subproviders`](/packages/subproviders) | [![npm](https://img.shields.io/npm/v/@0xproject/subproviders.svg)](https://www.npmjs.com/package/@0xproject/subproviders) | Useful web3 subproviders (e.g LedgerSubprovider) |
| [`@0xproject/tslint-config`](/packages/tslint-config) | [![npm](https://img.shields.io/npm/v/@0xproject/tslint-config.svg)](https://www.npmjs.com/package/@0xproject/tslint-config) | Custom 0x development TSLint rules |
| [`@0xproject/types`](/packages/types) | [![npm](https://img.shields.io/npm/v/@0xproject/types.svg)](https://www.npmjs.com/package/@0xproject/types) | Shared type declarations |
| [`@0xproject/utils`](/packages/utils) | [![npm](https://img.shields.io/npm/v/@0xproject/utils.svg)](https://www.npmjs.com/package/@0xproject/utils) | Shared utilities |
| [`@0xproject/web3-wrapper`](/packages/web3-wrapper) | [![npm](https://img.shields.io/npm/v/@0xproject/web3-wrapper.svg)](https://www.npmjs.com/package/@0xproject/web3-wrapper) | Web3 wrapper |
### Private Packages
| Package | Description |
| ----------------------------------------------------------- | ---------------------------------------------------------------- |
| [`@0xproject/contracts`](/packages/contracts) | 0x solidity smart contracts & tests |
| [`@0xproject/kovan_faucets`](/packages/kovan-faucets) | A faucet micro-service that dispenses test ERC20 tokens or Ether |
| [`@0xproject/monorepo-scripts`](/packages/monorepo-scripts) | Shared monorepo scripts |
| [`@0xproject/testnet-faucets`](/packages/testnet-faucets) | A faucet micro-service that dispenses test ERC20 tokens or Ether |
| [`@0xproject/website`](/packages/website) | 0x website & Portal DApp |
## Usage

View File

@@ -15,9 +15,9 @@
"mnemonic": "concert load couple harbor equip island argue ramp clarify fence smart topic"
},
"devDependencies": {
"@0xproject/utils": "^0.1.0",
"@0xproject/utils": "^0.2.0",
"async-child-process": "^1.1.1",
"ethereumjs-testrpc": "6.0.3",
"ethereumjs-testrpc": "^6.0.3",
"lerna": "^2.5.1",
"prettier": "1.9.2",
"publish-release": "0xproject/publish-release",

View File

@@ -1,5 +1,17 @@
# CHANGELOG
## v0.30.1 - _TBD, 2018_
* Fix a bug allowing negative fill values (#212)
* Fix a bug that made it impossible to pass a custom ZRX address (#341)
* Add Rinkeby testnet addresses to artifacts (#337)
## v0.30.0 - _January 17, 2018_
* 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 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_
* Fixed bignumber config issue #301 (#305)

View File

@@ -1,6 +1,6 @@
{
"name": "0x.js",
"version": "0.29.0",
"version": "0.30.1",
"description": "A javascript library for interacting with the 0x protocol",
"keywords": ["0x.js", "0xproject", "ethereum", "tokens", "exchange"],
"main": "lib/src/index.js",
@@ -14,21 +14,16 @@
"generate_contract_wrappers":
"node ../abi-gen/lib/index.js --abiGlob 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken|TokenRegistry|DummyToken).json' --templates contract_templates --output src/contract_wrappers/generated",
"lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
"test:circleci":
"run-s test:coverage report_test_coverage && if [ $CIRCLE_BRANCH = \"development\" ]; then yarn test:umd; fi",
"test:circleci": "run-s test:coverage report_test_coverage",
"test": "run-s clean test:commonjs",
"test:umd": "./scripts/test_umd.sh",
"test:coverage": "nyc npm run test --all",
"report_test_coverage": "nyc report --reporter=text-lcov | coveralls",
"update_contracts":
"for i in ${npm_package_config_artifacts}; do copyfiles -u 4 ../contracts/build/contracts/$i.json ../0x.js/src/artifacts; done;",
"clean": "shx rm -rf _bundles lib test_temp",
"build:umd:dev": "webpack",
"build:umd:prod": "NODE_ENV=production webpack",
"build:commonjs": "tsc && copyfiles -u 2 './src/artifacts/**/*.json' ./lib/src/artifacts;",
"test:commonjs": "run-s build:commonjs run_mocha",
"pretest:umd": "run-s clean build:umd:dev build:commonjs",
"substitute_umd_bundle": "shx mv _bundles/* lib/src",
"run_mocha": "mocha lib/test/**/*_test.js --timeout 10000 --bail --exit"
},
"config": {
@@ -43,10 +38,9 @@
"node": ">=6.0.0"
},
"devDependencies": {
"@0xproject/abi-gen": "^0.0.4",
"@0xproject/dev-utils": "^0.0.3",
"@0xproject/tslint-config": "^0.4.0",
"@0xproject/types": "^0.1.2",
"@0xproject/abi-gen": "^0.1.3",
"@0xproject/dev-utils": "^0.0.6",
"@0xproject/tslint-config": "^0.4.3",
"@types/bintrees": "^1.0.2",
"@types/jsonschema": "^1.1.1",
"@types/lodash": "^4.14.86",
@@ -57,9 +51,9 @@
"awesome-typescript-loader": "^3.1.3",
"chai": "^4.0.1",
"chai-as-promised": "^7.1.0",
"chai-as-promised-typescript-typings": "^0.0.3",
"chai-as-promised-typescript-typings": "^0.0.5",
"chai-bignumber": "^2.0.1",
"chai-typescript-typings": "^0.0.1",
"chai-typescript-typings": "^0.0.2",
"copyfiles": "^1.2.0",
"coveralls": "^3.0.0",
"dirty-chai": "^2.0.1",
@@ -78,21 +72,20 @@
"typedoc": "~0.8.0",
"typescript": "~2.6.1",
"web3-provider-engine": "^13.0.1",
"web3-typescript-typings": "^0.9.0",
"web3-typescript-typings": "^0.9.5",
"webpack": "^3.1.0"
},
"dependencies": {
"@0xproject/assert": "^0.0.9",
"@0xproject/json-schemas": "^0.7.1",
"@0xproject/utils": "^0.1.2",
"@0xproject/web3-wrapper": "^0.1.2",
"@0xproject/assert": "^0.0.12",
"@0xproject/json-schemas": "^0.7.4",
"@0xproject/types": "^0.1.5",
"@0xproject/utils": "^0.2.1",
"@0xproject/web3-wrapper": "^0.1.6",
"bintrees": "^1.0.2",
"bn.js": "^4.11.8",
"compare-versions": "^3.0.1",
"ethereumjs-abi": "^0.6.4",
"ethereumjs-blockstream": "^2.0.6",
"ethereumjs-util": "^5.1.1",
"find-versions": "^2.0.0",
"js-sha3": "^0.6.1",
"lodash": "^4.17.4",
"uuid": "^3.1.0",

View File

@@ -8,26 +8,21 @@ const S3BucketPath = 's3://0xjs-docs-jsons/';
let tag;
let version;
postpublish_utils.getLatestTagAndVersionAsync(subPackageName)
postpublish_utils
.getLatestTagAndVersionAsync(subPackageName)
.then(function(result) {
tag = result.tag;
version = result.version;
const releaseName = postpublish_utils.getReleaseName(subPackageName, version);
const assets = [
__dirname + '/../_bundles/index.js',
__dirname + '/../_bundles/index.min.js',
];
return postpublish_utils.publishReleaseNotes(tag, releaseName, assets);
const releaseName = postpublish_utils.getReleaseName(subPackageName, version);
const assets = [__dirname + '/../_bundles/index.js', __dirname + '/../_bundles/index.min.js'];
return postpublish_utils.publishReleaseNotes(tag, releaseName, assets);
})
.then(function(release) {
console.log('POSTPUBLISH: Release successful, generating docs...');
const jsonFilePath = __dirname + '/../' + postpublish_utils.generatedDocsDirectoryName + '/index.json';
return execAsync(
'JSON_FILE_PATH=' + jsonFilePath + ' PROJECT_DIR=' + __dirname + '/.. yarn docs:json',
{
cwd,
}
);
return execAsync('JSON_FILE_PATH=' + jsonFilePath + ' PROJECT_DIR=' + __dirname + '/.. yarn docs:json', {
cwd,
});
})
.then(function(result) {
if (result.stderr !== '') {
@@ -39,6 +34,7 @@ postpublish_utils.getLatestTagAndVersionAsync(subPackageName)
return execAsync('S3_URL=' + s3Url + ' yarn upload_docs_json', {
cwd,
});
}).catch (function(err) {
})
.catch(function(err) {
throw err;
});

View File

@@ -1,6 +0,0 @@
#!/usr/bin/env bash
# This script runs umd tests and cleans up after them while preserving the `return_code` for CI
# UMD tests should only be run after building the commonjs because they reuse some of the commonjs build artifacts
run-s substitute_umd_bundle run_mocha
return_code=$?
exit $return_code

View File

@@ -191,6 +191,7 @@ export class ZeroEx {
this._abiDecoder,
this.token,
config.exchangeContractAddress,
config.zrxContractAddress,
);
this.tokenRegistry = new TokenRegistryWrapper(
this._web3Wrapper,
@@ -302,26 +303,33 @@ export class ZeroEx {
const txReceiptPromise = new Promise(
(resolve: (receipt: TransactionReceiptWithDecodedLogs) => void, reject) => {
const intervalId = intervalUtils.setAsyncExcludingInterval(async () => {
if (timeoutExceeded) {
intervalUtils.clearAsyncExcludingInterval(intervalId);
return reject(ZeroExError.TransactionMiningTimeout);
}
const intervalId = intervalUtils.setAsyncExcludingInterval(
async () => {
if (timeoutExceeded) {
intervalUtils.clearAsyncExcludingInterval(intervalId);
return reject(ZeroExError.TransactionMiningTimeout);
}
const transactionReceipt = await this._web3Wrapper.getTransactionReceiptAsync(txHash);
if (!_.isNull(transactionReceipt)) {
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,
(err: Error) => {
intervalUtils.clearAsyncExcludingInterval(intervalId);
const logsWithDecodedArgs = _.map(
transactionReceipt.logs,
this._abiDecoder.tryToDecodeLogOrNoop.bind(this._abiDecoder),
);
const transactionReceiptWithDecodedLogArgs: TransactionReceiptWithDecodedLogs = {
...transactionReceipt,
logs: logsWithDecodedArgs,
};
resolve(transactionReceiptWithDecodedLogArgs);
}
}, pollingIntervalMs);
reject(err);
},
);
},
);

View File

@@ -274,6 +274,9 @@
"3": {
"address": "0xc00fd9820cd2898cc4c054b7bf142de637ad129a"
},
"4": {
"address": "0xc778417e063141139fce010982780140aa0cd5ab"
},
"42": {
"address": "0x653e49e301e508a13237c0ddc98ae7d4cd2667a1"
},

View File

@@ -597,6 +597,9 @@
"3": {
"address": "0x479cc461fecd078f766ecc58533d6f69580cf3ac"
},
"4": {
"address": "0x1d16ef40fac01cec8adac2ac49427b9384192c05"
},
"42": {
"address": "0x90fe2af704b34e0224bf2299c838e04d4dcf1364"
},

View File

@@ -534,6 +534,9 @@
"3": {
"address": "0x6b1a50f0bb5a7995444bd3877b22dc89c62843ed"
},
"4": {
"address": "0x4e9aad8184de8833365fea970cd9149372fdf1e6"
},
"42": {
"address": "0xf18e504561f4347bea557f3d4558f559dddbae7f"
},

View File

@@ -174,6 +174,9 @@
"3": {
"address": "0x4e9aad8184de8833365fea970cd9149372fdf1e6"
},
"4": {
"address": "0xa8e9fa8f91e5ae138c74648c9c304f1c75003a8d"
},
"42": {
"address": "0x087eed4bc1ee3de49befbd66c662b434b15d49d4"
},

View File

@@ -7,6 +7,9 @@
"3": {
"address": "0xa8e9fa8f91e5ae138c74648c9c304f1c75003a8d"
},
"4": {
"address": "0x00f58d6d585f84b2d7267940cede30ce2fe6eae8"
},
"42": {
"address": "0x6ff6c0ff1d68b964901f986d4c9fa3ac68346570"
},

View File

@@ -167,6 +167,7 @@ export class ContractWrapper {
this._blockAndLogStreamInterval = intervalUtils.setAsyncExcludingInterval(
this._reconcileBlockAsync.bind(this),
constants.DEFAULT_BLOCK_POLLING_INTERVAL,
this._onReconcileBlockError.bind(this),
);
let isRemoved = false;
this._onLogAddedSubscriptionToken = this._blockAndLogStreamerIfExists.subscribeToOnLogAdded(
@@ -177,6 +178,12 @@ export class ContractWrapper {
this._onLogStateChanged.bind(this, isRemoved),
);
}
private _onReconcileBlockError(err: Error): void {
const filterTokens = _.keys(this._filterCallbacks);
_.each(filterTokens, filterToken => {
this._unsubscribe(filterToken, err);
});
}
private _setNetworkId(networkId: number): void {
this._networkId = networkId;
}
@@ -190,18 +197,11 @@ export class ContractWrapper {
delete this._blockAndLogStreamerIfExists;
}
private async _reconcileBlockAsync(): Promise<void> {
try {
const latestBlock = await this._web3Wrapper.getBlockAsync(BlockParamLiteral.Latest);
// We need to coerce to Block type cause Web3.Block includes types for mempool blocks
if (!_.isUndefined(this._blockAndLogStreamerIfExists)) {
// If we clear the interval while fetching the block - this._blockAndLogStreamer will be undefined
await this._blockAndLogStreamerIfExists.reconcileNewBlock((latestBlock as any) as Block);
}
} catch (err) {
const filterTokens = _.keys(this._filterCallbacks);
_.each(filterTokens, filterToken => {
this._unsubscribe(filterToken, err);
});
const latestBlock = await this._web3Wrapper.getBlockAsync(BlockParamLiteral.Latest);
// We need to coerce to Block type cause Web3.Block includes types for mempool blocks
if (!_.isUndefined(this._blockAndLogStreamerIfExists)) {
// If we clear the interval while fetching the block - this._blockAndLogStreamer will be undefined
await this._blockAndLogStreamerIfExists.reconcileNewBlock((latestBlock as any) as Block);
}
}
}

View File

@@ -87,11 +87,13 @@ export class ExchangeWrapper extends ContractWrapper {
abiDecoder: AbiDecoder,
tokenWrapper: TokenWrapper,
contractAddressIfExists?: string,
zrxContractAddressIfExists?: string,
) {
super(web3Wrapper, networkId, abiDecoder);
this._tokenWrapper = tokenWrapper;
this._orderValidationUtils = new OrderValidationUtils(this);
this._contractAddressIfExists = contractAddressIfExists;
this._zrxContractAddressIfExists = zrxContractAddressIfExists;
}
/**
* Returns the unavailable takerAmount of an order. Unavailable amount is defined as the total
@@ -258,16 +260,18 @@ export class ExchangeWrapper extends ContractWrapper {
? SHOULD_VALIDATE_BY_DEFAULT
: orderTransactionOpts.shouldValidate;
if (shouldValidate) {
let filledTakerTokenAmount = new BigNumber(0);
const zrxTokenAddress = this.getZRXTokenAddress();
const exchangeTradeEmulator = new ExchangeTransferSimulator(this._tokenWrapper, BlockParamLiteral.Latest);
for (const signedOrder of signedOrders) {
await this._orderValidationUtils.validateFillOrderThrowIfInvalidAsync(
const singleFilledTakerTokenAmount = await this._orderValidationUtils.validateFillOrderThrowIfInvalidAsync(
exchangeTradeEmulator,
signedOrder,
fillTakerTokenAmount,
fillTakerTokenAmount.minus(filledTakerTokenAmount),
takerAddress,
zrxTokenAddress,
);
filledTakerTokenAmount = filledTakerTokenAmount.plus(singleFilledTakerTokenAmount);
}
}

View File

@@ -1,5 +1,3 @@
/// <reference types='chai-typescript-typings' />
/// <reference types='chai-as-promised-typescript-typings' />
declare module 'web3_beta';
declare module 'chai-bignumber';
declare module 'dirty-chai';
@@ -27,18 +25,6 @@ declare module '*.json' {
/* tslint:enable */
}
// find-version declarations
declare function findVersions(version: string): string[];
declare module 'find-versions' {
export = findVersions;
}
// compare-version declarations
declare function compareVersions(firstVersion: string, secondVersion: string): number;
declare module 'compare-versions' {
export = compareVersions;
}
declare module 'ethereumjs-abi' {
const soliditySHA3: (argTypes: string[], args: any[]) => Buffer;
}

View File

@@ -36,6 +36,10 @@ export class EventWatcher {
this._intervalIdIfExists = intervalUtils.setAsyncExcludingInterval(
this._pollForBlockchainEventsAsync.bind(this, callback),
this._pollingIntervalMs,
(err: Error) => {
this.unsubscribe();
callback(err);
},
);
}
public unsubscribe(): void {
@@ -47,6 +51,10 @@ export class EventWatcher {
}
private async _pollForBlockchainEventsAsync(callback: EventWatcherCallback): Promise<void> {
const pendingEvents = await this._getEventsAsync();
if (_.isUndefined(pendingEvents)) {
// HACK: This should never happen, but happens frequently on CI due to a ganache bug
return;
}
if (pendingEvents.length === 0) {
// HACK: Sometimes when node rebuilds the pending block we get back the empty result.
// We don't want to emit a lot of removal events and bring them back after a couple of miliseconds,
@@ -78,7 +86,7 @@ export class EventWatcher {
...log,
};
if (!_.isUndefined(this._intervalIdIfExists)) {
callback(logEvent);
callback(null, logEvent);
}
}
}

View File

@@ -30,16 +30,17 @@ export class ExpirationWatcher {
if (!_.isUndefined(this._orderExpirationCheckingIntervalIdIfExists)) {
throw new Error(ZeroExError.SubscriptionAlreadyPresent);
}
this._orderExpirationCheckingIntervalIdIfExists = intervalUtils.setAsyncExcludingInterval(
this._orderExpirationCheckingIntervalIdIfExists = intervalUtils.setInterval(
this._pruneExpiredOrders.bind(this, callback),
this._orderExpirationCheckingIntervalMs,
_.noop, // _pruneExpiredOrders never throws
);
}
public unsubscribe(): void {
if (_.isUndefined(this._orderExpirationCheckingIntervalIdIfExists)) {
throw new Error(ZeroExError.SubscriptionNotFound);
}
intervalUtils.clearAsyncExcludingInterval(this._orderExpirationCheckingIntervalIdIfExists);
intervalUtils.clearInterval(this._orderExpirationCheckingIntervalIdIfExists);
delete this._orderExpirationCheckingIntervalIdIfExists;
}
public addOrder(orderHash: string, expirationUnixTimestampMs: BigNumber): void {

View File

@@ -155,6 +155,10 @@ export class OrderStateWatcher {
this._cleanupJobIntervalIdIfExists = intervalUtils.setAsyncExcludingInterval(
this._cleanupAsync.bind(this),
this._cleanupJobInterval,
(err: Error) => {
this.unsubscribe();
callback(err);
},
);
}
/**
@@ -207,11 +211,19 @@ export class OrderStateWatcher {
if (!_.isUndefined(this._orderByOrderHash[orderHash])) {
this.removeOrder(orderHash);
if (!_.isUndefined(this._callbackIfExists)) {
this._callbackIfExists(orderState);
this._callbackIfExists(null, orderState);
}
}
}
private async _onEventWatcherCallbackAsync(log: LogEvent): Promise<void> {
private async _onEventWatcherCallbackAsync(err: Error | null, logIfExists?: LogEvent): Promise<void> {
if (!_.isNull(err)) {
if (!_.isUndefined(this._callbackIfExists)) {
this._callbackIfExists(err);
this.unsubscribe();
}
return;
}
const log = logIfExists as LogEvent; // At this moment we are sure that no error occured and log is defined.
const maybeDecodedLog = this._abiDecoder.tryToDecodeLogOrNoop(log);
const isLogDecoded = !_.isUndefined((maybeDecodedLog as LogWithDecodedArgs<any>).event);
if (!isLogDecoded) {
@@ -332,7 +344,7 @@ export class OrderStateWatcher {
} else {
this._orderStateByOrderHashCache[orderHash] = orderState;
}
this._callbackIfExists(orderState);
this._callbackIfExists(null, orderState);
}
}
private _addToDependentOrderHashes(signedOrder: SignedOrder, orderHash: string): void {

View File

@@ -51,7 +51,7 @@ export interface DecodedLogEvent<ArgsType> {
}
export type EventCallback<ArgsType> = (err: null | Error, log?: DecodedLogEvent<ArgsType>) => void;
export type EventWatcherCallback = (log: LogEvent) => void;
export type EventWatcherCallback = (err: null | Error, log?: LogEvent) => void;
export enum SolidityTypes {
Address = 'address',
@@ -290,6 +290,7 @@ export interface OrderStateWatcherConfig {
* networkId: The id of the underlying ethereum network your provider is connected to. (1-mainnet, 42-kovan, 50-testrpc)
* gasPrice: Gas price to use with every transaction
* exchangeContractAddress: The address of an exchange contract to use
* zrxContractAddress: The address of the ZRX contract to use
* tokenRegistryContractAddress: The address of a token registry contract to use
* tokenTransferProxyContractAddress: The address of the token transfer proxy contract to use
* orderWatcherConfig: All the configs related to the orderWatcher
@@ -298,6 +299,7 @@ export interface ZeroExConfig {
networkId: number;
gasPrice?: BigNumber;
exchangeContractAddress?: string;
zrxContractAddress?: string;
tokenRegistryContractAddress?: string;
tokenTransferProxyContractAddress?: string;
orderWatcherConfig?: OrderStateWatcherConfig;
@@ -406,5 +408,5 @@ export interface OrderStateInvalid {
export type OrderState = OrderStateValid | OrderStateInvalid;
export type OnOrderStateChangeCallback = (orderState: OrderState) => void;
export type OnOrderStateChangeCallback = (err: Error | null, orderState?: OrderState) => void;
// tslint:disable:max-file-line-count

View File

@@ -10,6 +10,7 @@ import { EventWatcher } from '../src/order_watcher/event_watcher';
import { DoneCallback } from '../src/types';
import { chaiSetup } from './utils/chai_setup';
import { reportNodeCallbackErrors } from './utils/report_callback_errors';
import { web3Factory } from './utils/web3_factory';
chaiSetup.configure();
@@ -77,13 +78,14 @@ describe('EventWatcher', () => {
const getLogsStub = Sinon.stub(web3Wrapper, 'getLogsAsync');
getLogsStub.onCall(0).returns(logs);
stubs.push(getLogsStub);
const callback = (event: LogEvent) => {
const expectedToBeCalledOnce = false;
const callback = reportNodeCallbackErrors(done, expectedToBeCalledOnce)((event: LogEvent) => {
const expectedLogEvent = expectedLogEvents.shift();
expect(event).to.be.deep.equal(expectedLogEvent);
if (_.isEmpty(expectedLogEvents)) {
done();
}
};
});
eventWatcher.subscribe(callback);
});
it('correctly computes the difference and emits only changes', (done: DoneCallback) => {
@@ -111,13 +113,14 @@ describe('EventWatcher', () => {
getLogsStub.onCall(0).returns(initialLogs);
getLogsStub.onCall(1).returns(changedLogs);
stubs.push(getLogsStub);
const callback = (event: LogEvent) => {
const expectedToBeCalledOnce = false;
const callback = reportNodeCallbackErrors(done, expectedToBeCalledOnce)((event: LogEvent) => {
const expectedLogEvent = expectedLogEvents.shift();
expect(event).to.be.deep.equal(expectedLogEvent);
if (_.isEmpty(expectedLogEvents)) {
done();
}
};
});
eventWatcher.subscribe(callback);
});
});

View File

@@ -390,6 +390,29 @@ describe('ExchangeWrapper', () => {
).to.not.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
});
});
describe('negative fill amount', async () => {
let signedOrder: SignedOrder;
const negativeFillTakerAmount = new BigNumber(-100);
beforeEach(async () => {
signedOrder = await fillScenarios.createFillableSignedOrderAsync(
makerTokenAddress,
takerTokenAddress,
makerAddress,
takerAddress,
fillableAmount,
);
});
it('should not allow the exchange wrapper to fill if amount is negative', async () => {
return expect(
zeroEx.exchange.fillOrderAsync(
signedOrder,
negativeFillTakerAmount,
shouldThrowOnInsufficientBalanceOrAllowance,
takerAddress,
),
).to.be.rejected();
});
});
});
describe('#batchFillOrdersAsync', () => {
let signedOrder: SignedOrder;
@@ -498,6 +521,30 @@ describe('ExchangeWrapper', () => {
).to.not.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
});
});
describe('negative batch fill amount', async () => {
beforeEach(async () => {
const negativeFillTakerAmount = new BigNumber(-100);
orderFillBatch = [
{
signedOrder,
takerTokenFillAmount,
},
{
signedOrder: anotherSignedOrder,
takerTokenFillAmount: negativeFillTakerAmount,
},
];
});
it('should not allow the exchange wrapper to batch fill if any amount is negative', async () => {
return expect(
zeroEx.exchange.batchFillOrdersAsync(
orderFillBatch,
shouldThrowOnInsufficientBalanceOrAllowance,
takerAddress,
),
).to.be.rejected();
});
});
});
describe('#fillOrdersUpTo', () => {
let signedOrder: SignedOrder;
@@ -536,7 +583,7 @@ describe('ExchangeWrapper', () => {
),
).to.be.rejectedWith(ExchangeContractErrs.BatchOrdersMustHaveAtLeastOneItem);
});
it('should successfully fill up to specified amount', async () => {
it('should successfully fill up to specified amount when all orders are fully funded', async () => {
const txHash = await zeroEx.exchange.fillOrdersUpToAsync(
signedOrders,
fillUpToAmount,
@@ -550,6 +597,37 @@ describe('ExchangeWrapper', () => {
const remainingFillAmount = fillableAmount.minus(1);
expect(anotherFilledAmount).to.be.bignumber.equal(remainingFillAmount);
});
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,
// but won't have 10 to fully fill all orders in a batch.
await zeroEx.token.transferAsync(makerTokenAddress, makerAddress, coinbase, missingBalance);
const txHash = await zeroEx.exchange.fillOrdersUpToAsync(
signedOrders,
fillUpToAmount,
shouldThrowOnInsufficientBalanceOrAllowance,
takerAddress,
);
await zeroEx.awaitTransactionMinedAsync(txHash);
const filledAmount = await zeroEx.exchange.getFilledTakerAmountAsync(signedOrderHashHex);
const anotherFilledAmount = await zeroEx.exchange.getFilledTakerAmountAsync(anotherOrderHashHex);
expect(filledAmount).to.be.bignumber.equal(fillableAmount);
const remainingFillAmount = fillableAmount.minus(1);
expect(anotherFilledAmount).to.be.bignumber.equal(remainingFillAmount);
});
});
describe('failed batch fills', () => {
it("should fail validation if user doesn't have enough balance without fill up to", async () => {
const missingBalance = new BigNumber(2); // User will only have enough balance to fill up to 8
await zeroEx.token.transferAsync(makerTokenAddress, makerAddress, coinbase, missingBalance);
return expect(
zeroEx.exchange.fillOrdersUpToAsync(
signedOrders,
fillUpToAmount,
shouldThrowOnInsufficientBalanceOrAllowance,
takerAddress,
),
).to.be.rejectedWith(ExchangeContractErrs.InsufficientMakerBalance);
});
});
describe('order transaction options', () => {
const emptyFillUpToAmount = new BigNumber(0);

View File

@@ -20,7 +20,7 @@ import { DoneCallback } from '../src/types';
import { chaiSetup } from './utils/chai_setup';
import { constants } from './utils/constants';
import { FillScenarios } from './utils/fill_scenarios';
import { reportNoErrorCallbackErrors } from './utils/report_callback_errors';
import { reportNodeCallbackErrors } from './utils/report_callback_errors';
import { TokenUtils } from './utils/token_utils';
import { web3Factory } from './utils/web3_factory';
@@ -134,7 +134,7 @@ describe('OrderStateWatcher', () => {
);
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportNoErrorCallbackErrors(done)((orderState: OrderState) => {
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.false();
const invalidOrderState = orderState as OrderStateInvalid;
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
@@ -154,7 +154,7 @@ describe('OrderStateWatcher', () => {
fillableAmount,
);
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportNoErrorCallbackErrors(done)((orderState: OrderState) => {
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
throw new Error('OrderState callback fired for irrelevant order');
});
zeroEx.orderStateWatcher.subscribe(callback);
@@ -178,7 +178,7 @@ describe('OrderStateWatcher', () => {
);
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportNoErrorCallbackErrors(done)((orderState: OrderState) => {
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.false();
const invalidOrderState = orderState as OrderStateInvalid;
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
@@ -202,7 +202,7 @@ describe('OrderStateWatcher', () => {
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportNoErrorCallbackErrors(done)((orderState: OrderState) => {
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.false();
const invalidOrderState = orderState as OrderStateInvalid;
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
@@ -234,7 +234,7 @@ describe('OrderStateWatcher', () => {
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportNoErrorCallbackErrors(done)((orderState: OrderState) => {
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.true();
const validOrderState = orderState as OrderStateValid;
expect(validOrderState.orderHash).to.be.equal(orderHash);
@@ -273,7 +273,7 @@ describe('OrderStateWatcher', () => {
fillableAmount,
taker,
);
const callback = reportNoErrorCallbackErrors(done)();
const callback = reportNodeCallbackErrors(done)();
zeroEx.orderStateWatcher.addOrder(signedOrder);
zeroEx.orderStateWatcher.subscribe(callback);
await zeroEx.token.setProxyAllowanceAsync(zrxTokenAddress, maker, new BigNumber(0));
@@ -295,7 +295,7 @@ describe('OrderStateWatcher', () => {
const fillAmountInBaseUnits = ZeroEx.toBaseUnitAmount(new BigNumber(2), decimals);
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportNoErrorCallbackErrors(done)((orderState: OrderState) => {
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.true();
const validOrderState = orderState as OrderStateValid;
expect(validOrderState.orderHash).to.be.equal(orderHash);
@@ -330,7 +330,7 @@ describe('OrderStateWatcher', () => {
const changedMakerApprovalAmount = ZeroEx.toBaseUnitAmount(new BigNumber(3), decimals);
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportNoErrorCallbackErrors(done)((orderState: OrderState) => {
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
const validOrderState = orderState as OrderStateValid;
const orderRelevantState = validOrderState.orderRelevantState;
expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
@@ -360,7 +360,7 @@ describe('OrderStateWatcher', () => {
const transferAmount = makerBalance.sub(remainingAmount);
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportNoErrorCallbackErrors(done)((orderState: OrderState) => {
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.true();
const validOrderState = orderState as OrderStateValid;
const orderRelevantState = validOrderState.orderRelevantState;
@@ -395,7 +395,7 @@ describe('OrderStateWatcher', () => {
const transferTokenAmount = makerFee.sub(remainingTokenAmount);
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportNoErrorCallbackErrors(done)((orderState: OrderState) => {
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.true();
const validOrderState = orderState as OrderStateValid;
const orderRelevantState = validOrderState.orderRelevantState;
@@ -429,7 +429,7 @@ describe('OrderStateWatcher', () => {
const transferTokenAmount = makerFee.sub(remainingTokenAmount);
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportNoErrorCallbackErrors(done)((orderState: OrderState) => {
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
const validOrderState = orderState as OrderStateValid;
const orderRelevantState = validOrderState.orderRelevantState;
expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
@@ -464,7 +464,7 @@ describe('OrderStateWatcher', () => {
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportNoErrorCallbackErrors(done)((orderState: OrderState) => {
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
const validOrderState = orderState as OrderStateValid;
const orderRelevantState = validOrderState.orderRelevantState;
expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
@@ -492,7 +492,7 @@ describe('OrderStateWatcher', () => {
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportNoErrorCallbackErrors(done)((orderState: OrderState) => {
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.false();
const invalidOrderState = orderState as OrderStateInvalid;
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
@@ -516,7 +516,7 @@ describe('OrderStateWatcher', () => {
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportNoErrorCallbackErrors(done)((orderState: OrderState) => {
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.false();
const invalidOrderState = orderState as OrderStateInvalid;
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
@@ -543,7 +543,7 @@ describe('OrderStateWatcher', () => {
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportNoErrorCallbackErrors(done)((orderState: OrderState) => {
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
expect(orderState.isValid).to.be.true();
const validOrderState = orderState as OrderStateValid;
expect(validOrderState.orderHash).to.be.equal(orderHash);

View File

@@ -1,6 +1,6 @@
export const constants = {
NULL_ADDRESS: '0x0000000000000000000000000000000000000000',
RPC_URL: 'http://localhost:8545/',
RPC_URL: 'http://localhost:8545',
ROPSTEN_NETWORK_ID: 3,
KOVAN_NETWORK_ID: 42,
TESTRPC_NETWORK_ID: 50,

View File

@@ -25,7 +25,7 @@ export const reportNoErrorCallbackErrors = (done: DoneCallback, expectToBeCalled
};
};
export const reportNodeCallbackErrors = (done: DoneCallback) => {
export const reportNodeCallbackErrors = (done: DoneCallback, expectToBeCalledOnce = true) => {
return <T>(f?: (value: T) => void) => {
const wrapped = (error: Error | null, value: T | undefined) => {
if (!_.isNull(error)) {
@@ -37,7 +37,9 @@ export const reportNodeCallbackErrors = (done: DoneCallback) => {
}
try {
f(value as T);
done();
if (expectToBeCalledOnce) {
done();
}
} catch (err) {
done(err);
}

View File

@@ -7,10 +7,10 @@ const path = require('path');
const production = process.env.NODE_ENV === 'production';
let entry = {
'index': './src/index.ts',
index: './src/index.ts',
};
if (production) {
entry = _.assign({}, entry, {'index.min': './src/index.ts'});
entry = _.assign({}, entry, { 'index.min': './src/index.ts' });
}
module.exports = {

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/abi-gen",
"version": "0.0.4",
"version": "0.1.3",
"description": "Generate contract wrappers from ABI and handlebars templates",
"main": "lib/index.js",
"types": "lib/index.d.ts",
@@ -22,7 +22,7 @@
},
"homepage": "https://github.com/0xProject/0x.js/packages/abi-gen/README.md",
"dependencies": {
"@0xproject/utils": "^0.1.2",
"@0xproject/utils": "^0.2.1",
"chalk": "^2.3.0",
"glob": "^7.1.2",
"handlebars": "^4.0.11",
@@ -33,7 +33,7 @@
"yargs": "^10.0.3"
},
"devDependencies": {
"@0xproject/tslint-config": "^0.4.0",
"@0xproject/tslint-config": "^0.4.3",
"@types/glob": "^5.0.33",
"@types/handlebars": "^4.0.36",
"@types/mkdirp": "^0.5.1",
@@ -43,6 +43,6 @@
"shx": "^0.2.2",
"tslint": "5.8.0",
"typescript": "~2.6.1",
"web3-typescript-typings": "^0.9.0"
"web3-typescript-typings": "^0.9.5"
}
}

View File

@@ -3,12 +3,13 @@ const packageJSON = require('../package.json');
const subPackageName = packageJSON.name;
postpublish_utils.getLatestTagAndVersionAsync(subPackageName)
postpublish_utils
.getLatestTagAndVersionAsync(subPackageName)
.then(function(result) {
const releaseName = postpublish_utils.getReleaseName(subPackageName, result.version);
const assets = [];
return postpublish_utils.publishReleaseNotes(result.tag, releaseName, assets);
})
.catch (function(err) {
.catch(function(err) {
throw err;
});

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/assert",
"version": "0.0.9",
"version": "0.0.12",
"description": "Provides a standard way of performing type and schema validation across 0x projects",
"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",
@@ -23,12 +23,12 @@
},
"homepage": "https://github.com/0xProject/0x.js/packages/assert/README.md",
"devDependencies": {
"@0xproject/tslint-config": "^0.4.0",
"@0xproject/tslint-config": "^0.4.3",
"@types/lodash": "^4.14.86",
"@types/mocha": "^2.2.42",
"@types/valid-url": "^1.0.2",
"chai": "^4.0.1",
"chai-typescript-typings": "^0.0.1",
"chai-typescript-typings": "^0.0.2",
"dirty-chai": "^2.0.1",
"mocha": "^4.0.1",
"npm-run-all": "^4.1.2",
@@ -37,8 +37,8 @@
"typescript": "~2.6.1"
},
"dependencies": {
"@0xproject/json-schemas": "^0.7.1",
"@0xproject/utils": "^0.1.2",
"@0xproject/json-schemas": "^0.7.4",
"@0xproject/utils": "^0.2.1",
"lodash": "^4.17.4",
"valid-url": "^1.0.9"
}

View File

@@ -3,12 +3,13 @@ const packageJSON = require('../package.json');
const subPackageName = packageJSON.name;
postpublish_utils.getLatestTagAndVersionAsync(subPackageName)
postpublish_utils
.getLatestTagAndVersionAsync(subPackageName)
.then(function(result) {
const releaseName = postpublish_utils.getReleaseName(subPackageName, result.version);
const assets = [];
return postpublish_utils.publishReleaseNotes(result.tag, releaseName, assets);
})
.catch (function(err) {
.catch(function(err) {
throw err;
});

View File

@@ -12,6 +12,8 @@ export const assert = {
},
isValidBaseUnitAmount(variableName: string, value: BigNumber) {
assert.isBigNumber(variableName, value);
const isNegative = value.lessThan(0);
this.assert(!isNegative, `${variableName} cannot be a negative number, found value: ${value.toNumber()}`);
const hasDecimals = value.decimalPlaces() !== 0;
this.assert(
!hasDecimals,

View File

@@ -22,6 +22,20 @@ describe('Assertions', () => {
invalidInputs.forEach(input => expect(assert.isBigNumber.bind(assert, variableName, input)).to.throw());
});
});
describe('#isValidBaseUnitAmount', () => {
it('should not throw for valid input', () => {
const validInputs = [new BigNumber(23), new BigNumber('45000000')];
validInputs.forEach(input =>
expect(assert.isValidBaseUnitAmount.bind(assert, variableName, input)).to.not.throw(),
);
});
it('should throw for invalid input', () => {
const invalidInputs = [0, undefined, new BigNumber(3.145), 3.145, new BigNumber(-400)];
invalidInputs.forEach(input =>
expect(assert.isValidBaseUnitAmount.bind(assert, variableName, input)).to.throw(),
);
});
});
describe('#isString', () => {
it('should not throw for valid input', () => {
const validInputs = ['hello', 'goodbye'];

View File

@@ -0,0 +1,3 @@
# CHANGELOG
## v0.x.x - _TBD, 2018_

View File

@@ -0,0 +1,43 @@
## chai-as-promised-typescript-typings
Fork of type definitions for chai-as-promised that includes changes made by dirty-chai
## Installation
```bash
yarn add -D chai-as-promised-typescript-typings
```
## Usage
Add the following line within an `include` section of your `tsconfig.json`
```json
"./node_modules/chai-as-promised-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
```

View File

@@ -0,0 +1,268 @@
// Type definitions for chai-as-promised
// Project: https://github.com/domenic/chai-as-promised/
// Definitions by: jt000 <https://github.com/jt000>, Yuki Kokubun <https://github.com/Kuniwak>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
declare module 'chai-as-promised' {
function chaiAsPromised(chai: any, utils: any): void;
namespace chaiAsPromised {
}
export = chaiAsPromised;
}
// tslint:disable:no-namespace ban-types member-ordering
declare namespace Chai {
// For BDD API
interface Assertion extends LanguageChains, NumericComparison, TypeComparison {
eventually: PromisedAssertion;
fulfilled: PromisedAssertion;
become(expected: any): PromisedAssertion;
rejected(): PromisedAssertion;
rejectedWith(expected: any, message?: string | RegExp): PromisedAssertion;
notify(fn: Function): PromisedAssertion;
}
// Eventually does not have .then(), but PromisedAssertion have.
interface Eventually extends PromisedLanguageChains, PromisedNumericComparison, PromisedTypeComparison {
// From chai-as-promised
become(expected: PromiseLike<any>): PromisedAssertion;
fulfilled: PromisedAssertion;
rejected: () => PromisedAssertion;
rejectedWith(expected: any, message?: string | RegExp): PromisedAssertion;
notify(fn: Function): PromisedAssertion;
// From chai
not: PromisedAssertion;
deep: PromisedDeep;
all: PromisedKeyFilter;
a: PromisedTypeComparison;
an: PromisedTypeComparison;
include: PromisedInclude;
contain: PromisedInclude;
ok: PromisedAssertion;
true: () => PromisedAssertion;
false: () => PromisedAssertion;
null: PromisedAssertion;
undefined: PromisedAssertion;
exist: PromisedAssertion;
empty: PromisedAssertion;
arguments: PromisedAssertion;
Arguments: PromisedAssertion;
equal: PromisedEqual;
equals: PromisedEqual;
eq: PromisedEqual;
eql: PromisedEqual;
eqls: PromisedEqual;
property: PromisedProperty;
ownProperty: PromisedOwnProperty;
haveOwnProperty: PromisedOwnProperty;
length: PromisedLength;
lengthOf: PromisedLength;
match(regexp: RegExp | string, message?: string): PromisedAssertion;
string(string: string, message?: string): PromisedAssertion;
keys: PromisedKeys;
key(string: string): PromisedAssertion;
throw: PromisedThrow;
throws: PromisedThrow;
Throw: PromisedThrow;
respondTo(method: string, message?: string): PromisedAssertion;
itself: PromisedAssertion;
satisfy(matcher: Function, message?: string): PromisedAssertion;
closeTo(expected: number, delta: number, message?: string): PromisedAssertion;
members: PromisedMembers;
}
interface PromisedAssertion extends Eventually, PromiseLike<any> {}
interface PromisedLanguageChains {
eventually: Eventually;
// From chai
to: PromisedAssertion;
be: PromisedAssertion;
been: PromisedAssertion;
is: PromisedAssertion;
that: PromisedAssertion;
which: PromisedAssertion;
and: PromisedAssertion;
has: PromisedAssertion;
have: PromisedAssertion;
with: PromisedAssertion;
at: PromisedAssertion;
of: PromisedAssertion;
same: PromisedAssertion;
}
interface PromisedNumericComparison {
above: PromisedNumberComparer;
gt: PromisedNumberComparer;
greaterThan: PromisedNumberComparer;
least: PromisedNumberComparer;
gte: PromisedNumberComparer;
below: PromisedNumberComparer;
lt: PromisedNumberComparer;
lessThan: PromisedNumberComparer;
most: PromisedNumberComparer;
lte: PromisedNumberComparer;
within(start: number, finish: number, message?: string): PromisedAssertion;
}
type PromisedNumberComparer = (value: number, message?: string) => PromisedAssertion;
interface PromisedTypeComparison {
(type: string, message?: string): PromisedAssertion;
instanceof: PromisedInstanceOf;
instanceOf: PromisedInstanceOf;
}
type PromisedInstanceOf = (constructor: Object, message?: string) => PromisedAssertion;
interface PromisedDeep {
equal: PromisedEqual;
include: PromisedInclude;
property: PromisedProperty;
}
interface PromisedKeyFilter {
keys: PromisedKeys;
}
type PromisedEqual = (value: any, message?: string) => PromisedAssertion;
type PromisedProperty = (name: string, value?: any, message?: string) => PromisedAssertion;
type PromisedOwnProperty = (name: string, message?: string) => PromisedAssertion;
interface PromisedLength extends PromisedLanguageChains, PromisedNumericComparison {
(length: number, message?: string): PromisedAssertion;
}
interface PromisedInclude {
(value: Object | string | number, message?: string): PromisedAssertion;
keys: PromisedKeys;
members: PromisedMembers;
all: PromisedKeyFilter;
}
interface PromisedKeys {
(...keys: string[]): PromisedAssertion;
(keys: any[]): PromisedAssertion;
}
interface PromisedThrow {
(): PromisedAssertion;
(expected: string | RegExp, message?: string): PromisedAssertion;
(constructor: Error | Function, expected?: string | RegExp, message?: string): PromisedAssertion;
}
type PromisedMembers = (set: any[], message?: string) => PromisedAssertion;
// For Assert API
interface Assert {
eventually: PromisedAssert;
isFulfilled(promise: PromiseLike<any>, message?: string): PromiseLike<void>;
becomes(promise: PromiseLike<any>, expected: any, message?: string): PromiseLike<void>;
doesNotBecome(promise: PromiseLike<any>, expected: any, message?: string): PromiseLike<void>;
isRejected(promise: PromiseLike<any>, message?: string): PromiseLike<void>;
isRejected(promise: PromiseLike<any>, expected: any | RegExp, message?: string): PromiseLike<void>;
notify(fn: Function): PromiseLike<void>;
}
export interface PromisedAssert {
fail(actual?: any, expected?: any, msg?: string, operator?: string): PromiseLike<void>;
ok(val: any, msg?: string): PromiseLike<void>;
notOk(val: any, msg?: string): PromiseLike<void>;
equal(act: any, exp: any, msg?: string): PromiseLike<void>;
notEqual(act: any, exp: any, msg?: string): PromiseLike<void>;
strictEqual(act: any, exp: any, msg?: string): PromiseLike<void>;
notStrictEqual(act: any, exp: any, msg?: string): PromiseLike<void>;
deepEqual(act: any, exp: any, msg?: string): PromiseLike<void>;
notDeepEqual(act: any, exp: any, msg?: string): PromiseLike<void>;
isTrue(val: any, msg?: string): PromiseLike<void>;
isFalse(val: any, msg?: string): PromiseLike<void>;
isNull(val: any, msg?: string): PromiseLike<void>;
isNotNull(val: any, msg?: string): PromiseLike<void>;
isUndefined(val: any, msg?: string): PromiseLike<void>;
isDefined(val: any, msg?: string): PromiseLike<void>;
isFunction(val: any, msg?: string): PromiseLike<void>;
isNotFunction(val: any, msg?: string): PromiseLike<void>;
isObject(val: any, msg?: string): PromiseLike<void>;
isNotObject(val: any, msg?: string): PromiseLike<void>;
isArray(val: any, msg?: string): PromiseLike<void>;
isNotArray(val: any, msg?: string): PromiseLike<void>;
isString(val: any, msg?: string): PromiseLike<void>;
isNotString(val: any, msg?: string): PromiseLike<void>;
isNumber(val: any, msg?: string): PromiseLike<void>;
isNotNumber(val: any, msg?: string): PromiseLike<void>;
isBoolean(val: any, msg?: string): PromiseLike<void>;
isNotBoolean(val: any, msg?: string): PromiseLike<void>;
typeOf(val: any, type: string, msg?: string): PromiseLike<void>;
notTypeOf(val: any, type: string, msg?: string): PromiseLike<void>;
instanceOf(val: any, type: Function, msg?: string): PromiseLike<void>;
notInstanceOf(val: any, type: Function, msg?: string): PromiseLike<void>;
include(exp: string | any[], inc: any, msg?: string): PromiseLike<void>;
notInclude(exp: string | any[], inc: any, msg?: string): PromiseLike<void>;
match(exp: any, re: RegExp, msg?: string): PromiseLike<void>;
notMatch(exp: any, re: RegExp, msg?: string): PromiseLike<void>;
property(obj: Object, prop: string, msg?: string): PromiseLike<void>;
notProperty(obj: Object, prop: string, msg?: string): PromiseLike<void>;
deepProperty(obj: Object, prop: string, msg?: string): PromiseLike<void>;
notDeepProperty(obj: Object, prop: string, msg?: string): PromiseLike<void>;
propertyVal(obj: Object, prop: string, val: any, msg?: string): PromiseLike<void>;
propertyNotVal(obj: Object, prop: string, val: any, msg?: string): PromiseLike<void>;
deepPropertyVal(obj: Object, prop: string, val: any, msg?: string): PromiseLike<void>;
deepPropertyNotVal(obj: Object, prop: string, val: any, msg?: string): PromiseLike<void>;
lengthOf(exp: any, len: number, msg?: string): PromiseLike<void>;
// alias frenzy
throw(fn: Function, msg?: string): PromiseLike<void>;
throw(fn: Function, regExp: RegExp): PromiseLike<void>;
throw(fn: Function, errType: Function, msg?: string): PromiseLike<void>;
throw(fn: Function, errType: Function, regExp: RegExp): PromiseLike<void>;
throws(fn: Function, msg?: string): PromiseLike<void>;
throws(fn: Function, regExp: RegExp): PromiseLike<void>;
throws(fn: Function, errType: Function, msg?: string): PromiseLike<void>;
throws(fn: Function, errType: Function, regExp: RegExp): PromiseLike<void>;
Throw(fn: Function, msg?: string): PromiseLike<void>;
Throw(fn: Function, regExp: RegExp): PromiseLike<void>;
Throw(fn: Function, errType: Function, msg?: string): PromiseLike<void>;
Throw(fn: Function, errType: Function, regExp: RegExp): PromiseLike<void>;
doesNotThrow(fn: Function, msg?: string): PromiseLike<void>;
doesNotThrow(fn: Function, regExp: RegExp): PromiseLike<void>;
doesNotThrow(fn: Function, errType: Function, msg?: string): PromiseLike<void>;
doesNotThrow(fn: Function, errType: Function, regExp: RegExp): PromiseLike<void>;
operator(val: any, operator: string, val2: any, msg?: string): PromiseLike<void>;
closeTo(act: number, exp: number, delta: number, msg?: string): PromiseLike<void>;
sameMembers(set1: any[], set2: any[], msg?: string): PromiseLike<void>;
includeMembers(set1: any[], set2: any[], msg?: string): PromiseLike<void>;
ifError(val: any, msg?: string): PromiseLike<void>;
}
}

View File

@@ -0,0 +1,21 @@
{
"name": "chai-as-promised-typescript-typings",
"version": "0.0.5",
"description": "Typescript type definitions for chai-as-promised",
"main": "index.d.ts",
"types": "index.d.ts",
"repository": {
"type": "git",
"url": "git+https://github.com/0xProject/0x.js.git"
},
"author": "Fabio Berger",
"contributors": ["Leonid Logvinov <logvinov.leon@gmail.com>"],
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/0xProject/0x.js/issues"
},
"homepage": "https://github.com/0xProject/0x.js/packages/chai-as-promised-typescript-typings#readme",
"dependencies": {
"chai-typescript-typings": "^0.0.0"
}
}

View File

@@ -0,0 +1,15 @@
const postpublish_utils = require('../../../scripts/postpublish_utils');
const packageJSON = require('../package.json');
const subPackageName = packageJSON.name;
postpublish_utils
.getLatestTagAndVersionAsync(subPackageName)
.then(function(result) {
const releaseName = postpublish_utils.getReleaseName(subPackageName, result.version);
const assets = [];
return postpublish_utils.publishReleaseNotes(result.tag, releaseName, assets);
})
.catch(function(err) {
throw err;
});

View File

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

View File

@@ -0,0 +1,3 @@
# CHANGELOG
## v0.x.x - _TBD, 2018_

View File

@@ -0,0 +1,43 @@
## 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
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,16 @@
{
"name": "chai-typescript-typings",
"version": "0.0.2",
"description": "Typescript type definitions for chai",
"main": "index.d.ts",
"types": "index.d.ts",
"repository": {
"type": "git",
"url": "git+https://github.com/0xProject/0x.js.git"
},
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/0xProject/0x.js/issues"
},
"homepage": "https://github.com/0xProject/0x.js/packages/chai-typescript-typings#readme"
}

View File

@@ -0,0 +1,15 @@
const postpublish_utils = require('../../../scripts/postpublish_utils');
const packageJSON = require('../package.json');
const subPackageName = packageJSON.name;
postpublish_utils
.getLatestTagAndVersionAsync(subPackageName)
.then(function(result) {
const releaseName = postpublish_utils.getReleaseName(subPackageName, result.version);
const assets = [];
return postpublish_utils.publishReleaseNotes(result.tag, releaseName, assets);
})
.catch(function(err) {
throw err;
});

View File

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

View File

@@ -1,6 +1,12 @@
# CHANGELOG
## vx.x.x
## v0.5.0 - _January 17, 2018_
* Sanitize api endpoint url and remove trailing slashes (#318)
* Improve error message text in HttpClient (#318)
* Stop appending '/v0' to api endpoint url in HttpClient (#318)
## v0.4.0 - _January 11, 2018_
* Prevent getFeesAsync method on HttpClient from mutating input (#296)

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/connect",
"version": "0.3.2",
"version": "0.5.1",
"description": "A javascript library for interacting with the standard relayer api",
"keywords": ["connect", "0xproject", "ethereum", "tokens", "exchange"],
"main": "lib/src/index.js",
@@ -31,16 +31,16 @@
},
"homepage": "https://github.com/0xProject/0x.js/packages/connect/README.md",
"dependencies": {
"@0xproject/assert": "^0.0.9",
"@0xproject/json-schemas": "^0.7.1",
"@0xproject/utils": "^0.1.2",
"@0xproject/assert": "^0.0.12",
"@0xproject/json-schemas": "^0.7.4",
"@0xproject/utils": "^0.2.1",
"isomorphic-fetch": "^2.2.1",
"lodash": "^4.17.4",
"query-string": "^5.0.1",
"websocket": "^1.0.25"
},
"devDependencies": {
"@0xproject/tslint-config": "^0.4.0",
"@0xproject/tslint-config": "^0.4.3",
"@types/fetch-mock": "^5.12.1",
"@types/lodash": "^4.14.86",
"@types/mocha": "^2.2.42",
@@ -48,8 +48,8 @@
"@types/websocket": "^0.0.34",
"chai": "^4.0.1",
"chai-as-promised": "^7.1.0",
"chai-as-promised-typescript-typings": "^0.0.3",
"chai-typescript-typings": "^0.0.1",
"chai-as-promised-typescript-typings": "^0.0.5",
"chai-typescript-typings": "^0.0.2",
"copyfiles": "^1.2.0",
"dirty-chai": "^2.0.1",
"fetch-mock": "^5.13.1",
@@ -59,6 +59,6 @@
"tslint": "5.8.0",
"typedoc": "~0.8.0",
"typescript": "~2.6.1",
"web3-typescript-typings": "^0.9.0"
"web3-typescript-typings": "^0.9.5"
}
}

View File

@@ -8,22 +8,20 @@ const S3BucketPath = 's3://connect-docs-jsons/';
let tag;
let version;
postpublish_utils.getLatestTagAndVersionAsync(subPackageName)
postpublish_utils
.getLatestTagAndVersionAsync(subPackageName)
.then(function(result) {
tag = result.tag;
version = result.version;
const releaseName = postpublish_utils.getReleaseName(subPackageName, version);
return postpublish_utils.publishReleaseNotes(tag, releaseName);
const releaseName = postpublish_utils.getReleaseName(subPackageName, version);
return postpublish_utils.publishReleaseNotes(tag, releaseName);
})
.then(function(release) {
console.log('POSTPUBLISH: Release successful, generating docs...');
const jsonFilePath = __dirname + '/../' + postpublish_utils.generatedDocsDirectoryName + '/index.json';
return execAsync(
'JSON_FILE_PATH=' + jsonFilePath + ' PROJECT_DIR=' + __dirname + '/.. yarn docs:json',
{
cwd,
}
);
return execAsync('JSON_FILE_PATH=' + jsonFilePath + ' PROJECT_DIR=' + __dirname + '/.. yarn docs:json', {
cwd,
});
})
.then(function(result) {
if (result.stderr !== '') {
@@ -35,6 +33,7 @@ postpublish_utils.getLatestTagAndVersionAsync(subPackageName)
return execAsync('S3_URL=' + s3Url + ' yarn upload_docs_json', {
cwd,
});
}).catch (function(err) {
})
.catch(function(err) {
throw err;
});

View File

@@ -20,6 +20,7 @@ import {
} from './types';
import { relayerResponseJsonParsers } from './utils/relayer_response_json_parsers';
const TRAILING_SLASHES_REGEX = /\/+$/;
/**
* This class includes all the functionality related to interacting with a set of HTTP endpoints
* that implement the standard relayer API v0
@@ -33,7 +34,7 @@ export class HttpClient implements Client {
*/
constructor(url: string) {
assert.isHttpUrl('url', url);
this._apiEndpointUrl = url;
this._apiEndpointUrl = url.replace(TRAILING_SLASHES_REGEX, ''); // remove trailing slashes
}
/**
* Retrieve token pair info from the API
@@ -130,20 +131,22 @@ export class HttpClient implements Client {
const stringifiedParams = queryString.stringify(params);
query = `?${stringifiedParams}`;
}
const url = `${this._apiEndpointUrl}/v0${path}${query}`;
const url = `${this._apiEndpointUrl}${path}${query}`;
const headers = new Headers({
'content-type': 'application/json',
});
const response = await fetch(url, {
method: requestType,
body: JSON.stringify(payload),
headers,
});
if (!response.ok) {
throw Error(response.statusText);
}
const json = await response.json();
if (!response.ok) {
const errorString = `${response.status} - ${response.statusText}\n${requestType} ${url}\n${JSON.stringify(
json,
)}`;
throw Error(errorString);
}
return json;
}
}

View File

@@ -29,14 +29,23 @@ describe('HttpClient', () => {
afterEach(() => {
fetchMock.restore();
});
describe('#constructor', () => {
it('should remove trailing slashes from api url', async () => {
const urlWithTrailingSlash = 'https://slash.com/';
const urlWithoutTrailingSlash = 'https://slash.com';
const client = new HttpClient(urlWithTrailingSlash);
const sanitizedUrl = (client as any)._apiEndpointUrl;
expect(sanitizedUrl).to.be.deep.equal(urlWithoutTrailingSlash);
});
});
describe('#getTokenPairsAsync', () => {
const url = `${relayUrl}/v0/token_pairs`;
const url = `${relayUrl}/token_pairs`;
it('gets token pairs', async () => {
fetchMock.get(url, tokenPairsResponseJSON);
const tokenPairs = await relayerClient.getTokenPairsAsync();
expect(tokenPairs).to.be.deep.equal(tokenPairsResponse);
});
it('gets specfic token pairs for request', async () => {
it('gets specific token pairs for request', async () => {
const tokenAddress = '0x323b5d4c32345ced77393b3530b1eed0f346429d';
const tokenPairsRequest = {
tokenA: tokenAddress,
@@ -52,7 +61,7 @@ describe('HttpClient', () => {
});
});
describe('#getOrdersAsync', () => {
const url = `${relayUrl}/v0/orders`;
const url = `${relayUrl}/orders`;
it('gets orders', async () => {
fetchMock.get(url, ordersResponseJSON);
const orders = await relayerClient.getOrdersAsync();
@@ -75,7 +84,7 @@ describe('HttpClient', () => {
});
describe('#getOrderAsync', () => {
const orderHash = '0xabc67323774bdbd24d94f977fa9ac94a50f016026fd13f42990861238897721f';
const url = `${relayUrl}/v0/order/${orderHash}`;
const url = `${relayUrl}/order/${orderHash}`;
it('gets order', async () => {
fetchMock.get(url, orderResponseJSON);
const order = await relayerClient.getOrderAsync(orderHash);
@@ -91,7 +100,7 @@ describe('HttpClient', () => {
baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
quoteTokenAddress: '0xa2b31dacf30a9c50ca473337c01d8a201ae33e32',
};
const url = `${relayUrl}/v0/orderbook?baseTokenAddress=${request.baseTokenAddress}&quoteTokenAddress=${
const url = `${relayUrl}/orderbook?baseTokenAddress=${request.baseTokenAddress}&quoteTokenAddress=${
request.quoteTokenAddress
}`;
it('gets order book', async () => {
@@ -116,7 +125,7 @@ describe('HttpClient', () => {
salt: new BigNumber('256'),
expirationUnixTimestampSec: new BigNumber('42'),
};
const url = `${relayUrl}/v0/fees`;
const url = `${relayUrl}/fees`;
it('gets fees', async () => {
fetchMock.post(url, feesResponseJSON);
const fees = await relayerClient.getFeesAsync(request);

View File

@@ -1,7 +1,7 @@
{
"private": true,
"name": "contracts",
"version": "2.1.1",
"version": "2.1.5",
"description": "Smart contract components of 0x protocol",
"main": "index.js",
"directories": {
@@ -11,13 +11,13 @@
"build":
"rm -rf ./lib; copyfiles ./build/**/* ./deploy/solc/solc_bin/* ./deploy/test/fixtures/contracts/**/* ./deploy/test/fixtures/contracts/* ./lib; tsc;",
"test": "npm run build; truffle test",
"compile": "npm run build; node lib/deploy/cli.js compile",
"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",
"clean": "rm -rf ./lib",
"migrate:truffle": "npm run build; truffle migrate",
"migrate": "npm run build; node lib/deploy/cli.js migrate",
"migrate": "node ../deployer/lib/src/cli.js migrate",
"lint": "tslint --project . 'migrations/**/*.ts' 'test/**/*.ts' 'util/**/*.ts' 'deploy/**/*.ts'",
"test:circleci": "yarn test; yarn test:deployer",
"test:deployer": "npm run build; mocha lib/deploy/test/*_test.js"
"test:circleci": "yarn test"
},
"repository": {
"type": "git",
@@ -30,9 +30,9 @@
},
"homepage": "https://github.com/0xProject/0x.js/packages/contracts/README.md",
"devDependencies": {
"@0xproject/dev-utils": "^0.0.3",
"@0xproject/tslint-config": "^0.4.0",
"@0xproject/types": "^0.1.2",
"@0xproject/dev-utils": "^0.0.6",
"@0xproject/tslint-config": "^0.4.3",
"@0xproject/types": "^0.1.5",
"@types/bluebird": "^3.5.3",
"@types/lodash": "^4.14.86",
"@types/node": "^8.0.53",
@@ -40,9 +40,9 @@
"@types/yargs": "^10.0.0",
"chai": "^4.0.1",
"chai-as-promised": "^7.1.0",
"chai-as-promised-typescript-typings": "^0.0.3",
"chai-as-promised-typescript-typings": "^0.0.5",
"chai-bignumber": "^2.0.1",
"chai-typescript-typings": "^0.0.1",
"chai-typescript-typings": "^0.0.2",
"copyfiles": "^1.2.0",
"dirty-chai": "^2.0.1",
"mocha": "^4.0.1",
@@ -52,14 +52,15 @@
"types-bn": "^0.0.1",
"types-ethereumjs-util": "0xProject/types-ethereumjs-util",
"typescript": "~2.6.1",
"web3-typescript-typings": "^0.9.0",
"web3-typescript-typings": "^0.9.5",
"yargs": "^10.0.3"
},
"dependencies": {
"0x.js": "^0.29.0",
"@0xproject/json-schemas": "^0.7.1",
"@0xproject/utils": "^0.1.2",
"@0xproject/web3-wrapper": "^0.1.2",
"0x.js": "^0.30.1",
"@0xproject/deployer": "^0.0.2",
"@0xproject/json-schemas": "^0.7.4",
"@0xproject/utils": "^0.2.1",
"@0xproject/web3-wrapper": "^0.1.6",
"bluebird": "^3.5.0",
"bn.js": "^4.11.8",
"ethereumjs-abi": "^0.6.4",

View File

@@ -84,15 +84,6 @@ export interface TransactionDataParams {
args: any[];
}
export interface Token {
address?: string;
name: string;
symbol: string;
decimals: number;
ipfsHash: string;
swarmHash: string;
}
export interface MultiSigConfig {
owners: string[];
confirmationsRequired: number;
@@ -103,6 +94,15 @@ export interface MultiSigConfigByNetwork {
[networkName: string]: MultiSigConfig;
}
export interface Token {
address?: string;
name: string;
symbol: string;
decimals: number;
ipfsHash: string;
swarmHash: string;
}
export interface TokenInfoByNetwork {
development: Token[];
live: Token[];

View File

@@ -0,0 +1,73 @@
## @0xproject/deployer
This repository contains a CLI tool that facilitates compiling and deployment of smart contracts.
## Installation
```bash
yarn add @0xproject/deployer
```
## Usage
```bash
node ./node_modules/@0xproject/deployer/lib/cli.js --help
cli.js [command]
Commands:
cli.js compile compile contracts
cli.js migrate compile and deploy contracts using migration scripts
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/0x.js/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/0x.js/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]
```
## 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.
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
```
### Build
```bash
yarn build
```
### Lint
```bash
yarn lint
```
### Run Tests
```bash
yarn test
```

View File

@@ -0,0 +1,43 @@
{
"name": "@0xproject/deployer",
"version": "0.0.2",
"description": "Smart contract deployer of 0x protocol",
"main": "lib/src/cli.js",
"scripts": {
"build": "yarn clean && copyfiles 'test/fixtures/contracts/**/*' src/solc/solc_bin/* ./lib && tsc",
"test": "npm run build; mocha lib/test/*_test.js",
"compile": "npm run build; node lib/src/cli.js compile",
"clean": "rm -rf ./lib",
"migrate": "npm run build; node lib/src/cli.js migrate",
"lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
"test:circleci": "yarn test"
},
"bin": {
"0x-deployer": "lib/src/cli.js"
},
"repository": {
"type": "git",
"url": "https://github.com/0xProject/0x.js.git"
},
"author": "Amir Bandeali",
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/0xProject/0x.js/issues"
},
"homepage": "https://github.com/0xProject/0x.js/packages/deployer/README.md",
"devDependencies": {
"copyfiles": "^1.2.0",
"types-bn": "^0.0.1",
"typescript": "~2.6.1",
"web3-typescript-typings": "^0.9.5"
},
"dependencies": {
"@0xproject/utils": "^0.1.3",
"@0xproject/web3-wrapper": "^0.1.6",
"lodash": "^4.17.4",
"solc": "^0.4.18",
"web3": "^0.20.0",
"web3-eth-abi": "^1.0.0-beta.24",
"yargs": "^10.0.3"
}
}

View File

@@ -0,0 +1,39 @@
const execAsync = require('async-child-process').execAsync;
const postpublish_utils = require('../../../scripts/postpublish_utils');
const packageJSON = require('../package.json');
const cwd = __dirname + '/..';
const subPackageName = packageJSON.name;
const S3BucketPath = 's3://connect-docs-jsons/';
let tag;
let version;
postpublish_utils
.getLatestTagAndVersionAsync(subPackageName)
.then(function(result) {
tag = result.tag;
version = result.version;
const releaseName = postpublish_utils.getReleaseName(subPackageName, version);
return postpublish_utils.publishReleaseNotes(tag, releaseName);
})
.then(function(release) {
console.log('POSTPUBLISH: Release successful, generating docs...');
const jsonFilePath = __dirname + '/../' + postpublish_utils.generatedDocsDirectoryName + '/index.json';
return execAsync('JSON_FILE_PATH=' + jsonFilePath + ' PROJECT_DIR=' + __dirname + '/.. yarn docs:json', {
cwd,
});
})
.then(function(result) {
if (result.stderr !== '') {
throw new Error(result.stderr);
}
const fileName = 'v' + version + '.json';
console.log('POSTPUBLISH: Doc generation successful, uploading docs... as ', fileName);
const s3Url = S3BucketPath + fileName;
return execAsync('S3_URL=' + s3Url + ' yarn upload_docs_json', {
cwd,
});
})
.catch(function(err) {
throw err;
});

View File

@@ -5,8 +5,8 @@ import * as path from 'path';
import * as Web3 from 'web3';
import * as yargs from 'yargs';
import { commands } from './src/commands';
import { CliOptions, CompilerOptions, DeployerOptions } from './src/utils/types';
import { commands } from './commands';
import { CliOptions, CompilerOptions, DeployerOptions } from './utils/types';
const DEFAULT_OPTIMIZER_ENABLED = false;
const DEFAULT_CONTRACTS_DIR = path.resolve('contracts');

View File

@@ -1,4 +1,4 @@
import { migrator } from './../migrations/migrate';
import { migrator } from './migrations/migrate';
import { Compiler } from './compiler';
import { Deployer } from './deployer';
import { CompilerOptions, DeployerOptions } from './utils/types';

View File

@@ -4,7 +4,7 @@ import * as path from 'path';
import solc = require('solc');
import * as Web3 from 'web3';
import { binPaths } from './../solc/bin_paths';
import { binPaths } from './solc/bin_paths';
import { fsWrapper } from './utils/fs_wrapper';
import {
CompilerOptions,
@@ -113,7 +113,6 @@ export class Compiler {
public async compileAllAsync(): Promise<void> {
await this._createArtifactsDirIfDoesNotExistAsync();
this._contractSourcesIfExists = await Compiler._getContractSourcesAsync(this._contractsDir);
const contractBaseNames = _.keys(this._contractSourcesIfExists);
const compiledContractPromises = _.map(contractBaseNames, async (contractBaseName: string): Promise<void> => {
return this._compileContractAsync(contractBaseName);
@@ -167,7 +166,7 @@ export class Compiler {
};
const solcVersion = Compiler._parseSolidityVersion(source);
const fullSolcVersion = binPaths[solcVersion];
const solcBinPath = `./../solc/solc_bin/${fullSolcVersion}`;
const solcBinPath = `./solc/solc_bin/${fullSolcVersion}`;
const solcBin = require(solcBinPath);
const solcInstance = solc.setupMethods(solcBin);

8
packages/deployer/src/globals.d.ts vendored Normal file
View File

@@ -0,0 +1,8 @@
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;
}

View File

@@ -0,0 +1,10 @@
import { MultiSigConfigByNetwork } from '../../types';
// Make a copy of this file named `multisig.js` and input custom params as needed
export const multiSig: MultiSigConfigByNetwork = {
kovan: {
owners: [],
confirmationsRequired: 0,
secondsRequired: 0,
},
};

View File

@@ -1,5 +1,5 @@
import { constants } from './../../src/utils/constants';
import { Token } from './../../src/utils/types';
import { constants } from '../../utils/constants';
import { Token } from '../../types';
export const tokenInfo: Token[] = [
{

View File

@@ -2,8 +2,8 @@ import { BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
import { Deployer } from './../src/deployer';
import { constants } from './../src/utils/constants';
import { Deployer } from '../deployer';
import { constants } from '../utils/constants';
import { tokenInfo } from './config/token_info';
export const migrator = {

View File

@@ -0,0 +1,23 @@
export interface MultiSigConfig {
owners: string[];
confirmationsRequired: number;
secondsRequired: number;
}
export interface MultiSigConfigByNetwork {
[networkName: string]: MultiSigConfig;
}
export interface Token {
address?: string;
name: string;
symbol: string;
decimals: number;
ipfsHash: string;
swarmHash: string;
}
export interface TokenInfoByNetwork {
development: Token[];
live: Token[];
}

View File

@@ -1,10 +1,10 @@
import * as chai from 'chai';
import 'mocha';
import { Compiler } from './../src/compiler';
import { Deployer } from './../src/deployer';
import { fsWrapper } from './../src/utils/fs_wrapper';
import { CompilerOptions, ContractArtifact, ContractData, DoneCallback } from './../src/utils/types';
import { Compiler } from '../src/compiler';
import { Deployer } from '../src/deployer';
import { fsWrapper } from '../src/utils/fs_wrapper';
import { CompilerOptions, ContractArtifact, ContractData, DoneCallback } from '../src/utils/types';
import { constructor_args, exchange_binary } from './fixtures/exchange_bin';
import { constants } from './util/constants';

View File

@@ -0,0 +1,16 @@
{
"extends": "../../tsconfig",
"compilerOptions": {
"outDir": "lib",
"strictFunctionTypes": false,
"strictNullChecks": false
},
"include": [
"./src/**/*",
"./test/**/*",
"../../node_modules/types-bn/index.d.ts",
"../../node_modules/types-ethereumjs-util/index.d.ts",
"../../node_modules/chai-typescript-typings/index.d.ts",
"../../node_modules/web3-typescript-typings/index.d.ts"
]
}

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/dev-utils",
"version": "0.0.3",
"version": "0.0.6",
"description": "0x dev TS utils",
"main": "lib/index.js",
"types": "lib/index.d.ts",
@@ -19,7 +19,7 @@
},
"homepage": "https://github.com/0xProject/0x.js/packages/dev-utils/README.md",
"devDependencies": {
"@0xproject/tslint-config": "^0.4.0",
"@0xproject/tslint-config": "^0.4.3",
"@types/lodash": "^4.14.86",
"npm-run-all": "^4.1.2",
"shx": "^0.2.2",
@@ -29,7 +29,7 @@
"typescript": "~2.6.1"
},
"dependencies": {
"@0xproject/utils": "^0.1.2",
"@0xproject/utils": "^0.2.1",
"ethereumjs-util": "^5.1.2",
"lodash": "^4.17.4",
"request-promise-native": "^1.0.5"

View File

@@ -0,0 +1,15 @@
const postpublish_utils = require('../../../scripts/postpublish_utils');
const packageJSON = require('../package.json');
const subPackageName = packageJSON.name;
postpublish_utils
.getLatestTagAndVersionAsync(subPackageName)
.then(function(result) {
const releaseName = postpublish_utils.getReleaseName(subPackageName, result.version);
const assets = [];
return postpublish_utils.publishReleaseNotes(result.tag, releaseName, assets);
})
.catch(function(err) {
throw err;
});

View File

@@ -41,7 +41,7 @@ export class RPC {
method,
params,
});
this._url += 1;
this._id += 1;
return payload;
}
private async _sendAsync(payload: string): Promise<any> {

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/json-schemas",
"version": "0.7.1",
"version": "0.7.4",
"description": "0x-related json schemas",
"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",
@@ -27,13 +27,13 @@
"lodash.values": "^4.3.0"
},
"devDependencies": {
"@0xproject/tslint-config": "^0.4.0",
"@0xproject/utils": "^0.1.2",
"@0xproject/tslint-config": "^0.4.3",
"@0xproject/utils": "^0.2.1",
"@types/lodash.foreach": "^4.5.3",
"@types/lodash.values": "^4.3.3",
"@types/mocha": "^2.2.42",
"chai": "^4.0.1",
"chai-typescript-typings": "^0.0.1",
"chai-typescript-typings": "^0.0.2",
"dirty-chai": "^2.0.1",
"lodash.foreach": "^4.5.0",
"mocha": "^4.0.1",

View File

@@ -3,12 +3,13 @@ const packageJSON = require('../package.json');
const subPackageName = packageJSON.name;
postpublish_utils.getLatestTagAndVersionAsync(subPackageName)
postpublish_utils
.getLatestTagAndVersionAsync(subPackageName)
.then(function(result) {
const releaseName = postpublish_utils.getReleaseName(subPackageName, result.version);
const assets = [];
return postpublish_utils.publishReleaseNotes(result.tag, releaseName, assets);
})
.catch (function(err) {
.catch(function(err) {
throw err;
});

View File

@@ -1,93 +0,0 @@
import * as express from 'express';
import * as _ from 'lodash';
import ProviderEngine = require('web3-provider-engine');
import HookedWalletSubprovider = require('web3-provider-engine/subproviders/hooked-wallet');
import NonceSubprovider = require('web3-provider-engine/subproviders/nonce-tracker');
import RpcSubprovider = require('web3-provider-engine/subproviders/rpc');
import { configs } from './configs';
import { EtherRequestQueue } from './ether_request_queue';
import { idManagement } from './id_management';
import { utils } from './utils';
import { ZRXRequestQueue } from './zrx_request_queue';
// HACK: web3 leaks XMLHttpRequest into the global scope and causes requests to hang
// because they are using the wrong XHR package.
// Filed issue: https://github.com/ethereum/web3.js/issues/844
// tslint:disable-next-line:ordered-imports
import * as Web3 from 'web3';
export class Handler {
private _etherRequestQueue: EtherRequestQueue;
private _zrxRequestQueue: ZRXRequestQueue;
private _web3: Web3;
constructor() {
// Setup provider engine to talk with RPC node
const providerObj = this._createProviderEngine(configs.RPC_URL);
this._web3 = new Web3(providerObj);
this._etherRequestQueue = new EtherRequestQueue(this._web3);
this._zrxRequestQueue = new ZRXRequestQueue(this._web3);
}
public dispenseEther(req: express.Request, res: express.Response) {
const recipientAddress = req.params.recipient;
if (_.isUndefined(recipientAddress) || !this._isValidEthereumAddress(recipientAddress)) {
res.status(400).send('INVALID_REQUEST');
return;
}
const lowerCaseRecipientAddress = recipientAddress.toLowerCase();
const didAddToQueue = this._etherRequestQueue.add(lowerCaseRecipientAddress);
if (!didAddToQueue) {
res.status(503).send('QUEUE_IS_FULL');
return;
}
utils.consoleLog(`Added ${lowerCaseRecipientAddress} to the ETH queue`);
res.status(200).end();
}
public dispenseZRX(req: express.Request, res: express.Response) {
const recipientAddress = req.params.recipient;
if (_.isUndefined(recipientAddress) || !this._isValidEthereumAddress(recipientAddress)) {
res.status(400).send('INVALID_REQUEST');
return;
}
const lowerCaseRecipientAddress = recipientAddress.toLowerCase();
const didAddToQueue = this._zrxRequestQueue.add(lowerCaseRecipientAddress);
if (!didAddToQueue) {
res.status(503).send('QUEUE_IS_FULL');
return;
}
utils.consoleLog(`Added ${lowerCaseRecipientAddress} to the ZRX queue`);
res.status(200).end();
}
public getQueueInfo(req: express.Request, res: express.Response) {
res.setHeader('Content-Type', 'application/json');
const payload = JSON.stringify({
ether: {
full: this._etherRequestQueue.isFull(),
size: this._etherRequestQueue.size(),
},
zrx: {
full: this._zrxRequestQueue.isFull(),
size: this._zrxRequestQueue.size(),
},
});
res.status(200).send(payload);
}
// tslint:disable-next-line:prefer-function-over-method
private _createProviderEngine(rpcUrl: string) {
const engine = new ProviderEngine();
engine.addProvider(new NonceSubprovider());
engine.addProvider(new HookedWalletSubprovider(idManagement));
engine.addProvider(
new RpcSubprovider({
rpcUrl,
}),
);
engine.start();
return engine;
}
private _isValidEthereumAddress(address: string): boolean {
const lowercaseAddress = address.toLowerCase();
return this._web3.isAddress(lowercaseAddress);
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/monorepo-scripts",
"version": "0.1.2",
"version": "0.1.5",
"private": true,
"description": "Helper scripts for the monorepo",
"scripts": {
@@ -19,7 +19,7 @@
},
"homepage": "https://github.com/0xProject/0x.js/packages/monorepo-scripts/README.md",
"devDependencies": {
"@0xproject/tslint-config": "^0.4.0",
"@0xproject/tslint-config": "^0.4.3",
"@types/glob": "^5.0.33",
"@types/node": "^8.0.53",
"shx": "^0.2.2",

View File

@@ -0,0 +1,15 @@
const postpublish_utils = require('../../../scripts/postpublish_utils');
const packageJSON = require('../package.json');
const subPackageName = packageJSON.name;
postpublish_utils
.getLatestTagAndVersionAsync(subPackageName)
.then(function(result) {
const releaseName = postpublish_utils.getReleaseName(subPackageName, result.version);
const assets = [];
return postpublish_utils.publishReleaseNotes(result.tag, releaseName, assets);
})
.catch(function(err) {
throw err;
});

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/subproviders",
"version": "0.2.0",
"version": "0.3.2",
"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",
"license": "Apache-2.0",
@@ -17,8 +17,8 @@
"test:integration": "run-s clean build run_mocha_integration"
},
"dependencies": {
"@0xproject/assert": "^0.0.9",
"@0xproject/utils": "^0.1.2",
"@0xproject/assert": "^0.0.12",
"@0xproject/utils": "^0.2.1",
"bn.js": "^4.11.8",
"es6-promisify": "^5.0.0",
"ethereumjs-tx": "^1.3.3",
@@ -31,16 +31,16 @@
"web3-provider-engine": "^13.0.1"
},
"devDependencies": {
"@0xproject/tslint-config": "^0.4.0",
"@0xproject/utils": "^0.1.2",
"@0xproject/tslint-config": "^0.4.3",
"@0xproject/utils": "^0.2.1",
"@types/lodash": "^4.14.86",
"@types/mocha": "^2.2.42",
"@types/node": "^8.0.53",
"awesome-typescript-loader": "^3.1.3",
"chai": "^4.0.1",
"chai-as-promised": "^7.1.0",
"chai-as-promised-typescript-typings": "^0.0.3",
"chai-typescript-typings": "^0.0.1",
"chai-as-promised-typescript-typings": "^0.0.5",
"chai-typescript-typings": "^0.0.2",
"dirty-chai": "^2.0.1",
"mocha": "^4.0.1",
"npm-run-all": "^4.1.2",

View File

@@ -1,5 +1,3 @@
/// <reference types='chai-typescript-typings' />
/// <reference types='chai-as-promised-typescript-typings' />
declare module 'dirty-chai';
declare module 'es6-promisify';

View File

@@ -1,4 +1,4 @@
## @0xproject/kovan_faucets
## @0xproject/testnet-faucets
This faucet dispenses 0.1 test ether to one recipient per second and 0.1 test ZRX every 5 seconds. It has a max queue size of 1000.
@@ -31,14 +31,19 @@ yarn install
Set the following environment variables:
```bash
export FAUCET_ENVIRONMENT=development
export DISPENSER_ADDRESS=0x5409ed021d9299bf6814279a6a1411a7e866a631
export DISPENSER_PRIVATE_KEY=f2f48ee19680706196e2e339e5da3491186e0c4c5030670656b0e0164837257d
export FAUCET_ROLLBAR_ACCESS_KEY={GET_THIS_FROM_ROLLBAR_ACCOUNT_SETTINGS}
export INFURA_API_KEY={GET_THIS_FROM_INFURA}
```
Infura API Key can be requested here: https://infura.io/register.html
If you want to talk to testrpc, set the following environment variable:
```bash
export FAUCET_ENVIRONMENT=development
```
Infura API Key can be requested here: https://infura.io/signup
Note: The above public/private keys exist when running `testrpc` with the following option `--mnemonic concert load couple harbor equip island argue ramp clarify fence smart topic`.
@@ -48,27 +53,73 @@ yarn dev
### Endpoints
`GET /ping`
Returns `pong`
`GET /info`
Returns a JSON payload describing the state of the queues for each network. For example:
```json
{
"3": {
"ether": {
"full": false,
"size": 4
},
"zrx": {
"full": false,
"size": 6
}
},
"42": {
"ether": {
"full": false,
"size": 8
},
"zrx": {
"full": false,
"size": 20
}
}
}
```
`GET /ether/:recipient`
Where recipient_address is a hex encoded Ethereum address prefixed with `0x`.
Where recipient is a hex encoded Ethereum address prefixed with `0x`.
`GET /zrx/:recipient`
Where recipient_address is a hex encoded Ethereum address prefixed with `0x`.
Where recipient is a hex encoded Ethereum address prefixed with `0x`.
#### Parameters
The endpoints `/ether` and `/zrx` take a query parameter named `networkId` to specify the desired network where you would like to receive the ETH or ZRX. For example:
```bash
curl -i http://localhost:3000/ether/0x14e2F1F157E7DD4057D02817436D628A37120FD1\?networkId=3
```
This command will request the local server to initiate a transfer of 0.1 ETH from the dispensing address to `0x14e2F1F157E7DD4057D02817436D628A37120FD1` on the Ropsten testnet.
If no `networkId` is provided via query parameters the faucet will default to network 42 (Kovan)
### Docker configs
```
docker run -d \
-p 80:3000 \
--name kovan-faucets \
--name testnet-faucets \
--log-opt max-size=100m \
--log-opt max-file=20 \
-e DISPENSER_ADDRESS=$DISPENSER_ADDRESS \
-e DISPENSER_PRIVATE_KEY=$DISPENSER_PRIVATE_KEY \
-e FAUCET_ROLLBAR_ACCESS_KEY=$FAUCET_ROLLBAR_ACCESS_KEY \
-e FAUCET_ENVIRONMENT=production \
kovan-faucets
-e INFURA_API_KEY=$INFURA_API_KEY \
testnet-faucets
```
### Lint

Some files were not shown because too many files have changed in this diff Show More