diff --git a/package.json b/package.json index 2caf4f7d..c8840e4d 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "body-parser": "^1.20.3", "connect-timeout": "^1.9.0", "debug": "^3.1.0", + "winston": "^3.11.0", "express": "4.17.3", "lodash": "^4.17.20", "morgan": "^1.9.1", @@ -41,6 +42,7 @@ "@types/node": "^16.18.46", "@types/sinon": "^10.0.11", "@types/supertest": "^2.0.11", + "@types/winston": "^2.4.4", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", "eslint": "^8.0.0", diff --git a/src/enclavedApp.ts b/src/enclavedApp.ts index 21d31edc..353d365c 100644 --- a/src/enclavedApp.ts +++ b/src/enclavedApp.ts @@ -2,7 +2,6 @@ * @prettier */ import express from 'express'; -import debug from 'debug'; import https from 'https'; import http from 'http'; import morgan from 'morgan'; @@ -20,28 +19,25 @@ import { prepareIpc, readCertificates, } from './shared/appUtils'; - -const debugLogger = debug('enclaved:express'); +import logger from './logger'; /** * Create a startup function which will be run upon server initialization */ export function startup(config: EnclavedConfig, baseUri: string): () => void { return function () { - /* eslint-disable no-console */ - console.log('BitGo Enclaved Express running'); - console.log(`Base URI: ${baseUri}`); - console.log(`TLS Mode: ${config.tlsMode}`); - console.log(`mTLS Enabled: ${config.tlsMode === TlsMode.MTLS}`); - console.log(`Request Client Cert: ${config.mtlsRequestCert}`); - console.log(`Reject Unauthorized: ${config.mtlsRejectUnauthorized}`); - /* eslint-enable no-console */ + logger.info('BitGo Enclaved Express running'); + logger.info(`Base URI: ${baseUri}`); + logger.info(`TLS Mode: ${config.tlsMode}`); + logger.info(`mTLS Enabled: ${config.tlsMode === TlsMode.MTLS}`); + logger.info(`Request Client Cert: ${config.mtlsRequestCert}`); + logger.info(`Reject Unauthorized: ${config.mtlsRejectUnauthorized}`); }; } function isTLS(config: EnclavedConfig): boolean { const { keyPath, crtPath, tlsKey, tlsCert, tlsMode } = config; - console.log('TLS Configuration:', { + logger.debug('TLS Configuration:', { tlsMode, hasKeyPath: Boolean(keyPath), hasCrtPath: Boolean(crtPath), @@ -64,12 +60,12 @@ async function createHttpsServer( if (tlsKey && tlsCert) { key = tlsKey; cert = tlsCert; - console.log('Using TLS key and cert from environment variables'); + logger.info('Using TLS key and cert from environment variables'); } else if (keyPath && crtPath) { const certificates = await readCertificates(keyPath, crtPath); key = certificates.key; cert = certificates.cert; - console.log(`Using TLS key and cert from files: ${keyPath}, ${crtPath}`); + logger.info(`Using TLS key and cert from files: ${keyPath}, ${crtPath}`); } else { throw new Error('Failed to get TLS key and certificate'); } @@ -127,12 +123,12 @@ export function createBaseUri(config: EnclavedConfig): string { * Create and configure the express application */ export function app(cfg: EnclavedConfig): express.Application { - debugLogger('app is initializing'); + logger.debug('app is initializing'); const app = express(); setupLogging(app, cfg); - debugLogger('logging setup'); + logger.debug('logging setup'); // Add custom morgan token for mTLS client certificate morgan.token('remote-user', function (req: express.Request) { @@ -146,7 +142,7 @@ export function app(cfg: EnclavedConfig): express.Application { routes.setupRoutes(app); // Add error handler - app.use(createErrorHandler(debugLogger)); + app.use(createErrorHandler()); return app; } diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 00000000..d9515d65 --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,61 @@ +import winston from 'winston'; + +// Define log levels +const levels = { + error: 0, + warn: 1, + info: 2, + http: 3, + debug: 4, +}; + +// Define level based on environment +const level = () => { + const env = process.env.NODE_ENV || 'development'; + const isDevelopment = env === 'development'; + return isDevelopment ? 'debug' : 'warn'; +}; + +// Define colors for each level +const colors = { + error: 'red', + warn: 'yellow', + info: 'green', + http: 'magenta', + debug: 'white', +}; + +// Add colors to winston +winston.addColors(colors); + +// Define the format for the logs +const format = winston.format.combine( + winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }), + winston.format.colorize({ all: true }), + winston.format.printf( + (info: winston.Logform.TransformableInfo) => `${info.timestamp} ${info.level}: ${info.message}`, + ), +); + +// Define which transports the logger must use +const transports = [ + // Console transport + new winston.transports.Console(), + // Error log file transport + new winston.transports.File({ + filename: 'logs/error.log', + level: 'error', + }), + // All logs file transport + new winston.transports.File({ filename: 'logs/all.log' }), +]; + +// Create the logger instance +const logger = winston.createLogger({ + level: level(), + levels, + format, + transports, +}); + +export default logger; diff --git a/src/masterExpressApp.ts b/src/masterExpressApp.ts index 8971db71..80da170f 100644 --- a/src/masterExpressApp.ts +++ b/src/masterExpressApp.ts @@ -2,7 +2,6 @@ * @prettier */ import express from 'express'; -import debug from 'debug'; import https from 'https'; import http from 'http'; import superagent from 'superagent'; @@ -28,8 +27,8 @@ import { ProxyAgent } from 'proxy-agent'; import { promiseWrapper } from './routes'; import pjson from '../package.json'; import { handleGenerateWalletOnPrem } from './masterBitgoExpress/generateWallet'; +import logger from './logger'; -const debugLogger = debug('master-express:express'); const BITGOEXPRESS_USER_AGENT = `BitGoExpress/${pjson.version} BitGoJS/${version}`; /** @@ -37,13 +36,11 @@ const BITGOEXPRESS_USER_AGENT = `BitGoExpress/${pjson.version} BitGoJS/${version */ export function startup(config: MasterExpressConfig, baseUri: string): () => void { return function () { - /* eslint-disable no-console */ - console.log('BitGo Master Express running'); - console.log(`Base URI: ${baseUri}`); - console.log(`Environment: ${config.env}`); - console.log(`SSL Enabled: ${config.enableSSL}`); - console.log(`Proxy Enabled: ${config.enableProxy}`); - /* eslint-enable no-console */ + logger.info('BitGo Master Express running'); + logger.info(`Base URI: ${baseUri}`); + logger.info(`Environment: ${config.env}`); + logger.info(`SSL Enabled: ${config.enableSSL}`); + logger.info(`Proxy Enabled: ${config.enableProxy}`); }; } @@ -123,12 +120,12 @@ async function createHttpsServer( if (sslKey && sslCert) { key = sslKey; cert = sslCert; - console.log('Using SSL key and cert from environment variables'); + logger.info('Using SSL key and cert from environment variables'); } else if (keyPath && crtPath) { const certificates = await readCertificates(keyPath, crtPath); key = certificates.key; cert = certificates.cert; - console.log(`Using SSL key and cert from files: ${keyPath}, ${crtPath}`); + logger.info(`Using SSL key and cert from files: ${keyPath}, ${crtPath}`); } else { throw new Error('Failed to get SSL key and certificate'); } @@ -165,16 +162,17 @@ function setupMasterExpressRoutes(app: express.Application): void { setupHealthCheckRoutes(app, 'master express'); const cfg = config() as MasterExpressConfig; - console.log('SSL Enabled:', cfg.enableSSL); - console.log('Enclaved Express URL:', cfg.enclavedExpressUrl); - console.log('Certificate exists:', Boolean(cfg.enclavedExpressSSLCert)); - console.log('Certificate length:', cfg.enclavedExpressSSLCert.length); - console.log('Certificate content:', cfg.enclavedExpressSSLCert); + logger.debug('SSL Configuration:', { + sslEnabled: cfg.enableSSL, + enclavedExpressUrl: cfg.enclavedExpressUrl, + hasCertificate: Boolean(cfg.enclavedExpressSSLCert), + certificateLength: cfg.enclavedExpressSSLCert.length, + }); // Add enclaved express ping route app.post('/ping/enclavedExpress', async (req, res) => { try { - console.log('Pinging enclaved express'); + logger.debug('Pinging enclaved express'); const response = await superagent .get(`${cfg.enclavedExpressUrl}/ping`) @@ -192,7 +190,7 @@ function setupMasterExpressRoutes(app: express.Application): void { enclavedResponse: response.body, }); } catch (error) { - debugLogger('Failed to ping enclaved express:', error); + logger.error('Failed to ping enclaved express:', { error }); res.status(500).json({ error: 'Failed to ping enclaved express', details: error instanceof Error ? error.message : String(error), @@ -215,19 +213,19 @@ function setupMasterExpressRoutes(app: express.Application): void { }); }); - debugLogger('Master express routes configured'); + logger.debug('Master express routes configured'); } /** * Create and configure the express application for master express mode */ export function app(cfg: MasterExpressConfig): express.Application { - debugLogger('master express app is initializing'); + logger.debug('master express app is initializing'); const app = express(); setupLogging(app, cfg); - debugLogger('logging setup'); + logger.debug('logging setup'); setupDebugNamespaces(cfg.debugNamespace); setupCommonMiddleware(app, cfg); @@ -236,7 +234,7 @@ export function app(cfg: MasterExpressConfig): express.Application { setupMasterExpressRoutes(app); // Add error handler - app.use(createErrorHandler(debugLogger)); + app.use(createErrorHandler()); return app; } diff --git a/src/shared/appUtils.ts b/src/shared/appUtils.ts index 8699eed0..9d155e49 100644 --- a/src/shared/appUtils.ts +++ b/src/shared/appUtils.ts @@ -3,7 +3,6 @@ */ import express from 'express'; import path from 'path'; -import debug from 'debug'; import https from 'https'; import http from 'http'; import morgan from 'morgan'; @@ -12,6 +11,7 @@ import timeout from 'connect-timeout'; import bodyParser from 'body-parser'; import _ from 'lodash'; import pjson from '../../package.json'; +import logger from '../logger'; import { Config } from '../config'; @@ -25,8 +25,7 @@ export function setupLogging(app: express.Application, config: Config): void { // create a write stream (in append mode) const accessLogPath = path.resolve(config.logFile); const accessLogStream = fs.createWriteStream(accessLogPath, { flags: 'a' }); - /* eslint-disable-next-line no-console */ - console.log('Log location: ' + accessLogPath); + logger.info(`Log location: ${accessLogPath}`); // setup the logger middleware = morgan('combined', { stream: accessLogStream }); } else { @@ -42,8 +41,8 @@ export function setupLogging(app: express.Application, config: Config): void { export function setupDebugNamespaces(debugNamespace?: string[]): void { if (_.isArray(debugNamespace)) { for (const ns of debugNamespace) { - if (ns && !debug.enabled(ns)) { - debug.enable(ns); + if (ns) { + logger.debug(`Enabling debug namespace: ${ns}`); } } } @@ -73,14 +72,14 @@ export function setupCommonMiddleware(app: express.Application, config: Config): /** * Create error handling middleware */ -export function createErrorHandler(debugLogger: debug.Debugger) { +export function createErrorHandler() { return function ( err: any, req: express.Request, res: express.Response, _next: express.NextFunction, ) { - debugLogger('Error: ' + (err && err.message ? err.message : String(err))); + logger.error('Error:', { error: err && err.message ? err.message : String(err) }); const statusCode = err && err.status ? err.status : 500; const result = { error: err && err.message ? err.message : String(err), diff --git a/yarn.lock b/yarn.lock index 5009d375..260c0c4f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1864,6 +1864,11 @@ eth-lib "^0.2.8" ethereumjs-util "^5.2.0" +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + "@confio/ics23@^0.6.8": version "0.6.8" resolved "https://registry.yarnpkg.com/@confio/ics23/-/ics23-0.6.8.tgz#2a6b4f1f2b7b20a35d9a0745bb5a446e72930b3d" @@ -2022,6 +2027,15 @@ resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.30.1.tgz#6d92582341be3c2ec8d82090253cfa4b7f959edb" integrity sha512-KvvX58MGMWh7xA+N+deCfunkA/ZNDvFLw4YbOmX3f/XBIkqrVY7qlotfy2aNb1kgp6h4B6Yc8YawJPDTfvWX7g== +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + "@dfinity/agent@^2.1.3", "@dfinity/agent@^2.2.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@dfinity/agent/-/agent-2.4.1.tgz#72c8a074f51faa28b217d2e603fdf6f6a8dca615" @@ -5048,6 +5062,11 @@ dependencies: "@types/superagent" "*" +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + "@types/urijs@^1.19.6": version "1.19.25" resolved "https://registry.yarnpkg.com/@types/urijs/-/urijs-1.19.25.tgz#ac92b53e674c3b108decdbe88dc5f444a2f42f6a" @@ -5063,6 +5082,13 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== +"@types/winston@^2.4.4": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/winston/-/winston-2.4.4.tgz#48cc744b7b42fad74b9a2e8490e0112bd9a3d08d" + integrity sha512-BVGCztsypW8EYwJ+Hq+QNYiT/MUyCif0ouBH+flrY66O5W+KIXAMML6E/0fJpm7VjIzgangahl5S03bJJQGrZw== + dependencies: + winston "*" + "@types/ws@^7.4.4": version "7.4.7" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" @@ -6672,6 +6698,13 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== +color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -6679,16 +6712,45 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + colorette@^2.0.7: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -7346,6 +7408,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -8208,6 +8275,11 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + fetch-blob@^3.1.2, fetch-blob@^3.1.4: version "3.2.0" resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" @@ -8315,6 +8387,11 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + follow-redirects@^1.14.0, follow-redirects@^1.14.7, follow-redirects@^1.14.8, follow-redirects@^1.14.9, follow-redirects@^1.15.6: version "1.15.9" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" @@ -9021,6 +9098,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -9934,6 +10016,11 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -10040,6 +10127,18 @@ lodash@4.17.21, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17. resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +logform@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1" + integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + long@^2.2.3: version "2.4.0" resolved "https://registry.yarnpkg.com/long/-/long-2.4.0.tgz#9fa180bb1d9500cdc29c4156766a1995e1f4524f" @@ -10787,6 +10886,13 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -11474,7 +11580,7 @@ readable-stream@^2.0.5, readable-stream@^2.3.5, readable-stream@^2.3.8: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.5.0, readable-stream@^3.6.0: +readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -12101,6 +12207,13 @@ simple-get@^2.7.0: once "^1.3.1" simple-concat "^1.0.0" +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + sinon@^13.0.1: version "13.0.2" resolved "https://registry.yarnpkg.com/sinon/-/sinon-13.0.2.tgz#c6a8ddd655dc1415bbdc5ebf0e5b287806850c3a" @@ -12239,6 +12352,11 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -12573,6 +12691,11 @@ text-encoding-utf-8@^1.0.2: resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -12657,6 +12780,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + tronweb@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/tronweb/-/tronweb-5.1.0.tgz#481d6bbc7449ed3f397879397b1427d5ddaa05dd" @@ -13380,6 +13508,32 @@ wif@^2.0.1, wif@^2.0.6: dependencies: bs58check "<3.0.0" +winston-transport@^4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" + integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== + dependencies: + logform "^2.7.0" + readable-stream "^3.6.2" + triple-beam "^1.3.0" + +winston@*, winston@^3.11.0: + version "3.17.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.17.0.tgz#74b8665ce9b4ea7b29d0922cfccf852a08a11423" + integrity sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.7.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.9.0" + word-wrap@^1.2.5, word-wrap@~1.2.3: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"