Compare commits

..

16 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
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
45 changed files with 296 additions and 199 deletions

View File

@@ -40,8 +40,8 @@ This repository contains all the 0x developer tools written in TypeScript. Our h
| 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

@@ -1,9 +1,10 @@
# CHANGELOG
## v0.30.1 - _January 18, 2018_
## 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_

View File

@@ -1,6 +1,6 @@
{
"name": "0x.js",
"version": "0.30.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",
@@ -38,10 +38,9 @@
"node": ">=6.0.0"
},
"devDependencies": {
"@0xproject/abi-gen": "^0.1.2",
"@0xproject/dev-utils": "^0.0.5",
"@0xproject/tslint-config": "^0.4.2",
"@0xproject/types": "^0.1.4",
"@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",
@@ -52,7 +51,7 @@
"awesome-typescript-loader": "^3.1.3",
"chai": "^4.0.1",
"chai-as-promised": "^7.1.0",
"chai-as-promised-typescript-typings": "^0.0.4",
"chai-as-promised-typescript-typings": "^0.0.5",
"chai-bignumber": "^2.0.1",
"chai-typescript-typings": "^0.0.2",
"copyfiles": "^1.2.0",
@@ -73,14 +72,15 @@
"typedoc": "~0.8.0",
"typescript": "~2.6.1",
"web3-provider-engine": "^13.0.1",
"web3-typescript-typings": "^0.9.4",
"web3-typescript-typings": "^0.9.5",
"webpack": "^3.1.0"
},
"dependencies": {
"@0xproject/assert": "^0.0.11",
"@0xproject/json-schemas": "^0.7.3",
"@0xproject/utils": "^0.2.0",
"@0xproject/web3-wrapper": "^0.1.5",
"@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",
"ethereumjs-abi": "^0.6.4",

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

@@ -1,6 +1,6 @@
{
"name": "@0xproject/abi-gen",
"version": "0.1.2",
"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.2.0",
"@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.2",
"@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.4"
"web3-typescript-typings": "^0.9.5"
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/assert",
"version": "0.0.11",
"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,7 +23,7 @@
},
"homepage": "https://github.com/0xProject/0x.js/packages/assert/README.md",
"devDependencies": {
"@0xproject/tslint-config": "^0.4.2",
"@0xproject/tslint-config": "^0.4.3",
"@types/lodash": "^4.14.86",
"@types/mocha": "^2.2.42",
"@types/valid-url": "^1.0.2",
@@ -37,8 +37,8 @@
"typescript": "~2.6.1"
},
"dependencies": {
"@0xproject/json-schemas": "^0.7.3",
"@0xproject/utils": "^0.2.0",
"@0xproject/json-schemas": "^0.7.4",
"@0xproject/utils": "^0.2.1",
"lodash": "^4.17.4",
"valid-url": "^1.0.9"
}

View File

@@ -1,6 +1,6 @@
{
"name": "chai-as-promised-typescript-typings",
"version": "0.0.4",
"version": "0.0.5",
"description": "Typescript type definitions for chai-as-promised",
"main": "index.d.ts",
"types": "index.d.ts",

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/connect",
"version": "0.5.0",
"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.11",
"@0xproject/json-schemas": "^0.7.3",
"@0xproject/utils": "^0.2.0",
"@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.2",
"@0xproject/tslint-config": "^0.4.3",
"@types/fetch-mock": "^5.12.1",
"@types/lodash": "^4.14.86",
"@types/mocha": "^2.2.42",
@@ -48,7 +48,7 @@
"@types/websocket": "^0.0.34",
"chai": "^4.0.1",
"chai-as-promised": "^7.1.0",
"chai-as-promised-typescript-typings": "^0.0.4",
"chai-as-promised-typescript-typings": "^0.0.5",
"chai-typescript-typings": "^0.0.2",
"copyfiles": "^1.2.0",
"dirty-chai": "^2.0.1",
@@ -59,6 +59,6 @@
"tslint": "5.8.0",
"typedoc": "~0.8.0",
"typescript": "~2.6.1",
"web3-typescript-typings": "^0.9.4"
"web3-typescript-typings": "^0.9.5"
}
}

View File

@@ -1,7 +1,7 @@
{
"private": true,
"name": "contracts",
"version": "2.1.4",
"version": "2.1.5",
"description": "Smart contract components of 0x protocol",
"main": "index.js",
"directories": {
@@ -30,9 +30,9 @@
},
"homepage": "https://github.com/0xProject/0x.js/packages/contracts/README.md",
"devDependencies": {
"@0xproject/dev-utils": "^0.0.5",
"@0xproject/tslint-config": "^0.4.2",
"@0xproject/types": "^0.1.4",
"@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,7 +40,7 @@
"@types/yargs": "^10.0.0",
"chai": "^4.0.1",
"chai-as-promised": "^7.1.0",
"chai-as-promised-typescript-typings": "^0.0.4",
"chai-as-promised-typescript-typings": "^0.0.5",
"chai-bignumber": "^2.0.1",
"chai-typescript-typings": "^0.0.2",
"copyfiles": "^1.2.0",
@@ -52,15 +52,15 @@
"types-bn": "^0.0.1",
"types-ethereumjs-util": "0xProject/types-ethereumjs-util",
"typescript": "~2.6.1",
"web3-typescript-typings": "^0.9.4",
"web3-typescript-typings": "^0.9.5",
"yargs": "^10.0.3"
},
"dependencies": {
"0x.js": "^0.30.0",
"@0xproject/deployer": "*",
"@0xproject/json-schemas": "^0.7.3",
"@0xproject/utils": "^0.2.0",
"@0xproject/web3-wrapper": "^0.1.5",
"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

@@ -1,6 +1,6 @@
{
"name": "@0xproject/deployer",
"version": "0.0.1",
"version": "0.0.2",
"description": "Smart contract deployer of 0x protocol",
"main": "lib/src/cli.js",
"scripts": {
@@ -27,17 +27,17 @@
"homepage": "https://github.com/0xProject/0x.js/packages/deployer/README.md",
"devDependencies": {
"copyfiles": "^1.2.0",
"web3-typescript-typings": "^0.9.3",
"types-bn": "^0.0.1",
"typescript": "~2.6.1"
"typescript": "~2.6.1",
"web3-typescript-typings": "^0.9.5"
},
"dependencies": {
"@0xproject/utils": "^0.1.3",
"@0xproject/web3-wrapper": "^0.1.4",
"@0xproject/web3-wrapper": "^0.1.6",
"lodash": "^4.17.4",
"solc": "^0.4.18",
"yargs": "^10.0.3",
"web3": "^0.20.0",
"web3-eth-abi": "^1.0.0-beta.24",
"web3": "^0.20.0"
"yargs": "^10.0.3"
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/dev-utils",
"version": "0.0.5",
"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.2",
"@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.2.0",
"@0xproject/utils": "^0.2.1",
"ethereumjs-util": "^5.1.2",
"lodash": "^4.17.4",
"request-promise-native": "^1.0.5"

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/json-schemas",
"version": "0.7.3",
"version": "0.7.4",
"description": "0x-related json schemas",
"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",
@@ -27,8 +27,8 @@
"lodash.values": "^4.3.0"
},
"devDependencies": {
"@0xproject/tslint-config": "^0.4.2",
"@0xproject/utils": "^0.2.0",
"@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",

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.4",
"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.2",
"@0xproject/tslint-config": "^0.4.3",
"@types/glob": "^5.0.33",
"@types/node": "^8.0.53",
"shx": "^0.2.2",

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/subproviders",
"version": "0.3.1",
"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.11",
"@0xproject/utils": "^0.2.0",
"@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,15 +31,15 @@
"web3-provider-engine": "^13.0.1"
},
"devDependencies": {
"@0xproject/tslint-config": "^0.4.2",
"@0xproject/utils": "^0.2.0",
"@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.4",
"chai-as-promised-typescript-typings": "^0.0.5",
"chai-typescript-typings": "^0.0.2",
"dirty-chai": "^2.0.1",
"mocha": "^4.0.1",

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

View File

@@ -1,7 +1,7 @@
{
"private": true,
"name": "@0xproject/kovan_faucets",
"version": "1.0.5",
"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.30.0",
"@0xproject/utils": "^0.2.0",
"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.2",
"@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.4",
"web3-typescript-typings": "^0.9.5",
"webpack": "^3.1.0",
"webpack-node-externals": "^1.6.0"
}

View File

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

View 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);
}
}

View File

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

View File

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

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/tslint-config",
"version": "0.4.2",
"version": "0.4.3",
"description": "Lint rules related to 0xProject for TSLint",
"main": "tslint.json",
"scripts": {

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/types",
"version": "0.1.4",
"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.2",
"@0xproject/tslint-config": "^0.4.3",
"shx": "^0.2.2",
"tslint": "5.8.0",
"typescript": "~2.6.1"
},
"dependencies": {
"@0xproject/utils": "^0.2.0",
"@0xproject/utils": "^0.2.1",
"web3": "^0.20.0"
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/utils",
"version": "0.2.0",
"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.2",
"@0xproject/tslint-config": "^0.4.3",
"@types/lodash": "^4.14.86",
"npm-run-all": "^4.1.2",
"shx": "^0.2.2",

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "web3-typescript-typings",
"version": "0.9.4",
"version": "0.9.5",
"description": "Typescript type definitions for web3",
"main": "index.d.ts",
"types": "index.d.ts",

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/web3-wrapper",
"version": "0.1.5",
"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.2",
"@0xproject/types": "^0.1.4",
"@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.4"
"web3-typescript-typings": "^0.9.5"
},
"dependencies": {
"@0xproject/utils": "^0.2.0",
"@0xproject/utils": "^0.2.1",
"lodash": "^4.17.4",
"web3": "^0.20.0"
}

View File

@@ -1,6 +1,6 @@
{
"name": "@0xproject/website",
"version": "0.0.7",
"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.30.0",
"@0xproject/subproviders": "^0.3.1",
"@0xproject/utils": "^0.2.0",
"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.4",
"web3-typescript-typings": "^0.9.5",
"webpack": "^3.1.0",
"webpack-dev-middleware": "^1.10.0",
"webpack-dev-server": "^2.5.0"