From 514aa5aec22985aa9ef377b0d37771b893536c2f Mon Sep 17 00:00:00 2001 From: Nathaniel Parke Date: Thu, 12 Nov 2020 14:15:13 +0800 Subject: [PATCH] Wrap api responses and update serum-js (#3) * Start adding routes * Finish adding routes * Organize routes * update serum --- src/{ => api}/routes.ts | 215 +++++++++++++++++------------------- src/api/utils.ts | 21 ++++ src/app.ts | 2 +- src/config.ts | 2 +- src/exchange/config.ts | 2 +- yarn.lock | 237 ++++++++++++++++++++++++++++------------ 6 files changed, 291 insertions(+), 188 deletions(-) rename src/{ => api}/routes.ts (51%) create mode 100644 src/api/utils.ts diff --git a/src/routes.ts b/src/api/routes.ts similarity index 51% rename from src/routes.ts rename to src/api/routes.ts index d37471c..b5a29b0 100644 --- a/src/routes.ts +++ b/src/api/routes.ts @@ -1,8 +1,9 @@ import express from "express"; import expressAsyncHandler from "express-async-handler"; -import { DirUtil, logger } from "./utils"; -import { SerumApi } from "./exchange"; -import { Coin, OrderType } from "./exchange/types"; +import { DirUtil, logger } from "../utils"; +import { SerumApi } from "../exchange"; +import { Coin, OrderType } from "../exchange/types"; +import { sendErrorResponse, sendSuccessfulResponse } from "./utils"; const router = express.Router(); let api: SerumApi; @@ -28,8 +29,14 @@ router.get( logger.info("Received request to get market_info"); api .getMarketInfo() - .then((marketInfo) => res.send({ status: "ok", data: marketInfo })) - .catch((err) => next(err)); + .then((marketInfo) => sendSuccessfulResponse(res, marketInfo)) + .catch((err) => { + logger.log( + "error", + `Call to getWsOrderBook encountered error ${err.name}: \n ${err.stack}` + ); + sendErrorResponse(res, err.toString()); + }); }) ); @@ -39,21 +46,80 @@ router.get( logger.info("Received request to api getOrderbook"); api .getWsOrderBook(req.params.coin, req.params.quote) - .then((orderBook) => res.send({ status: "ok", data: orderBook })) - .catch((err) => next(err)); + .then((orderBook) => sendSuccessfulResponse(res, orderBook)) + .catch((err) => { + logger.log( + "error", + `Call to getWsOrderBook encountered error ${err.name}: \n ${err.stack}` + ); + sendErrorResponse(res, err.toString()); + }); }) ); router.get( "/trades/:coin-:quote", expressAsyncHandler(async (req, res, next) => { - logger.info("Received request to api getTrades"); + logger.info( + `Received request to api getTrades. Coin: ${req.params.coin}, Price Currency: ${req.params.quote}` + ); api .getTrades(req.params.coin, req.params.quote) - .then((trades) => res.send({ status: "ok", data: trades })) + .then((trades) => sendSuccessfulResponse(res, trades)) .catch((err) => { - logger.info(err); - next(err); + logger.log( + "error", + `Call to getTrades encountered error ${err.name}: \n ${err.stack}` + ); + sendErrorResponse(res, err.toString()); + }); + }) +); + +router.get( + "/own_orders/:coin-:quote", + expressAsyncHandler(async (req, res, next) => { + api + .getOwnOrders(req.params.coin, req.params.priceCurrency) + .then((orders) => sendSuccessfulResponse(res, { orders })) + .catch((err) => { + logger.log( + "error", + `Call to getOwnOrders encountered error ${err.name}: \n ${err.stack}` + ); + sendErrorResponse(res, err.toString()); + }); + }) +); + +router.get( + "/fills/:coin-:quote", + expressAsyncHandler(async (req, res, next) => { + api + .getFills(req.params.coin, req.params.priceCurrency) + .then((fills) => sendSuccessfulResponse(res, fills)) + .catch((err) => { + logger.log( + "error", + `Call to getFills encountered error ${err.name}: \n ${err.stack}` + ); + sendErrorResponse(res, err.toString()); + }); + }) +); + +router.get( + "/balances", + expressAsyncHandler(async (req, res, next) => { + api + .getBalances() + .then((balances) => sendSuccessfulResponse(res, balances)) + .catch((err) => { + logger.log( + "error", + `Call to getBalances encountered error ${err.name}: \n ${err.stack}` + ); + sendErrorResponse(res, err.toString()); }); }) ); @@ -61,7 +127,11 @@ router.get( router.post( "/place_order", expressAsyncHandler(async (req, res, next) => { - logger.info(`Order parameters ${JSON.stringify(req.body)}`); + logger.info( + `Received request to api placeOrder. Order parameters ${JSON.stringify( + req.body + )}` + ); api .placeOrder( DirUtil.parse(req.body.side), @@ -75,26 +145,14 @@ router.post( orderEdge: req.body.orderEdge, } ) - .then((id) => res.send({ status: "ok", data: { id: id } })) + .then((id) => sendSuccessfulResponse(res, { id: id })) .catch((err) => { logger.log("error", `${req.params.exchange} make_order error: ${err}`); try { - const body = { - status: "error", - data: { - errorType: err.name, - errorMessage: err.message || JSON.stringify(err), - stack: (err.stack && err.stack.toString()) || JSON.stringify(err), - }, - }; - res.send(body); + sendErrorResponse(res, err.message || JSON.stringify(err)); } catch (e) { try { - const body = { - status: "error", - data: { errorMessage: err, name: undefined, stack: undefined }, - }; - res.send(body); + sendErrorResponse(res, err.toString()); } catch (f) { next(err); } @@ -112,30 +170,17 @@ router.post( const clientOrderId = req.body.clientOrderId; if (!coin) { - const body = { - status: "error", - data: { - errorMessage: "Coin parameter missing from cancel request", - }, - }; - res.send(body); + sendErrorResponse(res, "Coin parameter missing from cancel request"); } else if (!priceCurrency) { - const body = { - status: "error", - data: { - errorMessage: "Price currency parameter missing from cancel request", - }, - }; - res.send(body); + sendErrorResponse( + res, + "Price currency parameter missing from cancel request" + ); } else if (!orderId && !clientOrderId) { - const body = { - status: "error", - data: { - errorMessage: - "Order id and client order id missing from cancel request", - }, - }; - res.send(body); + sendErrorResponse( + res, + "Order id and client order id missing from cancel request" + ); } let cancelFn: ( @@ -149,29 +194,17 @@ router.post( cancelFn = api.cancelByStandardOrderId; } cancelFn(req.params.orderId, req.params.coin, req.params.priceCurrency) - .then((result) => res.send({ status: "ok", data: {} })) + .then((_) => sendSuccessfulResponse(res)) .catch((err) => { logger.error( `${req.params.coin}/${req.params.priceCurrency} cancel ${req.params.orderId} received error ${JSON.stringify(err)}` ); try { - const body = { - status: "error", - data: { - errorType: err.name, - errorMessage: err.message || JSON.stringify(err), - stack: (err.stack && err.stack.toString()) || JSON.stringify(err), - }, - }; - res.send(body); + sendErrorResponse(res, err.message || JSON.stringify(err)); } catch (e) { try { - const body = { - status: "error", - data: { errorMessage: err, name: undefined, stack: undefined }, - }; - res.send(body); + sendErrorResponse(res, err); } catch (f) { next(err); } @@ -180,63 +213,13 @@ router.post( }) ); -router.get( - "/own_orders/:coin-:quote", - expressAsyncHandler(async (req, res, next) => { - api - .getOwnOrders(req.params.coin, req.params.priceCurrency) - .then((orders) => res.send({ status: "ok", data: { orders } })) - .catch((err) => { - logger.log( - "error", - `Call to own_orders encountered error ${err.name}: \n ${err.stack}` - ); - res.send({ - status: "error", - data: { - errorType: err.name, - errorMessage: err.message, - stack: err.stack.toString(), - }, - }); - }); - }) -); - -router.get( - "/fills/:coin-:quote", - expressAsyncHandler(async (req, res, next) => { - if ("coin" in req.query && "priceCurrency" in req.query) { - api - .getFills(req.params.coin, req.params.priceCurrency) - .then((fills) => res.send({ status: "ok", data: fills })) - .catch((err) => next(err)); - } else { - api - .getFills() - .then((fills) => res.send({ status: "ok", data: fills })) - .catch((err) => next(err)); - } - }) -); - -router.get( - "/balances", - expressAsyncHandler(async (req, res, next) => { - api - .getBalances() - .then((balances) => res.send({ status: "ok", data: balances })) - .catch((err) => next(err)); - }) -); - router.post( "/settle", expressAsyncHandler(async (req, res, next) => { api .settleFunds(req.body.coin, req.body.priceCurrency) - .then((_) => res.send({ status: "ok", data: {} })) - .catch((err) => next(err)); + .then((_) => sendSuccessfulResponse(res)) + .catch((err) => sendErrorResponse(res, err.toString())); }) ); diff --git a/src/api/utils.ts b/src/api/utils.ts new file mode 100644 index 0000000..b11b306 --- /dev/null +++ b/src/api/utils.ts @@ -0,0 +1,21 @@ +import { Response } from "express"; + +export const sendSuccessfulResponse = async ( + response: Response, + data: any = {} +): Promise => { + response.send({ + status: "ok", + data: data, + }); +}; + +export const sendErrorResponse = async ( + response: Response, + message: string +): Promise => { + response.send({ + status: "error", + message: message, + }); +}; diff --git a/src/app.ts b/src/app.ts index 44e6f30..1a9f299 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,7 +1,7 @@ import createError from "http-errors"; import express from "express"; import { default as morgan } from "morgan"; -import indexRouter from "./routes"; +import indexRouter from "./api/routes"; import { logger, morganStream } from "./utils"; import * as config from "./config"; diff --git a/src/config.ts b/src/config.ts index 41fcbc6..b4b77a5 100644 --- a/src/config.ts +++ b/src/config.ts @@ -20,4 +20,4 @@ export const DEFAULT_TIMEOUT = 15000; export const BLOCKHASH_CACHE_TIME = 30; export const NUM_CONNECTIONS = 1; export const SOLANA_URL = - process.env.SOLANA_URL || "http://validator-lb.wirelesstable.net"; + process.env.SOLANA_URL || "https://solana-api.projectserum.com"; diff --git a/src/exchange/config.ts b/src/exchange/config.ts index 0a67ff1..c00e8e2 100644 --- a/src/exchange/config.ts +++ b/src/exchange/config.ts @@ -3,7 +3,7 @@ import { HARD_CODED_MINTS } from "../config"; import { Pair } from "./types"; import { PublicKey } from "@solana/web3.js"; -export const MARKET_PARAMS = MARKETS.map((marketInfo) => { +export const MARKET_PARAMS = MARKETS.filter(marketInfo => !marketInfo.deprecated).map((marketInfo) => { const [coin, priceCurrency] = marketInfo.name.split("/"); return { address: marketInfo.address, diff --git a/yarn.lock b/yarn.lock index 98b1bd1..c7e7c62 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,9 +33,9 @@ js-tokens "^4.0.0" "@babel/runtime@^7.11.2", "@babel/runtime@^7.3.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740" - integrity sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA== + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== dependencies: regenerator-runtime "^0.13.4" @@ -86,18 +86,18 @@ fastq "^1.6.0" "@project-serum/serum@^0.13.5": - version "0.13.5" - resolved "https://registry.yarnpkg.com/@project-serum/serum/-/serum-0.13.5.tgz#9e8591886b3fc7f2486a94c242e5728d97da0938" - integrity sha512-qMnxYKR/z8pqN+LFUIPRFwdSsJ1bGD39Jy6nooQl+aFp+ZpS8+hjIsJQGjpJA4kf+H+U8v6kcMhgMJ6diAWUHw== + version "0.13.11" + resolved "https://registry.yarnpkg.com/@project-serum/serum/-/serum-0.13.11.tgz#c55c830cbfb28cdc2b4e4076b1367d45ad19175d" + integrity sha512-kE9PhXuryP7afJFkZrKkLzNxeRETHgPvN5Jl3BZIDH5oyHLUfmj3OQreMPwIqJXnMkLwCHewG5JFJALwit+3Wg== dependencies: - "@solana/web3.js" "^0.71.10" + "@solana/web3.js" "0.86.1" bn.js "^5.1.2" buffer-layout "^1.2.0" -"@solana/web3.js@^0.71.10": - version "0.71.14" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-0.71.14.tgz#b21f9613cb2e27defc93264bd894761689d209e3" - integrity sha512-23jWjzMxSOKzcAUzLBaD5p0YRJys6A9cEdWZQtPV/CV7bmo5JNIdPDR+UhzPxe1L3WX3bu7KAmAjcIERCXKDfQ== +"@solana/web3.js@0.86.1": + version "0.86.1" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-0.86.1.tgz#034a2cef742569f74dfc9960dfbcabc92e674b08" + integrity sha512-9mjWs17ym7PIm7bHA37wnnYyD7rIVHwkx1RI6BzGhMO5h8E+HlZM8ISLgOx+NItg8XRCfFhlrVgJTzK4om1s0g== dependencies: "@babel/runtime" "^7.3.1" bn.js "^5.0.0" @@ -107,10 +107,12 @@ crypto-hash "^1.2.2" esdoc-inject-style-plugin "^1.0.0" jayson "^3.0.1" + keccak "^3.0.1" mz "^2.7.0" node-fetch "^2.2.0" npm-run-all "^4.1.5" - rpc-websockets "^7.4.0" + rpc-websockets "^7.4.2" + secp256k1 "^4.0.2" superstruct "^0.8.3" tweetnacl "^1.0.0" ws "^7.0.0" @@ -186,9 +188,9 @@ integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= "@types/lodash@^4.14.159": - version "4.14.162" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.162.tgz#65d78c397e0d883f44afbf1f7ba9867022411470" - integrity sha512-alvcho1kRUnnD1Gcl4J+hK0eencvzq9rmzvFPRmP5rPHx9VVsJj6bKLTATPVf9ktgv4ujzh7T+XWKp+jhuODig== + version "4.14.165" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.165.tgz#74d55d947452e2de0742bad65270433b63a8c30f" + integrity sha512-tjSSOTHhI5mCHTy/OOXYIhi2Wt1qcbHmuXD1Ha7q70CgI/I71afO4XtLb/cVexki1oVYchpul/TOuu3Arcdxrg== "@types/mime@*": version "2.0.3" @@ -196,14 +198,14 @@ integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== "@types/node@*": - version "14.11.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.11.tgz#359ea52236b5ccc04a71d4001c8467178a9d3699" - integrity sha512-UcaAZrL8uO5GNS+NLxkYg1RiOMgdLxCXGqs+TTupltXN8rTvUEKTOpqCV3tlcAIZJXzcBQajzmjdrvuPvnuMUw== + version "14.14.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.7.tgz#8ea1e8f8eae2430cf440564b98c6dfce1ec5945d" + integrity sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg== "@types/node@^12.12.54": - version "12.12.68" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.68.tgz#dd5acf4a52a458ff1d9ef4fd66406fba0afbbb33" - integrity sha512-3RW2s24ewB7F9dAHvgb9FRvNHn6nO9IK6Eaknbz7HTOe2a5GVne5XbUh5+YA+kcCn67glyHhClUUdFP73LWrgQ== + version "12.19.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.4.tgz#cdfbb62e26c7435ed9aab9c941393cc3598e9b46" + integrity sha512-o3oj1bETk8kBwzz1WlO6JWL/AfAA3Vm6J1B3C9CsdxHYp7XgPiH7OEXPUbZTndHlRaIElrANkQfe6ZmfJb3H2w== "@types/qs@*": version "6.9.5" @@ -431,10 +433,10 @@ base-x@^3.0.2: dependencies: safe-buffer "^5.0.1" -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== basic-auth@~2.0.1: version "2.0.1" @@ -443,6 +445,11 @@ basic-auth@~2.0.1: dependencies: safe-buffer "5.1.2" +bn.js@^4.4.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + bn.js@^5.0.0, bn.js@^5.1.2, bn.js@^5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" @@ -484,6 +491,11 @@ braces@^3.0.1: dependencies: fill-range "^7.0.1" +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + bs58@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" @@ -497,25 +509,33 @@ buffer-layout@^1.2.0: integrity sha512-iiyRoho/ERzBUv6kFvfsrLNgTlVwOkqQcSQN7WrO3Y+c5SeuEhCn6+y1KwhM0V3ndptF5mI/RI44zkw0qcR5Jg== buffer@^5.4.3: - version "5.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" - integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" + base64-js "^1.3.1" + ieee754 "^1.1.13" bufferutil@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.1.tgz#3a177e8e5819a1243fe16b63a199951a7ad8d4a7" - integrity sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.2.tgz#79f68631910f6b993d870fc77dc0a2894eb96cd5" + integrity sha512-AtnG3W6M8B2n4xDQ5R+70EXvOpnXsFYg/AK2yTZd+HQ/oxAdz+GI+DvjmhBw3L0ole+LJ0ngqY4JMbDzkfNzhA== dependencies: - node-gyp-build "~3.7.0" + node-gyp-build "^4.2.0" bytes@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +call-bind@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" + integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.0" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -839,6 +859,19 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +elliptic@^6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -878,7 +911,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1: version "1.17.7" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== @@ -895,7 +928,7 @@ es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" -es-abstract@^1.18.0-next.0: +es-abstract@^1.18.0-next.1: version "1.18.0-next.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== @@ -1346,6 +1379,15 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +get-intrinsic@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" + integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-prototype-of@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/get-prototype-of/-/get-prototype-of-0.0.0.tgz#98772bd10716d16deb4b322516c469efca28ac44" @@ -1421,6 +1463,23 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + hosted-git-info@^2.1.4: version "2.8.8" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" @@ -1478,10 +1537,10 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^4.0.6: version "4.0.6" @@ -1554,10 +1613,10 @@ is-class@0.0.4: resolved "https://registry.yarnpkg.com/is-class/-/is-class-0.0.4.tgz#e057451705bb34e39e3e33598c93a9837296b736" integrity sha1-4FdFFwW7NOOePjNZjJOpg3KWtzY= -is-core-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" - integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw== +is-core-module@^2.0.0, is-core-module@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" + integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== dependencies: has "^1.0.3" @@ -1696,6 +1755,14 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= +keccak@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" + integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + keypather@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/keypather/-/keypather-1.10.2.tgz#e0449632d4b3e516f21cc014ce7c5644fddce614" @@ -1882,6 +1949,16 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -1956,15 +2033,20 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + node-fetch@^2.2.0: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-gyp-build@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d" - integrity sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w== +node-gyp-build@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" + integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== normalize-package-data@^2.3.2: version "2.5.0" @@ -2019,12 +2101,12 @@ object-keys@^1.0.12, object-keys@^1.1.1: integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" - integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.0" has-symbols "^1.0.1" object-keys "^1.1.1" @@ -2321,7 +2403,15 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.10.0, resolve@^1.10.1, resolve@^1.13.1, resolve@^1.17.0: +resolve@^1.10.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + +resolve@^1.10.1, resolve@^1.13.1, resolve@^1.17.0: version "1.18.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== @@ -2341,7 +2431,7 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rpc-websockets@^7.4.0, rpc-websockets@^7.4.2: +rpc-websockets@^7.4.2: version "7.4.6" resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.4.6.tgz#a0053ad36e893774cdd0edb72ac577deaf34f247" integrity sha512-vDGdyJv858O5ZIc7glov8pQDdFztOqujA7iNyrfPxw87ajHT5s8WQU4MLNEG8pTR/xzqOn06dYH7kef2hijInw== @@ -2376,6 +2466,15 @@ safe-buffer@^5.0.1, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +secp256k1@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" + integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== + dependencies: + elliptic "^6.5.2" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + "semver@2 || 3 || 4 || 5", semver@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -2539,20 +2638,20 @@ string.prototype.padend@^3.0.0: es-abstract "^1.17.0-next.1" string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46" + integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7" + integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" string_decoder@^1.1.1: version "1.3.0" @@ -2745,11 +2844,11 @@ uri-js@^4.2.2: punycode "^2.1.0" utf-8-validate@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.2.tgz#63cfbccd85dc1f2b66cf7a1d0eebc08ed056bfb3" - integrity sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw== + version "5.0.3" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.3.tgz#3b64e418ad2ff829809025fdfef595eab2f03a27" + integrity sha512-jtJM6fpGv8C1SoH4PtG22pGto6x+Y8uPprW0tw3//gGFhDDTiuksgradgFN6yRayDP4SyZZa6ZMGHLIa17+M8A== dependencies: - node-gyp-build "~3.7.0" + node-gyp-build "^4.2.0" util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" @@ -2854,6 +2953,6 @@ write@1.0.3: mkdirp "^0.5.1" ws@^7.0.0, ws@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" - integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== + version "7.4.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.0.tgz#a5dd76a24197940d4a8bb9e0e152bb4503764da7" + integrity sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ==