require("source-map-support").install();
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 6);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {
module.exports = require("@0xproject/utils");
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.configs = {
DISPENSER_ADDRESS: process.env.DISPENSER_ADDRESS.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,
};
/***/ }),
/* 2 */
/***/ (function(module, exports) {
module.exports = require("lodash");
/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [0, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
var utils_1 = __webpack_require__(0);
var rollbar = __webpack_require__(10);
var configs_1 = __webpack_require__(1);
exports.errorReporter = {
setup: function () {
var _this = this;
rollbar.init(configs_1.configs.ROLLBAR_ACCESS_KEY, {
environment: configs_1.configs.ENVIRONMENT,
});
rollbar.handleUncaughtExceptions(configs_1.configs.ROLLBAR_ACCESS_KEY);
process.on('unhandledRejection', function (err) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
utils_1.logUtils.log("Uncaught exception " + err + ". Stack: " + err.stack);
return [4 /*yield*/, this.reportAsync(err)];
case 1:
_a.sent();
process.exit(1);
return [2 /*return*/];
}
});
}); });
},
reportAsync: function (err, req) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
if (configs_1.configs.ENVIRONMENT === 'development') {
return [2 /*return*/]; // Do not log development environment errors
}
return [2 /*return*/, new Promise(function (resolve, reject) {
rollbar.handleError(err, req, function (rollbarErr) {
if (rollbarErr) {
utils_1.logUtils.log("Error reporting to rollbar, ignoring: " + rollbarErr);
reject(rollbarErr);
}
else {
resolve();
}
});
})];
});
});
},
errorHandler: function () {
return rollbar.errorHandler(configs_1.configs.ROLLBAR_ACCESS_KEY);
},
};
/***/ }),
/* 4 */
/***/ (function(module, exports) {
module.exports = require("0x.js");
/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var configs_1 = __webpack_require__(1);
var productionRpcUrls = {
'3': "https://ropsten.infura.io/" + configs_1.configs.INFURA_API_KEY,
'4': "https://rinkeby.infura.io/" + configs_1.configs.INFURA_API_KEY,
'42': "https://kovan.infura.io/" + configs_1.configs.INFURA_API_KEY,
};
var developmentRpcUrls = {
'50': 'http://127.0.0.1:8545',
};
exports.rpcUrls = configs_1.configs.ENVIRONMENT === 'development' ? developmentRpcUrls : productionRpcUrls;
/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(7);
/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var bodyParser = __webpack_require__(8);
var express = __webpack_require__(9);
var error_reporter_1 = __webpack_require__(3);
var handler_1 = __webpack_require__(11);
var parameter_transformer_1 = __webpack_require__(18);
// Setup the errorReporter to catch uncaught exceptions and unhandled rejections
error_reporter_1.errorReporter.setup();
var app = express();
app.use(bodyParser.json()); // for parsing application/json
app.use(function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
next();
});
var handler = new handler_1.Handler();
app.get('/ping', function (req, res) {
res.status(200).send('pong');
});
app.get('/info', handler.getQueueInfo.bind(handler));
app.get('/ether/:recipient', parameter_transformer_1.parameterTransformer.transform, handler.dispenseEther.bind(handler));
app.get('/zrx/:recipient', parameter_transformer_1.parameterTransformer.transform, handler.dispenseZRX.bind(handler));
app.get('/order/weth/:recipient', parameter_transformer_1.parameterTransformer.transform, handler.dispenseWETHOrder.bind(handler));
app.get('/order/zrx/:recipient', parameter_transformer_1.parameterTransformer.transform, handler.dispenseZRXOrder.bind(handler));
// Log to rollbar any errors unhandled by handlers
app.use(error_reporter_1.errorReporter.errorHandler());
var port = process.env.PORT || 3000;
app.listen(port);
/***/ }),
/* 8 */
/***/ (function(module, exports) {
module.exports = require("body-parser");
/***/ }),
/* 9 */
/***/ (function(module, exports) {
module.exports = require("express");
/***/ }),
/* 10 */
/***/ (function(module, exports) {
module.exports = require("rollbar");
/***/ }),
/* 11 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __assign = (this && this.__assign) || Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [0, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
var _0x_js_1 = __webpack_require__(4);
var utils_1 = __webpack_require__(0);
var _ = __webpack_require__(2);
var Web3 = __webpack_require__(12);
// HACK: web3 injects XMLHttpRequest into the global scope and ProviderEngine checks XMLHttpRequest
// to know whether it is running in a browser or node environment. We need it to be undefined since
// we are not running in a browser env.
// Filed issue: https://github.com/ethereum/web3.js/issues/844
global.XMLHttpRequest = undefined;
var subproviders_1 = __webpack_require__(13);
var ProviderEngine = __webpack_require__(14);
var RpcSubprovider = __webpack_require__(15);
var configs_1 = __webpack_require__(1);
var dispatch_queue_1 = __webpack_require__(16);
var dispense_asset_tasks_1 = __webpack_require__(17);
var rpc_urls_1 = __webpack_require__(5);
var RequestedAssetType;
(function (RequestedAssetType) {
RequestedAssetType["ETH"] = "ETH";
RequestedAssetType["WETH"] = "WETH";
RequestedAssetType["ZRX"] = "ZRX";
})(RequestedAssetType || (RequestedAssetType = {}));
var FIVE_DAYS_IN_MS = 4.32e8; // TODO: make this configurable
var Handler = /** @class */ (function () {
function Handler() {
var _this = this;
this._networkConfigByNetworkId = {};
_.forIn(rpc_urls_1.rpcUrls, function (rpcUrl, networkId) {
var providerObj = Handler._createProviderEngine(rpcUrl);
var web3 = new Web3(providerObj);
var zeroExConfig = {
networkId: +networkId,
};
var zeroEx = new _0x_js_1.ZeroEx(web3.currentProvider, zeroExConfig);
var dispatchQueue = new dispatch_queue_1.DispatchQueue();
_this._networkConfigByNetworkId[networkId] = {
dispatchQueue: dispatchQueue,
web3: web3,
zeroEx: zeroEx,
};
});
}
Handler._createProviderEngine = function (rpcUrl) {
if (_.isUndefined(configs_1.configs.DISPENSER_PRIVATE_KEY)) {
throw new Error('Dispenser Private key not found');
}
var engine = new ProviderEngine();
engine.addProvider(new subproviders_1.NonceTrackerSubprovider());
engine.addProvider(new subproviders_1.PrivateKeyWalletSubprovider(configs_1.configs.DISPENSER_PRIVATE_KEY));
engine.addProvider(new RpcSubprovider({
rpcUrl: rpcUrl,
}));
engine.start();
return engine;
};
Handler.prototype.getQueueInfo = function (req, res) {
var _this = this;
res.setHeader('Content-Type', 'application/json');
var queueInfo = _.mapValues(rpc_urls_1.rpcUrls, function (rpcUrl, networkId) {
var dispatchQueue = _this._networkConfigByNetworkId[networkId].dispatchQueue;
return {
full: dispatchQueue.isFull(),
size: dispatchQueue.size(),
};
});
var payload = JSON.stringify(queueInfo);
res.status(200).send(payload);
};
Handler.prototype.dispenseEther = function (req, res) {
this._dispenseAsset(req, res, RequestedAssetType.ETH);
};
Handler.prototype.dispenseZRX = function (req, res) {
this._dispenseAsset(req, res, RequestedAssetType.ZRX);
};
Handler.prototype.dispenseWETHOrder = function (req, res) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this._dispenseOrder(req, res, RequestedAssetType.WETH)];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
Handler.prototype.dispenseZRXOrder = function (req, res, next) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this._dispenseOrder(req, res, RequestedAssetType.ZRX)];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
Handler.prototype._dispenseAsset = function (req, res, requestedAssetType) {
var networkId = req.params.networkId;
var recipient = req.params.recipient;
var networkConfig = this._networkConfigByNetworkId[networkId];
var dispenserTask;
switch (requestedAssetType) {
case RequestedAssetType.ETH:
dispenserTask = dispense_asset_tasks_1.dispenseAssetTasks.dispenseEtherTask(recipient, networkConfig.web3);
break;
case RequestedAssetType.WETH:
case RequestedAssetType.ZRX:
dispenserTask = dispense_asset_tasks_1.dispenseAssetTasks.dispenseTokenTask(recipient, requestedAssetType, networkConfig.zeroEx);
break;
default:
throw new Error("Unsupported asset type: " + requestedAssetType);
}
var didAddToQueue = networkConfig.dispatchQueue.add(dispenserTask);
if (!didAddToQueue) {
res.status(503).send('QUEUE_IS_FULL');
return;
}
utils_1.logUtils.log("Added " + recipient + " to queue: " + requestedAssetType + " networkId: " + networkId);
res.status(200).end();
};
Handler.prototype._dispenseOrder = function (req, res, requestedAssetType) {
return __awaiter(this, void 0, void 0, function () {
var networkConfig, zeroEx, makerToken, takerTokenSymbol, takerToken, makerTokenAmount, takerTokenAmount, order, orderHash, signature, signedOrder, signedOrderHash, payload;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
networkConfig = _.get(this._networkConfigByNetworkId, req.params.networkId);
if (_.isUndefined(networkConfig)) {
res.status(400).send('UNSUPPORTED_NETWORK_ID');
return [2 /*return*/];
}
zeroEx = networkConfig.zeroEx;
res.setHeader('Content-Type', 'application/json');
return [4 /*yield*/, zeroEx.tokenRegistry.getTokenBySymbolIfExistsAsync(requestedAssetType)];
case 1:
makerToken = _a.sent();
if (_.isUndefined(makerToken)) {
throw new Error("Unsupported asset type: " + requestedAssetType);
}
takerTokenSymbol = requestedAssetType === RequestedAssetType.WETH ? RequestedAssetType.ZRX : RequestedAssetType.WETH;
return [4 /*yield*/, zeroEx.tokenRegistry.getTokenBySymbolIfExistsAsync(takerTokenSymbol)];
case 2:
takerToken = _a.sent();
if (_.isUndefined(takerToken)) {
throw new Error("Unsupported asset type: " + requestedAssetType);
}
makerTokenAmount = _0x_js_1.ZeroEx.toBaseUnitAmount(new utils_1.BigNumber(0.1), makerToken.decimals);
takerTokenAmount = _0x_js_1.ZeroEx.toBaseUnitAmount(new utils_1.BigNumber(0.1), takerToken.decimals);
order = {
maker: configs_1.configs.DISPENSER_ADDRESS,
taker: req.params.recipient,
makerFee: new utils_1.BigNumber(0),
takerFee: new utils_1.BigNumber(0),
makerTokenAmount: makerTokenAmount,
takerTokenAmount: takerTokenAmount,
makerTokenAddress: makerToken.address,
takerTokenAddress: takerToken.address,
salt: _0x_js_1.ZeroEx.generatePseudoRandomSalt(),
exchangeContractAddress: zeroEx.exchange.getContractAddress(),
feeRecipient: _0x_js_1.ZeroEx.NULL_ADDRESS,
expirationUnixTimestampSec: new utils_1.BigNumber(Date.now() + FIVE_DAYS_IN_MS),
};
orderHash = _0x_js_1.ZeroEx.getOrderHashHex(order);
return [4 /*yield*/, zeroEx.signOrderHashAsync(orderHash, configs_1.configs.DISPENSER_ADDRESS, false)];
case 3:
signature = _a.sent();
signedOrder = __assign({}, order, { ecSignature: signature });
signedOrderHash = _0x_js_1.ZeroEx.getOrderHashHex(signedOrder);
payload = JSON.stringify(signedOrder);
utils_1.logUtils.log("Dispensed signed order: " + payload);
res.status(200).send(payload);
return [2 /*return*/];
}
});
});
};
return Handler;
}());
exports.Handler = Handler;
/***/ }),
/* 12 */
/***/ (function(module, exports) {
module.exports = require("web3");
/***/ }),
/* 13 */
/***/ (function(module, exports) {
module.exports = require("@0xproject/subproviders");
/***/ }),
/* 14 */
/***/ (function(module, exports) {
module.exports = require("web3-provider-engine");
/***/ }),
/* 15 */
/***/ (function(module, exports) {
module.exports = require("web3-provider-engine/subproviders/rpc");
/***/ }),
/* 16 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [0, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
var utils_1 = __webpack_require__(0);
var _ = __webpack_require__(2);
var error_reporter_1 = __webpack_require__(3);
var MAX_QUEUE_SIZE = 500;
var DEFAULT_QUEUE_INTERVAL_MS = 1000;
var DispatchQueue = /** @class */ (function () {
function DispatchQueue() {
this._queueIntervalMs = DEFAULT_QUEUE_INTERVAL_MS;
this._queue = [];
this._start();
}
DispatchQueue.prototype.add = function (taskAsync) {
if (this.isFull()) {
return false;
}
this._queue.push(taskAsync);
return true;
};
DispatchQueue.prototype.size = function () {
return this._queue.length;
};
DispatchQueue.prototype.isFull = function () {
return this.size() >= MAX_QUEUE_SIZE;
};
DispatchQueue.prototype.stop = function () {
if (!_.isUndefined(this._queueIntervalIdIfExists)) {
utils_1.intervalUtils.clearAsyncExcludingInterval(this._queueIntervalIdIfExists);
}
};
DispatchQueue.prototype._start = function () {
var _this = this;
this._queueIntervalIdIfExists = utils_1.intervalUtils.setAsyncExcludingInterval(function () { return __awaiter(_this, void 0, void 0, function () {
var taskAsync;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
taskAsync = this._queue.shift();
if (_.isUndefined(taskAsync)) {
return [2 /*return*/, Promise.resolve()];
}
return [4 /*yield*/, taskAsync()];
case 1:
_a.sent();
return [2 /*return*/];
}
});
}); }, this._queueIntervalMs, function (err) {
utils_1.logUtils.log("Unexpected err: " + err + " - " + JSON.stringify(err));
// tslint:disable-next-line:no-floating-promises
error_reporter_1.errorReporter.reportAsync(err);
});
};
return DispatchQueue;
}());
exports.DispatchQueue = DispatchQueue;
/***/ }),
/* 17 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [0, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
var _0x_js_1 = __webpack_require__(4);
var utils_1 = __webpack_require__(0);
var _ = __webpack_require__(2);
var configs_1 = __webpack_require__(1);
var DISPENSE_AMOUNT_ETHER = 0.1;
var DISPENSE_AMOUNT_TOKEN = 0.1;
var DISPENSE_MAX_AMOUNT_TOKEN = 2;
var DISPENSE_MAX_AMOUNT_ETHER = 2;
exports.dispenseAssetTasks = {
dispenseEtherTask: function (recipientAddress, web3) {
var _this = this;
return function () { return __awaiter(_this, void 0, void 0, function () {
var userBalance, maxAmountInWei, sendTransactionAsync, txHash;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
utils_1.logUtils.log("Processing ETH " + recipientAddress);
return [4 /*yield*/, utils_1.promisify(web3.eth.getBalance)(recipientAddress)];
case 1:
userBalance = _a.sent();
maxAmountInWei = new utils_1.BigNumber(web3.toWei(DISPENSE_MAX_AMOUNT_ETHER, 'ether'));
if (userBalance.greaterThanOrEqualTo(maxAmountInWei)) {
utils_1.logUtils.log("User exceeded ETH balance maximum (" + maxAmountInWei + ") " + recipientAddress + " " + userBalance + " ");
return [2 /*return*/];
}
sendTransactionAsync = utils_1.promisify(web3.eth.sendTransaction);
return [4 /*yield*/, sendTransactionAsync({
from: configs_1.configs.DISPENSER_ADDRESS,
to: recipientAddress,
value: web3.toWei(DISPENSE_AMOUNT_ETHER, 'ether'),
})];
case 2:
txHash = _a.sent();
utils_1.logUtils.log("Sent " + DISPENSE_AMOUNT_ETHER + " ETH to " + recipientAddress + " tx: " + txHash);
return [2 /*return*/];
}
});
}); };
},
dispenseTokenTask: function (recipientAddress, tokenSymbol, zeroEx) {
var _this = this;
return function () { return __awaiter(_this, void 0, void 0, function () {
var amountToDispense, token, baseUnitAmount, userBalanceBaseUnits, maxAmountBaseUnits, txHash;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
utils_1.logUtils.log("Processing " + tokenSymbol + " " + recipientAddress);
amountToDispense = new utils_1.BigNumber(DISPENSE_AMOUNT_TOKEN);
return [4 /*yield*/, zeroEx.tokenRegistry.getTokenBySymbolIfExistsAsync(tokenSymbol)];
case 1:
token = _a.sent();
if (_.isUndefined(token)) {
throw new Error("Unsupported asset type: " + tokenSymbol);
}
baseUnitAmount = _0x_js_1.ZeroEx.toBaseUnitAmount(amountToDispense, token.decimals);
return [4 /*yield*/, zeroEx.token.getBalanceAsync(token.address, recipientAddress)];
case 2:
userBalanceBaseUnits = _a.sent();
maxAmountBaseUnits = _0x_js_1.ZeroEx.toBaseUnitAmount(new utils_1.BigNumber(DISPENSE_MAX_AMOUNT_TOKEN), token.decimals);
if (userBalanceBaseUnits.greaterThanOrEqualTo(maxAmountBaseUnits)) {
utils_1.logUtils.log("User exceeded token balance maximum (" + maxAmountBaseUnits + ") " + recipientAddress + " " + userBalanceBaseUnits + " ");
return [2 /*return*/];
}
return [4 /*yield*/, zeroEx.token.transferAsync(token.address, configs_1.configs.DISPENSER_ADDRESS, recipientAddress, baseUnitAmount)];
case 3:
txHash = _a.sent();
utils_1.logUtils.log("Sent " + amountToDispense + " ZRX to " + recipientAddress + " tx: " + txHash);
return [2 /*return*/];
}
});
}); };
},
};
/***/ }),
/* 18 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var utils_1 = __webpack_require__(0);
var _ = __webpack_require__(2);
var rpc_urls_1 = __webpack_require__(5);
var DEFAULT_NETWORK_ID = 42; // kovan
exports.parameterTransformer = {
transform: function (req, res, next) {
var recipientAddress = req.params.recipient;
if (_.isUndefined(recipientAddress) || !utils_1.addressUtils.isAddress(recipientAddress)) {
res.status(400).send('INVALID_RECIPIENT_ADDRESS');
return;
}
var lowerCaseRecipientAddress = recipientAddress.toLowerCase();
req.params.recipient = lowerCaseRecipientAddress;
var networkId = _.get(req.query, 'networkId', DEFAULT_NETWORK_ID);
var rpcUrlIfExists = _.get(rpc_urls_1.rpcUrls, networkId);
if (_.isUndefined(rpcUrlIfExists)) {
res.status(400).send('UNSUPPORTED_NETWORK_ID');
return;
}
req.params.networkId = networkId;
next();
},
};
/***/ })
/******/ ]);
//# sourceMappingURL=server.js.map