Compare commits
82 Commits
chai-types
...
@0xproject
Author | SHA1 | Date | |
---|---|---|---|
|
ef32822b31 | ||
|
e588f6f8c3 | ||
|
d227f2ad7c | ||
|
97c228031a | ||
|
ad85011d62 | ||
|
a70379625d | ||
|
7350333129 | ||
|
216420fdc5 | ||
|
c559fbbe8c | ||
|
390534497e | ||
|
3f0ec89f11 | ||
|
d3aa4f2bc7 | ||
|
f58f0ddb67 | ||
|
633e3129d4 | ||
|
877bdce4c8 | ||
|
6e1fbd2d97 | ||
|
36bfe62a8f | ||
|
b08bd0f9ab | ||
|
3998b47d84 | ||
|
d965fdb11d | ||
|
8a858501f2 | ||
|
e1af25c8a6 | ||
|
6091f818da | ||
|
a45f9b4802 | ||
|
9ccf63b44a | ||
|
d34135ae43 | ||
|
a81f6f9ad1 | ||
|
8a80b10cc2 | ||
|
22b1ee132a | ||
|
ab7f681f15 | ||
|
2ac806ef08 | ||
|
13ec8ed03c | ||
|
fb77817c2d | ||
|
ceb8a492b1 | ||
|
cfc868bf4d | ||
|
7b4e2257d8 | ||
|
4ac6e5477d | ||
|
614ea14a7f | ||
|
ce45f99006 | ||
|
9203813a61 | ||
|
ba987b0574 | ||
|
b20f34adb7 | ||
|
63d0d810b1 | ||
|
5491400684 | ||
|
6a5165e9b3 | ||
|
9a7c4442d2 | ||
|
0e5363b5c3 | ||
|
d41bce36be | ||
|
1380cd811e | ||
|
d99bb3a87c | ||
|
4b9501318d | ||
|
e5eec04f92 | ||
|
f9c21efc30 | ||
|
ae72b71895 | ||
|
87e3fe725d | ||
|
807d9e3eef | ||
|
9e569b3791 | ||
|
024f093585 | ||
|
996e9e9102 | ||
|
d58bfb46cf | ||
|
eb0d7df50b | ||
|
b4375d6f64 | ||
|
9f47c72d31 | ||
|
de3bf03f42 | ||
|
59a39ac57d | ||
|
df9c2b193e | ||
|
3894311d68 | ||
|
35501dd4fc | ||
|
e2ca713658 | ||
|
a45de6d427 | ||
|
a350638526 | ||
|
59f9605ed9 | ||
|
9521bf8d4f | ||
|
7c1c94d39b | ||
|
8a74963815 | ||
|
3ebd8b7f45 | ||
|
ae8cb2e6a8 | ||
|
1ccb978612 | ||
|
7040a01cf2 | ||
|
6bc0e815e9 | ||
|
593f7e826c | ||
|
835fa0af13 |
@@ -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
|
||||
|
@@ -27,20 +27,21 @@ This repository contains all the 0x developer tools written in TypeScript. Our h
|
||||
| [`@0xproject/abi-gen`](/packages/abi-gen) | [](https://www.npmjs.com/package/@0xproject/abi-gen) | Tool to generate TS wrappers from smart contract ABIs |
|
||||
| [`@0xproject/assert`](/packages/assert) | [](https://www.npmjs.com/package/@0xproject/assert) | Type and schema assertions used by our packages |
|
||||
| [`@0xproject/connect`](/packages/connect) | [](https://www.npmjs.com/package/@0xproject/connect) | A Javascript library for interacting with the standard relayer api |
|
||||
| [`@0xproject/dev-utils`](/packages/dev-utils) | [](https://www.npmjs.com/package/@0xproject/dev-utils) | Dev utils to be shared across 0x projects and packages |
|
||||
| [`@0xproject/json-schemas`](/packages/json-schemas) | [](https://www.npmjs.com/package/@0xproject/json-schemas) | 0x-related json schemas |
|
||||
| [`@0xproject/subproviders`](/packages/subproviders) | [](https://www.npmjs.com/package/@0xproject/subproviders) | Useful web3 subproviders (e.g LedgerSubprovider) |
|
||||
| [`@0xproject/tslint-config`](/packages/tslint-config) | [](https://www.npmjs.com/package/@0xproject/tslint-config) | Custom 0x development TSLint rules |
|
||||
| [`@0xproject/types`](/packages/types) | [](https://www.npmjs.com/package/@0xproject/types) | Shared type declarations |
|
||||
| [`@0xproject/utils`](/packages/utils) | [](https://www.npmjs.com/package/@0xproject/utils) | Shared utilities |
|
||||
| [`@0xproject/web3-wrapper`](/packages/web3-wrapper) | [](https://www.npmjs.com/package/@0xproject/web3-wrapper) | Web3 wrapper | |
|
||||
| [`@0xproject/web3-wrapper`](/packages/web3-wrapper) | [](https://www.npmjs.com/package/@0xproject/web3-wrapper) | Web3 wrapper |
|
||||
|
||||
### 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
|
||||
|
@@ -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",
|
||||
|
@@ -1,5 +1,11 @@
|
||||
# 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)
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "0x.js",
|
||||
"version": "0.29.2",
|
||||
"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.1.1",
|
||||
"@0xproject/dev-utils": "^0.0.4",
|
||||
"@0xproject/tslint-config": "^0.4.1",
|
||||
"@0xproject/types": "^0.1.3",
|
||||
"@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.3",
|
||||
"web3-typescript-typings": "^0.9.5",
|
||||
"webpack": "^3.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0xproject/assert": "^0.0.10",
|
||||
"@0xproject/json-schemas": "^0.7.2",
|
||||
"@0xproject/utils": "^0.1.3",
|
||||
"@0xproject/web3-wrapper": "^0.1.4",
|
||||
"@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",
|
||||
|
@@ -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
|
@@ -191,6 +191,7 @@ export class ZeroEx {
|
||||
this._abiDecoder,
|
||||
this.token,
|
||||
config.exchangeContractAddress,
|
||||
config.zrxContractAddress,
|
||||
);
|
||||
this.tokenRegistry = new TokenRegistryWrapper(
|
||||
this._web3Wrapper,
|
||||
|
@@ -274,6 +274,9 @@
|
||||
"3": {
|
||||
"address": "0xc00fd9820cd2898cc4c054b7bf142de637ad129a"
|
||||
},
|
||||
"4": {
|
||||
"address": "0xc778417e063141139fce010982780140aa0cd5ab"
|
||||
},
|
||||
"42": {
|
||||
"address": "0x653e49e301e508a13237c0ddc98ae7d4cd2667a1"
|
||||
},
|
||||
|
@@ -597,6 +597,9 @@
|
||||
"3": {
|
||||
"address": "0x479cc461fecd078f766ecc58533d6f69580cf3ac"
|
||||
},
|
||||
"4": {
|
||||
"address": "0x1d16ef40fac01cec8adac2ac49427b9384192c05"
|
||||
},
|
||||
"42": {
|
||||
"address": "0x90fe2af704b34e0224bf2299c838e04d4dcf1364"
|
||||
},
|
||||
|
@@ -534,6 +534,9 @@
|
||||
"3": {
|
||||
"address": "0x6b1a50f0bb5a7995444bd3877b22dc89c62843ed"
|
||||
},
|
||||
"4": {
|
||||
"address": "0x4e9aad8184de8833365fea970cd9149372fdf1e6"
|
||||
},
|
||||
"42": {
|
||||
"address": "0xf18e504561f4347bea557f3d4558f559dddbae7f"
|
||||
},
|
||||
|
@@ -174,6 +174,9 @@
|
||||
"3": {
|
||||
"address": "0x4e9aad8184de8833365fea970cd9149372fdf1e6"
|
||||
},
|
||||
"4": {
|
||||
"address": "0xa8e9fa8f91e5ae138c74648c9c304f1c75003a8d"
|
||||
},
|
||||
"42": {
|
||||
"address": "0x087eed4bc1ee3de49befbd66c662b434b15d49d4"
|
||||
},
|
||||
|
@@ -7,6 +7,9 @@
|
||||
"3": {
|
||||
"address": "0xa8e9fa8f91e5ae138c74648c9c304f1c75003a8d"
|
||||
},
|
||||
"4": {
|
||||
"address": "0x00f58d6d585f84b2d7267940cede30ce2fe6eae8"
|
||||
},
|
||||
"42": {
|
||||
"address": "0x6ff6c0ff1d68b964901f986d4c9fa3ac68346570"
|
||||
},
|
||||
|
@@ -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
|
||||
|
12
packages/0x.js/src/globals.d.ts
vendored
12
packages/0x.js/src/globals.d.ts
vendored
@@ -25,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;
|
||||
}
|
||||
|
@@ -51,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,
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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,
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0xproject/abi-gen",
|
||||
"version": "0.1.1",
|
||||
"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.3",
|
||||
"@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.1",
|
||||
"@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.3"
|
||||
"web3-typescript-typings": "^0.9.5"
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0xproject/assert",
|
||||
"version": "0.0.10",
|
||||
"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.1",
|
||||
"@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.2",
|
||||
"@0xproject/utils": "^0.1.3",
|
||||
"@0xproject/json-schemas": "^0.7.4",
|
||||
"@0xproject/utils": "^0.2.1",
|
||||
"lodash": "^4.17.4",
|
||||
"valid-url": "^1.0.9"
|
||||
}
|
||||
|
@@ -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,
|
||||
|
@@ -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'];
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "chai-as-promised-typescript-typings",
|
||||
"version": "0.0.3",
|
||||
"version": "0.0.5",
|
||||
"description": "Typescript type definitions for chai-as-promised",
|
||||
"main": "index.d.ts",
|
||||
"types": "index.d.ts",
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "chai-typescript-typings",
|
||||
"version": "0.0.1",
|
||||
"version": "0.0.2",
|
||||
"description": "Typescript type definitions for chai",
|
||||
"main": "index.d.ts",
|
||||
"types": "index.d.ts",
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0xproject/connect",
|
||||
"version": "0.4.1",
|
||||
"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.10",
|
||||
"@0xproject/json-schemas": "^0.7.2",
|
||||
"@0xproject/utils": "^0.1.3",
|
||||
"@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.1",
|
||||
"@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.3"
|
||||
"web3-typescript-typings": "^0.9.5"
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "contracts",
|
||||
"version": "2.1.3",
|
||||
"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.4",
|
||||
"@0xproject/tslint-config": "^0.4.1",
|
||||
"@0xproject/types": "^0.1.3",
|
||||
"@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.3",
|
||||
"web3-typescript-typings": "^0.9.5",
|
||||
"yargs": "^10.0.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"0x.js": "^0.29.2",
|
||||
"@0xproject/json-schemas": "^0.7.2",
|
||||
"@0xproject/utils": "^0.1.3",
|
||||
"@0xproject/web3-wrapper": "^0.1.4",
|
||||
"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",
|
||||
|
@@ -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[];
|
||||
|
73
packages/deployer/README.md
Normal file
73
packages/deployer/README.md
Normal 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
|
||||
```
|
43
packages/deployer/package.json
Normal file
43
packages/deployer/package.json
Normal 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"
|
||||
}
|
||||
}
|
39
packages/deployer/scripts/postpublish.js
Normal file
39
packages/deployer/scripts/postpublish.js
Normal 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;
|
||||
});
|
@@ -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');
|
@@ -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';
|
@@ -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
8
packages/deployer/src/globals.d.ts
vendored
Normal 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;
|
||||
}
|
10
packages/deployer/src/migrations/config/multisig_sample.ts
Normal file
10
packages/deployer/src/migrations/config/multisig_sample.ts
Normal 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,
|
||||
},
|
||||
};
|
@@ -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[] = [
|
||||
{
|
@@ -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 = {
|
23
packages/deployer/src/types.ts
Normal file
23
packages/deployer/src/types.ts
Normal 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[];
|
||||
}
|
@@ -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';
|
||||
|
16
packages/deployer/tsconfig.json
Normal file
16
packages/deployer/tsconfig.json
Normal 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"
|
||||
]
|
||||
}
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0xproject/dev-utils",
|
||||
"version": "0.0.4",
|
||||
"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.1",
|
||||
"@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.3",
|
||||
"@0xproject/utils": "^0.2.1",
|
||||
"ethereumjs-util": "^5.1.2",
|
||||
"lodash": "^4.17.4",
|
||||
"request-promise-native": "^1.0.5"
|
||||
|
@@ -41,7 +41,7 @@ export class RPC {
|
||||
method,
|
||||
params,
|
||||
});
|
||||
this._url += 1;
|
||||
this._id += 1;
|
||||
return payload;
|
||||
}
|
||||
private async _sendAsync(payload: string): Promise<any> {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0xproject/json-schemas",
|
||||
"version": "0.7.2",
|
||||
"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.1",
|
||||
"@0xproject/utils": "^0.1.3",
|
||||
"@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",
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0xproject/monorepo-scripts",
|
||||
"version": "0.1.3",
|
||||
"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.1",
|
||||
"@0xproject/tslint-config": "^0.4.3",
|
||||
"@types/glob": "^5.0.33",
|
||||
"@types/node": "^8.0.53",
|
||||
"shx": "^0.2.2",
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0xproject/subproviders",
|
||||
"version": "0.3.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.10",
|
||||
"@0xproject/utils": "^0.1.3",
|
||||
"@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.1",
|
||||
"@0xproject/utils": "^0.1.3",
|
||||
"@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",
|
||||
|
@@ -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
|
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "@0xproject/kovan_faucets",
|
||||
"version": "1.0.4",
|
||||
"name": "@0xproject/testnet-faucets",
|
||||
"version": "1.0.6",
|
||||
"description": "A faucet micro-service that dispenses test ERC20 tokens or Ether",
|
||||
"main": "server.js",
|
||||
"scripts": {
|
||||
@@ -14,8 +14,8 @@
|
||||
"author": "Fabio Berger",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"0x.js": "^0.29.2",
|
||||
"@0xproject/utils": "^0.1.3",
|
||||
"0x.js": "^0.30.1",
|
||||
"@0xproject/utils": "^0.2.1",
|
||||
"body-parser": "^1.17.1",
|
||||
"ethereumjs-tx": "^1.3.3",
|
||||
"express": "^4.15.2",
|
||||
@@ -25,7 +25,7 @@
|
||||
"web3-provider-engine": "^13.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@0xproject/tslint-config": "^0.4.1",
|
||||
"@0xproject/tslint-config": "^0.4.3",
|
||||
"@types/body-parser": "^1.16.1",
|
||||
"@types/express": "^4.0.35",
|
||||
"@types/lodash": "^4.14.86",
|
||||
@@ -36,7 +36,7 @@
|
||||
"source-map-loader": "^0.1.6",
|
||||
"tslint": "5.8.0",
|
||||
"typescript": "~2.6.1",
|
||||
"web3-typescript-typings": "^0.9.3",
|
||||
"web3-typescript-typings": "^0.9.5",
|
||||
"webpack": "^3.1.0",
|
||||
"webpack-node-externals": "^1.6.0"
|
||||
}
|
@@ -2,11 +2,6 @@ export const configs = {
|
||||
DISPENSER_ADDRESS: (process.env.DISPENSER_ADDRESS as string).toLowerCase(),
|
||||
DISPENSER_PRIVATE_KEY: process.env.DISPENSER_PRIVATE_KEY,
|
||||
ENVIRONMENT: process.env.FAUCET_ENVIRONMENT,
|
||||
INFURA_API_KEY: process.env.INFURA_API_KEY,
|
||||
ROLLBAR_ACCESS_KEY: process.env.FAUCET_ROLLBAR_ACCESS_KEY,
|
||||
RPC_URL:
|
||||
process.env.FAUCET_ENVIRONMENT === 'development'
|
||||
? 'http://127.0.0.1:8545'
|
||||
: `https://kovan.infura.io/${process.env.INFURA_API_KEY}`,
|
||||
ZRX_TOKEN_ADDRESS: '0x6ff6c0ff1d68b964901f986d4c9fa3ac68346570',
|
||||
KOVAN_NETWORK_ID: 42,
|
||||
};
|
114
packages/testnet-faucets/src/ts/handler.ts
Normal file
114
packages/testnet-faucets/src/ts/handler.ts
Normal file
@@ -0,0 +1,114 @@
|
||||
import { addressUtils } from '@0xproject/utils';
|
||||
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 { EtherRequestQueue } from './ether_request_queue';
|
||||
import { idManagement } from './id_management';
|
||||
import { RequestQueue } from './request_queue';
|
||||
import { rpcUrls } from './rpc_urls';
|
||||
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';
|
||||
|
||||
interface RequestQueueByNetworkId {
|
||||
[networkId: string]: RequestQueue;
|
||||
}
|
||||
|
||||
enum QueueType {
|
||||
ETH = 'ETH',
|
||||
ZRX = 'ZRX',
|
||||
}
|
||||
|
||||
const DEFAULT_NETWORK_ID = 42; // kovan
|
||||
|
||||
export class Handler {
|
||||
private _etherRequestQueueByNetworkId: RequestQueueByNetworkId = {};
|
||||
private _zrxRequestQueueByNetworkId: RequestQueueByNetworkId = {};
|
||||
constructor() {
|
||||
_.forIn(rpcUrls, (rpcUrl: string, networkId: string) => {
|
||||
const providerObj = this._createProviderEngine(rpcUrl);
|
||||
const web3 = new Web3(providerObj);
|
||||
this._etherRequestQueueByNetworkId[networkId] = new EtherRequestQueue(web3);
|
||||
this._zrxRequestQueueByNetworkId[networkId] = new ZRXRequestQueue(web3, +networkId);
|
||||
});
|
||||
}
|
||||
public getQueueInfo(req: express.Request, res: express.Response) {
|
||||
res.setHeader('Content-Type', 'application/json');
|
||||
const queueInfo = _.mapValues(rpcUrls, (rpcUrl: string, networkId: string) => {
|
||||
utils.consoleLog(networkId);
|
||||
const etherRequestQueue = this._etherRequestQueueByNetworkId[networkId];
|
||||
const zrxRequestQueue = this._zrxRequestQueueByNetworkId[networkId];
|
||||
return {
|
||||
ether: {
|
||||
full: etherRequestQueue.isFull(),
|
||||
size: etherRequestQueue.size(),
|
||||
},
|
||||
zrx: {
|
||||
full: zrxRequestQueue.isFull(),
|
||||
size: zrxRequestQueue.size(),
|
||||
},
|
||||
};
|
||||
});
|
||||
const payload = JSON.stringify(queueInfo);
|
||||
res.status(200).send(payload);
|
||||
}
|
||||
public dispenseEther(req: express.Request, res: express.Response) {
|
||||
this._dispense(req, res, this._etherRequestQueueByNetworkId, QueueType.ETH);
|
||||
}
|
||||
public dispenseZRX(req: express.Request, res: express.Response) {
|
||||
this._dispense(req, res, this._zrxRequestQueueByNetworkId, QueueType.ZRX);
|
||||
}
|
||||
private _dispense(
|
||||
req: express.Request,
|
||||
res: express.Response,
|
||||
requestQueueByNetworkId: RequestQueueByNetworkId,
|
||||
queueType: QueueType,
|
||||
) {
|
||||
const recipientAddress = req.params.recipient;
|
||||
if (_.isUndefined(recipientAddress) || !this._isValidEthereumAddress(recipientAddress)) {
|
||||
res.status(400).send('INVALID_RECIPIENT_ADDRESS');
|
||||
return;
|
||||
}
|
||||
const networkId = _.get(req.query, 'networkId', DEFAULT_NETWORK_ID);
|
||||
const requestQueue = _.get(requestQueueByNetworkId, networkId);
|
||||
if (_.isUndefined(requestQueue)) {
|
||||
res.status(400).send('INVALID_NETWORK_ID');
|
||||
return;
|
||||
}
|
||||
const lowerCaseRecipientAddress = recipientAddress.toLowerCase();
|
||||
const didAddToQueue = requestQueue.add(lowerCaseRecipientAddress);
|
||||
if (!didAddToQueue) {
|
||||
res.status(503).send('QUEUE_IS_FULL');
|
||||
return;
|
||||
}
|
||||
utils.consoleLog(`Added ${lowerCaseRecipientAddress} to queue: ${queueType} networkId: ${networkId}`);
|
||||
res.status(200).end();
|
||||
}
|
||||
// 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;
|
||||
}
|
||||
// tslint:disable-next-line:prefer-function-over-method
|
||||
private _isValidEthereumAddress(address: string): boolean {
|
||||
const lowercaseAddress = address.toLowerCase();
|
||||
return addressUtils.isAddress(lowercaseAddress);
|
||||
}
|
||||
}
|
@@ -1,13 +1,11 @@
|
||||
import EthereumTx = require('ethereumjs-tx');
|
||||
|
||||
import { configs } from './configs';
|
||||
import { utils } from './utils';
|
||||
|
||||
type Callback = (err: Error | null, accounts: any) => void;
|
||||
|
||||
export const idManagement = {
|
||||
getAccounts(callback: Callback) {
|
||||
utils.consoleLog(`configs.DISPENSER_ADDRESS: ${configs.DISPENSER_ADDRESS}`);
|
||||
callback(null, [configs.DISPENSER_ADDRESS]);
|
||||
},
|
||||
approveTransaction(txData: object, callback: Callback) {
|
@@ -51,6 +51,6 @@ export class RequestQueue {
|
||||
}
|
||||
// tslint:disable-next-line:prefer-function-over-method
|
||||
protected async processNextRequestFireAndForgetAsync(recipientAddress: string) {
|
||||
throw new Error('Expected processNextRequestFireAndForgetAsync to be implemented by a superclass');
|
||||
throw new Error('Expected processNextRequestFireAndForgetAsync to be implemented by a subclass');
|
||||
}
|
||||
}
|
13
packages/testnet-faucets/src/ts/rpc_urls.ts
Normal file
13
packages/testnet-faucets/src/ts/rpc_urls.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import { configs } from './configs';
|
||||
|
||||
const productionRpcUrls = {
|
||||
'2': `https://ropsten.infura.io/${configs.INFURA_API_KEY}`,
|
||||
'3': `https://rinkeby.infura.io/${configs.INFURA_API_KEY}`,
|
||||
'42': `https://kovan.infura.io/${configs.INFURA_API_KEY}`,
|
||||
};
|
||||
|
||||
const developmentRpcUrls = {
|
||||
'50': 'http://127.0.0.1:8545',
|
||||
};
|
||||
|
||||
export const rpcUrls = configs.ENVIRONMENT === 'development' ? developmentRpcUrls : productionRpcUrls;
|
@@ -19,6 +19,7 @@ const handler = new Handler();
|
||||
app.get('/ping', (req: express.Request, res: express.Response) => {
|
||||
res.status(200).send('pong');
|
||||
});
|
||||
app.get('/info', handler.getQueueInfo.bind(handler));
|
||||
app.get('/ether/:recipient', handler.dispenseEther.bind(handler));
|
||||
app.get('/zrx/:recipient', handler.dispenseZRX.bind(handler));
|
||||
|
@@ -18,11 +18,11 @@ const QUEUE_INTERVAL_MS = 5000;
|
||||
|
||||
export class ZRXRequestQueue extends RequestQueue {
|
||||
private _zeroEx: ZeroEx;
|
||||
constructor(web3: Web3) {
|
||||
constructor(web3: Web3, networkId: number) {
|
||||
super(web3);
|
||||
this.queueIntervalMs = QUEUE_INTERVAL_MS;
|
||||
const zeroExConfig = {
|
||||
networkId: configs.KOVAN_NETWORK_ID,
|
||||
networkId,
|
||||
};
|
||||
this._zeroEx = new ZeroEx(web3.currentProvider, zeroExConfig);
|
||||
}
|
||||
@@ -30,13 +30,14 @@ export class ZRXRequestQueue extends RequestQueue {
|
||||
utils.consoleLog(`Processing ZRX ${recipientAddress}`);
|
||||
const baseUnitAmount = ZeroEx.toBaseUnitAmount(DISPENSE_AMOUNT_ZRX, 18);
|
||||
try {
|
||||
await this._zeroEx.token.transferAsync(
|
||||
configs.ZRX_TOKEN_ADDRESS,
|
||||
const zrxTokenAddress = this._zeroEx.exchange.getZRXTokenAddress();
|
||||
const txHash = await this._zeroEx.token.transferAsync(
|
||||
zrxTokenAddress,
|
||||
configs.DISPENSER_ADDRESS,
|
||||
recipientAddress,
|
||||
baseUnitAmount,
|
||||
);
|
||||
utils.consoleLog(`Sent ${DISPENSE_AMOUNT_ZRX} ZRX to ${recipientAddress}`);
|
||||
utils.consoleLog(`Sent ${DISPENSE_AMOUNT_ZRX} ZRX to ${recipientAddress} tx: ${txHash}`);
|
||||
} catch (err) {
|
||||
utils.consoleLog(`Unexpected err: ${err} - ${JSON.stringify(err)}`);
|
||||
await errorReporter.reportAsync(err);
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0xproject/tslint-config",
|
||||
"version": "0.4.1",
|
||||
"version": "0.4.3",
|
||||
"description": "Lint rules related to 0xProject for TSLint",
|
||||
"main": "tslint.json",
|
||||
"scripts": {
|
||||
|
@@ -60,6 +60,7 @@
|
||||
"prefer-function-over-method": true,
|
||||
"promise-function-async": true,
|
||||
"quotemark": [true, "single", "avoid-escape", "jsx-double"],
|
||||
"restrict-plus-operands": true,
|
||||
"semicolon": [true, "always"],
|
||||
"space-before-function-paren": [
|
||||
true,
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0xproject/types",
|
||||
"version": "0.1.3",
|
||||
"version": "0.1.5",
|
||||
"description": "0x types",
|
||||
"main": "lib/index.js",
|
||||
"types": "lib/index.d.ts",
|
||||
@@ -19,13 +19,13 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/0x.js/packages/types/README.md",
|
||||
"devDependencies": {
|
||||
"@0xproject/tslint-config": "^0.4.1",
|
||||
"@0xproject/tslint-config": "^0.4.3",
|
||||
"shx": "^0.2.2",
|
||||
"tslint": "5.8.0",
|
||||
"typescript": "~2.6.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0xproject/utils": "^0.1.3",
|
||||
"@0xproject/utils": "^0.2.1",
|
||||
"web3": "^0.20.0"
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0xproject/utils",
|
||||
"version": "0.1.3",
|
||||
"version": "0.2.1",
|
||||
"description": "0x TS utils",
|
||||
"main": "lib/index.js",
|
||||
"types": "lib/index.d.ts",
|
||||
@@ -19,7 +19,7 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/0x.js/packages/utils/README.md",
|
||||
"devDependencies": {
|
||||
"@0xproject/tslint-config": "^0.4.1",
|
||||
"@0xproject/tslint-config": "^0.4.3",
|
||||
"@types/lodash": "^4.14.86",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"shx": "^0.2.2",
|
||||
|
@@ -2,5 +2,6 @@
|
||||
|
||||
## v0.9.3 - _January 11, 2018_
|
||||
|
||||
* Fix `getTransactionReceipt` not returning null (#338)
|
||||
* Add type for getData on a contract
|
||||
* Fixed the `defaultAccount` not allowing for `undefined` value (#320)
|
||||
|
4
packages/web3-typescript-typings/index.d.ts
vendored
4
packages/web3-typescript-typings/index.d.ts
vendored
@@ -257,10 +257,10 @@ declare module 'web3' {
|
||||
sign(address: string, data: string): string;
|
||||
sign(address: string, data: string, callback: (err: Error, signature: string) => void): void;
|
||||
|
||||
getTransactionReceipt(txHash: string): Web3.TransactionReceipt;
|
||||
getTransactionReceipt(txHash: string): Web3.TransactionReceipt | null;
|
||||
getTransactionReceipt(
|
||||
txHash: string,
|
||||
callback: (err: Error, receipt: Web3.TransactionReceipt) => void,
|
||||
callback: (err: Error, receipt: Web3.TransactionReceipt | null) => void,
|
||||
): void;
|
||||
|
||||
// TODO block param
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "web3-typescript-typings",
|
||||
"version": "0.9.3",
|
||||
"version": "0.9.5",
|
||||
"description": "Typescript type definitions for web3",
|
||||
"main": "index.d.ts",
|
||||
"types": "index.d.ts",
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0xproject/web3-wrapper",
|
||||
"version": "0.1.4",
|
||||
"version": "0.1.6",
|
||||
"description": "Wraps around web3 and gives a nicer interface",
|
||||
"main": "lib/index.js",
|
||||
"types": "lib/index.d.ts",
|
||||
@@ -19,17 +19,17 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/0x.js/packages/web3-wrapper/README.md",
|
||||
"devDependencies": {
|
||||
"@0xproject/tslint-config": "^0.4.1",
|
||||
"@0xproject/types": "^0.1.3",
|
||||
"@0xproject/tslint-config": "^0.4.3",
|
||||
"@0xproject/types": "^0.1.5",
|
||||
"@types/lodash": "^4.14.86",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"shx": "^0.2.2",
|
||||
"tslint": "5.8.0",
|
||||
"typescript": "~2.6.1",
|
||||
"web3-typescript-typings": "^0.9.3"
|
||||
"web3-typescript-typings": "^0.9.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0xproject/utils": "^0.1.3",
|
||||
"@0xproject/utils": "^0.2.1",
|
||||
"lodash": "^4.17.4",
|
||||
"web3": "^0.20.0"
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0xproject/website",
|
||||
"version": "0.0.6",
|
||||
"version": "0.0.8",
|
||||
"private": true,
|
||||
"description": "Website and 0x portal dapp",
|
||||
"scripts": {
|
||||
@@ -21,9 +21,9 @@
|
||||
"author": "Fabio Berger",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"0x.js": "^0.29.2",
|
||||
"@0xproject/subproviders": "^0.3.0",
|
||||
"@0xproject/utils": "^0.1.3",
|
||||
"0x.js": "^0.30.1",
|
||||
"@0xproject/subproviders": "^0.3.2",
|
||||
"@0xproject/utils": "^0.2.1",
|
||||
"accounting": "^0.4.1",
|
||||
"basscss": "^8.0.3",
|
||||
"blockies": "^0.0.2",
|
||||
@@ -101,7 +101,7 @@
|
||||
"style-loader": "0.13.x",
|
||||
"tslint": "5.8.0",
|
||||
"typescript": "~2.6.1",
|
||||
"web3-typescript-typings": "^0.9.3",
|
||||
"web3-typescript-typings": "^0.9.5",
|
||||
"webpack": "^3.1.0",
|
||||
"webpack-dev-middleware": "^1.10.0",
|
||||
"webpack-dev-server": "^2.5.0"
|
||||
|
BIN
packages/website/public/images/social/discourse.png
Normal file
BIN
packages/website/public/images/social/discourse.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
@@ -368,14 +368,22 @@ export class Blockchain {
|
||||
|
||||
const [currBalance] = await this.getTokenBalanceAndAllowanceAsync(this._userAddress, token.address);
|
||||
|
||||
this._zrxPollIntervalId = intervalUtils.setAsyncExcludingInterval(async () => {
|
||||
const [balance] = await this.getTokenBalanceAndAllowanceAsync(this._userAddress, token.address);
|
||||
if (!balance.eq(currBalance)) {
|
||||
this._dispatcher.replaceTokenBalanceByAddress(token.address, balance);
|
||||
clearInterval(this._zrxPollIntervalId);
|
||||
this._zrxPollIntervalId = intervalUtils.setAsyncExcludingInterval(
|
||||
async () => {
|
||||
const [balance] = await this.getTokenBalanceAndAllowanceAsync(this._userAddress, token.address);
|
||||
if (!balance.eq(currBalance)) {
|
||||
this._dispatcher.replaceTokenBalanceByAddress(token.address, balance);
|
||||
intervalUtils.clearAsyncExcludingInterval(this._zrxPollIntervalId);
|
||||
delete this._zrxPollIntervalId;
|
||||
}
|
||||
},
|
||||
5000,
|
||||
(err: Error) => {
|
||||
utils.consoleLog(`Polling tokenBalance failed: ${err}`);
|
||||
intervalUtils.clearAsyncExcludingInterval(this._zrxPollIntervalId);
|
||||
delete this._zrxPollIntervalId;
|
||||
}
|
||||
}, 5000);
|
||||
},
|
||||
);
|
||||
}
|
||||
public async signOrderHashAsync(orderHash: string): Promise<SignatureData> {
|
||||
utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
|
||||
@@ -471,7 +479,7 @@ export class Blockchain {
|
||||
this._web3Wrapper.updatePrevUserAddress(newUserAddress);
|
||||
}
|
||||
public destroy() {
|
||||
clearInterval(this._zrxPollIntervalId);
|
||||
intervalUtils.clearAsyncExcludingInterval(this._zrxPollIntervalId);
|
||||
this._web3Wrapper.destroy();
|
||||
this._stopWatchingExchangeLogFillEvents();
|
||||
}
|
||||
|
@@ -105,7 +105,7 @@ export class EthWethConversionButton extends React.Component<
|
||||
}
|
||||
this.props.onConversionSuccessful();
|
||||
} catch (err) {
|
||||
const errMsg = '' + err;
|
||||
const errMsg = `${err}`;
|
||||
if (_.includes(errMsg, BlockchainCallErrs.UserHasNoAssociatedAddresses)) {
|
||||
this.props.dispatcher.updateShouldBlockchainErrDialogBeOpen(true);
|
||||
} else if (!_.includes(errMsg, 'User denied transaction')) {
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user