From caa9695a5fe8fbdd9b22d46b66ea8d66a3ddfd41 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Tue, 20 Oct 2020 12:18:08 -0700 Subject: [PATCH 001/180] Sync package-lock.json --- package-lock.json | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index c65c509..c5d866d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1455,18 +1455,11 @@ "dev": true }, "axios": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", - "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", "requires": { - "follow-redirects": "^1.10.0" - }, - "dependencies": { - "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" - } + "follow-redirects": "1.5.10" } }, "babel-jest": { @@ -2196,6 +2189,14 @@ "whatwg-url": "^8.0.0" } }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -3343,6 +3344,14 @@ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -5189,8 +5198,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "nanomatch": { "version": "1.2.13", From 777e2fbb0107d9735dbb7f6532bca863f72f754c Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Tue, 20 Oct 2020 12:27:07 -0700 Subject: [PATCH 002/180] Update SSH key --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8ac243f..6df5af7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -78,7 +78,7 @@ jobs: key: cache-completed-build-{{ .Environment.CIRCLE_SHA1 }} - add_ssh_keys: fingerprints: - - "gEG2bDOmDVTkv8mnj9FeaHIfDp/+wotifTo4elJK36I" + - "sUNBaY12LhlRvWoAZgFJorDbQDtXUiheNAAK+2Ds33Q" - run: name: Authenticate with registry command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/build/.npmrc From f214d7cd0ff07939083a8ad4ebb51651ea3a9a50 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Tue, 20 Oct 2020 13:51:41 -0700 Subject: [PATCH 003/180] Add module structure (#1) --- __tests__/index.test.ts | 5 +- src/dydx-client.ts | 123 ++++++++++++++++++++++++ src/index.ts | 3 +- src/modules/eth/impl.ts | 13 +++ src/modules/eth/index.ts | 3 + src/modules/eth/not-supported.ts | 11 +++ src/modules/eth/types.ts | 2 + src/modules/keys/impl.ts | 17 ++++ src/modules/keys/index.ts | 3 + src/modules/keys/not-supported.ts | 11 +++ src/modules/keys/types.ts | 5 + src/modules/onboarding/impl.ts | 15 +++ src/modules/onboarding/index.ts | 3 + src/modules/onboarding/not-supported.ts | 11 +++ src/modules/onboarding/types.ts | 3 + src/modules/private/impl.ts | 37 +++++++ src/modules/private/index.ts | 3 + src/modules/private/not-supported.ts | 11 +++ src/modules/private/types.ts | 18 ++++ src/modules/public/impl.ts | 11 +++ src/modules/public/index.ts | 2 + src/modules/public/types.ts | 7 ++ 22 files changed, 313 insertions(+), 4 deletions(-) create mode 100644 src/dydx-client.ts create mode 100644 src/modules/eth/impl.ts create mode 100644 src/modules/eth/index.ts create mode 100644 src/modules/eth/not-supported.ts create mode 100644 src/modules/eth/types.ts create mode 100644 src/modules/keys/impl.ts create mode 100644 src/modules/keys/index.ts create mode 100644 src/modules/keys/not-supported.ts create mode 100644 src/modules/keys/types.ts create mode 100644 src/modules/onboarding/impl.ts create mode 100644 src/modules/onboarding/index.ts create mode 100644 src/modules/onboarding/not-supported.ts create mode 100644 src/modules/onboarding/types.ts create mode 100644 src/modules/private/impl.ts create mode 100644 src/modules/private/index.ts create mode 100644 src/modules/private/not-supported.ts create mode 100644 src/modules/private/types.ts create mode 100644 src/modules/public/impl.ts create mode 100644 src/modules/public/index.ts create mode 100644 src/modules/public/types.ts diff --git a/__tests__/index.test.ts b/__tests__/index.test.ts index 1cd8b21..bfab1d9 100644 --- a/__tests__/index.test.ts +++ b/__tests__/index.test.ts @@ -1,7 +1,8 @@ -import { noop } from '../src'; +import { DydxClient } from '../src'; describe('noop test', () => { it('does nothing', () => { - noop(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const unusedClient = new DydxClient('https://example.com'); }); }); diff --git a/src/dydx-client.ts b/src/dydx-client.ts new file mode 100644 index 0000000..be36da6 --- /dev/null +++ b/src/dydx-client.ts @@ -0,0 +1,123 @@ +import { + KeyPair, +} from '@dydxprotocol/starkex-lib'; + +import { + Eth, + EthImpl, + ethNotSupported, +} from './modules/eth'; +import { + Keys, + KeysImpl, + keysNotSupported, +} from './modules/keys'; +import { + Onboarding, + OnboardingImpl, + onboardingNotSupported, +} from './modules/onboarding'; +import { + Private, + PrivateImpl, + privateNotSupported, +} from './modules/private'; +import { + Public, + PublicImpl, +} from './modules/public'; + +export interface ClientOptions { + apiTimeout?: number; + apiPrivateKey?: string | KeyPair; + starkPrivateKey?: string | KeyPair; + web3Proivder?: {}; +} + +export default class DydxClient { + readonly host: string; + readonly apiTimeout?: number; + readonly apiPrivateKey?: string | KeyPair; + readonly starkPrivateKey?: string | KeyPair; + readonly web3Proivder?: {}; + + // Modules. Except for `public`, these are created on-demand. + private readonly _public: Public; + private _private?: Private; + private _keys?: Keys; + private _onboarding?: Onboarding; + private _eth?: Eth; + + constructor( + host: string, + options: ClientOptions = {}, + ) { + this.host = host; + this.apiTimeout = options.apiTimeout; + this.apiPrivateKey = options.apiPrivateKey; + this.starkPrivateKey = options.starkPrivateKey; + this.web3Proivder = options.web3Proivder; + + // Modules. + this._public = new PublicImpl(); + } + + /** + * Get the public module, used for interacting with public endpoints. + */ + get public(): Public { + return this.public; + } + + /** + * Get the private module, used for interacting with endpoints that require API-key auth. + */ + get private(): Private { + if (!this._private) { + if (this.apiPrivateKey) { + this._private = new PrivateImpl(this.apiPrivateKey, this.starkPrivateKey); + } + return privateNotSupported; + } + return this._private; + } + + /** + * Get the keys module, used for managing API keys. Requires Ethereum key auth. + */ + get keys(): Keys { + if (!this._keys) { + if (this.web3Proivder) { + this._keys = new KeysImpl(this.web3Proivder); + } + return keysNotSupported; + } + return this._keys; + } + + /** + * Get the onboarding module, used to create a new user. Requires Ethereum key auth. + */ + get onboarding(): Onboarding { + if (!this._onboarding) { + if (this.web3Proivder) { + this._onboarding = new OnboardingImpl(this.web3Proivder); + } + return onboardingNotSupported; + } + return this._onboarding; + } + + /** + * Get the eth module, used for interacting with Ethereum smart contracts. + */ + get eth() { + if (!this._eth) { + if (this.web3Proivder) { + this._eth = new EthImpl(this.web3Proivder); + } + return ethNotSupported; + } + return this._eth; + } +} diff --git a/src/index.ts b/src/index.ts index d3c5f12..0536180 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1 @@ -export function noop() { -} +export { default as DydxClient } from './dydx-client'; diff --git a/src/modules/eth/impl.ts b/src/modules/eth/impl.ts new file mode 100644 index 0000000..6a8c107 --- /dev/null +++ b/src/modules/eth/impl.ts @@ -0,0 +1,13 @@ +import { + Eth, +} from './types'; + +export default class EthImpl implements Eth { + readonly web3Proivder: {}; + + constructor( + web3Proivder: {}, + ) { + this.web3Proivder = web3Proivder; + } +} diff --git a/src/modules/eth/index.ts b/src/modules/eth/index.ts new file mode 100644 index 0000000..5ec53da --- /dev/null +++ b/src/modules/eth/index.ts @@ -0,0 +1,3 @@ +export { default as EthImpl } from './impl'; +export { default as ethNotSupported } from './not-supported'; +export * from './types'; diff --git a/src/modules/eth/not-supported.ts b/src/modules/eth/not-supported.ts new file mode 100644 index 0000000..a8fc60b --- /dev/null +++ b/src/modules/eth/not-supported.ts @@ -0,0 +1,11 @@ +import { + Eth, +} from './types'; + +const handler = { + get() { + throw new Error('Eth is not supported'); + }, +}; + +export default new Proxy({}, handler) as Eth; diff --git a/src/modules/eth/types.ts b/src/modules/eth/types.ts new file mode 100644 index 0000000..571462d --- /dev/null +++ b/src/modules/eth/types.ts @@ -0,0 +1,2 @@ +export interface Eth { +} diff --git a/src/modules/keys/impl.ts b/src/modules/keys/impl.ts new file mode 100644 index 0000000..c2dae2c --- /dev/null +++ b/src/modules/keys/impl.ts @@ -0,0 +1,17 @@ +import { + Keys, +} from './types'; + +export default class KeysImpl implements Keys { + readonly web3Proivder: {}; + + constructor( + web3Proivder: {}, + ) { + this.web3Proivder = web3Proivder; + } + + getApiKeys(): void {} + registerApiKey(): void {} + deleteApiKey(): void {} +} diff --git a/src/modules/keys/index.ts b/src/modules/keys/index.ts new file mode 100644 index 0000000..0a6b5da --- /dev/null +++ b/src/modules/keys/index.ts @@ -0,0 +1,3 @@ +export { default as KeysImpl } from './impl'; +export { default as keysNotSupported } from './not-supported'; +export * from './types'; diff --git a/src/modules/keys/not-supported.ts b/src/modules/keys/not-supported.ts new file mode 100644 index 0000000..269dd52 --- /dev/null +++ b/src/modules/keys/not-supported.ts @@ -0,0 +1,11 @@ +import { + Keys, +} from './types'; + +const handler = { + get() { + throw new Error('Keys is not supported'); + }, +}; + +export default new Proxy({}, handler) as Keys; diff --git a/src/modules/keys/types.ts b/src/modules/keys/types.ts new file mode 100644 index 0000000..e4c6c0e --- /dev/null +++ b/src/modules/keys/types.ts @@ -0,0 +1,5 @@ +export interface Keys { + getApiKeys(): void; + registerApiKey(): void; + deleteApiKey(): void; +} diff --git a/src/modules/onboarding/impl.ts b/src/modules/onboarding/impl.ts new file mode 100644 index 0000000..7c161cd --- /dev/null +++ b/src/modules/onboarding/impl.ts @@ -0,0 +1,15 @@ +import { + Onboarding, +} from './types'; + +export default class OnboardingImpl implements Onboarding { + readonly web3Proivder: {}; + + constructor( + web3Proivder: {}, + ) { + this.web3Proivder = web3Proivder; + } + + createUser(): void { } +} diff --git a/src/modules/onboarding/index.ts b/src/modules/onboarding/index.ts new file mode 100644 index 0000000..5ad7a04 --- /dev/null +++ b/src/modules/onboarding/index.ts @@ -0,0 +1,3 @@ +export { default as OnboardingImpl } from './impl'; +export { default as onboardingNotSupported } from './not-supported'; +export * from './types'; diff --git a/src/modules/onboarding/not-supported.ts b/src/modules/onboarding/not-supported.ts new file mode 100644 index 0000000..2741281 --- /dev/null +++ b/src/modules/onboarding/not-supported.ts @@ -0,0 +1,11 @@ +import { + Onboarding, +} from './types'; + +const handler = { + get() { + throw new Error('Onboarding is not supported'); + }, +}; + +export default new Proxy({}, handler) as Onboarding; diff --git a/src/modules/onboarding/types.ts b/src/modules/onboarding/types.ts new file mode 100644 index 0000000..aef4f69 --- /dev/null +++ b/src/modules/onboarding/types.ts @@ -0,0 +1,3 @@ +export interface Onboarding { + createUser(): void; +} diff --git a/src/modules/private/impl.ts b/src/modules/private/impl.ts new file mode 100644 index 0000000..04c9ccf --- /dev/null +++ b/src/modules/private/impl.ts @@ -0,0 +1,37 @@ +import { + KeyPair, +} from '@dydxprotocol/starkex-lib'; + +import { + Private, +} from './types'; + +export default class PrivateImpl implements Private { + readonly apiPrivateKey: string | KeyPair; + readonly starkPrivateKey?: string | KeyPair; + + constructor( + apiPrivateKey: string | KeyPair, + starkPrivateKey?: string | KeyPair, + ) { + this.apiPrivateKey = apiPrivateKey; + this.starkPrivateKey = starkPrivateKey; + } + + getUser(): void {} + updateUser(): void {} + createAccount(): void {} + getAccounts(): void {} + getPositions(): void {} + getOrders(): void {} + getOrder(): void {} + createOrder(): void {} + deleteOrder(): void {} + cancelOrder(): void {} + cancelAllOrders(): void {} + getFills(): void {} + getTransfers(): void {} + createWithdrawal(): void {} + createDeposit(): void {} + getFundingPayments(): void {} +} diff --git a/src/modules/private/index.ts b/src/modules/private/index.ts new file mode 100644 index 0000000..5f87226 --- /dev/null +++ b/src/modules/private/index.ts @@ -0,0 +1,3 @@ +export { default as PrivateImpl } from './impl'; +export { default as privateNotSupported } from './not-supported'; +export * from './types'; diff --git a/src/modules/private/not-supported.ts b/src/modules/private/not-supported.ts new file mode 100644 index 0000000..bfa7273 --- /dev/null +++ b/src/modules/private/not-supported.ts @@ -0,0 +1,11 @@ +import { + Private, +} from './types'; + +const handler = { + get() { + throw new Error('Private is not supported'); + }, +}; + +export default new Proxy({}, handler) as Private; diff --git a/src/modules/private/types.ts b/src/modules/private/types.ts new file mode 100644 index 0000000..94908a5 --- /dev/null +++ b/src/modules/private/types.ts @@ -0,0 +1,18 @@ +export interface Private { + getUser(): void; + updateUser(): void; + createAccount(): void; + getAccounts(): void; + getPositions(): void; + getOrders(): void; + getOrder(): void; + createOrder(): void; + deleteOrder(): void; + cancelOrder(): void; + cancelAllOrders(): void; + getFills(): void; + getTransfers(): void; + createWithdrawal(): void; + createDeposit(): void; + getFundingPayments(): void; +} diff --git a/src/modules/public/impl.ts b/src/modules/public/impl.ts new file mode 100644 index 0000000..ce7490b --- /dev/null +++ b/src/modules/public/impl.ts @@ -0,0 +1,11 @@ +import { + Public, +} from './types'; + +export default class PublicImpl implements Public { + getMarkets(): void {} + getOrderBook(): void {} + getStats(): void {} + getTrades(): void {} + getHistoricalFunding(): void {} +} diff --git a/src/modules/public/index.ts b/src/modules/public/index.ts new file mode 100644 index 0000000..3b998a4 --- /dev/null +++ b/src/modules/public/index.ts @@ -0,0 +1,2 @@ +export { default as PublicImpl } from './impl'; +export * from './types'; diff --git a/src/modules/public/types.ts b/src/modules/public/types.ts new file mode 100644 index 0000000..f7832bd --- /dev/null +++ b/src/modules/public/types.ts @@ -0,0 +1,7 @@ +export interface Public { + getMarkets(): void; + getOrderBook(): void; + getStats(): void; + getTrades(): void; + getHistoricalFunding(): void; +} From e5a07af1bd3a8f27aeebe6d4dfe081df715ef633 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Tue, 20 Oct 2020 15:22:34 -0700 Subject: [PATCH 004/180] Fix package name with dydx prefix --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index c5d866d..1fdd393 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "v3-client", + "name": "@dydxprotocol/v3-client", "version": "0.0.1", "lockfileVersion": 1, "requires": true, diff --git a/package.json b/package.json index 7d4f995..010f4a8 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "v3-client", + "name": "@dydxprotocol/v3-client", "version": "0.0.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", From a126b93b537ee8e19c7478168c10e2b6b1700d43 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Tue, 20 Oct 2020 15:57:46 -0700 Subject: [PATCH 005/180] Add axios module (#3) * Add axios module * Minor fixes * Fix lint --- src/lib/axios/axiosRequest.ts | 21 ++++++++++++++++ src/lib/axios/errors.ts | 46 +++++++++++++++++++++++++++++++++++ src/lib/axios/index.ts | 7 ++++++ src/lib/axios/types.ts | 6 +++++ src/lib/errors.ts | 25 +++++++++++++++++++ 5 files changed, 105 insertions(+) create mode 100644 src/lib/axios/axiosRequest.ts create mode 100644 src/lib/axios/errors.ts create mode 100644 src/lib/axios/index.ts create mode 100644 src/lib/axios/types.ts create mode 100644 src/lib/errors.ts diff --git a/src/lib/axios/axiosRequest.ts b/src/lib/axios/axiosRequest.ts new file mode 100644 index 0000000..9d99732 --- /dev/null +++ b/src/lib/axios/axiosRequest.ts @@ -0,0 +1,21 @@ +import axios, { AxiosRequestConfig } from 'axios'; + +import { + AxiosServerError, + AxiosError, +} from './errors'; + +export async function axiosRequest(options: AxiosRequestConfig): Promise<{}> { + try { + const response = await axios(options); + return response.data; + } catch (error) { + if (error.isAxiosError) { + if (error.response) { + throw new AxiosServerError(error.response, error); + } + throw new AxiosError(`Axios: ${error.message}`, error); + } + throw error; + } +} diff --git a/src/lib/axios/errors.ts b/src/lib/axios/errors.ts new file mode 100644 index 0000000..37eb6bf --- /dev/null +++ b/src/lib/axios/errors.ts @@ -0,0 +1,46 @@ +import { + WrappedError, +} from '../errors'; + +interface AxiosOriginalError extends Error { + isAxiosError: true; + toJSON(): {}; +} + +interface AxiosErrorResponse { + status: number, + statusText: string, + data: {}, +} + +/** + * An error thrown by axios. + * + * Depending on your use case, if logging errors, you may want to catch axios errors and sanitize + * them to remove the request and response objects, or sensitive fields. For example: + * + * this.originalError = _.omit(originalError.toJSON(), 'config') + */ +export class AxiosError extends WrappedError {} + +/** + * Axios error with response error fields. + */ +export class AxiosServerError extends AxiosError { + public readonly status: number; + public readonly statusText: string; + public readonly data: {}; + + constructor( + response: AxiosErrorResponse, + originalError: AxiosOriginalError, + ) { + super( + `${response.status}: ${response.statusText} - ${JSON.stringify(response.data, null, 2)}`, + originalError, + ); + this.status = response.status; + this.statusText = response.statusText; + this.data = response.data; + } +} diff --git a/src/lib/axios/index.ts b/src/lib/axios/index.ts new file mode 100644 index 0000000..2dcea76 --- /dev/null +++ b/src/lib/axios/index.ts @@ -0,0 +1,7 @@ +/** + * Simple handling of axios requests and errors. + */ + +export * from './axiosRequest'; +export * from './errors'; +export * from './types'; diff --git a/src/lib/axios/types.ts b/src/lib/axios/types.ts new file mode 100644 index 0000000..cf4cb4e --- /dev/null +++ b/src/lib/axios/types.ts @@ -0,0 +1,6 @@ +export enum RequestMethod { + DELETE = 'DELETE', + GET = 'GET', + POST = 'POST', + PUT = 'PUT', +} diff --git a/src/lib/errors.ts b/src/lib/errors.ts new file mode 100644 index 0000000..8e7908b --- /dev/null +++ b/src/lib/errors.ts @@ -0,0 +1,25 @@ +/** + * Base class for custom errors. + */ +export class CustomError extends Error { + constructor(message: string) { + super(message); + // Set a more specific name. This will show up in e.g. console.log. + this.name = this.constructor.name; + } +} + +/** + * Base class for a custom error which wraps another error. + */ +export class WrappedError extends CustomError { + public readonly originalError: Error; + + constructor( + message: string, + originalError: Error, + ) { + super(message); + this.originalError = originalError; + } +} From 3030ce2486ea1fb73d4ec11bfaa6c4b49401cb30 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Tue, 20 Oct 2020 17:12:13 -0700 Subject: [PATCH 006/180] Add public clients [BAC-516] (#2) * Add public clients * ks1 * ks2 --- package-lock.json | 46 +++++++++++++++++++++++++ src/dydx-client.ts | 2 +- src/modules/public/impl.ts | 69 ++++++++++++++++++++++++++++++++++--- src/modules/public/types.ts | 20 ++++++++--- src/types.ts | 13 +++++++ 5 files changed, 139 insertions(+), 11 deletions(-) create mode 100644 src/types.ts diff --git a/package-lock.json b/package-lock.json index 1fdd393..533a565 100644 --- a/package-lock.json +++ b/package-lock.json @@ -907,6 +907,12 @@ "@types/node": "*" } }, + "@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", + "dev": true + }, "@types/elliptic": { "version": "6.4.12", "resolved": "https://registry.npmjs.org/@types/elliptic/-/elliptic-6.4.12.tgz", @@ -1007,6 +1013,40 @@ "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", "dev": true }, + "@types/request": { + "version": "2.48.5", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz", + "integrity": "sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==", + "dev": true, + "requires": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + }, + "dependencies": { + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + } + } + }, + "@types/request-promise-native": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@types/request-promise-native/-/request-promise-native-1.0.17.tgz", + "integrity": "sha512-05/d0WbmuwjtGMYEdHIBZ0tqMJJQ2AD9LG2F6rKNBGX1SSFR27XveajH//2N/XYtual8T9Axwl+4v7oBtPUZqg==", + "dev": true, + "requires": { + "@types/request": "*" + } + }, "@types/secp256k1": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz", @@ -1021,6 +1061,12 @@ "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, + "@types/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==", + "dev": true + }, "@types/yargs": { "version": "15.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", diff --git a/src/dydx-client.ts b/src/dydx-client.ts index be36da6..ed18154 100644 --- a/src/dydx-client.ts +++ b/src/dydx-client.ts @@ -59,7 +59,7 @@ export default class DydxClient { this.web3Proivder = options.web3Proivder; // Modules. - this._public = new PublicImpl(); + this._public = new PublicImpl(host); } /** diff --git a/src/modules/public/impl.ts b/src/modules/public/impl.ts index ce7490b..910b237 100644 --- a/src/modules/public/impl.ts +++ b/src/modules/public/impl.ts @@ -1,11 +1,70 @@ +import { axiosRequest } from '../../lib/axios'; +import { ISO8601, Market, MarketStatisticDay } from '../../types'; import { Public, } from './types'; export default class PublicImpl implements Public { - getMarkets(): void {} - getOrderBook(): void {} - getStats(): void {} - getTrades(): void {} - getHistoricalFunding(): void {} + host: string; + + constructor(host: string) { + this.host = host; + } + + getMarkets(market?: Market): Promise<{}> { + let uri: string = 'v3/markets'; + + if (market) { + uri = uri.concat(`?market=${market}`); + } + + return this.sendPublicGetRequest(uri); + } + + getOrderBook(market: Market): Promise<{}> { + return this.sendPublicGetRequest(`v3/orderbook/${market}`); + } + + getStats({ + market, + days, + }: { + market: Market, + days?: MarketStatisticDay, + }): Promise<{}> { + let uri: string = `v3/stats/${market}`; + + if (days) { + uri = uri.concat(`?days=${days}`); + } + + return this.sendPublicGetRequest(uri); + } + + getTrades({ + market, + startingBeforeOrAt, + }: { + market: Market, + startingBeforeOrAt?: ISO8601, + }): Promise<{}> { + let uri: string = `v3/stats/${market}`; + + if (startingBeforeOrAt) { + uri = uri.concat(`?startingBeforeOrAt=${startingBeforeOrAt}`); + } + + return this.sendPublicGetRequest(uri); + } + + getHistoricalFunding(market: Market): Promise<{}> { + return this.sendPublicGetRequest(`v3/historical-funding/${market}`); + } + + private sendPublicGetRequest(requestPath: string): Promise<{}> { + return axiosRequest({ + method: 'GET', + url: `${this.host}/${requestPath}`, + }); + } } diff --git a/src/modules/public/types.ts b/src/modules/public/types.ts index f7832bd..0ccb64a 100644 --- a/src/modules/public/types.ts +++ b/src/modules/public/types.ts @@ -1,7 +1,17 @@ +import { + ISO8601, + Market, + MarketStatisticDay, +} from '../../types'; + export interface Public { - getMarkets(): void; - getOrderBook(): void; - getStats(): void; - getTrades(): void; - getHistoricalFunding(): void; + readonly host: string; + + getMarkets(market?: Market): Promise<{}> ; + getOrderBook(market: Market): Promise<{}> ; + getStats({ market, days }: { market: Market, days?: MarketStatisticDay }): Promise<{}> ; + getTrades( + { market, startingBeforeOrAt }: { market: Market, startingBeforeOrAt?: ISO8601 }, + ): Promise<{}> ; + getHistoricalFunding(market: Market): Promise<{}> ; } diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..1915d3e --- /dev/null +++ b/src/types.ts @@ -0,0 +1,13 @@ +export type ISO8601 = string; + +export enum Market { + BTC_USD = 'BTC-USD', + ETH_USD = 'ETH-USD', + LINK_USD = 'LINK-USD', +} + +export enum MarketStatisticDay { + ONE = '1', + SEVEN = '7', + THIRTY = '30', +} From 16d7b1a9dd680bcad99f1a3746c5272b83267c95 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Tue, 20 Oct 2020 17:23:10 -0700 Subject: [PATCH 007/180] v0.0.2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 533a565..43d99e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.1", + "version": "0.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 010f4a8..1458797 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.1", + "version": "0.0.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { From e1c205cccc9f775734e71819fa6f0509c8842c6f Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Tue, 20 Oct 2020 21:39:55 -0700 Subject: [PATCH 008/180] Add support for some private endpoints (#4) * Add support for some private endpoints * Comment out broken code * Fix lint --- package-lock.json | 71 +++------- package.json | 8 +- src/dydx-client.ts | 33 +++-- src/index.ts | 1 + src/lib/db.ts | 7 + src/modules/eth/impl.ts | 6 +- src/modules/eth/index.ts | 3 +- src/modules/eth/not-supported.ts | 4 +- src/modules/eth/types.ts | 2 - src/modules/keys/impl.ts | 6 +- src/modules/keys/index.ts | 3 +- src/modules/keys/not-supported.ts | 4 +- src/modules/keys/types.ts | 5 - src/modules/onboarding/impl.ts | 6 +- src/modules/onboarding/index.ts | 3 +- src/modules/onboarding/not-supported.ts | 4 +- src/modules/onboarding/types.ts | 3 - src/modules/private/impl.ts | 180 +++++++++++++++++++++--- src/modules/private/index.ts | 3 +- src/modules/private/not-supported.ts | 6 +- src/modules/private/types.ts | 18 --- src/modules/public/impl.ts | 24 +++- src/modules/public/index.ts | 3 +- src/modules/public/types.ts | 17 --- src/types.ts | 69 ++++++++- 25 files changed, 308 insertions(+), 181 deletions(-) create mode 100644 src/lib/db.ts delete mode 100644 src/modules/eth/types.ts delete mode 100644 src/modules/keys/types.ts delete mode 100644 src/modules/onboarding/types.ts delete mode 100644 src/modules/private/types.ts delete mode 100644 src/modules/public/types.ts diff --git a/package-lock.json b/package-lock.json index 43d99e8..f554a3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.2", + "version": "0.0.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -907,12 +907,6 @@ "@types/node": "*" } }, - "@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", - "dev": true - }, "@types/elliptic": { "version": "6.4.12", "resolved": "https://registry.npmjs.org/@types/elliptic/-/elliptic-6.4.12.tgz", @@ -1013,40 +1007,6 @@ "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", "dev": true }, - "@types/request": { - "version": "2.48.5", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz", - "integrity": "sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==", - "dev": true, - "requires": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - }, - "dependencies": { - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - } - } - }, - "@types/request-promise-native": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@types/request-promise-native/-/request-promise-native-1.0.17.tgz", - "integrity": "sha512-05/d0WbmuwjtGMYEdHIBZ0tqMJJQ2AD9LG2F6rKNBGX1SSFR27XveajH//2N/XYtual8T9Axwl+4v7oBtPUZqg==", - "dev": true, - "requires": { - "@types/request": "*" - } - }, "@types/secp256k1": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz", @@ -1061,10 +1021,10 @@ "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, - "@types/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==", + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", "dev": true }, "@types/yargs": { @@ -3036,6 +2996,13 @@ "scrypt-js": "^3.0.1", "utf8": "^3.0.0", "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } } }, "ethjs-util": { @@ -6047,6 +6014,14 @@ "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "request-promise-core": { @@ -7363,9 +7338,9 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==" }, "v8-compile-cache": { "version": "2.1.1", diff --git a/package.json b/package.json index 1458797..8ff11b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.2", + "version": "0.0.3", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,9 +26,11 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-lib": "^0.2.3", - "axios": "^0.19.0" + "axios": "^0.19.0", + "uuid": "^8.3.1" }, "devDependencies": { - "@dydxprotocol/node-service-base-dev": "0.0.10" + "@dydxprotocol/node-service-base-dev": "0.0.10", + "@types/uuid": "^8.3.0" } } diff --git a/src/dydx-client.ts b/src/dydx-client.ts index ed18154..e332557 100644 --- a/src/dydx-client.ts +++ b/src/dydx-client.ts @@ -4,27 +4,22 @@ import { import { Eth, - EthImpl, ethNotSupported, } from './modules/eth'; import { Keys, - KeysImpl, keysNotSupported, } from './modules/keys'; import { Onboarding, - OnboardingImpl, onboardingNotSupported, } from './modules/onboarding'; import { Private, - PrivateImpl, privateNotSupported, } from './modules/private'; import { Public, - PublicImpl, } from './modules/public'; export interface ClientOptions { @@ -59,14 +54,14 @@ export default class DydxClient { this.web3Proivder = options.web3Proivder; // Modules. - this._public = new PublicImpl(host); + this._public = new Public(host); } /** * Get the public module, used for interacting with public endpoints. */ get public(): Public { - return this.public; + return this._public; } /** @@ -75,9 +70,14 @@ export default class DydxClient { get private(): Private { if (!this._private) { if (this.apiPrivateKey) { - this._private = new PrivateImpl(this.apiPrivateKey, this.starkPrivateKey); + this._private = new Private( + this.host, + this.apiPrivateKey, + this.starkPrivateKey, + ); + } else { + return privateNotSupported; } - return privateNotSupported; } return this._private; } @@ -88,9 +88,10 @@ export default class DydxClient { get keys(): Keys { if (!this._keys) { if (this.web3Proivder) { - this._keys = new KeysImpl(this.web3Proivder); + this._keys = new Keys(this.web3Proivder); + } else { + return keysNotSupported; } - return keysNotSupported; } return this._keys; } @@ -101,9 +102,10 @@ export default class DydxClient { get onboarding(): Onboarding { if (!this._onboarding) { if (this.web3Proivder) { - this._onboarding = new OnboardingImpl(this.web3Proivder); + this._onboarding = new Onboarding(this.web3Proivder); + } else { + return onboardingNotSupported; } - return onboardingNotSupported; } return this._onboarding; } @@ -114,9 +116,10 @@ export default class DydxClient { get eth() { if (!this._eth) { if (this.web3Proivder) { - this._eth = new EthImpl(this.web3Proivder); + this._eth = new Eth(this.web3Proivder); + } else { + return ethNotSupported; } - return ethNotSupported; } return this._eth; } diff --git a/src/index.ts b/src/index.ts index 0536180..c06462d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,2 @@ export { default as DydxClient } from './dydx-client'; +export * from './types'; diff --git a/src/lib/db.ts b/src/lib/db.ts new file mode 100644 index 0000000..ca84147 --- /dev/null +++ b/src/lib/db.ts @@ -0,0 +1,7 @@ +import * as uuid from 'uuid'; + +export function getUserId( + address: string, +): string { + return uuid.v5(Buffer.from(address), '0f9da948-a6fb-4c45-9edc-4685c3f3317d'); +} diff --git a/src/modules/eth/impl.ts b/src/modules/eth/impl.ts index 6a8c107..0ecdb01 100644 --- a/src/modules/eth/impl.ts +++ b/src/modules/eth/impl.ts @@ -1,8 +1,4 @@ -import { - Eth, -} from './types'; - -export default class EthImpl implements Eth { +export default class Eth { readonly web3Proivder: {}; constructor( diff --git a/src/modules/eth/index.ts b/src/modules/eth/index.ts index 5ec53da..c661bb4 100644 --- a/src/modules/eth/index.ts +++ b/src/modules/eth/index.ts @@ -1,3 +1,2 @@ -export { default as EthImpl } from './impl'; +export { default as Eth } from './impl'; export { default as ethNotSupported } from './not-supported'; -export * from './types'; diff --git a/src/modules/eth/not-supported.ts b/src/modules/eth/not-supported.ts index a8fc60b..25a9f84 100644 --- a/src/modules/eth/not-supported.ts +++ b/src/modules/eth/not-supported.ts @@ -1,6 +1,4 @@ -import { - Eth, -} from './types'; +import Eth from './impl'; const handler = { get() { diff --git a/src/modules/eth/types.ts b/src/modules/eth/types.ts deleted file mode 100644 index 571462d..0000000 --- a/src/modules/eth/types.ts +++ /dev/null @@ -1,2 +0,0 @@ -export interface Eth { -} diff --git a/src/modules/keys/impl.ts b/src/modules/keys/impl.ts index c2dae2c..5b0087b 100644 --- a/src/modules/keys/impl.ts +++ b/src/modules/keys/impl.ts @@ -1,8 +1,4 @@ -import { - Keys, -} from './types'; - -export default class KeysImpl implements Keys { +export default class Keys { readonly web3Proivder: {}; constructor( diff --git a/src/modules/keys/index.ts b/src/modules/keys/index.ts index 0a6b5da..3e61039 100644 --- a/src/modules/keys/index.ts +++ b/src/modules/keys/index.ts @@ -1,3 +1,2 @@ -export { default as KeysImpl } from './impl'; +export { default as Keys } from './impl'; export { default as keysNotSupported } from './not-supported'; -export * from './types'; diff --git a/src/modules/keys/not-supported.ts b/src/modules/keys/not-supported.ts index 269dd52..3beaeb0 100644 --- a/src/modules/keys/not-supported.ts +++ b/src/modules/keys/not-supported.ts @@ -1,6 +1,4 @@ -import { - Keys, -} from './types'; +import Keys from './impl'; const handler = { get() { diff --git a/src/modules/keys/types.ts b/src/modules/keys/types.ts deleted file mode 100644 index e4c6c0e..0000000 --- a/src/modules/keys/types.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface Keys { - getApiKeys(): void; - registerApiKey(): void; - deleteApiKey(): void; -} diff --git a/src/modules/onboarding/impl.ts b/src/modules/onboarding/impl.ts index 7c161cd..aed39d2 100644 --- a/src/modules/onboarding/impl.ts +++ b/src/modules/onboarding/impl.ts @@ -1,8 +1,4 @@ -import { - Onboarding, -} from './types'; - -export default class OnboardingImpl implements Onboarding { +export default class Onboarding { readonly web3Proivder: {}; constructor( diff --git a/src/modules/onboarding/index.ts b/src/modules/onboarding/index.ts index 5ad7a04..8105438 100644 --- a/src/modules/onboarding/index.ts +++ b/src/modules/onboarding/index.ts @@ -1,3 +1,2 @@ -export { default as OnboardingImpl } from './impl'; +export { default as Onboarding } from './impl'; export { default as onboardingNotSupported } from './not-supported'; -export * from './types'; diff --git a/src/modules/onboarding/not-supported.ts b/src/modules/onboarding/not-supported.ts index 2741281..99814a4 100644 --- a/src/modules/onboarding/not-supported.ts +++ b/src/modules/onboarding/not-supported.ts @@ -1,6 +1,4 @@ -import { - Onboarding, -} from './types'; +import Onboarding from './impl'; const handler = { get() { diff --git a/src/modules/onboarding/types.ts b/src/modules/onboarding/types.ts deleted file mode 100644 index aef4f69..0000000 --- a/src/modules/onboarding/types.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface Onboarding { - createUser(): void; -} diff --git a/src/modules/private/impl.ts b/src/modules/private/impl.ts index 04c9ccf..dd850e4 100644 --- a/src/modules/private/impl.ts +++ b/src/modules/private/impl.ts @@ -1,37 +1,171 @@ +/* eslint-disable @typescript-eslint/no-empty-function */ import { KeyPair, + Order as StarkExOrder, + asEcKeyPair, + asSimpleKeyPair, } from '@dydxprotocol/starkex-lib'; import { - Private, -} from './types'; + RequestMethod, + axiosRequest, +} from '../../lib/axios'; +import { getUserId } from '../../lib/db'; +import { + ApiOrder, + PartialBy, +} from '../../types'; -export default class PrivateImpl implements Private { - readonly apiPrivateKey: string | KeyPair; - readonly starkPrivateKey?: string | KeyPair; +export default class Private { + readonly host: string; + readonly apiKeyPair: KeyPair; + readonly starkKeyPair?: KeyPair; constructor( + host: string, apiPrivateKey: string | KeyPair, starkPrivateKey?: string | KeyPair, ) { - this.apiPrivateKey = apiPrivateKey; - this.starkPrivateKey = starkPrivateKey; + this.host = host; + this.apiKeyPair = asSimpleKeyPair(asEcKeyPair(apiPrivateKey)); + if (starkPrivateKey) { + this.starkKeyPair = asSimpleKeyPair(asEcKeyPair(starkPrivateKey)); + } + } + + protected async post( + endpoint: string, + data: {}, + headers: {} = {}, + ): Promise<{}> { + // TODO: Sign with API key. + return axiosRequest({ + url: `${this.host}/v3/${endpoint}`, + method: RequestMethod.POST, + data, + headers, + }); + } + + async getUser(): Promise {} + + // TODO: Remove. + async createUser( + ethereumAddress: string, + ): Promise<{}> { + return this.post( + 'users', + {}, + { + signature: 'mock-signature', + ethereumAddress, + expiration: new Date().toISOString(), + }, + ); + } + + async updateUser(): Promise {} + + async createAccount( + ethereumAddress: string, + starkKey: string, + ): Promise<{}> { + const userId = getUserId(ethereumAddress); + return this.post( + 'accounts', + { + starkKey, + }, + { + signature: 'mock-signature', + userId, + expiration: new Date().toISOString(), + }, + ); } - getUser(): void {} - updateUser(): void {} - createAccount(): void {} - getAccounts(): void {} - getPositions(): void {} - getOrders(): void {} - getOrder(): void {} - createOrder(): void {} - deleteOrder(): void {} - cancelOrder(): void {} - cancelAllOrders(): void {} - getFills(): void {} - getTransfers(): void {} - createWithdrawal(): void {} - createDeposit(): void {} - getFundingPayments(): void {} + async getAccounts(): Promise {} + async getPositions(): Promise {} + async getOrders(): Promise {} + async getOrder(): Promise {} + + async createOrder( + params: PartialBy, + positionId: string, + ethereumAddress: string, // TODO: Don't require this. + ): Promise<{}> { + // TODO: Allow clientId to be a string. + // const clientId = params.clientId || Math.random().toString(36).slice(2); + // + // Have to strip leading zeroes since clientId is being mis-processed as a number. + const clientId = params.clientId || Math.random().toString().slice(2).replace(/^0+/, ''); + + let signature: string | undefined = params.signature; + if (!signature) { + if (!this.starkKeyPair) { + throw new Error('Order is not signed and client was not initialized with starkPrivateKey'); + } + const orderToSign = { + ...params, + clientId, + positionId, + starkKey: this.starkKeyPair.publicKey, + expiresAt: params.expiration, + }; + const starkOrder = StarkExOrder.fromInternal(orderToSign); + signature = starkOrder.sign(this.starkKeyPair); + } + + const order: ApiOrder = { + ...params, + clientId, + signature, + }; + + return this.post( + 'orders', + order, + { + owner: ethereumAddress, + }, + ); + } + + async deleteOrder(): Promise {} + async cancelOrder(): Promise {} + async cancelAllOrders(): Promise {} + async getFills(): Promise {} + async getTransfers(): Promise {} + + // TODO: Fix. See createOrder above. + // async createWithdrawal( + // params: PartialBy, + // ): Promise<{}> { + // const possiblyUnsignedWithdrawal: PartialBy = { + // ...params, + // clientId: params.clientId || Math.random().toString().slice(2), + // // TODO: Allow clientId to be a string. + // // clientId: params.clientId || Math.random().toString(36).slice(2), + // }; + // let signature: string | undefined = params.signature; + // if (!signature) { + // if (!this.starkKeyPair) { + // throw new Error( + // 'Withdrawal is not signed and client was not initialized with starkPrivateKey', + // ); + // } + // signature = StarkExWithdrawal.fromInternal({ + // ...possiblyUnsignedWithdrawal, + // expiresAt: params.expiration, + // }).sign(this.starkKeyPair); + // } + // return this.post('withdrawals', { + // ...possiblyUnsignedWithdrawal, + // signature, + // }); + // } + + async createDeposit(): Promise {} + + async getFundingPayments(): Promise {} } diff --git a/src/modules/private/index.ts b/src/modules/private/index.ts index 5f87226..29ab173 100644 --- a/src/modules/private/index.ts +++ b/src/modules/private/index.ts @@ -1,3 +1,2 @@ -export { default as PrivateImpl } from './impl'; +export { default as Private } from './impl'; export { default as privateNotSupported } from './not-supported'; -export * from './types'; diff --git a/src/modules/private/not-supported.ts b/src/modules/private/not-supported.ts index bfa7273..fd32f11 100644 --- a/src/modules/private/not-supported.ts +++ b/src/modules/private/not-supported.ts @@ -1,10 +1,8 @@ -import { - Private, -} from './types'; +import Private from './impl'; const handler = { get() { - throw new Error('Private is not supported'); + throw new Error('Private endpoints not supported since apiPrivateKey was not provided'); }, }; diff --git a/src/modules/private/types.ts b/src/modules/private/types.ts deleted file mode 100644 index 94908a5..0000000 --- a/src/modules/private/types.ts +++ /dev/null @@ -1,18 +0,0 @@ -export interface Private { - getUser(): void; - updateUser(): void; - createAccount(): void; - getAccounts(): void; - getPositions(): void; - getOrders(): void; - getOrder(): void; - createOrder(): void; - deleteOrder(): void; - cancelOrder(): void; - cancelAllOrders(): void; - getFills(): void; - getTransfers(): void; - createWithdrawal(): void; - createDeposit(): void; - getFundingPayments(): void; -} diff --git a/src/modules/public/impl.ts b/src/modules/public/impl.ts index 910b237..9ebebbc 100644 --- a/src/modules/public/impl.ts +++ b/src/modules/public/impl.ts @@ -1,16 +1,26 @@ import { axiosRequest } from '../../lib/axios'; import { ISO8601, Market, MarketStatisticDay } from '../../types'; -import { - Public, -} from './types'; -export default class PublicImpl implements Public { +export default class Public { host: string; constructor(host: string) { this.host = host; } + getAccount( + accountId: string, + ethereumAddress: string, // TODO: Should not require this. + ): Promise<{}> { + const uri: string = `v3/accounts/${accountId}`; + return this.sendPublicGetRequest( + uri, + { + owner: ethereumAddress, + }, + ); + } + getMarkets(market?: Market): Promise<{}> { let uri: string = 'v3/markets'; @@ -61,9 +71,13 @@ export default class PublicImpl implements Public { return this.sendPublicGetRequest(`v3/historical-funding/${market}`); } - private sendPublicGetRequest(requestPath: string): Promise<{}> { + private sendPublicGetRequest( + requestPath: string, + headers: {} = {}, + ): Promise<{}> { return axiosRequest({ method: 'GET', + headers, url: `${this.host}/${requestPath}`, }); } diff --git a/src/modules/public/index.ts b/src/modules/public/index.ts index 3b998a4..d56182f 100644 --- a/src/modules/public/index.ts +++ b/src/modules/public/index.ts @@ -1,2 +1 @@ -export { default as PublicImpl } from './impl'; -export * from './types'; +export { default as Public } from './impl'; diff --git a/src/modules/public/types.ts b/src/modules/public/types.ts deleted file mode 100644 index 0ccb64a..0000000 --- a/src/modules/public/types.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { - ISO8601, - Market, - MarketStatisticDay, -} from '../../types'; - -export interface Public { - readonly host: string; - - getMarkets(market?: Market): Promise<{}> ; - getOrderBook(market: Market): Promise<{}> ; - getStats({ market, days }: { market: Market, days?: MarketStatisticDay }): Promise<{}> ; - getTrades( - { market, startingBeforeOrAt }: { market: Market, startingBeforeOrAt?: ISO8601 }, - ): Promise<{}> ; - getHistoricalFunding(market: Market): Promise<{}> ; -} diff --git a/src/types.ts b/src/types.ts index 1915d3e..b1172d6 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,9 +1,24 @@ +import { + OrderSide, + PerpetualMarket, +} from '@dydxprotocol/starkex-lib'; + +export { OrderSide } from '@dydxprotocol/starkex-lib'; + export type ISO8601 = string; -export enum Market { - BTC_USD = 'BTC-USD', - ETH_USD = 'ETH-USD', - LINK_USD = 'LINK-USD', +// ============ Enums ============ + +export type Market = PerpetualMarket; +export const Market = PerpetualMarket; + +export enum Asset { + ETH = 'ETH', + LINK = 'LINK', + BTC = 'BTC', + USDC = 'USDC', + USDT = 'USDT', + USD = 'USD', } export enum MarketStatisticDay { @@ -11,3 +26,49 @@ export enum MarketStatisticDay { SEVEN = '7', THIRTY = '30', } + +export enum OrderType { + LIMIT = 'LIMIT', + STOP = 'STOP', + TRAILING_STOP = 'TRAILING_STOP', + TAKE_PROFIT = 'TAKE_PROFIT', +} + +export enum TimeInForce { + GTT = 'GTT', + FOK = 'FOK', + IOC = 'IOC', +} + +// ============ API Request Types ============ + +interface ApiStarkwareSigned { + signature: string; + expiration: string; +} + +export interface ApiOrder extends ApiStarkwareSigned { + accountId: string; + market: PerpetualMarket; + side: OrderSide; + type: OrderType; + size: string; + price: string; + clientId: string; + timeInForce: TimeInForce; + postOnly: boolean; + limitFee: string; +} + +export interface ApiWithdrawal extends ApiStarkwareSigned { + amount: Asset, + asset: Asset, + toAddress: string, + clientId: string; + positionId: string; + debitAmount: string; +} + +// ============ Utility Types ============ + +export type PartialBy = Omit & Partial>; From e27865eb9367b7681c6e1ca03cddee6d00f25d0c Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Fri, 23 Oct 2020 12:36:35 -0700 Subject: [PATCH 009/180] branch next: Updates for librarian with auth (#7) * cleanup existing endpoints to meet undeployed Librarian and actually sign (#5) * cleanup existing endpoints * fix * ks1 * Add remaining private endpoints except withdrawal (#6) * cleanup existing endpoints * fix * additional endpoints * ks1 * Fix typo * Fixes for latest librarian * v0.0.4 * Fix lint * Fixes Co-authored-by: samweinberg23 --- package-lock.json | 8 +- package.json | 4 +- src/dydx-client.ts | 18 +-- src/lib/axios/types.ts | 4 +- src/lib/db.ts | 13 ++ src/modules/eth/impl.ts | 6 +- src/modules/keys/impl.ts | 39 +++++- src/modules/onboarding/impl.ts | 6 +- src/modules/private/impl.ts | 248 ++++++++++++++++++++++++++++----- src/modules/public/impl.ts | 4 +- src/types.ts | 20 ++- 11 files changed, 304 insertions(+), 66 deletions(-) diff --git a/package-lock.json b/package-lock.json index f554a3d..b7af795 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.3", + "version": "0.0.4", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -464,9 +464,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.2.3.tgz", - "integrity": "sha512-Xxlz3uuI/7PFBeQ4t41MjBn9qaXWznSMYmW2MBVxaQo8MthXhOiKxsOzVY9KErA+uPBGOwrtZ36ml5NM0l1ihA==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.2.4.tgz", + "integrity": "sha512-/uQhO3sgnGHhlScm8VRvJGJZybPDuXxQOHMtzf1/g7S9kgsfuffm8I/5NTWpjRwRkKoD1K4G0Nh6INyrjyQE3Q==", "requires": { "@types/big.js": "^4.0.5", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index 8ff11b7..2fa75c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.3", + "version": "0.0.4", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -25,7 +25,7 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-lib": "^0.2.3", + "@dydxprotocol/starkex-lib": "^0.2.4", "axios": "^0.19.0", "uuid": "^8.3.1" }, diff --git a/src/dydx-client.ts b/src/dydx-client.ts index e332557..5e23bdc 100644 --- a/src/dydx-client.ts +++ b/src/dydx-client.ts @@ -26,7 +26,7 @@ export interface ClientOptions { apiTimeout?: number; apiPrivateKey?: string | KeyPair; starkPrivateKey?: string | KeyPair; - web3Proivder?: {}; + web3Provider?: {}; } export default class DydxClient { @@ -34,7 +34,7 @@ export default class DydxClient { readonly apiTimeout?: number; readonly apiPrivateKey?: string | KeyPair; readonly starkPrivateKey?: string | KeyPair; - readonly web3Proivder?: {}; + readonly web3Provider?: {}; // Modules. Except for `public`, these are created on-demand. private readonly _public: Public; @@ -51,7 +51,7 @@ export default class DydxClient { this.apiTimeout = options.apiTimeout; this.apiPrivateKey = options.apiPrivateKey; this.starkPrivateKey = options.starkPrivateKey; - this.web3Proivder = options.web3Proivder; + this.web3Provider = options.web3Provider; // Modules. this._public = new Public(host); @@ -87,8 +87,8 @@ export default class DydxClient { */ get keys(): Keys { if (!this._keys) { - if (this.web3Proivder) { - this._keys = new Keys(this.web3Proivder); + if (this.web3Provider) { + this._keys = new Keys(this.host, this.web3Provider); } else { return keysNotSupported; } @@ -101,8 +101,8 @@ export default class DydxClient { */ get onboarding(): Onboarding { if (!this._onboarding) { - if (this.web3Proivder) { - this._onboarding = new Onboarding(this.web3Proivder); + if (this.web3Provider) { + this._onboarding = new Onboarding(this.web3Provider); } else { return onboardingNotSupported; } @@ -115,8 +115,8 @@ export default class DydxClient { */ get eth() { if (!this._eth) { - if (this.web3Proivder) { - this._eth = new Eth(this.web3Proivder); + if (this.web3Provider) { + this._eth = new Eth(this.web3Provider); } else { return ethNotSupported; } diff --git a/src/lib/axios/types.ts b/src/lib/axios/types.ts index cf4cb4e..840a320 100644 --- a/src/lib/axios/types.ts +++ b/src/lib/axios/types.ts @@ -1,6 +1,6 @@ export enum RequestMethod { - DELETE = 'DELETE', - GET = 'GET', POST = 'POST', PUT = 'PUT', + GET = 'GET', + DELETE = 'DELETE', } diff --git a/src/lib/db.ts b/src/lib/db.ts index ca84147..a312381 100644 --- a/src/lib/db.ts +++ b/src/lib/db.ts @@ -5,3 +5,16 @@ export function getUserId( ): string { return uuid.v5(Buffer.from(address), '0f9da948-a6fb-4c45-9edc-4685c3f3317d'); } + +export function getAccountId({ + address, + accountNumber = '0', +}: { + address: string, + accountNumber?: string, +}) { + return uuid.v5( + Buffer.from(`${getUserId(address)}${accountNumber}`), + '0f9da948-a6fb-4c45-9edc-4685c3f3317d', + ); +} diff --git a/src/modules/eth/impl.ts b/src/modules/eth/impl.ts index 0ecdb01..9d70d39 100644 --- a/src/modules/eth/impl.ts +++ b/src/modules/eth/impl.ts @@ -1,9 +1,9 @@ export default class Eth { - readonly web3Proivder: {}; + readonly web3Provider: {}; constructor( - web3Proivder: {}, + web3Provider: {}, ) { - this.web3Proivder = web3Proivder; + this.web3Provider = web3Provider; } } diff --git a/src/modules/keys/impl.ts b/src/modules/keys/impl.ts index 5b0087b..1146f77 100644 --- a/src/modules/keys/impl.ts +++ b/src/modules/keys/impl.ts @@ -1,13 +1,44 @@ +import { + RequestMethod, + axiosRequest, +} from '../../lib/axios'; + export default class Keys { - readonly web3Proivder: {}; + readonly host: string; + readonly web3Provider: {}; constructor( - web3Proivder: {}, + host: string, + web3Provider: {}, ) { - this.web3Proivder = web3Proivder; + this.host = host; + this.web3Provider = web3Provider; + } + + protected async post( + endpoint: string, + data: {}, + ethereumAddress: string, + ): Promise<{}> { + const url: string = `/v3/${endpoint}`; + return axiosRequest({ + url: `${this.host}${url}`, + method: RequestMethod.POST, + data, + headers: { + 'DYDX-ETHEREUM-ADDRESS': ethereumAddress, + }, + }); } getApiKeys(): void {} - registerApiKey(): void {} + + async registerApiKey( + apiKey: string, + ethereumAddress: string, + ): Promise<{}> { + return this.post('api-keys', { apiKey }, ethereumAddress); + } + deleteApiKey(): void {} } diff --git a/src/modules/onboarding/impl.ts b/src/modules/onboarding/impl.ts index aed39d2..c55159b 100644 --- a/src/modules/onboarding/impl.ts +++ b/src/modules/onboarding/impl.ts @@ -1,10 +1,10 @@ export default class Onboarding { - readonly web3Proivder: {}; + readonly web3Provider: {}; constructor( - web3Proivder: {}, + web3Provider: {}, ) { - this.web3Proivder = web3Proivder; + this.web3Provider = web3Provider; } createUser(): void { } diff --git a/src/modules/private/impl.ts b/src/modules/private/impl.ts index dd850e4..cae6259 100644 --- a/src/modules/private/impl.ts +++ b/src/modules/private/impl.ts @@ -4,18 +4,36 @@ import { Order as StarkExOrder, asEcKeyPair, asSimpleKeyPair, + ApiMethod, + ApiRequest, + OrderSide, + OrderType, + Asset, } from '@dydxprotocol/starkex-lib'; import { RequestMethod, axiosRequest, } from '../../lib/axios'; -import { getUserId } from '../../lib/db'; +import { getAccountId } from '../../lib/db'; import { + AccountAction, ApiOrder, + ISO8601, + Market, + OrderStatus, PartialBy, + PositionStatus, } from '../../types'; +// TODO: Figure out if we can get rid of this. +const METHOD_ENUM_MAP: Partial> = { + [RequestMethod.DELETE]: ApiMethod.DELETE, + [RequestMethod.GET]: ApiMethod.GET, + [RequestMethod.POST]: ApiMethod.POST, + // [RequestMethod.PUT]: ApiMethod.PUT, +}; + export default class Private { readonly host: string; readonly apiKeyPair: KeyPair; @@ -33,66 +51,135 @@ export default class Private { } } - protected async post( + // ============ Request Helpers ============ + + protected async request( endpoint: string, - data: {}, - headers: {} = {}, + method: RequestMethod, + data?: {}, ): Promise<{}> { - // TODO: Sign with API key. + const requestPath = `/v3/${endpoint}`; + const expiresAt: ISO8601 = new Date().toISOString(); + const headers = { + 'DYDX-SIGNATURE': this.generateSignature({ + requestPath, + method, + expiresAt, + data, + }), + 'DYDX-API-KEY': this.apiKeyPair.publicKey, + 'DYDX-TIMESTAMP': expiresAt, + }; return axiosRequest({ - url: `${this.host}/v3/${endpoint}`, - method: RequestMethod.POST, + url: `${this.host}${requestPath}`, + method, data, headers, }); } - async getUser(): Promise {} + protected async get( + endpoint: string, + ): Promise<{}> { + return this.request(endpoint, RequestMethod.GET); + } + + protected async post( + endpoint: string, + data: {}, + ): Promise<{}> { + return this.request(endpoint, RequestMethod.POST, data); + } + + protected async delete( + endpoint: string, + ): Promise<{}> { + return this.request(endpoint, RequestMethod.DELETE); + } + + // ============ Requests ============ + + async getUser(): Promise<{}> { + return this.get( + 'users', + ); + } // TODO: Remove. async createUser( - ethereumAddress: string, + userData?: {}, ): Promise<{}> { return this.post( 'users', - {}, { - signature: 'mock-signature', - ethereumAddress, - expiration: new Date().toISOString(), + userData, }, ); } - async updateUser(): Promise {} + async updateUser(): Promise {} // NOT in Librarian yet async createAccount( - ethereumAddress: string, starkKey: string, ): Promise<{}> { - const userId = getUserId(ethereumAddress); return this.post( 'accounts', { starkKey, }, - { - signature: 'mock-signature', - userId, - expiration: new Date().toISOString(), - }, ); } - async getAccounts(): Promise {} - async getPositions(): Promise {} - async getOrders(): Promise {} - async getOrder(): Promise {} + async getAccount(ethereumAddress: string): Promise<{}> { + return this.get( + `accounts/${getAccountId({ address: ethereumAddress })}`, + ); + } + + async getPositions( + params: { + market?: Market, + status?: PositionStatus, + limit?: number, + createdBeforeOrAt?: ISO8601, + }, + ): Promise<{}> { + return this.get( + this.generateQueryPath('positions', params), + ); + } + + async getOrders( + params: { + market?: Market, + status?: OrderStatus, + side?: OrderSide, + type?: OrderType, + limit?: number, + createdBeforeOrAt?: ISO8601, + }, + ): Promise<{}> { + return this.get( + this.generateQueryPath('orders', params), + ); + } + + async getOrderById(orderId: string): Promise<{}> { + return this.get( + `orders/${orderId}`, + ); + } + + async getOrderByClientId(clientId: string): Promise<{}> { + return this.get( + `orders/client/${clientId}`, + ); + } async createOrder( params: PartialBy, positionId: string, - ethereumAddress: string, // TODO: Don't require this. + ethereumAddress: string, ): Promise<{}> { // TODO: Allow clientId to be a string. // const clientId = params.clientId || Math.random().toString(36).slice(2); @@ -111,6 +198,7 @@ export default class Private { positionId, starkKey: this.starkKeyPair.publicKey, expiresAt: params.expiration, + accountId: getAccountId({ address: ethereumAddress }), }; const starkOrder = StarkExOrder.fromInternal(orderToSign); signature = starkOrder.sign(this.starkKeyPair); @@ -125,17 +213,45 @@ export default class Private { return this.post( 'orders', order, - { - owner: ethereumAddress, - }, ); } - async deleteOrder(): Promise {} - async cancelOrder(): Promise {} - async cancelAllOrders(): Promise {} - async getFills(): Promise {} - async getTransfers(): Promise {} + async deleteOrder(orderId: string): Promise<{}> { + return this.delete( + `orders/${orderId}`, + ); + } + + async deleteAllOrders(params: { market?: Market }): Promise<{}> { + return this.delete( + this.generateQueryPath('orders', params), + ); + } + + async getFills( + params: { + market?: Market, + orderId?: string, + limit?: number, + createdBeforeOrAt?: ISO8601, + }, + ): Promise<{}> { + return this.get( + this.generateQueryPath('fills', params), + ); + } + + async getTransfers( + params: { + type?: AccountAction, + limit?: number, + createdBeforeOrAt?: ISO8601, + }, + ): Promise<{}> { + return this.get( + this.generateQueryPath('transfers', params), + ); + } // TODO: Fix. See createOrder above. // async createWithdrawal( @@ -165,7 +281,67 @@ export default class Private { // }); // } - async createDeposit(): Promise {} + async createDeposit( + params: { + amount: string, + asset: Asset, + fromAddress: string, + }, + ): Promise<{}> { + return this.post( + 'deposits', + params, + ); + } + + async getFundingPayments( + params: { + market?: Market, + limit?: number, + effectiveBeforeOrAt?: ISO8601, + }, + ): Promise<{}> { + return this.get( + this.generateQueryPath('funding', params), + ); + } + + // ============ Request Generation Helpers ============ - async getFundingPayments(): Promise {} + private generateSignature({ + requestPath, + method, + expiresAt, + data, + }: { + requestPath: string, + method: RequestMethod, + expiresAt: ISO8601, + data?: {}, + }): string { + const apiMethod = METHOD_ENUM_MAP[method]; + // TODO: Shouldn't need this. + if (!apiMethod) { + throw new Error(`Unsupported method: ${method}`); + } + return ApiRequest.fromInternal({ + body: data ? JSON.stringify(data) : '', + requestPath, + method: apiMethod, + publicKey: this.apiKeyPair.publicKey, + expiresAt, + }).sign(this.apiKeyPair.privateKey); + } + + private generateQueryPath(url: string, params: {}): string { + const entries = Object.entries(params); + if (!entries.length) { + return url; + } + + const paramsString = entries.map( + (kv) => `${kv[0]}=${kv[1]}`, + ).join('&'); + return `${url}?${paramsString}`; + } } diff --git a/src/modules/public/impl.ts b/src/modules/public/impl.ts index 9ebebbc..9619c93 100644 --- a/src/modules/public/impl.ts +++ b/src/modules/public/impl.ts @@ -2,7 +2,7 @@ import { axiosRequest } from '../../lib/axios'; import { ISO8601, Market, MarketStatisticDay } from '../../types'; export default class Public { - host: string; + readonly host: string; constructor(host: string) { this.host = host; @@ -58,7 +58,7 @@ export default class Public { market: Market, startingBeforeOrAt?: ISO8601, }): Promise<{}> { - let uri: string = `v3/stats/${market}`; + let uri: string = `v3/trades/${market}`; if (startingBeforeOrAt) { uri = uri.concat(`?startingBeforeOrAt=${startingBeforeOrAt}`); diff --git a/src/types.ts b/src/types.ts index b1172d6..88e361d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -40,6 +40,25 @@ export enum TimeInForce { IOC = 'IOC', } +export enum PositionStatus { + OPEN = 'OPEN', + CLOSED = 'CLOSED', + LIQUIDATED = 'LIQUIDATED', +} + +export enum OrderStatus { + PENDING = 'PENDING', + OPEN = 'OPEN', + FILLED = 'FILLED', + CANCELED = 'CANCELED', + UNTRIGGERED = 'UNTRIGGERED', +} + +export enum AccountAction { + DEPOSIT = 'DEPOSIT', + WITHDRAWAL = 'WITHDRAWAL', +} + // ============ API Request Types ============ interface ApiStarkwareSigned { @@ -48,7 +67,6 @@ interface ApiStarkwareSigned { } export interface ApiOrder extends ApiStarkwareSigned { - accountId: string; market: PerpetualMarket; side: OrderSide; type: OrderType; From bc0715ed6d6c873de4d9384ca67649085eacb2dd Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Mon, 26 Oct 2020 14:27:11 -0700 Subject: [PATCH 010/180] v0.0.5 Make minor fixes for integration tests (#9) * Make minor fixes for integration tests * v0.0.5 --- package-lock.json | 2 +- package.json | 2 +- src/modules/private/impl.ts | 11 ++++++----- src/types.ts | 12 ++---------- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index b7af795..cdc2651 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.4", + "version": "0.0.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2fa75c7..3183e55 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.4", + "version": "0.0.5", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private/impl.ts b/src/modules/private/impl.ts index cae6259..529a8e7 100644 --- a/src/modules/private/impl.ts +++ b/src/modules/private/impl.ts @@ -157,11 +157,11 @@ export default class Private { type?: OrderType, limit?: number, createdBeforeOrAt?: ISO8601, - }, - ): Promise<{}> { + } = {}, + ): Promise<{}[]> { return this.get( this.generateQueryPath('orders', params), - ); + ) as unknown as {}[]; } async getOrderById(orderId: string): Promise<{}> { @@ -216,13 +216,14 @@ export default class Private { ); } - async deleteOrder(orderId: string): Promise<{}> { + async cancelOrder(orderId: string): Promise<{}> { return this.delete( `orders/${orderId}`, ); } - async deleteAllOrders(params: { market?: Market }): Promise<{}> { + async cancelAllOrders(market?: Market): Promise<{}> { + const params = market ? { market } : {}; return this.delete( this.generateQueryPath('orders', params), ); diff --git a/src/types.ts b/src/types.ts index 88e361d..45ca210 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,9 +1,10 @@ import { + Asset, OrderSide, PerpetualMarket, } from '@dydxprotocol/starkex-lib'; -export { OrderSide } from '@dydxprotocol/starkex-lib'; +export { Asset, OrderSide } from '@dydxprotocol/starkex-lib'; export type ISO8601 = string; @@ -12,15 +13,6 @@ export type ISO8601 = string; export type Market = PerpetualMarket; export const Market = PerpetualMarket; -export enum Asset { - ETH = 'ETH', - LINK = 'LINK', - BTC = 'BTC', - USDC = 'USDC', - USDT = 'USDT', - USD = 'USD', -} - export enum MarketStatisticDay { ONE = '1', SEVEN = '7', From cdae38c422f3bfcdc9543fda5a1c3eb51af5da7c Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Mon, 26 Oct 2020 15:09:31 -0700 Subject: [PATCH 011/180] v0.0.6: add create withdrawal [BAC-525] (#8) * add create withdrawal * ks1 * ks2 --- package-lock.json | 2 +- package.json | 2 +- src/modules/private/impl.ts | 71 ++++++++++++++++++++++--------------- src/types.ts | 4 +-- 4 files changed, 46 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index cdc2651..666e804 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.5", + "version": "0.0.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 3183e55..7912c72 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.5", + "version": "0.0.6", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private/impl.ts b/src/modules/private/impl.ts index 529a8e7..f36d37f 100644 --- a/src/modules/private/impl.ts +++ b/src/modules/private/impl.ts @@ -9,6 +9,7 @@ import { OrderSide, OrderType, Asset, + Withdrawal as StarkExWithdrawal, } from '@dydxprotocol/starkex-lib'; import { @@ -19,6 +20,7 @@ import { getAccountId } from '../../lib/db'; import { AccountAction, ApiOrder, + ApiWithdrawal, ISO8601, Market, OrderStatus, @@ -200,7 +202,7 @@ export default class Private { expiresAt: params.expiration, accountId: getAccountId({ address: ethereumAddress }), }; - const starkOrder = StarkExOrder.fromInternal(orderToSign); + const starkOrder: StarkExOrder = StarkExOrder.fromInternal(orderToSign); signature = starkOrder.sign(this.starkKeyPair); } @@ -254,33 +256,46 @@ export default class Private { ); } - // TODO: Fix. See createOrder above. - // async createWithdrawal( - // params: PartialBy, - // ): Promise<{}> { - // const possiblyUnsignedWithdrawal: PartialBy = { - // ...params, - // clientId: params.clientId || Math.random().toString().slice(2), - // // TODO: Allow clientId to be a string. - // // clientId: params.clientId || Math.random().toString(36).slice(2), - // }; - // let signature: string | undefined = params.signature; - // if (!signature) { - // if (!this.starkKeyPair) { - // throw new Error( - // 'Withdrawal is not signed and client was not initialized with starkPrivateKey', - // ); - // } - // signature = StarkExWithdrawal.fromInternal({ - // ...possiblyUnsignedWithdrawal, - // expiresAt: params.expiration, - // }).sign(this.starkKeyPair); - // } - // return this.post('withdrawals', { - // ...possiblyUnsignedWithdrawal, - // signature, - // }); - // } + async createWithdrawal( + params: PartialBy, + positionId: string, + ): Promise<{}> { + // TODO: Allow clientId to be a string. + // const clientId = params.clientId || Math.random().toString(36).slice(2); + // + // Have to strip leading zeroes since clientId is being mis-processed as a number. + const clientId = params.clientId || Math.random().toString().slice(2).replace(/^0+/, ''); + + let signature: string | undefined = params.signature; + if (!signature) { + if (!this.starkKeyPair) { + throw new Error( + 'Withdrawal is not signed and client was not initialized with starkPrivateKey', + ); + } + const withdrawalToSign = { + ...params, + clientId, + starkKey: this.starkKeyPair.publicKey, + debitAmount: params.amount, + expiresAt: params.expiration, + positionId, + }; + const starkWithdrawal: StarkExWithdrawal = StarkExWithdrawal.fromInternal(withdrawalToSign); + signature = starkWithdrawal.sign(this.starkKeyPair); + } + + const withdrawal: ApiWithdrawal = { + ...params, + clientId, + signature, + }; + + return this.post( + 'withdrawals', + withdrawal, + ); + } async createDeposit( params: { diff --git a/src/types.ts b/src/types.ts index 45ca210..62bdf29 100644 --- a/src/types.ts +++ b/src/types.ts @@ -71,12 +71,10 @@ export interface ApiOrder extends ApiStarkwareSigned { } export interface ApiWithdrawal extends ApiStarkwareSigned { - amount: Asset, + amount: string, asset: Asset, toAddress: string, clientId: string; - positionId: string; - debitAmount: string; } // ============ Utility Types ============ From 18d065e5df047bb44ee7d231000c4a16f08c6c9c Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Mon, 26 Oct 2020 16:35:36 -0700 Subject: [PATCH 012/180] v0.0.7: remove nsb-dev [BAC-524] (#10) * remove nsb-dev * ks1 --- .circleci/config.yml | 2 +- .eslintrc.js | 162 +++++- jest.config.js | 18 +- package-lock.json | 881 ++++++++++++++----------------- package.json | 22 +- scripts/publish-if-not-exists.sh | 25 + tsconfig.json | 25 +- 7 files changed, 633 insertions(+), 502 deletions(-) create mode 100755 scripts/publish-if-not-exists.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 6df5af7..06f0685 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -84,7 +84,7 @@ jobs: command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/build/.npmrc - run: command: | - ./node_modules/@dydxprotocol/node-service-base-dev/scripts/publish-if-not-exists.sh + ./scripts/publish-if-not-exists.sh workflows: version: 2 build_and_test: diff --git a/.eslintrc.js b/.eslintrc.js index 106dbca..29a1727 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,12 +1,164 @@ module.exports = { - extends: './node_modules/@dydxprotocol/node-service-base-dev/.eslintrc.js', - - // Override the base configuration to set the correct tsconfigRootDir. + root: true, + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint'], + extends: [ + 'eslint:recommended', + 'airbnb-typescript/base', + 'plugin:@typescript-eslint/eslint-recommended', + ], + env: { + node: true, + jest: true, + es6: true, + }, + overrides: [ + { + files: '**/*.js', + rules: { + '@typescript-eslint/no-var-requires': 'off', + }, + }, + { + files: '**/__tests__/**/*.test.ts', + rules: { + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': 'off', + 'global-require': 'off', + 'import/first': 'off', + 'import/order': 'off', + }, + }, + ], parserOptions: { + project: './tsconfig.eslint.json', + ecmaVersion: 2018, + sourceType: 'module', tsconfigRootDir: __dirname, }, - - // Extend the base rule set. + ignorePatterns: [ + '**/build/**/*.js', + '**/build/**/*.d.ts', + '**/coverage/**/*.js', + ], rules: { + 'arrow-body-style': 'off', + 'class-methods-use-this': 'off', + 'consistent-return': 'off', // Annoying when return type is Promise. Not as helpful for TypeScript anyway. + 'function-paren-newline': 'off', // Broken in TypeScript: https://github.com/typescript-eslint/typescript-eslint/issues/942 + 'global-require': 'warn', + 'import/order': ['error', + { + groups: [ + 'builtin', + 'external', + ['parent', 'sibling', 'internal', 'unknown'], + 'index', + ], + 'newlines-between': 'always', + alphabetize: { order: 'asc', caseInsensitive: true }, + }, + ], + 'import/no-extraneous-dependencies': 'off', + 'import/prefer-default-export': 'off', + 'max-classes-per-file': 'off', + 'no-await-in-loop': 'off', + 'no-lonely-if': 'off', + 'no-multi-spaces': ['error', { ignoreEOLComments: true }], + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], + // Copied from eslint-config-airbnb-base and modified to allow ForOfStatement. + 'no-restricted-syntax': [ + 'error', + { + selector: 'ForInStatement', + message: 'for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.', + }, + { + selector: 'LabeledStatement', + message: 'Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.', + }, + { + selector: 'WithStatement', + message: '`with` is disallowed in strict mode because it makes code impossible to predict and optimize.', + }, + ], + 'no-shadow': 'off', // Disable in favor of @typescript-eslint/no-shadow. + 'no-underscore-dangle': 'off', + 'no-use-before-define': 'off', + 'operator-linebreak': ['error', + 'after', + { + overrides: { + '?': 'before', + ':': 'before', + '=': 'none', + }, + }, + ], + 'padded-blocks': 'off', + 'prefer-destructuring': 'off', + 'spaced-comment': ['error', 'always', { exceptions: ['/'] }], + // Copied from eslint-config-airbnb-base and modified to handle TypeScript bugs: + // https://github.com/typescript-eslint/typescript-eslint/issues/1824 + '@typescript-eslint/indent': ['error', 2, { + SwitchCase: 1, + VariableDeclarator: 1, + outerIIFEBody: 1, + FunctionDeclaration: { + parameters: 1, + body: 1, + }, + FunctionExpression: { + parameters: 1, + body: 1, + }, + CallExpression: { + arguments: 1, + }, + ArrayExpression: 1, + ObjectExpression: 1, + ImportDeclaration: 1, + flatTernaryExpressions: false, + ignoreComments: false, + // Ignore TypeScript edge cases that are handled incorrectly. + // Figured these out using https://astexplorer.net/ with the suggestions described here: + // https://stackoverflow.com/questions/59851672/eslint-indent-and-ignorenodes-trouble-getting-ast-selectors-to-work-correctl + ignoredNodes: [ + // Handle multi-line types within an interface declaration. + 'TSInterfaceDeclaration TSPropertySignature TSTypeAnnotation', + // Handle multi-line types in function return type annotations. + 'FunctionDeclaration > TSTypeAnnotation *', + ], + }], + '@typescript-eslint/lines-between-class-members': ['error', + 'always', + { exceptAfterSingleLine: true }, + ], + '@typescript-eslint/naming-convention': ['error', + { + selector: 'variableLike', + custom: { + regex: '^([Aa]ny|[Nn]umber|[Ss]tring|[Bb]oolean|[Uu]ndefined)$', + match: false, + }, + format: ['camelCase', 'PascalCase', 'UPPER_CASE'], + leadingUnderscore: 'allow', + trailingUnderscore: 'allow', + }, + { + selector: 'typeLike', + custom: { + regex: '^([Aa]ny|[Nn]umber|[Ss]tring|[Bb]oolean|[Uu]ndefined)$', + match: false, + }, + format: ['PascalCase'], + }, + ], + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/no-floating-promises': 'error', + '@typescript-eslint/no-shadow': 'error', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/no-var-requires': 'warn', }, }; diff --git a/jest.config.js b/jest.config.js index 4457993..fed9959 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,2 +1,16 @@ -// Use the base configuration as-is. -module.exports = require('./node_modules/@dydxprotocol/node-service-base-dev/jest.config.js'); +module.exports = { + roots: [ + '/build/__tests__', + ], + testRegex: 'build/__tests__\\/.*\\.test\\.js$', + moduleFileExtensions: [ + 'js', + 'json', + 'node', + ], + globalSetup: './jest.globalSetup.js', + resetMocks: true, + setupFilesAfterEnv: ['./jest.setup.js'], + testEnvironment: 'node', + testTimeout: 5000, +}; diff --git a/package-lock.json b/package-lock.json index 666e804..3d88657 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.6", + "version": "0.0.7", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -242,6 +242,21 @@ "supports-color": "^5.3.0" } }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -442,27 +457,6 @@ "minimist": "^1.2.0" } }, - "@dydxprotocol/node-service-base-dev": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/@dydxprotocol/node-service-base-dev/-/node-service-base-dev-0.0.10.tgz", - "integrity": "sha512-bBsmQrtnLXoPIv7UZI3Ck0kw98ehV0S6sLsDv9A0QQFAqjL0yoBxIetPo0+CL3NOzJVeZox1lia2gE+W70yFTA==", - "dev": true, - "requires": { - "@types/jest": "^26.0.13", - "@types/lodash": "^4.14.161", - "@types/node": "^14.6.4", - "@typescript-eslint/eslint-plugin": "^4.0.1", - "@typescript-eslint/parser": "^4.0.1", - "coveralls": "^3.1.0", - "dotenv-flow": "^3.2.0", - "eslint": "^7.8.0", - "eslint-config-airbnb-typescript": "^9.0.0", - "eslint-plugin-import": "^2.22.0", - "jest": "^26.4.2", - "nodemon": "^2.0.4", - "typescript": "^4.0.2" - } - }, "@dydxprotocol/starkex-lib": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.2.4.tgz", @@ -475,9 +469,9 @@ } }, "@eslint/eslintrc": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", - "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.0.tgz", + "integrity": "sha512-+cIGPCBdLCzqxdtwppswP+zTsH9BOIGzAeKfBIbtb4gW/giMlfMwP0HUSFfhzh20f9u8uZ8hOp62+4GPquTbwQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -592,48 +586,48 @@ "dev": true }, "@jest/console": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.0.tgz", - "integrity": "sha512-ArGcZWAEYMWmWnc/QvxLDvFmGRPvmHeulhS7FUUAlUGR5vS/SqMfArsGaYmIFEThSotCMnEihwx1h62I1eg5lg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.1.tgz", + "integrity": "sha512-cjqcXepwC5M+VeIhwT6Xpi/tT4AiNzlIx8SMJ9IihduHnsSrnWNvTBfKIpmqOOCNOPqtbBx6w2JqfoLOJguo8g==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.6.0", - "jest-util": "^26.6.0", + "jest-message-util": "^26.6.1", + "jest-util": "^26.6.1", "slash": "^3.0.0" } }, "@jest/core": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.0.tgz", - "integrity": "sha512-7wbunxosnC5zXjxrEtTQSblFjRVOT8qz1eSytw8riEeWgegy3ct91NLPEP440CDuWrmW3cOLcEGxIf9q2u6O9Q==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.1.tgz", + "integrity": "sha512-p4F0pgK3rKnoS9olXXXOkbus1Bsu6fd8pcvLMPsUy4CVXZ8WSeiwQ1lK5hwkCIqJ+amZOYPd778sbPha/S8Srw==", "dev": true, "requires": { - "@jest/console": "^26.6.0", - "@jest/reporters": "^26.6.0", - "@jest/test-result": "^26.6.0", - "@jest/transform": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/console": "^26.6.1", + "@jest/reporters": "^26.6.1", + "@jest/test-result": "^26.6.1", + "@jest/transform": "^26.6.1", + "@jest/types": "^26.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.0", - "jest-config": "^26.6.0", - "jest-haste-map": "^26.6.0", - "jest-message-util": "^26.6.0", + "jest-changed-files": "^26.6.1", + "jest-config": "^26.6.1", + "jest-haste-map": "^26.6.1", + "jest-message-util": "^26.6.1", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.0", - "jest-resolve-dependencies": "^26.6.0", - "jest-runner": "^26.6.0", - "jest-runtime": "^26.6.0", - "jest-snapshot": "^26.6.0", - "jest-util": "^26.6.0", - "jest-validate": "^26.6.0", - "jest-watcher": "^26.6.0", + "jest-resolve": "^26.6.1", + "jest-resolve-dependencies": "^26.6.1", + "jest-runner": "^26.6.1", + "jest-runtime": "^26.6.1", + "jest-snapshot": "^26.6.1", + "jest-util": "^26.6.1", + "jest-validate": "^26.6.1", + "jest-watcher": "^26.6.1", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", @@ -653,53 +647,53 @@ } }, "@jest/environment": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.0.tgz", - "integrity": "sha512-l+5MSdiC4rUUrz8xPdj0TwHBwuoqMcAbFnsYDTn5FkenJl8b+lvC5NdJl1tVICGHWnx0fnjdd1luRZ7u3U4xyg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.1.tgz", + "integrity": "sha512-GNvHwkOFJtNgSwdzH9flUPzF9AYAZhUg124CBoQcwcZCM9s5TLz8Y3fMtiaWt4ffbigoetjGk5PU2Dd8nLrSEw==", "dev": true, "requires": { - "@jest/fake-timers": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/fake-timers": "^26.6.1", + "@jest/types": "^26.6.1", "@types/node": "*", - "jest-mock": "^26.6.0" + "jest-mock": "^26.6.1" } }, "@jest/fake-timers": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.0.tgz", - "integrity": "sha512-7VQpjChrwlwvGNysS10lDBLOVLxMvMtpx0Xo6aIotzNVyojYk0NN0CR8R4T6h/eu7Zva/LB3P71jqwGdtADoag==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.1.tgz", + "integrity": "sha512-T/SkMLgOquenw/nIisBRD6XAYpFir0kNuclYLkse5BpzeDUukyBr+K31xgAo9M0hgjU9ORlekAYPSzc0DKfmKg==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "@sinonjs/fake-timers": "^6.0.1", "@types/node": "*", - "jest-message-util": "^26.6.0", - "jest-mock": "^26.6.0", - "jest-util": "^26.6.0" + "jest-message-util": "^26.6.1", + "jest-mock": "^26.6.1", + "jest-util": "^26.6.1" } }, "@jest/globals": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.0.tgz", - "integrity": "sha512-rs3a/a8Lq8FgTx11SxbqIU2bDjsFU2PApl2oK2oUVlo84RSF76afFm2nLojW93AGssr715GHUwhq5b6mpCI5BQ==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.1.tgz", + "integrity": "sha512-acxXsSguuLV/CeMYmBseefw6apO7NuXqpE+v5r3yD9ye2PY7h1nS20vY7Obk2w6S7eJO4OIAJeDnoGcLC/McEQ==", "dev": true, "requires": { - "@jest/environment": "^26.6.0", - "@jest/types": "^26.6.0", - "expect": "^26.6.0" + "@jest/environment": "^26.6.1", + "@jest/types": "^26.6.1", + "expect": "^26.6.1" } }, "@jest/reporters": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.0.tgz", - "integrity": "sha512-PXbvHhdci5Rj1VFloolgLb+0kkdtzswhG8MzVENKJRI3O1ndwr52G6E/2QupjwrRcYnApZOelFf4nNpf5+SDxA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.1.tgz", + "integrity": "sha512-J6OlXVFY3q1SXWJhjme5i7qT/BAZSikdOK2t8Ht5OS32BDo6KfG5CzIzzIFnAVd82/WWbc9Hb7SJ/jwSvVH9YA==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.0", - "@jest/test-result": "^26.6.0", - "@jest/transform": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/console": "^26.6.1", + "@jest/test-result": "^26.6.1", + "@jest/transform": "^26.6.1", + "@jest/types": "^26.6.1", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -710,10 +704,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.0", - "jest-resolve": "^26.6.0", - "jest-util": "^26.6.0", - "jest-worker": "^26.5.0", + "jest-haste-map": "^26.6.1", + "jest-resolve": "^26.6.1", + "jest-util": "^26.6.1", + "jest-worker": "^26.6.1", "node-notifier": "^8.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", @@ -734,46 +728,46 @@ } }, "@jest/test-result": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.0.tgz", - "integrity": "sha512-LV6X1ry+sKjseQsIFz3e6XAZYxwidvmeJFnVF08fq98q08dF1mJYI0lDq/LmH/jas+R4s0pwnNGiz1hfC4ZUBw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.1.tgz", + "integrity": "sha512-wqAgIerIN2gSdT2A8WeA5+AFh9XQBqYGf8etK143yng3qYd0mF0ie2W5PVmgnjw4VDU6ammI9NdXrKgNhreawg==", "dev": true, "requires": { - "@jest/console": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/console": "^26.6.1", + "@jest/types": "^26.6.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.0.tgz", - "integrity": "sha512-rWPTMa+8rejvePZnJmnKkmKWh0qILFDPpN0qbSif+KNGvFxqqDGafMo4P2Y8+I9XWrZQBeXL9IxPL4ZzDgRlbw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.1.tgz", + "integrity": "sha512-0csqA/XApZiNeTIPYh6koIDCACSoR6hi29T61tKJMtCZdEC+tF3PoNt7MS0oK/zKC6daBgCbqXxia5ztr/NyCQ==", "dev": true, "requires": { - "@jest/test-result": "^26.6.0", + "@jest/test-result": "^26.6.1", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.0", - "jest-runner": "^26.6.0", - "jest-runtime": "^26.6.0" + "jest-haste-map": "^26.6.1", + "jest-runner": "^26.6.1", + "jest-runtime": "^26.6.1" } }, "@jest/transform": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.0.tgz", - "integrity": "sha512-NUNA1NMCyVV9g5NIQF1jzW7QutQhB/HAocteCiUyH0VhmLXnGMTfPYQu1G6IjPk+k1SWdh2PD+Zs1vMqbavWzg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.1.tgz", + "integrity": "sha512-oNFAqVtqRxZRx6vXL3I4bPKUK0BIlEeaalkwxyQGGI8oXDQBtYQBpiMe5F7qPs4QdvvFYB42gPGIMMcxXaBBxQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.0", + "jest-haste-map": "^26.6.1", "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.0", + "jest-util": "^26.6.1", "micromatch": "^4.0.2", "pirates": "^4.0.1", "slash": "^3.0.0", @@ -782,9 +776,9 @@ } }, "@jest/types": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", - "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -922,9 +916,9 @@ "dev": true }, "@types/graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", "dev": true, "requires": { "@types/node": "*" @@ -1043,13 +1037,13 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.5.0.tgz", - "integrity": "sha512-mjb/gwNcmDKNt+6mb7Aj/TjKzIJjOPcoCJpjBQC9ZnTRnBt1p4q5dJSSmIqAtsZ/Pff5N+hJlbiPc5bl6QN4OQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.6.0.tgz", + "integrity": "sha512-1+419X+Ynijytr1iWI+/IcX/kJryc78YNpdaXR1aRO1sU3bC0vZrIAF1tIX7rudVI84W7o7M4zo5p1aVt70fAg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.5.0", - "@typescript-eslint/scope-manager": "4.5.0", + "@typescript-eslint/experimental-utils": "4.6.0", + "@typescript-eslint/scope-manager": "4.6.0", "debug": "^4.1.1", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", @@ -1075,28 +1069,28 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.5.0.tgz", - "integrity": "sha512-bW9IpSAKYvkqDGRZzayBXIgPsj2xmmVHLJ+flGSoN0fF98pGoKFhbunIol0VF2Crka7z984EEhFi623Rl7e6gg==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.6.0.tgz", + "integrity": "sha512-pnh6Beh2/4xjJVNL+keP49DFHk3orDHHFylSp3WEjtgW3y1U+6l+jNnJrGlbs6qhAz5z96aFmmbUyKhunXKvKw==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.5.0", - "@typescript-eslint/types": "4.5.0", - "@typescript-eslint/typescript-estree": "4.5.0", + "@typescript-eslint/scope-manager": "4.6.0", + "@typescript-eslint/types": "4.6.0", + "@typescript-eslint/typescript-estree": "4.6.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.5.0.tgz", - "integrity": "sha512-xb+gmyhQcnDWe+5+xxaQk5iCw6KqXd8VQxGiTeELTMoYeRjpocZYYRP1gFVM2C8Yl0SpUvLa1lhprwqZ00w3Iw==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.6.0.tgz", + "integrity": "sha512-Dj6NJxBhbdbPSZ5DYsQqpR32MwujF772F2H3VojWU6iT4AqL4BKuoNWOPFCoSZvCcADDvQjDpa6OLDAaiZPz2Q==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.5.0", - "@typescript-eslint/types": "4.5.0", - "@typescript-eslint/typescript-estree": "4.5.0", + "@typescript-eslint/scope-manager": "4.6.0", + "@typescript-eslint/types": "4.6.0", + "@typescript-eslint/typescript-estree": "4.6.0", "debug": "^4.1.1" }, "dependencies": { @@ -1118,29 +1112,29 @@ } }, "@typescript-eslint/scope-manager": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.5.0.tgz", - "integrity": "sha512-C0cEO0cTMPJ/w4RA/KVe4LFFkkSh9VHoFzKmyaaDWAnPYIEzVCtJ+Un8GZoJhcvq+mPFXEsXa01lcZDHDG6Www==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.6.0.tgz", + "integrity": "sha512-uZx5KvStXP/lwrMrfQQwDNvh2ppiXzz5TmyTVHb+5TfZ3sUP7U1onlz3pjoWrK9konRyFe1czyxObWTly27Ang==", "dev": true, "requires": { - "@typescript-eslint/types": "4.5.0", - "@typescript-eslint/visitor-keys": "4.5.0" + "@typescript-eslint/types": "4.6.0", + "@typescript-eslint/visitor-keys": "4.6.0" } }, "@typescript-eslint/types": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.5.0.tgz", - "integrity": "sha512-n2uQoXnyWNk0Les9MtF0gCK3JiWd987JQi97dMSxBOzVoLZXCNtxFckVqt1h8xuI1ix01t+iMY4h4rFMj/303g==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.6.0.tgz", + "integrity": "sha512-5FAgjqH68SfFG4UTtIFv+rqYJg0nLjfkjD0iv+5O27a0xEeNZ5rZNDvFGZDizlCD1Ifj7MAbSW2DPMrf0E9zjA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.5.0.tgz", - "integrity": "sha512-gN1mffq3zwRAjlYWzb5DanarOPdajQwx5MEWkWCk0XvqC8JpafDTeioDoow2L4CA/RkYZu7xEsGZRhqrTsAG8w==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.6.0.tgz", + "integrity": "sha512-s4Z9qubMrAo/tw0CbN0IN4AtfwuehGXVZM0CHNMdfYMGBDhPdwTEpBrecwhP7dRJu6d9tT9ECYNaWDHvlFSngA==", "dev": true, "requires": { - "@typescript-eslint/types": "4.5.0", - "@typescript-eslint/visitor-keys": "4.5.0", + "@typescript-eslint/types": "4.6.0", + "@typescript-eslint/visitor-keys": "4.6.0", "debug": "^4.1.1", "globby": "^11.0.1", "is-glob": "^4.0.1", @@ -1167,12 +1161,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.5.0.tgz", - "integrity": "sha512-UHq4FSa55NDZqscRU//O5ROFhHa9Hqn9KWTEvJGTArtTQp5GKv9Zqf6d/Q3YXXcFv4woyBml7fJQlQ+OuqRcHA==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.0.tgz", + "integrity": "sha512-38Aa9Ztl0XyFPVzmutHXqDMCu15Xx8yKvUo38Gu3GhsuckCh3StPI5t2WIO9LHEsOH7MLmlGfKUisU8eW1Sjhg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.5.0", + "@typescript-eslint/types": "4.6.0", "eslint-visitor-keys": "^2.0.0" } }, @@ -1278,23 +1272,6 @@ "dev": true, "requires": { "color-convert": "^2.0.1" - }, - "dependencies": { - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } } }, "anymatch": { @@ -1469,13 +1446,13 @@ } }, "babel-jest": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.0.tgz", - "integrity": "sha512-JI66yILI7stzjHccAoQtRKcUwJrJb4oMIxLTirL3GdAjGpaUBQSjZDFi9LsPkN4gftsS4R2AThAJwOjJxadwbg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.1.tgz", + "integrity": "sha512-duMWEOKrSBYRVTTNpL2SipNIWnZOjP77auOBMPQ3zXAdnDbyZQWU8r/RxNWpUf9N6cgPFecQYelYLytTVXVDtA==", "dev": true, "requires": { - "@jest/transform": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/transform": "^26.6.1", + "@jest/types": "^26.6.1", "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", "babel-preset-jest": "^26.5.0", @@ -1910,6 +1887,12 @@ "safe-buffer": "^5.0.1" } }, + "cjs-module-lexer": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.4.3.tgz", + "integrity": "sha512-5RLK0Qfs0PNDpEyBXIr3bIT1Muw3ojSlvpw6dAmkUcO0+uTrsBn7GuEIgx40u+OzbCBLDta7nvmud85P4EmTsQ==", + "dev": true + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -2007,18 +1990,18 @@ } }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "combined-stream": { @@ -2057,9 +2040,9 @@ } }, "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", "dev": true }, "contains-path": { @@ -2472,14 +2455,6 @@ "dev": true, "requires": { "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } } }, "es-abstract": { @@ -2580,13 +2555,13 @@ } }, "eslint": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.11.0.tgz", - "integrity": "sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.0.tgz", + "integrity": "sha512-n5pEU27DRxCSlOhJ2rO57GDLcNsxO0LPpAbpFdh7xmcDmjmlGUfoyrsB3I7yYdQXO5N3gkSTiDrPSPNFiiirXA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.1.3", + "@eslint/eslintrc": "^0.2.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -3057,12 +3032,6 @@ "which": "^1.2.9" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -3152,16 +3121,16 @@ } }, "expect": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.0.tgz", - "integrity": "sha512-EzhbZ1tbwcaa5Ok39BI11flIMeIUSlg1QsnXOrleaMvltwHsvIQPBtL710l+ma+qDFLUgktCXK4YuQzmHdm7cg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.1.tgz", + "integrity": "sha512-BRfxIBHagghMmr1D2MRY0Qv5d3Nc8HCqgbDwNXw/9izmM5eBb42a2YjLKSbsqle76ozGkAEPELQX4IdNHAKRNA==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "ansi-styles": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.0", - "jest-message-util": "^26.6.0", + "jest-matcher-utils": "^26.6.1", + "jest-message-util": "^26.6.1", "jest-regex-util": "^26.0.0" } }, @@ -3609,12 +3578,6 @@ "kind-of": "^4.0.0" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -3874,12 +3837,6 @@ "kind-of": "^3.0.2" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -3891,6 +3848,12 @@ } } }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -3900,6 +3863,12 @@ "binary-extensions": "^2.0.0" } }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "is-callable": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", @@ -3933,12 +3902,6 @@ "kind-of": "^3.0.2" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -4085,9 +4048,9 @@ } }, "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "is-string": { @@ -4232,33 +4195,33 @@ } }, "jest": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", - "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.1.tgz", + "integrity": "sha512-f+ahfqw3Ffy+9vA7sWFGpTmhtKEMsNAZiWBVXDkrpIO73zIz22iimjirnV78kh/eWlylmvLh/0WxHN6fZraZdA==", "dev": true, "requires": { - "@jest/core": "^26.6.0", + "@jest/core": "^26.6.1", "import-local": "^3.0.2", - "jest-cli": "^26.6.0" + "jest-cli": "^26.6.1" }, "dependencies": { "jest-cli": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.0.tgz", - "integrity": "sha512-lJAMZGpmML+y3Kfln6L5DGRTfKGQ+n1JDM1RQstojSLUhe/EaXWR8vmcx70v4CyJKvFZs7c/0QDkPX5ra/aDew==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.1.tgz", + "integrity": "sha512-aPLoEjlwFrCWhiPpW5NUxQA1X1kWsAnQcQ0SO/fHsCvczL3W75iVAcH9kP6NN+BNqZcHNEvkhxT5cDmBfEAh+w==", "dev": true, "requires": { - "@jest/core": "^26.6.0", - "@jest/test-result": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/core": "^26.6.1", + "@jest/test-result": "^26.6.1", + "@jest/types": "^26.6.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^26.6.0", - "jest-util": "^26.6.0", - "jest-validate": "^26.6.0", + "jest-config": "^26.6.1", + "jest-util": "^26.6.1", + "jest-validate": "^26.6.1", "prompts": "^2.0.1", "yargs": "^15.4.1" } @@ -4266,12 +4229,12 @@ } }, "jest-changed-files": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.0.tgz", - "integrity": "sha512-k8PZzlp3cRWDe0fDc/pYs+c4w36+hiWXe1PpW/pW1UJmu1TNTAcQfZUrVYleij+uEqlY6z4mPv7Iff3kY0o5SQ==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.1.tgz", + "integrity": "sha512-NhSdZ5F6b/rIN5V46x1l31vrmukD/bJUXgYAY8VtP1SknYdJwjYDRxuLt7Z8QryIdqCjMIn2C0Cd98EZ4umo8Q==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "execa": "^4.0.0", "throat": "^5.0.0" }, @@ -4302,6 +4265,12 @@ "pump": "^3.0.0" } }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -4314,41 +4283,41 @@ } }, "jest-config": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.0.tgz", - "integrity": "sha512-RCR1Kf7MGJ5waVCvrj/k3nCAJKquWZlzs8rkskzj0KlG392hNBOaYd5FQ4cCac08j6pwfIDOwNvMcy0/FqguJg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.1.tgz", + "integrity": "sha512-mtJzIynIwW1d1nMlKCNCQiSgWaqFn8cH/fOSNY97xG7Y9tBCZbCSuW2GTX0RPmceSJGO7l27JgwC18LEg0Vg+g==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.0", - "@jest/types": "^26.6.0", - "babel-jest": "^26.6.0", + "@jest/test-sequencer": "^26.6.1", + "@jest/types": "^26.6.1", + "babel-jest": "^26.6.1", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.0", - "jest-environment-node": "^26.6.0", + "jest-environment-jsdom": "^26.6.1", + "jest-environment-node": "^26.6.1", "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.0", + "jest-jasmine2": "^26.6.1", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.0", - "jest-util": "^26.6.0", - "jest-validate": "^26.6.0", + "jest-resolve": "^26.6.1", + "jest-util": "^26.6.1", + "jest-validate": "^26.6.1", "micromatch": "^4.0.2", - "pretty-format": "^26.6.0" + "pretty-format": "^26.6.1" } }, "jest-diff": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.0.tgz", - "integrity": "sha512-IH09rKsdWY8YEY7ii2BHlSq59oXyF2pK3GoK+hOK9eD/x6009eNB5Jv1shLMKgxekodPzLlV7eZP1jPFQYds8w==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.1.tgz", + "integrity": "sha512-BBNy/zin2m4kG5In126O8chOBxLLS/XMTuuM2+YhgyHk87ewPzKTuTJcqj3lOWOi03NNgrl+DkMeV/exdvG9gg==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^26.5.0", "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.0" + "pretty-format": "^26.6.1" } }, "jest-docblock": { @@ -4361,45 +4330,45 @@ } }, "jest-each": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.0.tgz", - "integrity": "sha512-7LzSNwNviYnm4FWK46itIE03NqD/8O8/7tVQ5rwTdTNrmPMQoQ1Z7hEFQ1uzRReluOFislpurpnQ0QsclSiDkA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.1.tgz", + "integrity": "sha512-gSn8eB3buchuq45SU7pLB7qmCGax1ZSxfaWuEFblCyNMtyokYaKFh9dRhYPujK6xYL57dLIPhLKatjmB5XWzGA==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-util": "^26.6.0", - "pretty-format": "^26.6.0" + "jest-util": "^26.6.1", + "pretty-format": "^26.6.1" } }, "jest-environment-jsdom": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.0.tgz", - "integrity": "sha512-bXO9IG7a3YlyiHxwfKF+OWoTA+GIw4FrD+Y0pb6CC+nKs5JuSRZmR2ovEX6PWo6KY42ka3JoZOp3KEnXiFPPCg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.1.tgz", + "integrity": "sha512-A17RiXuHYNVlkM+3QNcQ6n5EZyAc6eld8ra9TW26luounGWpku4tj03uqRgHJCI1d4uHr5rJiuCH5JFRtdmrcA==", "dev": true, "requires": { - "@jest/environment": "^26.6.0", - "@jest/fake-timers": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/environment": "^26.6.1", + "@jest/fake-timers": "^26.6.1", + "@jest/types": "^26.6.1", "@types/node": "*", - "jest-mock": "^26.6.0", - "jest-util": "^26.6.0", + "jest-mock": "^26.6.1", + "jest-util": "^26.6.1", "jsdom": "^16.4.0" } }, "jest-environment-node": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.0.tgz", - "integrity": "sha512-kWU6ZD1h6fs7sIl6ufuK0sXW/3d6WLaj48iow0NxhgU6eY89d9K+0MVmE0cRcVlh53yMyxTK6b+TnhLOnlGp/A==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.1.tgz", + "integrity": "sha512-YffaCp6h0j1kbcf1NVZ7umC6CPgD67YS+G1BeornfuSkx5s3xdhuwG0DCxSiHPXyT81FfJzA1L7nXvhq50OWIg==", "dev": true, "requires": { - "@jest/environment": "^26.6.0", - "@jest/fake-timers": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/environment": "^26.6.1", + "@jest/fake-timers": "^26.6.1", + "@jest/types": "^26.6.1", "@types/node": "*", - "jest-mock": "^26.6.0", - "jest-util": "^26.6.0" + "jest-mock": "^26.6.1", + "jest-util": "^26.6.1" } }, "jest-get-type": { @@ -4409,12 +4378,12 @@ "dev": true }, "jest-haste-map": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.0.tgz", - "integrity": "sha512-RpNqAGMR58uG9E9vWITorX2/R7he/tSbHWldX5upt1ymEcmCaXczqXxjqI6xOtRR8Ev6ZEYDfgSA5Fy7WHUL5w==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.1.tgz", + "integrity": "sha512-9kPafkv0nX6ta1PrshnkiyhhoQoFWncrU/uUBt3/AP1r78WSCU5iLceYRTwDvJl67H3RrXqSlSVDDa/AsUB7OQ==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", @@ -4423,69 +4392,69 @@ "graceful-fs": "^4.2.4", "jest-regex-util": "^26.0.0", "jest-serializer": "^26.5.0", - "jest-util": "^26.6.0", - "jest-worker": "^26.5.0", + "jest-util": "^26.6.1", + "jest-worker": "^26.6.1", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.0.tgz", - "integrity": "sha512-2E3c+0A9y2OIK5caw5qlcm3b4doaf8FSfXKTX3xqKTUJoR4zXh0xvERBNWxZP9xMNXEi/2Z3LVsZpR2hROgixA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.1.tgz", + "integrity": "sha512-2uYdT32o/ZzSxYAPduAgokO8OlAL1YdG/9oxcEY138EDNpIK5XRRJDaGzTZdIBWSxk0aR8XxN44FvfXtHB+Fiw==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.0", + "@jest/environment": "^26.6.1", "@jest/source-map": "^26.5.0", - "@jest/test-result": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/test-result": "^26.6.1", + "@jest/types": "^26.6.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^26.6.0", + "expect": "^26.6.1", "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.0", - "jest-matcher-utils": "^26.6.0", - "jest-message-util": "^26.6.0", - "jest-runtime": "^26.6.0", - "jest-snapshot": "^26.6.0", - "jest-util": "^26.6.0", - "pretty-format": "^26.6.0", + "jest-each": "^26.6.1", + "jest-matcher-utils": "^26.6.1", + "jest-message-util": "^26.6.1", + "jest-runtime": "^26.6.1", + "jest-snapshot": "^26.6.1", + "jest-util": "^26.6.1", + "pretty-format": "^26.6.1", "throat": "^5.0.0" } }, "jest-leak-detector": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.0.tgz", - "integrity": "sha512-3oMv34imWTl1/nwKnmE/DxYo3QqHnZeF3nO6UzldppkhW0Za7OY2DYyWiamqVzwdUrjhoQkY5g+aF6Oc3alYEQ==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.1.tgz", + "integrity": "sha512-j9ZOtJSJKlHjrs4aIxWjiQUjyrffPdiAQn2Iw0916w7qZE5Lk0T2KhIH6E9vfhzP6sw0Q0jtnLLb4vQ71o1HlA==", "dev": true, "requires": { "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.0" + "pretty-format": "^26.6.1" } }, "jest-matcher-utils": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.0.tgz", - "integrity": "sha512-BUy/dQYb7ELGRazmK4ZVkbfPYCaNnrMtw1YljVhcKzWUxBM0xQ+bffrfnMLdRZp4wUUcT4ahaVnA3VWZtXWP9Q==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.1.tgz", + "integrity": "sha512-9iu3zrsYlUnl8pByhREF9rr5eYoiEb1F7ymNKg6lJr/0qD37LWS5FSW/JcoDl8UdMX2+zAzabDs7sTO+QFKjCg==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^26.6.0", + "jest-diff": "^26.6.1", "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.0" + "pretty-format": "^26.6.1" } }, "jest-message-util": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", - "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.1.tgz", + "integrity": "sha512-cqM4HnqncIebBNdTKrBoWR/4ufHTll0pK/FWwX0YasK+TlBQEMqw3IEdynuuOTjDPFO3ONlFn37280X48beByw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -4495,12 +4464,12 @@ } }, "jest-mock": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.0.tgz", - "integrity": "sha512-HsNmL8vVIn1rL1GWA21Drpy9Cl+7GImwbWz/0fkWHrUXVzuaG7rP0vwLtE+/n70Mt0U8nPkz8fxioi3SC0wqhw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.1.tgz", + "integrity": "sha512-my0lPTBu1awY8iVG62sB2sx9qf8zxNDVX+5aFgoB8Vbqjb6LqIOsfyFA8P1z6H2IsqMbvOX9oCJnK67Y3yUIMA==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "@types/node": "*" } }, @@ -4517,18 +4486,18 @@ "dev": true }, "jest-resolve": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", - "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", + "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.0", + "jest-util": "^26.6.1", "read-pkg-up": "^7.0.1", - "resolve": "^1.17.0", + "resolve": "^1.18.1", "slash": "^3.0.0" }, "dependencies": { @@ -4627,73 +4596,74 @@ } }, "jest-resolve-dependencies": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.0.tgz", - "integrity": "sha512-4di+XUT7LwJJ8b8qFEEDQssC5+aeVjLhvRICCaS4alh/EVS9JCT1armfJ3pnSS8t4o6659WbMmKVo82H4LuUVw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.1.tgz", + "integrity": "sha512-MN6lufbZJ3RBfTnJesZtHu3hUCBqPdHRe2+FhIt0yiqJ3fMgzWRqMRQyN/d/QwOE7KXwAG2ekZutbPhuD7s51A==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.0" + "jest-snapshot": "^26.6.1" } }, "jest-runner": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.0.tgz", - "integrity": "sha512-QpeN6pje8PQvFgT+wYOlzeycKd67qAvSw5FgYBiX2cTW+QTiObTzv/k09qRvT09rcCntFxUhy9VB1mgNGFLYIA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.1.tgz", + "integrity": "sha512-DmpNGdgsbl5s0FGkmsInmqnmqCtliCSnjWA2TFAJS1m1mL5atwfPsf+uoZ8uYQ2X0uDj4NM+nPcDnUpbNTRMBA==", "dev": true, "requires": { - "@jest/console": "^26.6.0", - "@jest/environment": "^26.6.0", - "@jest/test-result": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/console": "^26.6.1", + "@jest/environment": "^26.6.1", + "@jest/test-result": "^26.6.1", + "@jest/types": "^26.6.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.7.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.0", + "jest-config": "^26.6.1", "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.0", - "jest-leak-detector": "^26.6.0", - "jest-message-util": "^26.6.0", - "jest-resolve": "^26.6.0", - "jest-runtime": "^26.6.0", - "jest-util": "^26.6.0", - "jest-worker": "^26.5.0", + "jest-haste-map": "^26.6.1", + "jest-leak-detector": "^26.6.1", + "jest-message-util": "^26.6.1", + "jest-resolve": "^26.6.1", + "jest-runtime": "^26.6.1", + "jest-util": "^26.6.1", + "jest-worker": "^26.6.1", "source-map-support": "^0.5.6", "throat": "^5.0.0" } }, "jest-runtime": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.0.tgz", - "integrity": "sha512-JEz4YGnybFvtN4NLID6lsZf0bcd8jccwjWcG5TRE3fYVnxoX1egTthPjnC4btIwWJ6QaaHhtOQ/E3AGn8iClAw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.1.tgz", + "integrity": "sha512-7uOCNeezXDWgjEyzYbRN2ViY7xNZzusNVGAMmU0UHRUNXuY4j4GBHKGMqPo/cBPZA9bSYp+lwK2DRRBU5Dv6YQ==", "dev": true, "requires": { - "@jest/console": "^26.6.0", - "@jest/environment": "^26.6.0", - "@jest/fake-timers": "^26.6.0", - "@jest/globals": "^26.6.0", + "@jest/console": "^26.6.1", + "@jest/environment": "^26.6.1", + "@jest/fake-timers": "^26.6.1", + "@jest/globals": "^26.6.1", "@jest/source-map": "^26.5.0", - "@jest/test-result": "^26.6.0", - "@jest/transform": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/test-result": "^26.6.1", + "@jest/transform": "^26.6.1", + "@jest/types": "^26.6.1", "@types/yargs": "^15.0.0", "chalk": "^4.0.0", + "cjs-module-lexer": "^0.4.2", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.0", - "jest-haste-map": "^26.6.0", - "jest-message-util": "^26.6.0", - "jest-mock": "^26.6.0", + "jest-config": "^26.6.1", + "jest-haste-map": "^26.6.1", + "jest-message-util": "^26.6.1", + "jest-mock": "^26.6.1", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.0", - "jest-snapshot": "^26.6.0", - "jest-util": "^26.6.0", - "jest-validate": "^26.6.0", + "jest-resolve": "^26.6.1", + "jest-snapshot": "^26.6.1", + "jest-util": "^26.6.1", + "jest-validate": "^26.6.1", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^15.4.1" @@ -4718,36 +4688,36 @@ } }, "jest-snapshot": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.0.tgz", - "integrity": "sha512-mcqJZeIZqxomvBcsaiIbiEe2g7K1UxnUpTwjMoHb+DX4uFGnuZoZ6m28YOYRyCfZsdU9mmq73rNBnEH2atTR4Q==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.1.tgz", + "integrity": "sha512-JA7bZp7HRTIJYAi85pJ/OZ2eur2dqmwIToA5/6d7Mn90isGEfeF9FvuhDLLEczgKP1ihreBzrJ6Vr7zteP5JNA==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.0.0", "chalk": "^4.0.0", - "expect": "^26.6.0", + "expect": "^26.6.1", "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.0", + "jest-diff": "^26.6.1", "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.0", - "jest-matcher-utils": "^26.6.0", - "jest-message-util": "^26.6.0", - "jest-resolve": "^26.6.0", + "jest-haste-map": "^26.6.1", + "jest-matcher-utils": "^26.6.1", + "jest-message-util": "^26.6.1", + "jest-resolve": "^26.6.1", "natural-compare": "^1.4.0", - "pretty-format": "^26.6.0", + "pretty-format": "^26.6.1", "semver": "^7.3.2" } }, "jest-util": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", - "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.1.tgz", + "integrity": "sha512-xCLZUqVoqhquyPLuDXmH7ogceGctbW8SMyQVjD9o+1+NPWI7t0vO08udcFLVPLgKWcvc+zotaUv/RuaR6l8HIA==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -4756,17 +4726,17 @@ } }, "jest-validate": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.0.tgz", - "integrity": "sha512-FKHNqvh1Pgs4NWas56gsTPmjcIoGAAzSVUCK1+g8euzuCGbmdEr8LRTtOEFjd29uMZUk0PhzmzKGlHPe6j3UWw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.1.tgz", + "integrity": "sha512-BEFpGbylKocnNPZULcnk+TGaz1oFZQH/wcaXlaXABbu0zBwkOGczuWgdLucUouuQqn7VadHZZeTvo8VSFDLMOA==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "camelcase": "^6.0.0", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", "leven": "^3.1.0", - "pretty-format": "^26.6.0" + "pretty-format": "^26.6.1" }, "dependencies": { "camelcase": { @@ -4778,24 +4748,24 @@ } }, "jest-watcher": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.0.tgz", - "integrity": "sha512-gw5BvcgPi0PKpMlNWQjUet5C5A4JOYrT7gexdP6+DR/f7mRm7wE0o1GqwPwcTsTwo0/FNf9c/kIDXTRaSAYwlw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.1.tgz", + "integrity": "sha512-0LBIPPncNi9CaLKK15bnxyd2E8OMl4kJg0PTiNOI+MXztXw1zVdtX/x9Pr6pXaQYps+eS/ts43O4+HByZ7yJSw==", "dev": true, "requires": { - "@jest/test-result": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/test-result": "^26.6.1", + "@jest/types": "^26.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^26.6.0", + "jest-util": "^26.6.1", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", - "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.1.tgz", + "integrity": "sha512-R5IE3qSGz+QynJx8y+ICEkdI2OJ3RJjRQVEyCcFAd3yVhQSEtquziPO29Mlzgn07LOVE8u8jhJ1FqcwegiXWOw==", "dev": true, "requires": { "@types/node": "*", @@ -5279,15 +5249,6 @@ "shellwords": "^0.1.1", "uuid": "^8.3.0", "which": "^2.0.2" - }, - "dependencies": { - "uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", - "dev": true, - "optional": true - } } }, "nodemon": { @@ -5436,12 +5397,6 @@ "is-descriptor": "^0.1.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -5781,15 +5736,15 @@ "dev": true }, "pretty-format": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.0.tgz", - "integrity": "sha512-Uumr9URVB7bm6SbaByXtx+zGlS+0loDkFMHP0kHahMjmfCtmFY03iqd++5v3Ld6iB5TocVXlBN/T+DXMn9d4BA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.1.tgz", + "integrity": "sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" } }, "progress": { @@ -5799,13 +5754,13 @@ "dev": true }, "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", "dev": true, "requires": { "kleur": "^3.0.3", - "sisteransi": "^1.0.4" + "sisteransi": "^1.0.5" } }, "psl": { @@ -5837,9 +5792,9 @@ "dev": true }, "pupa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", - "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", "dev": true, "requires": { "escape-goat": "^2.0.0" @@ -5880,9 +5835,9 @@ } }, "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", "dev": true }, "read-pkg": { @@ -6276,12 +6231,6 @@ } } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -6493,6 +6442,21 @@ "requires": { "color-convert": "^1.9.0" } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true } } }, @@ -6607,12 +6571,6 @@ "kind-of": "^3.2.0" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -6827,65 +6785,23 @@ } }, "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz", + "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "es-abstract": "^1.18.0-next.1" } }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz", + "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "es-abstract": "^1.18.0-next.1" } }, "string_decoder": { @@ -6975,9 +6891,9 @@ } }, "term-size": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", - "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", "dev": true }, "terminal-link": { @@ -7034,12 +6950,6 @@ "kind-of": "^3.0.2" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -7340,7 +7250,8 @@ "uuid": { "version": "8.3.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==" + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "dev": true }, "v8-compile-cache": { "version": "2.1.1", diff --git a/package.json b/package.json index 7912c72..0e8165a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.6", + "version": "0.0.7", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,11 +26,23 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-lib": "^0.2.4", - "axios": "^0.19.0", - "uuid": "^8.3.1" + "axios": "^0.19.0" }, "devDependencies": { - "@dydxprotocol/node-service-base-dev": "0.0.10", - "@types/uuid": "^8.3.0" + "@types/uuid": "^8.3.0", + "@types/jest": "^26.0.13", + "@types/lodash": "^4.14.161", + "@types/node": "^14.6.4", + "@typescript-eslint/eslint-plugin": "^4.0.1", + "@typescript-eslint/parser": "^4.0.1", + "coveralls": "^3.1.0", + "dotenv-flow": "^3.2.0", + "eslint": "^7.8.0", + "eslint-config-airbnb-typescript": "^9.0.0", + "eslint-plugin-import": "^2.22.0", + "jest": "^26.4.2", + "nodemon": "^2.0.4", + "typescript": "^4.0.2", + "uuid": "^8.3.1" } } diff --git a/scripts/publish-if-not-exists.sh b/scripts/publish-if-not-exists.sh new file mode 100755 index 0000000..0262a28 --- /dev/null +++ b/scripts/publish-if-not-exists.sh @@ -0,0 +1,25 @@ +#!/bin/sh +set -euxo pipefail + +VERSION=$(cat package.json | jq -r '.version') +NAME=$(cat package.json | jq -r '.name') + +test -z "$(npm info $NAME@$VERSION)" +if [ $? -eq 0 ] +then + set -e + + mkdir -p ~/.ssh + touch ~/.ssh/known_hosts + ssh-keyscan -H github.com >> ~/.ssh/known_hosts + git config --global user.email "ci@dydx.exchange" + git config --global user.name "circle_ci" + + # Get version and tag + git tag v${VERSION} + git push --tags + + npm publish +else + echo "skipping publish, package $NAME@$VERSION already published" +fi diff --git a/tsconfig.json b/tsconfig.json index dd5d511..3cf1327 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,11 +1,28 @@ { - "extends": "./node_modules/@dydxprotocol/node-service-base-dev/tsconfig.json", + "compilerOptions": { + "target": "ES2019", + "module": "CommonJS", + "lib": [ + "es2015", + "es2016", + "es2017", + "es2018", + "es2019" + ], + "outDir": "build", + "declaration": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "inlineSourceMap": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "resolveJsonModule": true, + "strict": true + }, "include": [ "__tests__", "scripts", "src" ], - "compilerOptions": { - "outDir": "build" - } + "compileOnSave": true } From ea67a2d6fb953e3f8ed2f0c9c6058afb64257dd0 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Mon, 26 Oct 2020 18:21:16 -0700 Subject: [PATCH 013/180] v0.0.7 Update onboarding (#11) * Update onboarding * v0.0.7 --- src/dydx-client.ts | 2 +- src/modules/keys/impl.ts | 42 ++++++++++++++++++++++++++++++---- src/modules/onboarding/impl.ts | 39 ++++++++++++++++++++++++++++++- src/modules/private/impl.ts | 26 ++++++++++++--------- 4 files changed, 91 insertions(+), 18 deletions(-) diff --git a/src/dydx-client.ts b/src/dydx-client.ts index 5e23bdc..3e46367 100644 --- a/src/dydx-client.ts +++ b/src/dydx-client.ts @@ -102,7 +102,7 @@ export default class DydxClient { get onboarding(): Onboarding { if (!this._onboarding) { if (this.web3Provider) { - this._onboarding = new Onboarding(this.web3Provider); + this._onboarding = new Onboarding(this.host, this.web3Provider); } else { return onboardingNotSupported; } diff --git a/src/modules/keys/impl.ts b/src/modules/keys/impl.ts index 1146f77..acb061e 100644 --- a/src/modules/keys/impl.ts +++ b/src/modules/keys/impl.ts @@ -15,15 +15,19 @@ export default class Keys { this.web3Provider = web3Provider; } - protected async post( + // ============ Request Helpers ============ + + protected async request( + method: RequestMethod, endpoint: string, - data: {}, + // TODO: Get ethereumAddress from the provider (same address used for signing). ethereumAddress: string, + data?: {}, ): Promise<{}> { const url: string = `/v3/${endpoint}`; return axiosRequest({ url: `${this.host}${url}`, - method: RequestMethod.POST, + method, data, headers: { 'DYDX-ETHEREUM-ADDRESS': ethereumAddress, @@ -31,13 +35,41 @@ export default class Keys { }); } - getApiKeys(): void {} + protected async get( + endpoint: string, + ethereumAddress: string, + ): Promise<{}> { + return this.request(RequestMethod.GET, endpoint, ethereumAddress); + } + + protected async post( + endpoint: string, + ethereumAddress: string, + data: {}, + ): Promise<{}> { + return this.request(RequestMethod.POST, endpoint, ethereumAddress, data); + } + + protected async delete( + endpoint: string, + ethereumAddress: string, + ): Promise<{}> { + return this.request(RequestMethod.DELETE, endpoint, ethereumAddress); + } + + // ============ Requests ============ + + getApiKeys( + ethereumAddress: string, + ): Promise<{}> { + return this.get('api-keys', ethereumAddress); + } async registerApiKey( apiKey: string, ethereumAddress: string, ): Promise<{}> { - return this.post('api-keys', { apiKey }, ethereumAddress); + return this.post('api-keys', ethereumAddress, { apiKey }); } deleteApiKey(): void {} diff --git a/src/modules/onboarding/impl.ts b/src/modules/onboarding/impl.ts index c55159b..5d1fe98 100644 --- a/src/modules/onboarding/impl.ts +++ b/src/modules/onboarding/impl.ts @@ -1,11 +1,48 @@ +import { + RequestMethod, + axiosRequest, +} from '../../lib/axios'; + export default class Onboarding { + readonly host: string; readonly web3Provider: {}; constructor( + host: string, web3Provider: {}, ) { + this.host = host; this.web3Provider = web3Provider; } - createUser(): void { } + protected async post( + endpoint: string, + data: {}, + // TODO: Get ethereumAddress from the provider (same address used for signing). + ethereumAddress: string, + ): Promise<{}> { + const url: string = `/v3/${endpoint}`; + return axiosRequest({ + url: `${this.host}${url}`, + method: RequestMethod.POST, + data, + headers: { + 'DYDX-ETHEREUM-ADDRESS': ethereumAddress, + }, + }); + } + + createUser( + params: { + starkKey: string, + apiKey: string, + }, + ethereumAddress: string, + ): Promise<{}> { + return this.post( + 'onboarding', + params, + ethereumAddress, + ); + } } diff --git a/src/modules/private/impl.ts b/src/modules/private/impl.ts index f36d37f..2f0cf1d 100644 --- a/src/modules/private/impl.ts +++ b/src/modules/private/impl.ts @@ -56,8 +56,8 @@ export default class Private { // ============ Request Helpers ============ protected async request( - endpoint: string, method: RequestMethod, + endpoint: string, data?: {}, ): Promise<{}> { const requestPath = `/v3/${endpoint}`; @@ -83,20 +83,27 @@ export default class Private { protected async get( endpoint: string, ): Promise<{}> { - return this.request(endpoint, RequestMethod.GET); + return this.request(RequestMethod.GET, endpoint); } protected async post( endpoint: string, data: {}, ): Promise<{}> { - return this.request(endpoint, RequestMethod.POST, data); + return this.request(RequestMethod.POST, endpoint, data); + } + + protected async put( + endpoint: string, + data: {}, + ): Promise<{}> { + return this.request(RequestMethod.PUT, endpoint, data); } protected async delete( endpoint: string, ): Promise<{}> { - return this.request(endpoint, RequestMethod.DELETE); + return this.request(RequestMethod.DELETE, endpoint); } // ============ Requests ============ @@ -107,20 +114,17 @@ export default class Private { ); } - // TODO: Remove. - async createUser( - userData?: {}, + async updateUser( + userData: {}, ): Promise<{}> { - return this.post( + return this.put( 'users', { - userData, + userData: JSON.stringify(userData), }, ); } - async updateUser(): Promise {} // NOT in Librarian yet - async createAccount( starkKey: string, ): Promise<{}> { From a3d894febeff995840e26e9beffa6416907ee5b8 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Mon, 26 Oct 2020 18:46:18 -0700 Subject: [PATCH 014/180] Add async --- src/modules/onboarding/impl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/onboarding/impl.ts b/src/modules/onboarding/impl.ts index 5d1fe98..023d05d 100644 --- a/src/modules/onboarding/impl.ts +++ b/src/modules/onboarding/impl.ts @@ -32,7 +32,7 @@ export default class Onboarding { }); } - createUser( + async createUser( params: { starkKey: string, apiKey: string, From 2d8738c5dda543d7eaa371119ab5a9f9e6765e6f Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Mon, 26 Oct 2020 18:46:44 -0700 Subject: [PATCH 015/180] v0.0.8 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3d88657..9375db3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.7", + "version": "0.0.8", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0e8165a..0fbba59 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.7", + "version": "0.0.8", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { From 471d06f842ae7e01f1f97cea045b83f286dfcfd7 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Tue, 27 Oct 2020 15:28:30 -0700 Subject: [PATCH 016/180] v0.0.9: Add public/private endpoints [BAC-532] (#13) * add endpoints * update for public/private endpoints * ks1 --- package-lock.json | 2 +- package.json | 2 +- src/helpers/request-helpers.ts | 11 ++++++ src/modules/private/impl.ts | 68 +++++++++++++++++++++++----------- src/modules/public/impl.ts | 59 +++++++++++++---------------- 5 files changed, 84 insertions(+), 58 deletions(-) create mode 100644 src/helpers/request-helpers.ts diff --git a/package-lock.json b/package-lock.json index 9375db3..fa42282 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.8", + "version": "0.0.9", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0fbba59..a671e7a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.8", + "version": "0.0.9", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/helpers/request-helpers.ts b/src/helpers/request-helpers.ts new file mode 100644 index 0000000..22ded14 --- /dev/null +++ b/src/helpers/request-helpers.ts @@ -0,0 +1,11 @@ +export function generateQueryPath(url: string, params: {}): string { + const entries = Object.entries(params); + if (!entries.length) { + return url; + } + + const paramsString = entries.map( + (kv) => `${kv[0]}=${kv[1]}`, + ).join('&'); + return `${url}?${paramsString}`; +} diff --git a/src/modules/private/impl.ts b/src/modules/private/impl.ts index 2f0cf1d..19da770 100644 --- a/src/modules/private/impl.ts +++ b/src/modules/private/impl.ts @@ -12,6 +12,7 @@ import { Withdrawal as StarkExWithdrawal, } from '@dydxprotocol/starkex-lib'; +import { generateQueryPath } from '../../helpers/request-helpers'; import { RequestMethod, axiosRequest, @@ -82,8 +83,9 @@ export default class Private { protected async get( endpoint: string, + params: {}, ): Promise<{}> { - return this.request(RequestMethod.GET, endpoint); + return this.request(RequestMethod.GET, generateQueryPath(endpoint, params)); } protected async post( @@ -102,24 +104,41 @@ export default class Private { protected async delete( endpoint: string, + params: {}, ): Promise<{}> { - return this.request(RequestMethod.DELETE, endpoint); + return this.request(RequestMethod.DELETE, generateQueryPath(endpoint, params)); } // ============ Requests ============ + async getRegistration(): Promise<{}> { + return this.get( + 'registration', + {}, + ); + } + async getUser(): Promise<{}> { return this.get( 'users', + {}, ); } - async updateUser( + async updateUser({ + email, + username, + userData, + }: { + email: string, + username: string, userData: {}, - ): Promise<{}> { + }): Promise<{}> { return this.put( 'users', { + email, + username, userData: JSON.stringify(userData), }, ); @@ -139,6 +158,14 @@ export default class Private { async getAccount(ethereumAddress: string): Promise<{}> { return this.get( `accounts/${getAccountId({ address: ethereumAddress })}`, + {}, + ); + } + + async getAccounts(): Promise<{}> { + return this.get( + 'accounts', + {}, ); } @@ -151,7 +178,8 @@ export default class Private { }, ): Promise<{}> { return this.get( - this.generateQueryPath('positions', params), + 'positions', + params, ); } @@ -166,19 +194,22 @@ export default class Private { } = {}, ): Promise<{}[]> { return this.get( - this.generateQueryPath('orders', params), + 'orders', + params, ) as unknown as {}[]; } async getOrderById(orderId: string): Promise<{}> { return this.get( `orders/${orderId}`, + {}, ); } async getOrderByClientId(clientId: string): Promise<{}> { return this.get( `orders/client/${clientId}`, + {}, ); } @@ -225,13 +256,15 @@ export default class Private { async cancelOrder(orderId: string): Promise<{}> { return this.delete( `orders/${orderId}`, + {}, ); } async cancelAllOrders(market?: Market): Promise<{}> { const params = market ? { market } : {}; return this.delete( - this.generateQueryPath('orders', params), + 'orders', + params, ); } @@ -244,7 +277,8 @@ export default class Private { }, ): Promise<{}> { return this.get( - this.generateQueryPath('fills', params), + 'fills', + params, ); } @@ -256,7 +290,8 @@ export default class Private { }, ): Promise<{}> { return this.get( - this.generateQueryPath('transfers', params), + 'transfers', + params, ); } @@ -322,7 +357,8 @@ export default class Private { }, ): Promise<{}> { return this.get( - this.generateQueryPath('funding', params), + 'funding', + params, ); } @@ -352,16 +388,4 @@ export default class Private { expiresAt, }).sign(this.apiKeyPair.privateKey); } - - private generateQueryPath(url: string, params: {}): string { - const entries = Object.entries(params); - if (!entries.length) { - return url; - } - - const paramsString = entries.map( - (kv) => `${kv[0]}=${kv[1]}`, - ).join('&'); - return `${url}?${paramsString}`; - } } diff --git a/src/modules/public/impl.ts b/src/modules/public/impl.ts index 9619c93..75a5512 100644 --- a/src/modules/public/impl.ts +++ b/src/modules/public/impl.ts @@ -1,3 +1,4 @@ +import { generateQueryPath } from '../../helpers/request-helpers'; import { axiosRequest } from '../../lib/axios'; import { ISO8601, Market, MarketStatisticDay } from '../../types'; @@ -8,31 +9,27 @@ export default class Public { this.host = host; } - getAccount( - accountId: string, - ethereumAddress: string, // TODO: Should not require this. + checkIfUserExists( + ethereumAddress: string, ): Promise<{}> { - const uri: string = `v3/accounts/${accountId}`; - return this.sendPublicGetRequest( - uri, - { - owner: ethereumAddress, - }, - ); + const uri: string = 'v3/users/exists'; + return this.sendPublicGetRequest(uri, { ethereumAddress }); } - getMarkets(market?: Market): Promise<{}> { - let uri: string = 'v3/markets'; - - if (market) { - uri = uri.concat(`?market=${market}`); - } + checkIfUsernameExists( + username: string, + ): Promise<{}> { + const uri: string = 'v3/usernames'; + return this.sendPublicGetRequest(uri, { username }); + } - return this.sendPublicGetRequest(uri); + getMarkets(market?: Market): Promise<{}> { + const uri: string = 'v3/markets'; + return this.sendPublicGetRequest(uri, { market }); } getOrderBook(market: Market): Promise<{}> { - return this.sendPublicGetRequest(`v3/orderbook/${market}`); + return this.sendPublicGetRequest(`v3/orderbook/${market}`, {}); } getStats({ @@ -42,13 +39,9 @@ export default class Public { market: Market, days?: MarketStatisticDay, }): Promise<{}> { - let uri: string = `v3/stats/${market}`; - - if (days) { - uri = uri.concat(`?days=${days}`); - } + const uri: string = `v3/stats/${market}`; - return this.sendPublicGetRequest(uri); + return this.sendPublicGetRequest(uri, { days }); } getTrades({ @@ -58,27 +51,25 @@ export default class Public { market: Market, startingBeforeOrAt?: ISO8601, }): Promise<{}> { - let uri: string = `v3/trades/${market}`; + const uri: string = `v3/trades/${market}`; - if (startingBeforeOrAt) { - uri = uri.concat(`?startingBeforeOrAt=${startingBeforeOrAt}`); - } + return this.sendPublicGetRequest(uri, { startingBeforeOrAt }); - return this.sendPublicGetRequest(uri); } - getHistoricalFunding(market: Market): Promise<{}> { - return this.sendPublicGetRequest(`v3/historical-funding/${market}`); + getHistoricalFunding(market: Market, effectiveBeforeOrAt: ISO8601): Promise<{}> { + const uri: string = `v3/historical-funding/${market}`; + + return this.sendPublicGetRequest(uri, { effectiveBeforeOrAt }); } private sendPublicGetRequest( requestPath: string, - headers: {} = {}, + params: {}, ): Promise<{}> { return axiosRequest({ method: 'GET', - headers, - url: `${this.host}/${requestPath}`, + url: `${this.host}/${generateQueryPath(requestPath, params)}`, }); } } From cd0a923942a6213dc644544a0b51dbcb5c05c5e8 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Tue, 27 Oct 2020 16:07:54 -0700 Subject: [PATCH 017/180] v0.0.10: sign onboarding (#12) * sign onboarding * ks1 --- package-lock.json | 2076 ++++++++++++++++++++++++++++++-- package.json | 6 +- src/dydx-client.ts | 21 +- src/lib/constants.ts | 1 + src/modules/eth/impl.ts | 8 +- src/modules/keys/impl.ts | 8 +- src/modules/onboarding/impl.ts | 21 +- src/types.ts | 3 + 8 files changed, 1995 insertions(+), 149 deletions(-) create mode 100644 src/lib/constants.ts diff --git a/package-lock.json b/package-lock.json index fa42282..89b4798 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.9", + "version": "0.0.10", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -509,6 +509,219 @@ } } }, + "@ethersproject/abi": { + "version": "5.0.0-beta.153", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz", + "integrity": "sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==", + "requires": { + "@ethersproject/address": ">=5.0.0-beta.128", + "@ethersproject/bignumber": ">=5.0.0-beta.130", + "@ethersproject/bytes": ">=5.0.0-beta.129", + "@ethersproject/constants": ">=5.0.0-beta.128", + "@ethersproject/hash": ">=5.0.0-beta.128", + "@ethersproject/keccak256": ">=5.0.0-beta.127", + "@ethersproject/logger": ">=5.0.0-beta.129", + "@ethersproject/properties": ">=5.0.0-beta.131", + "@ethersproject/strings": ">=5.0.0-beta.130" + } + }, + "@ethersproject/abstract-provider": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.0.5.tgz", + "integrity": "sha512-i/CjElAkzV7vQBAeoz+IpjGfcFYEP9eD7j3fzZ0fzTq03DO7PPnR+xkEZ1IoDXGwDS+55aLM1xvLDwB/Lx6IOQ==", + "requires": { + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/networks": "^5.0.3", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/transactions": "^5.0.5", + "@ethersproject/web": "^5.0.6" + } + }, + "@ethersproject/abstract-signer": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.0.7.tgz", + "integrity": "sha512-8W8gy/QutEL60EoMEpvxZ8MFAEWs/JvH5nmZ6xeLXoZvmBCasGmxqHdYjo2cxg0nevkPkq9SeenSsBBZSCx+SQ==", + "requires": { + "@ethersproject/abstract-provider": "^5.0.4", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3" + } + }, + "@ethersproject/address": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.5.tgz", + "integrity": "sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA==", + "requires": { + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/rlp": "^5.0.3", + "bn.js": "^4.4.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "@ethersproject/base64": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.0.4.tgz", + "integrity": "sha512-4KRykQ7BQMeOXfvio1YITwHjxwBzh92UoXIdzxDE1p53CK28bbHPdsPNYo0wl0El7lJAMpT2SOdL0hhbWRnyIA==", + "requires": { + "@ethersproject/bytes": "^5.0.4" + } + }, + "@ethersproject/bignumber": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", + "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", + "requires": { + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/logger": "^5.0.5", + "bn.js": "^4.4.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "@ethersproject/bytes": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", + "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", + "requires": { + "@ethersproject/logger": "^5.0.5" + } + }, + "@ethersproject/constants": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.5.tgz", + "integrity": "sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA==", + "requires": { + "@ethersproject/bignumber": "^5.0.7" + } + }, + "@ethersproject/hash": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.6.tgz", + "integrity": "sha512-Gvh57v6BWhwnud6l7tMfQm32PRQ2DYx2WaAAQmAxAfYvmzUkpQCBstnGeNMXIL8/2wdkvcB2u+WZRWaZtsFuUQ==", + "requires": { + "@ethersproject/abstract-signer": "^5.0.6", + "@ethersproject/address": "^5.0.5", + "@ethersproject/bignumber": "^5.0.8", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.4", + "@ethersproject/strings": "^5.0.4" + } + }, + "@ethersproject/keccak256": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.4.tgz", + "integrity": "sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ==", + "requires": { + "@ethersproject/bytes": "^5.0.4", + "js-sha3": "0.5.7" + }, + "dependencies": { + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + } + } + }, + "@ethersproject/logger": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", + "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==" + }, + "@ethersproject/networks": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.0.4.tgz", + "integrity": "sha512-/wHDTRms5mpJ09BoDrbNdFWINzONe05wZRgohCXvEv39rrH/Gd/yAnct8wC0RsW3tmFOgjgQxuBvypIxuUynTw==", + "requires": { + "@ethersproject/logger": "^5.0.5" + } + }, + "@ethersproject/properties": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", + "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", + "requires": { + "@ethersproject/logger": "^5.0.5" + } + }, + "@ethersproject/rlp": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.4.tgz", + "integrity": "sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ==", + "requires": { + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/logger": "^5.0.5" + } + }, + "@ethersproject/signing-key": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.5.tgz", + "integrity": "sha512-Z1wY7JC1HVO4CvQWY2TyTTuAr8xK3bJijZw1a9G92JEmKdv1j255R/0YLBBcFTl2J65LUjtXynNJ2GbArPGi5g==", + "requires": { + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "elliptic": "6.5.3" + } + }, + "@ethersproject/strings": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.5.tgz", + "integrity": "sha512-JED6WaIV00xM/gvj8vSnd+0VWtDYdidTmavFRCTQakqfz+4tDo6Jz5LHgG+dd45h7ah7ykCHW0C7ZXWEDROCXQ==", + "requires": { + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/logger": "^5.0.5" + } + }, + "@ethersproject/transactions": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.6.tgz", + "integrity": "sha512-htsFhOD+NMBxx676A8ehSuwVV49iqpSB+CkjPZ02tpNew0K6p8g0CZ46Z1ZP946gIHAU80xQ0NACHYrjIUaCFA==", + "requires": { + "@ethersproject/address": "^5.0.4", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/rlp": "^5.0.3", + "@ethersproject/signing-key": "^5.0.4" + } + }, + "@ethersproject/web": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.0.9.tgz", + "integrity": "sha512-//QNlv1MSkOII1hv3+HQwWoiVFS+BMVGI0KYeUww4cyrEktnx1QIez5bTSab9s9fWTFaWKNmQNBwMbxAqPuYDw==", + "requires": { + "@ethersproject/base64": "^5.0.3", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/strings": "^5.0.4" + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -817,8 +1030,7 @@ "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, "@sinonjs/commons": { "version": "1.8.1", @@ -842,7 +1054,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, "requires": { "defer-to-connect": "^1.0.1" } @@ -1015,12 +1226,26 @@ "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, + "@types/underscore": { + "version": "1.10.24", + "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.10.24.tgz", + "integrity": "sha512-T3NQD8hXNW2sRsSbLNjF/aBo18MyJlbw0lSpQHB/eZZtScPdexN4HSa8cByYwTw9Wy7KuOFr81mlDQcQQaZ79w==" + }, "@types/uuid": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", "dev": true }, + "@types/web3": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/@types/web3/-/web3-1.0.18.tgz", + "integrity": "sha512-uXQL0LDszt2f476LEmYM6AvSv9F4vU4hWQvlUhwfLHNlIB6OyBXoYsCzWAIhhnc5U0HA7ZBcPybxRJ/yfA6THg==", + "requires": { + "@types/bn.js": "*", + "@types/underscore": "*" + } + }, "@types/yargs": { "version": "15.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", @@ -1182,6 +1407,15 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -1219,7 +1453,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1311,6 +1544,11 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, "array-includes": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", @@ -1390,16 +1628,32 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, "requires": { "safer-buffer": "~2.1.0" } }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assign-symbols": { "version": "1.0.0", @@ -1413,11 +1667,15 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { "version": "2.1.2", @@ -1428,14 +1686,12 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", - "dev": true + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" }, "axios": { "version": "0.19.2", @@ -1584,11 +1840,15 @@ "safe-buffer": "^5.0.1" } }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -1598,6 +1858,11 @@ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, + "bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" + }, "binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", @@ -1627,11 +1892,48 @@ "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=" }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, "bn.js": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } + } + }, "boxen": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", @@ -1726,6 +2028,59 @@ "safe-buffer": "^5.0.1" } }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, "bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -1753,17 +2108,51 @@ "node-int64": "^0.4.0" } }, + "buffer": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.1.tgz", + "integrity": "sha512-2z15UUHpS9/3tk9mY/q+Rl3rydOi7yMp5XWNQnRvoz+mJwiv8brqYwp9a+nOCtma6dwuEIxljD8W3ysVBZ05Vg==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, + "bufferutil": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.1.tgz", + "integrity": "sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA==", + "requires": { + "node-gyp-build": "~3.7.0" + }, + "dependencies": { + "node-gyp-build": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz", + "integrity": "sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==" + } + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -1785,7 +2174,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -1800,7 +2188,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, "requires": { "pump": "^3.0.0" } @@ -1808,8 +2195,7 @@ "lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" } } }, @@ -1837,8 +2223,7 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chalk": { "version": "4.1.0", @@ -1872,12 +2257,40 @@ "readdirp": "~3.5.0" } }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, + "cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "requires": { + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" + }, + "dependencies": { + "multicodec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "requires": { + "buffer": "^5.6.0", + "varint": "^5.0.0" + } + } + } + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -1893,6 +2306,11 @@ "integrity": "sha512-5RLK0Qfs0PNDpEyBXIr3bIT1Muw3ojSlvpw6dAmkUcO0+uTrsBn7GuEIgx40u+OzbCBLDta7nvmud85P4EmTsQ==", "dev": true }, + "class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -1962,7 +2380,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, "requires": { "mimic-response": "^1.0.0" } @@ -2008,7 +2425,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -2051,6 +2467,36 @@ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "requires": { + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -2068,6 +2514,21 @@ } } }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -2077,8 +2538,16 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } }, "coveralls": { "version": "3.1.0", @@ -2093,6 +2562,22 @@ "request": "^2.88.2" } }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -2129,6 +2614,24 @@ "which": "^2.0.1" } }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -2158,11 +2661,19 @@ } } }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -2201,14 +2712,12 @@ "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, "requires": { "mimic-response": "^1.0.0" } @@ -2234,8 +2743,7 @@ "defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, "define-properties": { "version": "1.1.3", @@ -2290,8 +2798,26 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-newline": { "version": "3.1.0", @@ -2305,6 +2831,23 @@ "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==", "dev": true }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -2323,6 +2866,11 @@ "esutils": "^2.0.2" } }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, "domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -2367,19 +2915,22 @@ "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, "elliptic": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", @@ -2430,11 +2981,15 @@ } } }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -2488,11 +3043,45 @@ "is-symbol": "^1.0.2" } }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", @@ -2923,6 +3512,70 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", + "requires": { + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + }, + "dependencies": { + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + } + } + }, + "eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "ethereum-bloom-filters": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz", + "integrity": "sha512-cDcJJSJ9GMAcURiAWO3DxIEhTL/uWqlQnvgKpuYQzYPrt/izuGU+1ntQmHt0IRq6ADoSYHFnB+aCEFIldjhkMQ==", + "requires": { + "js-sha3": "^0.8.0" + } + }, "ethereum-cryptography": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", @@ -2945,6 +3598,41 @@ "setimmediate": "^1.0.5" } }, + "ethereumjs-common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", + "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==" + }, + "ethereumjs-tx": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", + "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", + "requires": { + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + } + } + }, "ethereumjs-util": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.7.tgz", @@ -2980,6 +3668,22 @@ } } }, + "ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "requires": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, "ethjs-util": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", @@ -2989,6 +3693,11 @@ "strip-hex-prefix": "1.0.0" } }, + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -3134,11 +3843,82 @@ "jest-regex-util": "^26.0.0" } }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", @@ -3229,14 +4009,12 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { "version": "3.2.4", @@ -3255,8 +4033,7 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", @@ -3300,6 +4077,30 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -3343,20 +4144,23 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -3366,6 +4170,29 @@ "map-cache": "^0.2.2" } }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3413,7 +4240,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, "requires": { "pump": "^3.0.0" } @@ -3428,7 +4254,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -3456,6 +4281,15 @@ "is-glob": "^4.0.1" } }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + } + }, "global-dirs": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", @@ -3492,7 +4326,6 @@ "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, "requires": { "@sindresorhus/is": "^0.14.0", "@szmarczak/http-timer": "^1.1.2", @@ -3510,8 +4343,7 @@ "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "growly": { "version": "1.3.0", @@ -3523,14 +4355,12 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -3551,12 +4381,25 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + }, "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -3668,14 +4511,36 @@ "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -3692,11 +4557,30 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, + "idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "requires": { + "punycode": "2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" + } + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", @@ -3828,6 +4712,11 @@ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", "dev": true }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -3963,6 +4852,11 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, "is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", @@ -4017,12 +4911,22 @@ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, "is-path-inside": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", "dev": true }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -4047,11 +4951,15 @@ "has-symbols": "^1.0.1" } }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-string": { "version": "1.0.5", @@ -4116,8 +5024,7 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-lib-coverage": { "version": "3.0.0", @@ -4194,6 +5101,15 @@ "istanbul-lib-report": "^3.0.0" } }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, "jest": { "version": "26.6.1", "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.1.tgz", @@ -4797,8 +5713,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsdom": { "version": "16.4.0", @@ -4856,8 +5771,7 @@ "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -4868,14 +5782,12 @@ "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -4886,8 +5798,7 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { "version": "1.0.1", @@ -4898,11 +5809,18 @@ "minimist": "^1.2.0" } }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -4923,7 +5841,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, "requires": { "json-buffer": "3.0.0" } @@ -5020,8 +5937,7 @@ "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "make-dir": { "version": "3.1.0", @@ -5074,6 +5990,16 @@ "safe-buffer": "^5.1.2" } }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -5086,6 +6012,11 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", @@ -5096,17 +6027,36 @@ "picomatch": "^2.0.5" } }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, "mime-db": { "version": "1.44.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" }, "mime-types": { "version": "2.1.27", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, "requires": { "mime-db": "1.44.0" } @@ -5120,8 +6070,15 @@ "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "^0.1.0" + } }, "minimalistic-assert": { "version": "1.0.1", @@ -5145,8 +6102,24 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } }, "mixin-deep": { "version": "1.3.2", @@ -5173,16 +6146,71 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, "requires": { "minimist": "^1.2.5" } }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "requires": { + "mkdirp": "*" + } + }, + "mock-fs": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.13.0.tgz", + "integrity": "sha512-DD0vOdofJdoaRNtnWcrXe6RQbpHkPPmtqGq14uRX0F8ZKJ5nv89CVTYl/BZdppDxBDaV0hl75htg3abpEWlPZA==" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "requires": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "multicodec": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "requires": { + "varint": "^5.0.0" + } + }, + "multihashes": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "requires": { + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" + }, + "dependencies": { + "multibase": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "requires": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + } + } + }, + "nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -5208,6 +6236,16 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -5345,8 +6383,7 @@ "normalize-url": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", - "dev": true + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" }, "npm-run-path": { "version": "2.0.2", @@ -5365,6 +6402,22 @@ } } }, + "number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", + "requires": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -5374,8 +6427,12 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", @@ -5515,11 +6572,26 @@ } } }, + "oboe": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz", + "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=", + "requires": { + "http-https": "^1.0.0" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -5550,8 +6622,7 @@ "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, "p-each-series": { "version": "2.1.0", @@ -5562,8 +6633,7 @@ "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { "version": "1.3.0", @@ -5583,6 +6653,14 @@ "p-limit": "^1.1.0" } }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "requires": { + "p-finally": "^1.0.0" + } + }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", @@ -5618,6 +6696,23 @@ "callsites": "^3.0.0" } }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-headers": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -5633,6 +6728,11 @@ "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "dev": true }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -5663,6 +6763,11 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -5684,8 +6789,7 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "picomatch": { "version": "2.2.2", @@ -5732,8 +6836,7 @@ "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, "pretty-format": { "version": "26.6.1", @@ -5747,6 +6850,11 @@ "react-is": "^17.0.1" } }, + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -5763,11 +6871,19 @@ "sisteransi": "^1.0.5" } }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, "pstree.remy": { "version": "1.1.8", @@ -5775,11 +6891,30 @@ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -5788,8 +6923,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "pupa": { "version": "2.1.1", @@ -5803,8 +6937,17 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } }, "randombytes": { "version": "2.1.0", @@ -5814,6 +6957,31 @@ "safe-buffer": "^5.1.0" } }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -5947,7 +7115,6 @@ "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -5974,8 +7141,7 @@ "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" } } }, @@ -6054,7 +7220,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, "requires": { "lowercase-keys": "^1.0.0" } @@ -6149,8 +7314,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { "version": "4.1.0", @@ -6340,6 +7504,71 @@ } } }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "requires": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -6374,6 +7603,11 @@ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", @@ -6411,6 +7645,21 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -6668,7 +7917,6 @@ "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -6740,12 +7988,22 @@ } } }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, "string-length": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", @@ -6872,6 +8130,70 @@ "supports-color": "^7.0.0" } }, + "swarm-js": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", + "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", + "requires": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^7.1.0", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request": "^1.0.1" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "^1.0.1" + } + } + } + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -6890,6 +8212,20 @@ "string-width": "^3.0.0" } }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, "term-size": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", @@ -6929,6 +8265,11 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -6964,8 +8305,7 @@ "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" }, "to-regex": { "version": "3.0.2", @@ -6988,6 +8328,11 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -7001,7 +8346,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -7047,7 +8391,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -7055,8 +8398,12 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "type-check": { "version": "0.4.0", @@ -7079,6 +8426,15 @@ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -7093,6 +8449,11 @@ "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", "dev": true }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, "undefsafe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", @@ -7113,6 +8474,11 @@ } } }, + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -7134,6 +8500,16 @@ "crypto-random-string": "^2.0.0" } }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -7211,7 +8587,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -7226,17 +8601,41 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, "requires": { "prepend-http": "^2.0.0" } }, + "url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "utf-8-validate": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.2.tgz", + "integrity": "sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw==", + "requires": { + "node-gyp-build": "~3.7.0" + }, + "dependencies": { + "node-gyp-build": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz", + "integrity": "sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==" + } + } + }, "utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", @@ -7247,6 +8646,11 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, "uuid": { "version": "8.3.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", @@ -7288,11 +8692,20 @@ "spdx-expression-parse": "^3.0.0" } }, + "varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -7326,12 +8739,362 @@ "makeerror": "1.0.x" } }, + "web3": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.11.tgz", + "integrity": "sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==", + "requires": { + "web3-bzz": "1.2.11", + "web3-core": "1.2.11", + "web3-eth": "1.2.11", + "web3-eth-personal": "1.2.11", + "web3-net": "1.2.11", + "web3-shh": "1.2.11", + "web3-utils": "1.2.11" + } + }, + "web3-bzz": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.11.tgz", + "integrity": "sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==", + "requires": { + "@types/node": "^12.12.6", + "got": "9.6.0", + "swarm-js": "^0.1.40", + "underscore": "1.9.1" + }, + "dependencies": { + "@types/node": { + "version": "12.19.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.2.tgz", + "integrity": "sha512-SRH6QM0IMOBBFmDiJ75vlhcbUEYEquvSuhsVW9ijG20JvdFTfOrB1p6ddZxz5y/JNnbf+9HoHhjhOVSX2hsJyA==" + } + } + }, + "web3-core": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.11.tgz", + "integrity": "sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==", + "requires": { + "@types/bn.js": "^4.11.5", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.2.11", + "web3-core-method": "1.2.11", + "web3-core-requestmanager": "1.2.11", + "web3-utils": "1.2.11" + }, + "dependencies": { + "@types/node": { + "version": "12.19.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.2.tgz", + "integrity": "sha512-SRH6QM0IMOBBFmDiJ75vlhcbUEYEquvSuhsVW9ijG20JvdFTfOrB1p6ddZxz5y/JNnbf+9HoHhjhOVSX2hsJyA==" + } + } + }, + "web3-core-helpers": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz", + "integrity": "sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==", + "requires": { + "underscore": "1.9.1", + "web3-eth-iban": "1.2.11", + "web3-utils": "1.2.11" + } + }, + "web3-core-method": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.11.tgz", + "integrity": "sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==", + "requires": { + "@ethersproject/transactions": "^5.0.0-beta.135", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.11", + "web3-core-promievent": "1.2.11", + "web3-core-subscriptions": "1.2.11", + "web3-utils": "1.2.11" + } + }, + "web3-core-promievent": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz", + "integrity": "sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==", + "requires": { + "eventemitter3": "4.0.4" + } + }, + "web3-core-requestmanager": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz", + "integrity": "sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==", + "requires": { + "underscore": "1.9.1", + "web3-core-helpers": "1.2.11", + "web3-providers-http": "1.2.11", + "web3-providers-ipc": "1.2.11", + "web3-providers-ws": "1.2.11" + } + }, + "web3-core-subscriptions": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz", + "integrity": "sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==", + "requires": { + "eventemitter3": "4.0.4", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.11" + } + }, + "web3-eth": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.11.tgz", + "integrity": "sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==", + "requires": { + "underscore": "1.9.1", + "web3-core": "1.2.11", + "web3-core-helpers": "1.2.11", + "web3-core-method": "1.2.11", + "web3-core-subscriptions": "1.2.11", + "web3-eth-abi": "1.2.11", + "web3-eth-accounts": "1.2.11", + "web3-eth-contract": "1.2.11", + "web3-eth-ens": "1.2.11", + "web3-eth-iban": "1.2.11", + "web3-eth-personal": "1.2.11", + "web3-net": "1.2.11", + "web3-utils": "1.2.11" + } + }, + "web3-eth-abi": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz", + "integrity": "sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==", + "requires": { + "@ethersproject/abi": "5.0.0-beta.153", + "underscore": "1.9.1", + "web3-utils": "1.2.11" + } + }, + "web3-eth-accounts": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz", + "integrity": "sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==", + "requires": { + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.8", + "ethereumjs-common": "^1.3.2", + "ethereumjs-tx": "^2.1.1", + "scrypt-js": "^3.0.1", + "underscore": "1.9.1", + "uuid": "3.3.2", + "web3-core": "1.2.11", + "web3-core-helpers": "1.2.11", + "web3-core-method": "1.2.11", + "web3-utils": "1.2.11" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } + } + }, + "web3-eth-contract": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz", + "integrity": "sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==", + "requires": { + "@types/bn.js": "^4.11.5", + "underscore": "1.9.1", + "web3-core": "1.2.11", + "web3-core-helpers": "1.2.11", + "web3-core-method": "1.2.11", + "web3-core-promievent": "1.2.11", + "web3-core-subscriptions": "1.2.11", + "web3-eth-abi": "1.2.11", + "web3-utils": "1.2.11" + } + }, + "web3-eth-ens": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz", + "integrity": "sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==", + "requires": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "underscore": "1.9.1", + "web3-core": "1.2.11", + "web3-core-helpers": "1.2.11", + "web3-core-promievent": "1.2.11", + "web3-eth-abi": "1.2.11", + "web3-eth-contract": "1.2.11", + "web3-utils": "1.2.11" + } + }, + "web3-eth-iban": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz", + "integrity": "sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==", + "requires": { + "bn.js": "^4.11.9", + "web3-utils": "1.2.11" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "web3-eth-personal": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz", + "integrity": "sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==", + "requires": { + "@types/node": "^12.12.6", + "web3-core": "1.2.11", + "web3-core-helpers": "1.2.11", + "web3-core-method": "1.2.11", + "web3-net": "1.2.11", + "web3-utils": "1.2.11" + }, + "dependencies": { + "@types/node": { + "version": "12.19.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.2.tgz", + "integrity": "sha512-SRH6QM0IMOBBFmDiJ75vlhcbUEYEquvSuhsVW9ijG20JvdFTfOrB1p6ddZxz5y/JNnbf+9HoHhjhOVSX2hsJyA==" + } + } + }, + "web3-net": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.11.tgz", + "integrity": "sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==", + "requires": { + "web3-core": "1.2.11", + "web3-core-method": "1.2.11", + "web3-utils": "1.2.11" + } + }, + "web3-providers-http": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.11.tgz", + "integrity": "sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==", + "requires": { + "web3-core-helpers": "1.2.11", + "xhr2-cookies": "1.1.0" + } + }, + "web3-providers-ipc": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz", + "integrity": "sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==", + "requires": { + "oboe": "2.1.4", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.11" + } + }, + "web3-providers-ws": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz", + "integrity": "sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==", + "requires": { + "eventemitter3": "4.0.4", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.11", + "websocket": "^1.0.31" + } + }, + "web3-shh": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.11.tgz", + "integrity": "sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==", + "requires": { + "web3-core": "1.2.11", + "web3-core-method": "1.2.11", + "web3-core-subscriptions": "1.2.11", + "web3-net": "1.2.11" + } + }, + "web3-utils": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", + "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.9.1", + "utf8": "3.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + } + } + }, "webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true }, + "websocket": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.32.tgz", + "integrity": "sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==", + "requires": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -7452,8 +9215,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "1.0.3", @@ -7488,6 +9250,47 @@ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true }, + "xhr": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", + "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "requires": { + "global": "~4.3.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "requires": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" + } + }, + "xhr-request-promise": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "requires": { + "xhr-request": "^1.1.0" + } + }, + "xhr2-cookies": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", + "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", + "requires": { + "cookiejar": "^2.1.1" + } + }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -7500,12 +9303,27 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, "yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", diff --git a/package.json b/package.json index a671e7a..f441943 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.9", + "version": "0.0.10", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,9 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-lib": "^0.2.4", - "axios": "^0.19.0" + "@types/web3": "1.0.18", + "axios": "^0.19.0", + "web3": "1.2.11" }, "devDependencies": { "@types/uuid": "^8.3.0", diff --git a/src/dydx-client.ts b/src/dydx-client.ts index 3e46367..c72338e 100644 --- a/src/dydx-client.ts +++ b/src/dydx-client.ts @@ -1,6 +1,7 @@ import { KeyPair, } from '@dydxprotocol/starkex-lib'; +import Web3 from 'web3'; import { Eth, @@ -21,12 +22,13 @@ import { import { Public, } from './modules/public'; +import { Provider } from './types'; export interface ClientOptions { apiTimeout?: number; apiPrivateKey?: string | KeyPair; starkPrivateKey?: string | KeyPair; - web3Provider?: {}; + web3Provider?: Provider; } export default class DydxClient { @@ -34,7 +36,7 @@ export default class DydxClient { readonly apiTimeout?: number; readonly apiPrivateKey?: string | KeyPair; readonly starkPrivateKey?: string | KeyPair; - readonly web3Provider?: {}; + readonly web3?: Web3; // Modules. Except for `public`, these are created on-demand. private readonly _public: Public; @@ -51,7 +53,8 @@ export default class DydxClient { this.apiTimeout = options.apiTimeout; this.apiPrivateKey = options.apiPrivateKey; this.starkPrivateKey = options.starkPrivateKey; - this.web3Provider = options.web3Provider; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + this.web3 = new Web3(options.web3Provider as any); // Modules. this._public = new Public(host); @@ -87,8 +90,8 @@ export default class DydxClient { */ get keys(): Keys { if (!this._keys) { - if (this.web3Provider) { - this._keys = new Keys(this.host, this.web3Provider); + if (this.web3) { + this._keys = new Keys(this.host, this.web3); } else { return keysNotSupported; } @@ -101,8 +104,8 @@ export default class DydxClient { */ get onboarding(): Onboarding { if (!this._onboarding) { - if (this.web3Provider) { - this._onboarding = new Onboarding(this.host, this.web3Provider); + if (this.web3) { + this._onboarding = new Onboarding(this.host, this.web3); } else { return onboardingNotSupported; } @@ -115,8 +118,8 @@ export default class DydxClient { */ get eth() { if (!this._eth) { - if (this.web3Provider) { - this._eth = new Eth(this.web3Provider); + if (this.web3) { + this._eth = new Eth(this.web3); } else { return ethNotSupported; } diff --git a/src/lib/constants.ts b/src/lib/constants.ts new file mode 100644 index 0000000..db81d23 --- /dev/null +++ b/src/lib/constants.ts @@ -0,0 +1 @@ +export const ONBOARDING_STATIC_STRING: string = 'DYDX-ONBOARDING'; diff --git a/src/modules/eth/impl.ts b/src/modules/eth/impl.ts index 9d70d39..aa06e9f 100644 --- a/src/modules/eth/impl.ts +++ b/src/modules/eth/impl.ts @@ -1,9 +1,11 @@ +import Web3 from 'web3'; + export default class Eth { - readonly web3Provider: {}; + readonly web3: Web3; constructor( - web3Provider: {}, + web3: Web3, ) { - this.web3Provider = web3Provider; + this.web3 = web3; } } diff --git a/src/modules/keys/impl.ts b/src/modules/keys/impl.ts index acb061e..0b646ee 100644 --- a/src/modules/keys/impl.ts +++ b/src/modules/keys/impl.ts @@ -1,3 +1,5 @@ +import Web3 from 'web3'; + import { RequestMethod, axiosRequest, @@ -5,14 +7,14 @@ import { export default class Keys { readonly host: string; - readonly web3Provider: {}; + readonly web3: Web3; constructor( host: string, - web3Provider: {}, + web3: Web3, ) { this.host = host; - this.web3Provider = web3Provider; + this.web3 = web3; } // ============ Request Helpers ============ diff --git a/src/modules/onboarding/impl.ts b/src/modules/onboarding/impl.ts index 023d05d..4aaa4de 100644 --- a/src/modules/onboarding/impl.ts +++ b/src/modules/onboarding/impl.ts @@ -1,18 +1,21 @@ +import Web3 from 'web3'; + import { RequestMethod, axiosRequest, } from '../../lib/axios'; +import { ONBOARDING_STATIC_STRING } from '../../lib/constants'; export default class Onboarding { readonly host: string; - readonly web3Provider: {}; + readonly web3: Web3; constructor( host: string, - web3Provider: {}, + web3: Web3, ) { this.host = host; - this.web3Provider = web3Provider; + this.web3 = web3; } protected async post( @@ -21,12 +24,15 @@ export default class Onboarding { // TODO: Get ethereumAddress from the provider (same address used for signing). ethereumAddress: string, ): Promise<{}> { + const signature: string = await this.signRequest(ethereumAddress); + const url: string = `/v3/${endpoint}`; return axiosRequest({ url: `${this.host}${url}`, method: RequestMethod.POST, data, headers: { + 'DYDX-SIGNATURE': signature, 'DYDX-ETHEREUM-ADDRESS': ethereumAddress, }, }); @@ -45,4 +51,13 @@ export default class Onboarding { ethereumAddress, ); } + + async signRequest(address: string): Promise { + const onboardingHash: string | null = this.web3.utils.sha3(ONBOARDING_STATIC_STRING); + if (!onboardingHash) { + throw new Error(`Could not generate an onboarding hash for address: ${address}`); + } + + return this.web3.eth.sign(onboardingHash, address); + } } diff --git a/src/types.ts b/src/types.ts index 62bdf29..1093f05 100644 --- a/src/types.ts +++ b/src/types.ts @@ -3,11 +3,14 @@ import { OrderSide, PerpetualMarket, } from '@dydxprotocol/starkex-lib'; +import { HttpProvider, IpcProvider, WebsocketProvider } from 'web3/providers'; export { Asset, OrderSide } from '@dydxprotocol/starkex-lib'; export type ISO8601 = string; +export type Provider = HttpProvider | IpcProvider | WebsocketProvider; + // ============ Enums ============ export type Market = PerpetualMarket; From c2dc1ea1072013667b0bf8023360305ca22dd746 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Tue, 27 Oct 2020 17:52:19 -0700 Subject: [PATCH 018/180] v0.0.11: add key validation [BAC-531] (#14) * add key validation * ks1 --- package-lock.json | 2 +- package.json | 2 +- src/modules/keys/impl.ts | 51 ++++++++++++++++++++++++++++++++-- src/modules/onboarding/impl.ts | 7 +++++ 4 files changed, 58 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 89b4798..a2fca43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.10", + "version": "0.0.11", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f441943..a436e9b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.10", + "version": "0.0.11", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/keys/impl.ts b/src/modules/keys/impl.ts index 0b646ee..86db953 100644 --- a/src/modules/keys/impl.ts +++ b/src/modules/keys/impl.ts @@ -1,9 +1,11 @@ import Web3 from 'web3'; +import { generateQueryPath } from '../../helpers/request-helpers'; import { RequestMethod, axiosRequest, } from '../../lib/axios'; +import { ISO8601 } from '../../types'; export default class Keys { readonly host: string; @@ -27,11 +29,20 @@ export default class Keys { data?: {}, ): Promise<{}> { const url: string = `/v3/${endpoint}`; + const expiresAt: ISO8601 = new Date().toISOString(); return axiosRequest({ url: `${this.host}${url}`, method, data, headers: { + 'DYDX-SIGNATURE': this.signRequest({ + requestPath: url, + method, + expiresAt, + address: ethereumAddress, + data, + }), + 'DYDX-TIMESTAMP': expiresAt, 'DYDX-ETHEREUM-ADDRESS': ethereumAddress, }, }); @@ -55,8 +66,9 @@ export default class Keys { protected async delete( endpoint: string, ethereumAddress: string, + params: {}, ): Promise<{}> { - return this.request(RequestMethod.DELETE, endpoint, ethereumAddress); + return this.request(RequestMethod.DELETE, generateQueryPath(endpoint, params), ethereumAddress); } // ============ Requests ============ @@ -74,5 +86,40 @@ export default class Keys { return this.post('api-keys', ethereumAddress, { apiKey }); } - deleteApiKey(): void {} + deleteApiKey( + ethereumAddress: string, + apiKey: string, + ): Promise<{}> { + return this.delete('api-keys', ethereumAddress, { apiKey }); + } + + // ============ Validation Helpers ============ + + async signRequest({ + requestPath, + method, + expiresAt, + address, + data, + }: { + requestPath: string, + method: RequestMethod, + expiresAt: ISO8601, + address: string, + data?: {}, + }): Promise { + const body: string = data ? JSON.stringify(data) : ''; + const hash: string | null = this.web3.utils.sha3( + body + + requestPath + + method + + expiresAt, + ); // TODO EIP 712 compliant + + if (!hash) { + throw new Error(`Could not generate an api-key request hash for address: ${address}`); + } + + return this.web3.eth.sign(hash, address); + } } diff --git a/src/modules/onboarding/impl.ts b/src/modules/onboarding/impl.ts index 4aaa4de..a0b4765 100644 --- a/src/modules/onboarding/impl.ts +++ b/src/modules/onboarding/impl.ts @@ -18,6 +18,8 @@ export default class Onboarding { this.web3 = web3; } + // ============ Request Helpers ============ + protected async post( endpoint: string, data: {}, @@ -38,6 +40,8 @@ export default class Onboarding { }); } + // ============ Requests ============ + async createUser( params: { starkKey: string, @@ -52,7 +56,10 @@ export default class Onboarding { ); } + // ============ Validation Helpers ============ + async signRequest(address: string): Promise { + // TODO Consider making EIP 712 compliant const onboardingHash: string | null = this.web3.utils.sha3(ONBOARDING_STATIC_STRING); if (!onboardingHash) { throw new Error(`Could not generate an onboarding hash for address: ${address}`); From 17611318d75639492314cba29a07295c56b0e300 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Wed, 28 Oct 2020 11:31:26 -0700 Subject: [PATCH 019/180] Allow signing from web3 wallet (#16) * Fix provider type * Allow signing from web3 wallet * Add test for signing * Fix lint * v0.0.12 --- __tests__/keys.test.ts | 32 ++++ __tests__/util.ts | 28 +++ package-lock.json | 360 +++++++++++++++++---------------------- package.json | 6 +- src/dydx-client.ts | 7 +- src/modules/keys/impl.ts | 19 ++- src/types.ts | 3 +- 7 files changed, 238 insertions(+), 217 deletions(-) create mode 100644 __tests__/keys.test.ts create mode 100644 __tests__/util.ts diff --git a/__tests__/keys.test.ts b/__tests__/keys.test.ts new file mode 100644 index 0000000..d5339fe --- /dev/null +++ b/__tests__/keys.test.ts @@ -0,0 +1,32 @@ +/** + * Unit tests for the API keys module. + */ + +import axios, { AxiosResponse } from 'axios'; +import Web3 from 'web3'; + +import { DydxClient, EthereumAccount } from '../src'; +import { asMock } from './util'; + +describe('API Keys Module', () => { + + it('Signs a request', async () => { + asMock(axios).mockResolvedValue({} as AxiosResponse); + + const web3 = new Web3(); + const account: EthereumAccount = web3.eth.accounts.wallet.create(1)[0]; + const client = new DydxClient('https://example.com', { web3 }); + await client.keys.getApiKeys(account.address); + + expect(axios).toHaveBeenCalledTimes(1); + expect(axios).toHaveBeenCalledWith({ + url: expect.stringContaining('/v3/api-keys'), + method: 'GET', + headers: { + 'DYDX-SIGNATURE': expect.stringMatching(/0x[0-9a-f]{130}/), + 'DYDX-TIMESTAMP': expect.any(String), + 'DYDX-ETHEREUM-ADDRESS': expect.stringMatching(/0x[0-9a-fA-F]{40}/), + }, + }); + }); +}); diff --git a/__tests__/util.ts b/__tests__/util.ts new file mode 100644 index 0000000..29353d2 --- /dev/null +++ b/__tests__/util.ts @@ -0,0 +1,28 @@ +/** + * Utilities for writing unit tests with Jest. + */ + +/* eslint-disable @typescript-eslint/no-explicit-any */ +type Fn = (...args: any[]) => any; +type FnMock = jest.Mock, Parameters>; + +type ObjMock = { + [K in keyof T]: T[K] extends Fn ? FnMock : ObjMock; +}; + +type Module = { [param: string]: Fn }; +type ModuleMock = { + [K in keyof M]: M[K] extends Fn ? FnMock : ObjMock; +}; + +/** + * Wrap a mocked function or module with the appropriate Jest mock typings. + */ +export function asMock(mock: F): FnMock; +export function asMock(mock: M): ModuleMock; +export function asMock(mock: Fn | Module) { + if (typeof mock === 'function') { + return mock as FnMock; + } + return mock as ModuleMock; +} diff --git a/package-lock.json b/package-lock.json index a2fca43..db1cc9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.11", + "version": "0.0.12", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1694,11 +1694,11 @@ "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" }, "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz", + "integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==", "requires": { - "follow-redirects": "1.5.10" + "follow-redirects": "^1.10.0" } }, "babel-jest": { @@ -1919,14 +1919,6 @@ "type-is": "~1.6.17" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -2109,9 +2101,9 @@ } }, "buffer": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.1.tgz", - "integrity": "sha512-2z15UUHpS9/3tk9mY/q+Rl3rydOi7yMp5XWNQnRvoz+mJwiv8brqYwp9a+nOCtma6dwuEIxljD8W3ysVBZ05Vg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.0.tgz", + "integrity": "sha512-cd+5r1VLBwUqTrmnzW+D7ABkJUM6mr7uv1dv+6jRw4Rcl7tFIFHDqHPL98LhpGFn3dbAt3gtLxtrWp4m1kFrqg==", "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -2690,9 +2682,9 @@ } }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -3880,14 +3872,6 @@ "vary": "~1.1.2" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -4089,16 +4073,6 @@ "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } } }, "find-up": { @@ -4128,12 +4102,9 @@ "dev": true }, "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - } + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" }, "for-in": { "version": "1.0.2", @@ -4577,9 +4548,9 @@ } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { "version": "5.1.8", @@ -6573,9 +6544,9 @@ } }, "oboe": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz", - "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=", "requires": { "http-https": "^1.0.0" } @@ -7524,21 +7495,6 @@ "statuses": "~1.5.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -8740,23 +8696,23 @@ } }, "web3": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.11.tgz", - "integrity": "sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.3.0.tgz", + "integrity": "sha512-4q9dna0RecnrlgD/bD1C5S+81Untbd6Z/TBD7rb+D5Bvvc0Wxjr4OP70x+LlnwuRDjDtzBwJbNUblh2grlVArw==", "requires": { - "web3-bzz": "1.2.11", - "web3-core": "1.2.11", - "web3-eth": "1.2.11", - "web3-eth-personal": "1.2.11", - "web3-net": "1.2.11", - "web3-shh": "1.2.11", - "web3-utils": "1.2.11" + "web3-bzz": "1.3.0", + "web3-core": "1.3.0", + "web3-eth": "1.3.0", + "web3-eth-personal": "1.3.0", + "web3-net": "1.3.0", + "web3-shh": "1.3.0", + "web3-utils": "1.3.0" } }, "web3-bzz": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.11.tgz", - "integrity": "sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.3.0.tgz", + "integrity": "sha512-ibYAnKab+sgTo/UdfbrvYfWblXjjgSMgyy9/FHa6WXS14n/HVB+HfWqGz2EM3fok8Wy5XoKGMvdqvERQ/mzq1w==", "requires": { "@types/node": "^12.12.6", "got": "9.6.0", @@ -8772,17 +8728,17 @@ } }, "web3-core": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.11.tgz", - "integrity": "sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.0.tgz", + "integrity": "sha512-BwWvAaKJf4KFG9QsKRi3MNoNgzjI6szyUlgme1qNPxUdCkaS3Rdpa0VKYNHP7M/YTk82/59kNE66mH5vmoaXjA==", "requires": { "@types/bn.js": "^4.11.5", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-requestmanager": "1.2.11", - "web3-utils": "1.2.11" + "web3-core-helpers": "1.3.0", + "web3-core-method": "1.3.0", + "web3-core-requestmanager": "1.3.0", + "web3-utils": "1.3.0" }, "dependencies": { "@types/node": { @@ -8793,92 +8749,92 @@ } }, "web3-core-helpers": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz", - "integrity": "sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.0.tgz", + "integrity": "sha512-+MFb1kZCrRctf7UYE7NCG4rGhSXaQJ/KF07di9GVK1pxy1K0+rFi61ZobuV1ky9uQp+uhhSPts4Zp55kRDB5sw==", "requires": { "underscore": "1.9.1", - "web3-eth-iban": "1.2.11", - "web3-utils": "1.2.11" + "web3-eth-iban": "1.3.0", + "web3-utils": "1.3.0" } }, "web3-core-method": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.11.tgz", - "integrity": "sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.0.tgz", + "integrity": "sha512-h0yFDrYVzy5WkLxC/C3q+hiMnzxdWm9p1T1rslnuHgOp6nYfqzu/6mUIXrsS4h/OWiGJt+BZ0xVZmtC31HDWtg==", "requires": { "@ethersproject/transactions": "^5.0.0-beta.135", "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-utils": "1.2.11" + "web3-core-helpers": "1.3.0", + "web3-core-promievent": "1.3.0", + "web3-core-subscriptions": "1.3.0", + "web3-utils": "1.3.0" } }, "web3-core-promievent": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz", - "integrity": "sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.0.tgz", + "integrity": "sha512-blv69wrXw447TP3iPvYJpllkhW6B18nfuEbrfcr3n2Y0v1Jx8VJacNZFDFsFIcgXcgUIVCtOpimU7w9v4+rtaw==", "requires": { "eventemitter3": "4.0.4" } }, "web3-core-requestmanager": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz", - "integrity": "sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.0.tgz", + "integrity": "sha512-3yMbuGcomtzlmvTVqNRydxsx7oPlw3ioRL6ReF9PeNYDkUsZaUib+6Dp5eBt7UXh5X+SIn/xa1smhDHz5/HpAw==", "requires": { "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "web3-providers-http": "1.2.11", - "web3-providers-ipc": "1.2.11", - "web3-providers-ws": "1.2.11" + "web3-core-helpers": "1.3.0", + "web3-providers-http": "1.3.0", + "web3-providers-ipc": "1.3.0", + "web3-providers-ws": "1.3.0" } }, "web3-core-subscriptions": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz", - "integrity": "sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.0.tgz", + "integrity": "sha512-MUUQUAhJDb+Nz3S97ExVWveH4utoUnsbPWP+q1HJH437hEGb4vunIb9KvN3hFHLB+aHJfPeStM/4yYTz5PeuyQ==", "requires": { "eventemitter3": "4.0.4", "underscore": "1.9.1", - "web3-core-helpers": "1.2.11" + "web3-core-helpers": "1.3.0" } }, "web3-eth": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.11.tgz", - "integrity": "sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.3.0.tgz", + "integrity": "sha512-/bzJcxXPM9EM18JM5kO2JjZ3nEqVo3HxqU93aWAEgJNqaP/Lltmufl2GpvIB2Hvj+FXAjAXquxUdQ2/xP7BzHQ==", "requires": { "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-eth-accounts": "1.2.11", - "web3-eth-contract": "1.2.11", - "web3-eth-ens": "1.2.11", - "web3-eth-iban": "1.2.11", - "web3-eth-personal": "1.2.11", - "web3-net": "1.2.11", - "web3-utils": "1.2.11" + "web3-core": "1.3.0", + "web3-core-helpers": "1.3.0", + "web3-core-method": "1.3.0", + "web3-core-subscriptions": "1.3.0", + "web3-eth-abi": "1.3.0", + "web3-eth-accounts": "1.3.0", + "web3-eth-contract": "1.3.0", + "web3-eth-ens": "1.3.0", + "web3-eth-iban": "1.3.0", + "web3-eth-personal": "1.3.0", + "web3-net": "1.3.0", + "web3-utils": "1.3.0" } }, "web3-eth-abi": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz", - "integrity": "sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.0.tgz", + "integrity": "sha512-1OrZ9+KGrBeBRd3lO8upkpNua9+7cBsQAgor9wbA25UrcUYSyL8teV66JNRu9gFxaTbkpdrGqM7J/LXpraXWrg==", "requires": { "@ethersproject/abi": "5.0.0-beta.153", "underscore": "1.9.1", - "web3-utils": "1.2.11" + "web3-utils": "1.3.0" } }, "web3-eth-accounts": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz", - "integrity": "sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.3.0.tgz", + "integrity": "sha512-/Q7EVW4L2wWUbNRtOTwAIrYvJid/5UnKMw67x/JpvRMwYC+e+744P536Ja6SG4X3MnzFvd3E/jruV4qa6k+zIw==", "requires": { "crypto-browserify": "3.12.0", "eth-lib": "0.2.8", @@ -8887,10 +8843,10 @@ "scrypt-js": "^3.0.1", "underscore": "1.9.1", "uuid": "3.3.2", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-utils": "1.2.11" + "web3-core": "1.3.0", + "web3-core-helpers": "1.3.0", + "web3-core-method": "1.3.0", + "web3-utils": "1.3.0" }, "dependencies": { "bn.js": { @@ -8916,44 +8872,44 @@ } }, "web3-eth-contract": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz", - "integrity": "sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.3.0.tgz", + "integrity": "sha512-3SCge4SRNCnzLxf0R+sXk6vyTOl05g80Z5+9/B5pERwtPpPWaQGw8w01vqYqsYBKC7zH+dxhMaUgVzU2Dgf7bQ==", "requires": { "@types/bn.js": "^4.11.5", "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-utils": "1.2.11" + "web3-core": "1.3.0", + "web3-core-helpers": "1.3.0", + "web3-core-method": "1.3.0", + "web3-core-promievent": "1.3.0", + "web3-core-subscriptions": "1.3.0", + "web3-eth-abi": "1.3.0", + "web3-utils": "1.3.0" } }, "web3-eth-ens": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz", - "integrity": "sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.3.0.tgz", + "integrity": "sha512-WnOru+EcuM5dteiVYJcHXo/I7Wq+ei8RrlS2nir49M0QpYvUPGbCGgTbifcjJQTWamgORtWdljSA1s2Asdb74w==", "requires": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-eth-contract": "1.2.11", - "web3-utils": "1.2.11" + "web3-core": "1.3.0", + "web3-core-helpers": "1.3.0", + "web3-core-promievent": "1.3.0", + "web3-eth-abi": "1.3.0", + "web3-eth-contract": "1.3.0", + "web3-utils": "1.3.0" } }, "web3-eth-iban": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz", - "integrity": "sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.0.tgz", + "integrity": "sha512-v9mZWhR4fPF17/KhHLiWir4YHWLe09O3B/NTdhWqw3fdAMJNztzMHGzgHxA/4fU+rhrs/FhDzc4yt32zMEXBZw==", "requires": { "bn.js": "^4.11.9", - "web3-utils": "1.2.11" + "web3-utils": "1.3.0" }, "dependencies": { "bn.js": { @@ -8964,16 +8920,16 @@ } }, "web3-eth-personal": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz", - "integrity": "sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.3.0.tgz", + "integrity": "sha512-2czUhElsJdLpuNfun9GeLiClo5O6Xw+bLSjl3f4bNG5X2V4wcIjX2ygep/nfstLLtkz8jSkgl/bV7esANJyeRA==", "requires": { "@types/node": "^12.12.6", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-net": "1.2.11", - "web3-utils": "1.2.11" + "web3-core": "1.3.0", + "web3-core-helpers": "1.3.0", + "web3-core-method": "1.3.0", + "web3-net": "1.3.0", + "web3-utils": "1.3.0" }, "dependencies": { "@types/node": { @@ -8984,60 +8940,60 @@ } }, "web3-net": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.11.tgz", - "integrity": "sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.3.0.tgz", + "integrity": "sha512-Xz02KylOyrB2YZzCkysEDrY7RbKxb7LADzx3Zlovfvuby7HBwtXVexXKtoGqksa+ns1lvjQLLQGb+OeLi7Sr7w==", "requires": { - "web3-core": "1.2.11", - "web3-core-method": "1.2.11", - "web3-utils": "1.2.11" + "web3-core": "1.3.0", + "web3-core-method": "1.3.0", + "web3-utils": "1.3.0" } }, "web3-providers-http": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.11.tgz", - "integrity": "sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.0.tgz", + "integrity": "sha512-cMKhUI6PqlY/EC+ZDacAxajySBu8AzW8jOjt1Pe/mbRQgS0rcZyvLePGTTuoyaA8C21F8UW+EE5jj7YsNgOuqA==", "requires": { - "web3-core-helpers": "1.2.11", + "web3-core-helpers": "1.3.0", "xhr2-cookies": "1.1.0" } }, "web3-providers-ipc": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz", - "integrity": "sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.0.tgz", + "integrity": "sha512-0CrLuRofR+1J38nEj4WsId/oolwQEM6Yl1sOt41S/6bNI7htdkwgVhSloFIMJMDFHtRw229QIJ6wIaKQz0X1Og==", "requires": { - "oboe": "2.1.4", + "oboe": "2.1.5", "underscore": "1.9.1", - "web3-core-helpers": "1.2.11" + "web3-core-helpers": "1.3.0" } }, "web3-providers-ws": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz", - "integrity": "sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.0.tgz", + "integrity": "sha512-Im5MthhJnJst8nSoq0TgbyOdaiFQFa5r6sHPOVllhgIgViDqzbnlAFW9sNzQ0Q8VXPNfPIQKi9cOrHlSRNPjRw==", "requires": { "eventemitter3": "4.0.4", "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "websocket": "^1.0.31" + "web3-core-helpers": "1.3.0", + "websocket": "^1.0.32" } }, "web3-shh": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.11.tgz", - "integrity": "sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.3.0.tgz", + "integrity": "sha512-IZTojA4VCwVq+7eEIHuL1tJXtU+LJDhO8Y2QmuwetEWW1iBgWCGPHZasipWP+7kDpSm/5lo5GRxL72FF/Os/tA==", "requires": { - "web3-core": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-net": "1.2.11" + "web3-core": "1.3.0", + "web3-core-method": "1.3.0", + "web3-core-subscriptions": "1.3.0", + "web3-net": "1.3.0" } }, "web3-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", - "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz", + "integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==", "requires": { "bn.js": "^4.11.9", "eth-lib": "0.2.8", @@ -9083,16 +9039,6 @@ "typedarray-to-buffer": "^3.1.5", "utf-8-validate": "^5.0.2", "yaeti": "^0.0.6" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } } }, "whatwg-encoding": { diff --git a/package.json b/package.json index a436e9b..a738727 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.11", + "version": "0.0.12", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -27,8 +27,8 @@ "dependencies": { "@dydxprotocol/starkex-lib": "^0.2.4", "@types/web3": "1.0.18", - "axios": "^0.19.0", - "web3": "1.2.11" + "axios": "^0.21.0", + "web3": "^1.3.0" }, "devDependencies": { "@types/uuid": "^8.3.0", diff --git a/src/dydx-client.ts b/src/dydx-client.ts index c72338e..d31494a 100644 --- a/src/dydx-client.ts +++ b/src/dydx-client.ts @@ -28,6 +28,7 @@ export interface ClientOptions { apiTimeout?: number; apiPrivateKey?: string | KeyPair; starkPrivateKey?: string | KeyPair; + web3?: Web3; web3Provider?: Provider; } @@ -53,8 +54,10 @@ export default class DydxClient { this.apiTimeout = options.apiTimeout; this.apiPrivateKey = options.apiPrivateKey; this.starkPrivateKey = options.starkPrivateKey; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.web3 = new Web3(options.web3Provider as any); + if (options.web3 || options.web3Provider) { + // Non-null assertion is safe due to if-condition. + this.web3 = options.web3 || new Web3(options.web3Provider!); + } // Modules. this._public = new Public(host); diff --git a/src/modules/keys/impl.ts b/src/modules/keys/impl.ts index 86db953..3eb3113 100644 --- a/src/modules/keys/impl.ts +++ b/src/modules/keys/impl.ts @@ -5,7 +5,10 @@ import { RequestMethod, axiosRequest, } from '../../lib/axios'; -import { ISO8601 } from '../../types'; +import { + EthereumAccount, + ISO8601, +} from '../../types'; export default class Keys { readonly host: string; @@ -35,7 +38,7 @@ export default class Keys { method, data, headers: { - 'DYDX-SIGNATURE': this.signRequest({ + 'DYDX-SIGNATURE': await this.signRequest({ requestPath: url, method, expiresAt, @@ -73,7 +76,7 @@ export default class Keys { // ============ Requests ============ - getApiKeys( + async getApiKeys( ethereumAddress: string, ): Promise<{}> { return this.get('api-keys', ethereumAddress); @@ -86,7 +89,7 @@ export default class Keys { return this.post('api-keys', ethereumAddress, { apiKey }); } - deleteApiKey( + async deleteApiKey( ethereumAddress: string, apiKey: string, ): Promise<{}> { @@ -120,6 +123,14 @@ export default class Keys { throw new Error(`Could not generate an api-key request hash for address: ${address}`); } + // If the address is in the wallet, use it to sign so we don't have to use the web3 provider. + const walletAccount: EthereumAccount | undefined = ( + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ + (this.web3.eth.accounts.wallet as any)[address] // TODO: Fix types. + ); + if (walletAccount) { + return walletAccount.sign(hash).signature; + } return this.web3.eth.sign(hash, address); } } diff --git a/src/types.ts b/src/types.ts index 1093f05..c165aa9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -3,9 +3,10 @@ import { OrderSide, PerpetualMarket, } from '@dydxprotocol/starkex-lib'; -import { HttpProvider, IpcProvider, WebsocketProvider } from 'web3/providers'; +import { HttpProvider, IpcProvider, WebsocketProvider } from 'web3-core'; export { Asset, OrderSide } from '@dydxprotocol/starkex-lib'; +export { Account as EthereumAccount } from 'web3-core'; export type ISO8601 = string; From 96205e3835c0fe1599cdf743c8c554efff95aa26 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Thu, 29 Oct 2020 10:57:35 -0700 Subject: [PATCH 020/180] Disable signatures (#19) --- src/modules/keys/impl.ts | 15 ++++++++------- src/modules/onboarding/impl.ts | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/modules/keys/impl.ts b/src/modules/keys/impl.ts index 3eb3113..e3e0d3d 100644 --- a/src/modules/keys/impl.ts +++ b/src/modules/keys/impl.ts @@ -38,13 +38,14 @@ export default class Keys { method, data, headers: { - 'DYDX-SIGNATURE': await this.signRequest({ - requestPath: url, - method, - expiresAt, - address: ethereumAddress, - data, - }), + // TODO: Include signature after we get it working. + // 'DYDX-SIGNATURE': await this.signRequest({ + // requestPath: url, + // method, + // expiresAt, + // address: ethereumAddress, + // data, + // }), 'DYDX-TIMESTAMP': expiresAt, 'DYDX-ETHEREUM-ADDRESS': ethereumAddress, }, diff --git a/src/modules/onboarding/impl.ts b/src/modules/onboarding/impl.ts index a0b4765..28752b7 100644 --- a/src/modules/onboarding/impl.ts +++ b/src/modules/onboarding/impl.ts @@ -34,7 +34,8 @@ export default class Onboarding { method: RequestMethod.POST, data, headers: { - 'DYDX-SIGNATURE': signature, + // TODO: Include signature after we get it working. + // 'DYDX-SIGNATURE': signature, 'DYDX-ETHEREUM-ADDRESS': ethereumAddress, }, }); From 9d855e2495c8088769ddb28479895f2ba3b96911 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Thu, 29 Oct 2020 10:58:02 -0700 Subject: [PATCH 021/180] v0.0.13 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index db1cc9e..aa9d4b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.12", + "version": "0.0.13", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a738727..7e26ca8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.12", + "version": "0.0.13", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { From 86ff2ce7f1e5d16ac30c3840fcddb6128e35913b Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Thu, 29 Oct 2020 12:02:13 -0700 Subject: [PATCH 022/180] Fix lint and tests --- __tests__/keys.test.ts | 2 +- src/modules/onboarding/impl.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/__tests__/keys.test.ts b/__tests__/keys.test.ts index d5339fe..6046254 100644 --- a/__tests__/keys.test.ts +++ b/__tests__/keys.test.ts @@ -23,7 +23,7 @@ describe('API Keys Module', () => { url: expect.stringContaining('/v3/api-keys'), method: 'GET', headers: { - 'DYDX-SIGNATURE': expect.stringMatching(/0x[0-9a-f]{130}/), + // 'DYDX-SIGNATURE': expect.stringMatching(/0x[0-9a-f]{130}/), 'DYDX-TIMESTAMP': expect.any(String), 'DYDX-ETHEREUM-ADDRESS': expect.stringMatching(/0x[0-9a-fA-F]{40}/), }, diff --git a/src/modules/onboarding/impl.ts b/src/modules/onboarding/impl.ts index 28752b7..e681e01 100644 --- a/src/modules/onboarding/impl.ts +++ b/src/modules/onboarding/impl.ts @@ -26,6 +26,7 @@ export default class Onboarding { // TODO: Get ethereumAddress from the provider (same address used for signing). ethereumAddress: string, ): Promise<{}> { + /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ const signature: string = await this.signRequest(ethereumAddress); const url: string = `/v3/${endpoint}`; From c2fdaa323c02fc8dc2fdca5dd8b1dd4835117c44 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Thu, 29 Oct 2020 12:37:32 -0700 Subject: [PATCH 023/180] v0.0.14 Move uuid to dependencies --- package-lock.json | 2 +- package.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index aa9d4b5..1302b3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.13", + "version": "0.0.14", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 7e26ca8..9dfbb02 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.13", + "version": "0.0.14", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -28,6 +28,7 @@ "@dydxprotocol/starkex-lib": "^0.2.4", "@types/web3": "1.0.18", "axios": "^0.21.0", + "uuid": "^8.3.1", "web3": "^1.3.0" }, "devDependencies": { @@ -44,7 +45,6 @@ "eslint-plugin-import": "^2.22.0", "jest": "^26.4.2", "nodemon": "^2.0.4", - "typescript": "^4.0.2", - "uuid": "^8.3.1" + "typescript": "^4.0.2" } } From 247ec1ae06655a18c9ae787cb78d5fc16925392e Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Thu, 29 Oct 2020 13:03:01 -0700 Subject: [PATCH 024/180] v0.0.13: Adds return types presupposing a 200/201 is returned [BAC-534] (#18) * add types * lint * silence test while auth is turned off --- __tests__/keys.test.ts | 2 +- src/lib/axios/axiosRequest.ts | 3 +- src/modules/keys/impl.ts | 15 ++-- src/modules/onboarding/impl.ts | 9 +- src/modules/private/impl.ts | 56 +++++++------ src/modules/public/impl.ts | 34 ++++++-- src/types.ts | 147 +++++++++++++++++++++++++++++++++ 7 files changed, 222 insertions(+), 44 deletions(-) diff --git a/__tests__/keys.test.ts b/__tests__/keys.test.ts index 6046254..e60da21 100644 --- a/__tests__/keys.test.ts +++ b/__tests__/keys.test.ts @@ -10,7 +10,7 @@ import { asMock } from './util'; describe('API Keys Module', () => { - it('Signs a request', async () => { + it.skip('Signs a request', async () => { asMock(axios).mockResolvedValue({} as AxiosResponse); const web3 = new Web3(); diff --git a/src/lib/axios/axiosRequest.ts b/src/lib/axios/axiosRequest.ts index 9d99732..6c14bd6 100644 --- a/src/lib/axios/axiosRequest.ts +++ b/src/lib/axios/axiosRequest.ts @@ -1,11 +1,12 @@ import axios, { AxiosRequestConfig } from 'axios'; +import { Data } from '../../types'; import { AxiosServerError, AxiosError, } from './errors'; -export async function axiosRequest(options: AxiosRequestConfig): Promise<{}> { +export async function axiosRequest(options: AxiosRequestConfig): Promise { try { const response = await axios(options); return response.data; diff --git a/src/modules/keys/impl.ts b/src/modules/keys/impl.ts index e3e0d3d..0820a46 100644 --- a/src/modules/keys/impl.ts +++ b/src/modules/keys/impl.ts @@ -6,6 +6,7 @@ import { axiosRequest, } from '../../lib/axios'; import { + Data, EthereumAccount, ISO8601, } from '../../types'; @@ -30,7 +31,7 @@ export default class Keys { // TODO: Get ethereumAddress from the provider (same address used for signing). ethereumAddress: string, data?: {}, - ): Promise<{}> { + ): Promise { const url: string = `/v3/${endpoint}`; const expiresAt: ISO8601 = new Date().toISOString(); return axiosRequest({ @@ -55,7 +56,7 @@ export default class Keys { protected async get( endpoint: string, ethereumAddress: string, - ): Promise<{}> { + ): Promise { return this.request(RequestMethod.GET, endpoint, ethereumAddress); } @@ -63,7 +64,7 @@ export default class Keys { endpoint: string, ethereumAddress: string, data: {}, - ): Promise<{}> { + ): Promise { return this.request(RequestMethod.POST, endpoint, ethereumAddress, data); } @@ -71,7 +72,7 @@ export default class Keys { endpoint: string, ethereumAddress: string, params: {}, - ): Promise<{}> { + ): Promise { return this.request(RequestMethod.DELETE, generateQueryPath(endpoint, params), ethereumAddress); } @@ -79,21 +80,21 @@ export default class Keys { async getApiKeys( ethereumAddress: string, - ): Promise<{}> { + ): Promise<{ apiKeys: string[] }> { return this.get('api-keys', ethereumAddress); } async registerApiKey( apiKey: string, ethereumAddress: string, - ): Promise<{}> { + ): Promise<{ apiKey: string }> { return this.post('api-keys', ethereumAddress, { apiKey }); } async deleteApiKey( ethereumAddress: string, apiKey: string, - ): Promise<{}> { + ): Promise { return this.delete('api-keys', ethereumAddress, { apiKey }); } diff --git a/src/modules/onboarding/impl.ts b/src/modules/onboarding/impl.ts index e681e01..3d62a6c 100644 --- a/src/modules/onboarding/impl.ts +++ b/src/modules/onboarding/impl.ts @@ -5,6 +5,7 @@ import { axiosRequest, } from '../../lib/axios'; import { ONBOARDING_STATIC_STRING } from '../../lib/constants'; +import { AccountResponseObject, Data, UserResponseObject } from '../../types'; export default class Onboarding { readonly host: string; @@ -25,7 +26,7 @@ export default class Onboarding { data: {}, // TODO: Get ethereumAddress from the provider (same address used for signing). ethereumAddress: string, - ): Promise<{}> { + ): Promise { /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ const signature: string = await this.signRequest(ethereumAddress); @@ -50,7 +51,11 @@ export default class Onboarding { apiKey: string, }, ethereumAddress: string, - ): Promise<{}> { + ): Promise<{ + apiKey: string, + user: UserResponseObject, + account: AccountResponseObject, + }> { return this.post( 'onboarding', params, diff --git a/src/modules/private/impl.ts b/src/modules/private/impl.ts index 19da770..f527573 100644 --- a/src/modules/private/impl.ts +++ b/src/modules/private/impl.ts @@ -20,13 +20,21 @@ import { import { getAccountId } from '../../lib/db'; import { AccountAction, + AccountResponseObject, ApiOrder, ApiWithdrawal, + Data, + FillResponseObject, + FundingResponseObject, ISO8601, Market, + OrderResponseObject, OrderStatus, PartialBy, + PositionResponseObject, PositionStatus, + TransferResponseObject, + UserResponseObject, } from '../../types'; // TODO: Figure out if we can get rid of this. @@ -60,7 +68,7 @@ export default class Private { method: RequestMethod, endpoint: string, data?: {}, - ): Promise<{}> { + ): Promise { const requestPath = `/v3/${endpoint}`; const expiresAt: ISO8601 = new Date().toISOString(); const headers = { @@ -84,41 +92,41 @@ export default class Private { protected async get( endpoint: string, params: {}, - ): Promise<{}> { + ): Promise { return this.request(RequestMethod.GET, generateQueryPath(endpoint, params)); } protected async post( endpoint: string, data: {}, - ): Promise<{}> { + ): Promise { return this.request(RequestMethod.POST, endpoint, data); } protected async put( endpoint: string, data: {}, - ): Promise<{}> { + ): Promise { return this.request(RequestMethod.PUT, endpoint, data); } protected async delete( endpoint: string, params: {}, - ): Promise<{}> { + ): Promise { return this.request(RequestMethod.DELETE, generateQueryPath(endpoint, params)); } // ============ Requests ============ - async getRegistration(): Promise<{}> { + async getRegistration(): Promise<{ signature: string }> { return this.get( 'registration', {}, ); } - async getUser(): Promise<{}> { + async getUser(): Promise<{ user: UserResponseObject }> { return this.get( 'users', {}, @@ -133,7 +141,7 @@ export default class Private { email: string, username: string, userData: {}, - }): Promise<{}> { + }): Promise<{ user: UserResponseObject }> { return this.put( 'users', { @@ -146,7 +154,7 @@ export default class Private { async createAccount( starkKey: string, - ): Promise<{}> { + ): Promise<{ account: AccountResponseObject }> { return this.post( 'accounts', { @@ -155,14 +163,14 @@ export default class Private { ); } - async getAccount(ethereumAddress: string): Promise<{}> { + async getAccount(ethereumAddress: string): Promise<{ account: AccountResponseObject }> { return this.get( `accounts/${getAccountId({ address: ethereumAddress })}`, {}, ); } - async getAccounts(): Promise<{}> { + async getAccounts(): Promise<{ account: AccountResponseObject[] }> { return this.get( 'accounts', {}, @@ -176,7 +184,7 @@ export default class Private { limit?: number, createdBeforeOrAt?: ISO8601, }, - ): Promise<{}> { + ): Promise<{ positions: PositionResponseObject[] }> { return this.get( 'positions', params, @@ -192,21 +200,21 @@ export default class Private { limit?: number, createdBeforeOrAt?: ISO8601, } = {}, - ): Promise<{}[]> { + ): Promise<{ orders: OrderResponseObject[] }> { return this.get( 'orders', params, - ) as unknown as {}[]; + ); } - async getOrderById(orderId: string): Promise<{}> { + async getOrderById(orderId: string): Promise<{ order: OrderResponseObject }> { return this.get( `orders/${orderId}`, {}, ); } - async getOrderByClientId(clientId: string): Promise<{}> { + async getOrderByClientId(clientId: string): Promise<{ order: OrderResponseObject }> { return this.get( `orders/client/${clientId}`, {}, @@ -217,7 +225,7 @@ export default class Private { params: PartialBy, positionId: string, ethereumAddress: string, - ): Promise<{}> { + ): Promise<{ order: OrderResponseObject }> { // TODO: Allow clientId to be a string. // const clientId = params.clientId || Math.random().toString(36).slice(2); // @@ -253,14 +261,14 @@ export default class Private { ); } - async cancelOrder(orderId: string): Promise<{}> { + async cancelOrder(orderId: string): Promise { return this.delete( `orders/${orderId}`, {}, ); } - async cancelAllOrders(market?: Market): Promise<{}> { + async cancelAllOrders(market?: Market): Promise { const params = market ? { market } : {}; return this.delete( 'orders', @@ -275,7 +283,7 @@ export default class Private { limit?: number, createdBeforeOrAt?: ISO8601, }, - ): Promise<{}> { + ): Promise<{ fills: FillResponseObject[] }> { return this.get( 'fills', params, @@ -288,7 +296,7 @@ export default class Private { limit?: number, createdBeforeOrAt?: ISO8601, }, - ): Promise<{}> { + ): Promise<{ transfers: TransferResponseObject[] }> { return this.get( 'transfers', params, @@ -298,7 +306,7 @@ export default class Private { async createWithdrawal( params: PartialBy, positionId: string, - ): Promise<{}> { + ): Promise<{ withdrawal: TransferResponseObject }> { // TODO: Allow clientId to be a string. // const clientId = params.clientId || Math.random().toString(36).slice(2); // @@ -342,7 +350,7 @@ export default class Private { asset: Asset, fromAddress: string, }, - ): Promise<{}> { + ): Promise<{ deposit: TransferResponseObject }> { return this.post( 'deposits', params, @@ -355,7 +363,7 @@ export default class Private { limit?: number, effectiveBeforeOrAt?: ISO8601, }, - ): Promise<{}> { + ): Promise<{ fundingPayments: FundingResponseObject }> { return this.get( 'funding', params, diff --git a/src/modules/public/impl.ts b/src/modules/public/impl.ts index 75a5512..de1c14a 100644 --- a/src/modules/public/impl.ts +++ b/src/modules/public/impl.ts @@ -1,6 +1,16 @@ import { generateQueryPath } from '../../helpers/request-helpers'; import { axiosRequest } from '../../lib/axios'; -import { ISO8601, Market, MarketStatisticDay } from '../../types'; +import { + Data, + HistoricalFundingResponseObject, + ISO8601, + Market, + MarketResponseObject, + MarketStatisticDay, + MarketStatisticResponseObject, + OrderbookResponseOrder, + Trade, +} from '../../types'; export default class Public { readonly host: string; @@ -11,24 +21,29 @@ export default class Public { checkIfUserExists( ethereumAddress: string, - ): Promise<{}> { + ): Promise<{ exists: boolean }> { const uri: string = 'v3/users/exists'; return this.sendPublicGetRequest(uri, { ethereumAddress }); } checkIfUsernameExists( username: string, - ): Promise<{}> { + ): Promise<{ exists: boolean }> { const uri: string = 'v3/usernames'; return this.sendPublicGetRequest(uri, { username }); } - getMarkets(market?: Market): Promise<{}> { + getMarkets(market?: Market): Promise<{ markets: MarketResponseObject }> { const uri: string = 'v3/markets'; return this.sendPublicGetRequest(uri, { market }); } - getOrderBook(market: Market): Promise<{}> { + getOrderBook(market: Market): Promise<{ + orderbook: { + bids: OrderbookResponseOrder[], + asks: OrderbookResponseOrder[], + } + }> { return this.sendPublicGetRequest(`v3/orderbook/${market}`, {}); } @@ -38,7 +53,7 @@ export default class Public { }: { market: Market, days?: MarketStatisticDay, - }): Promise<{}> { + }): Promise<{ markets: MarketStatisticResponseObject }> { const uri: string = `v3/stats/${market}`; return this.sendPublicGetRequest(uri, { days }); @@ -50,14 +65,15 @@ export default class Public { }: { market: Market, startingBeforeOrAt?: ISO8601, - }): Promise<{}> { + }): Promise<{ trades: Trade[] }> { const uri: string = `v3/trades/${market}`; return this.sendPublicGetRequest(uri, { startingBeforeOrAt }); } - getHistoricalFunding(market: Market, effectiveBeforeOrAt: ISO8601): Promise<{}> { + getHistoricalFunding(market: Market, effectiveBeforeOrAt: ISO8601): + Promise<{ historicalFunding: HistoricalFundingResponseObject }> { const uri: string = `v3/historical-funding/${market}`; return this.sendPublicGetRequest(uri, { effectiveBeforeOrAt }); @@ -66,7 +82,7 @@ export default class Public { private sendPublicGetRequest( requestPath: string, params: {}, - ): Promise<{}> { + ): Promise { return axiosRequest({ method: 'GET', url: `${this.host}/${generateQueryPath(requestPath, params)}`, diff --git a/src/types.ts b/src/types.ts index c165aa9..2af4667 100644 --- a/src/types.ts +++ b/src/types.ts @@ -12,6 +12,11 @@ export type ISO8601 = string; export type Provider = HttpProvider | IpcProvider | WebsocketProvider; +export type PositionsMap = { [market: string]: PositionResponseObject }; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type Data = any; + // ============ Enums ============ export type Market = PerpetualMarket; @@ -81,6 +86,148 @@ export interface ApiWithdrawal extends ApiStarkwareSigned { clientId: string; } +// ============ API Response Types ============ + +export interface MarketResponseObject { + market: PerpetualMarket; + status: string; + baseAsset: Asset; + quoteAsset: Asset; + tickSize: string; + makerFee: string; + takerFee: string; + indexPrice: string; + oraclePrice: string; + nextFundingRate: string; + minOrderSize: string; + type: string; + initialMarginFraction: string; + maintenanceMarginFraction: string; +} + +export interface MarketStatisticResponseObject { + market: PerpetualMarket; + open: string; + high: string; + low: string; + close: string; + baseVolume: string; + quoteVolume: string; + type: string; + nextFundingRate: ISO8601; +} + +export interface OrderResponseObject { + id: string; + clientId: string; + accountId: string; + market: PerpetualMarket; + side: OrderSide; + price: string; + triggerPrice?: string | null; + trailingPercent?: string | null; + size: string; + remainingSize: string; + type: OrderType; + createdAt: ISO8601; + unfillableAt?: ISO8601 | null; + expiresAt: ISO8601; + status: OrderStatus; + timeInForce: TimeInForce; + postOnly: boolean; + cancelReason?: string | null; +} + +export interface PositionResponseObject { + accountId: string; + market: PerpetualMarket; + status: PositionStatus; + side: string; + size: string; + maxSize: string; + entryPrice: string; + exitPrice?: string; + unrealizedPnl: string; + realizedPnl?: string; + createdAt: ISO8601; + closedAt?: ISO8601; +} + +export interface FillResponseObject { + id: string; + accountId: string; + side: OrderSide; + liquidity: string; + market: PerpetualMarket; + orderId: string; + price: string; + size: string; + fee: string; + createdAt: ISO8601; +} + +export interface UserResponseObject { + ethereumAddress: string; + userData: string; +} + +export interface AccountResponseObject { + starkKey: string, + positionId: string, + equity: string, + freeCollateral: string, + pendingDeposits: string, + pendingWithdrawals: string, + openPositions: PositionsMap, + id: string; +} + +export interface TransferResponseObject { + id: string; + accountId: string; + type: string; + debitAsset: Asset + creditAsset: Asset; + debitAmount: string; + creditAmount: string; + transactionHash?: string; + status: string; + createdAt: ISO8601; + confirmedAt?: ISO8601; + clientId?: string; + fromAddress?: string; + toAddress?: string; +} + +export interface FundingResponseObject { + accountId: string; + market: PerpetualMarket; + payment: string; + rate: string; + positionSize: string; + price: string; + effectiveAt: ISO8601; +} + +export interface HistoricalFundingResponseObject { + market: PerpetualMarket; + rate: string; + price: string; + effectiveAt: ISO8601; +} + +export interface OrderbookResponseOrder { + price: string; + size: string; +} + +export interface Trade { + side: OrderSide, + size: string, + price: string, + createdAt: ISO8601, +} + // ============ Utility Types ============ export type PartialBy = Omit & Partial>; From b98b18e440b2a4cd0052f209549a1b0ec4affc7f Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Fri, 30 Oct 2020 10:30:18 -0700 Subject: [PATCH 025/180] v0.0.15: make authorization EIP712 and add helpers [WIP] (#17) * make authorization EIP712 and add helpers * tests * changes * ks1 * fix tests * ks2 --- __tests__/{ => helpers}/util.ts | 0 __tests__/keys.test.ts | 2 +- __tests__/sign-off-chain.test.ts | 94 +++++++++++ package-lock.json | 89 ++++++++++- package.json | 10 +- src/dydx-client.ts | 15 +- src/index.ts | 2 + src/lib/constants.ts | 1 - src/lib/eth-validation/actions.ts | 24 +++ src/lib/eth-validation/signature-helper.ts | 152 ++++++++++++++++++ src/modules/keys/impl.ts | 84 +++------- src/modules/onboarding/impl.ts | 40 ++--- src/modules/sign-off-chain-action.ts | 174 +++++++++++++++++++++ src/modules/signer.ts | 98 ++++++++++++ src/types.ts | 21 +++ 15 files changed, 709 insertions(+), 97 deletions(-) rename __tests__/{ => helpers}/util.ts (100%) create mode 100644 __tests__/sign-off-chain.test.ts delete mode 100644 src/lib/constants.ts create mode 100644 src/lib/eth-validation/actions.ts create mode 100644 src/lib/eth-validation/signature-helper.ts create mode 100644 src/modules/sign-off-chain-action.ts create mode 100644 src/modules/signer.ts diff --git a/__tests__/util.ts b/__tests__/helpers/util.ts similarity index 100% rename from __tests__/util.ts rename to __tests__/helpers/util.ts diff --git a/__tests__/keys.test.ts b/__tests__/keys.test.ts index e60da21..1bcf18e 100644 --- a/__tests__/keys.test.ts +++ b/__tests__/keys.test.ts @@ -6,7 +6,7 @@ import axios, { AxiosResponse } from 'axios'; import Web3 from 'web3'; import { DydxClient, EthereumAccount } from '../src'; -import { asMock } from './util'; +import { asMock } from './helpers/util'; describe('API Keys Module', () => { diff --git a/__tests__/sign-off-chain.test.ts b/__tests__/sign-off-chain.test.ts new file mode 100644 index 0000000..f9cf28a --- /dev/null +++ b/__tests__/sign-off-chain.test.ts @@ -0,0 +1,94 @@ +import { ApiMethod } from '@dydxprotocol/starkex-lib'; +import Web3 from 'web3'; +import { + DydxClient, + generateApiKeyAction, + generateOnboardingAction, + SignOffChainAction, +} from '../src'; +import { + SigningMethod, + EthereumAccount, +} from '../src/types'; + +let signOffChainAction: SignOffChainAction; +let account: EthereumAccount; + +describe('signOffChainAction', () => { + beforeAll(async () => { + const web3 = new Web3(); + account = web3.eth.accounts.wallet.create(1)[0]; + + const client = new DydxClient('https://example.com', { web3 }); + signOffChainAction = client.signOffChainAction!; + }); + + it('Succeeds with onboarding hash', async () => { + const signature = await signOffChainAction.signOffChainAction( + account.address, + SigningMethod.Hash, + generateOnboardingAction(), + ); + expect( + signOffChainAction.signOffChainActionIsValid( + signature, + SigningMethod.Hash, + generateOnboardingAction(), + ), + ).toBe(true); + }); + + it('Succeeds with apikey hash', async () => { + const expiration = new Date('December 30, 2500 11:20:25'); + const url: string = 'v3/test'; + const method: ApiMethod = ApiMethod.POST; + + const signature = await signOffChainAction.signOffChainAction( + account.address, + SigningMethod.Hash, + generateApiKeyAction({ + requestPath: url, + method, + }), + expiration, + ); + expect( + signOffChainAction.signOffChainActionIsValid( + signature, + account.address, + generateApiKeyAction({ + requestPath: url, + method, + }), + expiration, + ), + ).toBe(true); + }); + + it('Recognizes expired signatures', async () => { + const expiration = new Date('December 30, 2017 11:20:25'); + const url: string = 'v3/test'; + const method: ApiMethod = ApiMethod.POST; + + const signature = await signOffChainAction.signOffChainAction( + account.address, + SigningMethod.Hash, + generateApiKeyAction({ + requestPath: url, + method, + }), + expiration, + ); + expect( + signOffChainAction.signOffChainActionIsValid( + signature, + account.address, + generateApiKeyAction({ + requestPath: url, + method, + }), + expiration, + ), + ).toBe(false); + }); +}); diff --git a/package-lock.json b/package-lock.json index 1302b3a..1dca7ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.14", + "version": "0.0.15", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1120,6 +1120,12 @@ "@types/bn.js": "*" } }, + "@types/es6-promisify": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/es6-promisify/-/es6-promisify-6.0.0.tgz", + "integrity": "sha512-w3eB2FfE60gHeUTWT65G/FsTlqOAl8qZeyDGxAniF4oS7T6acQ7uvtGKQlCIQNOGh6r21A/3mBASNzy8Tbx+hg==", + "dev": true + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -1859,9 +1865,9 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-8.1.1.tgz", + "integrity": "sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ==" }, "binary-extensions": { "version": "2.1.0", @@ -3055,6 +3061,11 @@ "es6-symbol": "^3.1.1" } }, + "es6-promisify": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", + "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==" + }, "es6-symbol": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", @@ -3660,6 +3671,63 @@ } } }, + "ethers": { + "version": "4.0.48", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", + "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==", + "requires": { + "aes-js": "3.0.0", + "bn.js": "^4.4.0", + "elliptic": "6.5.3", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" + }, + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + }, + "scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" + }, + "setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" + } + } + }, "ethjs-unit": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", @@ -8610,8 +8678,7 @@ "uuid": { "version": "8.3.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", - "dev": true + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==" }, "v8-compile-cache": { "version": "2.1.1", @@ -8745,6 +8812,11 @@ "version": "12.19.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.2.tgz", "integrity": "sha512-SRH6QM0IMOBBFmDiJ75vlhcbUEYEquvSuhsVW9ijG20JvdFTfOrB1p6ddZxz5y/JNnbf+9HoHhjhOVSX2hsJyA==" + }, + "bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" } } }, @@ -9249,6 +9321,11 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 9dfbb02..0812852 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.14", + "version": "0.0.15", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -28,14 +28,18 @@ "@dydxprotocol/starkex-lib": "^0.2.4", "@types/web3": "1.0.18", "axios": "^0.21.0", + "bignumber.js": "^8.1.1", + "es6-promisify": "^6.0.1", + "ethers": "^4.0.33", "uuid": "^8.3.1", - "web3": "^1.3.0" + "web3": "1.3.0" }, "devDependencies": { - "@types/uuid": "^8.3.0", + "@types/es6-promisify": "^6.0.0", "@types/jest": "^26.0.13", "@types/lodash": "^4.14.161", "@types/node": "^14.6.4", + "@types/uuid": "^8.3.0", "@typescript-eslint/eslint-plugin": "^4.0.1", "@typescript-eslint/parser": "^4.0.1", "coveralls": "^3.1.0", diff --git a/src/dydx-client.ts b/src/dydx-client.ts index d31494a..2ff6704 100644 --- a/src/dydx-client.ts +++ b/src/dydx-client.ts @@ -22,6 +22,7 @@ import { import { Public, } from './modules/public'; +import { SignOffChainAction } from './modules/sign-off-chain-action'; import { Provider } from './types'; export interface ClientOptions { @@ -38,6 +39,7 @@ export default class DydxClient { readonly apiPrivateKey?: string | KeyPair; readonly starkPrivateKey?: string | KeyPair; readonly web3?: Web3; + readonly signOffChainAction?: SignOffChainAction; // Modules. Except for `public`, these are created on-demand. private readonly _public: Public; @@ -57,6 +59,11 @@ export default class DydxClient { if (options.web3 || options.web3Provider) { // Non-null assertion is safe due to if-condition. this.web3 = options.web3 || new Web3(options.web3Provider!); + + this.signOffChainAction = new SignOffChainAction( + this.web3 as Web3, + 1, + ); // TODO get actual networkId } // Modules. @@ -93,8 +100,8 @@ export default class DydxClient { */ get keys(): Keys { if (!this._keys) { - if (this.web3) { - this._keys = new Keys(this.host, this.web3); + if (this.signOffChainAction) { + this._keys = new Keys(this.host, this.signOffChainAction); } else { return keysNotSupported; } @@ -107,8 +114,8 @@ export default class DydxClient { */ get onboarding(): Onboarding { if (!this._onboarding) { - if (this.web3) { - this._onboarding = new Onboarding(this.host, this.web3); + if (this.signOffChainAction) { + this._onboarding = new Onboarding(this.host, this.signOffChainAction); } else { return onboardingNotSupported; } diff --git a/src/index.ts b/src/index.ts index c06462d..a4d8c59 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,4 @@ export { default as DydxClient } from './dydx-client'; export * from './types'; +export * from './modules/sign-off-chain-action'; +export * from './lib/eth-validation/actions'; diff --git a/src/lib/constants.ts b/src/lib/constants.ts deleted file mode 100644 index db81d23..0000000 --- a/src/lib/constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const ONBOARDING_STATIC_STRING: string = 'DYDX-ONBOARDING'; diff --git a/src/lib/eth-validation/actions.ts b/src/lib/eth-validation/actions.ts new file mode 100644 index 0000000..b65b153 --- /dev/null +++ b/src/lib/eth-validation/actions.ts @@ -0,0 +1,24 @@ +import { ApiMethod } from '@dydxprotocol/starkex-lib'; +import lodash from 'lodash'; + +const ONBOARDING_STATIC_STRING: string = 'DYDX-ONBOARDING'; + +export function generateOnboardingAction(): string { + return ONBOARDING_STATIC_STRING; +} + +export function generateApiKeyAction({ + requestPath, + method, + data = {}, +}: { + requestPath: string, + method: ApiMethod, + data?: {}, +}): string { + return ( + (lodash.isEmpty(data) ? '' : JSON.stringify(data)) + + requestPath + + method + ); +} diff --git a/src/lib/eth-validation/signature-helper.ts b/src/lib/eth-validation/signature-helper.ts new file mode 100644 index 0000000..626d99e --- /dev/null +++ b/src/lib/eth-validation/signature-helper.ts @@ -0,0 +1,152 @@ +import BigNumber from 'bignumber.js'; +import { ethers } from 'ethers'; +import Web3 from 'web3'; + +import { Address, SignatureTypes } from '../../types'; + +export const PREPEND_DEC: string = '\x19Ethereum Signed Message:\n32'; + +export const PREPEND_HEX: string = '\x19Ethereum Signed Message:\n\x20'; + +export const EIP712_DOMAIN_STRING: string = 'EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'; + +export const EIP712_DOMAIN_STRUCT = [ + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + { name: 'verifyingContract', type: 'address' }, +]; + +export const EIP712_DOMAIN_STRING_NO_CONTRACT: string = 'EIP712Domain(string name,string version,uint256 chainId)'; + +export const EIP712_DOMAIN_STRUCT_NO_CONTRACT = [ + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, +]; + +export function isValidSigType( + sigType: number, +): boolean { + switch (sigType) { + case SignatureTypes.NO_PREPEND: + case SignatureTypes.DECIMAL: + case SignatureTypes.HEXADECIMAL: + return true; + default: + return false; + } +} + +export function ecRecoverTypedSignature( + hash: string, + typedSignature: string, +): Address { + if (stripHexPrefix(typedSignature).length !== 66 * 2) { + throw new Error(`Unable to ecrecover signature: ${typedSignature}`); + } + + const sigType = parseInt(typedSignature.slice(-2), 16); + + let prependedHash: string | null; + switch (sigType) { + case SignatureTypes.NO_PREPEND: + prependedHash = hash; + break; + case SignatureTypes.DECIMAL: + prependedHash = Web3.utils.soliditySha3( + { t: 'string', v: PREPEND_DEC }, + { t: 'bytes32', v: hash }, + ); + break; + case SignatureTypes.HEXADECIMAL: + prependedHash = Web3.utils.soliditySha3( + { t: 'string', v: PREPEND_HEX }, + { t: 'bytes32', v: hash }, + ); + break; + default: + throw new Error(`Invalid signature type: ${sigType}`); + } + + const signature = typedSignature.slice(0, -2); + + if (!prependedHash) { + throw new Error(`Invalid hash: ${hash}`); + } + + return ethers.utils.recoverAddress(ethers.utils.arrayify(prependedHash), signature); +} + +export function createTypedSignature( + signature: string, + sigType: number, +): string { + if (!isValidSigType(sigType)) { + throw new Error(`Invalid signature type: ${sigType}`); + } + return `${fixRawSignature(signature)}0${sigType}`; +} + +/** + * Fixes any signatures that don't have a 'v' value of 27 or 28 + */ +export function fixRawSignature( + signature: string, +): string { + const stripped = stripHexPrefix(signature); + + if (stripped.length !== 130) { + throw new Error(`Invalid raw signature: ${signature}`); + } + + const rs = stripped.substr(0, 128); + const v = stripped.substr(128, 2); + + switch (v) { + case '00': + return `0x${rs}1b`; + case '01': + return `0x${rs}1c`; + case '1b': + case '1c': + return `0x${stripped}`; + default: + throw new Error(`Invalid v value: ${v}`); + } +} + +// ============ Byte Helpers ============ + +export function stripHexPrefix(input: string) { + if (input.indexOf('0x') === 0) { + return input.substr(2); + } + return input; +} + +export function addressesAreEqual( + addressOne: string, + addressTwo: string, +): boolean { + if (!addressOne || !addressTwo) { + return false; + } + + return (stripHexPrefix(addressOne).toLowerCase() === stripHexPrefix(addressTwo).toLowerCase()); +} + +export function hashString(input: string): string { + const hash: string | null = Web3.utils.soliditySha3({ t: 'string', v: input }); + if (!hash) { + throw new Error(`ecrecover failed due to invalid signature length: ${input}`); + } + + return hash; +} + +// ============ General Helpers ============ + +export function toString(input: number | string | BigNumber) { + return new BigNumber(input).toFixed(0); +} diff --git a/src/modules/keys/impl.ts b/src/modules/keys/impl.ts index 0820a46..2ded81f 100644 --- a/src/modules/keys/impl.ts +++ b/src/modules/keys/impl.ts @@ -1,53 +1,57 @@ -import Web3 from 'web3'; +import { ApiMethod } from '@dydxprotocol/starkex-lib'; import { generateQueryPath } from '../../helpers/request-helpers'; import { - RequestMethod, axiosRequest, } from '../../lib/axios'; +import { generateApiKeyAction } from '../../lib/eth-validation/actions'; import { + SigningMethod, Data, - EthereumAccount, - ISO8601, } from '../../types'; +import { SignOffChainAction } from '../sign-off-chain-action'; export default class Keys { readonly host: string; - readonly web3: Web3; + readonly signOffChainAction: SignOffChainAction; constructor( host: string, - web3: Web3, + signOffChainAction: SignOffChainAction, ) { this.host = host; - this.web3 = web3; + this.signOffChainAction = signOffChainAction; } // ============ Request Helpers ============ protected async request( - method: RequestMethod, + method: ApiMethod, endpoint: string, // TODO: Get ethereumAddress from the provider (same address used for signing). ethereumAddress: string, data?: {}, ): Promise { const url: string = `/v3/${endpoint}`; - const expiresAt: ISO8601 = new Date().toISOString(); + const expiresAt: Date = new Date(); + const signature: string = await this.signOffChainAction.signOffChainAction( + ethereumAddress, + SigningMethod.Hash, + generateApiKeyAction({ + requestPath: url, + method, + data, + }), + expiresAt, + ); + return axiosRequest({ url: `${this.host}${url}`, method, data, headers: { - // TODO: Include signature after we get it working. - // 'DYDX-SIGNATURE': await this.signRequest({ - // requestPath: url, - // method, - // expiresAt, - // address: ethereumAddress, - // data, - // }), - 'DYDX-TIMESTAMP': expiresAt, + 'DYDX-SIGNATURE': signature, + 'DYDX-TIMESTAMP': expiresAt.toISOString(), 'DYDX-ETHEREUM-ADDRESS': ethereumAddress, }, }); @@ -57,7 +61,7 @@ export default class Keys { endpoint: string, ethereumAddress: string, ): Promise { - return this.request(RequestMethod.GET, endpoint, ethereumAddress); + return this.request(ApiMethod.GET, endpoint, ethereumAddress); } protected async post( @@ -65,7 +69,7 @@ export default class Keys { ethereumAddress: string, data: {}, ): Promise { - return this.request(RequestMethod.POST, endpoint, ethereumAddress, data); + return this.request(ApiMethod.POST, endpoint, ethereumAddress, data); } protected async delete( @@ -73,7 +77,7 @@ export default class Keys { ethereumAddress: string, params: {}, ): Promise { - return this.request(RequestMethod.DELETE, generateQueryPath(endpoint, params), ethereumAddress); + return this.request(ApiMethod.DELETE, generateQueryPath(endpoint, params), ethereumAddress); } // ============ Requests ============ @@ -97,42 +101,4 @@ export default class Keys { ): Promise { return this.delete('api-keys', ethereumAddress, { apiKey }); } - - // ============ Validation Helpers ============ - - async signRequest({ - requestPath, - method, - expiresAt, - address, - data, - }: { - requestPath: string, - method: RequestMethod, - expiresAt: ISO8601, - address: string, - data?: {}, - }): Promise { - const body: string = data ? JSON.stringify(data) : ''; - const hash: string | null = this.web3.utils.sha3( - body + - requestPath + - method + - expiresAt, - ); // TODO EIP 712 compliant - - if (!hash) { - throw new Error(`Could not generate an api-key request hash for address: ${address}`); - } - - // If the address is in the wallet, use it to sign so we don't have to use the web3 provider. - const walletAccount: EthereumAccount | undefined = ( - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ - (this.web3.eth.accounts.wallet as any)[address] // TODO: Fix types. - ); - if (walletAccount) { - return walletAccount.sign(hash).signature; - } - return this.web3.eth.sign(hash, address); - } } diff --git a/src/modules/onboarding/impl.ts b/src/modules/onboarding/impl.ts index 3d62a6c..fa59a85 100644 --- a/src/modules/onboarding/impl.ts +++ b/src/modules/onboarding/impl.ts @@ -1,22 +1,26 @@ -import Web3 from 'web3'; - import { RequestMethod, axiosRequest, } from '../../lib/axios'; -import { ONBOARDING_STATIC_STRING } from '../../lib/constants'; -import { AccountResponseObject, Data, UserResponseObject } from '../../types'; +import { generateOnboardingAction } from '../../lib/eth-validation/actions'; +import { + SigningMethod, + AccountResponseObject, + Data, + UserResponseObject, +} from '../../types'; +import { SignOffChainAction } from '../sign-off-chain-action'; export default class Onboarding { readonly host: string; - readonly web3: Web3; + readonly signOffChainAction: SignOffChainAction; constructor( host: string, - web3: Web3, + signOffChainAction: SignOffChainAction, ) { this.host = host; - this.web3 = web3; + this.signOffChainAction = signOffChainAction; } // ============ Request Helpers ============ @@ -27,8 +31,11 @@ export default class Onboarding { // TODO: Get ethereumAddress from the provider (same address used for signing). ethereumAddress: string, ): Promise { - /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ - const signature: string = await this.signRequest(ethereumAddress); + const signature: string = await this.signOffChainAction.signOffChainAction( + ethereumAddress, + SigningMethod.Hash, + generateOnboardingAction(), + ); const url: string = `/v3/${endpoint}`; return axiosRequest({ @@ -36,8 +43,7 @@ export default class Onboarding { method: RequestMethod.POST, data, headers: { - // TODO: Include signature after we get it working. - // 'DYDX-SIGNATURE': signature, + 'DYDX-SIGNATURE': signature, 'DYDX-ETHEREUM-ADDRESS': ethereumAddress, }, }); @@ -62,16 +68,4 @@ export default class Onboarding { ethereumAddress, ); } - - // ============ Validation Helpers ============ - - async signRequest(address: string): Promise { - // TODO Consider making EIP 712 compliant - const onboardingHash: string | null = this.web3.utils.sha3(ONBOARDING_STATIC_STRING); - if (!onboardingHash) { - throw new Error(`Could not generate an onboarding hash for address: ${address}`); - } - - return this.web3.eth.sign(onboardingHash, address); - } } diff --git a/src/modules/sign-off-chain-action.ts b/src/modules/sign-off-chain-action.ts new file mode 100644 index 0000000..acc1e9c --- /dev/null +++ b/src/modules/sign-off-chain-action.ts @@ -0,0 +1,174 @@ +import Web3 from 'web3'; +import { Mixed } from 'web3/utils'; + +import { + createTypedSignature, + EIP712_DOMAIN_STRUCT_NO_CONTRACT, + ecRecoverTypedSignature, + addressesAreEqual, + hashString, + EIP712_DOMAIN_STRING_NO_CONTRACT, + toString, +} from '../lib/eth-validation/signature-helper'; +import { + SigningMethod, + SignatureTypes, + Address, + EthereumAccount, +} from '../types'; +import { Signer } from './signer'; + +const EIP712_WALLET_OFF_CHAIN_ACTION_ALL_STRUCT = [ + { type: 'string', name: 'action' }, + { type: 'string', name: 'expiration' }, +]; + +export class SignOffChainAction extends Signer { + private domain: string; + private version: string; + private networkId: number; + private EIP712_OFF_CHAIN_ACTION_ALL_STRUCT_STRING: string; + + constructor( + web3: Web3, + networkId: number, + { + domain = 'dYdX', + version = '1.0', + }: { + domain?: string; + version?: string; + } = {}, + ) { + super(web3); + this.domain = domain; + this.networkId = networkId; + this.version = version; + this.EIP712_OFF_CHAIN_ACTION_ALL_STRUCT_STRING = 'dYdX(' + + 'string action,' + + 'string expiration' + + ')'; + } + + public async signOffChainAction( + signer: string, + signingMethod: SigningMethod, + action: string, + expiration?: Date, + ): Promise { + switch (signingMethod) { + case SigningMethod.Hash: + case SigningMethod.UnsafeHash: + case SigningMethod.Compatibility: { + const hash = this.getOffChainActionHash(action, expiration); + + // If the address is in the wallet, use it to sign so we don't have to use the + // web3 provider. + const walletAccount: EthereumAccount | undefined = ( + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ + (this.web3.eth.accounts.wallet as any)[signer] // TODO: Fix types. + ); + let rawSignature: string | null = null; + if (walletAccount) { + rawSignature = walletAccount.sign(hash).signature; + } + rawSignature = rawSignature || await this.web3.eth.sign(hash, signer); + const hashSig = createTypedSignature(rawSignature, SignatureTypes.DECIMAL); + if (signingMethod === SigningMethod.Hash) { + return hashSig; + } + const unsafeHashSig = createTypedSignature(rawSignature, SignatureTypes.NO_PREPEND); + if (signingMethod === SigningMethod.UnsafeHash) { + return unsafeHashSig; + } + if (this.signOffChainActionIsValid(unsafeHashSig, signer, action, expiration)) { + return unsafeHashSig; + } + return hashSig; + } + + case SigningMethod.TypedData: + case SigningMethod.MetaMask: + case SigningMethod.MetaMaskLatest: + case SigningMethod.CoinbaseWallet: { + const data = { + types: { + EIP712Domain: EIP712_DOMAIN_STRUCT_NO_CONTRACT, + [this.domain]: EIP712_WALLET_OFF_CHAIN_ACTION_ALL_STRUCT, + }, + domain: this.getDomainData(), + primaryType: this.domain, + message: { + action, + expiration: expiration ? expiration.toUTCString() : null, + }, + }; + return this.ethSignTypedDataInternal( + signer, + data, + signingMethod, + ); + } + + default: + throw new Error(`Invalid signing method ${signingMethod}`); + } + } + + public signOffChainActionIsValid( + typedSignature: string, + expectedSigner: Address, + action: string, + expiration?: Date, + ): boolean { + const hash = this.getOffChainActionHash(action, expiration); + const signer = ecRecoverTypedSignature(hash, typedSignature); + return (addressesAreEqual(signer, expectedSigner) && + expiration ? expiration > new Date() : true); + } + + public getDomainHash(): string { + const hash: string | null = Web3.utils.soliditySha3( + { t: 'bytes32', v: hashString(EIP712_DOMAIN_STRING_NO_CONTRACT) }, + { t: 'bytes32', v: hashString(this.domain) }, + { t: 'bytes32', v: hashString(this.version) }, + { t: 'uint256', v: toString(this.networkId) }, + ); + + if (!hash) { + throw new Error(`Could not get domain hash with domain: ${this.domain}`); + } + + return hash; + } + + public getOffChainActionHash( + action: string, + expiration?: Date, + ): string { + const mixed: Mixed[] = [ + { t: 'bytes32', v: hashString(this.EIP712_OFF_CHAIN_ACTION_ALL_STRUCT_STRING) }, + { t: 'bytes32', v: hashString(action) }, + ]; + + if (expiration) { + mixed.push({ t: 'bytes32', v: hashString(expiration.toUTCString()) }); + } + + const structHash: string | null = Web3.utils.soliditySha3(...mixed); + + if (!structHash) { + throw new Error(`Cannot get OffchainAction for: ${action}`); + } + + return this.getEIP712Hash(structHash); + } + + private getDomainData() { + return { + name: this.domain, + version: this.version, + chainId: this.networkId, + }; + } +} diff --git a/src/modules/signer.ts b/src/modules/signer.ts new file mode 100644 index 0000000..174fdbc --- /dev/null +++ b/src/modules/signer.ts @@ -0,0 +1,98 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { promisify } from 'es6-promisify'; +import Web3 from 'web3'; + +import { + stripHexPrefix, +} from '../lib/eth-validation/signature-helper'; +import { + SignatureTypes, + SigningMethod, +} from '../types'; + +export abstract class Signer { + protected web3: Web3; + + // ============ Constructor ============ + + constructor( + web3: Web3, + ) { + this.web3 = web3; + } + + // ============ Functions ============ + + /** + * Returns a signable EIP712 Hash of a struct + */ + public getEIP712Hash( + structHash: string, + ): string { + const hash: string | null = Web3.utils.soliditySha3( + { t: 'bytes2', v: '0x1901' }, + { t: 'bytes32', v: this.getDomainHash() as string }, + { t: 'bytes32', v: structHash }, + ); + + if (!hash) { + throw new Error(`Invalid structHash: ${structHash}`); + } + + return hash; + } + + /** + * Returns the EIP712 domain separator hash. + */ + public abstract getDomainHash(): string; + + protected async ethSignTypedDataInternal( + signer: string, + data: {}, + signingMethod: SigningMethod, + ): Promise { + let rpcMethod: string; + let rpcData: {}; + + const provider: any = this.web3.currentProvider!; + let sendAsync: any; + + switch (signingMethod) { + case SigningMethod.TypedData: + sendAsync = promisify(provider.send).bind(provider); + rpcMethod = 'eth_signTypedData'; + rpcData = data; + break; + case SigningMethod.MetaMask: + sendAsync = promisify(provider.sendAsync).bind(provider); + rpcMethod = 'eth_signTypedData_v3'; + rpcData = JSON.stringify(data); + break; + case SigningMethod.MetaMaskLatest: + sendAsync = promisify(provider.sendAsync).bind(provider); + rpcMethod = 'eth_signTypedData_v4'; + rpcData = JSON.stringify(data); + break; + case SigningMethod.CoinbaseWallet: + sendAsync = promisify(provider.sendAsync).bind(provider); + rpcMethod = 'eth_signTypedData'; + rpcData = data; + break; + default: + throw new Error(`Invalid signing method ${signingMethod}`); + } + + const response = await sendAsync({ + method: rpcMethod, + params: [signer, rpcData], + jsonrpc: '2.0', + id: new Date().getTime(), + }); + + if (response.error) { + throw new Error(response.error.message); + } + return `0x${stripHexPrefix(response.result)}0${SignatureTypes.NO_PREPEND}`; + } +} diff --git a/src/types.ts b/src/types.ts index 2af4667..b56771f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -3,6 +3,7 @@ import { OrderSide, PerpetualMarket, } from '@dydxprotocol/starkex-lib'; +import BigNumber from 'bignumber.js'; import { HttpProvider, IpcProvider, WebsocketProvider } from 'web3-core'; export { Asset, OrderSide } from '@dydxprotocol/starkex-lib'; @@ -10,6 +11,10 @@ export { Account as EthereumAccount } from 'web3-core'; export type ISO8601 = string; +export type Address = string; + +export type Integer = BigNumber; + export type Provider = HttpProvider | IpcProvider | WebsocketProvider; export type PositionsMap = { [market: string]: PositionResponseObject }; @@ -60,6 +65,22 @@ export enum AccountAction { WITHDRAWAL = 'WITHDRAWAL', } +export enum SigningMethod { + Compatibility = 'Compatibility', // picks intelligently between UnsafeHash and Hash + UnsafeHash = 'UnsafeHash', // raw hash signed + Hash = 'Hash', // hash prepended according to EIP-191 + TypedData = 'TypedData', // order hashed according to EIP-712 + MetaMask = 'MetaMask', // order hashed according to EIP-712 (MetaMask-only) + MetaMaskLatest = 'MetaMaskLatest', // ... according to latest version of EIP-712 (MetaMask-only) + CoinbaseWallet = 'CoinbaseWallet', // ... according to latest version of EIP-712 (CoinbaseWallet) +} + +export enum SignatureTypes { + NO_PREPEND = 0, + DECIMAL = 1, + HEXADECIMAL = 2, +} + // ============ API Request Types ============ interface ApiStarkwareSigned { From caf20b369a2d84ee3afdb995d76d5c9afc2bbb4d Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Tue, 24 Nov 2020 10:41:02 -0800 Subject: [PATCH 026/180] v0.0.16 Miscellaneous cleanup (#20) * Minor cleanup * Fix types in signer.ts * Minor cleanup * Clean up modules * Clean up tests * Fix API key return types * Minor cleanup * expiresAt -> timestamp, and other minor cleanup * v0.0.16 * More readonly * url -> requestPath * Fix lint --- __tests__/index.test.ts | 13 ++-- __tests__/keys.test.ts | 4 +- __tests__/sign-off-chain.test.ts | 6 +- package-lock.json | 2 +- package.json | 2 +- src/dydx-client.ts | 64 +++++++++++-------- src/index.ts | 4 +- src/lib/db.ts | 2 + src/lib/eth-validation/actions.ts | 5 +- src/modules/{eth/impl.ts => eth.ts} | 0 src/modules/eth/index.ts | 2 - src/modules/eth/not-supported.ts | 9 --- src/modules/{keys/impl.ts => keys.ts} | 30 ++++----- src/modules/keys/index.ts | 2 - src/modules/keys/not-supported.ts | 9 --- .../{onboarding/impl.ts => onboarding.ts} | 9 ++- src/modules/onboarding/index.ts | 2 - src/modules/onboarding/not-supported.ts | 9 --- src/modules/{private/impl.ts => private.ts} | 41 +++++------- src/modules/private/index.ts | 2 - src/modules/private/not-supported.ts | 9 --- src/modules/{public/impl.ts => public.ts} | 6 +- src/modules/public/index.ts | 1 - src/modules/sign-off-chain-action.ts | 34 +++++----- src/modules/signer.ts | 27 ++++++-- src/types.ts | 5 ++ 26 files changed, 143 insertions(+), 156 deletions(-) rename src/modules/{eth/impl.ts => eth.ts} (100%) delete mode 100644 src/modules/eth/index.ts delete mode 100644 src/modules/eth/not-supported.ts rename src/modules/{keys/impl.ts => keys.ts} (76%) delete mode 100644 src/modules/keys/index.ts delete mode 100644 src/modules/keys/not-supported.ts rename src/modules/{onboarding/impl.ts => onboarding.ts} (83%) delete mode 100644 src/modules/onboarding/index.ts delete mode 100644 src/modules/onboarding/not-supported.ts rename src/modules/{private/impl.ts => private.ts} (90%) delete mode 100644 src/modules/private/index.ts delete mode 100644 src/modules/private/not-supported.ts rename src/modules/{public/impl.ts => public.ts} (93%) delete mode 100644 src/modules/public/index.ts diff --git a/__tests__/index.test.ts b/__tests__/index.test.ts index bfab1d9..d4b9e13 100644 --- a/__tests__/index.test.ts +++ b/__tests__/index.test.ts @@ -1,8 +1,13 @@ import { DydxClient } from '../src'; -describe('noop test', () => { - it('does nothing', () => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const unusedClient = new DydxClient('https://example.com'); +describe('DydxClient', () => { + + it('has separate modules', () => { + const client = new DydxClient('https://example.com'); + expect(client.eth).toBeTruthy(); + expect(client.keys).toBeTruthy(); + expect(client.onboarding).toBeTruthy(); + expect(client.private).toBeTruthy(); + expect(client.public).toBeTruthy(); }); }); diff --git a/__tests__/keys.test.ts b/__tests__/keys.test.ts index 1bcf18e..158f9d2 100644 --- a/__tests__/keys.test.ts +++ b/__tests__/keys.test.ts @@ -10,7 +10,7 @@ import { asMock } from './helpers/util'; describe('API Keys Module', () => { - it.skip('Signs a request', async () => { + it('Signs a request', async () => { asMock(axios).mockResolvedValue({} as AxiosResponse); const web3 = new Web3(); @@ -23,7 +23,7 @@ describe('API Keys Module', () => { url: expect.stringContaining('/v3/api-keys'), method: 'GET', headers: { - // 'DYDX-SIGNATURE': expect.stringMatching(/0x[0-9a-f]{130}/), + 'DYDX-SIGNATURE': expect.stringMatching(/0x[0-9a-f]{130}/), 'DYDX-TIMESTAMP': expect.any(String), 'DYDX-ETHEREUM-ADDRESS': expect.stringMatching(/0x[0-9a-fA-F]{40}/), }, diff --git a/__tests__/sign-off-chain.test.ts b/__tests__/sign-off-chain.test.ts index f9cf28a..55ee632 100644 --- a/__tests__/sign-off-chain.test.ts +++ b/__tests__/sign-off-chain.test.ts @@ -1,7 +1,6 @@ import { ApiMethod } from '@dydxprotocol/starkex-lib'; import Web3 from 'web3'; import { - DydxClient, generateApiKeyAction, generateOnboardingAction, SignOffChainAction, @@ -15,12 +14,11 @@ let signOffChainAction: SignOffChainAction; let account: EthereumAccount; describe('signOffChainAction', () => { + beforeAll(async () => { const web3 = new Web3(); + signOffChainAction = new SignOffChainAction(web3, 1); account = web3.eth.accounts.wallet.create(1)[0]; - - const client = new DydxClient('https://example.com', { web3 }); - signOffChainAction = client.signOffChainAction!; }); it('Succeeds with onboarding hash', async () => { diff --git a/package-lock.json b/package-lock.json index 1dca7ce..8192742 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.15", + "version": "0.0.16", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0812852..5ab07b4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.15", + "version": "0.0.16", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/dydx-client.ts b/src/dydx-client.ts index 2ff6704..c8689ae 100644 --- a/src/dydx-client.ts +++ b/src/dydx-client.ts @@ -3,31 +3,18 @@ import { } from '@dydxprotocol/starkex-lib'; import Web3 from 'web3'; -import { - Eth, - ethNotSupported, -} from './modules/eth'; -import { - Keys, - keysNotSupported, -} from './modules/keys'; -import { - Onboarding, - onboardingNotSupported, -} from './modules/onboarding'; -import { - Private, - privateNotSupported, -} from './modules/private'; -import { - Public, -} from './modules/public'; +import Eth from './modules/eth'; +import Keys from './modules/keys'; +import Onboarding from './modules/onboarding'; +import Private from './modules/private'; +import Public from './modules/public'; import { SignOffChainAction } from './modules/sign-off-chain-action'; import { Provider } from './types'; export interface ClientOptions { apiTimeout?: number; apiPrivateKey?: string | KeyPair; + networkId?: number; starkPrivateKey?: string | KeyPair; web3?: Web3; web3Provider?: Provider; @@ -56,14 +43,15 @@ export default class DydxClient { this.apiTimeout = options.apiTimeout; this.apiPrivateKey = options.apiPrivateKey; this.starkPrivateKey = options.starkPrivateKey; + if (options.web3 || options.web3Provider) { + const networkId = typeof options.networkId === 'number' ? options.networkId : 1; // Non-null assertion is safe due to if-condition. this.web3 = options.web3 || new Web3(options.web3Provider!); - this.signOffChainAction = new SignOffChainAction( - this.web3 as Web3, - 1, - ); // TODO get actual networkId + this.web3, + networkId, + ); } // Modules. @@ -89,7 +77,9 @@ export default class DydxClient { this.starkPrivateKey, ); } else { - return privateNotSupported; + return notSupported( + 'Private endpoints are not supported since apiPrivateKey was not provided', + ) as Private; } } return this._private; @@ -103,7 +93,9 @@ export default class DydxClient { if (this.signOffChainAction) { this._keys = new Keys(this.host, this.signOffChainAction); } else { - return keysNotSupported; + return notSupported( + 'API key endpoints are not supported since neither web3 nor web3Provider was provided', + ) as Keys; } } return this._keys; @@ -117,7 +109,9 @@ export default class DydxClient { if (this.signOffChainAction) { this._onboarding = new Onboarding(this.host, this.signOffChainAction); } else { - return onboardingNotSupported; + return notSupported( + 'Onboarding endpoints are not supported since neither web3 nor web3Provider was provided', + ) as Onboarding; } } return this._onboarding; @@ -131,9 +125,25 @@ export default class DydxClient { if (this.web3) { this._eth = new Eth(this.web3); } else { - return ethNotSupported; + return notSupported( + 'Eth endpoints are not supported since neither web3 nor web3Provider was provided', + ) as Eth; } } return this._eth; } } + +/** + * Returns a proxy object that throws with the given message when trying to call a function on it. + */ +function notSupported( + errorMessage: string, +): {} { + const handler = { + get() { + throw new Error(errorMessage); + }, + }; + return new Proxy({}, handler); +} diff --git a/src/index.ts b/src/index.ts index a4d8c59..a0b38c9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ export { default as DydxClient } from './dydx-client'; -export * from './types'; -export * from './modules/sign-off-chain-action'; export * from './lib/eth-validation/actions'; +export * from './modules/sign-off-chain-action'; +export * from './types'; diff --git a/src/lib/db.ts b/src/lib/db.ts index a312381..feb52be 100644 --- a/src/lib/db.ts +++ b/src/lib/db.ts @@ -1,3 +1,5 @@ +// TODO: Get rid of this file. + import * as uuid from 'uuid'; export function getUserId( diff --git a/src/lib/eth-validation/actions.ts b/src/lib/eth-validation/actions.ts index b65b153..9da9870 100644 --- a/src/lib/eth-validation/actions.ts +++ b/src/lib/eth-validation/actions.ts @@ -1,5 +1,5 @@ import { ApiMethod } from '@dydxprotocol/starkex-lib'; -import lodash from 'lodash'; +import _ from 'lodash'; const ONBOARDING_STATIC_STRING: string = 'DYDX-ONBOARDING'; @@ -16,8 +16,9 @@ export function generateApiKeyAction({ method: ApiMethod, data?: {}, }): string { + // TODO: The signed data should be consistent with the other private endpoints. return ( - (lodash.isEmpty(data) ? '' : JSON.stringify(data)) + + (_.isEmpty(data) ? '' : JSON.stringify(data)) + requestPath + method ); diff --git a/src/modules/eth/impl.ts b/src/modules/eth.ts similarity index 100% rename from src/modules/eth/impl.ts rename to src/modules/eth.ts diff --git a/src/modules/eth/index.ts b/src/modules/eth/index.ts deleted file mode 100644 index c661bb4..0000000 --- a/src/modules/eth/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as Eth } from './impl'; -export { default as ethNotSupported } from './not-supported'; diff --git a/src/modules/eth/not-supported.ts b/src/modules/eth/not-supported.ts deleted file mode 100644 index 25a9f84..0000000 --- a/src/modules/eth/not-supported.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Eth from './impl'; - -const handler = { - get() { - throw new Error('Eth is not supported'); - }, -}; - -export default new Proxy({}, handler) as Eth; diff --git a/src/modules/keys/impl.ts b/src/modules/keys.ts similarity index 76% rename from src/modules/keys/impl.ts rename to src/modules/keys.ts index 2ded81f..409c698 100644 --- a/src/modules/keys/impl.ts +++ b/src/modules/keys.ts @@ -1,15 +1,16 @@ import { ApiMethod } from '@dydxprotocol/starkex-lib'; -import { generateQueryPath } from '../../helpers/request-helpers'; +import { generateQueryPath } from '../helpers/request-helpers'; import { axiosRequest, -} from '../../lib/axios'; -import { generateApiKeyAction } from '../../lib/eth-validation/actions'; +} from '../lib/axios'; +import { generateApiKeyAction } from '../lib/eth-validation/actions'; import { + ApiKeyResponseObject, SigningMethod, Data, -} from '../../types'; -import { SignOffChainAction } from '../sign-off-chain-action'; +} from '../types'; +import { SignOffChainAction } from './sign-off-chain-action'; export default class Keys { readonly host: string; @@ -28,30 +29,29 @@ export default class Keys { protected async request( method: ApiMethod, endpoint: string, - // TODO: Get ethereumAddress from the provider (same address used for signing). ethereumAddress: string, data?: {}, ): Promise { - const url: string = `/v3/${endpoint}`; - const expiresAt: Date = new Date(); + const requestPath: string = `/v3/${endpoint}`; + const timestamp: Date = new Date(); const signature: string = await this.signOffChainAction.signOffChainAction( ethereumAddress, SigningMethod.Hash, generateApiKeyAction({ - requestPath: url, method, + requestPath, data, }), - expiresAt, + timestamp, ); return axiosRequest({ - url: `${this.host}${url}`, + url: `${this.host}${requestPath}`, method, data, headers: { 'DYDX-SIGNATURE': signature, - 'DYDX-TIMESTAMP': expiresAt.toISOString(), + 'DYDX-TIMESTAMP': timestamp.toISOString(), 'DYDX-ETHEREUM-ADDRESS': ethereumAddress, }, }); @@ -84,20 +84,20 @@ export default class Keys { async getApiKeys( ethereumAddress: string, - ): Promise<{ apiKeys: string[] }> { + ): Promise<{ apiKeys: ApiKeyResponseObject[] }> { return this.get('api-keys', ethereumAddress); } async registerApiKey( apiKey: string, ethereumAddress: string, - ): Promise<{ apiKey: string }> { + ): Promise<{ apiKey: ApiKeyResponseObject }> { return this.post('api-keys', ethereumAddress, { apiKey }); } async deleteApiKey( - ethereumAddress: string, apiKey: string, + ethereumAddress: string, ): Promise { return this.delete('api-keys', ethereumAddress, { apiKey }); } diff --git a/src/modules/keys/index.ts b/src/modules/keys/index.ts deleted file mode 100644 index 3e61039..0000000 --- a/src/modules/keys/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as Keys } from './impl'; -export { default as keysNotSupported } from './not-supported'; diff --git a/src/modules/keys/not-supported.ts b/src/modules/keys/not-supported.ts deleted file mode 100644 index 3beaeb0..0000000 --- a/src/modules/keys/not-supported.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Keys from './impl'; - -const handler = { - get() { - throw new Error('Keys is not supported'); - }, -}; - -export default new Proxy({}, handler) as Keys; diff --git a/src/modules/onboarding/impl.ts b/src/modules/onboarding.ts similarity index 83% rename from src/modules/onboarding/impl.ts rename to src/modules/onboarding.ts index fa59a85..ceb5283 100644 --- a/src/modules/onboarding/impl.ts +++ b/src/modules/onboarding.ts @@ -1,15 +1,15 @@ import { RequestMethod, axiosRequest, -} from '../../lib/axios'; -import { generateOnboardingAction } from '../../lib/eth-validation/actions'; +} from '../lib/axios'; +import { generateOnboardingAction } from '../lib/eth-validation/actions'; import { SigningMethod, AccountResponseObject, Data, UserResponseObject, -} from '../../types'; -import { SignOffChainAction } from '../sign-off-chain-action'; +} from '../types'; +import { SignOffChainAction } from './sign-off-chain-action'; export default class Onboarding { readonly host: string; @@ -28,7 +28,6 @@ export default class Onboarding { protected async post( endpoint: string, data: {}, - // TODO: Get ethereumAddress from the provider (same address used for signing). ethereumAddress: string, ): Promise { const signature: string = await this.signOffChainAction.signOffChainAction( diff --git a/src/modules/onboarding/index.ts b/src/modules/onboarding/index.ts deleted file mode 100644 index 8105438..0000000 --- a/src/modules/onboarding/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as Onboarding } from './impl'; -export { default as onboardingNotSupported } from './not-supported'; diff --git a/src/modules/onboarding/not-supported.ts b/src/modules/onboarding/not-supported.ts deleted file mode 100644 index 99814a4..0000000 --- a/src/modules/onboarding/not-supported.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Onboarding from './impl'; - -const handler = { - get() { - throw new Error('Onboarding is not supported'); - }, -}; - -export default new Proxy({}, handler) as Onboarding; diff --git a/src/modules/private/impl.ts b/src/modules/private.ts similarity index 90% rename from src/modules/private/impl.ts rename to src/modules/private.ts index f527573..8d2ad65 100644 --- a/src/modules/private/impl.ts +++ b/src/modules/private.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-empty-function */ import { KeyPair, Order as StarkExOrder, @@ -10,14 +9,15 @@ import { OrderType, Asset, Withdrawal as StarkExWithdrawal, + InternalOrder, } from '@dydxprotocol/starkex-lib'; -import { generateQueryPath } from '../../helpers/request-helpers'; +import { generateQueryPath } from '../helpers/request-helpers'; import { RequestMethod, axiosRequest, -} from '../../lib/axios'; -import { getAccountId } from '../../lib/db'; +} from '../lib/axios'; +import { getAccountId } from '../lib/db'; import { AccountAction, AccountResponseObject, @@ -35,14 +35,14 @@ import { PositionStatus, TransferResponseObject, UserResponseObject, -} from '../../types'; +} from '../types'; // TODO: Figure out if we can get rid of this. -const METHOD_ENUM_MAP: Partial> = { +const METHOD_ENUM_MAP: Record = { [RequestMethod.DELETE]: ApiMethod.DELETE, [RequestMethod.GET]: ApiMethod.GET, [RequestMethod.POST]: ApiMethod.POST, - // [RequestMethod.PUT]: ApiMethod.PUT, + [RequestMethod.PUT]: ApiMethod.PUT, }; export default class Private { @@ -70,16 +70,16 @@ export default class Private { data?: {}, ): Promise { const requestPath = `/v3/${endpoint}`; - const expiresAt: ISO8601 = new Date().toISOString(); + const timestamp: ISO8601 = new Date().toISOString(); const headers = { - 'DYDX-SIGNATURE': this.generateSignature({ + 'DYDX-SIGNATURE': this.sign({ requestPath, method, - expiresAt, + timestamp, data, }), 'DYDX-API-KEY': this.apiKeyPair.publicKey, - 'DYDX-TIMESTAMP': expiresAt, + 'DYDX-TIMESTAMP': timestamp, }; return axiosRequest({ url: `${this.host}${requestPath}`, @@ -224,7 +224,6 @@ export default class Private { async createOrder( params: PartialBy, positionId: string, - ethereumAddress: string, ): Promise<{ order: OrderResponseObject }> { // TODO: Allow clientId to be a string. // const clientId = params.clientId || Math.random().toString(36).slice(2); @@ -237,13 +236,12 @@ export default class Private { if (!this.starkKeyPair) { throw new Error('Order is not signed and client was not initialized with starkPrivateKey'); } - const orderToSign = { + const orderToSign: InternalOrder = { ...params, clientId, positionId, starkKey: this.starkKeyPair.publicKey, expiresAt: params.expiration, - accountId: getAccountId({ address: ethereumAddress }), }; const starkOrder: StarkExOrder = StarkExOrder.fromInternal(orderToSign); signature = starkOrder.sign(this.starkKeyPair); @@ -372,28 +370,23 @@ export default class Private { // ============ Request Generation Helpers ============ - private generateSignature({ + private sign({ requestPath, method, - expiresAt, + timestamp, data, }: { requestPath: string, method: RequestMethod, - expiresAt: ISO8601, + timestamp: ISO8601, data?: {}, }): string { - const apiMethod = METHOD_ENUM_MAP[method]; - // TODO: Shouldn't need this. - if (!apiMethod) { - throw new Error(`Unsupported method: ${method}`); - } return ApiRequest.fromInternal({ body: data ? JSON.stringify(data) : '', requestPath, - method: apiMethod, + method: METHOD_ENUM_MAP[method], publicKey: this.apiKeyPair.publicKey, - expiresAt, + expiresAt: timestamp, }).sign(this.apiKeyPair.privateKey); } } diff --git a/src/modules/private/index.ts b/src/modules/private/index.ts deleted file mode 100644 index 29ab173..0000000 --- a/src/modules/private/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as Private } from './impl'; -export { default as privateNotSupported } from './not-supported'; diff --git a/src/modules/private/not-supported.ts b/src/modules/private/not-supported.ts deleted file mode 100644 index fd32f11..0000000 --- a/src/modules/private/not-supported.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Private from './impl'; - -const handler = { - get() { - throw new Error('Private endpoints not supported since apiPrivateKey was not provided'); - }, -}; - -export default new Proxy({}, handler) as Private; diff --git a/src/modules/public/impl.ts b/src/modules/public.ts similarity index 93% rename from src/modules/public/impl.ts rename to src/modules/public.ts index de1c14a..1e78b43 100644 --- a/src/modules/public/impl.ts +++ b/src/modules/public.ts @@ -1,5 +1,5 @@ -import { generateQueryPath } from '../../helpers/request-helpers'; -import { axiosRequest } from '../../lib/axios'; +import { generateQueryPath } from '../helpers/request-helpers'; +import { axiosRequest } from '../lib/axios'; import { Data, HistoricalFundingResponseObject, @@ -10,7 +10,7 @@ import { MarketStatisticResponseObject, OrderbookResponseOrder, Trade, -} from '../../types'; +} from '../types'; export default class Public { readonly host: string; diff --git a/src/modules/public/index.ts b/src/modules/public/index.ts deleted file mode 100644 index d56182f..0000000 --- a/src/modules/public/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as Public } from './impl'; diff --git a/src/modules/sign-off-chain-action.ts b/src/modules/sign-off-chain-action.ts index acc1e9c..5c36412 100644 --- a/src/modules/sign-off-chain-action.ts +++ b/src/modules/sign-off-chain-action.ts @@ -18,16 +18,17 @@ import { } from '../types'; import { Signer } from './signer'; +// TODO: Rename expiration to timestamp? const EIP712_WALLET_OFF_CHAIN_ACTION_ALL_STRUCT = [ { type: 'string', name: 'action' }, { type: 'string', name: 'expiration' }, ]; export class SignOffChainAction extends Signer { - private domain: string; - private version: string; - private networkId: number; - private EIP712_OFF_CHAIN_ACTION_ALL_STRUCT_STRING: string; + private readonly domain: string; + private readonly version: string; + private readonly networkId: number; + private readonly EIP712_OFF_CHAIN_ACTION_ALL_STRUCT_STRING: string; constructor( web3: Web3, @@ -44,10 +45,12 @@ export class SignOffChainAction extends Signer { this.domain = domain; this.networkId = networkId; this.version = version; - this.EIP712_OFF_CHAIN_ACTION_ALL_STRUCT_STRING = 'dYdX(' + + this.EIP712_OFF_CHAIN_ACTION_ALL_STRUCT_STRING = ( + 'dYdX(' + 'string action,' + 'string expiration' + - ')'; + ')' + ); } public async signOffChainAction( @@ -62,25 +65,26 @@ export class SignOffChainAction extends Signer { case SigningMethod.Compatibility: { const hash = this.getOffChainActionHash(action, expiration); - // If the address is in the wallet, use it to sign so we don't have to use the - // web3 provider. + // If the address is in the wallet, sign with it so we don't have to use the web3 provider. const walletAccount: EthereumAccount | undefined = ( - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ - (this.web3.eth.accounts.wallet as any)[signer] // TODO: Fix types. + // Hack: wallet type incorrectly has index signature on number but not string + this.web3.eth.accounts.wallet[signer as unknown as number] ); - let rawSignature: string | null = null; - if (walletAccount) { - rawSignature = walletAccount.sign(hash).signature; - } - rawSignature = rawSignature || await this.web3.eth.sign(hash, signer); + + const rawSignature = walletAccount + ? walletAccount.sign(hash).signature + : await this.web3.eth.sign(hash, signer); + const hashSig = createTypedSignature(rawSignature, SignatureTypes.DECIMAL); if (signingMethod === SigningMethod.Hash) { return hashSig; } + const unsafeHashSig = createTypedSignature(rawSignature, SignatureTypes.NO_PREPEND); if (signingMethod === SigningMethod.UnsafeHash) { return unsafeHashSig; } + if (this.signOffChainActionIsValid(unsafeHashSig, signer, action, expiration)) { return unsafeHashSig; } diff --git a/src/modules/signer.ts b/src/modules/signer.ts index 174fdbc..5230f2f 100644 --- a/src/modules/signer.ts +++ b/src/modules/signer.ts @@ -1,6 +1,12 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ import { promisify } from 'es6-promisify'; import Web3 from 'web3'; +import { + AbstractProvider, +} from 'web3-core'; +import { + JsonRpcPayload, + JsonRpcResponse, +} from 'web3-core-helpers'; import { stripHexPrefix, @@ -11,7 +17,7 @@ import { } from '../types'; export abstract class Signer { - protected web3: Web3; + protected readonly web3: Web3; // ============ Constructor ============ @@ -55,12 +61,20 @@ export abstract class Signer { let rpcMethod: string; let rpcData: {}; - const provider: any = this.web3.currentProvider!; - let sendAsync: any; + let provider = this.web3.currentProvider; + if (provider === null) { + throw new Error('Cannot sign since Web3 currentProvider is null'); + } + if (typeof provider === 'string') { + throw new Error('Cannot sign since Web3 currentProvider is a string'); + } + provider = provider as AbstractProvider; + + let sendAsync: (param: JsonRpcPayload) => Promise; switch (signingMethod) { case SigningMethod.TypedData: - sendAsync = promisify(provider.send).bind(provider); + sendAsync = promisify(provider.send!).bind(provider); rpcMethod = 'eth_signTypedData'; rpcData = data; break; @@ -91,7 +105,8 @@ export abstract class Signer { }); if (response.error) { - throw new Error(response.error.message); + // TODO: Is this right? + throw new Error((response.error as unknown as { message: string }).message); } return `0x${stripHexPrefix(response.result)}0${SignatureTypes.NO_PREPEND}`; } diff --git a/src/types.ts b/src/types.ts index b56771f..1d2a0ad 100644 --- a/src/types.ts +++ b/src/types.ts @@ -19,6 +19,7 @@ export type Provider = HttpProvider | IpcProvider | WebsocketProvider; export type PositionsMap = { [market: string]: PositionResponseObject }; +// TODO: Find a better way. // eslint-disable-next-line @typescript-eslint/no-explicit-any export type Data = any; @@ -109,6 +110,10 @@ export interface ApiWithdrawal extends ApiStarkwareSigned { // ============ API Response Types ============ +export interface ApiKeyResponseObject { + apiKey: string; +} + export interface MarketResponseObject { market: PerpetualMarket; status: string; From c65d1aca1a2fdf7d77e4c5e2e8e9d0fbb39bcc30 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Tue, 24 Nov 2020 10:47:40 -0800 Subject: [PATCH 027/180] v0.0.17 Fix onboarding for frontend (#21) * Allow onboarding signing to be done separately * Allow signing method to be passed to keys module * v0.0.17 --- package-lock.json | 2 +- package.json | 2 +- src/modules/keys.ts | 22 +++++++++++++++------- src/modules/onboarding.ts | 23 ++++++++++++++++------- src/modules/private.ts | 4 ++-- 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8192742..b35bbbf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.16", + "version": "0.0.17", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5ab07b4..e880c8e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.16", + "version": "0.0.17", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/keys.ts b/src/modules/keys.ts index 409c698..267f622 100644 --- a/src/modules/keys.ts +++ b/src/modules/keys.ts @@ -30,13 +30,14 @@ export default class Keys { method: ApiMethod, endpoint: string, ethereumAddress: string, + signingMethod: SigningMethod, data?: {}, ): Promise { const requestPath: string = `/v3/${endpoint}`; const timestamp: Date = new Date(); const signature: string = await this.signOffChainAction.signOffChainAction( ethereumAddress, - SigningMethod.Hash, + signingMethod, generateApiKeyAction({ method, requestPath, @@ -60,45 +61,52 @@ export default class Keys { protected async get( endpoint: string, ethereumAddress: string, + signingMethod: SigningMethod = SigningMethod.Hash, ): Promise { - return this.request(ApiMethod.GET, endpoint, ethereumAddress); + return this.request(ApiMethod.GET, endpoint, ethereumAddress, signingMethod); } protected async post( endpoint: string, ethereumAddress: string, + signingMethod: SigningMethod = SigningMethod.Hash, data: {}, ): Promise { - return this.request(ApiMethod.POST, endpoint, ethereumAddress, data); + return this.request(ApiMethod.POST, endpoint, ethereumAddress, signingMethod, data); } protected async delete( endpoint: string, ethereumAddress: string, + signingMethod: SigningMethod = SigningMethod.Hash, params: {}, ): Promise { - return this.request(ApiMethod.DELETE, generateQueryPath(endpoint, params), ethereumAddress); + const requestPath = generateQueryPath(endpoint, params); + return this.request(ApiMethod.DELETE, requestPath, ethereumAddress, signingMethod); } // ============ Requests ============ async getApiKeys( ethereumAddress: string, + signingMethod: SigningMethod = SigningMethod.Hash, ): Promise<{ apiKeys: ApiKeyResponseObject[] }> { - return this.get('api-keys', ethereumAddress); + return this.get('api-keys', ethereumAddress, signingMethod); } async registerApiKey( apiKey: string, ethereumAddress: string, + signingMethod: SigningMethod = SigningMethod.Hash, ): Promise<{ apiKey: ApiKeyResponseObject }> { - return this.post('api-keys', ethereumAddress, { apiKey }); + return this.post('api-keys', ethereumAddress, signingMethod, { apiKey }); } async deleteApiKey( apiKey: string, ethereumAddress: string, + signingMethod: SigningMethod = SigningMethod.Hash, ): Promise { - return this.delete('api-keys', ethereumAddress, { apiKey }); + return this.delete('api-keys', ethereumAddress, signingMethod, { apiKey }); } } diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index ceb5283..e00b552 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -29,20 +29,16 @@ export default class Onboarding { endpoint: string, data: {}, ethereumAddress: string, + signature: string | null = null, + signingMethod: SigningMethod = SigningMethod.Hash, ): Promise { - const signature: string = await this.signOffChainAction.signOffChainAction( - ethereumAddress, - SigningMethod.Hash, - generateOnboardingAction(), - ); - const url: string = `/v3/${endpoint}`; return axiosRequest({ url: `${this.host}${url}`, method: RequestMethod.POST, data, headers: { - 'DYDX-SIGNATURE': signature, + 'DYDX-SIGNATURE': signature || await this.sign(ethereumAddress, signingMethod), 'DYDX-ETHEREUM-ADDRESS': ethereumAddress, }, }); @@ -67,4 +63,17 @@ export default class Onboarding { ethereumAddress, ); } + + // ============ Signing ============ + + public async sign( + ethereumAddress: string, + signingMethod: SigningMethod = SigningMethod.Hash, + ): Promise { + return this.signOffChainAction.signOffChainAction( + ethereumAddress, + signingMethod, + generateOnboardingAction(), + ); + } } diff --git a/src/modules/private.ts b/src/modules/private.ts index 8d2ad65..4972345 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -368,9 +368,9 @@ export default class Private { ); } - // ============ Request Generation Helpers ============ + // ============ Signing ============ - private sign({ + protected sign({ requestPath, method, timestamp, From 1c6640e6f1f0e44cbfd635095ea3d83e6dc086c8 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Mon, 30 Nov 2020 10:38:10 -0800 Subject: [PATCH 028/180] v0.0.18: allow createUser to pass in a signature (#22) * allow createUser to pass in a signature * eh1 --- package-lock.json | 2 +- package.json | 2 +- src/modules/onboarding.ts | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b35bbbf..f55f47c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.17", + "version": "0.0.18", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e880c8e..fa934e5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.17", + "version": "0.0.18", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index e00b552..cc52208 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -52,6 +52,8 @@ export default class Onboarding { apiKey: string, }, ethereumAddress: string, + signature?: string, + signingMethod?: SigningMethod, ): Promise<{ apiKey: string, user: UserResponseObject, @@ -61,6 +63,8 @@ export default class Onboarding { 'onboarding', params, ethereumAddress, + signature, + signingMethod, ); } From 169c5d082d6f93819a5a69c46fbcc6877e5b29b7 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Tue, 1 Dec 2020 13:52:20 -0800 Subject: [PATCH 029/180] add documentation (#23) --- package-lock.json | 2 +- package.json | 2 +- src/modules/keys.ts | 19 ++++++ src/modules/onboarding.ts | 11 +++ src/modules/private.ts | 137 ++++++++++++++++++++++++++++++++++++++ src/modules/public.ts | 40 +++++++++++ src/types.ts | 3 + 7 files changed, 212 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index f55f47c..f85531f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.18", + "version": "0.0.19", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index fa934e5..5076533 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.18", + "version": "0.0.19", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/keys.ts b/src/modules/keys.ts index 267f622..ce8a18d 100644 --- a/src/modules/keys.ts +++ b/src/modules/keys.ts @@ -87,6 +87,12 @@ export default class Keys { // ============ Requests ============ + /** + * @description get the apiKeys associated with an ethereumAddress + * + * @param ethereumAddress the apiKeys are for + * @param signingMethod used for the signature that validates the request + */ async getApiKeys( ethereumAddress: string, signingMethod: SigningMethod = SigningMethod.Hash, @@ -94,6 +100,13 @@ export default class Keys { return this.get('api-keys', ethereumAddress, signingMethod); } + /** + *@description register an apiKey for an ethereumAddress + * + * @param apiKey to be registered for an ethereumAddress + * @param ethereumAddress the apiKey is for + * @param signingMethod used to validate the request + */ async registerApiKey( apiKey: string, ethereumAddress: string, @@ -102,6 +115,12 @@ export default class Keys { return this.post('api-keys', ethereumAddress, signingMethod, { apiKey }); } + /** + * + * @param apiKey to be deleted + * @param ethereumAddress the apiKey is for + * @param signingMethod used to validate the request + */ async deleteApiKey( apiKey: string, ethereumAddress: string, diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index cc52208..d3c1b54 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -46,6 +46,17 @@ export default class Onboarding { // ============ Requests ============ + /** + * @description create a user, account and apiKey in one onboarding request + * + * @param { + * @starkKey is the unique public key for starkwareLib operations used in the future + * @apiKey is the unique public key for starkwareLib apiKey operations used in the future + * } + * @param ethereumAddress of the account + * @param signature validating the request + * @param signingMethod for the request + */ async createUser( params: { starkKey: string, diff --git a/src/modules/private.ts b/src/modules/private.ts index 4972345..7b78df2 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -119,6 +119,9 @@ export default class Private { // ============ Requests ============ + /** + * @description get a signature for the ethereumAddress if registered + */ async getRegistration(): Promise<{ signature: string }> { return this.get( 'registration', @@ -126,6 +129,9 @@ export default class Private { ); } + /** + * @description get the user associated with the ethereumAddress + */ async getUser(): Promise<{ user: UserResponseObject }> { return this.get( 'users', @@ -133,6 +139,15 @@ export default class Private { ); } + /** + * @description update information for the user + * + * @param { + * @email associated with the user + * @username for the user + * @userData specifiying information about the user + * } + */ async updateUser({ email, username, @@ -152,6 +167,12 @@ export default class Private { ); } + /** + * @description create an account for an ethereumAddress + * + * @param starkKey for the account that will be used as the public key in starkwareEx-Lib requests + * going forward for this account. + */ async createAccount( starkKey: string, ): Promise<{ account: AccountResponseObject }> { @@ -163,6 +184,11 @@ export default class Private { ); } + /** + * @description get account associated with an ethereumAddress and accountNumber 0 + * + * @param ethereumAddress the account is associated with + */ async getAccount(ethereumAddress: string): Promise<{ account: AccountResponseObject }> { return this.get( `accounts/${getAccountId({ address: ethereumAddress })}`, @@ -170,6 +196,9 @@ export default class Private { ); } + /** + * @description get all accounts associated with an ethereumAddress + */ async getAccounts(): Promise<{ account: AccountResponseObject[] }> { return this.get( 'accounts', @@ -177,6 +206,16 @@ export default class Private { ); } + /** + * @description get all positions for an account, meeting query parameters + * + * @param { + * @market the positions are for + * @status of the positions + * @limit to the number of positions returned + * @createdBeforeOrAt latest the positions could have been created + * } + */ async getPositions( params: { market?: Market, @@ -191,6 +230,17 @@ export default class Private { ); } + /** + * @description get orders for a user by a set of query parameters + * + * @param { + * @market the orders are for + * @status the orders have + * @side of the book the orders are on + * @type of order + * @limit to the number of orders returned + * @createdBeforeOrAt sets the time of the last fill that will be received * } + */ async getOrders( params: { market?: Market, @@ -207,6 +257,11 @@ export default class Private { ); } + /** + * @description get an order by a unique id + * + * @param orderId of the order + */ async getOrderById(orderId: string): Promise<{ order: OrderResponseObject }> { return this.get( `orders/${orderId}`, @@ -214,6 +269,11 @@ export default class Private { ); } + /** + * @description get an order by a clientId + * + * @param clientId of the order + */ async getOrderByClientId(clientId: string): Promise<{ order: OrderResponseObject }> { return this.get( `orders/client/${clientId}`, @@ -221,6 +281,25 @@ export default class Private { ); } + /** + *@description place a new order + * + * @param { + * @market of the order + * @side of the order + * @type of the order + * @timeInForce of the order + * @postOnly of the order + * @size of the order + * @price of the order + * @limitFee of the order + * @expiration of the order + * @cancelId if the order is replacing an existing one + * @triggerPrice of the order if the order is a triggerable order + * @trailingPercent of the order if the order is a trailing stop order + * } + * @param positionId associated with the order + */ async createOrder( params: PartialBy, positionId: string, @@ -259,6 +338,11 @@ export default class Private { ); } + /** + * @description cancel a specific order for a user by the order's unique id + * + * @param orderId of the order being canceled + */ async cancelOrder(orderId: string): Promise { return this.delete( `orders/${orderId}`, @@ -266,6 +350,11 @@ export default class Private { ); } + /** + * @description cancel all orders for a user for a specific market + * + * @param market of the orders being canceled + */ async cancelAllOrders(market?: Market): Promise { const params = market ? { market } : {}; return this.delete( @@ -274,6 +363,16 @@ export default class Private { ); } + /** + *@description get fills for a user by a set of query parameters + * + * @param { + * @market the fills are for + * @orderId associated with the fills + * @limit to the number of fills returned + * @createdBeforeOrAt sets the time of the last fill that will be received + * } + */ async getFills( params: { market?: Market, @@ -288,6 +387,15 @@ export default class Private { ); } + /** + * @description get transfers for a user by a set of query parameters + * + * @param { + * @type of transfer + * @limit to the number of transfers returned + * @createdBeforeOrAt sets the time of the last transfer that will be received + * } + */ async getTransfers( params: { type?: AccountAction, @@ -301,6 +409,17 @@ export default class Private { ); } + /** + * @description post a new withdrawal + * + * @param { + * @amount specifies the size of the withdrawal + * @asset specifies the asset being withdrawn + * @toAddress is the address being withdrawn to + * @clientId specifies the clientId for the address + * } + * @param positionId specifies the associated position for the transfer + */ async createWithdrawal( params: PartialBy, positionId: string, @@ -342,6 +461,15 @@ export default class Private { ); } + /** + * @description post a new deposit + * + * @param { + * @amount specifies the size of the deposit + * @asset specifies the asset being deposited + * @fromAddress is the address being deposited from + * } + */ async createDeposit( params: { amount: string, @@ -355,6 +483,15 @@ export default class Private { ); } + /** + * @description get a user's funding payments by a set of query parameters + * + * @param { + * @market the funding payments are for + * @limit to the number of funding payments returned + * @effectiveBeforeOrAt sets the latest funding payment received + * } + */ async getFundingPayments( params: { market?: Market, diff --git a/src/modules/public.ts b/src/modules/public.ts index 1e78b43..e75c3a6 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -19,6 +19,11 @@ export default class Public { this.host = host; } + /** + * @description check if a user exists for an ethereum address + * + * @param ethereumAddress of the user + */ checkIfUserExists( ethereumAddress: string, ): Promise<{ exists: boolean }> { @@ -26,6 +31,11 @@ export default class Public { return this.sendPublicGetRequest(uri, { ethereumAddress }); } + /** + * @description check if a username already exists + * + * @param username being queried + */ checkIfUsernameExists( username: string, ): Promise<{ exists: boolean }> { @@ -33,11 +43,21 @@ export default class Public { return this.sendPublicGetRequest(uri, { username }); } + /** + * @description get market information for either all markets or a specific market + * + * @param market if only one market should be returned + */ getMarkets(market?: Market): Promise<{ markets: MarketResponseObject }> { const uri: string = 'v3/markets'; return this.sendPublicGetRequest(uri, { market }); } + /** + * @description get orderbook for a specific market + * + * @param market being queried + */ getOrderBook(market: Market): Promise<{ orderbook: { bids: OrderbookResponseOrder[], @@ -47,6 +67,14 @@ export default class Public { return this.sendPublicGetRequest(`v3/orderbook/${market}`, {}); } + /** + * @description get one or more market specific statistics for a time period + * + * @param { + * @market being queried + * @days if a specific time period statistic should be returned + * } + */ getStats({ market, days, @@ -59,6 +87,12 @@ export default class Public { return this.sendPublicGetRequest(uri, { days }); } + /** + * @description get trades for a market up to a certain time + * + * @param market being checked + * @param startingBeforeOrAt latest trade being returned + */ getTrades({ market, startingBeforeOrAt, @@ -72,6 +106,12 @@ export default class Public { } + /** + * @description get historical funding rates for a market up to a certain time + * + * @param market being checked + * @param effectiveBeforeOrAt latest historical funding rate being returned + */ getHistoricalFunding(market: Market, effectiveBeforeOrAt: ISO8601): Promise<{ historicalFunding: HistoricalFundingResponseObject }> { const uri: string = `v3/historical-funding/${market}`; diff --git a/src/types.ts b/src/types.ts index 1d2a0ad..00247be 100644 --- a/src/types.ts +++ b/src/types.ts @@ -99,6 +99,9 @@ export interface ApiOrder extends ApiStarkwareSigned { timeInForce: TimeInForce; postOnly: boolean; limitFee: string; + cancelId?: string; + triggerPrice?: string; + trailingPercent?: string; } export interface ApiWithdrawal extends ApiStarkwareSigned { From 1298f3b3605a84d126814a20cfe10eb2a22c614d Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Fri, 11 Dec 2020 12:34:08 -0800 Subject: [PATCH 030/180] Update starkex-lib (#24) * Update starkex-lib * Update starkex-lib --- package-lock.json | 126 +++++----------------------------- package.json | 2 +- src/lib/axios/axiosRequest.ts | 3 +- src/modules/private.ts | 54 +++++++-------- src/modules/public.ts | 80 ++++++++++----------- src/types.ts | 41 +++++++---- 6 files changed, 112 insertions(+), 194 deletions(-) diff --git a/package-lock.json b/package-lock.json index f85531f..59cf846 100644 --- a/package-lock.json +++ b/package-lock.json @@ -458,14 +458,16 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.2.4.tgz", - "integrity": "sha512-/uQhO3sgnGHhlScm8VRvJGJZybPDuXxQOHMtzf1/g7S9kgsfuffm8I/5NTWpjRwRkKoD1K4G0Nh6INyrjyQE3Q==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.4.0.tgz", + "integrity": "sha512-7Evy+34kEBkaKLu+sv7N+WM8T/WsJRdfNpUW/pOAJJWaGHja8oGb3ZmgKJdYWC0tLJAgma3A1KKm5c3eueUQMg==", "requires": { - "@types/big.js": "^4.0.5", + "@types/big.js": "^6.0.0", "@types/elliptic": "^6.4.12", - "big.js": "5.2.2", - "starkware-crypto": "^1.9.7" + "big.js": "^6.0.3", + "bip39": "^3.0.3", + "ethereum-cryptography": "^0.1.3", + "hash.js": "^1.1.7" } }, "@eslint/eslintrc": { @@ -1100,9 +1102,9 @@ } }, "@types/big.js": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-4.0.5.tgz", - "integrity": "sha512-D9KFrAt05FDSqLo7PU9TDHfDgkarlwdkuwFsg7Zm4xl62tTNaz+zN+Tkcdx2wGLBbSMf8BnoMhOVeUGUaJfLKg==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.0.0.tgz", + "integrity": "sha512-EESIS1UIBimpfgoO0Ns9C4wnu/dA5pGa6mZDBSwZkshPRAmgLPu9yHEM8xDsmhZRT5sy+q/o6y922G2tP5kY2w==" }, "@types/bn.js": { "version": "4.11.6", @@ -1450,11 +1452,6 @@ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, - "aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" - }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1860,9 +1857,9 @@ } }, "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.0.3.tgz", + "integrity": "sha512-n6yn1FyVL1EW2DBAr4jlU/kObhRzmr+NNRESl65VIOT8WBJj/Kezpx2zFdhJUqYI6qrtTW7moCStYL5VxeVdPA==" }, "bignumber.js": { "version": "8.1.1", @@ -1876,9 +1873,9 @@ "dev": true }, "bip39": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.2.tgz", - "integrity": "sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.3.tgz", + "integrity": "sha512-P0dKrz4g0V0BjXfx7d9QNkJ/Txcz/k+hM9TnjqjUaXtuOfAvxXSw2rJw8DX0e3ZPwnK/IgDxoRqf0bvoVCqbMg==", "requires": { "@types/node": "11.11.6", "create-hash": "^1.1.0", @@ -2962,23 +2959,6 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "enc-utils": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/enc-utils/-/enc-utils-2.2.2.tgz", - "integrity": "sha512-gdWLQsnxYYhFRPrSCPrxsqX/4xXxAcb+63u65pdBBmCA/GKhGfZjXKKWse6UfMXc8Nlvz6jKPtRoCDhYo8Kiaw==", - "requires": { - "bn.js": "4.11.8", - "is-typedarray": "1.0.0", - "typedarray-to-buffer": "3.1.5" - }, - "dependencies": { - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - } - } - }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -3636,41 +3616,6 @@ } } }, - "ethereumjs-util": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.7.tgz", - "integrity": "sha512-vU5rtZBlZsgkTw3o6PDKyB8li2EgLavnAbsKcfsH2YhHH1Le+PP8vEiMnAnvgc1B6uMoaM5GDCrVztBw0Q5K9g==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.4" - } - }, - "ethereumjs-wallet": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.1.tgz", - "integrity": "sha512-3Z5g1hG1das0JWU6cQ9HWWTY2nt9nXCcwj7eXVNAHKbo00XAZO8+NHlwdgXDWrL0SXVQMvTWN8Q/82DRH/JhPw==", - "requires": { - "aes-js": "^3.1.1", - "bs58check": "^2.1.2", - "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^7.0.2", - "randombytes": "^2.0.6", - "scrypt-js": "^3.0.1", - "utf8": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, "ethers": { "version": "4.0.48", "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", @@ -7308,22 +7253,6 @@ } } }, - "rsv-signature": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/rsv-signature/-/rsv-signature-1.1.0.tgz", - "integrity": "sha512-8eoYjJMeWeLSejckVCYQ3teOdpaiBp7w64xDYX1qBgVLojjHXKD8dOq5eUDelAtyuYRDS1T+HVuGEegvzgNdwA==", - "requires": { - "bn.js": "^4.8.0", - "enc-utils": "^2.2.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -7970,27 +7899,6 @@ } } }, - "starkware-crypto": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/starkware-crypto/-/starkware-crypto-1.9.7.tgz", - "integrity": "sha512-KY8KIIh09wATGctKYhoHyaR3lIWVEO1+G6q+VJkvblhd66InHi2hZ3u1Ucp7rMVgijsSulCefVU7QLlE5QKtNw==", - "requires": { - "bip39": "^3.0.2", - "bn.js": "^5.1.2", - "elliptic": "^6.5.3", - "enc-utils": "^2.2.2", - "ethereumjs-wallet": "^1.0.0", - "hash.js": "^1.1.7", - "js-sha3": "^0.8.0", - "rsv-signature": "^1.1.0", - "starkware-types": "^1.1.0" - } - }, - "starkware-types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/starkware-types/-/starkware-types-1.2.0.tgz", - "integrity": "sha512-6/G+VGJ59nzaNOOampAP/aAjgkzIeJBWIpIX8CJEnJwz5GaADk8hFTe9jv+yqpW4nAwPJk+THw1WvEoEaaR07A==" - }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", diff --git a/package.json b/package.json index 5076533..33bf1c1 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-lib": "^0.2.4", + "@dydxprotocol/starkex-lib": "^0.4.0", "@types/web3": "1.0.18", "axios": "^0.21.0", "bignumber.js": "^8.1.1", diff --git a/src/lib/axios/axiosRequest.ts b/src/lib/axios/axiosRequest.ts index 6c14bd6..8066256 100644 --- a/src/lib/axios/axiosRequest.ts +++ b/src/lib/axios/axiosRequest.ts @@ -1,12 +1,11 @@ import axios, { AxiosRequestConfig } from 'axios'; -import { Data } from '../../types'; import { AxiosServerError, AxiosError, } from './errors'; -export async function axiosRequest(options: AxiosRequestConfig): Promise { +export async function axiosRequest(options: AxiosRequestConfig): Promise { try { const response = await axios(options); return response.data; diff --git a/src/modules/private.ts b/src/modules/private.ts index 7b78df2..06c4a5a 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -1,15 +1,12 @@ import { + ApiMethod, KeyPair, - Order as StarkExOrder, + OrderWithClientId, + SignableApiRequest, + SignableOrder, + SignableWithdrawal, asEcKeyPair, asSimpleKeyPair, - ApiMethod, - ApiRequest, - OrderSide, - OrderType, - Asset, - Withdrawal as StarkExWithdrawal, - InternalOrder, } from '@dydxprotocol/starkex-lib'; import { generateQueryPath } from '../helpers/request-helpers'; @@ -23,13 +20,16 @@ import { AccountResponseObject, ApiOrder, ApiWithdrawal, + Asset, Data, FillResponseObject, FundingResponseObject, ISO8601, Market, OrderResponseObject, + OrderSide, OrderStatus, + OrderType, PartialBy, PositionResponseObject, PositionStatus, @@ -70,16 +70,16 @@ export default class Private { data?: {}, ): Promise { const requestPath = `/v3/${endpoint}`; - const timestamp: ISO8601 = new Date().toISOString(); + const isoTimestamp: ISO8601 = new Date().toISOString(); const headers = { 'DYDX-SIGNATURE': this.sign({ requestPath, method, - timestamp, + isoTimestamp, data, }), 'DYDX-API-KEY': this.apiKeyPair.publicKey, - 'DYDX-TIMESTAMP': timestamp, + 'DYDX-TIMESTAMP': isoTimestamp, }; return axiosRequest({ url: `${this.host}${requestPath}`, @@ -315,14 +315,17 @@ export default class Private { if (!this.starkKeyPair) { throw new Error('Order is not signed and client was not initialized with starkPrivateKey'); } - const orderToSign: InternalOrder = { - ...params, + const orderToSign: OrderWithClientId = { + humanSize: params.size, + humanPrice: params.price, + humanLimitFee: params.limitFee, + market: params.market, + side: params.side, + expirationIsoTimestamp: params.expiration, clientId, positionId, - starkKey: this.starkKeyPair.publicKey, - expiresAt: params.expiration, }; - const starkOrder: StarkExOrder = StarkExOrder.fromInternal(orderToSign); + const starkOrder = SignableOrder.fromOrder(orderToSign); signature = starkOrder.sign(this.starkKeyPair); } @@ -401,7 +404,7 @@ export default class Private { type?: AccountAction, limit?: number, createdBeforeOrAt?: ISO8601, - }, + } = {}, ): Promise<{ transfers: TransferResponseObject[] }> { return this.get( 'transfers', @@ -438,14 +441,12 @@ export default class Private { ); } const withdrawalToSign = { - ...params, + humanAmount: params.amount, + expirationIsoTimestamp: params.expiration, clientId, - starkKey: this.starkKeyPair.publicKey, - debitAmount: params.amount, - expiresAt: params.expiration, positionId, }; - const starkWithdrawal: StarkExWithdrawal = StarkExWithdrawal.fromInternal(withdrawalToSign); + const starkWithdrawal = SignableWithdrawal.fromWithdrawal(withdrawalToSign); signature = starkWithdrawal.sign(this.starkKeyPair); } @@ -510,20 +511,19 @@ export default class Private { protected sign({ requestPath, method, - timestamp, + isoTimestamp, data, }: { requestPath: string, method: RequestMethod, - timestamp: ISO8601, + isoTimestamp: ISO8601, data?: {}, }): string { - return ApiRequest.fromInternal({ + return new SignableApiRequest({ body: data ? JSON.stringify(data) : '', requestPath, method: METHOD_ENUM_MAP[method], - publicKey: this.apiKeyPair.publicKey, - expiresAt: timestamp, + isoTimestamp, }).sign(this.apiKeyPair.privateKey); } } diff --git a/src/modules/public.ts b/src/modules/public.ts index e75c3a6..bd83acc 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -5,10 +5,10 @@ import { HistoricalFundingResponseObject, ISO8601, Market, - MarketResponseObject, + MarketsResponseObject, MarketStatisticDay, MarketStatisticResponseObject, - OrderbookResponseOrder, + OrderbookResponseObject, Trade, } from '../types'; @@ -19,16 +19,30 @@ export default class Public { this.host = host; } + // ============ Request Helpers ============ + + private get( + requestPath: string, + params: {}, + ): Promise { + return axiosRequest({ + method: 'GET', + url: `${this.host}/v3/${generateQueryPath(requestPath, params)}`, + }); + } + + // ============ Requests ============ + /** * @description check if a user exists for an ethereum address * * @param ethereumAddress of the user */ - checkIfUserExists( + doesUserExistWithAddress( ethereumAddress: string, ): Promise<{ exists: boolean }> { - const uri: string = 'v3/users/exists'; - return this.sendPublicGetRequest(uri, { ethereumAddress }); + const uri: string = 'users/exists'; + return this.get(uri, { ethereumAddress }); } /** @@ -36,11 +50,11 @@ export default class Public { * * @param username being queried */ - checkIfUsernameExists( + doesUserExistWithUsername( username: string, ): Promise<{ exists: boolean }> { - const uri: string = 'v3/usernames'; - return this.sendPublicGetRequest(uri, { username }); + const uri: string = 'usernames'; + return this.get(uri, { username }); } /** @@ -48,9 +62,9 @@ export default class Public { * * @param market if only one market should be returned */ - getMarkets(market?: Market): Promise<{ markets: MarketResponseObject }> { - const uri: string = 'v3/markets'; - return this.sendPublicGetRequest(uri, { market }); + getMarkets(market?: Market): Promise<{ markets: MarketsResponseObject }> { + const uri: string = 'markets'; + return this.get(uri, { market }); } /** @@ -58,13 +72,8 @@ export default class Public { * * @param market being queried */ - getOrderBook(market: Market): Promise<{ - orderbook: { - bids: OrderbookResponseOrder[], - asks: OrderbookResponseOrder[], - } - }> { - return this.sendPublicGetRequest(`v3/orderbook/${market}`, {}); + getOrderBook(market: Market): Promise<{ orderbook: OrderbookResponseObject }> { + return this.get(`orderbook/${market}`, {}); } /** @@ -82,9 +91,8 @@ export default class Public { market: Market, days?: MarketStatisticDay, }): Promise<{ markets: MarketStatisticResponseObject }> { - const uri: string = `v3/stats/${market}`; - - return this.sendPublicGetRequest(uri, { days }); + const uri: string = `stats/${market}`; + return this.get(uri, { days }); } /** @@ -100,10 +108,8 @@ export default class Public { market: Market, startingBeforeOrAt?: ISO8601, }): Promise<{ trades: Trade[] }> { - const uri: string = `v3/trades/${market}`; - - return this.sendPublicGetRequest(uri, { startingBeforeOrAt }); - + const uri: string = `trades/${market}`; + return this.get(uri, { startingBeforeOrAt }); } /** @@ -112,20 +118,14 @@ export default class Public { * @param market being checked * @param effectiveBeforeOrAt latest historical funding rate being returned */ - getHistoricalFunding(market: Market, effectiveBeforeOrAt: ISO8601): - Promise<{ historicalFunding: HistoricalFundingResponseObject }> { - const uri: string = `v3/historical-funding/${market}`; - - return this.sendPublicGetRequest(uri, { effectiveBeforeOrAt }); - } - - private sendPublicGetRequest( - requestPath: string, - params: {}, - ): Promise { - return axiosRequest({ - method: 'GET', - url: `${this.host}/${generateQueryPath(requestPath, params)}`, - }); + getHistoricalFunding({ + market, + effectiveBeforeOrAt, + }: { + market: Market, + effectiveBeforeOrAt?: ISO8601, + }): Promise<{ historicalFunding: HistoricalFundingResponseObject }> { + const uri: string = `historical-funding/${market}`; + return this.get(uri, { effectiveBeforeOrAt }); } } diff --git a/src/types.ts b/src/types.ts index 00247be..bd79e82 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,12 +1,11 @@ import { - Asset, - OrderSide, - PerpetualMarket, + DydxAsset, + DydxMarket, + StarkwareOrderSide, } from '@dydxprotocol/starkex-lib'; import BigNumber from 'bignumber.js'; import { HttpProvider, IpcProvider, WebsocketProvider } from 'web3-core'; -export { Asset, OrderSide } from '@dydxprotocol/starkex-lib'; export { Account as EthereumAccount } from 'web3-core'; export type ISO8601 = string; @@ -25,8 +24,12 @@ export type Data = any; // ============ Enums ============ -export type Market = PerpetualMarket; -export const Market = PerpetualMarket; +export type Market = DydxMarket; +export const Market = DydxMarket; +export type Asset = DydxAsset; +export const Asset = DydxAsset; +export type OrderSide = StarkwareOrderSide; +export const OrderSide = StarkwareOrderSide; export enum MarketStatisticDay { ONE = '1', @@ -90,7 +93,7 @@ interface ApiStarkwareSigned { } export interface ApiOrder extends ApiStarkwareSigned { - market: PerpetualMarket; + market: Market; side: OrderSide; type: OrderType; size: string; @@ -118,7 +121,7 @@ export interface ApiKeyResponseObject { } export interface MarketResponseObject { - market: PerpetualMarket; + market: Market; status: string; baseAsset: Asset; quoteAsset: Asset; @@ -134,8 +137,12 @@ export interface MarketResponseObject { maintenanceMarginFraction: string; } +export interface MarketsResponseObject { + [market: string]: MarketResponseObject; +} + export interface MarketStatisticResponseObject { - market: PerpetualMarket; + market: Market; open: string; high: string; low: string; @@ -150,7 +157,7 @@ export interface OrderResponseObject { id: string; clientId: string; accountId: string; - market: PerpetualMarket; + market: Market; side: OrderSide; price: string; triggerPrice?: string | null; @@ -168,8 +175,7 @@ export interface OrderResponseObject { } export interface PositionResponseObject { - accountId: string; - market: PerpetualMarket; + market: Market; status: PositionStatus; side: string; size: string; @@ -187,7 +193,7 @@ export interface FillResponseObject { accountId: string; side: OrderSide; liquidity: string; - market: PerpetualMarket; + market: Market; orderId: string; price: string; size: string; @@ -230,7 +236,7 @@ export interface TransferResponseObject { export interface FundingResponseObject { accountId: string; - market: PerpetualMarket; + market: Market; payment: string; rate: string; positionSize: string; @@ -239,7 +245,7 @@ export interface FundingResponseObject { } export interface HistoricalFundingResponseObject { - market: PerpetualMarket; + market: Market; rate: string; price: string; effectiveAt: ISO8601; @@ -250,6 +256,11 @@ export interface OrderbookResponseOrder { size: string; } +export interface OrderbookResponseObject { + bids: OrderbookResponseOrder[], + asks: OrderbookResponseOrder[], +} + export interface Trade { side: OrderSide, size: string, From 89db037862712da1708031bd94e7e342c673b1a3 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Fri, 11 Dec 2020 13:06:07 -0800 Subject: [PATCH 031/180] v0.0.20 (#25) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 59cf846..5badda6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.19", + "version": "0.0.20", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 33bf1c1..de7ae97 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.19", + "version": "0.0.20", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { From 671fe632c346b2101e6d5497956b6688318af64b Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Mon, 14 Dec 2020 15:38:18 -0800 Subject: [PATCH 032/180] v0.0.21 Remove createDeposit() (#27) * Remove createDeposit() * v0.0.21 * Fix lint --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 23 ----------------------- 3 files changed, 2 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5badda6..440591a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.20", + "version": "0.0.21", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index de7ae97..7d2b622 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.20", + "version": "0.0.21", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 06c4a5a..2de906b 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -20,7 +20,6 @@ import { AccountResponseObject, ApiOrder, ApiWithdrawal, - Asset, Data, FillResponseObject, FundingResponseObject, @@ -462,28 +461,6 @@ export default class Private { ); } - /** - * @description post a new deposit - * - * @param { - * @amount specifies the size of the deposit - * @asset specifies the asset being deposited - * @fromAddress is the address being deposited from - * } - */ - async createDeposit( - params: { - amount: string, - asset: Asset, - fromAddress: string, - }, - ): Promise<{ deposit: TransferResponseObject }> { - return this.post( - 'deposits', - params, - ); - } - /** * @description get a user's funding payments by a set of query parameters * From 90b697f3ac4215b2be14772451b39c4cdde10454 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Tue, 15 Dec 2020 10:35:28 -0800 Subject: [PATCH 033/180] v0.0.22: bump starkex-lib (#28) * bump starkex-lib * forgot to npm i --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 440591a..0fdf8a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.21", + "version": "0.0.22", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -458,13 +458,13 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.4.0.tgz", - "integrity": "sha512-7Evy+34kEBkaKLu+sv7N+WM8T/WsJRdfNpUW/pOAJJWaGHja8oGb3ZmgKJdYWC0tLJAgma3A1KKm5c3eueUQMg==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.4.1.tgz", + "integrity": "sha512-ZVVzlE4/Z12YPdi+Zx8wTQiPFs+jCpgbUgOsQFZRanHFePHu8whupLO1aj5KT+bLL1uvVWrGS+81R7Yo/OG49w==", "requires": { - "@types/big.js": "^6.0.0", + "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", - "big.js": "^6.0.3", + "big.js": "6.0.3", "bip39": "^3.0.3", "ethereum-cryptography": "^0.1.3", "hash.js": "^1.1.7" diff --git a/package.json b/package.json index 7d2b622..8794489 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.21", + "version": "0.0.22", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -25,7 +25,7 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-lib": "^0.4.0", + "@dydxprotocol/starkex-lib": "^0.4.1", "@types/web3": "1.0.18", "axios": "^0.21.0", "bignumber.js": "^8.1.1", From bcbd3a6f8eaaa3fd24751f18321830c780690925 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Thu, 17 Dec 2020 13:02:32 -0800 Subject: [PATCH 034/180] v0.0.23: readd deposit [BAC-627] (#29) * readd deposit * ks1 --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0fdf8a8..e0b5fa1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.22", + "version": "0.0.23", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8794489..d50b58d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.22", + "version": "0.0.23", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 2de906b..3790a22 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -20,6 +20,7 @@ import { AccountResponseObject, ApiOrder, ApiWithdrawal, + Asset, Data, FillResponseObject, FundingResponseObject, @@ -461,6 +462,29 @@ export default class Private { ); } + /** + * @description post a new deposit + * + * @param { + * @amount specifies the size of the deposit + * @asset specifies the asset being deposited + * @fromAddress is the address being deposited from + * } + */ + async createTestDeposit( + params: { + creditAmount: string, + debitAmount: string, + debitAsset: Asset, + fromAddress: string, + }, + ): Promise<{ deposit: TransferResponseObject }> { + return this.post( + 'deposits', + params, + ); + } + /** * @description get a user's funding payments by a set of query parameters * From d11969b07cb1d7c5d6dd403b50464fb02c70d7b2 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Thu, 24 Dec 2020 00:39:00 -0800 Subject: [PATCH 035/180] v0.1.0 Update starkex-lib to v0.5.0 (#31) * Update starkex-lib * v0.1.0 --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index e0b5fa1..bc10035 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.23", + "version": "0.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -458,9 +458,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.4.1.tgz", - "integrity": "sha512-ZVVzlE4/Z12YPdi+Zx8wTQiPFs+jCpgbUgOsQFZRanHFePHu8whupLO1aj5KT+bLL1uvVWrGS+81R7Yo/OG49w==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.5.0.tgz", + "integrity": "sha512-rTlbscnUA1w6IiCbdLxy5wo5D++Uf7djeWjAE/mnsuwWMnLw55v2yD9V7QOSSFuRsqWcWw3GlnWKX7Xgq2j0kQ==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index d50b58d..dae48d6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.0.23", + "version": "0.1.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -25,7 +25,7 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-lib": "^0.4.1", + "@dydxprotocol/starkex-lib": "^0.5.0", "@types/web3": "1.0.18", "axios": "^0.21.0", "bignumber.js": "^8.1.1", From ad4d7826a8fb4ebb48e1133e84c96a4ed8836691 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Thu, 24 Dec 2020 01:46:57 -0800 Subject: [PATCH 036/180] v0.1.1 Fix getOrderBook return type (#32) * Fix getOrderBook return type * v0.1.1 --- package-lock.json | 2 +- package.json | 2 +- src/modules/public.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index bc10035..b3ddf3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.1.0", + "version": "0.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index dae48d6..22f3443 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.1.0", + "version": "0.1.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/public.ts b/src/modules/public.ts index bd83acc..1f89864 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -72,7 +72,7 @@ export default class Public { * * @param market being queried */ - getOrderBook(market: Market): Promise<{ orderbook: OrderbookResponseObject }> { + getOrderBook(market: Market): Promise { return this.get(`orderbook/${market}`, {}); } From 367db28726e23dab7f078546ed0d37bde426ad0a Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Tue, 29 Dec 2020 16:24:22 -0800 Subject: [PATCH 037/180] v0.1.2: Add Get Candles to TS (#33) * naming fix * add candles --- package-lock.json | 2 +- package.json | 2 +- src/modules/public.ts | 35 +++++++++++++++++++++++++++++++++++ src/types.ts | 5 +++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b3ddf3a..ce0b376 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.1.1", + "version": "0.1.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 22f3443..5795a5e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.1.1", + "version": "0.1.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/public.ts b/src/modules/public.ts index 1f89864..7d276d7 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -1,6 +1,7 @@ import { generateQueryPath } from '../helpers/request-helpers'; import { axiosRequest } from '../lib/axios'; import { + CandleResolution, Data, HistoricalFundingResponseObject, ISO8601, @@ -128,4 +129,38 @@ export default class Public { const uri: string = `historical-funding/${market}`; return this.get(uri, { effectiveBeforeOrAt }); } + + /** + * @description get candles for a specific market + * + * @param market being checked + * @param resolution Specific candle resolution being returned + * @param fromISO is starting time candles are from + * @param toISO is ending time candles go up to + * @param limit to number of candles returned + */ + getCandles({ + market, + resolution, + fromISO, + toISO, + limit, + }: { + market: Market, + resolution?: CandleResolution, + fromISO?: ISO8601, + toISO?: ISO8601, + limit?: number, + }): Promise<{ historicalFunding: HistoricalFundingResponseObject }> { + const uri: string = `candles/${market}`; + return this.get( + uri, + { + resolution, + fromISO, + toISO, + limit, + }, + ); + } } diff --git a/src/types.ts b/src/types.ts index bd79e82..75d4bfc 100644 --- a/src/types.ts +++ b/src/types.ts @@ -37,6 +37,11 @@ export enum MarketStatisticDay { THIRTY = '30', } +export enum CandleResolution { + ONE_DAY = '1DAY', + ONE_HOUR = '1HOUR', +} + export enum OrderType { LIMIT = 'LIMIT', STOP = 'STOP', From 70b5cbaf76629709b03afc3beb5df1d79b2a7425 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Tue, 29 Dec 2020 17:36:32 -0800 Subject: [PATCH 038/180] v0.1.3: add get fast withdrawal (#34) * add get fast withdrawal * ks1 --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 32 ++++++++++++++++++++++++++++++++ src/modules/public.ts | 7 +++++++ src/types.ts | 19 ++++++++++++++++--- 5 files changed, 57 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ce0b376..6a4e32e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.1.2", + "version": "0.1.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5795a5e..27a31da 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.1.2", + "version": "0.1.3", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 3790a22..cec9ac6 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -18,6 +18,7 @@ import { getAccountId } from '../lib/db'; import { AccountAction, AccountResponseObject, + ApiFastWithdrawal, ApiOrder, ApiWithdrawal, Asset, @@ -462,6 +463,37 @@ export default class Private { ); } + /** + * @description post a new fast-withdrawal + * + * @param { + * @creditAmount specifies the size of the withdrawal + * @debitAmoutn specifies the amount to be debited + * @creditAsset specifies the asset being withdrawn + * @toAddress is the address being withdrawn to + * @lpPositionId is the LP positionId for the fast withdrawal + * @clientId specifies the clientId for the address + * @signature starkware specific signature for fast-withdrawal + * } + */ + createFastWithdrawal( + params: PartialBy, + ): Promise<{ withdrawal: TransferResponseObject }> { + const clientId = params.clientId || Math.random().toString().slice(2).replace(/^0+/, ''); + // TODO meet starkware specification + const signature = params.signature || Math.random().toString().slice(2).replace(/^0+/, ''); + const fastWithdrawal: ApiFastWithdrawal = { + ...params, + clientId, + signature, + }; + + return this.post( + 'fast-withdrawals', + fastWithdrawal, + ); + } + /** * @description post a new deposit * diff --git a/src/modules/public.ts b/src/modules/public.ts index 7d276d7..692f6a0 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -130,6 +130,13 @@ export default class Public { return this.get(uri, { effectiveBeforeOrAt }); } + /** + * @description Get the amount of funds available for fast withdrawals, denominated in USDC. + */ + getFastWithdrawalAvailableFunds(): Promise<{ [lpAccountId: string]: string }> { + return this.get('fast-withdrawals', {}); + } + /** * @description get candles for a specific market * diff --git a/src/types.ts b/src/types.ts index 75d4bfc..29708b9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -31,6 +31,10 @@ export const Asset = DydxAsset; export type OrderSide = StarkwareOrderSide; export const OrderSide = StarkwareOrderSide; +export enum TransferAsset { + USDC = 'USDC', +} + export enum MarketStatisticDay { ONE = '1', SEVEN = '7', @@ -113,9 +117,18 @@ export interface ApiOrder extends ApiStarkwareSigned { } export interface ApiWithdrawal extends ApiStarkwareSigned { - amount: string, - asset: Asset, - toAddress: string, + amount: string; + asset: Asset; + toAddress: string; + clientId: string; +} + +export interface ApiFastWithdrawal extends ApiStarkwareSigned { + creditAsset: TransferAsset; + creditAmount: string; + debitAmount: string; + toAddress: string; + lpPositionId: string; clientId: string; } From c3eed3a037d48b0a3b835b45c83b9484c584648d Mon Sep 17 00:00:00 2001 From: Kenadia Date: Wed, 6 Jan 2021 14:22:52 -0800 Subject: [PATCH 039/180] Add Apache 2.0 License (GitHub template) (#35) * Create LICENSE * Update LICENSE --- LICENSE | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d9a10c0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS From 7c9a85412388ea2a580abd18e5e2216fdbf050aa Mon Sep 17 00:00:00 2001 From: Kenadia Date: Wed, 6 Jan 2021 14:59:49 -0800 Subject: [PATCH 040/180] Update README, and license in package.json (#36) --- README.md | 21 +++++++++++++++++---- package.json | 4 ++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index dabfa89..815f1e1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,19 @@ -# v3-client +

-[![CircleCI Status](https://img.shields.io/circleci/project/dydxprotocol/v3-client.svg?token=f7d2082c0394a639681c2b5b9fcde55eb74b2e22)](https://circleci.com/gh/dydxprotocol/v3-client) -[![Coverage Status](https://coveralls.io/repos/github/dydxprotocol/v3-client/badge.svg?t=9LP8qo)](https://coveralls.io/github/dydxprotocol/v3-client) + +
-Trading client library for the new dYdX system (v3 API). +TypeScript client for dYdX (v3 API). diff --git a/package.json b/package.json index 27a31da..5b81b34 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,8 @@ "type": "git", "url": "git+https://github.com/dydxprotocol/v3-client.git" }, - "author": "dYdX", - "license": "UNLICENSED", + "author": "dYdX Trading Inc.", + "license": "Apache-2.0", "bugs": { "url": "https://github.com/dydxprotocol/v3-client/issues" }, From c4633d51cec999b68fd00f83205d01dc0be75c1b Mon Sep 17 00:00:00 2001 From: Kenadia Date: Wed, 6 Jan 2021 18:20:46 -0800 Subject: [PATCH 041/180] v0.2.0 Update API key request signed message format (#37) * Rename module keys -> apiKeys * Update API key request message format * v0.2.0 --- __tests__/{keys.test.ts => api-keys.test.ts} | 2 +- __tests__/index.test.ts | 2 +- package-lock.json | 2 +- package.json | 2 +- src/dydx-client.ts | 14 +++++++------- src/lib/eth-validation/actions.ts | 5 ++--- src/modules/{keys.ts => api-keys.ts} | 2 +- 7 files changed, 14 insertions(+), 15 deletions(-) rename __tests__/{keys.test.ts => api-keys.test.ts} (94%) rename src/modules/{keys.ts => api-keys.ts} (99%) diff --git a/__tests__/keys.test.ts b/__tests__/api-keys.test.ts similarity index 94% rename from __tests__/keys.test.ts rename to __tests__/api-keys.test.ts index 158f9d2..0fb7342 100644 --- a/__tests__/keys.test.ts +++ b/__tests__/api-keys.test.ts @@ -16,7 +16,7 @@ describe('API Keys Module', () => { const web3 = new Web3(); const account: EthereumAccount = web3.eth.accounts.wallet.create(1)[0]; const client = new DydxClient('https://example.com', { web3 }); - await client.keys.getApiKeys(account.address); + await client.apiKeys.getApiKeys(account.address); expect(axios).toHaveBeenCalledTimes(1); expect(axios).toHaveBeenCalledWith({ diff --git a/__tests__/index.test.ts b/__tests__/index.test.ts index d4b9e13..bf02e63 100644 --- a/__tests__/index.test.ts +++ b/__tests__/index.test.ts @@ -5,7 +5,7 @@ describe('DydxClient', () => { it('has separate modules', () => { const client = new DydxClient('https://example.com'); expect(client.eth).toBeTruthy(); - expect(client.keys).toBeTruthy(); + expect(client.apiKeys).toBeTruthy(); expect(client.onboarding).toBeTruthy(); expect(client.private).toBeTruthy(); expect(client.public).toBeTruthy(); diff --git a/package-lock.json b/package-lock.json index 6a4e32e..4f2e359 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.1.3", + "version": "0.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5b81b34..e1c7e6b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.1.3", + "version": "0.2.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/dydx-client.ts b/src/dydx-client.ts index c8689ae..8f329b9 100644 --- a/src/dydx-client.ts +++ b/src/dydx-client.ts @@ -3,8 +3,8 @@ import { } from '@dydxprotocol/starkex-lib'; import Web3 from 'web3'; +import ApiKeys from './modules/api-keys'; import Eth from './modules/eth'; -import Keys from './modules/keys'; import Onboarding from './modules/onboarding'; import Private from './modules/private'; import Public from './modules/public'; @@ -31,7 +31,7 @@ export default class DydxClient { // Modules. Except for `public`, these are created on-demand. private readonly _public: Public; private _private?: Private; - private _keys?: Keys; + private _apiKeys?: ApiKeys; private _onboarding?: Onboarding; private _eth?: Eth; @@ -88,17 +88,17 @@ export default class DydxClient { /** * Get the keys module, used for managing API keys. Requires Ethereum key auth. */ - get keys(): Keys { - if (!this._keys) { + get apiKeys(): ApiKeys { + if (!this._apiKeys) { if (this.signOffChainAction) { - this._keys = new Keys(this.host, this.signOffChainAction); + this._apiKeys = new ApiKeys(this.host, this.signOffChainAction); } else { return notSupported( 'API key endpoints are not supported since neither web3 nor web3Provider was provided', - ) as Keys; + ) as ApiKeys; } } - return this._keys; + return this._apiKeys; } /** diff --git a/src/lib/eth-validation/actions.ts b/src/lib/eth-validation/actions.ts index 9da9870..b4b24fe 100644 --- a/src/lib/eth-validation/actions.ts +++ b/src/lib/eth-validation/actions.ts @@ -16,10 +16,9 @@ export function generateApiKeyAction({ method: ApiMethod, data?: {}, }): string { - // TODO: The signed data should be consistent with the other private endpoints. return ( - (_.isEmpty(data) ? '' : JSON.stringify(data)) + + method + requestPath + - method + (_.isEmpty(data) ? '' : JSON.stringify(data)) ); } diff --git a/src/modules/keys.ts b/src/modules/api-keys.ts similarity index 99% rename from src/modules/keys.ts rename to src/modules/api-keys.ts index ce8a18d..b971ab9 100644 --- a/src/modules/keys.ts +++ b/src/modules/api-keys.ts @@ -12,7 +12,7 @@ import { } from '../types'; import { SignOffChainAction } from './sign-off-chain-action'; -export default class Keys { +export default class ApiKeys { readonly host: string; readonly signOffChainAction: SignOffChainAction; From e67e7c6218e30c013d6168c3a621479eedc19d99 Mon Sep 17 00:00:00 2001 From: Kenneth Schiller Date: Wed, 6 Jan 2021 18:32:47 -0800 Subject: [PATCH 042/180] v0.2.1 Update axios --- package-lock.json | 14 +++++++------- package.json | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4f2e359..f17ea23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.2.0", + "version": "0.2.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1697,9 +1697,9 @@ "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" }, "axios": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz", - "integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", "requires": { "follow-redirects": "^1.10.0" } @@ -4115,9 +4115,9 @@ "dev": true }, "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", + "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" }, "for-in": { "version": "1.0.2", diff --git a/package.json b/package.json index e1c7e6b..67dc339 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.2.0", + "version": "0.2.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -27,7 +27,7 @@ "dependencies": { "@dydxprotocol/starkex-lib": "^0.5.0", "@types/web3": "1.0.18", - "axios": "^0.21.0", + "axios": "^0.21.1", "bignumber.js": "^8.1.1", "es6-promisify": "^6.0.1", "ethers": "^4.0.33", From 1b875c258d259286534fdb777a95e69997ee8a92 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Thu, 7 Jan 2021 12:54:00 -0800 Subject: [PATCH 043/180] Use node-service-base-dev (#39) --- .eslintrc.js | 162 +--- jest.config.js | 17 +- package-lock.json | 1793 +++++++++++++++++-------------------- package.json | 16 +- src/modules/onboarding.ts | 8 +- tsconfig.json | 25 +- 6 files changed, 821 insertions(+), 1200 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 29a1727..106dbca 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,164 +1,12 @@ module.exports = { - root: true, - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint'], - extends: [ - 'eslint:recommended', - 'airbnb-typescript/base', - 'plugin:@typescript-eslint/eslint-recommended', - ], - env: { - node: true, - jest: true, - es6: true, - }, - overrides: [ - { - files: '**/*.js', - rules: { - '@typescript-eslint/no-var-requires': 'off', - }, - }, - { - files: '**/__tests__/**/*.test.ts', - rules: { - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-var-requires': 'off', - 'global-require': 'off', - 'import/first': 'off', - 'import/order': 'off', - }, - }, - ], + extends: './node_modules/@dydxprotocol/node-service-base-dev/.eslintrc.js', + + // Override the base configuration to set the correct tsconfigRootDir. parserOptions: { - project: './tsconfig.eslint.json', - ecmaVersion: 2018, - sourceType: 'module', tsconfigRootDir: __dirname, }, - ignorePatterns: [ - '**/build/**/*.js', - '**/build/**/*.d.ts', - '**/coverage/**/*.js', - ], + + // Extend the base rule set. rules: { - 'arrow-body-style': 'off', - 'class-methods-use-this': 'off', - 'consistent-return': 'off', // Annoying when return type is Promise. Not as helpful for TypeScript anyway. - 'function-paren-newline': 'off', // Broken in TypeScript: https://github.com/typescript-eslint/typescript-eslint/issues/942 - 'global-require': 'warn', - 'import/order': ['error', - { - groups: [ - 'builtin', - 'external', - ['parent', 'sibling', 'internal', 'unknown'], - 'index', - ], - 'newlines-between': 'always', - alphabetize: { order: 'asc', caseInsensitive: true }, - }, - ], - 'import/no-extraneous-dependencies': 'off', - 'import/prefer-default-export': 'off', - 'max-classes-per-file': 'off', - 'no-await-in-loop': 'off', - 'no-lonely-if': 'off', - 'no-multi-spaces': ['error', { ignoreEOLComments: true }], - 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], - // Copied from eslint-config-airbnb-base and modified to allow ForOfStatement. - 'no-restricted-syntax': [ - 'error', - { - selector: 'ForInStatement', - message: 'for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.', - }, - { - selector: 'LabeledStatement', - message: 'Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.', - }, - { - selector: 'WithStatement', - message: '`with` is disallowed in strict mode because it makes code impossible to predict and optimize.', - }, - ], - 'no-shadow': 'off', // Disable in favor of @typescript-eslint/no-shadow. - 'no-underscore-dangle': 'off', - 'no-use-before-define': 'off', - 'operator-linebreak': ['error', - 'after', - { - overrides: { - '?': 'before', - ':': 'before', - '=': 'none', - }, - }, - ], - 'padded-blocks': 'off', - 'prefer-destructuring': 'off', - 'spaced-comment': ['error', 'always', { exceptions: ['/'] }], - // Copied from eslint-config-airbnb-base and modified to handle TypeScript bugs: - // https://github.com/typescript-eslint/typescript-eslint/issues/1824 - '@typescript-eslint/indent': ['error', 2, { - SwitchCase: 1, - VariableDeclarator: 1, - outerIIFEBody: 1, - FunctionDeclaration: { - parameters: 1, - body: 1, - }, - FunctionExpression: { - parameters: 1, - body: 1, - }, - CallExpression: { - arguments: 1, - }, - ArrayExpression: 1, - ObjectExpression: 1, - ImportDeclaration: 1, - flatTernaryExpressions: false, - ignoreComments: false, - // Ignore TypeScript edge cases that are handled incorrectly. - // Figured these out using https://astexplorer.net/ with the suggestions described here: - // https://stackoverflow.com/questions/59851672/eslint-indent-and-ignorenodes-trouble-getting-ast-selectors-to-work-correctl - ignoredNodes: [ - // Handle multi-line types within an interface declaration. - 'TSInterfaceDeclaration TSPropertySignature TSTypeAnnotation', - // Handle multi-line types in function return type annotations. - 'FunctionDeclaration > TSTypeAnnotation *', - ], - }], - '@typescript-eslint/lines-between-class-members': ['error', - 'always', - { exceptAfterSingleLine: true }, - ], - '@typescript-eslint/naming-convention': ['error', - { - selector: 'variableLike', - custom: { - regex: '^([Aa]ny|[Nn]umber|[Ss]tring|[Bb]oolean|[Uu]ndefined)$', - match: false, - }, - format: ['camelCase', 'PascalCase', 'UPPER_CASE'], - leadingUnderscore: 'allow', - trailingUnderscore: 'allow', - }, - { - selector: 'typeLike', - custom: { - regex: '^([Aa]ny|[Nn]umber|[Ss]tring|[Bb]oolean|[Uu]ndefined)$', - match: false, - }, - format: ['PascalCase'], - }, - ], - '@typescript-eslint/no-explicit-any': 'error', - '@typescript-eslint/no-floating-promises': 'error', - '@typescript-eslint/no-shadow': 'error', - '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], - '@typescript-eslint/no-use-before-define': 'off', - '@typescript-eslint/no-var-requires': 'warn', }, }; diff --git a/jest.config.js b/jest.config.js index fed9959..6bd4789 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,16 +1,5 @@ module.exports = { - roots: [ - '/build/__tests__', - ], - testRegex: 'build/__tests__\\/.*\\.test\\.js$', - moduleFileExtensions: [ - 'js', - 'json', - 'node', - ], - globalSetup: './jest.globalSetup.js', - resetMocks: true, - setupFilesAfterEnv: ['./jest.setup.js'], - testEnvironment: 'node', - testTimeout: 5000, + /* eslint-disable global-require */ + ...require('./node_modules/@dydxprotocol/node-service-base-dev/jest.config.js'), + name: 'v3-client', }; diff --git a/package-lock.json b/package-lock.json index f17ea23..65cd38f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,42 +5,41 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" } }, "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", + "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", + "@babel/generator": "^7.12.10", "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", "json5": "^2.1.2", "lodash": "^4.17.19", - "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -76,12 +75,12 @@ } }, "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", "dev": true, "requires": { - "@babel/types": "^7.12.1", + "@babel/types": "^7.12.11", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -95,41 +94,41 @@ } }, "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" } }, "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.10" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.12.7" } }, "@babel/helper-module-imports": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", - "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.12.5" } }, "@babel/helper-module-transforms": { @@ -150,12 +149,12 @@ } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.10" } }, "@babel/helper-plugin-utils": { @@ -165,15 +164,15 @@ "dev": true }, "@babel/helper-replace-supers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", - "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" } }, "@babel/helper-simple-access": { @@ -186,29 +185,29 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.11" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true }, "@babel/helpers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", - "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", "dev": true, "requires": { "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" } }, "@babel/highlight": { @@ -275,9 +274,9 @@ } }, "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -379,38 +378,47 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" } }, "@babel/traverse": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", - "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.1", - "@babel/types": "^7.12.1", + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -431,12 +439,12 @@ } }, "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -457,6 +465,27 @@ "minimist": "^1.2.0" } }, + "@dydxprotocol/node-service-base-dev": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@dydxprotocol/node-service-base-dev/-/node-service-base-dev-0.0.11.tgz", + "integrity": "sha512-tF73NtG7hCdmKXL7tkpOSKWWH6/eMXNWIRJZD/44MbqcX6hdcVklFLWpuqYl9jxCKeX8Qz4W4NLbCykJd89W5w==", + "dev": true, + "requires": { + "@types/jest": "^26.0.13", + "@types/lodash": "^4.14.161", + "@types/node": "^14.6.4", + "@typescript-eslint/eslint-plugin": "^4.0.1", + "@typescript-eslint/parser": "^4.0.1", + "coveralls": "^3.1.0", + "dotenv-flow": "^3.2.0", + "eslint": "^7.8.0", + "eslint-config-airbnb-typescript": "^9.0.0", + "eslint-plugin-import": "^2.22.0", + "jest": "^26.4.2", + "nodemon": "^2.0.4", + "typescript": "^4.0.2" + } + }, "@dydxprotocol/starkex-lib": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.5.0.tgz", @@ -471,9 +500,9 @@ } }, "@eslint/eslintrc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.0.tgz", - "integrity": "sha512-+cIGPCBdLCzqxdtwppswP+zTsH9BOIGzAeKfBIbtb4gW/giMlfMwP0HUSFfhzh20f9u8uZ8hOp62+4GPquTbwQ==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", + "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -489,9 +518,9 @@ }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -801,114 +830,103 @@ "dev": true }, "@jest/console": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.1.tgz", - "integrity": "sha512-cjqcXepwC5M+VeIhwT6Xpi/tT4AiNzlIx8SMJ9IihduHnsSrnWNvTBfKIpmqOOCNOPqtbBx6w2JqfoLOJguo8g==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { - "@jest/types": "^26.6.1", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.6.1", - "jest-util": "^26.6.1", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", "slash": "^3.0.0" } }, "@jest/core": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.1.tgz", - "integrity": "sha512-p4F0pgK3rKnoS9olXXXOkbus1Bsu6fd8pcvLMPsUy4CVXZ8WSeiwQ1lK5hwkCIqJ+amZOYPd778sbPha/S8Srw==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dev": true, "requires": { - "@jest/console": "^26.6.1", - "@jest/reporters": "^26.6.1", - "@jest/test-result": "^26.6.1", - "@jest/transform": "^26.6.1", - "@jest/types": "^26.6.1", + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.1", - "jest-config": "^26.6.1", - "jest-haste-map": "^26.6.1", - "jest-message-util": "^26.6.1", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.1", - "jest-resolve-dependencies": "^26.6.1", - "jest-runner": "^26.6.1", - "jest-runtime": "^26.6.1", - "jest-snapshot": "^26.6.1", - "jest-util": "^26.6.1", - "jest-validate": "^26.6.1", - "jest-watcher": "^26.6.1", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } } }, "@jest/environment": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.1.tgz", - "integrity": "sha512-GNvHwkOFJtNgSwdzH9flUPzF9AYAZhUg124CBoQcwcZCM9s5TLz8Y3fMtiaWt4ffbigoetjGk5PU2Dd8nLrSEw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dev": true, "requires": { - "@jest/fake-timers": "^26.6.1", - "@jest/types": "^26.6.1", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^26.6.1" + "jest-mock": "^26.6.2" } }, "@jest/fake-timers": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.1.tgz", - "integrity": "sha512-T/SkMLgOquenw/nIisBRD6XAYpFir0kNuclYLkse5BpzeDUukyBr+K31xgAo9M0hgjU9ORlekAYPSzc0DKfmKg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "requires": { - "@jest/types": "^26.6.1", + "@jest/types": "^26.6.2", "@sinonjs/fake-timers": "^6.0.1", "@types/node": "*", - "jest-message-util": "^26.6.1", - "jest-mock": "^26.6.1", - "jest-util": "^26.6.1" + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, "@jest/globals": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.1.tgz", - "integrity": "sha512-acxXsSguuLV/CeMYmBseefw6apO7NuXqpE+v5r3yD9ye2PY7h1nS20vY7Obk2w6S7eJO4OIAJeDnoGcLC/McEQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", "dev": true, "requires": { - "@jest/environment": "^26.6.1", - "@jest/types": "^26.6.1", - "expect": "^26.6.1" + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" } }, "@jest/reporters": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.1.tgz", - "integrity": "sha512-J6OlXVFY3q1SXWJhjme5i7qT/BAZSikdOK2t8Ht5OS32BDo6KfG5CzIzzIFnAVd82/WWbc9Hb7SJ/jwSvVH9YA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.1", - "@jest/test-result": "^26.6.1", - "@jest/transform": "^26.6.1", - "@jest/types": "^26.6.1", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -919,22 +937,22 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.1", - "jest-resolve": "^26.6.1", - "jest-util": "^26.6.1", - "jest-worker": "^26.6.1", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "node-notifier": "^8.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^6.0.1" + "v8-to-istanbul": "^7.0.0" } }, "@jest/source-map": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.5.0.tgz", - "integrity": "sha512-jWAw9ZwYHJMe9eZq/WrsHlwF8E3hM9gynlcDpOyCb9bR8wEd9ZNBZCi7/jZyzHxC7t3thZ10gO2IDhu0bPKS5g==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -943,46 +961,46 @@ } }, "@jest/test-result": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.1.tgz", - "integrity": "sha512-wqAgIerIN2gSdT2A8WeA5+AFh9XQBqYGf8etK143yng3qYd0mF0ie2W5PVmgnjw4VDU6ammI9NdXrKgNhreawg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.6.1", - "@jest/types": "^26.6.1", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.1.tgz", - "integrity": "sha512-0csqA/XApZiNeTIPYh6koIDCACSoR6hi29T61tKJMtCZdEC+tF3PoNt7MS0oK/zKC6daBgCbqXxia5ztr/NyCQ==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", "dev": true, "requires": { - "@jest/test-result": "^26.6.1", + "@jest/test-result": "^26.6.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.1", - "jest-runner": "^26.6.1", - "jest-runtime": "^26.6.1" + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" } }, "@jest/transform": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.1.tgz", - "integrity": "sha512-oNFAqVtqRxZRx6vXL3I4bPKUK0BIlEeaalkwxyQGGI8oXDQBtYQBpiMe5F7qPs4QdvvFYB42gPGIMMcxXaBBxQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^26.6.1", + "@jest/types": "^26.6.2", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.1", + "jest-haste-map": "^26.6.2", "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.1", + "jest-util": "^26.6.2", "micromatch": "^4.0.2", "pirates": "^4.0.1", "slash": "^3.0.0", @@ -991,9 +1009,9 @@ } }, "@jest/types": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", - "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -1004,28 +1022,28 @@ } }, "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.3", + "@nodelib/fs.stat": "2.0.4", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.3", + "@nodelib/fs.scandir": "2.1.4", "fastq": "^1.6.0" } }, @@ -1061,9 +1079,9 @@ } }, "@types/babel__core": { - "version": "7.1.10", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.10.tgz", - "integrity": "sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw==", + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", + "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1083,9 +1101,9 @@ } }, "@types/babel__template": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", - "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1093,9 +1111,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", - "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", + "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -1168,9 +1186,9 @@ } }, "@types/jest": { - "version": "26.0.15", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.15.tgz", - "integrity": "sha512-s2VMReFXRg9XXxV+CW9e5Nz8fH2K1aEhwgjUqPPbQd7g95T0laAcvLv032EhFHIa5GHsZ8W7iJEQVaJq6k3Gog==", + "version": "26.0.19", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.19.tgz", + "integrity": "sha512-jqHoirTG61fee6v6rwbnEuKhpSKih0tuhqeFbCmMmErhtu3BYlOZaXWjffgOstMM4S/3iQD31lI5bGLTrs97yQ==", "dev": true, "requires": { "jest-diff": "^26.0.0", @@ -1190,9 +1208,9 @@ "dev": true }, "@types/lodash": { - "version": "4.14.162", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.162.tgz", - "integrity": "sha512-alvcho1kRUnnD1Gcl4J+hK0eencvzq9rmzvFPRmP5rPHx9VVsJj6bKLTATPVf9ktgv4ujzh7T+XWKp+jhuODig==", + "version": "4.14.167", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.167.tgz", + "integrity": "sha512-w7tQPjARrvdeBkX/Rwg95S592JwxqOjmms3zWQ0XZgSyxSLdzWaYH3vErBhdVS/lRBX7F8aBYcYJYTr5TMGOzw==", "dev": true }, "@types/node": { @@ -1215,9 +1233,9 @@ } }, "@types/prettier": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", - "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.6.tgz", + "integrity": "sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA==", "dev": true }, "@types/secp256k1": { @@ -1255,28 +1273,28 @@ } }, "@types/yargs": { - "version": "15.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", - "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", + "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.6.0.tgz", - "integrity": "sha512-1+419X+Ynijytr1iWI+/IcX/kJryc78YNpdaXR1aRO1sU3bC0vZrIAF1tIX7rudVI84W7o7M4zo5p1aVt70fAg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.12.0.tgz", + "integrity": "sha512-wHKj6q8s70sO5i39H2g1gtpCXCvjVszzj6FFygneNFyIAxRvNSVz9GML7XpqrB9t7hNutXw+MHnLN/Ih6uyB8Q==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.6.0", - "@typescript-eslint/scope-manager": "4.6.0", + "@typescript-eslint/experimental-utils": "4.12.0", + "@typescript-eslint/scope-manager": "4.12.0", "debug": "^4.1.1", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", @@ -1285,9 +1303,9 @@ }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -1302,35 +1320,35 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.6.0.tgz", - "integrity": "sha512-pnh6Beh2/4xjJVNL+keP49DFHk3orDHHFylSp3WEjtgW3y1U+6l+jNnJrGlbs6qhAz5z96aFmmbUyKhunXKvKw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.12.0.tgz", + "integrity": "sha512-MpXZXUAvHt99c9ScXijx7i061o5HEjXltO+sbYfZAAHxv3XankQkPaNi5myy0Yh0Tyea3Hdq1pi7Vsh0GJb0fA==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.6.0", - "@typescript-eslint/types": "4.6.0", - "@typescript-eslint/typescript-estree": "4.6.0", + "@typescript-eslint/scope-manager": "4.12.0", + "@typescript-eslint/types": "4.12.0", + "@typescript-eslint/typescript-estree": "4.12.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.6.0.tgz", - "integrity": "sha512-Dj6NJxBhbdbPSZ5DYsQqpR32MwujF772F2H3VojWU6iT4AqL4BKuoNWOPFCoSZvCcADDvQjDpa6OLDAaiZPz2Q==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.12.0.tgz", + "integrity": "sha512-9XxVADAo9vlfjfoxnjboBTxYOiNY93/QuvcPgsiKvHxW6tOZx1W4TvkIQ2jB3k5M0pbFP5FlXihLK49TjZXhuQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.6.0", - "@typescript-eslint/types": "4.6.0", - "@typescript-eslint/typescript-estree": "4.6.0", + "@typescript-eslint/scope-manager": "4.12.0", + "@typescript-eslint/types": "4.12.0", + "@typescript-eslint/typescript-estree": "4.12.0", "debug": "^4.1.1" }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -1345,29 +1363,29 @@ } }, "@typescript-eslint/scope-manager": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.6.0.tgz", - "integrity": "sha512-uZx5KvStXP/lwrMrfQQwDNvh2ppiXzz5TmyTVHb+5TfZ3sUP7U1onlz3pjoWrK9konRyFe1czyxObWTly27Ang==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.12.0.tgz", + "integrity": "sha512-QVf9oCSVLte/8jvOsxmgBdOaoe2J0wtEmBr13Yz0rkBNkl5D8bfnf6G4Vhox9qqMIoG7QQoVwd2eG9DM/ge4Qg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.6.0", - "@typescript-eslint/visitor-keys": "4.6.0" + "@typescript-eslint/types": "4.12.0", + "@typescript-eslint/visitor-keys": "4.12.0" } }, "@typescript-eslint/types": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.6.0.tgz", - "integrity": "sha512-5FAgjqH68SfFG4UTtIFv+rqYJg0nLjfkjD0iv+5O27a0xEeNZ5rZNDvFGZDizlCD1Ifj7MAbSW2DPMrf0E9zjA==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.12.0.tgz", + "integrity": "sha512-N2RhGeheVLGtyy+CxRmxdsniB7sMSCfsnbh8K/+RUIXYYq3Ub5+sukRCjVE80QerrUBvuEvs4fDhz5AW/pcL6g==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.6.0.tgz", - "integrity": "sha512-s4Z9qubMrAo/tw0CbN0IN4AtfwuehGXVZM0CHNMdfYMGBDhPdwTEpBrecwhP7dRJu6d9tT9ECYNaWDHvlFSngA==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.12.0.tgz", + "integrity": "sha512-gZkFcmmp/CnzqD2RKMich2/FjBTsYopjiwJCroxqHZIY11IIoN0l5lKqcgoAPKHt33H2mAkSfvzj8i44Jm7F4w==", "dev": true, "requires": { - "@typescript-eslint/types": "4.6.0", - "@typescript-eslint/visitor-keys": "4.6.0", + "@typescript-eslint/types": "4.12.0", + "@typescript-eslint/visitor-keys": "4.12.0", "debug": "^4.1.1", "globby": "^11.0.1", "is-glob": "^4.0.1", @@ -1377,9 +1395,9 @@ }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -1394,12 +1412,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.0.tgz", - "integrity": "sha512-38Aa9Ztl0XyFPVzmutHXqDMCu15Xx8yKvUo38Gu3GhsuckCh3StPI5t2WIO9LHEsOH7MLmlGfKUisU8eW1Sjhg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.12.0.tgz", + "integrity": "sha512-hVpsLARbDh4B9TKYz5cLbcdMIOAoBYgFPCSP9FFS/liSF+b33gVNq8JHY3QGhHNVz85hObvL7BEYLlgx553WCw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.6.0", + "@typescript-eslint/types": "4.12.0", "eslint-visitor-keys": "^2.0.0" } }, @@ -1470,6 +1488,46 @@ "dev": true, "requires": { "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "ansi-colors": { @@ -1553,35 +1611,16 @@ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz", + "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", + "es-abstract": "^1.18.0-next.1", + "get-intrinsic": "^1.0.1", "is-string": "^1.0.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } } }, "array-union": { @@ -1597,34 +1636,14 @@ "dev": true }, "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "es-abstract": "^1.18.0-next.1" } }, "asn1": { @@ -1665,9 +1684,9 @@ "dev": true }, "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "async-limiter": { @@ -1705,16 +1724,16 @@ } }, "babel-jest": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.1.tgz", - "integrity": "sha512-duMWEOKrSBYRVTTNpL2SipNIWnZOjP77auOBMPQ3zXAdnDbyZQWU8r/RxNWpUf9N6cgPFecQYelYLytTVXVDtA==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", "dev": true, "requires": { - "@jest/transform": "^26.6.1", - "@jest/types": "^26.6.1", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.5.0", + "babel-preset-jest": "^26.6.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" @@ -1734,9 +1753,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.5.0.tgz", - "integrity": "sha512-ck17uZFD3CDfuwCLATWZxkkuGGFhMij8quP8CNhwj8ek1mqFgbFzRJ30xwC04LLscj/aKsVFfRST+b5PT7rSuw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -1746,9 +1765,9 @@ } }, "babel-preset-current-node-syntax": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz", - "integrity": "sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", @@ -1761,17 +1780,18 @@ "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" } }, "babel-preset-jest": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.5.0.tgz", - "integrity": "sha512-F2vTluljhqkiGSJGBg/jOruA8vIIIL11YrxRcO7nviNTMbbofPSHwnm8mgP7d/wS7wRSexRoI6X1A6T74d4LQA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^26.5.0", - "babel-preset-current-node-syntax": "^0.1.3" + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" } }, "balanced-match": { @@ -1954,29 +1974,6 @@ "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } } } }, @@ -2194,6 +2191,16 @@ } } }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2237,14 +2244,14 @@ "dev": true }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.0.tgz", + "integrity": "sha512-JgQM9JS92ZbFR4P90EvmzNpSGhpPBGBSj10PILeDyYFwp4h2/D9OM03wsJ4zW1fEp4ka2DGrnUeD7FuvQ2aZ2Q==", "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", + "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -2296,9 +2303,9 @@ } }, "cjs-module-lexer": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.4.3.tgz", - "integrity": "sha512-5RLK0Qfs0PNDpEyBXIr3bIT1Muw3ojSlvpw6dAmkUcO0+uTrsBn7GuEIgx40u+OzbCBLDta7nvmud85P4EmTsQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", "dev": true }, "class-is": { @@ -2344,31 +2351,6 @@ "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - } } }, "clone-response": { @@ -2821,9 +2803,9 @@ "dev": true }, "diff-sequences": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", - "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", "dev": true }, "diffie-hellman": { @@ -2954,9 +2936,9 @@ "dev": true }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "encodeurl": { @@ -3127,13 +3109,13 @@ } }, "eslint": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.0.tgz", - "integrity": "sha512-n5pEU27DRxCSlOhJ2rO57GDLcNsxO0LPpAbpFdh7xmcDmjmlGUfoyrsB3I7yYdQXO5N3gkSTiDrPSPNFiiirXA==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.17.0.tgz", + "integrity": "sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.2.0", + "@eslint/eslintrc": "^0.2.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -3143,10 +3125,10 @@ "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.0", + "espree": "^7.3.1", "esquery": "^1.2.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "file-entry-cache": "^6.0.0", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", "globals": "^12.1.0", @@ -3166,15 +3148,15 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^5.2.3", + "table": "^6.0.4", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -3195,24 +3177,24 @@ } }, "eslint-config-airbnb": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz", - "integrity": "sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg==", + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz", + "integrity": "sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg==", "dev": true, "requires": { - "eslint-config-airbnb-base": "^14.2.0", - "object.assign": "^4.1.0", + "eslint-config-airbnb-base": "^14.2.1", + "object.assign": "^4.1.2", "object.entries": "^1.1.2" } }, "eslint-config-airbnb-base": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz", - "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==", + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", "dev": true, "requires": { - "confusing-browser-globals": "^1.0.9", - "object.assign": "^4.1.0", + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", "object.entries": "^1.1.2" } }, @@ -3285,9 +3267,9 @@ } }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -3315,17 +3297,6 @@ "requires": { "debug": "^2.6.9", "resolve": "^1.13.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "eslint-module-utils": { @@ -3336,17 +3307,6 @@ "requires": { "debug": "^2.6.9", "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "eslint-plugin-import": { @@ -3370,15 +3330,6 @@ "tsconfig-paths": "^3.9.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "doctrine": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", @@ -3425,13 +3376,13 @@ "dev": true }, "espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", + "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" }, "dependencies": { @@ -3805,15 +3756,6 @@ "to-regex": "^3.0.1" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -3835,16 +3777,16 @@ } }, "expect": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.1.tgz", - "integrity": "sha512-BRfxIBHagghMmr1D2MRY0Qv5d3Nc8HCqgbDwNXw/9izmM5eBb42a2YjLKSbsqle76ozGkAEPELQX4IdNHAKRNA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", "dev": true, "requires": { - "@jest/types": "^26.6.1", + "@jest/types": "^26.6.2", "ansi-styles": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.1", - "jest-message-util": "^26.6.1", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", "jest-regex-util": "^26.0.0" } }, @@ -4039,9 +3981,9 @@ "dev": true }, "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", + "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -4057,12 +3999,12 @@ } }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" } }, "fill-range": { @@ -4098,20 +4040,19 @@ } }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz", + "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", "dev": true }, "follow-redirects": { @@ -4184,9 +4125,9 @@ "dev": true }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", + "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", "dev": true, "optional": true }, @@ -4203,9 +4144,9 @@ "dev": true }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-caller-file": { @@ -4214,6 +4155,17 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", + "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -4275,12 +4227,12 @@ } }, "global-dirs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", - "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", "dev": true, "requires": { - "ini": "^1.3.5" + "ini": "1.3.7" } }, "globals": { @@ -4293,9 +4245,9 @@ } }, "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", + "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", "dev": true, "requires": { "array-union": "^2.1.0", @@ -4578,9 +4530,9 @@ "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -4685,9 +4637,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", "dev": true }, "ip-regex": { @@ -4758,9 +4710,9 @@ } }, "is-core-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", - "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", "dev": true, "requires": { "has": "^1.0.3" @@ -4831,9 +4783,9 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "is-function": { @@ -4872,9 +4824,9 @@ } }, "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", "dev": true }, "is-npm": { @@ -5059,9 +5011,9 @@ }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -5095,33 +5047,33 @@ } }, "jest": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.1.tgz", - "integrity": "sha512-f+ahfqw3Ffy+9vA7sWFGpTmhtKEMsNAZiWBVXDkrpIO73zIz22iimjirnV78kh/eWlylmvLh/0WxHN6fZraZdA==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", "dev": true, "requires": { - "@jest/core": "^26.6.1", + "@jest/core": "^26.6.3", "import-local": "^3.0.2", - "jest-cli": "^26.6.1" + "jest-cli": "^26.6.3" }, "dependencies": { "jest-cli": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.1.tgz", - "integrity": "sha512-aPLoEjlwFrCWhiPpW5NUxQA1X1kWsAnQcQ0SO/fHsCvczL3W75iVAcH9kP6NN+BNqZcHNEvkhxT5cDmBfEAh+w==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", "dev": true, "requires": { - "@jest/core": "^26.6.1", - "@jest/test-result": "^26.6.1", - "@jest/types": "^26.6.1", + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^26.6.1", - "jest-util": "^26.6.1", - "jest-validate": "^26.6.1", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", "prompts": "^2.0.1", "yargs": "^15.4.1" } @@ -5129,20 +5081,20 @@ } }, "jest-changed-files": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.1.tgz", - "integrity": "sha512-NhSdZ5F6b/rIN5V46x1l31vrmukD/bJUXgYAY8VtP1SknYdJwjYDRxuLt7Z8QryIdqCjMIn2C0Cd98EZ4umo8Q==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", "dev": true, "requires": { - "@jest/types": "^26.6.1", + "@jest/types": "^26.6.2", "execa": "^4.0.0", "throat": "^5.0.0" }, "dependencies": { "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "requires": { "cross-spawn": "^7.0.0", @@ -5183,41 +5135,41 @@ } }, "jest-config": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.1.tgz", - "integrity": "sha512-mtJzIynIwW1d1nMlKCNCQiSgWaqFn8cH/fOSNY97xG7Y9tBCZbCSuW2GTX0RPmceSJGO7l27JgwC18LEg0Vg+g==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.1", - "@jest/types": "^26.6.1", - "babel-jest": "^26.6.1", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.1", - "jest-environment-node": "^26.6.1", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.1", + "jest-jasmine2": "^26.6.3", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.1", - "jest-util": "^26.6.1", - "jest-validate": "^26.6.1", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", "micromatch": "^4.0.2", - "pretty-format": "^26.6.1" + "pretty-format": "^26.6.2" } }, "jest-diff": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.1.tgz", - "integrity": "sha512-BBNy/zin2m4kG5In126O8chOBxLLS/XMTuuM2+YhgyHk87ewPzKTuTJcqj3lOWOi03NNgrl+DkMeV/exdvG9gg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^26.5.0", + "diff-sequences": "^26.6.2", "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.1" + "pretty-format": "^26.6.2" } }, "jest-docblock": { @@ -5230,45 +5182,45 @@ } }, "jest-each": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.1.tgz", - "integrity": "sha512-gSn8eB3buchuq45SU7pLB7qmCGax1ZSxfaWuEFblCyNMtyokYaKFh9dRhYPujK6xYL57dLIPhLKatjmB5XWzGA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", "dev": true, "requires": { - "@jest/types": "^26.6.1", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-util": "^26.6.1", - "pretty-format": "^26.6.1" + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" } }, "jest-environment-jsdom": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.1.tgz", - "integrity": "sha512-A17RiXuHYNVlkM+3QNcQ6n5EZyAc6eld8ra9TW26luounGWpku4tj03uqRgHJCI1d4uHr5rJiuCH5JFRtdmrcA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", "dev": true, "requires": { - "@jest/environment": "^26.6.1", - "@jest/fake-timers": "^26.6.1", - "@jest/types": "^26.6.1", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^26.6.1", - "jest-util": "^26.6.1", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", "jsdom": "^16.4.0" } }, "jest-environment-node": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.1.tgz", - "integrity": "sha512-YffaCp6h0j1kbcf1NVZ7umC6CPgD67YS+G1BeornfuSkx5s3xdhuwG0DCxSiHPXyT81FfJzA1L7nXvhq50OWIg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", "dev": true, "requires": { - "@jest/environment": "^26.6.1", - "@jest/fake-timers": "^26.6.1", - "@jest/types": "^26.6.1", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^26.6.1", - "jest-util": "^26.6.1" + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, "jest-get-type": { @@ -5278,12 +5230,12 @@ "dev": true }, "jest-haste-map": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.1.tgz", - "integrity": "sha512-9kPafkv0nX6ta1PrshnkiyhhoQoFWncrU/uUBt3/AP1r78WSCU5iLceYRTwDvJl67H3RrXqSlSVDDa/AsUB7OQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { - "@jest/types": "^26.6.1", + "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", @@ -5291,85 +5243,86 @@ "fsevents": "^2.1.2", "graceful-fs": "^4.2.4", "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.5.0", - "jest-util": "^26.6.1", - "jest-worker": "^26.6.1", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.1.tgz", - "integrity": "sha512-2uYdT32o/ZzSxYAPduAgokO8OlAL1YdG/9oxcEY138EDNpIK5XRRJDaGzTZdIBWSxk0aR8XxN44FvfXtHB+Fiw==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.1", - "@jest/source-map": "^26.5.0", - "@jest/test-result": "^26.6.1", - "@jest/types": "^26.6.1", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^26.6.1", + "expect": "^26.6.2", "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.1", - "jest-matcher-utils": "^26.6.1", - "jest-message-util": "^26.6.1", - "jest-runtime": "^26.6.1", - "jest-snapshot": "^26.6.1", - "jest-util": "^26.6.1", - "pretty-format": "^26.6.1", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", "throat": "^5.0.0" } }, "jest-leak-detector": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.1.tgz", - "integrity": "sha512-j9ZOtJSJKlHjrs4aIxWjiQUjyrffPdiAQn2Iw0916w7qZE5Lk0T2KhIH6E9vfhzP6sw0Q0jtnLLb4vQ71o1HlA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", "dev": true, "requires": { "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.1" + "pretty-format": "^26.6.2" } }, "jest-matcher-utils": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.1.tgz", - "integrity": "sha512-9iu3zrsYlUnl8pByhREF9rr5eYoiEb1F7ymNKg6lJr/0qD37LWS5FSW/JcoDl8UdMX2+zAzabDs7sTO+QFKjCg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^26.6.1", + "jest-diff": "^26.6.2", "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.1" + "pretty-format": "^26.6.2" } }, "jest-message-util": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.1.tgz", - "integrity": "sha512-cqM4HnqncIebBNdTKrBoWR/4ufHTll0pK/FWwX0YasK+TlBQEMqw3IEdynuuOTjDPFO3ONlFn37280X48beByw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.1", + "@jest/types": "^26.6.2", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" } }, "jest-mock": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.1.tgz", - "integrity": "sha512-my0lPTBu1awY8iVG62sB2sx9qf8zxNDVX+5aFgoB8Vbqjb6LqIOsfyFA8P1z6H2IsqMbvOX9oCJnK67Y3yUIMA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "dev": true, "requires": { - "@jest/types": "^26.6.1", + "@jest/types": "^26.6.2", "@types/node": "*" } }, @@ -5386,16 +5339,16 @@ "dev": true }, "jest-resolve": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", - "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "dev": true, "requires": { - "@jest/types": "^26.6.1", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.1", + "jest-util": "^26.6.2", "read-pkg-up": "^7.0.1", "resolve": "^1.18.1", "slash": "^3.0.0" @@ -5496,74 +5449,74 @@ } }, "jest-resolve-dependencies": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.1.tgz", - "integrity": "sha512-MN6lufbZJ3RBfTnJesZtHu3hUCBqPdHRe2+FhIt0yiqJ3fMgzWRqMRQyN/d/QwOE7KXwAG2ekZutbPhuD7s51A==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", "dev": true, "requires": { - "@jest/types": "^26.6.1", + "@jest/types": "^26.6.2", "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.1" + "jest-snapshot": "^26.6.2" } }, "jest-runner": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.1.tgz", - "integrity": "sha512-DmpNGdgsbl5s0FGkmsInmqnmqCtliCSnjWA2TFAJS1m1mL5atwfPsf+uoZ8uYQ2X0uDj4NM+nPcDnUpbNTRMBA==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", "dev": true, "requires": { - "@jest/console": "^26.6.1", - "@jest/environment": "^26.6.1", - "@jest/test-result": "^26.6.1", - "@jest/types": "^26.6.1", + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.7.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.1", + "jest-config": "^26.6.3", "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.1", - "jest-leak-detector": "^26.6.1", - "jest-message-util": "^26.6.1", - "jest-resolve": "^26.6.1", - "jest-runtime": "^26.6.1", - "jest-util": "^26.6.1", - "jest-worker": "^26.6.1", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "source-map-support": "^0.5.6", "throat": "^5.0.0" } }, "jest-runtime": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.1.tgz", - "integrity": "sha512-7uOCNeezXDWgjEyzYbRN2ViY7xNZzusNVGAMmU0UHRUNXuY4j4GBHKGMqPo/cBPZA9bSYp+lwK2DRRBU5Dv6YQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.1", - "@jest/environment": "^26.6.1", - "@jest/fake-timers": "^26.6.1", - "@jest/globals": "^26.6.1", - "@jest/source-map": "^26.5.0", - "@jest/test-result": "^26.6.1", - "@jest/transform": "^26.6.1", - "@jest/types": "^26.6.1", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "@types/yargs": "^15.0.0", "chalk": "^4.0.0", - "cjs-module-lexer": "^0.4.2", + "cjs-module-lexer": "^0.6.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.1", - "jest-haste-map": "^26.6.1", - "jest-message-util": "^26.6.1", - "jest-mock": "^26.6.1", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.1", - "jest-snapshot": "^26.6.1", - "jest-util": "^26.6.1", - "jest-validate": "^26.6.1", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^15.4.1" @@ -5578,9 +5531,9 @@ } }, "jest-serializer": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.5.0.tgz", - "integrity": "sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { "@types/node": "*", @@ -5588,36 +5541,36 @@ } }, "jest-snapshot": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.1.tgz", - "integrity": "sha512-JA7bZp7HRTIJYAi85pJ/OZ2eur2dqmwIToA5/6d7Mn90isGEfeF9FvuhDLLEczgKP1ihreBzrJ6Vr7zteP5JNA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^26.6.1", + "@jest/types": "^26.6.2", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.0.0", "chalk": "^4.0.0", - "expect": "^26.6.1", + "expect": "^26.6.2", "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.1", + "jest-diff": "^26.6.2", "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.1", - "jest-matcher-utils": "^26.6.1", - "jest-message-util": "^26.6.1", - "jest-resolve": "^26.6.1", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", "natural-compare": "^1.4.0", - "pretty-format": "^26.6.1", + "pretty-format": "^26.6.2", "semver": "^7.3.2" } }, "jest-util": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.1.tgz", - "integrity": "sha512-xCLZUqVoqhquyPLuDXmH7ogceGctbW8SMyQVjD9o+1+NPWI7t0vO08udcFLVPLgKWcvc+zotaUv/RuaR6l8HIA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.6.1", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -5626,46 +5579,46 @@ } }, "jest-validate": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.1.tgz", - "integrity": "sha512-BEFpGbylKocnNPZULcnk+TGaz1oFZQH/wcaXlaXABbu0zBwkOGczuWgdLucUouuQqn7VadHZZeTvo8VSFDLMOA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "dev": true, "requires": { - "@jest/types": "^26.6.1", + "@jest/types": "^26.6.2", "camelcase": "^6.0.0", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", "leven": "^3.1.0", - "pretty-format": "^26.6.1" + "pretty-format": "^26.6.2" }, "dependencies": { "camelcase": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", - "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true } } }, "jest-watcher": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.1.tgz", - "integrity": "sha512-0LBIPPncNi9CaLKK15bnxyd2E8OMl4kJg0PTiNOI+MXztXw1zVdtX/x9Pr6pXaQYps+eS/ts43O4+HByZ7yJSw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", "dev": true, "requires": { - "@jest/test-result": "^26.6.1", - "@jest/types": "^26.6.1", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^26.6.1", + "jest-util": "^26.6.2", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.1.tgz", - "integrity": "sha512-R5IE3qSGz+QynJx8y+ICEkdI2OJ3RJjRQVEyCcFAd3yVhQSEtquziPO29Mlzgn07LOVE8u8jhJ1FqcwegiXWOw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { "@types/node": "*", @@ -5685,9 +5638,9 @@ "dev": true }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -5923,6 +5876,23 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -6259,9 +6229,9 @@ "dev": true }, "node-notifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", - "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz", + "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==", "dev": true, "optional": true, "requires": { @@ -6274,9 +6244,9 @@ } }, "nodemon": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.6.tgz", - "integrity": "sha512-4I3YDSKXg6ltYpcnZeHompqac4E6JeAMpGm8tJnB9Y3T0ehasLa4139dJOcCrB93HHrUMsCrKtoAlXTqT5n4AQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", + "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", "dev": true, "requires": { "chokidar": "^3.2.2", @@ -6292,9 +6262,9 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -6307,9 +6277,9 @@ "dev": true }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "semver": { @@ -6450,9 +6420,9 @@ } }, "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", "dev": true }, "object-keys": { @@ -6471,47 +6441,27 @@ } }, "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { + "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" } }, "object.entries": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", - "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", + "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", + "es-abstract": "^1.18.0-next.1", "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } } }, "object.pick": { @@ -6524,36 +6474,15 @@ } }, "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", + "es-abstract": "^1.18.0-next.1", "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } } }, "oboe": { @@ -6609,9 +6538,9 @@ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", "dev": true }, "p-finally": { @@ -6823,12 +6752,12 @@ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, "pretty-format": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.1.tgz", - "integrity": "sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "@jest/types": "^26.6.1", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^17.0.1" @@ -7060,9 +6989,9 @@ "dev": true }, "registry-auth-token": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", - "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", "dev": true, "requires": { "rc": "^1.2.8" @@ -7155,6 +7084,12 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -7162,12 +7097,12 @@ "dev": true }, "resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { - "is-core-module": "^2.0.0", + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -7221,9 +7156,9 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -7260,9 +7195,9 @@ "dev": true }, "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", "dev": true }, "safe-buffer": { @@ -7450,10 +7385,13 @@ } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "semver-diff": { "version": "3.1.1", @@ -7626,40 +7564,14 @@ "dev": true }, "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - } + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } }, "snapdragon": { @@ -7678,15 +7590,6 @@ "use": "^3.1.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -7846,9 +7749,9 @@ } }, "spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", "dev": true }, "split-string": { @@ -7883,9 +7786,9 @@ } }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" @@ -7947,51 +7850,34 @@ } }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "string.prototype.trimend": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz", - "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "string.prototype.trimstart": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz", - "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "string_decoder": { @@ -8133,15 +8019,35 @@ "dev": true }, "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", "dev": true, "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "ajv": "^7.0.2", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ajv": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz", + "integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } } }, "tar": { @@ -8311,9 +8217,9 @@ "dev": true }, "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.19.0.tgz", + "integrity": "sha512-A7BaLUPvcQ1cxVu72YfD+UMI3SQPTDv/w4ol6TOwLyI0hwfG9EC+cYlhdflJTmtYTgZ3KqdPSe/otxU4K3kArg==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -8376,9 +8282,9 @@ } }, "typescript": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", - "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", + "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", "dev": true }, "ultron": { @@ -8393,17 +8299,6 @@ "dev": true, "requires": { "debug": "^2.2.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "underscore": { @@ -8589,15 +8484,15 @@ "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==" }, "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", "dev": true }, "v8-to-istanbul": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-6.0.1.tgz", - "integrity": "sha512-PzM1WlqquhBvsV+Gco6WSFeg1AGdD53ccMRkFeyHRE/KRZaVacPOmQYP3EeVgDBtKD2BJ8kgynBQ5OtKiHCH+w==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", + "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -9069,31 +8964,6 @@ "dev": true, "requires": { "string-width": "^4.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - } } }, "word-wrap": { @@ -9111,31 +8981,6 @@ "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - } } }, "wrappy": { @@ -9143,15 +8988,6 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", @@ -9165,9 +9001,9 @@ } }, "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", + "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", "dev": true }, "xdg-basedir": { @@ -9240,9 +9076,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, "yaeti": { @@ -9274,12 +9110,6 @@ "yargs-parser": "^18.1.2" }, "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -9290,12 +9120,6 @@ "path-exists": "^4.0.0" } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -9334,17 +9158,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } } } }, diff --git a/package.json b/package.json index 67dc339..a41cbcf 100644 --- a/package.json +++ b/package.json @@ -35,20 +35,8 @@ "web3": "1.3.0" }, "devDependencies": { + "@dydxprotocol/node-service-base-dev": "0.0.11", "@types/es6-promisify": "^6.0.0", - "@types/jest": "^26.0.13", - "@types/lodash": "^4.14.161", - "@types/node": "^14.6.4", - "@types/uuid": "^8.3.0", - "@typescript-eslint/eslint-plugin": "^4.0.1", - "@typescript-eslint/parser": "^4.0.1", - "coveralls": "^3.1.0", - "dotenv-flow": "^3.2.0", - "eslint": "^7.8.0", - "eslint-config-airbnb-typescript": "^9.0.0", - "eslint-plugin-import": "^2.22.0", - "jest": "^26.4.2", - "nodemon": "^2.0.4", - "typescript": "^4.0.2" + "@types/uuid": "^8.3.0" } } diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index d3c1b54..14431a0 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -66,10 +66,10 @@ export default class Onboarding { signature?: string, signingMethod?: SigningMethod, ): Promise<{ - apiKey: string, - user: UserResponseObject, - account: AccountResponseObject, - }> { + apiKey: string, + user: UserResponseObject, + account: AccountResponseObject, + }> { return this.post( 'onboarding', params, diff --git a/tsconfig.json b/tsconfig.json index 3cf1327..dd5d511 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,28 +1,11 @@ { - "compilerOptions": { - "target": "ES2019", - "module": "CommonJS", - "lib": [ - "es2015", - "es2016", - "es2017", - "es2018", - "es2019" - ], - "outDir": "build", - "declaration": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "inlineSourceMap": true, - "noFallthroughCasesInSwitch": true, - "noImplicitReturns": true, - "resolveJsonModule": true, - "strict": true - }, + "extends": "./node_modules/@dydxprotocol/node-service-base-dev/tsconfig.json", "include": [ "__tests__", "scripts", "src" ], - "compileOnSave": true + "compilerOptions": { + "outDir": "build" + } } From 63a215b31b7903ccde527470f92d9b1bd29ee139 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Thu, 7 Jan 2021 13:54:52 -0800 Subject: [PATCH 044/180] fix typos and bump (#40) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 2 +- src/modules/public.ts | 3 ++- src/types.ts | 13 +++++++++++++ 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 65cd38f..da05357 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.2.1", + "version": "0.2.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a41cbcf..ee1dfdd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.2.1", + "version": "0.2.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index cec9ac6..7620a05 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -468,7 +468,7 @@ export default class Private { * * @param { * @creditAmount specifies the size of the withdrawal - * @debitAmoutn specifies the amount to be debited + * @debitAmount specifies the amount to be debited * @creditAsset specifies the asset being withdrawn * @toAddress is the address being withdrawn to * @lpPositionId is the LP positionId for the fast withdrawal diff --git a/src/modules/public.ts b/src/modules/public.ts index 692f6a0..712c239 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -2,6 +2,7 @@ import { generateQueryPath } from '../helpers/request-helpers'; import { axiosRequest } from '../lib/axios'; import { CandleResolution, + CandleResponseObject, Data, HistoricalFundingResponseObject, ISO8601, @@ -158,7 +159,7 @@ export default class Public { fromISO?: ISO8601, toISO?: ISO8601, limit?: number, - }): Promise<{ historicalFunding: HistoricalFundingResponseObject }> { + }): Promise<{ candles: CandleResponseObject }> { const uri: string = `candles/${market}`; return this.get( uri, diff --git a/src/types.ts b/src/types.ts index 29708b9..22c5e22 100644 --- a/src/types.ts +++ b/src/types.ts @@ -279,6 +279,19 @@ export interface OrderbookResponseObject { asks: OrderbookResponseOrder[], } +export interface CandleResponseObject { + startedAt: ISO8601; + market: Market; + resolution: CandleResolution; + low: string; + high: string; + open: string; + close: string; + baseTokenVolume: string; + trades: string; + usdVolume: string; +} + export interface Trade { side: OrderSide, size: string, From 574db972de9d30e2c32c01863cc59138187de415 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Thu, 7 Jan 2021 16:27:59 -0800 Subject: [PATCH 045/180] Use node-service-base-dev (#38) From 0ed818bb97c808f9e76ed19383ddde8220d7c22e Mon Sep 17 00:00:00 2001 From: Kenadia Date: Thu, 7 Jan 2021 23:04:00 -0800 Subject: [PATCH 046/180] Fix off chain action sig verification (#41) * Fix off chain action sig verification * v0.2.3 * Rename to sign-off-chain-action.test.ts * Fix and update tests * Revert update version --- ....test.ts => sign-off-chain-action.test.ts} | 63 ++++++++++++------- src/modules/sign-off-chain-action.ts | 6 +- 2 files changed, 43 insertions(+), 26 deletions(-) rename __tests__/{sign-off-chain.test.ts => sign-off-chain-action.test.ts} (56%) diff --git a/__tests__/sign-off-chain.test.ts b/__tests__/sign-off-chain-action.test.ts similarity index 56% rename from __tests__/sign-off-chain.test.ts rename to __tests__/sign-off-chain-action.test.ts index 55ee632..b59abf8 100644 --- a/__tests__/sign-off-chain.test.ts +++ b/__tests__/sign-off-chain-action.test.ts @@ -30,61 +30,76 @@ describe('signOffChainAction', () => { expect( signOffChainAction.signOffChainActionIsValid( signature, - SigningMethod.Hash, + account.address, generateOnboardingAction(), ), ).toBe(true); }); it('Succeeds with apikey hash', async () => { - const expiration = new Date('December 30, 2500 11:20:25'); - const url: string = 'v3/test'; - const method: ApiMethod = ApiMethod.POST; + const expiration = new Date(Date.now() + 10000); // Add 10 seconds. + const action = generateApiKeyAction({ + requestPath: 'v3/test', + method: ApiMethod.POST, + data: { key: 'value' }, + }); const signature = await signOffChainAction.signOffChainAction( account.address, SigningMethod.Hash, - generateApiKeyAction({ - requestPath: url, - method, - }), + action, expiration, ); expect( signOffChainAction.signOffChainActionIsValid( signature, account.address, - generateApiKeyAction({ - requestPath: url, - method, - }), + action, expiration, ), ).toBe(true); }); - it('Recognizes expired signatures', async () => { - const expiration = new Date('December 30, 2017 11:20:25'); - const url: string = 'v3/test'; - const method: ApiMethod = ApiMethod.POST; + it('Fails with an invalid signature', async () => { + const signature = await signOffChainAction.signOffChainAction( + account.address, + SigningMethod.Hash, + generateOnboardingAction(), + ); + + // Change the last character. + const lastChar = signature.charAt(signature.length - 1); + const newLastChar = lastChar === '0' ? '1' : '0'; + const invalidSignature = `${signature.slice(0, signature.length - 1)}${newLastChar}`; + + expect( + signOffChainAction.signOffChainActionIsValid( + invalidSignature, + account.address, + generateOnboardingAction(), + ), + ).toBe(false); + }); + + it('Returns invalid if a signature is expired', async () => { + const expiration = new Date(Date.now() - 1); + const action = generateApiKeyAction({ + requestPath: 'v3/test', + method: ApiMethod.POST, + data: { key: 'value' }, + }); const signature = await signOffChainAction.signOffChainAction( account.address, SigningMethod.Hash, - generateApiKeyAction({ - requestPath: url, - method, - }), + action, expiration, ); expect( signOffChainAction.signOffChainActionIsValid( signature, account.address, - generateApiKeyAction({ - requestPath: url, - method, - }), + action, expiration, ), ).toBe(false); diff --git a/src/modules/sign-off-chain-action.ts b/src/modules/sign-off-chain-action.ts index 5c36412..80c8e24 100644 --- a/src/modules/sign-off-chain-action.ts +++ b/src/modules/sign-off-chain-action.ts @@ -127,8 +127,10 @@ export class SignOffChainAction extends Signer { ): boolean { const hash = this.getOffChainActionHash(action, expiration); const signer = ecRecoverTypedSignature(hash, typedSignature); - return (addressesAreEqual(signer, expectedSigner) && - expiration ? expiration > new Date() : true); + return ( + addressesAreEqual(signer, expectedSigner) && + (expiration ? expiration > new Date() : true) + ); } public getDomainHash(): string { From 838313764261ee61b63c077d804327f0c2a4e689 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Fri, 8 Jan 2021 14:47:47 -0800 Subject: [PATCH 047/180] v0.3.0: Update Ethereum signature format (#42) * Update OffChainAction function names * Sign expiration ISO string * Don't check expiration * Fix EIP-712 and update structs * v0.3.0 * Respond to CR --- __tests__/api-keys.test.ts | 2 +- __tests__/eth-signing/api-key-action.test.ts | 123 ++++++++++++++++++ .../eth-signing/onboarding-action.test.ts | 88 +++++++++++++ __tests__/sign-off-chain-action.test.ts | 107 --------------- package-lock.json | 2 +- package.json | 2 +- src/dydx-client.ts | 23 ++-- src/eth-signing/api-key-action.ts | 44 +++++++ .../helpers.ts} | 21 +-- src/eth-signing/index.ts | 2 + src/eth-signing/onboarding-action.ts | 51 ++++++++ .../sign-off-chain-action.ts | 108 +++++---------- src/{modules => eth-signing}/signer.ts | 16 +-- src/index.ts | 5 +- src/lib/eth-validation/actions.ts | 24 ---- src/modules/api-keys.ts | 32 ++--- src/modules/onboarding.ts | 27 ++-- src/types.ts | 9 ++ 18 files changed, 399 insertions(+), 287 deletions(-) create mode 100644 __tests__/eth-signing/api-key-action.test.ts create mode 100644 __tests__/eth-signing/onboarding-action.test.ts delete mode 100644 __tests__/sign-off-chain-action.test.ts create mode 100644 src/eth-signing/api-key-action.ts rename src/{lib/eth-validation/signature-helper.ts => eth-signing/helpers.ts} (88%) create mode 100644 src/eth-signing/index.ts create mode 100644 src/eth-signing/onboarding-action.ts rename src/{modules => eth-signing}/sign-off-chain-action.ts (58%) rename src/{modules => eth-signing}/signer.ts (92%) delete mode 100644 src/lib/eth-validation/actions.ts diff --git a/__tests__/api-keys.test.ts b/__tests__/api-keys.test.ts index 0fb7342..1c7c247 100644 --- a/__tests__/api-keys.test.ts +++ b/__tests__/api-keys.test.ts @@ -10,7 +10,7 @@ import { asMock } from './helpers/util'; describe('API Keys Module', () => { - it('Signs a request', async () => { + it('signs a request', async () => { asMock(axios).mockResolvedValue({} as AxiosResponse); const web3 = new Web3(); diff --git a/__tests__/eth-signing/api-key-action.test.ts b/__tests__/eth-signing/api-key-action.test.ts new file mode 100644 index 0000000..0790599 --- /dev/null +++ b/__tests__/eth-signing/api-key-action.test.ts @@ -0,0 +1,123 @@ +import { ApiMethod } from '@dydxprotocol/starkex-lib'; +import Web3 from 'web3'; + +import { SignApiKeyAction } from '../../src/eth-signing'; +import { SigningMethod } from '../../src/types'; + +const mockRequestNoBody = { + requestPath: 'v3/test', + method: ApiMethod.POST, + body: '{}', + timestamp: '2021-01-08T10:06:12.500Z', +}; +const mockRequestWithBody = { + ...mockRequestNoBody, + body: JSON.stringify({ key: 'value', key2: 'value2' }), +}; + +let localSigner: SignApiKeyAction; +let localAccountAddress: string; +let remoteSigner: SignApiKeyAction; +let remoteAccountAddress: string; + +describe('SignApiKeyAction', () => { + + describe('without a web3 provider', () => { + + beforeAll(() => { + const web3 = new Web3(); + localSigner = new SignApiKeyAction(web3, 1); + localAccountAddress = web3.eth.accounts.wallet.create(1)[0].address; + }); + + it('signs and verifies using SigningMethod.Hash', async () => { + const signature = await localSigner.sign( + localAccountAddress, + SigningMethod.Hash, + mockRequestNoBody, + ); + expect( + localSigner.verify( + signature, + localAccountAddress, + mockRequestNoBody, + ), + ).toBe(true); + }); + + it('rejects an invalid signature', async () => { + const signature = await localSigner.sign( + localAccountAddress, + SigningMethod.Hash, + mockRequestNoBody, + ); + + // Change the last character. + const lastChar = signature.charAt(signature.length - 1); + const newLastChar = lastChar === '0' ? '1' : '0'; + const invalidSignature = `${signature.slice(0, signature.length - 1)}${newLastChar}`; + + expect( + localSigner.verify( + invalidSignature, + localAccountAddress, + mockRequestNoBody, + ), + ).toBe(false); + }); + }); + + describe('with a web3 provider', () => { + + beforeAll(async () => { + const web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545')); + remoteSigner = new SignApiKeyAction(web3, 1); + remoteAccountAddress = (await web3.eth.getAccounts())[0]; + }); + + it('signs and verifies using SigningMethod.Hash', async () => { + const signature = await localSigner.sign( + localAccountAddress, + SigningMethod.Hash, + mockRequestNoBody, + ); + expect( + localSigner.verify( + signature, + localAccountAddress, + mockRequestNoBody, + ), + ).toBe(true); + }); + + it('signs and verifies using SigningMethod.TypedData', async () => { + const signature = await remoteSigner.sign( + remoteAccountAddress, + SigningMethod.TypedData, + mockRequestNoBody, + ); + expect( + remoteSigner.verify( + signature, + remoteAccountAddress, + mockRequestNoBody, + ), + ).toBe(true); + }); + + it('signs and verifies using SigningMethod.TypedData (with body)', async () => { + const signature = await remoteSigner.sign( + remoteAccountAddress, + SigningMethod.TypedData, + mockRequestWithBody, + ); + expect( + remoteSigner.verify( + signature, + remoteAccountAddress, + mockRequestWithBody, + ), + ).toBe(true); + }); + }); +}); diff --git a/__tests__/eth-signing/onboarding-action.test.ts b/__tests__/eth-signing/onboarding-action.test.ts new file mode 100644 index 0000000..3f949f7 --- /dev/null +++ b/__tests__/eth-signing/onboarding-action.test.ts @@ -0,0 +1,88 @@ +import Web3 from 'web3'; + +import { SignOnboardingAction } from '../../src/eth-signing'; +import { SigningMethod } from '../../src/types'; + +let localSigner: SignOnboardingAction; +let localAccountAddress: string; +let remoteSigner: SignOnboardingAction; +let remoteAccountAddress: string; + +describe('SignOnboardingAction', () => { + + describe('without a web3 provider', () => { + + beforeAll(() => { + const web3 = new Web3(); + localSigner = new SignOnboardingAction(web3, 1); + localAccountAddress = web3.eth.accounts.wallet.create(1)[0].address; + }); + + it('signs and verifies using SigningMethod.Hash', async () => { + const signature = await localSigner.sign( + localAccountAddress, + SigningMethod.Hash, + ); + expect( + localSigner.verify( + signature, + localAccountAddress, + ), + ).toBe(true); + }); + + it('rejects an invalid signature', async () => { + const signature = await localSigner.sign( + localAccountAddress, + SigningMethod.Hash, + ); + + // Change the last character. + const lastChar = signature.charAt(signature.length - 1); + const newLastChar = lastChar === '0' ? '1' : '0'; + const invalidSignature = `${signature.slice(0, signature.length - 1)}${newLastChar}`; + + expect( + localSigner.verify( + invalidSignature, + localAccountAddress, + ), + ).toBe(false); + }); + }); + + describe('with a web3 provider', () => { + + beforeAll(async () => { + const web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545')); + remoteSigner = new SignOnboardingAction(web3, 1); + remoteAccountAddress = (await web3.eth.getAccounts())[0]; + }); + + it('signs and verifies using SigningMethod.Hash', async () => { + const signature = await localSigner.sign( + localAccountAddress, + SigningMethod.Hash, + ); + expect( + localSigner.verify( + signature, + localAccountAddress, + ), + ).toBe(true); + }); + + it('signs and verifies using SigningMethod.TypedData', async () => { + const signature = await remoteSigner.sign( + remoteAccountAddress, + SigningMethod.TypedData, + ); + expect( + remoteSigner.verify( + signature, + remoteAccountAddress, + ), + ).toBe(true); + }); + }); +}); diff --git a/__tests__/sign-off-chain-action.test.ts b/__tests__/sign-off-chain-action.test.ts deleted file mode 100644 index b59abf8..0000000 --- a/__tests__/sign-off-chain-action.test.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { ApiMethod } from '@dydxprotocol/starkex-lib'; -import Web3 from 'web3'; -import { - generateApiKeyAction, - generateOnboardingAction, - SignOffChainAction, -} from '../src'; -import { - SigningMethod, - EthereumAccount, -} from '../src/types'; - -let signOffChainAction: SignOffChainAction; -let account: EthereumAccount; - -describe('signOffChainAction', () => { - - beforeAll(async () => { - const web3 = new Web3(); - signOffChainAction = new SignOffChainAction(web3, 1); - account = web3.eth.accounts.wallet.create(1)[0]; - }); - - it('Succeeds with onboarding hash', async () => { - const signature = await signOffChainAction.signOffChainAction( - account.address, - SigningMethod.Hash, - generateOnboardingAction(), - ); - expect( - signOffChainAction.signOffChainActionIsValid( - signature, - account.address, - generateOnboardingAction(), - ), - ).toBe(true); - }); - - it('Succeeds with apikey hash', async () => { - const expiration = new Date(Date.now() + 10000); // Add 10 seconds. - const action = generateApiKeyAction({ - requestPath: 'v3/test', - method: ApiMethod.POST, - data: { key: 'value' }, - }); - - const signature = await signOffChainAction.signOffChainAction( - account.address, - SigningMethod.Hash, - action, - expiration, - ); - expect( - signOffChainAction.signOffChainActionIsValid( - signature, - account.address, - action, - expiration, - ), - ).toBe(true); - }); - - it('Fails with an invalid signature', async () => { - const signature = await signOffChainAction.signOffChainAction( - account.address, - SigningMethod.Hash, - generateOnboardingAction(), - ); - - // Change the last character. - const lastChar = signature.charAt(signature.length - 1); - const newLastChar = lastChar === '0' ? '1' : '0'; - const invalidSignature = `${signature.slice(0, signature.length - 1)}${newLastChar}`; - - expect( - signOffChainAction.signOffChainActionIsValid( - invalidSignature, - account.address, - generateOnboardingAction(), - ), - ).toBe(false); - }); - - it('Returns invalid if a signature is expired', async () => { - const expiration = new Date(Date.now() - 1); - const action = generateApiKeyAction({ - requestPath: 'v3/test', - method: ApiMethod.POST, - data: { key: 'value' }, - }); - - const signature = await signOffChainAction.signOffChainAction( - account.address, - SigningMethod.Hash, - action, - expiration, - ); - expect( - signOffChainAction.signOffChainActionIsValid( - signature, - account.address, - action, - expiration, - ), - ).toBe(false); - }); -}); diff --git a/package-lock.json b/package-lock.json index da05357..364219c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.2.2", + "version": "0.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ee1dfdd..a131a1e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.2.2", + "version": "0.3.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/dydx-client.ts b/src/dydx-client.ts index 8f329b9..4999214 100644 --- a/src/dydx-client.ts +++ b/src/dydx-client.ts @@ -1,6 +1,4 @@ -import { - KeyPair, -} from '@dydxprotocol/starkex-lib'; +import { KeyPair } from '@dydxprotocol/starkex-lib'; import Web3 from 'web3'; import ApiKeys from './modules/api-keys'; @@ -8,7 +6,6 @@ import Eth from './modules/eth'; import Onboarding from './modules/onboarding'; import Private from './modules/private'; import Public from './modules/public'; -import { SignOffChainAction } from './modules/sign-off-chain-action'; import { Provider } from './types'; export interface ClientOptions { @@ -20,13 +17,13 @@ export interface ClientOptions { web3Provider?: Provider; } -export default class DydxClient { +export class DydxClient { readonly host: string; readonly apiTimeout?: number; readonly apiPrivateKey?: string | KeyPair; + readonly networkId: number; readonly starkPrivateKey?: string | KeyPair; readonly web3?: Web3; - readonly signOffChainAction?: SignOffChainAction; // Modules. Except for `public`, these are created on-demand. private readonly _public: Public; @@ -42,16 +39,12 @@ export default class DydxClient { this.host = host; this.apiTimeout = options.apiTimeout; this.apiPrivateKey = options.apiPrivateKey; + this.networkId = typeof options.networkId === 'number' ? options.networkId : 1; this.starkPrivateKey = options.starkPrivateKey; if (options.web3 || options.web3Provider) { - const networkId = typeof options.networkId === 'number' ? options.networkId : 1; // Non-null assertion is safe due to if-condition. this.web3 = options.web3 || new Web3(options.web3Provider!); - this.signOffChainAction = new SignOffChainAction( - this.web3, - networkId, - ); } // Modules. @@ -90,8 +83,8 @@ export default class DydxClient { */ get apiKeys(): ApiKeys { if (!this._apiKeys) { - if (this.signOffChainAction) { - this._apiKeys = new ApiKeys(this.host, this.signOffChainAction); + if (this.web3) { + this._apiKeys = new ApiKeys(this.host, this.web3, this.networkId); } else { return notSupported( 'API key endpoints are not supported since neither web3 nor web3Provider was provided', @@ -106,8 +99,8 @@ export default class DydxClient { */ get onboarding(): Onboarding { if (!this._onboarding) { - if (this.signOffChainAction) { - this._onboarding = new Onboarding(this.host, this.signOffChainAction); + if (this.web3) { + this._onboarding = new Onboarding(this.host, this.web3, this.networkId); } else { return notSupported( 'Onboarding endpoints are not supported since neither web3 nor web3Provider was provided', diff --git a/src/eth-signing/api-key-action.ts b/src/eth-signing/api-key-action.ts new file mode 100644 index 0000000..063e4f3 --- /dev/null +++ b/src/eth-signing/api-key-action.ts @@ -0,0 +1,44 @@ +import Web3 from 'web3'; + +import { ApiKeyAction } from '../types'; +import { hashString } from './helpers'; +import { SignOffChainAction } from './sign-off-chain-action'; + +const EIP712_API_KEY_ACTION_STRUCT = [ + { type: 'string', name: 'method' }, + { type: 'string', name: 'requestPath' }, + { type: 'string', name: 'body' }, + { type: 'string', name: 'timestamp' }, +]; +const EIP712_API_KEY_ACTION_STRUCT_STRING = ( + 'dYdX(' + + 'string method,' + + 'string requestPath,' + + 'string body,' + + 'string timestamp' + + ')' +); + +export class SignApiKeyAction extends SignOffChainAction { + + constructor( + web3: Web3, + networkId: number, + ) { + super(web3, networkId, EIP712_API_KEY_ACTION_STRUCT); + } + + public getHash( + message: ApiKeyAction, + ): string { + const structHash: string | null = Web3.utils.soliditySha3( + { t: 'bytes32', v: hashString(EIP712_API_KEY_ACTION_STRUCT_STRING) }, + { t: 'bytes32', v: hashString(message.method) }, + { t: 'bytes32', v: hashString(message.requestPath) }, + { t: 'bytes32', v: hashString(message.body) }, + { t: 'bytes32', v: hashString(message.timestamp) }, + ); + // Non-null assertion operator is safe, hash is null only on empty input. + return this.getEIP712Hash(structHash!); + } +} diff --git a/src/lib/eth-validation/signature-helper.ts b/src/eth-signing/helpers.ts similarity index 88% rename from src/lib/eth-validation/signature-helper.ts rename to src/eth-signing/helpers.ts index 626d99e..056d648 100644 --- a/src/lib/eth-validation/signature-helper.ts +++ b/src/eth-signing/helpers.ts @@ -1,8 +1,7 @@ -import BigNumber from 'bignumber.js'; import { ethers } from 'ethers'; import Web3 from 'web3'; -import { Address, SignatureTypes } from '../../types'; +import { Address, SignatureTypes } from '../types'; export const PREPEND_DEC: string = '\x19Ethereum Signed Message:\n32'; @@ -71,11 +70,8 @@ export function ecRecoverTypedSignature( const signature = typedSignature.slice(0, -2); - if (!prependedHash) { - throw new Error(`Invalid hash: ${hash}`); - } - - return ethers.utils.recoverAddress(ethers.utils.arrayify(prependedHash), signature); + // Non-null assertion operator is safe, hash is null only on empty input. + return ethers.utils.recoverAddress(ethers.utils.arrayify(prependedHash!), signature); } export function createTypedSignature( @@ -138,15 +134,8 @@ export function addressesAreEqual( export function hashString(input: string): string { const hash: string | null = Web3.utils.soliditySha3({ t: 'string', v: input }); - if (!hash) { - throw new Error(`ecrecover failed due to invalid signature length: ${input}`); + if (hash === null) { + throw new Error(`soliditySha3 input was empty: ${input}`); } - return hash; } - -// ============ General Helpers ============ - -export function toString(input: number | string | BigNumber) { - return new BigNumber(input).toFixed(0); -} diff --git a/src/eth-signing/index.ts b/src/eth-signing/index.ts new file mode 100644 index 0000000..e898d89 --- /dev/null +++ b/src/eth-signing/index.ts @@ -0,0 +1,2 @@ +export { SignApiKeyAction } from './api-key-action'; +export { SignOnboardingAction } from './onboarding-action'; diff --git a/src/eth-signing/onboarding-action.ts b/src/eth-signing/onboarding-action.ts new file mode 100644 index 0000000..0d38c98 --- /dev/null +++ b/src/eth-signing/onboarding-action.ts @@ -0,0 +1,51 @@ +import Web3 from 'web3'; + +import { Address, SigningMethod } from '../types'; +import { hashString } from './helpers'; +import { SignOffChainAction } from './sign-off-chain-action'; + +const ONBOARDING_STRING: 'dYdX Onboarding' = 'dYdX Onboarding'; +const ONBOARDING_MESSAGE = { + action: ONBOARDING_STRING, +}; +const EIP712_ONBOARDING_ACTION_STRUCT = [ + { type: 'string', name: 'action' }, +]; +const EIP712_ONBOARDING_ACTION_STRUCT_STRING = ( + 'dYdX(' + + 'string action' + + ')' +); + +export class SignOnboardingAction extends SignOffChainAction { + + constructor( + web3: Web3, + networkId: number, + ) { + super(web3, networkId, EIP712_ONBOARDING_ACTION_STRUCT); + } + + public getHash(): string { + const structHash: string | null = Web3.utils.soliditySha3( + { t: 'bytes32', v: hashString(EIP712_ONBOARDING_ACTION_STRUCT_STRING) }, + { t: 'bytes32', v: hashString(ONBOARDING_STRING) }, + ); + // Non-null assertion operator is safe, hash is null only on empty input. + return this.getEIP712Hash(structHash!); + } + + public async sign( + signer: string, + signingMethod: SigningMethod, + ): Promise { + return super.sign(signer, signingMethod, ONBOARDING_MESSAGE); + } + + public verify( + typedSignature: string, + expectedSigner: Address, + ): boolean { + return super.verify(typedSignature, expectedSigner, ONBOARDING_MESSAGE); + } +} diff --git a/src/modules/sign-off-chain-action.ts b/src/eth-signing/sign-off-chain-action.ts similarity index 58% rename from src/modules/sign-off-chain-action.ts rename to src/eth-signing/sign-off-chain-action.ts index 80c8e24..87ddced 100644 --- a/src/modules/sign-off-chain-action.ts +++ b/src/eth-signing/sign-off-chain-action.ts @@ -1,38 +1,37 @@ +import BigNumber from 'bignumber.js'; import Web3 from 'web3'; -import { Mixed } from 'web3/utils'; -import { - createTypedSignature, - EIP712_DOMAIN_STRUCT_NO_CONTRACT, - ecRecoverTypedSignature, - addressesAreEqual, - hashString, - EIP712_DOMAIN_STRING_NO_CONTRACT, - toString, -} from '../lib/eth-validation/signature-helper'; import { SigningMethod, SignatureTypes, Address, EthereumAccount, } from '../types'; +import { + EIP712_DOMAIN_STRING_NO_CONTRACT, + EIP712_DOMAIN_STRUCT_NO_CONTRACT, + addressesAreEqual, + createTypedSignature, + ecRecoverTypedSignature, + hashString, +} from './helpers'; import { Signer } from './signer'; -// TODO: Rename expiration to timestamp? -const EIP712_WALLET_OFF_CHAIN_ACTION_ALL_STRUCT = [ - { type: 'string', name: 'action' }, - { type: 'string', name: 'expiration' }, -]; +type EIP712Struct = { + type: string; + name: string; +}[]; -export class SignOffChainAction extends Signer { +export abstract class SignOffChainAction extends Signer { + private readonly networkId: number; + private readonly actionStruct: EIP712Struct; private readonly domain: string; private readonly version: string; - private readonly networkId: number; - private readonly EIP712_OFF_CHAIN_ACTION_ALL_STRUCT_STRING: string; constructor( web3: Web3, networkId: number, + actionStruct: EIP712Struct, { domain = 'dYdX', version = '1.0', @@ -42,32 +41,28 @@ export class SignOffChainAction extends Signer { } = {}, ) { super(web3); - this.domain = domain; this.networkId = networkId; + this.actionStruct = actionStruct; + this.domain = domain; this.version = version; - this.EIP712_OFF_CHAIN_ACTION_ALL_STRUCT_STRING = ( - 'dYdX(' + - 'string action,' + - 'string expiration' + - ')' - ); } - public async signOffChainAction( + public abstract getHash(message: M): string; + + public async sign( signer: string, signingMethod: SigningMethod, - action: string, - expiration?: Date, + message: M, ): Promise { switch (signingMethod) { case SigningMethod.Hash: case SigningMethod.UnsafeHash: case SigningMethod.Compatibility: { - const hash = this.getOffChainActionHash(action, expiration); + const hash = this.getHash(message); // If the address is in the wallet, sign with it so we don't have to use the web3 provider. const walletAccount: EthereumAccount | undefined = ( - // Hack: wallet type incorrectly has index signature on number but not string + // Hack: The TypeScript type incorrectly has index signature on number but not string. this.web3.eth.accounts.wallet[signer as unknown as number] ); @@ -85,7 +80,7 @@ export class SignOffChainAction extends Signer { return unsafeHashSig; } - if (this.signOffChainActionIsValid(unsafeHashSig, signer, action, expiration)) { + if (this.verify(unsafeHashSig, signer, message)) { return unsafeHashSig; } return hashSig; @@ -98,14 +93,11 @@ export class SignOffChainAction extends Signer { const data = { types: { EIP712Domain: EIP712_DOMAIN_STRUCT_NO_CONTRACT, - [this.domain]: EIP712_WALLET_OFF_CHAIN_ACTION_ALL_STRUCT, + [this.domain]: this.actionStruct, }, domain: this.getDomainData(), primaryType: this.domain, - message: { - action, - expiration: expiration ? expiration.toUTCString() : null, - }, + message, }; return this.ethSignTypedDataInternal( signer, @@ -119,18 +111,14 @@ export class SignOffChainAction extends Signer { } } - public signOffChainActionIsValid( + public verify( typedSignature: string, expectedSigner: Address, - action: string, - expiration?: Date, + message: M, ): boolean { - const hash = this.getOffChainActionHash(action, expiration); + const hash = this.getHash(message); const signer = ecRecoverTypedSignature(hash, typedSignature); - return ( - addressesAreEqual(signer, expectedSigner) && - (expiration ? expiration > new Date() : true) - ); + return addressesAreEqual(signer, expectedSigner); } public getDomainHash(): string { @@ -138,36 +126,10 @@ export class SignOffChainAction extends Signer { { t: 'bytes32', v: hashString(EIP712_DOMAIN_STRING_NO_CONTRACT) }, { t: 'bytes32', v: hashString(this.domain) }, { t: 'bytes32', v: hashString(this.version) }, - { t: 'uint256', v: toString(this.networkId) }, + { t: 'uint256', v: new BigNumber(this.networkId).toFixed(0) }, ); - - if (!hash) { - throw new Error(`Could not get domain hash with domain: ${this.domain}`); - } - - return hash; - } - - public getOffChainActionHash( - action: string, - expiration?: Date, - ): string { - const mixed: Mixed[] = [ - { t: 'bytes32', v: hashString(this.EIP712_OFF_CHAIN_ACTION_ALL_STRUCT_STRING) }, - { t: 'bytes32', v: hashString(action) }, - ]; - - if (expiration) { - mixed.push({ t: 'bytes32', v: hashString(expiration.toUTCString()) }); - } - - const structHash: string | null = Web3.utils.soliditySha3(...mixed); - - if (!structHash) { - throw new Error(`Cannot get OffchainAction for: ${action}`); - } - - return this.getEIP712Hash(structHash); + // Non-null assertion operator is safe, hash is null only on empty input. + return hash!; } private getDomainData() { diff --git a/src/modules/signer.ts b/src/eth-signing/signer.ts similarity index 92% rename from src/modules/signer.ts rename to src/eth-signing/signer.ts index 5230f2f..828214a 100644 --- a/src/modules/signer.ts +++ b/src/eth-signing/signer.ts @@ -1,20 +1,16 @@ import { promisify } from 'es6-promisify'; import Web3 from 'web3'; -import { - AbstractProvider, -} from 'web3-core'; +import { AbstractProvider } from 'web3-core'; import { JsonRpcPayload, JsonRpcResponse, } from 'web3-core-helpers'; -import { - stripHexPrefix, -} from '../lib/eth-validation/signature-helper'; import { SignatureTypes, SigningMethod, } from '../types'; +import { stripHexPrefix } from './helpers'; export abstract class Signer { protected readonly web3: Web3; @@ -40,12 +36,8 @@ export abstract class Signer { { t: 'bytes32', v: this.getDomainHash() as string }, { t: 'bytes32', v: structHash }, ); - - if (!hash) { - throw new Error(`Invalid structHash: ${structHash}`); - } - - return hash; + // Non-null assertion operator is safe, hash is null only on empty input. + return hash!; } /** diff --git a/src/index.ts b/src/index.ts index a0b38c9..ff7e47f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,3 @@ -export { default as DydxClient } from './dydx-client'; -export * from './lib/eth-validation/actions'; -export * from './modules/sign-off-chain-action'; +export { DydxClient } from './dydx-client'; +export * from './eth-signing'; export * from './types'; diff --git a/src/lib/eth-validation/actions.ts b/src/lib/eth-validation/actions.ts deleted file mode 100644 index b4b24fe..0000000 --- a/src/lib/eth-validation/actions.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ApiMethod } from '@dydxprotocol/starkex-lib'; -import _ from 'lodash'; - -const ONBOARDING_STATIC_STRING: string = 'DYDX-ONBOARDING'; - -export function generateOnboardingAction(): string { - return ONBOARDING_STATIC_STRING; -} - -export function generateApiKeyAction({ - requestPath, - method, - data = {}, -}: { - requestPath: string, - method: ApiMethod, - data?: {}, -}): string { - return ( - method + - requestPath + - (_.isEmpty(data) ? '' : JSON.stringify(data)) - ); -} diff --git a/src/modules/api-keys.ts b/src/modules/api-keys.ts index b971ab9..7c4b1a0 100644 --- a/src/modules/api-keys.ts +++ b/src/modules/api-keys.ts @@ -1,27 +1,29 @@ import { ApiMethod } from '@dydxprotocol/starkex-lib'; +import _ from 'lodash'; +import Web3 from 'web3'; +import { SignApiKeyAction } from '../eth-signing'; import { generateQueryPath } from '../helpers/request-helpers'; import { axiosRequest, } from '../lib/axios'; -import { generateApiKeyAction } from '../lib/eth-validation/actions'; import { ApiKeyResponseObject, SigningMethod, Data, } from '../types'; -import { SignOffChainAction } from './sign-off-chain-action'; export default class ApiKeys { readonly host: string; - readonly signOffChainAction: SignOffChainAction; + readonly signer: SignApiKeyAction; constructor( host: string, - signOffChainAction: SignOffChainAction, + web3: Web3, + networkId: number, ) { this.host = host; - this.signOffChainAction = signOffChainAction; + this.signer = new SignApiKeyAction(web3, networkId); } // ============ Request Helpers ============ @@ -31,28 +33,28 @@ export default class ApiKeys { endpoint: string, ethereumAddress: string, signingMethod: SigningMethod, - data?: {}, + data: {} = {}, ): Promise { const requestPath: string = `/v3/${endpoint}`; - const timestamp: Date = new Date(); - const signature: string = await this.signOffChainAction.signOffChainAction( + const timestamp: string = new Date().toISOString(); + const body: string = JSON.stringify(data); + const signature: string = await this.signer.sign( ethereumAddress, signingMethod, - generateApiKeyAction({ + { method, requestPath, - data, - }), - timestamp, + body, + timestamp, + }, ); - return axiosRequest({ url: `${this.host}${requestPath}`, method, - data, + data: !_.isEmpty(data) ? body : undefined, headers: { 'DYDX-SIGNATURE': signature, - 'DYDX-TIMESTAMP': timestamp.toISOString(), + 'DYDX-TIMESTAMP': timestamp, 'DYDX-ETHEREUM-ADDRESS': ethereumAddress, }, }); diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index 14431a0..d0adbb6 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -1,26 +1,28 @@ +import Web3 from 'web3'; + +import { SignOnboardingAction } from '../eth-signing'; import { RequestMethod, axiosRequest, } from '../lib/axios'; -import { generateOnboardingAction } from '../lib/eth-validation/actions'; import { SigningMethod, AccountResponseObject, Data, UserResponseObject, } from '../types'; -import { SignOffChainAction } from './sign-off-chain-action'; export default class Onboarding { readonly host: string; - readonly signOffChainAction: SignOffChainAction; + readonly signer: SignOnboardingAction; constructor( host: string, - signOffChainAction: SignOffChainAction, + web3: Web3, + networkId: number, ) { this.host = host; - this.signOffChainAction = signOffChainAction; + this.signer = new SignOnboardingAction(web3, networkId); } // ============ Request Helpers ============ @@ -38,7 +40,7 @@ export default class Onboarding { method: RequestMethod.POST, data, headers: { - 'DYDX-SIGNATURE': signature || await this.sign(ethereumAddress, signingMethod), + 'DYDX-SIGNATURE': signature || await this.signer.sign(ethereumAddress, signingMethod), 'DYDX-ETHEREUM-ADDRESS': ethereumAddress, }, }); @@ -78,17 +80,4 @@ export default class Onboarding { signingMethod, ); } - - // ============ Signing ============ - - public async sign( - ethereumAddress: string, - signingMethod: SigningMethod = SigningMethod.Hash, - ): Promise { - return this.signOffChainAction.signOffChainAction( - ethereumAddress, - signingMethod, - generateOnboardingAction(), - ); - } } diff --git a/src/types.ts b/src/types.ts index 22c5e22..90a25e1 100644 --- a/src/types.ts +++ b/src/types.ts @@ -299,6 +299,15 @@ export interface Trade { createdAt: ISO8601, } +// ============ Ethereum Signing ============ + +export interface ApiKeyAction { + method: string, + requestPath: string, + body: string, + timestamp: string, +} + // ============ Utility Types ============ export type PartialBy = Omit & Partial>; From 405d7a99c2dc23a0836a553c8f78980896a6abb4 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Sat, 9 Jan 2021 23:54:51 -0800 Subject: [PATCH 048/180] Run Ganache on CircleCI for tests (fix tests) (#43) * Run Ganache on CircleCI for tests * Add Ganache to coverage step --- .circleci/config.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 06f0685..5b9fe3d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -49,6 +49,8 @@ jobs: test: docker: - image: dydxprotocol/node:12.18.3-alpine + - image: trufflesuite/ganache-cli:v6.8.2 + command: -d -k=istanbul -i 1001 working_directory: ~/build steps: - restore_cache: @@ -59,6 +61,8 @@ jobs: coverage: docker: - image: dydxprotocol/node:12.18.3-alpine + - image: trufflesuite/ganache-cli:v6.8.2 + command: -d -k=istanbul -i 1001 working_directory: ~/build steps: - restore_cache: From d56ac12d75492c305c8bb108a6036013181e1fed Mon Sep 17 00:00:00 2001 From: Kenadia Date: Tue, 12 Jan 2021 20:04:50 -0800 Subject: [PATCH 049/180] v0.3.1 Add support for Eth calls via starkex-eth (#44) * Add support for Eth calls via starkex-eth * v0.3.1 --- __tests__/index.test.ts | 2 +- package-lock.json | 120 +++++++++++++++++++++++++++++++++++++++- package.json | 3 +- src/dydx-client.ts | 22 ++++++-- src/modules/eth.ts | 11 ---- src/modules/private.ts | 24 -------- src/types.ts | 2 + 7 files changed, 138 insertions(+), 46 deletions(-) delete mode 100644 src/modules/eth.ts diff --git a/__tests__/index.test.ts b/__tests__/index.test.ts index bf02e63..5b38582 100644 --- a/__tests__/index.test.ts +++ b/__tests__/index.test.ts @@ -4,8 +4,8 @@ describe('DydxClient', () => { it('has separate modules', () => { const client = new DydxClient('https://example.com'); - expect(client.eth).toBeTruthy(); expect(client.apiKeys).toBeTruthy(); + expect(client.eth).toBeTruthy(); expect(client.onboarding).toBeTruthy(); expect(client.private).toBeTruthy(); expect(client.public).toBeTruthy(); diff --git a/package-lock.json b/package-lock.json index 364219c..88d6c9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.3.0", + "version": "0.3.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -486,6 +486,27 @@ "typescript": "^4.0.2" } }, + "@dydxprotocol/starkex-eth": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.3.1.tgz", + "integrity": "sha512-xodesBRA7JQ1+8OeOVnAl4SAsON3PVgAD/DWOOXaU8T8t46dKipn/NqkJ8/ys2coX/OJ9hW4NE7HLSJP3ddePA==", + "requires": { + "@types/big.js": "^6.0.0", + "@types/elliptic": "^6.4.12", + "big.js": "^6.0.0", + "bignumber.js": "^9.0.1", + "lodash": "^4.17.20", + "starkware-crypto": "^1.9.7", + "web3": "1.3.0" + }, + "dependencies": { + "bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" + } + } + }, "@dydxprotocol/starkex-lib": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.5.0.tgz", @@ -1470,6 +1491,11 @@ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, + "aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2941,6 +2967,23 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "enc-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/enc-utils/-/enc-utils-2.2.3.tgz", + "integrity": "sha512-+CGYNRNRtz9ONgeykAgI9WUvaQhoYDtoc0g8ZP0JZCNTPsDdivNr8VWpjScOM0oDw4lB/Rcbo1DqKyF1TTUVqQ==", + "requires": { + "bn.js": "4.11.8", + "is-typedarray": "1.0.0", + "typedarray-to-buffer": "3.1.5" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } + } + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -3567,6 +3610,41 @@ } } }, + "ethereumjs-util": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.7.tgz", + "integrity": "sha512-vU5rtZBlZsgkTw3o6PDKyB8li2EgLavnAbsKcfsH2YhHH1Le+PP8vEiMnAnvgc1B6uMoaM5GDCrVztBw0Q5K9g==", + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + } + }, + "ethereumjs-wallet": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.1.tgz", + "integrity": "sha512-3Z5g1hG1das0JWU6cQ9HWWTY2nt9nXCcwj7eXVNAHKbo00XAZO8+NHlwdgXDWrL0SXVQMvTWN8Q/82DRH/JhPw==", + "requires": { + "aes-js": "^3.1.1", + "bs58check": "^2.1.2", + "ethereum-cryptography": "^0.1.3", + "ethereumjs-util": "^7.0.2", + "randombytes": "^2.0.6", + "scrypt-js": "^3.0.1", + "utf8": "^3.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, "ethers": { "version": "4.0.48", "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", @@ -5856,8 +5934,7 @@ "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, "lodash.sortby": { "version": "4.7.0", @@ -7188,6 +7265,22 @@ } } }, + "rsv-signature": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/rsv-signature/-/rsv-signature-1.1.0.tgz", + "integrity": "sha512-8eoYjJMeWeLSejckVCYQ3teOdpaiBp7w64xDYX1qBgVLojjHXKD8dOq5eUDelAtyuYRDS1T+HVuGEegvzgNdwA==", + "requires": { + "bn.js": "^4.8.0", + "enc-utils": "^2.2.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -7802,6 +7895,27 @@ } } }, + "starkware-crypto": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/starkware-crypto/-/starkware-crypto-1.9.7.tgz", + "integrity": "sha512-KY8KIIh09wATGctKYhoHyaR3lIWVEO1+G6q+VJkvblhd66InHi2hZ3u1Ucp7rMVgijsSulCefVU7QLlE5QKtNw==", + "requires": { + "bip39": "^3.0.2", + "bn.js": "^5.1.2", + "elliptic": "^6.5.3", + "enc-utils": "^2.2.2", + "ethereumjs-wallet": "^1.0.0", + "hash.js": "^1.1.7", + "js-sha3": "^0.8.0", + "rsv-signature": "^1.1.0", + "starkware-types": "^1.1.0" + } + }, + "starkware-types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/starkware-types/-/starkware-types-1.2.0.tgz", + "integrity": "sha512-6/G+VGJ59nzaNOOampAP/aAjgkzIeJBWIpIX8CJEnJwz5GaADk8hFTe9jv+yqpW4nAwPJk+THw1WvEoEaaR07A==" + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", diff --git a/package.json b/package.json index a131a1e..e688c77 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.3.0", + "version": "0.3.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -25,6 +25,7 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { + "@dydxprotocol/starkex-eth": "^0.3.1", "@dydxprotocol/starkex-lib": "^0.5.0", "@types/web3": "1.0.18", "axios": "^0.21.1", diff --git a/src/dydx-client.ts b/src/dydx-client.ts index 4999214..da14a44 100644 --- a/src/dydx-client.ts +++ b/src/dydx-client.ts @@ -1,26 +1,31 @@ +import { StarkwareLib } from '@dydxprotocol/starkex-eth'; import { KeyPair } from '@dydxprotocol/starkex-lib'; import Web3 from 'web3'; import ApiKeys from './modules/api-keys'; -import Eth from './modules/eth'; import Onboarding from './modules/onboarding'; import Private from './modules/private'; import Public from './modules/public'; -import { Provider } from './types'; +import { + EthereumSendOptions, + Provider, +} from './types'; export interface ClientOptions { apiTimeout?: number; apiPrivateKey?: string | KeyPair; + ethSendOptions?: EthereumSendOptions; networkId?: number; starkPrivateKey?: string | KeyPair; web3?: Web3; - web3Provider?: Provider; + web3Provider?: string | Provider; } export class DydxClient { readonly host: string; readonly apiTimeout?: number; readonly apiPrivateKey?: string | KeyPair; + readonly ethSendOptions?: EthereumSendOptions; readonly networkId: number; readonly starkPrivateKey?: string | KeyPair; readonly web3?: Web3; @@ -30,7 +35,7 @@ export class DydxClient { private _private?: Private; private _apiKeys?: ApiKeys; private _onboarding?: Onboarding; - private _eth?: Eth; + private _eth?: StarkwareLib; constructor( host: string, @@ -39,6 +44,7 @@ export class DydxClient { this.host = host; this.apiTimeout = options.apiTimeout; this.apiPrivateKey = options.apiPrivateKey; + this.ethSendOptions = options.ethSendOptions; this.networkId = typeof options.networkId === 'number' ? options.networkId : 1; this.starkPrivateKey = options.starkPrivateKey; @@ -116,11 +122,15 @@ export class DydxClient { get eth() { if (!this._eth) { if (this.web3) { - this._eth = new Eth(this.web3); + this._eth = new StarkwareLib( + this.web3.currentProvider, + this.networkId, + this.ethSendOptions, + ); } else { return notSupported( 'Eth endpoints are not supported since neither web3 nor web3Provider was provided', - ) as Eth; + ) as StarkwareLib; } } return this._eth; diff --git a/src/modules/eth.ts b/src/modules/eth.ts deleted file mode 100644 index aa06e9f..0000000 --- a/src/modules/eth.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Web3 from 'web3'; - -export default class Eth { - readonly web3: Web3; - - constructor( - web3: Web3, - ) { - this.web3 = web3; - } -} diff --git a/src/modules/private.ts b/src/modules/private.ts index 7620a05..75db804 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -21,7 +21,6 @@ import { ApiFastWithdrawal, ApiOrder, ApiWithdrawal, - Asset, Data, FillResponseObject, FundingResponseObject, @@ -494,29 +493,6 @@ export default class Private { ); } - /** - * @description post a new deposit - * - * @param { - * @amount specifies the size of the deposit - * @asset specifies the asset being deposited - * @fromAddress is the address being deposited from - * } - */ - async createTestDeposit( - params: { - creditAmount: string, - debitAmount: string, - debitAsset: Asset, - fromAddress: string, - }, - ): Promise<{ deposit: TransferResponseObject }> { - return this.post( - 'deposits', - params, - ); - } - /** * @description get a user's funding payments by a set of query parameters * diff --git a/src/types.ts b/src/types.ts index 90a25e1..94a42b1 100644 --- a/src/types.ts +++ b/src/types.ts @@ -22,6 +22,8 @@ export type PositionsMap = { [market: string]: PositionResponseObject }; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type Data = any; +export { SendOptions as EthereumSendOptions } from '@dydxprotocol/starkex-eth'; + // ============ Enums ============ export type Market = DydxMarket; From ec28562bee0890e24be93eca29c65005656a2b22 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Fri, 15 Jan 2021 18:18:05 -0800 Subject: [PATCH 050/180] v0.3.2 Update Ropsten USDC asset ID (#45) * Update Ropsten USDC asset ID * v0.3.2 * Update starkex-eth@0.5.2 --- package-lock.json | 14 +++++++------- package.json | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 88d6c9f..c0e3c20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.3.1", + "version": "0.3.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -487,9 +487,9 @@ } }, "@dydxprotocol/starkex-eth": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.3.1.tgz", - "integrity": "sha512-xodesBRA7JQ1+8OeOVnAl4SAsON3PVgAD/DWOOXaU8T8t46dKipn/NqkJ8/ys2coX/OJ9hW4NE7HLSJP3ddePA==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.5.2.tgz", + "integrity": "sha512-R821SzQs0mQMGjbxIxvFGwhPvK3OlH0q9Cc7bCAr58dinEL70/+9G5Wf/+401lhgz+zkUUW3ry92qaErQNdTiA==", "requires": { "@types/big.js": "^6.0.0", "@types/elliptic": "^6.4.12", @@ -508,9 +508,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.5.0.tgz", - "integrity": "sha512-rTlbscnUA1w6IiCbdLxy5wo5D++Uf7djeWjAE/mnsuwWMnLw55v2yD9V7QOSSFuRsqWcWw3GlnWKX7Xgq2j0kQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.6.3.tgz", + "integrity": "sha512-mN9vTsA6WxlRDMr1IealBompM3Rpy49jYZt65uyBZDgvRKGXJFGzq+I3YjsW83sF1y/CJSTCi1OY1WJFpmWy8w==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index e688c77..7405dee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.3.1", + "version": "0.3.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -25,8 +25,8 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-eth": "^0.3.1", - "@dydxprotocol/starkex-lib": "^0.5.0", + "@dydxprotocol/starkex-eth": "^0.5.2", + "@dydxprotocol/starkex-lib": "^0.6.3", "@types/web3": "1.0.18", "axios": "^0.21.1", "bignumber.js": "^8.1.1", From 688a5fd75a83020a06830a9ad6ebe0048b87ee4b Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Sun, 17 Jan 2021 16:19:05 -0800 Subject: [PATCH 051/180] v0.3.3: Update MarketResponseObject (#46) * update MarketResponseObject * 0.3.3 --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index c0e3c20..3534324 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.3.2", + "version": "0.3.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 7405dee..6a078bd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.3.2", + "version": "0.3.3", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index 94a42b1..4fd40b9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -145,6 +145,7 @@ export interface MarketResponseObject { status: string; baseAsset: Asset; quoteAsset: Asset; + stepSize: string; tickSize: string; makerFee: string; takerFee: string; @@ -155,6 +156,10 @@ export interface MarketResponseObject { type: string; initialMarginFraction: string; maintenanceMarginFraction: string; + priceChange24H: string; + volume24H: string; + trades24H: string; + openInterest: string; } export interface MarketsResponseObject { From 36ac6a5456ebe99806d1637b0b5cfaf7ac1503ea Mon Sep 17 00:00:00 2001 From: Kenadia Date: Mon, 18 Jan 2021 12:09:34 -0800 Subject: [PATCH 052/180] v0.4.0 Update starkex-lib@0.7.0 (limit feee change) (#47) * Update starkex-lib@0.7.0 (limit feee change) * v0.4.0 --- package-lock.json | 8 ++++---- package.json | 4 ++-- src/modules/private.ts | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3534324..1fc9e7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.3.3", + "version": "0.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -508,9 +508,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.6.3.tgz", - "integrity": "sha512-mN9vTsA6WxlRDMr1IealBompM3Rpy49jYZt65uyBZDgvRKGXJFGzq+I3YjsW83sF1y/CJSTCi1OY1WJFpmWy8w==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.7.0.tgz", + "integrity": "sha512-voDJ8xI8OTreVA/5t65bR3N1QJzekraLxKRl+VTigy90jxKVen298lhUuwtQ5udW9PrQg3MMRfZQtcHUMlUtew==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index 6a078bd..c5024de 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.3.3", + "version": "0.4.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-eth": "^0.5.2", - "@dydxprotocol/starkex-lib": "^0.6.3", + "@dydxprotocol/starkex-lib": "^0.7.0", "@types/web3": "1.0.18", "axios": "^0.21.1", "bignumber.js": "^8.1.1", diff --git a/src/modules/private.ts b/src/modules/private.ts index 75db804..835135b 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -318,7 +318,7 @@ export default class Private { const orderToSign: OrderWithClientId = { humanSize: params.size, humanPrice: params.price, - humanLimitFee: params.limitFee, + limitFee: params.limitFee, market: params.market, side: params.side, expirationIsoTimestamp: params.expiration, From 0f27fe61d80559ad37bb932542d9fe2743994718 Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Tue, 19 Jan 2021 17:30:02 -0800 Subject: [PATCH 053/180] v0.4.1: Small fixes (#49) * small fixes * 0.4.1 --- package-lock.json | 2 +- package.json | 2 +- src/lib/db.ts | 6 ++++-- src/modules/private.ts | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1fc9e7a..72e27e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.4.0", + "version": "0.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c5024de..5fa97df 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.4.0", + "version": "0.4.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/lib/db.ts b/src/lib/db.ts index feb52be..c7c5272 100644 --- a/src/lib/db.ts +++ b/src/lib/db.ts @@ -2,10 +2,12 @@ import * as uuid from 'uuid'; +const UUID_NAMESPACE: string = '0f9da948-a6fb-4c45-9edc-4685c3f3317d'; + export function getUserId( address: string, ): string { - return uuid.v5(Buffer.from(address), '0f9da948-a6fb-4c45-9edc-4685c3f3317d'); + return uuid.v5(Buffer.from(address.toLowerCase()), UUID_NAMESPACE); } export function getAccountId({ @@ -17,6 +19,6 @@ export function getAccountId({ }) { return uuid.v5( Buffer.from(`${getUserId(address)}${accountNumber}`), - '0f9da948-a6fb-4c45-9edc-4685c3f3317d', + UUID_NAMESPACE, ); } diff --git a/src/modules/private.ts b/src/modules/private.ts index 835135b..f20fdc4 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -199,7 +199,7 @@ export default class Private { /** * @description get all accounts associated with an ethereumAddress */ - async getAccounts(): Promise<{ account: AccountResponseObject[] }> { + async getAccounts(): Promise<{ accounts: AccountResponseObject[] }> { return this.get( 'accounts', {}, From fa68d8093498e5427fd9ffea9eafaa73ebf1c9e8 Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Tue, 19 Jan 2021 17:58:35 -0800 Subject: [PATCH 054/180] v0.4.2: fix generateQueryPath (#50) * fix generateQueryPath * 0.4.2 * add more tests --- __tests__/utils.test.ts | 23 +++++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- src/helpers/request-helpers.ts | 10 ++++++---- 4 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 __tests__/utils.test.ts diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts new file mode 100644 index 0000000..67e6287 --- /dev/null +++ b/__tests__/utils.test.ts @@ -0,0 +1,23 @@ +/** + * Unit tests for helper and utility functions in src. + */ + +import { generateQueryPath } from '../src/helpers/request-helpers'; + +describe('request-helpers', () => { + + describe('generateQueryPath', () => { + it('creates query path', async () => { + expect(generateQueryPath('url', { + param1: 'value1', + param2: undefined, + param3: 3, + })).toEqual('url?param1=value1¶m3=3'); + }); + + it('creates empty query path', async () => { + expect(generateQueryPath('url', { param1: undefined })).toEqual('url'); + expect(generateQueryPath('url', {})).toEqual('url'); + }); + }); +}); diff --git a/package-lock.json b/package-lock.json index 72e27e8..3705eef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.4.1", + "version": "0.4.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5fa97df..2253d66 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.4.1", + "version": "0.4.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/helpers/request-helpers.ts b/src/helpers/request-helpers.ts index 22ded14..0ce88e3 100644 --- a/src/helpers/request-helpers.ts +++ b/src/helpers/request-helpers.ts @@ -1,11 +1,13 @@ export function generateQueryPath(url: string, params: {}): string { - const entries = Object.entries(params); - if (!entries.length) { + const definedEntries = Object.entries(params) + .filter(([_key, value]: [string, unknown]) => value !== undefined); + + if (!definedEntries.length) { return url; } - const paramsString = entries.map( - (kv) => `${kv[0]}=${kv[1]}`, + const paramsString = definedEntries.map( + ([key, value]: [string, unknown]) => `${key}=${value}`, ).join('&'); return `${url}?${paramsString}`; } From 905ce16c649dea7582a1ea35689e317fdaaac61c Mon Sep 17 00:00:00 2001 From: Kenadia Date: Wed, 20 Jan 2021 11:56:40 -0800 Subject: [PATCH 055/180] v0.5.0 Update starkex-lib (expiration change) (#48) --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3705eef..253688e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.4.2", + "version": "0.5.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -508,9 +508,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.7.0.tgz", - "integrity": "sha512-voDJ8xI8OTreVA/5t65bR3N1QJzekraLxKRl+VTigy90jxKVen298lhUuwtQ5udW9PrQg3MMRfZQtcHUMlUtew==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.8.0.tgz", + "integrity": "sha512-Q1d/AzjwfTqwh0euYxIUlpc/awgbwnNWmorte9KhD4Ly/g1JTZFTTxrxCaclkFtCoPzvvIMFliQ1jflARz12rg==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index 2253d66..d6a331e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.4.2", + "version": "0.5.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-eth": "^0.5.2", - "@dydxprotocol/starkex-lib": "^0.7.0", + "@dydxprotocol/starkex-lib": "^0.8.0", "@types/web3": "1.0.18", "axios": "^0.21.1", "bignumber.js": "^8.1.1", From c711a1cd931b29b25e9ab88d45c98b2b9855270a Mon Sep 17 00:00:00 2001 From: Ashwini Nene Date: Tue, 2 Feb 2021 14:44:34 -0800 Subject: [PATCH 056/180] v0.6.0 generate fast withdrawal signature (#52) * v0.6.0 generate fast withdrawal signature * fix * refactor Co-authored-by: aan1092j --- package-lock.json | 33 +++++++++++++++++----------- package.json | 6 ++--- src/dydx-client.ts | 1 + src/modules/private.ts | 50 +++++++++++++++++++++++++++++++++++++----- src/types.ts | 4 ++++ 5 files changed, 72 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 253688e..1ebe1b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.5.0", + "version": "0.6.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -487,9 +487,9 @@ } }, "@dydxprotocol/starkex-eth": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.5.2.tgz", - "integrity": "sha512-R821SzQs0mQMGjbxIxvFGwhPvK3OlH0q9Cc7bCAr58dinEL70/+9G5Wf/+401lhgz+zkUUW3ry92qaErQNdTiA==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.5.4.tgz", + "integrity": "sha512-eFQ/1biaGV1WD5X75BpQiprzS9smorJmKV0iOydqftdymMOsLlgax3BdHbFnIZBhUi3YCHKM0Q568kH0QN6zcw==", "requires": { "@types/big.js": "^6.0.0", "@types/elliptic": "^6.4.12", @@ -508,9 +508,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.8.0.tgz", - "integrity": "sha512-Q1d/AzjwfTqwh0euYxIUlpc/awgbwnNWmorte9KhD4Ly/g1JTZFTTxrxCaclkFtCoPzvvIMFliQ1jflARz12rg==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.10.0.tgz", + "integrity": "sha512-xWGgO3m/Qcmsd06DL3stnSTIXYJthp4oJRWLcBB/GSJvB8O/j7xiZEZfK3YltKhel5yONedqQKmYhXmwwmC7DQ==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", @@ -518,6 +518,13 @@ "bip39": "^3.0.3", "ethereum-cryptography": "^0.1.3", "hash.js": "^1.1.7" + }, + "dependencies": { + "@types/big.js": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.0.0.tgz", + "integrity": "sha512-EESIS1UIBimpfgoO0Ns9C4wnu/dA5pGa6mZDBSwZkshPRAmgLPu9yHEM8xDsmhZRT5sy+q/o6y922G2tP5kY2w==" + } } }, "@eslint/eslintrc": { @@ -1141,9 +1148,9 @@ } }, "@types/big.js": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.0.0.tgz", - "integrity": "sha512-EESIS1UIBimpfgoO0Ns9C4wnu/dA5pGa6mZDBSwZkshPRAmgLPu9yHEM8xDsmhZRT5sy+q/o6y922G2tP5kY2w==" + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.0.2.tgz", + "integrity": "sha512-7NdmOT3zjtghMofDwP1nAJCJWVjc/96V5msXRAZ4lPrvpGlajA95VQec7OXwA2wQaVmhjt+F5ko8pjvQU1tTFA==" }, "@types/bn.js": { "version": "4.11.6", @@ -3611,9 +3618,9 @@ } }, "ethereumjs-util": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.7.tgz", - "integrity": "sha512-vU5rtZBlZsgkTw3o6PDKyB8li2EgLavnAbsKcfsH2YhHH1Le+PP8vEiMnAnvgc1B6uMoaM5GDCrVztBw0Q5K9g==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.8.tgz", + "integrity": "sha512-JJt7tDpCAmDPw/sGoFYeq0guOVqT3pTE9xlEbBmc/nlCij3JRCoS2c96SQ6kXVHOT3xWUNLDm5QCJLQaUnVAtQ==", "requires": { "@types/bn.js": "^4.11.3", "bn.js": "^5.1.2", diff --git a/package.json b/package.json index d6a331e..23d2f43 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.5.0", + "version": "0.6.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -25,8 +25,8 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-eth": "^0.5.2", - "@dydxprotocol/starkex-lib": "^0.8.0", + "@dydxprotocol/starkex-eth": "^0.5.4", + "@dydxprotocol/starkex-lib": "^0.10.0", "@types/web3": "1.0.18", "axios": "^0.21.1", "bignumber.js": "^8.1.1", diff --git a/src/dydx-client.ts b/src/dydx-client.ts index da14a44..9fe546f 100644 --- a/src/dydx-client.ts +++ b/src/dydx-client.ts @@ -73,6 +73,7 @@ export class DydxClient { this._private = new Private( this.host, this.apiPrivateKey, + this.networkId, this.starkPrivateKey, ); } else { diff --git a/src/modules/private.ts b/src/modules/private.ts index f20fdc4..61feac9 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -1,3 +1,4 @@ +import { StarkwareLib } from '@dydxprotocol/starkex-eth'; import { ApiMethod, KeyPair, @@ -7,6 +8,8 @@ import { SignableWithdrawal, asEcKeyPair, asSimpleKeyPair, + SignableConditionalTransfer, + nonceFromClientId, } from '@dydxprotocol/starkex-lib'; import { generateQueryPath } from '../helpers/request-helpers'; @@ -19,6 +22,7 @@ import { AccountAction, AccountResponseObject, ApiFastWithdrawal, + ApiFastWithdrawalParams, ApiOrder, ApiWithdrawal, Data, @@ -33,6 +37,7 @@ import { PartialBy, PositionResponseObject, PositionStatus, + Provider, TransferResponseObject, UserResponseObject, } from '../types'; @@ -45,14 +50,18 @@ const METHOD_ENUM_MAP: Record = { [RequestMethod.PUT]: ApiMethod.PUT, }; +const collateralTokenDecimals = 6; + export default class Private { readonly host: string; readonly apiKeyPair: KeyPair; readonly starkKeyPair?: KeyPair; + readonly starkLib: StarkwareLib; constructor( host: string, apiPrivateKey: string | KeyPair, + networkId: number, starkPrivateKey?: string | KeyPair, ) { this.host = host; @@ -60,6 +69,7 @@ export default class Private { if (starkPrivateKey) { this.starkKeyPair = asSimpleKeyPair(asEcKeyPair(starkPrivateKey)); } + this.starkLib = new StarkwareLib({} as Provider, networkId); } // ============ Request Helpers ============ @@ -326,7 +336,7 @@ export default class Private { positionId, }; const starkOrder = SignableOrder.fromOrder(orderToSign); - signature = starkOrder.sign(this.starkKeyPair); + signature = await starkOrder.sign(this.starkKeyPair); } const order: ApiOrder = { @@ -447,7 +457,7 @@ export default class Private { positionId, }; const starkWithdrawal = SignableWithdrawal.fromWithdrawal(withdrawalToSign); - signature = starkWithdrawal.sign(this.starkKeyPair); + signature = await starkWithdrawal.sign(this.starkKeyPair); } const withdrawal: ApiWithdrawal = { @@ -475,12 +485,40 @@ export default class Private { * @signature starkware specific signature for fast-withdrawal * } */ - createFastWithdrawal( - params: PartialBy, + async createFastWithdrawal( + { + lpStarkKey, + ...params + }: PartialBy, + positionId: string, ): Promise<{ withdrawal: TransferResponseObject }> { const clientId = params.clientId || Math.random().toString().slice(2).replace(/^0+/, ''); // TODO meet starkware specification - const signature = params.signature || Math.random().toString().slice(2).replace(/^0+/, ''); + + let signature: string | undefined = params.signature; + if (!signature) { + if (!this.starkKeyPair) { + throw new Error('Fast withdrawal is not signed and client was not initialized with starkPrivateKey'); + } + const fact = this.starkLib.factRegistry.getTransferErc20Fact({ + recipient: params.toAddress, + tokenAddress: this.starkLib.collateralToken.getAddress(), + tokenDecimals: collateralTokenDecimals, + humanAmount: params.creditAmount, + salt: nonceFromClientId(clientId), + }); + const conditionalTransfer = new SignableConditionalTransfer({ + senderPositionId: positionId, + receiverPositionId: params.lpPositionId, + receiverPublicKey: lpStarkKey, + factRegistryAddress: this.starkLib.factRegistry.getAddress(), + fact, + humanAmount: params.debitAmount, + clientId, + expirationIsoTimestamp: params.expiration, + }); + signature = await conditionalTransfer.sign(this.starkKeyPair); + } const fastWithdrawal: ApiFastWithdrawal = { ...params, clientId, @@ -527,7 +565,7 @@ export default class Private { method: RequestMethod, isoTimestamp: ISO8601, data?: {}, - }): string { + }): Promise { return new SignableApiRequest({ body: data ? JSON.stringify(data) : '', requestPath, diff --git a/src/types.ts b/src/types.ts index 4fd40b9..e94c1a8 100644 --- a/src/types.ts +++ b/src/types.ts @@ -134,6 +134,10 @@ export interface ApiFastWithdrawal extends ApiStarkwareSigned { clientId: string; } +export interface ApiFastWithdrawalParams extends ApiFastWithdrawal { + lpStarkKey: string; +} + // ============ API Response Types ============ export interface ApiKeyResponseObject { From 5726650b6e23692a35c8221e2ae67b2b9105ee31 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Tue, 2 Feb 2021 15:57:42 -0800 Subject: [PATCH 057/180] Api (#55) * Sw auth2 (#53) * update apikey logic * ks1 * self-nit * spelling fix never got saved * fix * ks2 * add starkKeyYCoordinate (#54) * rebase * fix * ks2 --- __tests__/api-keys.test.ts | 40 ++++++++++++++++++++++---- __tests__/private.test.ts | 35 ++++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- src/dydx-client.ts | 23 ++++++++------- src/modules/api-keys.ts | 40 ++++++-------------------- src/modules/onboarding.ts | 8 ++++-- src/modules/private.ts | 59 ++++++++++++++++++++++++++++---------- src/modules/public.ts | 7 +++++ src/types.ts | 12 +++++--- 10 files changed, 156 insertions(+), 72 deletions(-) create mode 100644 __tests__/private.test.ts diff --git a/__tests__/api-keys.test.ts b/__tests__/api-keys.test.ts index 1c7c247..ef374bd 100644 --- a/__tests__/api-keys.test.ts +++ b/__tests__/api-keys.test.ts @@ -5,23 +5,53 @@ import axios, { AxiosResponse } from 'axios'; import Web3 from 'web3'; -import { DydxClient, EthereumAccount } from '../src'; +import { ApiKeyCredentials, DydxClient, EthereumAccount } from '../src'; import { asMock } from './helpers/util'; -describe('API Keys Module', () => { +const apiKeyCredentials: ApiKeyCredentials = { + key: 'd53c3a7d-3add-68db-a9c3-9ad582313c8e', + secret: '85BR_H-GC7HS3aydOxLw3zjRuDI6RYVgFmsYaKJh', + passphrase: '1qYatmED3wy9RnDZsGnR', +}; - it('signs a request', async () => { +describe('API Keys Module & Private Module', () => { + it('signs a private request', async () => { asMock(axios).mockResolvedValue({} as AxiosResponse); const web3 = new Web3(); const account: EthereumAccount = web3.eth.accounts.wallet.create(1)[0]; - const client = new DydxClient('https://example.com', { web3 }); - await client.apiKeys.getApiKeys(account.address); + + const client = new DydxClient('https://example.com', { web3, apiKeyCredentials }); + await client.private.getApiKeys( + account.address, + ); expect(axios).toHaveBeenCalledTimes(1); expect(axios).toHaveBeenCalledWith({ url: expect.stringContaining('/v3/api-keys'), method: 'GET', + headers: { + 'DYDX-API-KEY': expect.stringMatching(/[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}/), + 'DYDX-TIMESTAMP': expect.any(String), + 'DYDX-PASSPHRASE': expect.stringMatching(/^[A-Za-z0-9_-]{20}$/), + 'DYDX-SIGNATURE': expect.any(String), + }, + data: undefined, + }); + }); + + it('signs an ApiKey request', async () => { + asMock(axios).mockResolvedValue({} as AxiosResponse); + + const web3 = new Web3(); + const account: EthereumAccount = web3.eth.accounts.wallet.create(1)[0]; + const client = new DydxClient('https://example.com', { web3 }); + await client.apiKeys.deleteApiKey(apiKeyCredentials.key, account.address); + + expect(axios).toHaveBeenCalledTimes(1); + expect(axios).toHaveBeenCalledWith({ + url: expect.stringContaining('/v3/api-keys'), + method: 'DELETE', headers: { 'DYDX-SIGNATURE': expect.stringMatching(/0x[0-9a-f]{130}/), 'DYDX-TIMESTAMP': expect.any(String), diff --git a/__tests__/private.test.ts b/__tests__/private.test.ts new file mode 100644 index 0000000..ee8ec0e --- /dev/null +++ b/__tests__/private.test.ts @@ -0,0 +1,35 @@ +/** + * Unit tests signing with credentials. + */ + +import axios, { AxiosResponse } from 'axios'; +import Web3 from 'web3'; + +import { ApiKeyCredentials, DydxClient, EthereumAccount } from '../src'; +import { RequestMethod } from '../src/lib/axios'; +import { asMock } from './helpers/util'; + +const apiKeyCredentials: ApiKeyCredentials = { + key: 'foo', + secret: 'qnjyWWTHMY5SFqmNpJga_fXL-3lwOqUIpmz2izlV', + passphrase: 'foo', +}; + +describe('Verify signature is as expected', () => { + it('signs a private request', async () => { + asMock(axios).mockResolvedValue({} as AxiosResponse); + + const web3 = new Web3(); + const account: EthereumAccount = web3.eth.accounts.wallet.create(1)[0]; + + const client = new DydxClient('https://example.com', { web3, apiKeyCredentials }); + await client.private.getApiKeys( + account.address, + ); + expect(client.private.sign({ + requestPath: '/v3/api-keys?ethereumAddress=0xE5714924C8C5c732F92A439075C8211eB0611aaC', + method: RequestMethod.GET, + isoTimestamp: '2021-02-01T19:38:54.508Z', + })).toEqual('jGElyQttdQDNqlRu5CpCtfVEYcikknzXWsOjKJAcTtI='); + }); +}); diff --git a/package-lock.json b/package-lock.json index 1ebe1b8..7d735b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.6.0", + "version": "0.7.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 23d2f43..5a35841 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.6.0", + "version": "0.7.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/dydx-client.ts b/src/dydx-client.ts index 9fe546f..55bf283 100644 --- a/src/dydx-client.ts +++ b/src/dydx-client.ts @@ -7,28 +7,29 @@ import Onboarding from './modules/onboarding'; import Private from './modules/private'; import Public from './modules/public'; import { + ApiKeyCredentials, EthereumSendOptions, Provider, } from './types'; export interface ClientOptions { apiTimeout?: number; - apiPrivateKey?: string | KeyPair; ethSendOptions?: EthereumSendOptions; networkId?: number; starkPrivateKey?: string | KeyPair; web3?: Web3; web3Provider?: string | Provider; + apiKeyCredentials?: ApiKeyCredentials; } export class DydxClient { readonly host: string; readonly apiTimeout?: number; - readonly apiPrivateKey?: string | KeyPair; readonly ethSendOptions?: EthereumSendOptions; readonly networkId: number; readonly starkPrivateKey?: string | KeyPair; readonly web3?: Web3; + apiKeyCredentials?: ApiKeyCredentials; // Modules. Except for `public`, these are created on-demand. private readonly _public: Public; @@ -43,10 +44,10 @@ export class DydxClient { ) { this.host = host; this.apiTimeout = options.apiTimeout; - this.apiPrivateKey = options.apiPrivateKey; this.ethSendOptions = options.ethSendOptions; this.networkId = typeof options.networkId === 'number' ? options.networkId : 1; this.starkPrivateKey = options.starkPrivateKey; + this.apiKeyCredentials = options.apiKeyCredentials; if (options.web3 || options.web3Provider) { // Non-null assertion is safe due to if-condition. @@ -69,16 +70,16 @@ export class DydxClient { */ get private(): Private { if (!this._private) { - if (this.apiPrivateKey) { - this._private = new Private( - this.host, - this.apiPrivateKey, - this.networkId, - this.starkPrivateKey, - ); + if (this.apiKeyCredentials) { + this._private = new Private({ + host: this.host, + apiKeyCredentials: this.apiKeyCredentials, + starkPrivateKey: this.starkPrivateKey, + networkId: this.networkId, + }); } else { return notSupported( - 'Private endpoints are not supported since apiPrivateKey was not provided', + 'Private endpoints are not supported since apiKeyCredentials was not provided', ) as Private; } } diff --git a/src/modules/api-keys.ts b/src/modules/api-keys.ts index 7c4b1a0..bb784fc 100644 --- a/src/modules/api-keys.ts +++ b/src/modules/api-keys.ts @@ -8,9 +8,9 @@ import { axiosRequest, } from '../lib/axios'; import { - ApiKeyResponseObject, SigningMethod, Data, + ApiKeyCredentials, } from '../types'; export default class ApiKeys { @@ -60,21 +60,12 @@ export default class ApiKeys { }); } - protected async get( - endpoint: string, - ethereumAddress: string, - signingMethod: SigningMethod = SigningMethod.Hash, - ): Promise { - return this.request(ApiMethod.GET, endpoint, ethereumAddress, signingMethod); - } - protected async post( endpoint: string, ethereumAddress: string, signingMethod: SigningMethod = SigningMethod.Hash, - data: {}, ): Promise { - return this.request(ApiMethod.POST, endpoint, ethereumAddress, signingMethod, data); + return this.request(ApiMethod.POST, endpoint, ethereumAddress, signingMethod); } protected async delete( @@ -90,31 +81,16 @@ export default class ApiKeys { // ============ Requests ============ /** - * @description get the apiKeys associated with an ethereumAddress - * - * @param ethereumAddress the apiKeys are for - * @param signingMethod used for the signature that validates the request - */ - async getApiKeys( - ethereumAddress: string, - signingMethod: SigningMethod = SigningMethod.Hash, - ): Promise<{ apiKeys: ApiKeyResponseObject[] }> { - return this.get('api-keys', ethereumAddress, signingMethod); - } - - /** - *@description register an apiKey for an ethereumAddress - * - * @param apiKey to be registered for an ethereumAddress - * @param ethereumAddress the apiKey is for + * @description have an auto-generated apikey, secret and passphrase generated + * for an ethereumAddress. + * @param ethereumAddress the apiKey will be for * @param signingMethod used to validate the request */ - async registerApiKey( - apiKey: string, + async createApiKey( ethereumAddress: string, signingMethod: SigningMethod = SigningMethod.Hash, - ): Promise<{ apiKey: ApiKeyResponseObject }> { - return this.post('api-keys', ethereumAddress, signingMethod, { apiKey }); + ): Promise<{ apiKey: ApiKeyCredentials }> { + return this.post('api-keys', ethereumAddress, signingMethod); } /** diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index d0adbb6..97bda8b 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -10,6 +10,7 @@ import { AccountResponseObject, Data, UserResponseObject, + ApiKeyCredentials, } from '../types'; export default class Onboarding { @@ -53,7 +54,8 @@ export default class Onboarding { * * @param { * @starkKey is the unique public key for starkwareLib operations used in the future - * @apiKey is the unique public key for starkwareLib apiKey operations used in the future + * @starkKeyYCoordinate is the Y Coordinate of the unique public key for starkwareLib + * operations used in the future * } * @param ethereumAddress of the account * @param signature validating the request @@ -62,13 +64,13 @@ export default class Onboarding { async createUser( params: { starkKey: string, - apiKey: string, + starkKeyYCoordinate: string, }, ethereumAddress: string, signature?: string, signingMethod?: SigningMethod, ): Promise<{ - apiKey: string, + apiKey: ApiKeyCredentials, user: UserResponseObject, account: AccountResponseObject, }> { diff --git a/src/modules/private.ts b/src/modules/private.ts index 61feac9..765f629 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -1,9 +1,10 @@ +import crypto from 'crypto'; + import { StarkwareLib } from '@dydxprotocol/starkex-eth'; import { ApiMethod, KeyPair, OrderWithClientId, - SignableApiRequest, SignableOrder, SignableWithdrawal, asEcKeyPair, @@ -11,6 +12,7 @@ import { SignableConditionalTransfer, nonceFromClientId, } from '@dydxprotocol/starkex-lib'; +import _ from 'lodash'; import { generateQueryPath } from '../helpers/request-helpers'; import { @@ -23,6 +25,7 @@ import { AccountResponseObject, ApiFastWithdrawal, ApiFastWithdrawalParams, + ApiKeyCredentials, ApiOrder, ApiWithdrawal, Data, @@ -54,18 +57,23 @@ const collateralTokenDecimals = 6; export default class Private { readonly host: string; - readonly apiKeyPair: KeyPair; + readonly apiKeyCredentials: ApiKeyCredentials; readonly starkKeyPair?: KeyPair; readonly starkLib: StarkwareLib; - constructor( + constructor({ + host, + apiKeyCredentials, + starkPrivateKey, + networkId, + }: { host: string, - apiPrivateKey: string | KeyPair, networkId: number, + apiKeyCredentials: ApiKeyCredentials, starkPrivateKey?: string | KeyPair, - ) { + }) { this.host = host; - this.apiKeyPair = asSimpleKeyPair(asEcKeyPair(apiPrivateKey)); + this.apiKeyCredentials = apiKeyCredentials; if (starkPrivateKey) { this.starkKeyPair = asSimpleKeyPair(asEcKeyPair(starkPrivateKey)); } @@ -88,8 +96,9 @@ export default class Private { isoTimestamp, data, }), - 'DYDX-API-KEY': this.apiKeyPair.publicKey, + 'DYDX-API-KEY': this.apiKeyCredentials.key, 'DYDX-TIMESTAMP': isoTimestamp, + 'DYDX-PASSPHRASE': this.apiKeyCredentials.passphrase, }; return axiosRequest({ url: `${this.host}${requestPath}`, @@ -182,14 +191,18 @@ export default class Private { * * @param starkKey for the account that will be used as the public key in starkwareEx-Lib requests * going forward for this account. + * @param starkKeyYCoordinate for the account that will be used as the Y coordinate for the public + * key in starkwareEx-Lib requests going forward for this account. */ async createAccount( starkKey: string, + starkKeyYCoordinate: string, ): Promise<{ account: AccountResponseObject }> { return this.post( 'accounts', { starkKey, + starkKeyYCoordinate, }, ); } @@ -553,9 +566,20 @@ export default class Private { ); } + /** + * @description get the apiKey ids associated with an ethereumAddress + * + * @param ethereumAddress the apiKeys are for + */ + async getApiKeys( + ethereumAddress: string, + ): Promise<{ apiKeys: string[] }> { + return this.get('api-keys', { ethereumAddress }); + } + // ============ Signing ============ - protected sign({ + sign({ requestPath, method, isoTimestamp, @@ -565,12 +589,17 @@ export default class Private { method: RequestMethod, isoTimestamp: ISO8601, data?: {}, - }): Promise { - return new SignableApiRequest({ - body: data ? JSON.stringify(data) : '', - requestPath, - method: METHOD_ENUM_MAP[method], - isoTimestamp, - }).sign(this.apiKeyPair.privateKey); + }): string { + const messageString: string = ( + isoTimestamp + + METHOD_ENUM_MAP[method] + + requestPath + + (_.isEmpty(data) ? '' : JSON.stringify(data)) + ); + + return crypto.createHmac( + 'sha256', + Buffer.from(this.apiKeyCredentials.secret, 'base64'), + ).update(messageString).digest('base64'); } } diff --git a/src/modules/public.ts b/src/modules/public.ts index 712c239..3654774 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -171,4 +171,11 @@ export default class Public { }, ); } + + /** + * @description get api server time as iso and as epoch in seconds with MS + */ + getTime(): Promise<{ time: { iso: string, epoch: number } }> { + return this.get('time', {}); + } } diff --git a/src/types.ts b/src/types.ts index e94c1a8..ab3c5a0 100644 --- a/src/types.ts +++ b/src/types.ts @@ -24,6 +24,14 @@ export type Data = any; export { SendOptions as EthereumSendOptions } from '@dydxprotocol/starkex-eth'; +// ============ Credentials ============ + +export interface ApiKeyCredentials { + key: string, + secret: string, + passphrase: string, +} + // ============ Enums ============ export type Market = DydxMarket; @@ -140,10 +148,6 @@ export interface ApiFastWithdrawalParams extends ApiFastWithdrawal { // ============ API Response Types ============ -export interface ApiKeyResponseObject { - apiKey: string; -} - export interface MarketResponseObject { market: Market; status: string; From 3b9f17a64124cf4faa9eb0cd0d53883389ff9a31 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Tue, 2 Feb 2021 16:43:31 -0800 Subject: [PATCH 058/180] 0.7.1 Add method for STARK key derivation (#56) * Add function for STARK key derivation * v0.7.1 * Fix strip hex prefix * Add tests --- .../eth-signing/onboarding-action.test.ts | 28 ++++++++++- __tests__/onboarding.test.ts | 48 +++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- src/eth-signing/onboarding-action.ts | 38 +++++++-------- src/eth-signing/signer.ts | 1 - src/modules/onboarding.ts | 29 ++++++++++- src/types.ts | 9 ++++ 8 files changed, 130 insertions(+), 27 deletions(-) create mode 100644 __tests__/onboarding.test.ts diff --git a/__tests__/eth-signing/onboarding-action.test.ts b/__tests__/eth-signing/onboarding-action.test.ts index 3f949f7..23e959c 100644 --- a/__tests__/eth-signing/onboarding-action.test.ts +++ b/__tests__/eth-signing/onboarding-action.test.ts @@ -1,7 +1,10 @@ import Web3 from 'web3'; import { SignOnboardingAction } from '../../src/eth-signing'; -import { SigningMethod } from '../../src/types'; +import { + OnboardingActionString, + SigningMethod, +} from '../../src/types'; let localSigner: SignOnboardingAction; let localAccountAddress: string; @@ -22,11 +25,13 @@ describe('SignOnboardingAction', () => { const signature = await localSigner.sign( localAccountAddress, SigningMethod.Hash, + { action: OnboardingActionString.ONBOARDING }, ); expect( localSigner.verify( signature, localAccountAddress, + { action: OnboardingActionString.ONBOARDING }, ), ).toBe(true); }); @@ -35,6 +40,7 @@ describe('SignOnboardingAction', () => { const signature = await localSigner.sign( localAccountAddress, SigningMethod.Hash, + { action: OnboardingActionString.ONBOARDING }, ); // Change the last character. @@ -46,6 +52,22 @@ describe('SignOnboardingAction', () => { localSigner.verify( invalidSignature, localAccountAddress, + { action: OnboardingActionString.ONBOARDING }, + ), + ).toBe(false); + }); + + it('rejects if the message is different', async () => { + const signature = await localSigner.sign( + localAccountAddress, + SigningMethod.Hash, + { action: OnboardingActionString.ONBOARDING }, + ); + expect( + localSigner.verify( + signature, + localAccountAddress, + { action: OnboardingActionString.KEY_DERIVATION }, ), ).toBe(false); }); @@ -63,11 +85,13 @@ describe('SignOnboardingAction', () => { const signature = await localSigner.sign( localAccountAddress, SigningMethod.Hash, + { action: OnboardingActionString.ONBOARDING }, ); expect( localSigner.verify( signature, localAccountAddress, + { action: OnboardingActionString.ONBOARDING }, ), ).toBe(true); }); @@ -76,11 +100,13 @@ describe('SignOnboardingAction', () => { const signature = await remoteSigner.sign( remoteAccountAddress, SigningMethod.TypedData, + { action: OnboardingActionString.ONBOARDING }, ); expect( remoteSigner.verify( signature, remoteAccountAddress, + { action: OnboardingActionString.ONBOARDING }, ), ).toBe(true); }); diff --git a/__tests__/onboarding.test.ts b/__tests__/onboarding.test.ts new file mode 100644 index 0000000..e1c0a57 --- /dev/null +++ b/__tests__/onboarding.test.ts @@ -0,0 +1,48 @@ +import Web3 from 'web3'; + +import Onboarding from '../src/modules/onboarding'; + +let onboardingWithLocalKey: Onboarding; +let localEthereumAddress: string; + +let onboardingWithRemoteKey: Onboarding; +let remoteEthereumAddress: string; + +describe('Onboarding module', () => { + + describe('without a web3 provider', () => { + + beforeAll(() => { + const web3 = new Web3(); + onboardingWithLocalKey = new Onboarding('http://example.com', web3, 1001); + localEthereumAddress = web3.eth.accounts.wallet.create(1)[0].address; + }); + + it('derives a STARK key pair', async () => { + const keyPair = await onboardingWithLocalKey.deriveStarkKey(localEthereumAddress); + expect(keyPair).toStrictEqual({ + publicKey: expect.stringMatching(/^[0-9a-f]{64}$/), + publicKeyYCoordinate: expect.stringMatching(/^[0-9a-f]{64}$/), + privateKey: expect.stringMatching(/^[0-9a-f]{64}$/), + }); + }); + }); + + describe('with a web3 provider', () => { + + beforeAll(async () => { + const web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545')); + onboardingWithRemoteKey = new Onboarding('http://example.com', web3, 1001); + remoteEthereumAddress = (await web3.eth.getAccounts())[0]; + }); + + it('derives a STARK key pair', async () => { + const keyPair = await onboardingWithRemoteKey.deriveStarkKey(remoteEthereumAddress); + expect(keyPair).toStrictEqual({ + publicKey: '07100a584ea28998604e0dc2e68c427cefb86d147fc1de15100f5fa97ec2b0d2', + publicKeyYCoordinate: '0098701245cd63700e42fbcd8fb16df310f3c038d39f21deb60da50f54a824b7', + privateKey: '01bb0389af265c56844fa79b1e586b36f535fee293f59768fdb61d3f280f05fb', + }); + }); + }); +}); diff --git a/package-lock.json b/package-lock.json index 7d735b1..55b202a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.7.0", + "version": "0.7.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5a35841..db1fca6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.7.0", + "version": "0.7.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/eth-signing/onboarding-action.ts b/src/eth-signing/onboarding-action.ts index 0d38c98..df05f7e 100644 --- a/src/eth-signing/onboarding-action.ts +++ b/src/eth-signing/onboarding-action.ts @@ -1,13 +1,19 @@ +/** + * Signatures on static messages for onboarding. + * + * These are used during onboarding. The signature must be deterministic based on the Ethereum key + * because the signatures will be used for key derivation, and the keys should be recoverable: + * - The onboarding signature is used to derive the default API credentials, on the server. + * - The key derivation signature is used by the UI to derive the STARK key pair. Programmatic + * traders may optionally derive their STARK key pair in the same way. + */ + import Web3 from 'web3'; -import { Address, SigningMethod } from '../types'; +import { OnboardingAction } from '../types'; import { hashString } from './helpers'; import { SignOffChainAction } from './sign-off-chain-action'; -const ONBOARDING_STRING: 'dYdX Onboarding' = 'dYdX Onboarding'; -const ONBOARDING_MESSAGE = { - action: ONBOARDING_STRING, -}; const EIP712_ONBOARDING_ACTION_STRUCT = [ { type: 'string', name: 'action' }, ]; @@ -17,7 +23,7 @@ const EIP712_ONBOARDING_ACTION_STRUCT_STRING = ( ')' ); -export class SignOnboardingAction extends SignOffChainAction { +export class SignOnboardingAction extends SignOffChainAction { constructor( web3: Web3, @@ -26,26 +32,14 @@ export class SignOnboardingAction extends SignOffChainAction { - return super.sign(signer, signingMethod, ONBOARDING_MESSAGE); - } - - public verify( - typedSignature: string, - expectedSigner: Address, - ): boolean { - return super.verify(typedSignature, expectedSigner, ONBOARDING_MESSAGE); - } } diff --git a/src/eth-signing/signer.ts b/src/eth-signing/signer.ts index 828214a..8c7732d 100644 --- a/src/eth-signing/signer.ts +++ b/src/eth-signing/signer.ts @@ -97,7 +97,6 @@ export abstract class Signer { }); if (response.error) { - // TODO: Is this right? throw new Error((response.error as unknown as { message: string }).message); } return `0x${stripHexPrefix(response.result)}0${SignatureTypes.NO_PREPEND}`; diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index 97bda8b..4cf8189 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -1,6 +1,11 @@ +import { + KeyPairWithYCoordinate, + keyPairFromData, +} from '@dydxprotocol/starkex-lib'; import Web3 from 'web3'; import { SignOnboardingAction } from '../eth-signing'; +import { stripHexPrefix } from '../eth-signing/helpers'; import { RequestMethod, axiosRequest, @@ -11,6 +16,7 @@ import { Data, UserResponseObject, ApiKeyCredentials, + OnboardingActionString, } from '../types'; export default class Onboarding { @@ -41,7 +47,11 @@ export default class Onboarding { method: RequestMethod.POST, data, headers: { - 'DYDX-SIGNATURE': signature || await this.signer.sign(ethereumAddress, signingMethod), + 'DYDX-SIGNATURE': signature || await this.signer.sign( + ethereumAddress, + signingMethod, + { action: OnboardingActionString.ONBOARDING }, + ), 'DYDX-ETHEREUM-ADDRESS': ethereumAddress, }, }); @@ -82,4 +92,21 @@ export default class Onboarding { signingMethod, ); } + + // ============ Other ============ + + /** + * @description Derive a STARK key pair deterministically from an Ethereum key. + */ + async deriveStarkKey( + ethereumAddress: string, + signingMethod: SigningMethod = SigningMethod.Hash, + ): Promise { + const signature = await this.signer.sign( + ethereumAddress, + signingMethod, + { action: OnboardingActionString.KEY_DERIVATION }, + ); + return keyPairFromData(Buffer.from(stripHexPrefix(signature), 'hex')); + } } diff --git a/src/types.ts b/src/types.ts index ab3c5a0..d64c460 100644 --- a/src/types.ts +++ b/src/types.ts @@ -316,6 +316,15 @@ export interface Trade { // ============ Ethereum Signing ============ +export enum OnboardingActionString { + ONBOARDING = 'dYdX Onboarding', + KEY_DERIVATION = 'dYdX STARK Key', +} + +export interface OnboardingAction { + action: OnboardingActionString; +} + export interface ApiKeyAction { method: string, requestPath: string, From 59b110c6060a1e85456b1a1c052417c4b5de11ae Mon Sep 17 00:00:00 2001 From: Kenadia Date: Tue, 2 Feb 2021 18:06:45 -0800 Subject: [PATCH 059/180] v0.7.2 Update starkex-lib (worker thread optional) (#57) * Update starkex-lib (worker thread optional) * v0.7.2 --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 55b202a..f7768e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.7.1", + "version": "0.7.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -508,9 +508,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.10.0.tgz", - "integrity": "sha512-xWGgO3m/Qcmsd06DL3stnSTIXYJthp4oJRWLcBB/GSJvB8O/j7xiZEZfK3YltKhel5yONedqQKmYhXmwwmC7DQ==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.10.1.tgz", + "integrity": "sha512-3oW5L3EsUNjoTipXYmeSt4pRf7vvmUJAln3TQr3abfvjyQKbJYYM0jH8wA1bIUm+s/PngYMRymWK/cxpmiMrfw==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index db1fca6..615b466 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.7.1", + "version": "0.7.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-eth": "^0.5.4", - "@dydxprotocol/starkex-lib": "^0.10.0", + "@dydxprotocol/starkex-lib": "^0.10.1", "@types/web3": "1.0.18", "axios": "^0.21.1", "bignumber.js": "^8.1.1", From 353e9ea16e87f48725c7fec13ea5e7b991edf4b5 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Tue, 2 Feb 2021 18:33:23 -0800 Subject: [PATCH 060/180] v0.7.3 Add method for API key recovery (#58) * Add method for API key recovery * v0.7.3 --- __tests__/onboarding.test.ts | 28 +++++++++++- package-lock.json | 2 +- package.json | 2 +- src/eth-signing/onboarding-action.ts | 4 +- src/helpers/request-helpers.ts | 11 +++++ src/modules/onboarding.ts | 64 +++++++++++++++++++++++++++- 6 files changed, 104 insertions(+), 7 deletions(-) diff --git a/__tests__/onboarding.test.ts b/__tests__/onboarding.test.ts index e1c0a57..9595723 100644 --- a/__tests__/onboarding.test.ts +++ b/__tests__/onboarding.test.ts @@ -18,7 +18,7 @@ describe('Onboarding module', () => { localEthereumAddress = web3.eth.accounts.wallet.create(1)[0].address; }); - it('derives a STARK key pair', async () => { + it('derives the default STARK key pair', async () => { const keyPair = await onboardingWithLocalKey.deriveStarkKey(localEthereumAddress); expect(keyPair).toStrictEqual({ publicKey: expect.stringMatching(/^[0-9a-f]{64}$/), @@ -26,6 +26,19 @@ describe('Onboarding module', () => { privateKey: expect.stringMatching(/^[0-9a-f]{64}$/), }); }); + + it('derives the default API key pair', async () => { + const apiKey = await onboardingWithLocalKey.recoverDefaultApiCredentials( + localEthereumAddress, + ); + expect(apiKey).toStrictEqual({ + key: expect.stringMatching( + /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/, + ), + secret: expect.stringMatching(/^[A-Za-z0-9_-]{40}$/), + passphrase: expect.stringMatching(/^[A-Za-z0-9_-]{20}$/), + }); + }); }); describe('with a web3 provider', () => { @@ -36,7 +49,7 @@ describe('Onboarding module', () => { remoteEthereumAddress = (await web3.eth.getAccounts())[0]; }); - it('derives a STARK key pair', async () => { + it('derives the default STARK key pair', async () => { const keyPair = await onboardingWithRemoteKey.deriveStarkKey(remoteEthereumAddress); expect(keyPair).toStrictEqual({ publicKey: '07100a584ea28998604e0dc2e68c427cefb86d147fc1de15100f5fa97ec2b0d2', @@ -44,5 +57,16 @@ describe('Onboarding module', () => { privateKey: '01bb0389af265c56844fa79b1e586b36f535fee293f59768fdb61d3f280f05fb', }); }); + + it('derives the default API key pair', async () => { + const apiKey = await onboardingWithRemoteKey.recoverDefaultApiCredentials( + remoteEthereumAddress, + ); + expect(apiKey).toStrictEqual({ + key: 'd850d87e-605e-1f54-17f5-776b72d28319', + secret: 'FJyj-Kf-nbxrUyTCA0pOWICqXNs0PPLYHW5HMXQj', + passphrase: 'Inr0Hj9NymLEcwiMK1dv', + }); + }); }); }); diff --git a/package-lock.json b/package-lock.json index f7768e1..6d0f5ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.7.2", + "version": "0.7.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 615b466..9172ac8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.7.2", + "version": "0.7.3", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/eth-signing/onboarding-action.ts b/src/eth-signing/onboarding-action.ts index df05f7e..ff9c498 100644 --- a/src/eth-signing/onboarding-action.ts +++ b/src/eth-signing/onboarding-action.ts @@ -4,8 +4,8 @@ * These are used during onboarding. The signature must be deterministic based on the Ethereum key * because the signatures will be used for key derivation, and the keys should be recoverable: * - The onboarding signature is used to derive the default API credentials, on the server. - * - The key derivation signature is used by the UI to derive the STARK key pair. Programmatic - * traders may optionally derive their STARK key pair in the same way. + * - The key derivation signature is used by the frontend app to derive the STARK key pair. + * Programmatic traders may optionally derive their STARK key pair in the same way. */ import Web3 from 'web3'; diff --git a/src/helpers/request-helpers.ts b/src/helpers/request-helpers.ts index 0ce88e3..ec42aab 100644 --- a/src/helpers/request-helpers.ts +++ b/src/helpers/request-helpers.ts @@ -1,3 +1,7 @@ +import Web3 from 'web3'; + +import { stripHexPrefix } from '../eth-signing/helpers'; + export function generateQueryPath(url: string, params: {}): string { const definedEntries = Object.entries(params) .filter(([_key, value]: [string, unknown]) => value !== undefined); @@ -11,3 +15,10 @@ export function generateQueryPath(url: string, params: {}): string { ).join('&'); return `${url}?${paramsString}`; } + +export function keccak256Buffer(input: Buffer): Buffer { + if (input.length === 0) { + throw new Error('keccak256Buffer: Expected a Buffer with non-zero length'); + } + return Buffer.from(stripHexPrefix(Web3.utils.soliditySha3(input as unknown as string)!), 'hex'); +} diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index 4cf8189..89bd7fb 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -6,6 +6,7 @@ import Web3 from 'web3'; import { SignOnboardingAction } from '../eth-signing'; import { stripHexPrefix } from '../eth-signing/helpers'; +import { keccak256Buffer } from '../helpers/request-helpers'; import { RequestMethod, axiosRequest, @@ -93,10 +94,16 @@ export default class Onboarding { ); } - // ============ Other ============ + // ============ Key Derivation ============ /** * @description Derive a STARK key pair deterministically from an Ethereum key. + * + * This is used by the frontend app to derive the STARK key pair in a way that is recoverable. + * Programmatic traders may optionally derive their STARK key pair in the same way. + * + * @param ethereumAddress Ethereum address of the account to use for signing. + * @param signingMethod Method to use for signing. */ async deriveStarkKey( ethereumAddress: string, @@ -109,4 +116,59 @@ export default class Onboarding { ); return keyPairFromData(Buffer.from(stripHexPrefix(signature), 'hex')); } + + /** + * @description Derive an API key pair deterministically from an Ethereum key. + * + * This is used by the frontend app to recover the default API key credentials. + * + * @param ethereumAddress Ethereum address of the account to use for signing. + * @param signingMethod Method to use for signing. + */ + async recoverDefaultApiCredentials( + ethereumAddress: string, + signingMethod: SigningMethod = SigningMethod.Hash, + ): Promise { + const signature = await this.signer.sign( + ethereumAddress, + signingMethod, + { action: OnboardingActionString.ONBOARDING }, + ); + const buffer = Buffer.from(stripHexPrefix(signature), 'hex'); + + // Get secret. + const rBuffer = buffer.slice(0, 32); + const rHashedData = keccak256Buffer(rBuffer); + const secret = rHashedData.slice(0, 30); + + // Get key and passphrase. + const sBuffer = buffer.slice(32, 64); + const sHashedData = keccak256Buffer(sBuffer); + const key = sHashedData.slice(0, 16); + const passphrase = sHashedData.slice(16, 31); + + return { + secret: toBase64Url(secret), + key: uuidFormatKey(key), + passphrase: toBase64Url(passphrase), + }; + } +} + +function uuidFormatKey(keyBuffer: Buffer): string { + const key: string = keyBuffer.toString('hex'); + return [ + key.slice(0, 8), + key.slice(8, 12), + key.slice(12, 16), + key.slice(16, 20), + key.slice(20, 32), + ].join('-'); +} + +function toBase64Url(base64: Buffer): string { + return base64.toString('base64') + .replace(/=/g, '') + .replace(/\+/g, '-') + .replace(/\//g, '_'); } From 06f359223ad05f1baf7f97c63de41d4606f66b40 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Wed, 3 Feb 2021 10:38:37 -0800 Subject: [PATCH 061/180] remove getApiKey arg (#59) --- __tests__/api-keys.test.ts | 6 +----- __tests__/private.test.ts | 7 ++----- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 9 +++------ 5 files changed, 8 insertions(+), 18 deletions(-) diff --git a/__tests__/api-keys.test.ts b/__tests__/api-keys.test.ts index ef374bd..ac3f614 100644 --- a/__tests__/api-keys.test.ts +++ b/__tests__/api-keys.test.ts @@ -19,12 +19,8 @@ describe('API Keys Module & Private Module', () => { asMock(axios).mockResolvedValue({} as AxiosResponse); const web3 = new Web3(); - const account: EthereumAccount = web3.eth.accounts.wallet.create(1)[0]; - const client = new DydxClient('https://example.com', { web3, apiKeyCredentials }); - await client.private.getApiKeys( - account.address, - ); + await client.private.getApiKeys(); expect(axios).toHaveBeenCalledTimes(1); expect(axios).toHaveBeenCalledWith({ diff --git a/__tests__/private.test.ts b/__tests__/private.test.ts index ee8ec0e..ef6ec9e 100644 --- a/__tests__/private.test.ts +++ b/__tests__/private.test.ts @@ -5,7 +5,7 @@ import axios, { AxiosResponse } from 'axios'; import Web3 from 'web3'; -import { ApiKeyCredentials, DydxClient, EthereumAccount } from '../src'; +import { ApiKeyCredentials, DydxClient } from '../src'; import { RequestMethod } from '../src/lib/axios'; import { asMock } from './helpers/util'; @@ -20,12 +20,9 @@ describe('Verify signature is as expected', () => { asMock(axios).mockResolvedValue({} as AxiosResponse); const web3 = new Web3(); - const account: EthereumAccount = web3.eth.accounts.wallet.create(1)[0]; const client = new DydxClient('https://example.com', { web3, apiKeyCredentials }); - await client.private.getApiKeys( - account.address, - ); + await client.private.getApiKeys(); expect(client.private.sign({ requestPath: '/v3/api-keys?ethereumAddress=0xE5714924C8C5c732F92A439075C8211eB0611aaC', method: RequestMethod.GET, diff --git a/package-lock.json b/package-lock.json index 6d0f5ee..e01d670 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.7.3", + "version": "0.7.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9172ac8..fa89656 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.7.3", + "version": "0.7.4", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 765f629..8cd1bc5 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -567,14 +567,11 @@ export default class Private { } /** - * @description get the apiKey ids associated with an ethereumAddress + * @description get the key ids associated with an ethereumAddress * - * @param ethereumAddress the apiKeys are for */ - async getApiKeys( - ethereumAddress: string, - ): Promise<{ apiKeys: string[] }> { - return this.get('api-keys', { ethereumAddress }); + async getApiKeys(): Promise<{ keys: string[] }> { + return this.get('api-keys', {}); } // ============ Signing ============ From 1c8a80be5d88df69057d00bc64857d55d2fe15c5 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Wed, 3 Feb 2021 10:56:11 -0800 Subject: [PATCH 062/180] fix return type of get api-keys (#60) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e01d670..0b57090 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.7.4", + "version": "0.7.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index fa89656..9c2e2af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.7.4", + "version": "0.7.5", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 8cd1bc5..b2c2455 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -570,7 +570,7 @@ export default class Private { * @description get the key ids associated with an ethereumAddress * */ - async getApiKeys(): Promise<{ keys: string[] }> { + async getApiKeys(): Promise<{ apiKeys: { key: string }[] }> { return this.get('api-keys', {}); } From 59f28721d3e7fd5a9a2f93bb83b145056e2d9b5a Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Thu, 4 Feb 2021 11:23:00 -0800 Subject: [PATCH 063/180] v0.8.0: Bump starkex-eth to new Ropsten address (v0.6.0) (#61) * bump starkex-eth to v0.6.0 * 0.8.0 --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0b57090..05d4d90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.7.5", + "version": "0.8.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -487,9 +487,9 @@ } }, "@dydxprotocol/starkex-eth": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.5.4.tgz", - "integrity": "sha512-eFQ/1biaGV1WD5X75BpQiprzS9smorJmKV0iOydqftdymMOsLlgax3BdHbFnIZBhUi3YCHKM0Q568kH0QN6zcw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.6.0.tgz", + "integrity": "sha512-9zq8Xfb6fNn8Kje7yrLdE5Uw1W+ixZy4bIIfRxD6QTHO88XLmveSz3RDQ6zNb65H3RS0ODOJXBJOUnT4OHP02Q==", "requires": { "@types/big.js": "^6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index 9c2e2af..39dabc8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.7.5", + "version": "0.8.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -25,7 +25,7 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-eth": "^0.5.4", + "@dydxprotocol/starkex-eth": "^0.6.0", "@dydxprotocol/starkex-lib": "^0.10.1", "@types/web3": "1.0.18", "axios": "^0.21.1", From cee669837d08abb2ebfa2d68dd198c8032772f3a Mon Sep 17 00:00:00 2001 From: Ashwini Nene Date: Fri, 5 Feb 2021 16:06:14 -0800 Subject: [PATCH 064/180] v0.9.0 update to starkex-lib v0.10.2 (#63) * update to starkex-lib v0.10.2 * bump client version Co-authored-by: aan1092j --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 05d4d90..015a606 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.8.0", + "version": "0.9.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -508,9 +508,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.10.1.tgz", - "integrity": "sha512-3oW5L3EsUNjoTipXYmeSt4pRf7vvmUJAln3TQr3abfvjyQKbJYYM0jH8wA1bIUm+s/PngYMRymWK/cxpmiMrfw==", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.10.2.tgz", + "integrity": "sha512-kUclq6cyy/kdLFWH/aqtFfqelW8v2p8BBVUSDZqu6ZuW4u0mY9mqJO7WQD8xSO42GatcYN8NqYYTVr1R5C5Axg==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index 39dabc8..2016f6e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.8.0", + "version": "0.9.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-eth": "^0.6.0", - "@dydxprotocol/starkex-lib": "^0.10.1", + "@dydxprotocol/starkex-lib": "^0.10.2", "@types/web3": "1.0.18", "axios": "^0.21.1", "bignumber.js": "^8.1.1", From c6981c28d3540d64def9dc45bbf9fa6230340ab8 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Tue, 9 Feb 2021 10:06:25 -0800 Subject: [PATCH 065/180] bump starkwarex-lib (#65) --- package-lock.json | 9 +++++---- package.json | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 015a606..e2114da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.9.0", + "version": "0.9.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -508,14 +508,15 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.10.2.tgz", - "integrity": "sha512-kUclq6cyy/kdLFWH/aqtFfqelW8v2p8BBVUSDZqu6ZuW4u0mY9mqJO7WQD8xSO42GatcYN8NqYYTVr1R5C5Axg==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.10.4.tgz", + "integrity": "sha512-OCsFJy4Qxge1FG+2yVuYIKm9Gj5phqJmpgTqj0PMXLhFzQrTJC9s5lkzstDpv9MciYcySEtcGSmdUOe+yy7izw==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", "big.js": "6.0.3", "bip39": "^3.0.3", + "bn.js": "5.1.3", "ethereum-cryptography": "^0.1.3", "hash.js": "^1.1.7" }, diff --git a/package.json b/package.json index 2016f6e..ed0d89b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.9.0", + "version": "0.9.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-eth": "^0.6.0", - "@dydxprotocol/starkex-lib": "^0.10.2", + "@dydxprotocol/starkex-lib": "^0.10.4", "@types/web3": "1.0.18", "axios": "^0.21.1", "bignumber.js": "^8.1.1", From f2405751a00b6e5ddb785c17f14b870ad92c3ed5 Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Wed, 10 Feb 2021 12:19:24 -0800 Subject: [PATCH 066/180] v.0.10.0: Bump packages (#66) * bump packages * 0.10.0 --- package-lock.json | 41 ++++++++++------------------------------- package.json | 9 ++++----- src/types.ts | 2 -- 3 files changed, 14 insertions(+), 38 deletions(-) diff --git a/package-lock.json b/package-lock.json index e2114da..24ac0ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.9.1", + "version": "0.10.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -487,9 +487,9 @@ } }, "@dydxprotocol/starkex-eth": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.6.0.tgz", - "integrity": "sha512-9zq8Xfb6fNn8Kje7yrLdE5Uw1W+ixZy4bIIfRxD6QTHO88XLmveSz3RDQ6zNb65H3RS0ODOJXBJOUnT4OHP02Q==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.10.0.tgz", + "integrity": "sha512-nbmzVoce4x5SRGrQSnUN9qVheAXXWpqlJezyRjWNpqtR9B0X3BKSNMyziDPy3L2gEwDVUR9sf8Mj0hxgrpt4uA==", "requires": { "@types/big.js": "^6.0.0", "@types/elliptic": "^6.4.12", @@ -498,19 +498,12 @@ "lodash": "^4.17.20", "starkware-crypto": "^1.9.7", "web3": "1.3.0" - }, - "dependencies": { - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" - } } }, "@dydxprotocol/starkex-lib": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.10.4.tgz", - "integrity": "sha512-OCsFJy4Qxge1FG+2yVuYIKm9Gj5phqJmpgTqj0PMXLhFzQrTJC9s5lkzstDpv9MciYcySEtcGSmdUOe+yy7izw==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.12.0.tgz", + "integrity": "sha512-nfICiB2PXpVBySLHi8fYiTxXhgwS8oP40W/J+sA/E7F/hSHkj/F4nihzIIqVKLZDGZedevvBvOG2oKCb5ZpWIg==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", @@ -1281,26 +1274,12 @@ "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, - "@types/underscore": { - "version": "1.10.24", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.10.24.tgz", - "integrity": "sha512-T3NQD8hXNW2sRsSbLNjF/aBo18MyJlbw0lSpQHB/eZZtScPdexN4HSa8cByYwTw9Wy7KuOFr81mlDQcQQaZ79w==" - }, "@types/uuid": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", "dev": true }, - "@types/web3": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/@types/web3/-/web3-1.0.18.tgz", - "integrity": "sha512-uXQL0LDszt2f476LEmYM6AvSv9F4vU4hWQvlUhwfLHNlIB6OyBXoYsCzWAIhhnc5U0HA7ZBcPybxRJ/yfA6THg==", - "requires": { - "@types/bn.js": "*", - "@types/underscore": "*" - } - }, "@types/yargs": { "version": "15.0.12", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", @@ -1916,9 +1895,9 @@ "integrity": "sha512-n6yn1FyVL1EW2DBAr4jlU/kObhRzmr+NNRESl65VIOT8WBJj/Kezpx2zFdhJUqYI6qrtTW7moCStYL5VxeVdPA==" }, "bignumber.js": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-8.1.1.tgz", - "integrity": "sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ==" + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" }, "binary-extensions": { "version": "2.1.0", diff --git a/package.json b/package.json index ed0d89b..4c2e903 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.9.1", + "version": "0.10.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -25,11 +25,10 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-eth": "^0.6.0", - "@dydxprotocol/starkex-lib": "^0.10.4", - "@types/web3": "1.0.18", + "@dydxprotocol/starkex-eth": "0.10.0", + "@dydxprotocol/starkex-lib": "0.12.0", "axios": "^0.21.1", - "bignumber.js": "^8.1.1", + "bignumber.js": "^9.0.1", "es6-promisify": "^6.0.1", "ethers": "^4.0.33", "uuid": "^8.3.1", diff --git a/src/types.ts b/src/types.ts index d64c460..2fa6306 100644 --- a/src/types.ts +++ b/src/types.ts @@ -155,8 +155,6 @@ export interface MarketResponseObject { quoteAsset: Asset; stepSize: string; tickSize: string; - makerFee: string; - takerFee: string; indexPrice: string; oraclePrice: string; nextFundingRate: string; From 5eeae15de031b509fdb56bbe8c67b57583c71aaf Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Mon, 15 Feb 2021 12:09:30 -0800 Subject: [PATCH 067/180] v0.10.1: fix AvailableFunds response (#68) * fix available funds response * 0.10.1 --- package-lock.json | 2 +- package.json | 2 +- src/modules/public.ts | 3 ++- src/types.ts | 11 +++++++++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 24ac0ee..d2a2140 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.10.0", + "version": "0.10.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 4c2e903..aa2343b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.10.0", + "version": "0.10.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/public.ts b/src/modules/public.ts index 3654774..5f69490 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -1,6 +1,7 @@ import { generateQueryPath } from '../helpers/request-helpers'; import { axiosRequest } from '../lib/axios'; import { + AvailableFundsResponseObject, CandleResolution, CandleResponseObject, Data, @@ -134,7 +135,7 @@ export default class Public { /** * @description Get the amount of funds available for fast withdrawals, denominated in USDC. */ - getFastWithdrawalAvailableFunds(): Promise<{ [lpAccountId: string]: string }> { + getFastWithdrawalAvailableFunds(): Promise { return this.get('fast-withdrawals', {}); } diff --git a/src/types.ts b/src/types.ts index 2fa6306..99e6a3e 100644 --- a/src/types.ts +++ b/src/types.ts @@ -305,6 +305,17 @@ export interface CandleResponseObject { usdVolume: string; } +export interface AvailableFundsResponseObject { + liquidityProviders: { + [lpPositionId: number]: LPFunds; + }; +} + +export interface LPFunds { + availableFunds: string; + starkKey: string; +} + export interface Trade { side: OrderSide, size: string, From cd74648eee8b0b9a0247c6b74896dd780e43772e Mon Sep 17 00:00:00 2001 From: Kenadia Date: Mon, 15 Feb 2021 14:38:22 -0800 Subject: [PATCH 068/180] v0.11.0 Update starkex-lib (pass in networkId) (#69) * Update starkex-lib (pass in networkId) * v0.11.0 --- package-lock.json | 8 ++++---- package.json | 4 ++-- src/modules/private.ts | 22 ++++++++++++++-------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index d2a2140..f0bb536 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.10.1", + "version": "0.11.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -501,9 +501,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.12.0.tgz", - "integrity": "sha512-nfICiB2PXpVBySLHi8fYiTxXhgwS8oP40W/J+sA/E7F/hSHkj/F4nihzIIqVKLZDGZedevvBvOG2oKCb5ZpWIg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.13.0.tgz", + "integrity": "sha512-ETpiMLRrfl1yL5VKgOfSwmjF0dHtY2N0RaNKj8lrsw3cNHyaySRVPwOXHcNMweIgbvnwMlGaTis3ziYi8W+miw==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index aa2343b..16d22c3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.10.1", + "version": "0.11.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-eth": "0.10.0", - "@dydxprotocol/starkex-lib": "0.12.0", + "@dydxprotocol/starkex-lib": "0.13.0", "axios": "^0.21.1", "bignumber.js": "^9.0.1", "es6-promisify": "^6.0.1", diff --git a/src/modules/private.ts b/src/modules/private.ts index b2c2455..ce5c3b1 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -58,8 +58,9 @@ const collateralTokenDecimals = 6; export default class Private { readonly host: string; readonly apiKeyCredentials: ApiKeyCredentials; - readonly starkKeyPair?: KeyPair; + readonly networkId: number; readonly starkLib: StarkwareLib; + readonly starkKeyPair?: KeyPair; constructor({ host, @@ -68,16 +69,17 @@ export default class Private { networkId, }: { host: string, - networkId: number, apiKeyCredentials: ApiKeyCredentials, + networkId: number, starkPrivateKey?: string | KeyPair, }) { this.host = host; this.apiKeyCredentials = apiKeyCredentials; + this.networkId = networkId; + this.starkLib = new StarkwareLib({} as Provider, networkId); if (starkPrivateKey) { this.starkKeyPair = asSimpleKeyPair(asEcKeyPair(starkPrivateKey)); } - this.starkLib = new StarkwareLib({} as Provider, networkId); } // ============ Request Helpers ============ @@ -348,7 +350,7 @@ export default class Private { clientId, positionId, }; - const starkOrder = SignableOrder.fromOrder(orderToSign); + const starkOrder = SignableOrder.fromOrder(orderToSign, this.networkId); signature = await starkOrder.sign(this.starkKeyPair); } @@ -469,7 +471,7 @@ export default class Private { clientId, positionId, }; - const starkWithdrawal = SignableWithdrawal.fromWithdrawal(withdrawalToSign); + const starkWithdrawal = SignableWithdrawal.fromWithdrawal(withdrawalToSign, this.networkId); signature = await starkWithdrawal.sign(this.starkKeyPair); } @@ -520,7 +522,7 @@ export default class Private { humanAmount: params.creditAmount, salt: nonceFromClientId(clientId), }); - const conditionalTransfer = new SignableConditionalTransfer({ + const transferToSign = { senderPositionId: positionId, receiverPositionId: params.lpPositionId, receiverPublicKey: lpStarkKey, @@ -529,8 +531,12 @@ export default class Private { humanAmount: params.debitAmount, clientId, expirationIsoTimestamp: params.expiration, - }); - signature = await conditionalTransfer.sign(this.starkKeyPair); + }; + const starkConditionalTransfer = SignableConditionalTransfer.fromTransfer( + transferToSign, + this.networkId, + ); + signature = await starkConditionalTransfer.sign(this.starkKeyPair); } const fastWithdrawal: ApiFastWithdrawal = { ...params, From f212e627d075b0b0834f1347d5b52a6d740786ec Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Mon, 15 Feb 2021 17:01:48 -0800 Subject: [PATCH 069/180] v0.11.1: fix types for (public) get /v3/fast-withdrawals endpoint [BAC-890] (#70) * fix types for fast_withdrawal * 0.11.1 --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 11 +++++++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index f0bb536..f7f3ed8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.11.0", + "version": "0.11.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 16d22c3..618431e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.11.0", + "version": "0.11.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index 99e6a3e..9e28a4a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -307,13 +307,20 @@ export interface CandleResponseObject { export interface AvailableFundsResponseObject { liquidityProviders: { - [lpPositionId: number]: LPFunds; + [lpPositionId: number]: LiquidityProviderInfo; }; } -export interface LPFunds { +export interface LiquidityProviderInfo { availableFunds: string; starkKey: string; + quote: LiquidityProviderQuote | null; +} + +export interface LiquidityProviderQuote { + creditAsset: TransferAsset; + creditAmount: string; + debitAmount: string; } export interface Trade { From 80be9ad0855bf718e7dde214120125b99ca109b9 Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Mon, 15 Feb 2021 17:28:05 -0800 Subject: [PATCH 070/180] v0.11.2: fix GET /v3/fast-withdrawals request params [BAC-890] (#71) * fix GET /v3/fast-withdrawals request params * 0.11.2 --- package-lock.json | 2 +- package.json | 2 +- src/modules/public.ts | 21 ++++++++++++++++++--- src/types.ts | 2 +- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f7f3ed8..daef0b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.11.1", + "version": "0.11.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 618431e..997543f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.11.1", + "version": "0.11.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/public.ts b/src/modules/public.ts index 5f69490..96d77d3 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -1,7 +1,7 @@ import { generateQueryPath } from '../helpers/request-helpers'; import { axiosRequest } from '../lib/axios'; import { - AvailableFundsResponseObject, + FastWithdrawalsResponseObject, CandleResolution, CandleResponseObject, Data, @@ -13,6 +13,7 @@ import { MarketStatisticResponseObject, OrderbookResponseObject, Trade, + TransferAsset, } from '../types'; export default class Public { @@ -134,9 +135,23 @@ export default class Public { /** * @description Get the amount of funds available for fast withdrawals, denominated in USDC. + * To request a quote for a fast withdrawal, provide either a creditAmount or debitAmount (but + * not both), and a creditAsset. + * + * @param creditAsset The asset to receive + * @param creditAmount The amount to receive + * @param debitAmount The amount of the collateral asset to transfer to the LP on layer-2 */ - getFastWithdrawalAvailableFunds(): Promise { - return this.get('fast-withdrawals', {}); + getFastWithdrawals({ + creditAsset, + creditAmount, + debitAmount, + }: { + creditAsset?: TransferAsset, + creditAmount?: string, + debitAmount?: string, + }): Promise { + return this.get('fast-withdrawals', { creditAsset, creditAmount, debitAmount }); } /** diff --git a/src/types.ts b/src/types.ts index 9e28a4a..8e9f636 100644 --- a/src/types.ts +++ b/src/types.ts @@ -305,7 +305,7 @@ export interface CandleResponseObject { usdVolume: string; } -export interface AvailableFundsResponseObject { +export interface FastWithdrawalsResponseObject { liquidityProviders: { [lpPositionId: number]: LiquidityProviderInfo; }; From 286eed99ac23dd0d66a90731bca9cb2f3709867d Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Fri, 19 Feb 2021 18:59:54 -0800 Subject: [PATCH 071/180] v0.12.0: Update starkex-eth to v0.11.0 (#72) * update starkex-eth to v0.11.0 * 0.12.0 --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index daef0b3..d96e72e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.11.2", + "version": "0.12.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -487,9 +487,9 @@ } }, "@dydxprotocol/starkex-eth": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.10.0.tgz", - "integrity": "sha512-nbmzVoce4x5SRGrQSnUN9qVheAXXWpqlJezyRjWNpqtR9B0X3BKSNMyziDPy3L2gEwDVUR9sf8Mj0hxgrpt4uA==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.11.0.tgz", + "integrity": "sha512-o5fwtRwDxQIXocVj/SlAAZa2KaTpIr5wT4NIwbjUOWT2clJhUWrkp2GHytrYVievXD1aujSbIec9js0nRDZljg==", "requires": { "@types/big.js": "^6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index 997543f..cfe6fcb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.11.2", + "version": "0.12.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -25,7 +25,7 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-eth": "0.10.0", + "@dydxprotocol/starkex-eth": "0.11.0", "@dydxprotocol/starkex-lib": "0.13.0", "axios": "^0.21.1", "bignumber.js": "^9.0.1", From d927dafa554791d8dde6a34acd48e045c203510d Mon Sep 17 00:00:00 2001 From: Kenadia Date: Fri, 19 Feb 2021 19:42:25 -0800 Subject: [PATCH 072/180] v0.13.0 Add domain to onboarding signature (#73) * Add domain to onboarding signature * v0.13.0 * domain -> onlySignOn * Fix deriving keys --- .../eth-signing/onboarding-action.test.ts | 20 ++++----- package-lock.json | 2 +- package.json | 2 +- src/eth-signing/onboarding-action.ts | 44 +++++++++++++++++-- src/eth-signing/sign-off-chain-action.ts | 2 +- src/modules/onboarding.ts | 27 +++++++++--- src/types.ts | 1 + 7 files changed, 76 insertions(+), 22 deletions(-) diff --git a/__tests__/eth-signing/onboarding-action.test.ts b/__tests__/eth-signing/onboarding-action.test.ts index 23e959c..0da384d 100644 --- a/__tests__/eth-signing/onboarding-action.test.ts +++ b/__tests__/eth-signing/onboarding-action.test.ts @@ -25,13 +25,13 @@ describe('SignOnboardingAction', () => { const signature = await localSigner.sign( localAccountAddress, SigningMethod.Hash, - { action: OnboardingActionString.ONBOARDING }, + { action: OnboardingActionString.ONBOARDING, onlySignOn: 'https://trade.dydx.exchange' }, ); expect( localSigner.verify( signature, localAccountAddress, - { action: OnboardingActionString.ONBOARDING }, + { action: OnboardingActionString.ONBOARDING, onlySignOn: 'https://trade.dydx.exchange' }, ), ).toBe(true); }); @@ -40,7 +40,7 @@ describe('SignOnboardingAction', () => { const signature = await localSigner.sign( localAccountAddress, SigningMethod.Hash, - { action: OnboardingActionString.ONBOARDING }, + { action: OnboardingActionString.ONBOARDING, onlySignOn: 'https://trade.dydx.exchange' }, ); // Change the last character. @@ -52,7 +52,7 @@ describe('SignOnboardingAction', () => { localSigner.verify( invalidSignature, localAccountAddress, - { action: OnboardingActionString.ONBOARDING }, + { action: OnboardingActionString.ONBOARDING, onlySignOn: 'https://trade.dydx.exchange' }, ), ).toBe(false); }); @@ -61,13 +61,13 @@ describe('SignOnboardingAction', () => { const signature = await localSigner.sign( localAccountAddress, SigningMethod.Hash, - { action: OnboardingActionString.ONBOARDING }, + { action: OnboardingActionString.ONBOARDING, onlySignOn: 'https://trade.dydx.exchange' }, ); expect( localSigner.verify( signature, localAccountAddress, - { action: OnboardingActionString.KEY_DERIVATION }, + { action: OnboardingActionString.KEY_DERIVATION, onlySignOn: 'https://trade.dydx.exchange' }, ), ).toBe(false); }); @@ -85,13 +85,13 @@ describe('SignOnboardingAction', () => { const signature = await localSigner.sign( localAccountAddress, SigningMethod.Hash, - { action: OnboardingActionString.ONBOARDING }, + { action: OnboardingActionString.ONBOARDING, onlySignOn: 'https://trade.dydx.exchange' }, ); expect( localSigner.verify( signature, localAccountAddress, - { action: OnboardingActionString.ONBOARDING }, + { action: OnboardingActionString.ONBOARDING, onlySignOn: 'https://trade.dydx.exchange' }, ), ).toBe(true); }); @@ -100,13 +100,13 @@ describe('SignOnboardingAction', () => { const signature = await remoteSigner.sign( remoteAccountAddress, SigningMethod.TypedData, - { action: OnboardingActionString.ONBOARDING }, + { action: OnboardingActionString.ONBOARDING, onlySignOn: 'https://trade.dydx.exchange' }, ); expect( remoteSigner.verify( signature, remoteAccountAddress, - { action: OnboardingActionString.ONBOARDING }, + { action: OnboardingActionString.ONBOARDING, onlySignOn: 'https://trade.dydx.exchange' }, ), ).toBe(true); }); diff --git a/package-lock.json b/package-lock.json index d96e72e..8840297 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.12.0", + "version": "0.13.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index cfe6fcb..2af87de 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.12.0", + "version": "0.13.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/eth-signing/onboarding-action.ts b/src/eth-signing/onboarding-action.ts index ff9c498..2c16af5 100644 --- a/src/eth-signing/onboarding-action.ts +++ b/src/eth-signing/onboarding-action.ts @@ -14,10 +14,22 @@ import { OnboardingAction } from '../types'; import { hashString } from './helpers'; import { SignOffChainAction } from './sign-off-chain-action'; +// On mainnet, include an extra onlySignOn parameter. const EIP712_ONBOARDING_ACTION_STRUCT = [ { type: 'string', name: 'action' }, + { type: 'string', name: 'onlySignOn' }, ]; const EIP712_ONBOARDING_ACTION_STRUCT_STRING = ( + 'dYdX(' + + 'string action,' + + 'string onlySignOn' + + ')' +); + +const EIP712_ONBOARDING_ACTION_STRUCT_TESTNET = [ + { type: 'string', name: 'action' }, +]; +const EIP712_ONBOARDING_ACTION_STRUCT_STRING_TESTNET = ( 'dYdX(' + 'string action' + ')' @@ -29,16 +41,40 @@ export class SignOnboardingAction extends SignOffChainAction { web3: Web3, networkId: number, ) { - super(web3, networkId, EIP712_ONBOARDING_ACTION_STRUCT); + // On mainnet, include an extra onlySignOn parameter. + const eip712Struct = networkId === 1 + ? EIP712_ONBOARDING_ACTION_STRUCT + : EIP712_ONBOARDING_ACTION_STRUCT_TESTNET; + + super(web3, networkId, eip712Struct); } public getHash( message: OnboardingAction, ): string { - const structHash: string | null = Web3.utils.soliditySha3( - { t: 'bytes32', v: hashString(EIP712_ONBOARDING_ACTION_STRUCT_STRING) }, + // On mainnet, include an extra onlySignOn parameter. + const eip712StructString = this.networkId === 1 + ? EIP712_ONBOARDING_ACTION_STRUCT_STRING + : EIP712_ONBOARDING_ACTION_STRUCT_STRING_TESTNET; + + const data = [ + { t: 'bytes32', v: hashString(eip712StructString) }, { t: 'bytes32', v: hashString(message.action) }, - ); + ]; + + // On mainnet, include an extra onlySignOn parameter. + if (this.networkId === 1) { + if (!message.onlySignOn) { + throw new Error('The onlySignOn is required when onboarding to mainnet'); + } + data.push( + { t: 'bytes32', v: hashString(message.onlySignOn) }, + ); + } else if (message.onlySignOn) { + throw new Error('Unexpected onlySignOn when signing for non-mainnet network'); + } + + const structHash: string | null = Web3.utils.soliditySha3(...data); // Non-null assertion operator is safe, hash is null only on empty input. return this.getEIP712Hash(structHash!); } diff --git a/src/eth-signing/sign-off-chain-action.ts b/src/eth-signing/sign-off-chain-action.ts index 87ddced..4ff73d2 100644 --- a/src/eth-signing/sign-off-chain-action.ts +++ b/src/eth-signing/sign-off-chain-action.ts @@ -23,7 +23,7 @@ type EIP712Struct = { }[]; export abstract class SignOffChainAction extends Signer { - private readonly networkId: number; + protected readonly networkId: number; private readonly actionStruct: EIP712Struct; private readonly domain: string; private readonly version: string; diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index 89bd7fb..8624a35 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -12,16 +12,18 @@ import { axiosRequest, } from '../lib/axios'; import { - SigningMethod, AccountResponseObject, - Data, - UserResponseObject, ApiKeyCredentials, + Data, + OnboardingAction, OnboardingActionString, + SigningMethod, + UserResponseObject, } from '../types'; export default class Onboarding { readonly host: string; + readonly networkId: number; readonly signer: SignOnboardingAction; constructor( @@ -30,6 +32,7 @@ export default class Onboarding { networkId: number, ) { this.host = host; + this.networkId = networkId; this.signer = new SignOnboardingAction(web3, networkId); } @@ -109,10 +112,17 @@ export default class Onboarding { ethereumAddress: string, signingMethod: SigningMethod = SigningMethod.Hash, ): Promise { + const message: OnboardingAction = { action: OnboardingActionString.KEY_DERIVATION }; + + // On mainnet, include an extra onlySignOn parameter. + if (this.networkId === 1) { + message.onlySignOn = 'https://trade.dydx.exchange'; + } + const signature = await this.signer.sign( ethereumAddress, signingMethod, - { action: OnboardingActionString.KEY_DERIVATION }, + message, ); return keyPairFromData(Buffer.from(stripHexPrefix(signature), 'hex')); } @@ -129,10 +139,17 @@ export default class Onboarding { ethereumAddress: string, signingMethod: SigningMethod = SigningMethod.Hash, ): Promise { + const message: OnboardingAction = { action: OnboardingActionString.ONBOARDING }; + + // On mainnet, include an extra onlySignOn parameter. + if (this.networkId === 1) { + message.onlySignOn = 'https://trade.dydx.exchange'; + } + const signature = await this.signer.sign( ethereumAddress, signingMethod, - { action: OnboardingActionString.ONBOARDING }, + message, ); const buffer = Buffer.from(stripHexPrefix(signature), 'hex'); diff --git a/src/types.ts b/src/types.ts index 8e9f636..ce97f94 100644 --- a/src/types.ts +++ b/src/types.ts @@ -339,6 +339,7 @@ export enum OnboardingActionString { export interface OnboardingAction { action: OnboardingActionString; + onlySignOn?: 'https://trade.dydx.exchange'; } export interface ApiKeyAction { From 25bf73b39ff2e35c2476b278ad0b7f48dbd69b86 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Fri, 19 Feb 2021 19:59:24 -0800 Subject: [PATCH 073/180] v0.13.1 Fix onboarding mainnet (#74) * Fix onboarding mainnet * v0.13.1 --- package-lock.json | 2 +- package.json | 2 +- src/modules/onboarding.ts | 9 ++++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8840297..c19c0eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.13.0", + "version": "0.13.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2af87de..f36b41d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.13.0", + "version": "0.13.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index 8624a35..144da75 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -45,6 +45,13 @@ export default class Onboarding { signature: string | null = null, signingMethod: SigningMethod = SigningMethod.Hash, ): Promise { + const message: OnboardingAction = { action: OnboardingActionString.ONBOARDING }; + + // On mainnet, include an extra onlySignOn parameter. + if (this.networkId === 1) { + message.onlySignOn = 'https://trade.dydx.exchange'; + } + const url: string = `/v3/${endpoint}`; return axiosRequest({ url: `${this.host}${url}`, @@ -54,7 +61,7 @@ export default class Onboarding { 'DYDX-SIGNATURE': signature || await this.signer.sign( ethereumAddress, signingMethod, - { action: OnboardingActionString.ONBOARDING }, + message, ), 'DYDX-ETHEREUM-ADDRESS': ethereumAddress, }, From 42039f2769b38c8873f0ae95675864f451270f74 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Sun, 21 Feb 2021 21:30:53 -0800 Subject: [PATCH 074/180] v0.14.0 Use TypedData by default for onboarding signatures (#75) * Test mainnet and ropsten (hash) * Use TypedData by default for onboarding signatures * v0.13.2 * v0.14.0 * Remove comment --- __tests__/onboarding.test.ts | 80 +++++++++++++++++------------------- package-lock.json | 2 +- package.json | 2 +- src/modules/onboarding.ts | 4 +- 4 files changed, 42 insertions(+), 46 deletions(-) diff --git a/__tests__/onboarding.test.ts b/__tests__/onboarding.test.ts index 9595723..93578ad 100644 --- a/__tests__/onboarding.test.ts +++ b/__tests__/onboarding.test.ts @@ -2,71 +2,67 @@ import Web3 from 'web3'; import Onboarding from '../src/modules/onboarding'; -let onboardingWithLocalKey: Onboarding; -let localEthereumAddress: string; +const GANACHE_ADDRESS = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; -let onboardingWithRemoteKey: Onboarding; -let remoteEthereumAddress: string; +const EXPECTED_API_KEY_CREDENTIALS_MAINNET = { + key: '50fdcaa0-62b8-e827-02e8-a9520d46cb9f', + secret: 'rdHdKDAOCa0B_Mq-Q9kh8Fz6rK3ocZNOhKB4QsR9', + passphrase: '12_1LuuJMZUxcj3kGBWc', +}; +const EXPECTED_STARK_KEY_PAIR_MAINNET = { + publicKey: '039d88860b99b1809a63add01f7dfa59676ae006bbcdf38ff30b6a69dcf55ed3', + publicKeyYCoordinate: '02bdd58a2c2acb241070bc5d55659a85bba65211890a8c47019a33902aba8400', + privateKey: '0170d807cafe3d8b5758f3f698331d292bf5aeb71f6fd282f0831dee094ee891', +}; +const EXPECTED_API_KEY_CREDENTIALS_ROPSTEN = { + key: '9c1d91a5-0a30-1ed4-2d3d-b840a479b965', + secret: 'hHYEswFe5MHMm8gFb81Jas9b7iLQUicsVv5YBRMY', + passphrase: '9z5Ew7m2DLQd87Xlk7Hd', +}; +const EXPECTED_STARK_KEY_PAIR_ROPSTEN = { + publicKey: '035e23a936e596969a6b3131cfccbd18b71779f28276d30e8215cd0d3e9252c2', + publicKeyYCoordinate: '0557d1a1be389d9921b9d16415eac12bd276b05e2564c4b30a7730ace13a0e19', + privateKey: '050505654b282eb3debadddeddfa1bc76545a6837dcd59d7d41f6a282a4bbccc', +}; + +let onboardingMainnetRemote: Onboarding; +let onboardingRopstenRemote: Onboarding; describe('Onboarding module', () => { - describe('without a web3 provider', () => { + describe('mainnet, with a web3 provider', () => { - beforeAll(() => { - const web3 = new Web3(); - onboardingWithLocalKey = new Onboarding('http://example.com', web3, 1001); - localEthereumAddress = web3.eth.accounts.wallet.create(1)[0].address; + beforeAll(async () => { + const web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545')); + onboardingMainnetRemote = new Onboarding('http://example.com', web3, 1); }); it('derives the default STARK key pair', async () => { - const keyPair = await onboardingWithLocalKey.deriveStarkKey(localEthereumAddress); - expect(keyPair).toStrictEqual({ - publicKey: expect.stringMatching(/^[0-9a-f]{64}$/), - publicKeyYCoordinate: expect.stringMatching(/^[0-9a-f]{64}$/), - privateKey: expect.stringMatching(/^[0-9a-f]{64}$/), - }); + const keyPair = await onboardingMainnetRemote.deriveStarkKey(GANACHE_ADDRESS); + expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_MAINNET); }); it('derives the default API key pair', async () => { - const apiKey = await onboardingWithLocalKey.recoverDefaultApiCredentials( - localEthereumAddress, - ); - expect(apiKey).toStrictEqual({ - key: expect.stringMatching( - /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/, - ), - secret: expect.stringMatching(/^[A-Za-z0-9_-]{40}$/), - passphrase: expect.stringMatching(/^[A-Za-z0-9_-]{20}$/), - }); + const apiKey = await onboardingMainnetRemote.recoverDefaultApiCredentials(GANACHE_ADDRESS); + expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_MAINNET); }); }); - describe('with a web3 provider', () => { + describe('Ropsten, with a web3 provider', () => { beforeAll(async () => { const web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545')); - onboardingWithRemoteKey = new Onboarding('http://example.com', web3, 1001); - remoteEthereumAddress = (await web3.eth.getAccounts())[0]; + onboardingRopstenRemote = new Onboarding('http://example.com', web3, 3); }); it('derives the default STARK key pair', async () => { - const keyPair = await onboardingWithRemoteKey.deriveStarkKey(remoteEthereumAddress); - expect(keyPair).toStrictEqual({ - publicKey: '07100a584ea28998604e0dc2e68c427cefb86d147fc1de15100f5fa97ec2b0d2', - publicKeyYCoordinate: '0098701245cd63700e42fbcd8fb16df310f3c038d39f21deb60da50f54a824b7', - privateKey: '01bb0389af265c56844fa79b1e586b36f535fee293f59768fdb61d3f280f05fb', - }); + const keyPair = await onboardingRopstenRemote.deriveStarkKey(GANACHE_ADDRESS); + expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_ROPSTEN); }); it('derives the default API key pair', async () => { - const apiKey = await onboardingWithRemoteKey.recoverDefaultApiCredentials( - remoteEthereumAddress, - ); - expect(apiKey).toStrictEqual({ - key: 'd850d87e-605e-1f54-17f5-776b72d28319', - secret: 'FJyj-Kf-nbxrUyTCA0pOWICqXNs0PPLYHW5HMXQj', - passphrase: 'Inr0Hj9NymLEcwiMK1dv', - }); + const apiKey = await onboardingRopstenRemote.recoverDefaultApiCredentials(GANACHE_ADDRESS); + expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_ROPSTEN); }); }); }); diff --git a/package-lock.json b/package-lock.json index c19c0eb..7a401b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.13.1", + "version": "0.14.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f36b41d..6e61a4f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.13.1", + "version": "0.14.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index 144da75..68f6bac 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -117,7 +117,7 @@ export default class Onboarding { */ async deriveStarkKey( ethereumAddress: string, - signingMethod: SigningMethod = SigningMethod.Hash, + signingMethod: SigningMethod = SigningMethod.TypedData, ): Promise { const message: OnboardingAction = { action: OnboardingActionString.KEY_DERIVATION }; @@ -144,7 +144,7 @@ export default class Onboarding { */ async recoverDefaultApiCredentials( ethereumAddress: string, - signingMethod: SigningMethod = SigningMethod.Hash, + signingMethod: SigningMethod = SigningMethod.TypedData, ): Promise { const message: OnboardingAction = { action: OnboardingActionString.ONBOARDING }; From 0388e6181398e1fa6c785036674a8c46407a4c42 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Mon, 22 Feb 2021 13:38:53 -0800 Subject: [PATCH 075/180] v0.14.1 Fix EIP 712 signing w/ local key (#76) --- __tests__/eth-signing/api-key-action.test.ts | 78 +- __tests__/onboarding.test.ts | 42 ++ package-lock.json | 755 +++++++++++++++++-- package.json | 4 +- src/eth-signing/sign-off-chain-action.ts | 26 +- src/modules/onboarding.ts | 15 + tsconfig.json | 3 +- 7 files changed, 814 insertions(+), 109 deletions(-) diff --git a/__tests__/eth-signing/api-key-action.test.ts b/__tests__/eth-signing/api-key-action.test.ts index 0790599..98a2aaf 100644 --- a/__tests__/eth-signing/api-key-action.test.ts +++ b/__tests__/eth-signing/api-key-action.test.ts @@ -4,6 +4,16 @@ import Web3 from 'web3'; import { SignApiKeyAction } from '../../src/eth-signing'; import { SigningMethod } from '../../src/types'; +// DEFAULT GANACHE ACCOUNT FOR TESTING ONLY -- DO NOT USE IN PRODUCTION. +const GANACHE_ADDRESS = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; +const GANACHE_PRIVATE_KEY = '0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d'; + +// Note that this is the signature for SigningMethod.TypedData, but not SigningMethod.Hash. +const EXPECTED_SIGNATURE = ( + '0x3ec5317783b313b0acac1f13a23eaaa2fca1f45c2f395081e9bfc20b4cc1acb17e' + + '3d755764f37bf13fa62565c9cb50475e0a987ab0afa74efde0b3926bb7ab9d1b00' +); + const mockRequestNoBody = { requestPath: 'v3/test', method: ApiMethod.POST, @@ -16,38 +26,40 @@ const mockRequestWithBody = { }; let localSigner: SignApiKeyAction; -let localAccountAddress: string; let remoteSigner: SignApiKeyAction; -let remoteAccountAddress: string; describe('SignApiKeyAction', () => { - describe('without a web3 provider', () => { + describe('with a local Ethereum private key', () => { beforeAll(() => { const web3 = new Web3(); localSigner = new SignApiKeyAction(web3, 1); - localAccountAddress = web3.eth.accounts.wallet.create(1)[0].address; + web3.eth.accounts.wallet.add(GANACHE_PRIVATE_KEY); }); it('signs and verifies using SigningMethod.Hash', async () => { const signature = await localSigner.sign( - localAccountAddress, + GANACHE_ADDRESS, SigningMethod.Hash, mockRequestNoBody, ); - expect( - localSigner.verify( - signature, - localAccountAddress, - mockRequestNoBody, - ), - ).toBe(true); + expect(localSigner.verify(signature, GANACHE_ADDRESS, mockRequestNoBody)).toBe(true); + }); + + it('signs and verifies using SigningMethod.TypedData', async () => { + const signature = await localSigner.sign( + GANACHE_ADDRESS, + SigningMethod.TypedData, + mockRequestNoBody, + ); + expect(localSigner.verify(signature, GANACHE_ADDRESS, mockRequestNoBody)).toBe(true); + expect(signature).toBe(EXPECTED_SIGNATURE); }); it('rejects an invalid signature', async () => { const signature = await localSigner.sign( - localAccountAddress, + GANACHE_ADDRESS, SigningMethod.Hash, mockRequestNoBody, ); @@ -57,13 +69,7 @@ describe('SignApiKeyAction', () => { const newLastChar = lastChar === '0' ? '1' : '0'; const invalidSignature = `${signature.slice(0, signature.length - 1)}${newLastChar}`; - expect( - localSigner.verify( - invalidSignature, - localAccountAddress, - mockRequestNoBody, - ), - ).toBe(false); + expect(localSigner.verify(invalidSignature, GANACHE_ADDRESS, mockRequestNoBody)).toBe(false); }); }); @@ -72,52 +78,34 @@ describe('SignApiKeyAction', () => { beforeAll(async () => { const web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545')); remoteSigner = new SignApiKeyAction(web3, 1); - remoteAccountAddress = (await web3.eth.getAccounts())[0]; }); it('signs and verifies using SigningMethod.Hash', async () => { const signature = await localSigner.sign( - localAccountAddress, + GANACHE_ADDRESS, SigningMethod.Hash, mockRequestNoBody, ); - expect( - localSigner.verify( - signature, - localAccountAddress, - mockRequestNoBody, - ), - ).toBe(true); + expect(localSigner.verify(signature, GANACHE_ADDRESS, mockRequestNoBody)).toBe(true); }); it('signs and verifies using SigningMethod.TypedData', async () => { const signature = await remoteSigner.sign( - remoteAccountAddress, + GANACHE_ADDRESS, SigningMethod.TypedData, mockRequestNoBody, ); - expect( - remoteSigner.verify( - signature, - remoteAccountAddress, - mockRequestNoBody, - ), - ).toBe(true); + expect(remoteSigner.verify(signature, GANACHE_ADDRESS, mockRequestNoBody)).toBe(true); + expect(signature).toBe(EXPECTED_SIGNATURE); }); it('signs and verifies using SigningMethod.TypedData (with body)', async () => { const signature = await remoteSigner.sign( - remoteAccountAddress, + GANACHE_ADDRESS, SigningMethod.TypedData, mockRequestWithBody, ); - expect( - remoteSigner.verify( - signature, - remoteAccountAddress, - mockRequestWithBody, - ), - ).toBe(true); + expect(remoteSigner.verify(signature, GANACHE_ADDRESS, mockRequestWithBody)).toBe(true); }); }); }); diff --git a/__tests__/onboarding.test.ts b/__tests__/onboarding.test.ts index 93578ad..96f8b97 100644 --- a/__tests__/onboarding.test.ts +++ b/__tests__/onboarding.test.ts @@ -2,7 +2,9 @@ import Web3 from 'web3'; import Onboarding from '../src/modules/onboarding'; +// DEFAULT GANACHE ACCOUNT FOR TESTING ONLY -- DO NOT USE IN PRODUCTION. const GANACHE_ADDRESS = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; +const GANACHE_PRIVATE_KEY = '0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d'; const EXPECTED_API_KEY_CREDENTIALS_MAINNET = { key: '50fdcaa0-62b8-e827-02e8-a9520d46cb9f', @@ -27,6 +29,8 @@ const EXPECTED_STARK_KEY_PAIR_ROPSTEN = { let onboardingMainnetRemote: Onboarding; let onboardingRopstenRemote: Onboarding; +let onboardingMainnetLocal: Onboarding; +let onboardingRopstenLocal: Onboarding; describe('Onboarding module', () => { @@ -65,4 +69,42 @@ describe('Onboarding module', () => { expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_ROPSTEN); }); }); + + describe('mainnet, with a local Ethereum private key', () => { + + beforeAll(() => { + const web3 = new Web3(); + onboardingMainnetLocal = new Onboarding('http://example.com', web3, 1); + web3.eth.accounts.wallet.add(GANACHE_PRIVATE_KEY); + }); + + it('derives the default STARK key pair', async () => { + const keyPair = await onboardingMainnetLocal.deriveStarkKey(GANACHE_ADDRESS); + expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_MAINNET); + }); + + it('derives the default API key pair', async () => { + const apiKey = await onboardingMainnetLocal.recoverDefaultApiCredentials(GANACHE_ADDRESS); + expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_MAINNET); + }); + }); + + describe('Ropsten, with a local Ethereum private key', () => { + + beforeAll(() => { + const web3 = new Web3(); + onboardingRopstenLocal = new Onboarding('http://example.com', web3, 3); + web3.eth.accounts.wallet.add(GANACHE_PRIVATE_KEY); + }); + + it('derives the default STARK key pair', async () => { + const keyPair = await onboardingRopstenLocal.deriveStarkKey(GANACHE_ADDRESS); + expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_ROPSTEN); + }); + + it('derives the default API key pair', async () => { + const apiKey = await onboardingRopstenLocal.recoverDefaultApiCredentials(GANACHE_ADDRESS); + expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_ROPSTEN); + }); + }); }); diff --git a/package-lock.json b/package-lock.json index 7a401b7..ef76e9a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.14.0", + "version": "0.14.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -632,6 +632,15 @@ "@ethersproject/bytes": "^5.0.4" } }, + "@ethersproject/basex": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.0.4.tgz", + "integrity": "sha512-ixIr/kKiAoSzOnSc777AGIOAhKai5Ivqr4HO/Gz+YG+xkfv6kqD6AW4ga9vM20Wwb0QBhh3LoRWTu4V1K+x9Ew==", + "requires": { + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/properties": "^5.0.3" + } + }, "@ethersproject/bignumber": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", @@ -665,6 +674,470 @@ "@ethersproject/bignumber": "^5.0.7" } }, + "@ethersproject/contracts": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.0.5.tgz", + "integrity": "sha512-tFI255lFbmbqMkgnuyhDWHl3yWqttPlReplYuVvDCT/SuvBjLR4ad2uipBlh1fh5X1ipK9ettAoV4S0HKim4Kw==", + "requires": { + "@ethersproject/abi": "^5.0.5", + "@ethersproject/abstract-provider": "^5.0.4", + "@ethersproject/abstract-signer": "^5.0.4", + "@ethersproject/address": "^5.0.4", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3" + }, + "dependencies": { + "@ethersproject/abi": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.12.tgz", + "integrity": "sha512-Ujr/3bwyYYjXLDQfebeiiTuvOw9XtUKM8av6YkoBeMXyGQM9GkjrQlwJMNwGTmqjATH/ZNbRgCh98GjOLiIB1Q==", + "requires": { + "@ethersproject/address": "^5.0.9", + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/constants": "^5.0.8", + "@ethersproject/hash": "^5.0.10", + "@ethersproject/keccak256": "^5.0.7", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7", + "@ethersproject/strings": "^5.0.8" + }, + "dependencies": { + "@ethersproject/address": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.10.tgz", + "integrity": "sha512-70vqESmW5Srua1kMDIN6uVfdneZMaMyRYH4qPvkAXGkbicrCOsA9m01vIloA4wYiiF+HLEfL1ENKdn5jb9xiAw==", + "requires": { + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/keccak256": "^5.0.7", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/rlp": "^5.0.7" + } + }, + "@ethersproject/bignumber": { + "version": "5.0.14", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.14.tgz", + "integrity": "sha512-Q4TjMq9Gg3Xzj0aeJWqJgI3tdEiPiET7Y5OtNtjTAODZ2kp4y9jMNg97zVcvPedFvGROdpGDyCI77JDFodUzOw==", + "requires": { + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "bn.js": "^4.4.0" + } + }, + "@ethersproject/bytes": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.10.tgz", + "integrity": "sha512-vpu0v1LZ1j1s9kERQIMnVU69MyHEzUff7nqK9XuCU4vx+AM8n9lU2gj7jtJIvGSt9HzatK/6I6bWusI5nyuaTA==", + "requires": { + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/constants": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.9.tgz", + "integrity": "sha512-2uAKH89UcaJP/Sc+54u92BtJtZ4cPgcS1p0YbB1L3tlkavwNvth+kNCUplIB1Becqs7BOZr0B/3dMNjhJDy4Dg==", + "requires": { + "@ethersproject/bignumber": "^5.0.13" + } + }, + "@ethersproject/logger": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.9.tgz", + "integrity": "sha512-kV3Uamv3XOH99Xf3kpIG3ZkS7mBNYcLDM00JSDtNgNB4BihuyxpQzIZPRIDmRi+95Z/R1Bb0X2kUNHa/kJoVrw==" + }, + "@ethersproject/properties": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.8.tgz", + "integrity": "sha512-zEnLMze2Eu2VDPj/05QwCwMKHh506gpT9PP9KPVd4dDB+5d6AcROUYVLoIIQgBYK7X/Gw0UJmG3oVtnxOQafAw==", + "requires": { + "@ethersproject/logger": "^5.0.8" + } + } + } + }, + "@ethersproject/base64": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.0.8.tgz", + "integrity": "sha512-PNbpHOMgZpZ1skvQl119pV2YkCPXmZTxw+T92qX0z7zaMFPypXWTZBzim+hUceb//zx4DFjeGT4aSjZRTOYThg==", + "requires": { + "@ethersproject/bytes": "^5.0.9" + }, + "dependencies": { + "@ethersproject/bytes": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.10.tgz", + "integrity": "sha512-vpu0v1LZ1j1s9kERQIMnVU69MyHEzUff7nqK9XuCU4vx+AM8n9lU2gj7jtJIvGSt9HzatK/6I6bWusI5nyuaTA==", + "requires": { + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/logger": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.9.tgz", + "integrity": "sha512-kV3Uamv3XOH99Xf3kpIG3ZkS7mBNYcLDM00JSDtNgNB4BihuyxpQzIZPRIDmRi+95Z/R1Bb0X2kUNHa/kJoVrw==" + } + } + }, + "@ethersproject/hash": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.11.tgz", + "integrity": "sha512-H3KJ9fk33XWJ2djAW03IL7fg3DsDMYjO1XijiUb1hJ85vYfhvxu0OmsU7d3tg2Uv1H1kFSo8ghr3WFQ8c+NL3g==", + "requires": { + "@ethersproject/abstract-signer": "^5.0.10", + "@ethersproject/address": "^5.0.9", + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/keccak256": "^5.0.7", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7", + "@ethersproject/strings": "^5.0.8" + }, + "dependencies": { + "@ethersproject/abstract-provider": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.0.9.tgz", + "integrity": "sha512-X9fMkqpeu9ayC3JyBkeeZhn35P4xQkpGX/l+FrxDtEW9tybf/UWXSMi8bGThpPtfJ6q6U2LDetXSpSwK4TfYQQ==", + "requires": { + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/networks": "^5.0.7", + "@ethersproject/properties": "^5.0.7", + "@ethersproject/transactions": "^5.0.9", + "@ethersproject/web": "^5.0.12" + } + }, + "@ethersproject/abstract-signer": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.0.13.tgz", + "integrity": "sha512-VBIZEI5OK0TURoCYyw0t3w+TEO4kdwnI9wvt4kqUwyxSn3YCRpXYVl0Xoe7XBR/e5+nYOi2MyFGJ3tsFwONecQ==", + "requires": { + "@ethersproject/abstract-provider": "^5.0.8", + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7" + } + }, + "@ethersproject/address": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.10.tgz", + "integrity": "sha512-70vqESmW5Srua1kMDIN6uVfdneZMaMyRYH4qPvkAXGkbicrCOsA9m01vIloA4wYiiF+HLEfL1ENKdn5jb9xiAw==", + "requires": { + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/keccak256": "^5.0.7", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/rlp": "^5.0.7" + } + }, + "@ethersproject/bignumber": { + "version": "5.0.14", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.14.tgz", + "integrity": "sha512-Q4TjMq9Gg3Xzj0aeJWqJgI3tdEiPiET7Y5OtNtjTAODZ2kp4y9jMNg97zVcvPedFvGROdpGDyCI77JDFodUzOw==", + "requires": { + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "bn.js": "^4.4.0" + } + }, + "@ethersproject/bytes": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.10.tgz", + "integrity": "sha512-vpu0v1LZ1j1s9kERQIMnVU69MyHEzUff7nqK9XuCU4vx+AM8n9lU2gj7jtJIvGSt9HzatK/6I6bWusI5nyuaTA==", + "requires": { + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/logger": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.9.tgz", + "integrity": "sha512-kV3Uamv3XOH99Xf3kpIG3ZkS7mBNYcLDM00JSDtNgNB4BihuyxpQzIZPRIDmRi+95Z/R1Bb0X2kUNHa/kJoVrw==" + }, + "@ethersproject/properties": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.8.tgz", + "integrity": "sha512-zEnLMze2Eu2VDPj/05QwCwMKHh506gpT9PP9KPVd4dDB+5d6AcROUYVLoIIQgBYK7X/Gw0UJmG3oVtnxOQafAw==", + "requires": { + "@ethersproject/logger": "^5.0.8" + } + } + } + }, + "@ethersproject/keccak256": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.8.tgz", + "integrity": "sha512-zoGbwXcWWs9MX4NOAZ7N0hhgIRl4Q/IO/u9c/RHRY4WqDy3Ywm0OLamEV53QDwhjwn3YiiVwU1Ve5j7yJ0a/KQ==", + "requires": { + "@ethersproject/bytes": "^5.0.9", + "js-sha3": "0.5.7" + }, + "dependencies": { + "@ethersproject/bytes": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.10.tgz", + "integrity": "sha512-vpu0v1LZ1j1s9kERQIMnVU69MyHEzUff7nqK9XuCU4vx+AM8n9lU2gj7jtJIvGSt9HzatK/6I6bWusI5nyuaTA==", + "requires": { + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/logger": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.9.tgz", + "integrity": "sha512-kV3Uamv3XOH99Xf3kpIG3ZkS7mBNYcLDM00JSDtNgNB4BihuyxpQzIZPRIDmRi+95Z/R1Bb0X2kUNHa/kJoVrw==" + } + } + }, + "@ethersproject/networks": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.0.8.tgz", + "integrity": "sha512-PYpptlO2Tu5f/JEBI5hdlMds5k1DY1QwVbh3LKPb3un9dQA2bC51vd2/gRWAgSBpF3kkmZOj4FhD7ATLX4H+DA==", + "requires": { + "@ethersproject/logger": "^5.0.8" + }, + "dependencies": { + "@ethersproject/logger": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.9.tgz", + "integrity": "sha512-kV3Uamv3XOH99Xf3kpIG3ZkS7mBNYcLDM00JSDtNgNB4BihuyxpQzIZPRIDmRi+95Z/R1Bb0X2kUNHa/kJoVrw==" + } + } + }, + "@ethersproject/rlp": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.8.tgz", + "integrity": "sha512-E4wdFs8xRNJfzNHmnkC8w5fPeT4Wd1U2cust3YeT16/46iSkLT8nn8ilidC6KhR7hfuSZE4UqSPzyk76p7cdZg==", + "requires": { + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8" + }, + "dependencies": { + "@ethersproject/bytes": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.10.tgz", + "integrity": "sha512-vpu0v1LZ1j1s9kERQIMnVU69MyHEzUff7nqK9XuCU4vx+AM8n9lU2gj7jtJIvGSt9HzatK/6I6bWusI5nyuaTA==", + "requires": { + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/logger": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.9.tgz", + "integrity": "sha512-kV3Uamv3XOH99Xf3kpIG3ZkS7mBNYcLDM00JSDtNgNB4BihuyxpQzIZPRIDmRi+95Z/R1Bb0X2kUNHa/kJoVrw==" + } + } + }, + "@ethersproject/signing-key": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.10.tgz", + "integrity": "sha512-w5it3GbFOvN6e0mTd5gDNj+bwSe6L9jqqYjU+uaYS8/hAEp4qYLk5p8ZjbJJkNn7u1p0iwocp8X9oH/OdK8apA==", + "requires": { + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7", + "elliptic": "6.5.4" + }, + "dependencies": { + "@ethersproject/bytes": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.10.tgz", + "integrity": "sha512-vpu0v1LZ1j1s9kERQIMnVU69MyHEzUff7nqK9XuCU4vx+AM8n9lU2gj7jtJIvGSt9HzatK/6I6bWusI5nyuaTA==", + "requires": { + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/logger": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.9.tgz", + "integrity": "sha512-kV3Uamv3XOH99Xf3kpIG3ZkS7mBNYcLDM00JSDtNgNB4BihuyxpQzIZPRIDmRi+95Z/R1Bb0X2kUNHa/kJoVrw==" + }, + "@ethersproject/properties": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.8.tgz", + "integrity": "sha512-zEnLMze2Eu2VDPj/05QwCwMKHh506gpT9PP9KPVd4dDB+5d6AcROUYVLoIIQgBYK7X/Gw0UJmG3oVtnxOQafAw==", + "requires": { + "@ethersproject/logger": "^5.0.8" + } + } + } + }, + "@ethersproject/strings": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.9.tgz", + "integrity": "sha512-ogxBpcUpdO524CYs841MoJHgHxEPUy0bJFDS4Ezg8My+WYVMfVAOlZSLss0Rurbeeam8CpUVDzM4zUn09SU66Q==", + "requires": { + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/constants": "^5.0.8", + "@ethersproject/logger": "^5.0.8" + }, + "dependencies": { + "@ethersproject/bignumber": { + "version": "5.0.14", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.14.tgz", + "integrity": "sha512-Q4TjMq9Gg3Xzj0aeJWqJgI3tdEiPiET7Y5OtNtjTAODZ2kp4y9jMNg97zVcvPedFvGROdpGDyCI77JDFodUzOw==", + "requires": { + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "bn.js": "^4.4.0" + } + }, + "@ethersproject/bytes": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.10.tgz", + "integrity": "sha512-vpu0v1LZ1j1s9kERQIMnVU69MyHEzUff7nqK9XuCU4vx+AM8n9lU2gj7jtJIvGSt9HzatK/6I6bWusI5nyuaTA==", + "requires": { + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/constants": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.9.tgz", + "integrity": "sha512-2uAKH89UcaJP/Sc+54u92BtJtZ4cPgcS1p0YbB1L3tlkavwNvth+kNCUplIB1Becqs7BOZr0B/3dMNjhJDy4Dg==", + "requires": { + "@ethersproject/bignumber": "^5.0.13" + } + }, + "@ethersproject/logger": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.9.tgz", + "integrity": "sha512-kV3Uamv3XOH99Xf3kpIG3ZkS7mBNYcLDM00JSDtNgNB4BihuyxpQzIZPRIDmRi+95Z/R1Bb0X2kUNHa/kJoVrw==" + } + } + }, + "@ethersproject/transactions": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.10.tgz", + "integrity": "sha512-Tqpp+vKYQyQdJQQk4M73tDzO7ODf2D42/sJOcKlDAAbdSni13v6a+31hUdo02qYXhVYwIs+ZjHnO4zKv5BNk8w==", + "requires": { + "@ethersproject/address": "^5.0.9", + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/constants": "^5.0.8", + "@ethersproject/keccak256": "^5.0.7", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7", + "@ethersproject/rlp": "^5.0.7", + "@ethersproject/signing-key": "^5.0.8" + }, + "dependencies": { + "@ethersproject/address": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.10.tgz", + "integrity": "sha512-70vqESmW5Srua1kMDIN6uVfdneZMaMyRYH4qPvkAXGkbicrCOsA9m01vIloA4wYiiF+HLEfL1ENKdn5jb9xiAw==", + "requires": { + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/keccak256": "^5.0.7", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/rlp": "^5.0.7" + } + }, + "@ethersproject/bignumber": { + "version": "5.0.14", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.14.tgz", + "integrity": "sha512-Q4TjMq9Gg3Xzj0aeJWqJgI3tdEiPiET7Y5OtNtjTAODZ2kp4y9jMNg97zVcvPedFvGROdpGDyCI77JDFodUzOw==", + "requires": { + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "bn.js": "^4.4.0" + } + }, + "@ethersproject/bytes": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.10.tgz", + "integrity": "sha512-vpu0v1LZ1j1s9kERQIMnVU69MyHEzUff7nqK9XuCU4vx+AM8n9lU2gj7jtJIvGSt9HzatK/6I6bWusI5nyuaTA==", + "requires": { + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/constants": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.9.tgz", + "integrity": "sha512-2uAKH89UcaJP/Sc+54u92BtJtZ4cPgcS1p0YbB1L3tlkavwNvth+kNCUplIB1Becqs7BOZr0B/3dMNjhJDy4Dg==", + "requires": { + "@ethersproject/bignumber": "^5.0.13" + } + }, + "@ethersproject/logger": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.9.tgz", + "integrity": "sha512-kV3Uamv3XOH99Xf3kpIG3ZkS7mBNYcLDM00JSDtNgNB4BihuyxpQzIZPRIDmRi+95Z/R1Bb0X2kUNHa/kJoVrw==" + }, + "@ethersproject/properties": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.8.tgz", + "integrity": "sha512-zEnLMze2Eu2VDPj/05QwCwMKHh506gpT9PP9KPVd4dDB+5d6AcROUYVLoIIQgBYK7X/Gw0UJmG3oVtnxOQafAw==", + "requires": { + "@ethersproject/logger": "^5.0.8" + } + } + } + }, + "@ethersproject/web": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.0.13.tgz", + "integrity": "sha512-G3x/Ns7pQm21ALnWLbdBI5XkW/jrsbXXffI9hKNPHqf59mTxHYtlNiSwxdoTSwCef3Hn7uvGZpaSgTyxs7IufQ==", + "requires": { + "@ethersproject/base64": "^5.0.7", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7", + "@ethersproject/strings": "^5.0.8" + }, + "dependencies": { + "@ethersproject/bytes": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.10.tgz", + "integrity": "sha512-vpu0v1LZ1j1s9kERQIMnVU69MyHEzUff7nqK9XuCU4vx+AM8n9lU2gj7jtJIvGSt9HzatK/6I6bWusI5nyuaTA==", + "requires": { + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/logger": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.9.tgz", + "integrity": "sha512-kV3Uamv3XOH99Xf3kpIG3ZkS7mBNYcLDM00JSDtNgNB4BihuyxpQzIZPRIDmRi+95Z/R1Bb0X2kUNHa/kJoVrw==" + }, + "@ethersproject/properties": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.8.tgz", + "integrity": "sha512-zEnLMze2Eu2VDPj/05QwCwMKHh506gpT9PP9KPVd4dDB+5d6AcROUYVLoIIQgBYK7X/Gw0UJmG3oVtnxOQafAw==", + "requires": { + "@ethersproject/logger": "^5.0.8" + } + } + } + }, + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + } + } + }, "@ethersproject/hash": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.6.tgz", @@ -680,6 +1153,52 @@ "@ethersproject/strings": "^5.0.4" } }, + "@ethersproject/hdnode": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.0.5.tgz", + "integrity": "sha512-Ho4HZaK+KijE5adayvjAGusWMnT0mgwGa5hGMBofBOgX9nqiKf6Wxx68SXBGI1/L3rmKo6mlAjxUd8gefs0teQ==", + "requires": { + "@ethersproject/abstract-signer": "^5.0.4", + "@ethersproject/basex": "^5.0.3", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/pbkdf2": "^5.0.3", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/sha2": "^5.0.3", + "@ethersproject/signing-key": "^5.0.4", + "@ethersproject/strings": "^5.0.4", + "@ethersproject/transactions": "^5.0.5", + "@ethersproject/wordlists": "^5.0.4" + } + }, + "@ethersproject/json-wallets": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.0.7.tgz", + "integrity": "sha512-dgOn9JtGgjT28mDXs4LYY2rT4CzS6bG/rxoYuPq3TLHIf6nmvBcr33Fee6RrM/y8UAx4gyIkf6wb2cXsOctvQQ==", + "requires": { + "@ethersproject/abstract-signer": "^5.0.4", + "@ethersproject/address": "^5.0.4", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/hdnode": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/pbkdf2": "^5.0.3", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/random": "^5.0.3", + "@ethersproject/strings": "^5.0.4", + "@ethersproject/transactions": "^5.0.5", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + }, + "dependencies": { + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" + } + } + }, "@ethersproject/keccak256": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.4.tgz", @@ -709,6 +1228,15 @@ "@ethersproject/logger": "^5.0.5" } }, + "@ethersproject/pbkdf2": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.0.4.tgz", + "integrity": "sha512-9jVBjHXQKfr9+3bkCg01a8Cd1H9e+7Kw3ZMIvAxD0lZtuzrXsJxm1hVwY9KA+PRUvgS/9tTP4viXQYwLAax7zg==", + "requires": { + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/sha2": "^5.0.3" + } + }, "@ethersproject/properties": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", @@ -717,6 +1245,48 @@ "@ethersproject/logger": "^5.0.5" } }, + "@ethersproject/providers": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.0.13.tgz", + "integrity": "sha512-5jsuk1FwXxmoQApGs8LSQyS43KP01pHA+6cQ1OPov5pT5Pcqe6ffh6UD1//BZ9Vjf+5e9AQqIk8w7FkGyROuCA==", + "requires": { + "@ethersproject/abstract-provider": "^5.0.4", + "@ethersproject/abstract-signer": "^5.0.4", + "@ethersproject/address": "^5.0.4", + "@ethersproject/basex": "^5.0.3", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/hash": "^5.0.4", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/networks": "^5.0.3", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/random": "^5.0.3", + "@ethersproject/rlp": "^5.0.3", + "@ethersproject/sha2": "^5.0.3", + "@ethersproject/strings": "^5.0.4", + "@ethersproject/transactions": "^5.0.5", + "@ethersproject/web": "^5.0.6", + "bech32": "1.1.4", + "ws": "7.2.3" + }, + "dependencies": { + "ws": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==" + } + } + }, + "@ethersproject/random": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.0.4.tgz", + "integrity": "sha512-AIZJhqs6Ba4/+U3lOjt3QZbP6b/kuuGLJUYFUonAgWmkTHwqsCwYnFvnHKQSUuHbXHvErp7WFXFlztx+yMn3kQ==", + "requires": { + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/logger": "^5.0.5" + } + }, "@ethersproject/rlp": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.4.tgz", @@ -726,6 +1296,27 @@ "@ethersproject/logger": "^5.0.5" } }, + "@ethersproject/sha2": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.0.4.tgz", + "integrity": "sha512-0yFhf1mspxAfWdXXoPtK94adUeu1R7/FzAa+DfEiZTc76sz/vHXf0LSIazoR3znYKFny6haBxME+usbvvEcF3A==", + "requires": { + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/logger": "^5.0.5", + "hash.js": "1.1.3" + }, + "dependencies": { + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + } + } + }, "@ethersproject/signing-key": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.5.tgz", @@ -737,6 +1328,18 @@ "elliptic": "6.5.3" } }, + "@ethersproject/solidity": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.0.5.tgz", + "integrity": "sha512-DMFQ0ouXmNVoKWbGEUFGi8Urli4SJip9jXafQyFHWPRr5oJUqDVkNfwcyC37k+mhBG93k7qrYXCH2xJnGEOxHg==", + "requires": { + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/sha2": "^5.0.3", + "@ethersproject/strings": "^5.0.4" + } + }, "@ethersproject/strings": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.5.tgz", @@ -763,6 +1366,38 @@ "@ethersproject/signing-key": "^5.0.4" } }, + "@ethersproject/units": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.0.6.tgz", + "integrity": "sha512-tsJuy4mipppdmooukRfhXt8fGx9nxvfvG6Xdy0RDm7LzHsjghjwQ69m2bCpId6SDSR1Uq1cQ9irPiUBSyWolUA==", + "requires": { + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/logger": "^5.0.5" + } + }, + "@ethersproject/wallet": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.0.6.tgz", + "integrity": "sha512-dRqx3+Degc5pvjaeeTHuk2EuTRM3b6ce/TiV0HRZhRXYnKyyjg0iYXEZo/b6p3rnV+Xhwxkc0+I/ISPkNpictA==", + "requires": { + "@ethersproject/abstract-provider": "^5.0.4", + "@ethersproject/abstract-signer": "^5.0.4", + "@ethersproject/address": "^5.0.4", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/hash": "^5.0.4", + "@ethersproject/hdnode": "^5.0.4", + "@ethersproject/json-wallets": "^5.0.6", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/random": "^5.0.3", + "@ethersproject/signing-key": "^5.0.4", + "@ethersproject/transactions": "^5.0.5", + "@ethersproject/wordlists": "^5.0.4" + } + }, "@ethersproject/web": { "version": "5.0.9", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.0.9.tgz", @@ -775,6 +1410,18 @@ "@ethersproject/strings": "^5.0.4" } }, + "@ethersproject/wordlists": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.0.5.tgz", + "integrity": "sha512-XA3ycFltVrCTQt04w5nHu3Xq5Z6HjqWsXaAYQHFdqtugyUsIumaO9S5MOwFFuUYTNkZUoT3jCRa/OBS+K4tLfA==", + "requires": { + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/hash": "^5.0.4", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/strings": "^5.0.4" + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1889,6 +2536,11 @@ "tweetnacl": "^0.14.3" } }, + "bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, "big.js": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.0.3.tgz", @@ -3633,59 +4285,57 @@ } }, "ethers": { - "version": "4.0.48", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", - "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==", - "requires": { - "aes-js": "3.0.0", - "bn.js": "^4.4.0", - "elliptic": "6.5.3", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" + "version": "5.0.18", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.0.18.tgz", + "integrity": "sha512-WCiKGfAt09hBS1HZspu+JTgeunFcUCVRhCXO8X+VadBJGTRlG722XXib79Vz2oyBperz90CcjkBPdNly61Ah4A==", + "requires": { + "@ethersproject/abi": "5.0.7", + "@ethersproject/abstract-provider": "5.0.5", + "@ethersproject/abstract-signer": "5.0.7", + "@ethersproject/address": "5.0.5", + "@ethersproject/base64": "5.0.4", + "@ethersproject/basex": "5.0.4", + "@ethersproject/bignumber": "5.0.8", + "@ethersproject/bytes": "5.0.5", + "@ethersproject/constants": "5.0.5", + "@ethersproject/contracts": "5.0.5", + "@ethersproject/hash": "5.0.6", + "@ethersproject/hdnode": "5.0.5", + "@ethersproject/json-wallets": "5.0.7", + "@ethersproject/keccak256": "5.0.4", + "@ethersproject/logger": "5.0.6", + "@ethersproject/networks": "5.0.4", + "@ethersproject/pbkdf2": "5.0.4", + "@ethersproject/properties": "5.0.4", + "@ethersproject/providers": "5.0.13", + "@ethersproject/random": "5.0.4", + "@ethersproject/rlp": "5.0.4", + "@ethersproject/sha2": "5.0.4", + "@ethersproject/signing-key": "5.0.5", + "@ethersproject/solidity": "5.0.5", + "@ethersproject/strings": "5.0.5", + "@ethersproject/transactions": "5.0.6", + "@ethersproject/units": "5.0.6", + "@ethersproject/wallet": "5.0.6", + "@ethersproject/web": "5.0.9", + "@ethersproject/wordlists": "5.0.5" }, "dependencies": { - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" - }, - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "@ethersproject/abi": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", + "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "@ethersproject/address": "^5.0.4", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/hash": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/strings": "^5.0.4" } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, - "scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - }, - "setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" } } }, @@ -9166,11 +9816,6 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 6e61a4f..d9d2bf2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.14.0", + "version": "0.14.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -30,7 +30,7 @@ "axios": "^0.21.1", "bignumber.js": "^9.0.1", "es6-promisify": "^6.0.1", - "ethers": "^4.0.33", + "ethers": "5.0.18", "uuid": "^8.3.1", "web3": "1.3.0" }, diff --git a/src/eth-signing/sign-off-chain-action.ts b/src/eth-signing/sign-off-chain-action.ts index 4ff73d2..d1e8dec 100644 --- a/src/eth-signing/sign-off-chain-action.ts +++ b/src/eth-signing/sign-off-chain-action.ts @@ -1,4 +1,5 @@ import BigNumber from 'bignumber.js'; +import * as ethers from 'ethers'; import Web3 from 'web3'; import { @@ -54,18 +55,18 @@ export abstract class SignOffChainAction extends Signer { signingMethod: SigningMethod, message: M, ): Promise { + // If the address is in the wallet, sign with it so we don't have to use the web3 provider. + const walletAccount: EthereumAccount | undefined = ( + // Hack: The TypeScript type incorrectly has index signature on number but not string. + this.web3.eth.accounts.wallet[signer as unknown as number] + ); + switch (signingMethod) { case SigningMethod.Hash: case SigningMethod.UnsafeHash: case SigningMethod.Compatibility: { const hash = this.getHash(message); - // If the address is in the wallet, sign with it so we don't have to use the web3 provider. - const walletAccount: EthereumAccount | undefined = ( - // Hack: The TypeScript type incorrectly has index signature on number but not string. - this.web3.eth.accounts.wallet[signer as unknown as number] - ); - const rawSignature = walletAccount ? walletAccount.sign(hash).signature : await this.web3.eth.sign(hash, signer); @@ -86,7 +87,20 @@ export abstract class SignOffChainAction extends Signer { return hashSig; } + // @ts-ignore Fallthrough case in switch. case SigningMethod.TypedData: + // If the private key is available locally, sign locally without using web3. + if (walletAccount?.privateKey) { + const wallet = new ethers.Wallet(walletAccount.privateKey); + const rawSignature = await wallet._signTypedData( + this.getDomainData(), + { [this.domain]: this.actionStruct }, + message, + ); + return createTypedSignature(rawSignature, SignatureTypes.NO_PREPEND); + } + + /* falls through */ case SigningMethod.MetaMask: case SigningMethod.MetaMaskLatest: case SigningMethod.CoinbaseWallet: { diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index 68f6bac..f4fe1da 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -21,6 +21,13 @@ import { UserResponseObject, } from '../types'; +const KEY_DERIVATION_SUPPORTED_SIGNING_METHODS: SigningMethod[] = [ + SigningMethod.TypedData, + SigningMethod.MetaMask, + SigningMethod.MetaMaskLatest, + SigningMethod.CoinbaseWallet, +]; + export default class Onboarding { readonly host: string; readonly networkId: number; @@ -119,6 +126,10 @@ export default class Onboarding { ethereumAddress: string, signingMethod: SigningMethod = SigningMethod.TypedData, ): Promise { + if (!KEY_DERIVATION_SUPPORTED_SIGNING_METHODS.includes(signingMethod)) { + throw new Error('Unsupported signing method for API key derivation'); + } + const message: OnboardingAction = { action: OnboardingActionString.KEY_DERIVATION }; // On mainnet, include an extra onlySignOn parameter. @@ -146,6 +157,10 @@ export default class Onboarding { ethereumAddress: string, signingMethod: SigningMethod = SigningMethod.TypedData, ): Promise { + if (!KEY_DERIVATION_SUPPORTED_SIGNING_METHODS.includes(signingMethod)) { + throw new Error('Unsupported signing method for API key derivation'); + } + const message: OnboardingAction = { action: OnboardingActionString.ONBOARDING }; // On mainnet, include an extra onlySignOn parameter. diff --git a/tsconfig.json b/tsconfig.json index dd5d511..e62fca4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,7 @@ "src" ], "compilerOptions": { - "outDir": "build" + "outDir": "build", + "noFallthroughCasesInSwitch": false } } From d9997bacc7e30130eef8d19f7456ef5efa37f8b2 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Thu, 4 Mar 2021 12:16:28 -0800 Subject: [PATCH 076/180] v0.14.2 Add personal_sign signing method (#77) * Add personal_sign signing method * v0.14.2 * CR: Ensure same order of params in personal msg * Fix lint --- .../eth-signing/onboarding-action.test.ts | 76 ++++++++++++++++++- package-lock.json | 2 +- package.json | 2 +- src/eth-signing/helpers.ts | 37 +++++++-- src/eth-signing/sign-off-chain-action.ts | 53 ++++++++++++- src/modules/onboarding.ts | 3 +- src/types.ts | 2 + 7 files changed, 158 insertions(+), 17 deletions(-) diff --git a/__tests__/eth-signing/onboarding-action.test.ts b/__tests__/eth-signing/onboarding-action.test.ts index 0da384d..ee16457 100644 --- a/__tests__/eth-signing/onboarding-action.test.ts +++ b/__tests__/eth-signing/onboarding-action.test.ts @@ -11,6 +11,26 @@ let localAccountAddress: string; let remoteSigner: SignOnboardingAction; let remoteAccountAddress: string; +// DEFAULT GANACHE ACCOUNT FOR TESTING ONLY -- DO NOT USE IN PRODUCTION. +const GANACHE_ADDRESS = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; +const GANACHE_PRIVATE_KEY = '0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d'; + +// IMPORTANT: This is the message used with the SigningMethod.PERSONAL singing method. +// The message should not be changed at all since it's used to generated default keys. +const EXPECTED_PERSONAL_MESSAGE = `{ + "name": "dYdX", + "version": "1.0", + "chainId": 1, + "action": "dYdX Onboarding", + "onlySignOn": "https://trade.dydx.exchange" +}`; + +// Signature generated using web3.eth.personal(). +const PERSONAL_SIGNATURE = ( + '0x12311bcc0280fe24e529bd16fa770a3eddb90ebca9f7d06e9ba11928f1d14dc8' + + '7c2f6e5409137150feeaf37319ae2160996788528248090b56896d74d3ce5c3b1b03' +); + describe('SignOnboardingAction', () => { describe('without a web3 provider', () => { @@ -36,6 +56,17 @@ describe('SignOnboardingAction', () => { ).toBe(true); }); + it('verifies a message signed using SigningMethod.Personal', async () => { + const ganacheAccount = new Web3().eth.accounts.wallet.add(GANACHE_PRIVATE_KEY); + expect( + localSigner.verify( + PERSONAL_SIGNATURE, + ganacheAccount.address, + { action: OnboardingActionString.ONBOARDING, onlySignOn: 'https://trade.dydx.exchange' }, + ), + ).toBe(true); + }); + it('rejects an invalid signature', async () => { const signature = await localSigner.sign( localAccountAddress, @@ -82,15 +113,15 @@ describe('SignOnboardingAction', () => { }); it('signs and verifies using SigningMethod.Hash', async () => { - const signature = await localSigner.sign( - localAccountAddress, + const signature = await remoteSigner.sign( + remoteAccountAddress, SigningMethod.Hash, { action: OnboardingActionString.ONBOARDING, onlySignOn: 'https://trade.dydx.exchange' }, ); expect( - localSigner.verify( + remoteSigner.verify( signature, - localAccountAddress, + remoteAccountAddress, { action: OnboardingActionString.ONBOARDING, onlySignOn: 'https://trade.dydx.exchange' }, ), ).toBe(true); @@ -110,5 +141,42 @@ describe('SignOnboardingAction', () => { ), ).toBe(true); }); + + it('signs a message using SigningMethod.Personal', async () => { + // Mock the signing function since personal_sign is not supported by Ganache. + const web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545')); + web3.eth.personal.sign = jest.fn().mockResolvedValue(PERSONAL_SIGNATURE.slice(2, 132)); + const spiedSigner = new SignOnboardingAction(web3, 1); + + await spiedSigner.sign( + remoteAccountAddress, + SigningMethod.Personal, + { action: OnboardingActionString.ONBOARDING, onlySignOn: 'https://trade.dydx.exchange' }, + ); + expect(web3.eth.personal.sign).toHaveBeenCalledWith( + EXPECTED_PERSONAL_MESSAGE, + GANACHE_ADDRESS, + '', + ); + }); + + it('verifies a message signed using SigningMethod.Personal', async () => { + expect( + localSigner.verify( + PERSONAL_SIGNATURE, + remoteAccountAddress, + { action: OnboardingActionString.ONBOARDING, onlySignOn: 'https://trade.dydx.exchange' }, + ), + ).toBe(true); + + // Try again, with the message parameters in a different order. + expect( + localSigner.verify( + PERSONAL_SIGNATURE, + remoteAccountAddress, + { onlySignOn: 'https://trade.dydx.exchange', action: OnboardingActionString.ONBOARDING }, + ), + ).toBe(true); + }); }); }); diff --git a/package-lock.json b/package-lock.json index ef76e9a..ca142dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.14.1", + "version": "0.14.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d9d2bf2..9c43433 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.14.1", + "version": "0.14.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/eth-signing/helpers.ts b/src/eth-signing/helpers.ts index 056d648..9971efd 100644 --- a/src/eth-signing/helpers.ts +++ b/src/eth-signing/helpers.ts @@ -3,8 +3,19 @@ import Web3 from 'web3'; import { Address, SignatureTypes } from '../types'; +/** + * Ethereum signed message prefix without message length. + */ +export const PREPEND_PERSONAL: string = '\x19Ethereum Signed Message:\n'; + +/** + * Ethereum signed message prefix, 32-byte message, with message length represented as a string. + */ export const PREPEND_DEC: string = '\x19Ethereum Signed Message:\n32'; +/** + * Ethereum signed message prefix, 32-byte message, with message length as a one-byte integer. + */ export const PREPEND_HEX: string = '\x19Ethereum Signed Message:\n\x20'; export const EIP712_DOMAIN_STRING: string = 'EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'; @@ -31,37 +42,47 @@ export function isValidSigType( case SignatureTypes.NO_PREPEND: case SignatureTypes.DECIMAL: case SignatureTypes.HEXADECIMAL: + case SignatureTypes.PERSONAL: return true; default: return false; } } +/** + * Recover the address used to sign a given hash or message. + * + * The string `hashOrMessage` is a hash, unless the signature has type SignatureTypes.PERSONAL, in + * which case it is the signed message. + */ export function ecRecoverTypedSignature( - hash: string, + hashOrMessage: string, typedSignature: string, ): Address { - if (stripHexPrefix(typedSignature).length !== 66 * 2) { - throw new Error(`Unable to ecrecover signature: ${typedSignature}`); - } - const sigType = parseInt(typedSignature.slice(-2), 16); let prependedHash: string | null; switch (sigType) { case SignatureTypes.NO_PREPEND: - prependedHash = hash; + prependedHash = hashOrMessage; + break; + case SignatureTypes.PERSONAL: { + const fullMessage = `${PREPEND_PERSONAL}${hashOrMessage.length}${hashOrMessage}`; + prependedHash = Web3.utils.soliditySha3( + { t: 'string', v: fullMessage }, + ); break; + } case SignatureTypes.DECIMAL: prependedHash = Web3.utils.soliditySha3( { t: 'string', v: PREPEND_DEC }, - { t: 'bytes32', v: hash }, + { t: 'bytes32', v: hashOrMessage }, ); break; case SignatureTypes.HEXADECIMAL: prependedHash = Web3.utils.soliditySha3( { t: 'string', v: PREPEND_HEX }, - { t: 'bytes32', v: hash }, + { t: 'bytes32', v: hashOrMessage }, ); break; default: diff --git a/src/eth-signing/sign-off-chain-action.ts b/src/eth-signing/sign-off-chain-action.ts index d1e8dec..3bdf539 100644 --- a/src/eth-signing/sign-off-chain-action.ts +++ b/src/eth-signing/sign-off-chain-action.ts @@ -1,5 +1,6 @@ import BigNumber from 'bignumber.js'; import * as ethers from 'ethers'; +import _ from 'lodash'; import Web3 from 'web3'; import { @@ -15,9 +16,14 @@ import { createTypedSignature, ecRecoverTypedSignature, hashString, + stripHexPrefix, } from './helpers'; import { Signer } from './signer'; +// IMPORTANT: The order of these params affects the message signed with SigningMethod.PERSONAL. +// The message should not be changed at all since it's used to generated default keys. +const PERSONAL_SIGN_DOMAIN_PARAMS = ['name', 'version', 'chainId']; + type EIP712Struct = { type: string; name: string; @@ -120,6 +126,16 @@ export abstract class SignOffChainAction extends Signer { ); } + case SigningMethod.Personal: { + if (this.web3.currentProvider === null) { + throw new Error('Cannot sign since Web3 currentProvider is null'); + } + + const messageString = this.getPersonalSignMessage(message); + const rawSignature = await this.web3.eth.personal.sign(messageString, signer, ''); + return createTypedSignature(rawSignature, SignatureTypes.PERSONAL); + } + default: throw new Error(`Invalid signing method ${signingMethod}`); } @@ -130,11 +146,44 @@ export abstract class SignOffChainAction extends Signer { expectedSigner: Address, message: M, ): boolean { - const hash = this.getHash(message); - const signer = ecRecoverTypedSignature(hash, typedSignature); + if (stripHexPrefix(typedSignature).length !== 66 * 2) { + throw new Error(`Unable to verify signature with invalid length: ${typedSignature}`); + } + + const sigType = parseInt(typedSignature.slice(-2), 16); + let hashOrMessage: string; + switch (sigType) { + case SignatureTypes.NO_PREPEND: + case SignatureTypes.DECIMAL: + case SignatureTypes.HEXADECIMAL: + hashOrMessage = this.getHash(message); + break; + case SignatureTypes.PERSONAL: + hashOrMessage = this.getPersonalSignMessage(message); + break; + default: + throw new Error(`Invalid signature type: ${sigType}`); + } + + const signer = ecRecoverTypedSignature(hashOrMessage, typedSignature); return addressesAreEqual(signer, expectedSigner); } + /** + * Get the message string to be signed when using SignatureTypes.PERSONAL. + * + * This signing method may be used in cases where EIP-712 signing is not possible. + */ + public getPersonalSignMessage( + message: M, + ): string { + // Make sure the output is deterministic for a given input. + return JSON.stringify({ + ..._.pick(this.getDomainData(), PERSONAL_SIGN_DOMAIN_PARAMS), + ..._.pick(message, _.keys(message).sort()), + }, null, 2); + } + public getDomainHash(): string { const hash: string | null = Web3.utils.soliditySha3( { t: 'bytes32', v: hashString(EIP712_DOMAIN_STRING_NO_CONTRACT) }, diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index f4fe1da..80f8638 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -26,6 +26,7 @@ const KEY_DERIVATION_SUPPORTED_SIGNING_METHODS: SigningMethod[] = [ SigningMethod.MetaMask, SigningMethod.MetaMaskLatest, SigningMethod.CoinbaseWallet, + SigningMethod.Personal, ]; export default class Onboarding { @@ -95,7 +96,7 @@ export default class Onboarding { starkKeyYCoordinate: string, }, ethereumAddress: string, - signature?: string, + signature: string | null = null, signingMethod?: SigningMethod, ): Promise<{ apiKey: ApiKeyCredentials, diff --git a/src/types.ts b/src/types.ts index ce97f94..ba3b698 100644 --- a/src/types.ts +++ b/src/types.ts @@ -96,12 +96,14 @@ export enum SigningMethod { MetaMask = 'MetaMask', // order hashed according to EIP-712 (MetaMask-only) MetaMaskLatest = 'MetaMaskLatest', // ... according to latest version of EIP-712 (MetaMask-only) CoinbaseWallet = 'CoinbaseWallet', // ... according to latest version of EIP-712 (CoinbaseWallet) + Personal = 'Personal', // message signed with personal_sign } export enum SignatureTypes { NO_PREPEND = 0, DECIMAL = 1, HEXADECIMAL = 2, + PERSONAL = 3, } // ============ API Request Types ============ From b190ee67a1248a2f29bd9b45186e87a37e11dc30 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Thu, 4 Mar 2021 13:39:19 -0800 Subject: [PATCH 077/180] v0.14.3 Fix personal_sign to work with Web3ProviderEngine (#78) * Fix personal_sign to work with Web3ProviderEngine * Fix tests --- .../eth-signing/onboarding-action.test.ts | 24 ++++++++---- src/eth-signing/sign-off-chain-action.ts | 7 +--- src/eth-signing/signer.ts | 39 ++++++++++++++++++- 3 files changed, 55 insertions(+), 15 deletions(-) diff --git a/__tests__/eth-signing/onboarding-action.test.ts b/__tests__/eth-signing/onboarding-action.test.ts index ee16457..78ab3e1 100644 --- a/__tests__/eth-signing/onboarding-action.test.ts +++ b/__tests__/eth-signing/onboarding-action.test.ts @@ -25,7 +25,7 @@ const EXPECTED_PERSONAL_MESSAGE = `{ "onlySignOn": "https://trade.dydx.exchange" }`; -// Signature generated using web3.eth.personal(). +// Typed signature generated using web3.eth.personal(). const PERSONAL_SIGNATURE = ( '0x12311bcc0280fe24e529bd16fa770a3eddb90ebca9f7d06e9ba11928f1d14dc8' + '7c2f6e5409137150feeaf37319ae2160996788528248090b56896d74d3ce5c3b1b03' @@ -144,8 +144,11 @@ describe('SignOnboardingAction', () => { it('signs a message using SigningMethod.Personal', async () => { // Mock the signing function since personal_sign is not supported by Ganache. - const web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545')); - web3.eth.personal.sign = jest.fn().mockResolvedValue(PERSONAL_SIGNATURE.slice(2, 132)); + const provider = new Web3.providers.HttpProvider('http://127.0.0.1:8545'); + const web3 = new Web3(provider); + provider.send = jest.fn().mockImplementation((_, callback) => { + callback(null, { result: PERSONAL_SIGNATURE.slice(0, -2) }); + }); const spiedSigner = new SignOnboardingAction(web3, 1); await spiedSigner.sign( @@ -153,10 +156,17 @@ describe('SignOnboardingAction', () => { SigningMethod.Personal, { action: OnboardingActionString.ONBOARDING, onlySignOn: 'https://trade.dydx.exchange' }, ); - expect(web3.eth.personal.sign).toHaveBeenCalledWith( - EXPECTED_PERSONAL_MESSAGE, - GANACHE_ADDRESS, - '', + expect(provider.send).toHaveBeenCalledWith( + { + id: expect.any(Number), + jsonrpc: '2.0', + method: 'personal_sign', + params: [ + GANACHE_ADDRESS, + EXPECTED_PERSONAL_MESSAGE, + ], + }, + expect.any(Function), // Callback. ); }); diff --git a/src/eth-signing/sign-off-chain-action.ts b/src/eth-signing/sign-off-chain-action.ts index 3bdf539..f1d540b 100644 --- a/src/eth-signing/sign-off-chain-action.ts +++ b/src/eth-signing/sign-off-chain-action.ts @@ -127,13 +127,8 @@ export abstract class SignOffChainAction extends Signer { } case SigningMethod.Personal: { - if (this.web3.currentProvider === null) { - throw new Error('Cannot sign since Web3 currentProvider is null'); - } - const messageString = this.getPersonalSignMessage(message); - const rawSignature = await this.web3.eth.personal.sign(messageString, signer, ''); - return createTypedSignature(rawSignature, SignatureTypes.PERSONAL); + return this.ethSignPersonalInternal(signer, messageString); } default: diff --git a/src/eth-signing/signer.ts b/src/eth-signing/signer.ts index 8c7732d..2f1559d 100644 --- a/src/eth-signing/signer.ts +++ b/src/eth-signing/signer.ts @@ -10,7 +10,7 @@ import { SignatureTypes, SigningMethod, } from '../types'; -import { stripHexPrefix } from './helpers'; +import { createTypedSignature, stripHexPrefix } from './helpers'; export abstract class Signer { protected readonly web3: Web3; @@ -93,7 +93,7 @@ export abstract class Signer { method: rpcMethod, params: [signer, rpcData], jsonrpc: '2.0', - id: new Date().getTime(), + id: Date.now(), }); if (response.error) { @@ -101,4 +101,39 @@ export abstract class Signer { } return `0x${stripHexPrefix(response.result)}0${SignatureTypes.NO_PREPEND}`; } + + /** + * Sign a message with `personal_sign`. + */ + protected async ethSignPersonalInternal( + signer: string, + message: string, + ): Promise { + let provider = this.web3.currentProvider; + if (provider === null) { + throw new Error('Cannot sign since Web3 currentProvider is null'); + } + if (typeof provider === 'string') { + throw new Error('Cannot sign since Web3 currentProvider is a string'); + } + provider = provider as AbstractProvider; + + const sendAsync: (param: JsonRpcPayload) => Promise = ( + promisify(provider.sendAsync || provider.send).bind(provider) + ); + const rpcMethod = 'personal_sign'; + + const response = await sendAsync({ + method: rpcMethod, + params: [signer, message], + jsonrpc: '2.0', + id: Date.now(), + }); + + if (response.error) { + throw new Error((response.error as unknown as { message: string }).message); + } + // Note: Using createTypedSignature() fixes the signature `v` value. + return createTypedSignature(response.result, SignatureTypes.PERSONAL); + } } From b3b7badedc3faf818a73f4549bde783a71151404 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Thu, 4 Mar 2021 14:04:27 -0800 Subject: [PATCH 078/180] v0.14.3 (#79) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ca142dd..228ddc3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.14.2", + "version": "0.14.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9c43433..cff712d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.14.2", + "version": "0.14.3", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { From b394c2008393303091cf60a4e1c6176a328350fb Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Fri, 5 Mar 2021 12:55:59 -0800 Subject: [PATCH 079/180] update return types for canceling orders (#80) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 228ddc3..7ddfa1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.14.3", + "version": "0.14.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index cff712d..fd01dd8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.14.3", + "version": "0.14.4", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index ce5c3b1..1252278 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -371,7 +371,7 @@ export default class Private { * * @param orderId of the order being canceled */ - async cancelOrder(orderId: string): Promise { + async cancelOrder(orderId: string): Promise<{ cancelOrder: OrderResponseObject }> { return this.delete( `orders/${orderId}`, {}, @@ -383,7 +383,7 @@ export default class Private { * * @param market of the orders being canceled */ - async cancelAllOrders(market?: Market): Promise { + async cancelAllOrders(market?: Market): Promise<{ cancelOrders: OrderResponseObject[] }> { const params = market ? { market } : {}; return this.delete( 'orders', From ea102c742e8ea25f8df1ca72614678369eabed06 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Wed, 10 Mar 2021 13:40:54 -0800 Subject: [PATCH 080/180] bump to 1.0.0 (#81) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ddfa1f..5b81456 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.14.4", + "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index fd01dd8..ade958a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "0.14.4", + "version": "1.0.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { From d8d409fb8af997723874ca0ea9de3001dce1fe10 Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Sat, 13 Mar 2021 10:06:37 -0800 Subject: [PATCH 081/180] v1.0.1: Bump starkex-eth to v.0.11.2 (#82) * bump starkex-eth to v0.11.2 * 1.0.1 --- package-lock.json | 32 +++++++++++++++++++++----------- package.json | 4 ++-- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5b81456..b61e573 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.0", + "version": "1.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -487,9 +487,9 @@ } }, "@dydxprotocol/starkex-eth": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.11.0.tgz", - "integrity": "sha512-o5fwtRwDxQIXocVj/SlAAZa2KaTpIr5wT4NIwbjUOWT2clJhUWrkp2GHytrYVievXD1aujSbIec9js0nRDZljg==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.11.2.tgz", + "integrity": "sha512-XNRC3y37TEXwUrAKcO/owI3IJFlFL2IXM/zDB48XazCzBOMBl3PvLq4cRDskZhxxUj/HB5Sk7ef2y8v5SB6hYw==", "requires": { "@types/big.js": "^6.0.0", "@types/elliptic": "^6.4.12", @@ -4250,16 +4250,26 @@ } }, "ethereumjs-util": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.8.tgz", - "integrity": "sha512-JJt7tDpCAmDPw/sGoFYeq0guOVqT3pTE9xlEbBmc/nlCij3JRCoS2c96SQ6kXVHOT3xWUNLDm5QCJLQaUnVAtQ==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.9.tgz", + "integrity": "sha512-cRqvYYKJoitq6vMKMf8pXeVwvTrX+dRD0JwHaYqm8jvogK14tqIoCWH/KUHcRwnVxVXEYF/o6pup5jRG4V0xzg==", "requires": { - "@types/bn.js": "^4.11.3", + "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", "create-hash": "^1.1.2", "ethereum-cryptography": "^0.1.3", "ethjs-util": "0.1.6", "rlp": "^2.2.4" + }, + "dependencies": { + "@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "requires": { + "@types/node": "*" + } + } } }, "ethereumjs-wallet": { @@ -7912,9 +7922,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, diff --git a/package.json b/package.json index ade958a..18d52ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.0", + "version": "1.0.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -25,7 +25,7 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-eth": "0.11.0", + "@dydxprotocol/starkex-eth": "0.11.2", "@dydxprotocol/starkex-lib": "0.13.0", "axios": "^0.21.1", "bignumber.js": "^9.0.1", From 3db7ffc6404609599ca8767930b44977d85ff16e Mon Sep 17 00:00:00 2001 From: everettwho Date: Mon, 22 Mar 2021 13:36:46 -0700 Subject: [PATCH 082/180] Update Coinbase Wallet RPC method (#83) --- package.json | 2 +- src/eth-signing/signer.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 18d52ab..de17676 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.1", + "version": "1.0.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/eth-signing/signer.ts b/src/eth-signing/signer.ts index 2f1559d..aa768c4 100644 --- a/src/eth-signing/signer.ts +++ b/src/eth-signing/signer.ts @@ -82,7 +82,7 @@ export abstract class Signer { break; case SigningMethod.CoinbaseWallet: sendAsync = promisify(provider.sendAsync).bind(provider); - rpcMethod = 'eth_signTypedData'; + rpcMethod = 'eth_signTypedData_v4'; rpcData = data; break; default: From 624e1f7bc35e1b0ee1dfe8d5935f00b50cb4dcd0 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Mon, 29 Mar 2021 17:03:24 -0700 Subject: [PATCH 083/180] add historical-pnl to public client (#84) --- package-lock.json | 2 +- package.json | 2 +- src/modules/public.ts | 25 +++++++++++++++++++++++-- src/types.ts | 8 ++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index b61e573..728cff0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.1", + "version": "1.0.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index de17676..8b4ce33 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.2", + "version": "1.0.3", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/public.ts b/src/modules/public.ts index 96d77d3..54ae26b 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -14,6 +14,7 @@ import { OrderbookResponseObject, Trade, TransferAsset, + HistoricalPnlResponseObject, } from '../types'; export default class Public { @@ -128,11 +129,31 @@ export default class Public { }: { market: Market, effectiveBeforeOrAt?: ISO8601, - }): Promise<{ historicalFunding: HistoricalFundingResponseObject }> { + }): Promise<{ historicalFunding: HistoricalFundingResponseObject[] }> { const uri: string = `historical-funding/${market}`; return this.get(uri, { effectiveBeforeOrAt }); } + /** + * @description get historical pnl ticks for an account between certain times + * + * @param account being checked + * @param createdBeforeOrAt latest historical pnl tick being returned + * @param createdOnOrAfter earliest historical pnl tick being returned + */ + getHistoricalPnl({ + accountId, + createdBeforeOrAt, + createdOnOrAfter, + }: { + accountId: string, + createdBeforeOrAt?: ISO8601, + createdOnOrAfter?: ISO8601, + }): Promise<{ historicalPnl: HistoricalPnlResponseObject[] }> { + const uri: string = 'historical-pnl'; + return this.get(uri, { accountId, createdBeforeOrAt, createdOnOrAfter }); + } + /** * @description Get the amount of funds available for fast withdrawals, denominated in USDC. * To request a quote for a fast withdrawal, provide either a creditAmount or debitAmount (but @@ -175,7 +196,7 @@ export default class Public { fromISO?: ISO8601, toISO?: ISO8601, limit?: number, - }): Promise<{ candles: CandleResponseObject }> { + }): Promise<{ candles: CandleResponseObject[] }> { const uri: string = `candles/${market}`; return this.get( uri, diff --git a/src/types.ts b/src/types.ts index ba3b698..bf72443 100644 --- a/src/types.ts +++ b/src/types.ts @@ -284,6 +284,14 @@ export interface HistoricalFundingResponseObject { effectiveAt: ISO8601; } +export interface HistoricalPnlResponseObject { + equity: string; + totalPnl: string; + createdAt: ISO8601; + netTransfers: string; + accountId: string; +} + export interface OrderbookResponseOrder { price: string; size: string; From 693958c8ca417b334f50306b083f7c58c64ec9f6 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Tue, 30 Mar 2021 17:16:52 -0700 Subject: [PATCH 084/180] bump starkex-lib (#85) --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 728cff0..eafd54e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.3", + "version": "1.0.4", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -501,9 +501,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-0.13.0.tgz", - "integrity": "sha512-ETpiMLRrfl1yL5VKgOfSwmjF0dHtY2N0RaNKj8lrsw3cNHyaySRVPwOXHcNMweIgbvnwMlGaTis3ziYi8W+miw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.0.0.tgz", + "integrity": "sha512-W90Nkl76K0zwddzwA83U37SpP09DDABphLZmnONPhjYQ/7jonyyL6WCJr0NbzIwxWfZ/ydVbwIhibVnM+zoCtw==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index 8b4ce33..4f57220 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.3", + "version": "1.0.4", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-eth": "0.11.2", - "@dydxprotocol/starkex-lib": "0.13.0", + "@dydxprotocol/starkex-lib": "1.0.0", "axios": "^0.21.1", "bignumber.js": "^9.0.1", "es6-promisify": "^6.0.1", From c754fc9556419a52ee4d234e316d4829f29b93f8 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Wed, 31 Mar 2021 10:51:39 -0700 Subject: [PATCH 085/180] make pnl get private (#86) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 23 +++++++++++++++++++++++ src/modules/public.ts | 21 --------------------- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index eafd54e..9a37c5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.4", + "version": "1.0.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 4f57220..1cf0f0a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.4", + "version": "1.0.5", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 1252278..962a081 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -31,6 +31,7 @@ import { Data, FillResponseObject, FundingResponseObject, + HistoricalPnlResponseObject, ISO8601, Market, OrderResponseObject, @@ -572,6 +573,28 @@ export default class Private { ); } + /** + * @description get historical pnl ticks for an account between certain times + * + * @param { + * @account being checked + * @createdBeforeOrAt latest historical pnl tick being returned + * @createdOnOrAfter earliest historical pnl tick being returned + * } + */ + getHistoricalPnl( + params: { + accountId: string, + createdBeforeOrAt?: ISO8601, + createdOnOrAfter?: ISO8601, + }, + ): Promise<{ historicalPnl: HistoricalPnlResponseObject[] }> { + return this.get( + 'historical-pnl', + params, + ); + } + /** * @description get the key ids associated with an ethereumAddress * diff --git a/src/modules/public.ts b/src/modules/public.ts index 54ae26b..91acea0 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -14,7 +14,6 @@ import { OrderbookResponseObject, Trade, TransferAsset, - HistoricalPnlResponseObject, } from '../types'; export default class Public { @@ -134,26 +133,6 @@ export default class Public { return this.get(uri, { effectiveBeforeOrAt }); } - /** - * @description get historical pnl ticks for an account between certain times - * - * @param account being checked - * @param createdBeforeOrAt latest historical pnl tick being returned - * @param createdOnOrAfter earliest historical pnl tick being returned - */ - getHistoricalPnl({ - accountId, - createdBeforeOrAt, - createdOnOrAfter, - }: { - accountId: string, - createdBeforeOrAt?: ISO8601, - createdOnOrAfter?: ISO8601, - }): Promise<{ historicalPnl: HistoricalPnlResponseObject[] }> { - const uri: string = 'historical-pnl'; - return this.get(uri, { accountId, createdBeforeOrAt, createdOnOrAfter }); - } - /** * @description Get the amount of funds available for fast withdrawals, denominated in USDC. * To request a quote for a fast withdrawal, provide either a creditAmount or debitAmount (but From 2b58e21de0b215cb2c93da1dac31772e7b1eff51 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Wed, 31 Mar 2021 14:31:27 -0700 Subject: [PATCH 086/180] make recovery and onboard have the same default signingMethod (#87) --- package-lock.json | 2 +- package.json | 2 +- src/modules/onboarding.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9a37c5f..3825159 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.5", + "version": "1.0.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1cf0f0a..d38607b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.5", + "version": "1.0.6", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index 80f8638..db19b50 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -51,7 +51,7 @@ export default class Onboarding { data: {}, ethereumAddress: string, signature: string | null = null, - signingMethod: SigningMethod = SigningMethod.Hash, + signingMethod: SigningMethod = SigningMethod.TypedData, ): Promise { const message: OnboardingAction = { action: OnboardingActionString.ONBOARDING }; From 4ea2ed161d4b64e0a56e493142818e97c04bf124 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Thu, 1 Apr 2021 13:49:39 -0700 Subject: [PATCH 087/180] allow generic params (#88) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 82 +++++++++++++++++++++++++++++++----------- src/types.ts | 3 ++ 4 files changed, 67 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3825159..3f290f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.6", + "version": "1.0.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d38607b..0df72e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.6", + "version": "1.0.7", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 962a081..472d234 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -31,6 +31,7 @@ import { Data, FillResponseObject, FundingResponseObject, + GenericParams, HistoricalPnlResponseObject, ISO8601, Market, @@ -144,20 +145,24 @@ export default class Private { /** * @description get a signature for the ethereumAddress if registered */ - async getRegistration(): Promise<{ signature: string }> { + async getRegistration(genericParams: GenericParams = {}): Promise<{ signature: string }> { return this.get( 'registration', - {}, + { + ...genericParams, + }, ); } /** * @description get the user associated with the ethereumAddress */ - async getUser(): Promise<{ user: UserResponseObject }> { + async getUser(genericParams: GenericParams = {}): Promise<{ user: UserResponseObject }> { return this.get( 'users', - {}, + { + ...genericParams, + }, ); } @@ -215,20 +220,25 @@ export default class Private { * * @param ethereumAddress the account is associated with */ - async getAccount(ethereumAddress: string): Promise<{ account: AccountResponseObject }> { + async getAccount( + ethereumAddress: string, + genericParams: GenericParams = {}, + ): Promise<{ account: AccountResponseObject }> { return this.get( `accounts/${getAccountId({ address: ethereumAddress })}`, - {}, + { ...genericParams }, ); } /** * @description get all accounts associated with an ethereumAddress */ - async getAccounts(): Promise<{ accounts: AccountResponseObject[] }> { + async getAccounts( + genericParams: GenericParams = {}, + ): Promise<{ accounts: AccountResponseObject[] }> { return this.get( 'accounts', - {}, + { ...genericParams }, ); } @@ -249,10 +259,14 @@ export default class Private { limit?: number, createdBeforeOrAt?: ISO8601, }, + genericParams: GenericParams = {}, ): Promise<{ positions: PositionResponseObject[] }> { return this.get( 'positions', - params, + { + ...params, + ...genericParams, + }, ); } @@ -276,10 +290,14 @@ export default class Private { limit?: number, createdBeforeOrAt?: ISO8601, } = {}, + genericParams: GenericParams = {}, ): Promise<{ orders: OrderResponseObject[] }> { return this.get( 'orders', - params, + { + ...params, + ...genericParams, + }, ); } @@ -288,10 +306,13 @@ export default class Private { * * @param orderId of the order */ - async getOrderById(orderId: string): Promise<{ order: OrderResponseObject }> { + async getOrderById( + orderId: string, + genericParams: GenericParams = {}, + ): Promise<{ order: OrderResponseObject }> { return this.get( `orders/${orderId}`, - {}, + { ...genericParams }, ); } @@ -300,10 +321,13 @@ export default class Private { * * @param clientId of the order */ - async getOrderByClientId(clientId: string): Promise<{ order: OrderResponseObject }> { + async getOrderByClientId( + clientId: string, + genericParams: GenericParams = {}, + ): Promise<{ order: OrderResponseObject }> { return this.get( `orders/client/${clientId}`, - {}, + { ...genericParams }, ); } @@ -409,10 +433,14 @@ export default class Private { limit?: number, createdBeforeOrAt?: ISO8601, }, + genericParams: GenericParams = {}, ): Promise<{ fills: FillResponseObject[] }> { return this.get( 'fills', - params, + { + ...params, + ...genericParams, + }, ); } @@ -431,10 +459,14 @@ export default class Private { limit?: number, createdBeforeOrAt?: ISO8601, } = {}, + genericParams: GenericParams = {}, ): Promise<{ transfers: TransferResponseObject[] }> { return this.get( 'transfers', - params, + { + ...params, + ...genericParams, + }, ); } @@ -566,10 +598,14 @@ export default class Private { limit?: number, effectiveBeforeOrAt?: ISO8601, }, + genericParams: GenericParams = {}, ): Promise<{ fundingPayments: FundingResponseObject }> { return this.get( 'funding', - params, + { + ...params, + ...genericParams, + }, ); } @@ -588,10 +624,14 @@ export default class Private { createdBeforeOrAt?: ISO8601, createdOnOrAfter?: ISO8601, }, + genericParams: GenericParams = {}, ): Promise<{ historicalPnl: HistoricalPnlResponseObject[] }> { return this.get( 'historical-pnl', - params, + { + ...params, + ...genericParams, + }, ); } @@ -599,8 +639,10 @@ export default class Private { * @description get the key ids associated with an ethereumAddress * */ - async getApiKeys(): Promise<{ apiKeys: { key: string }[] }> { - return this.get('api-keys', {}); + async getApiKeys( + genericParams: GenericParams = {}, + ): Promise<{ apiKeys: { key: string }[] }> { + return this.get('api-keys', { ...genericParams }); } // ============ Signing ============ diff --git a/src/types.ts b/src/types.ts index bf72443..c281285 100644 --- a/src/types.ts +++ b/src/types.ts @@ -18,6 +18,9 @@ export type Provider = HttpProvider | IpcProvider | WebsocketProvider; export type PositionsMap = { [market: string]: PositionResponseObject }; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type GenericParams = { [name: string]: any }; + // TODO: Find a better way. // eslint-disable-next-line @typescript-eslint/no-explicit-any export type Data = any; From 1d026b98751821982d8acb922d18f1d0e00bfa1f Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Thu, 1 Apr 2021 14:48:35 -0700 Subject: [PATCH 088/180] v1.0.8: remove toAddress from post withdrawal (#89) * remove toAddress * bump --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 1 - src/types.ts | 1 - 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f290f9..5ff946a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.7", + "version": "1.0.8", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0df72e0..64e5093 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.7", + "version": "1.0.8", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 472d234..577cd10 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -476,7 +476,6 @@ export default class Private { * @param { * @amount specifies the size of the withdrawal * @asset specifies the asset being withdrawn - * @toAddress is the address being withdrawn to * @clientId specifies the clientId for the address * } * @param positionId specifies the associated position for the transfer diff --git a/src/types.ts b/src/types.ts index c281285..6e7ad0d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -134,7 +134,6 @@ export interface ApiOrder extends ApiStarkwareSigned { export interface ApiWithdrawal extends ApiStarkwareSigned { amount: string; asset: Asset; - toAddress: string; clientId: string; } From 05a8d580bfed4e8a165fe60fac2a946943f42e53 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Fri, 2 Apr 2021 14:18:16 -0700 Subject: [PATCH 089/180] v1.0.9: pass referredByAffiliateLink as optional param in createUser (#90) * pass referredByAffiliateLink as optional param in createUser * nit --- package-lock.json | 2 +- package.json | 2 +- src/modules/onboarding.ts | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5ff946a..b522278 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.8", + "version": "1.0.9", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 64e5093..21e1ce7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.8", + "version": "1.0.9", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index db19b50..a488475 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -89,11 +89,13 @@ export default class Onboarding { * @param ethereumAddress of the account * @param signature validating the request * @param signingMethod for the request + * @param referredByAffiliateLink of affiliate who referred the user */ async createUser( params: { starkKey: string, starkKeyYCoordinate: string, + referredByAffiliateLink?: string, }, ethereumAddress: string, signature: string | null = null, From bf7a778def8a7b47dcdd37d27fbf5a6bc387166c Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Tue, 6 Apr 2021 11:01:25 -0700 Subject: [PATCH 090/180] v1.10.0 Add Clock module (#91) * add clock * 1.0.10 * comments * add tests * add getTimeAdjustment function * use larger numbers for tests * fix lint * use average time * getTimestampAdjustment for consistency --- __tests__/clock.test.ts | 28 ++++++++++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- src/dydx-client.ts | 23 +++++++++++++++++++++-- src/modules/api-keys.ts | 20 +++++++++++++++----- src/modules/clock.ts | 39 +++++++++++++++++++++++++++++++++++++++ src/modules/private.ts | 7 ++++++- src/modules/public.ts | 13 +++++++++++++ 8 files changed, 124 insertions(+), 10 deletions(-) create mode 100644 __tests__/clock.test.ts create mode 100644 src/modules/clock.ts diff --git a/__tests__/clock.test.ts b/__tests__/clock.test.ts new file mode 100644 index 0000000..3a4b3ae --- /dev/null +++ b/__tests__/clock.test.ts @@ -0,0 +1,28 @@ +import { DydxClient } from '../src'; + +describe('Clock', () => { + it('constructor', async () => { + const client = new DydxClient('https://example.com', {}); + expect(client.clock.timestampAdjustment).toEqual(0); + }); + + it('setTimestampAdjustment', async () => { + const newAdjustment: number = 124234.123; + const client = new DydxClient('https://example.com', {}); + client.clock.setTimestampAdjustment(newAdjustment); + expect(client.clock.timestampAdjustment).toEqual(newAdjustment); + }); + + it('getAdjustedIsoString', async () => { + const newAdjustment: number = -312340.5; + const client = new DydxClient('https://example.com', {}); + const iso1 = client.clock.getAdjustedIsoString(); + client.clock.setTimestampAdjustment(newAdjustment); + const iso2 = client.clock.getAdjustedIsoString(); + + const oneSecondMs: number = 1000; // iso1/iso2 should be generated within 1 second of each other + const msAdjustment: number = newAdjustment * 1000; + expect(Date.parse(iso2) >= Date.parse(iso1) + msAdjustment); + expect(Date.parse(iso2) <= Date.parse(iso1) + msAdjustment + oneSecondMs); + }); +}); diff --git a/package-lock.json b/package-lock.json index b522278..65198ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.9", + "version": "1.0.10", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 21e1ce7..a41250b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.9", + "version": "1.0.10", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/dydx-client.ts b/src/dydx-client.ts index 55bf283..aa1d0ae 100644 --- a/src/dydx-client.ts +++ b/src/dydx-client.ts @@ -3,6 +3,7 @@ import { KeyPair } from '@dydxprotocol/starkex-lib'; import Web3 from 'web3'; import ApiKeys from './modules/api-keys'; +import Clock from './modules/clock'; import Onboarding from './modules/onboarding'; import Private from './modules/private'; import Public from './modules/public'; @@ -20,6 +21,7 @@ export interface ClientOptions { web3?: Web3; web3Provider?: string | Provider; apiKeyCredentials?: ApiKeyCredentials; + timestampAdjustment?: number; } export class DydxClient { @@ -31,8 +33,11 @@ export class DydxClient { readonly web3?: Web3; apiKeyCredentials?: ApiKeyCredentials; - // Modules. Except for `public`, these are created on-demand. + // Modules. private readonly _public: Public; + private readonly _clock: Clock; + + // Modules. These are created on-demand. private _private?: Private; private _apiKeys?: ApiKeys; private _onboarding?: Onboarding; @@ -56,6 +61,7 @@ export class DydxClient { // Modules. this._public = new Public(host); + this._clock = new Clock(options.timestampAdjustment); } /** @@ -65,6 +71,13 @@ export class DydxClient { return this._public; } + /** + * Get the clock module, used for adjusting system time to server time. + */ + get clock(): Clock { + return this._clock; + } + /** * Get the private module, used for interacting with endpoints that require API-key auth. */ @@ -76,6 +89,7 @@ export class DydxClient { apiKeyCredentials: this.apiKeyCredentials, starkPrivateKey: this.starkPrivateKey, networkId: this.networkId, + clock: this._clock, }); } else { return notSupported( @@ -92,7 +106,12 @@ export class DydxClient { get apiKeys(): ApiKeys { if (!this._apiKeys) { if (this.web3) { - this._apiKeys = new ApiKeys(this.host, this.web3, this.networkId); + this._apiKeys = new ApiKeys({ + host: this.host, + web3: this.web3, + networkId: this.networkId, + clock: this._clock, + }); } else { return notSupported( 'API key endpoints are not supported since neither web3 nor web3Provider was provided', diff --git a/src/modules/api-keys.ts b/src/modules/api-keys.ts index bb784fc..2b3a844 100644 --- a/src/modules/api-keys.ts +++ b/src/modules/api-keys.ts @@ -8,22 +8,32 @@ import { axiosRequest, } from '../lib/axios'; import { - SigningMethod, - Data, ApiKeyCredentials, + Data, + ISO8601, + SigningMethod, } from '../types'; +import Clock from './clock'; export default class ApiKeys { readonly host: string; readonly signer: SignApiKeyAction; + readonly clock: Clock; - constructor( + constructor({ + host, + web3, + networkId, + clock, + }: { host: string, web3: Web3, networkId: number, - ) { + clock: Clock, + }) { this.host = host; this.signer = new SignApiKeyAction(web3, networkId); + this.clock = clock; } // ============ Request Helpers ============ @@ -36,7 +46,7 @@ export default class ApiKeys { data: {} = {}, ): Promise { const requestPath: string = `/v3/${endpoint}`; - const timestamp: string = new Date().toISOString(); + const timestamp: ISO8601 = this.clock.getAdjustedIsoString(); const body: string = JSON.stringify(data); const signature: string = await this.signer.sign( ethereumAddress, diff --git a/src/modules/clock.ts b/src/modules/clock.ts new file mode 100644 index 0000000..0fb09d2 --- /dev/null +++ b/src/modules/clock.ts @@ -0,0 +1,39 @@ +import { + ISO8601, +} from '../types'; + +export default class Clock { + private _timestampAdjustment: number; + + constructor(timestampAdjustment?: number) { + this._timestampAdjustment = timestampAdjustment || 0; + } + + /** + * @description Set the timestampAdjustment which is the number of seconds the system time should + * be adjusted for every API call. + * + * @param timestampAdjustment seconds to adjust the system time. + */ + public setTimestampAdjustment( + timestampAdjustment: number, + ): void { + this._timestampAdjustment = timestampAdjustment; + } + + /** + * @description Get the current value of timestampAdjustment. + */ + get timestampAdjustment(): number { + return this._timestampAdjustment; + } + + /** + * @description Get the ISO8601 string for the current time adjusted by the timestampAdjustment. + */ + public getAdjustedIsoString(): ISO8601 { + const timestamp: Date = new Date(); + timestamp.setSeconds(timestamp.getSeconds() + this._timestampAdjustment); + return timestamp.toISOString(); + } +} diff --git a/src/modules/private.ts b/src/modules/private.ts index 577cd10..97cd570 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -46,6 +46,7 @@ import { TransferResponseObject, UserResponseObject, } from '../types'; +import Clock from './clock'; // TODO: Figure out if we can get rid of this. const METHOD_ENUM_MAP: Record = { @@ -63,17 +64,20 @@ export default class Private { readonly networkId: number; readonly starkLib: StarkwareLib; readonly starkKeyPair?: KeyPair; + readonly clock: Clock; constructor({ host, apiKeyCredentials, starkPrivateKey, networkId, + clock, }: { host: string, apiKeyCredentials: ApiKeyCredentials, networkId: number, starkPrivateKey?: string | KeyPair, + clock: Clock, }) { this.host = host; this.apiKeyCredentials = apiKeyCredentials; @@ -82,6 +86,7 @@ export default class Private { if (starkPrivateKey) { this.starkKeyPair = asSimpleKeyPair(asEcKeyPair(starkPrivateKey)); } + this.clock = clock; } // ============ Request Helpers ============ @@ -92,7 +97,7 @@ export default class Private { data?: {}, ): Promise { const requestPath = `/v3/${endpoint}`; - const isoTimestamp: ISO8601 = new Date().toISOString(); + const isoTimestamp: ISO8601 = this.clock.getAdjustedIsoString(); const headers = { 'DYDX-SIGNATURE': this.sign({ requestPath, diff --git a/src/modules/public.ts b/src/modules/public.ts index 91acea0..3ce47ca 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -194,4 +194,17 @@ export default class Public { getTime(): Promise<{ time: { iso: string, epoch: number } }> { return this.get('time', {}); } + + /** + * @description get a rough estimate of the difference (in epoch seconds) between the server time + * and the system time. + */ + async getTimestampAdjustment(): Promise { + const time1: number = Date.now(); + const { time: { epoch } } = await this.getTime(); + const time2: number = Date.now(); + + const averageTime: number = (time1 + time2) / 2; + return epoch - averageTime; + } } From 34798183bf3b4bd5404aac2839d7b7eefe859b75 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Tue, 6 Apr 2021 11:59:59 -0700 Subject: [PATCH 091/180] Fix get timestamp adjustment (#92) * Get timestamp adjustment in seconds * v1.0.11 * Fix getTime() return type * CR --- package-lock.json | 2 +- package.json | 2 +- src/modules/public.ts | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 65198ce..19d2837 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.10", + "version": "1.0.11", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a41250b..fa27169 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.10", + "version": "1.0.11", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/public.ts b/src/modules/public.ts index 3ce47ca..e4962c9 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -191,7 +191,7 @@ export default class Public { /** * @description get api server time as iso and as epoch in seconds with MS */ - getTime(): Promise<{ time: { iso: string, epoch: number } }> { + getTime(): Promise<{ iso: string, epoch: number }> { return this.get('time', {}); } @@ -201,10 +201,10 @@ export default class Public { */ async getTimestampAdjustment(): Promise { const time1: number = Date.now(); - const { time: { epoch } } = await this.getTime(); + const { epoch } = await this.getTime(); const time2: number = Date.now(); - const averageTime: number = (time1 + time2) / 2; - return epoch - averageTime; + const averageEpoch: number = (time1 + time2) / 2 / 1000; + return epoch - averageEpoch; } } From 7f16da32f3a28f35907652ca94b002d31c6b84a6 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Mon, 12 Apr 2021 12:43:02 -0700 Subject: [PATCH 092/180] add new markets (#93) --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 19d2837..b8dc9f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.11", + "version": "1.0.12", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -501,9 +501,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.0.0.tgz", - "integrity": "sha512-W90Nkl76K0zwddzwA83U37SpP09DDABphLZmnONPhjYQ/7jonyyL6WCJr0NbzIwxWfZ/ydVbwIhibVnM+zoCtw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.0.1.tgz", + "integrity": "sha512-d7R0hWJtPvVxT0Jeedc81+cPuaENsVIP41DrsLYy5AtUxlfip4TVL9Msoy3S7Rf2MGPSoZ5K8GhUorbF8TFaDw==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index fa27169..582bc47 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.11", + "version": "1.0.12", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-eth": "0.11.2", - "@dydxprotocol/starkex-lib": "1.0.0", + "@dydxprotocol/starkex-lib": "1.0.1", "axios": "^0.21.1", "bignumber.js": "^9.0.1", "es6-promisify": "^6.0.1", From bab542d779de67845fe46b10ac81994a336767e9 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Mon, 12 Apr 2021 15:25:06 -0700 Subject: [PATCH 093/180] bump starkex-lib (#94) --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b8dc9f7..de77893 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.12", + "version": "1.0.13", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -501,9 +501,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.0.1.tgz", - "integrity": "sha512-d7R0hWJtPvVxT0Jeedc81+cPuaENsVIP41DrsLYy5AtUxlfip4TVL9Msoy3S7Rf2MGPSoZ5K8GhUorbF8TFaDw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.0.2.tgz", + "integrity": "sha512-/q4IdbcnivgWQDztU9+NakCuyKNP+URgxqGam+vZLtY+yQ2dS41p/CmkR6y1zfGwv4pnQrH1iCN1CrEH8N2kvQ==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index 582bc47..021fece 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.12", + "version": "1.0.13", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-eth": "0.11.2", - "@dydxprotocol/starkex-lib": "1.0.1", + "@dydxprotocol/starkex-lib": "1.0.2", "axios": "^0.21.1", "bignumber.js": "^9.0.1", "es6-promisify": "^6.0.1", From 9d7241d69829474ccc6366210c25af81cbdc285e Mon Sep 17 00:00:00 2001 From: Ashwini Nene Date: Mon, 19 Apr 2021 10:09:05 -0700 Subject: [PATCH 094/180] v1.0.14 add POST/ transfers (#95) * v1.0.14 add POST/ transfers * make fixes Co-authored-by: aan1092j --- package-lock.json | 2 +- package.json | 2 +- src/helpers/request-helpers.ts | 4 +++ src/modules/private.ts | 64 +++++++++++++++++++++++++++++++--- src/types.ts | 14 ++++++++ 5 files changed, 80 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index de77893..1b88f38 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.13", + "version": "1.0.14", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 021fece..5e21b59 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.13", + "version": "1.0.14", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/helpers/request-helpers.ts b/src/helpers/request-helpers.ts index ec42aab..bc3c3e2 100644 --- a/src/helpers/request-helpers.ts +++ b/src/helpers/request-helpers.ts @@ -22,3 +22,7 @@ export function keccak256Buffer(input: Buffer): Buffer { } return Buffer.from(stripHexPrefix(Web3.utils.soliditySha3(input as unknown as string)!), 'hex'); } + +export function generateRandomClientId() { + return Math.random().toString().slice(2).replace(/^0+/, ''); +} diff --git a/src/modules/private.ts b/src/modules/private.ts index 97cd570..e0009f5 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -10,11 +10,13 @@ import { asEcKeyPair, asSimpleKeyPair, SignableConditionalTransfer, + SignableTransfer, nonceFromClientId, + TransferParams as StarklibTransferParams, } from '@dydxprotocol/starkex-lib'; import _ from 'lodash'; -import { generateQueryPath } from '../helpers/request-helpers'; +import { generateQueryPath, generateRandomClientId } from '../helpers/request-helpers'; import { RequestMethod, axiosRequest, @@ -27,6 +29,7 @@ import { ApiFastWithdrawalParams, ApiKeyCredentials, ApiOrder, + ApiTransfer, ApiWithdrawal, Data, FillResponseObject, @@ -43,6 +46,7 @@ import { PositionResponseObject, PositionStatus, Provider, + TransferParams, TransferResponseObject, UserResponseObject, } from '../types'; @@ -363,7 +367,7 @@ export default class Private { // const clientId = params.clientId || Math.random().toString(36).slice(2); // // Have to strip leading zeroes since clientId is being mis-processed as a number. - const clientId = params.clientId || Math.random().toString().slice(2).replace(/^0+/, ''); + const clientId = params.clientId || generateRandomClientId(); let signature: string | undefined = params.signature; if (!signature) { @@ -493,7 +497,7 @@ export default class Private { // const clientId = params.clientId || Math.random().toString(36).slice(2); // // Have to strip leading zeroes since clientId is being mis-processed as a number. - const clientId = params.clientId || Math.random().toString().slice(2).replace(/^0+/, ''); + const clientId = params.clientId || generateRandomClientId(); let signature: string | undefined = params.signature; if (!signature) { @@ -544,7 +548,7 @@ export default class Private { }: PartialBy, positionId: string, ): Promise<{ withdrawal: TransferResponseObject }> { - const clientId = params.clientId || Math.random().toString().slice(2).replace(/^0+/, ''); + const clientId = params.clientId || generateRandomClientId(); // TODO meet starkware specification let signature: string | undefined = params.signature; @@ -587,6 +591,58 @@ export default class Private { ); } + /** + * @description post a new transfer + * + * @param { + * @amount specifies the size of the transfer + * @receiverAccountId specifies the receiver account id + * @receiverPublicKey specifies the receiver public key + * @receiverPositionId specifies the receiver position id + * @clientId specifies the clientId for the address + * @signature starkware specific signature for the transfer + * } + * @param positionId specifies the associated position for the transfer + */ + async createTransfer( + params: PartialBy, + positionId: string, + ): Promise<{ transfer: TransferResponseObject }> { + const clientId = params.clientId || generateRandomClientId(); + + let signature: string | undefined = params.signature; + if (!signature) { + if (!this.starkKeyPair) { + throw new Error( + 'Transfer is not signed and client was not initialized with starkPrivateKey', + ); + } + const transferToSign: StarklibTransferParams = { + humanAmount: params.amount, + expirationIsoTimestamp: params.expiration, + receiverPositionId: params.receiverPositionId, + senderPositionId: positionId, + receiverPublicKey: params.receiverPublicKey, + clientId, + }; + const starkTransfer = SignableTransfer.fromTransfer(transferToSign, this.networkId); + signature = await starkTransfer.sign(this.starkKeyPair); + } + + const transfer: ApiTransfer = { + amount: params.amount, + receiverAccountId: params.receiverAccountId, + clientId, + signature, + expiration: params.expiration, + }; + + return this.post( + 'transfers', + transfer, + ); + } + /** * @description get a user's funding payments by a set of query parameters * diff --git a/src/types.ts b/src/types.ts index 6e7ad0d..e83c8e8 100644 --- a/src/types.ts +++ b/src/types.ts @@ -137,6 +137,20 @@ export interface ApiWithdrawal extends ApiStarkwareSigned { clientId: string; } +export interface ApiTransfer extends ApiStarkwareSigned { + amount: string; + clientId: string; + receiverAccountId: string; +} + +export interface TransferParams extends ApiStarkwareSigned { + amount: string; + clientId: string; + receiverAccountId: string; + receiverPublicKey: string; + receiverPositionId: string; +} + export interface ApiFastWithdrawal extends ApiStarkwareSigned { creditAsset: TransferAsset; creditAmount: string; From d58c275697d65fcfe064d5f10f21994fa1344f25 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Wed, 21 Apr 2021 14:32:03 -0700 Subject: [PATCH 095/180] Add examples directory w/ ws example (#96) * Add examples directory w/ ws example * Fix lint --- .eslintrc.js | 4 +++ examples/private_ws.js | 57 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 examples/private_ws.js diff --git a/.eslintrc.js b/.eslintrc.js index 106dbca..d90b8e8 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -6,6 +6,10 @@ module.exports = { tsconfigRootDir: __dirname, }, + ignorePatterns: [ + '**/examples/**/*.js', + ], + // Extend the base rule set. rules: { }, diff --git a/examples/private_ws.js b/examples/private_ws.js new file mode 100644 index 0000000..8a35d1d --- /dev/null +++ b/examples/private_ws.js @@ -0,0 +1,57 @@ +/** + * Simple JavaScript example demonstrating authentication with private WebSockets channels. + */ + +const { DydxClient } = require('@dydxprotocol/v3-client') +const Web3 = require('web3') +const WebSocket = require('ws') + +const HTTP_HOST = 'https://api.dydx.exchange' +const WS_HOST = 'wss://api.dydx.exchange/v3/ws' + +// NOTE: Set up web3 however your prefer to authenticate to your Ethereum account. +web3 = new Web3() +web3.eth.accounts.wallet.add(process.env.ETHEREUM_PRIVATE_KEY) + +;((async () => { + + client = new DydxClient(HTTP_HOST, { web3 }) + const apiCreds = await client.onboarding.recoverDefaultApiCredentials(address) + client.apiKeyCredentials = apiCreds + + const timestamp = new Date().toISOString() + const signature = client.private.sign({ + requestPath: '/ws/accounts', + method: 'GET', + isoTimestamp: timestamp, + }) + const msg = { + type: 'subscribe', + channel: 'v3_accounts', + accountNumber: '0', + apiKey: apiCreds.key, + signature, + timestamp, + passphrase: apiCreds.passphrase + } + + const ws = new WebSocket(WS_HOST) + + ws.on('message', (message) => { + console.log('<', message) + }) + + ws.on('open', () => { + console.log('>', msg) + ws.send(JSON.stringify(msg)) + }) + + ws.on('error', (error) => { + console.log('<', error) + }) + + ws.on('close', () => { + console.log('Connection closed') + }) + +})()).then(() => console.log('Done')).catch(console.error) From aede369151ce972f1d0ecfb665b424ee1650107e Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Wed, 21 Apr 2021 15:43:53 -0700 Subject: [PATCH 096/180] v1.0.5: Add public GET v3/config request (#97) * add get config * 1.0.15 --- package-lock.json | 2 +- package.json | 2 +- src/modules/public.ts | 9 +++++++++ src/types.ts | 6 ++++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1b88f38..af8b2e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.14", + "version": "1.0.15", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5e21b59..3934371 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.14", + "version": "1.0.15", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/public.ts b/src/modules/public.ts index e4962c9..5a91993 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -4,6 +4,7 @@ import { FastWithdrawalsResponseObject, CandleResolution, CandleResponseObject, + ConfigResponseObject, Data, HistoricalFundingResponseObject, ISO8601, @@ -207,4 +208,12 @@ export default class Public { const averageEpoch: number = (time1 + time2) / 2 / 1000; return epoch - averageEpoch; } + + /** + * @description get any globally-defined variables from the server not associated with any + * particular market or account. + */ + async getConfig(): Promise { + return this.get('config', {}); + } } diff --git a/src/types.ts b/src/types.ts index e83c8e8..b26ee6a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -331,6 +331,12 @@ export interface CandleResponseObject { usdVolume: string; } +export interface ConfigResponseObject { + maxFastWithdrawalAmount: string; + defaultMakerFee: string; + defaultTakerFee: string; +} + export interface FastWithdrawalsResponseObject { liquidityProviders: { [lpPositionId: number]: LiquidityProviderInfo; From 641841445d9d3867aa1104ff9726d5e32957c979 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Fri, 23 Apr 2021 13:51:08 -0700 Subject: [PATCH 097/180] bump market object (#98) --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index af8b2e8..633d553 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.15", + "version": "1.0.16", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 3934371..fc8207e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.15", + "version": "1.0.16", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index b26ee6a..e05d3b3 100644 --- a/src/types.ts +++ b/src/types.ts @@ -184,6 +184,10 @@ export interface MarketResponseObject { volume24H: string; trades24H: string; openInterest: string; + maxPositionSize: string; + incrementalInitialMarginFraction: string; + incrementalPositionSize: string; + basePositionSize: string; } export interface MarketsResponseObject { From 0784bfdf81c8da1404c0d8b959064e9c06ecec21 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Tue, 27 Apr 2021 17:27:48 -0700 Subject: [PATCH 098/180] bump for new markets (#99) --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 633d553..c8e0653 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.16", + "version": "1.0.17", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -501,9 +501,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.0.2.tgz", - "integrity": "sha512-/q4IdbcnivgWQDztU9+NakCuyKNP+URgxqGam+vZLtY+yQ2dS41p/CmkR6y1zfGwv4pnQrH1iCN1CrEH8N2kvQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.0.3.tgz", + "integrity": "sha512-WpYpYoYqohBkc5LiwYLdXc2vTThcH1b5BujCdJPOlziJTMZ6MMXnGiH2BbrwtySlVdL4wsPFhKjH83Vkwwx3gQ==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index fc8207e..ec52650 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.16", + "version": "1.0.17", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-eth": "0.11.2", - "@dydxprotocol/starkex-lib": "1.0.2", + "@dydxprotocol/starkex-lib": "1.0.3", "axios": "^0.21.1", "bignumber.js": "^9.0.1", "es6-promisify": "^6.0.1", From 5bc869278aba9500ecb4a8e7b302e75c36936c1e Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Thu, 27 May 2021 14:07:11 -0700 Subject: [PATCH 099/180] Add link to docs in readme (#100) * Add readme * bc1 --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 815f1e1..3d44bef 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ License -
+
TypeScript client for dYdX (v3 API). +
+[Typescript client documentation link](https://docs.dydx.exchange/#typescript-client) From eff8fdf0e56dcd0df7c710dd47665e74600108a9 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Mon, 7 Jun 2021 15:50:26 -0700 Subject: [PATCH 100/180] bump for new markets (#101) --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index c8e0653..1a63275 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.17", + "version": "1.0.18", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -501,9 +501,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.0.3.tgz", - "integrity": "sha512-WpYpYoYqohBkc5LiwYLdXc2vTThcH1b5BujCdJPOlziJTMZ6MMXnGiH2BbrwtySlVdL4wsPFhKjH83Vkwwx3gQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.0.5.tgz", + "integrity": "sha512-sSMdY3t8U6j9sNcwYsz0UjHPCO/iGs0tP8ZYWzgvFsJVYz94uxAJxnVvDU+pBoyPwRCu1gfyqbumQBEjDJW+RQ==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index ec52650..8f58cda 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.17", + "version": "1.0.18", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-eth": "0.11.2", - "@dydxprotocol/starkex-lib": "1.0.3", + "@dydxprotocol/starkex-lib": "1.0.5", "axios": "^0.21.1", "bignumber.js": "^9.0.1", "es6-promisify": "^6.0.1", From a4c56848f540cebd67093438ac2b40ace5491e71 Mon Sep 17 00:00:00 2001 From: Kenadia Date: Mon, 21 Jun 2021 10:22:56 -0700 Subject: [PATCH 101/180] Remove outdated comments (#104) --- src/modules/private.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/modules/private.ts b/src/modules/private.ts index e0009f5..78707cc 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -363,10 +363,6 @@ export default class Private { params: PartialBy, positionId: string, ): Promise<{ order: OrderResponseObject }> { - // TODO: Allow clientId to be a string. - // const clientId = params.clientId || Math.random().toString(36).slice(2); - // - // Have to strip leading zeroes since clientId is being mis-processed as a number. const clientId = params.clientId || generateRandomClientId(); let signature: string | undefined = params.signature; @@ -493,10 +489,6 @@ export default class Private { params: PartialBy, positionId: string, ): Promise<{ withdrawal: TransferResponseObject }> { - // TODO: Allow clientId to be a string. - // const clientId = params.clientId || Math.random().toString(36).slice(2); - // - // Have to strip leading zeroes since clientId is being mis-processed as a number. const clientId = params.clientId || generateRandomClientId(); let signature: string | undefined = params.signature; @@ -549,8 +541,6 @@ export default class Private { positionId: string, ): Promise<{ withdrawal: TransferResponseObject }> { const clientId = params.clientId || generateRandomClientId(); - // TODO meet starkware specification - let signature: string | undefined = params.signature; if (!signature) { if (!this.starkKeyPair) { From 1a6e431ce94f5acb609be4fd2c0244771790f8ec Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Mon, 21 Jun 2021 10:25:38 -0700 Subject: [PATCH 102/180] v1.0.19: expose private get endpoint as generic get [BAC-1463] (#102) * expose private get endpoint as generic get * ks1 --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 35 +++++++++++++++++++++-------------- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1a63275..6c61fbe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.18", + "version": "1.0.19", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8f58cda..4d69157 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.18", + "version": "1.0.19", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 78707cc..0b7210f 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -121,7 +121,7 @@ export default class Private { }); } - protected async get( + protected async _get( endpoint: string, params: {}, ): Promise { @@ -151,11 +151,18 @@ export default class Private { // ============ Requests ============ + async get(endpoint: string, params: {}): Promise { + return this._get( + endpoint, + params, + ); + } + /** * @description get a signature for the ethereumAddress if registered */ async getRegistration(genericParams: GenericParams = {}): Promise<{ signature: string }> { - return this.get( + return this._get( 'registration', { ...genericParams, @@ -167,7 +174,7 @@ export default class Private { * @description get the user associated with the ethereumAddress */ async getUser(genericParams: GenericParams = {}): Promise<{ user: UserResponseObject }> { - return this.get( + return this._get( 'users', { ...genericParams, @@ -233,7 +240,7 @@ export default class Private { ethereumAddress: string, genericParams: GenericParams = {}, ): Promise<{ account: AccountResponseObject }> { - return this.get( + return this._get( `accounts/${getAccountId({ address: ethereumAddress })}`, { ...genericParams }, ); @@ -245,7 +252,7 @@ export default class Private { async getAccounts( genericParams: GenericParams = {}, ): Promise<{ accounts: AccountResponseObject[] }> { - return this.get( + return this._get( 'accounts', { ...genericParams }, ); @@ -270,7 +277,7 @@ export default class Private { }, genericParams: GenericParams = {}, ): Promise<{ positions: PositionResponseObject[] }> { - return this.get( + return this._get( 'positions', { ...params, @@ -301,7 +308,7 @@ export default class Private { } = {}, genericParams: GenericParams = {}, ): Promise<{ orders: OrderResponseObject[] }> { - return this.get( + return this._get( 'orders', { ...params, @@ -319,7 +326,7 @@ export default class Private { orderId: string, genericParams: GenericParams = {}, ): Promise<{ order: OrderResponseObject }> { - return this.get( + return this._get( `orders/${orderId}`, { ...genericParams }, ); @@ -334,7 +341,7 @@ export default class Private { clientId: string, genericParams: GenericParams = {}, ): Promise<{ order: OrderResponseObject }> { - return this.get( + return this._get( `orders/client/${clientId}`, { ...genericParams }, ); @@ -440,7 +447,7 @@ export default class Private { }, genericParams: GenericParams = {}, ): Promise<{ fills: FillResponseObject[] }> { - return this.get( + return this._get( 'fills', { ...params, @@ -466,7 +473,7 @@ export default class Private { } = {}, genericParams: GenericParams = {}, ): Promise<{ transfers: TransferResponseObject[] }> { - return this.get( + return this._get( 'transfers', { ...params, @@ -650,7 +657,7 @@ export default class Private { }, genericParams: GenericParams = {}, ): Promise<{ fundingPayments: FundingResponseObject }> { - return this.get( + return this._get( 'funding', { ...params, @@ -676,7 +683,7 @@ export default class Private { }, genericParams: GenericParams = {}, ): Promise<{ historicalPnl: HistoricalPnlResponseObject[] }> { - return this.get( + return this._get( 'historical-pnl', { ...params, @@ -692,7 +699,7 @@ export default class Private { async getApiKeys( genericParams: GenericParams = {}, ): Promise<{ apiKeys: { key: string }[] }> { - return this.get('api-keys', { ...genericParams }); + return this._get('api-keys', { ...genericParams }); } // ============ Signing ============ From c95e773456bf5211835d7189b560b9a63989bee6 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Thu, 29 Jul 2021 16:15:55 -0700 Subject: [PATCH 103/180] add email endpoints to client (#105) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 10 ++++++++++ src/modules/public.ts | 26 ++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6c61fbe..86fe522 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.19", + "version": "1.0.20", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 4d69157..5158122 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.19", + "version": "1.0.20", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 0b7210f..514c9a0 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -702,6 +702,16 @@ export default class Private { return this._get('api-keys', { ...genericParams }); } + /** + * @description send verification email to email specified by User + */ + async sendVerificationEmail(): Promise<{}> { + return this.put( + 'emails/send-verification-email', + {}, + ); + } + // ============ Signing ============ sign({ diff --git a/src/modules/public.ts b/src/modules/public.ts index 5a91993..5ea029a 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -36,6 +36,17 @@ export default class Public { }); } + protected async put( + requestPath: string, + data: {}, + ): Promise { + return axiosRequest({ + url: `${this.host}/v3/${requestPath}`, + method: 'PUT', + data, + }); + } + // ============ Requests ============ /** @@ -189,6 +200,21 @@ export default class Public { ); } + /** + * @description verify email for user with token + * + * @token that verifies user received a verification email to + * the email they specified + */ + async verifyEmail(token: string): Promise<{}> { + return this.put( + 'emails/verify-email', + { + token, + }, + ); + } + /** * @description get api server time as iso and as epoch in seconds with MS */ From 8f687f9c72a8a5b148af8d50f71e59dcf7c109fa Mon Sep 17 00:00:00 2001 From: James Jia Date: Mon, 2 Aug 2021 11:29:20 -0700 Subject: [PATCH 104/180] Add leaderboard endpoints to client [BAC-1641] (#106) * leaderboard endpoints * return null types too --- package.json | 2 +- src/modules/private.ts | 17 +++++++++++++++++ src/modules/public.ts | 30 ++++++++++++++++++++++++++++++ src/types.ts | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 5158122..f4dbb6a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.20", + "version": "1.0.21", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 514c9a0..ef84be5 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -24,6 +24,7 @@ import { import { getAccountId } from '../lib/db'; import { AccountAction, + AccountLeaderboardPnlResponseObject, AccountResponseObject, ApiFastWithdrawal, ApiFastWithdrawalParams, @@ -37,6 +38,7 @@ import { GenericParams, HistoricalPnlResponseObject, ISO8601, + LeaderboardPnlPeriod, Market, OrderResponseObject, OrderSide, @@ -258,6 +260,21 @@ export default class Private { ); } + /** + * @description get leaderboard pnl for period and accountNumber 0 + * + * @param period the period of pnls to retrieve + */ + async getAccountLeaderboardPnl( + period: LeaderboardPnlPeriod, + genericParams: GenericParams = {}, + ): Promise<{ leaderboardPnl: AccountLeaderboardPnlResponseObject }> { + return this._get( + `accounts/leaderboard-pnl/${period}`, + genericParams, + ); + } + /** * @description get all positions for an account, meeting query parameters * diff --git a/src/modules/public.ts b/src/modules/public.ts index 5ea029a..24270d6 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -15,6 +15,9 @@ import { OrderbookResponseObject, Trade, TransferAsset, + LeaderboardPnlSortBy, + LeaderboardPnlPeriod, + LeaderboardPnlResponseObject, } from '../types'; export default class Public { @@ -200,6 +203,33 @@ export default class Public { ); } + /** + * @description get leaderboard pnls + * + * @param period Time period being checked + * @param sortBy Pnl to sort by + * @param limit Number of leaderboard pnls returned + */ + getLeaderboardPnls({ + period, + sortBy, + limit, + }: { + period: LeaderboardPnlPeriod, + sortBy: LeaderboardPnlSortBy, + limit?: number, + }): Promise { + const uri: string = 'leaderboard-pnl'; + return this.get( + uri, + { + period, + sortBy, + limit, + }, + ); + } + /** * @description verify email for user with token * diff --git a/src/types.ts b/src/types.ts index e05d3b3..a882601 100644 --- a/src/types.ts +++ b/src/types.ts @@ -109,6 +109,18 @@ export enum SignatureTypes { PERSONAL = 3, } +export enum LeaderboardPnlPeriod { + DAILY = 'DAILY', + WEEKLY = 'WEEKLY', + MONTHLY = 'MONTHLY', + ALL_TIME = 'ALL_TIME', +} + +export enum LeaderboardPnlSortBy { + ABSOLUTE = 'ABSOLUTE', + PERCENT = 'PERCENT', +} + // ============ API Request Types ============ interface ApiStarkwareSigned { @@ -347,6 +359,29 @@ export interface FastWithdrawalsResponseObject { }; } +export interface LeaderboardPnlResponseObject { + topPnls: LeaderboardPnl[]; + updatedAt: ISO8601; +} + +export interface LeaderboardPnl { + username: string; + ethereumAddress: string | null; + absolutePnl: string; + percentPnl: string; + absoluteRank: number | null; + percentRank: number | null; +} + +export interface AccountLeaderboardPnlResponseObject { + absolutePnl: string; + percentPnl: string; + absoluteRank: number | null; + percentRank: number | null; + updatedAt: ISO8601, + accountId: string; +} + export interface LiquidityProviderInfo { availableFunds: string; starkKey: string; From 4e7d787851c8dd05cc907c27cbd71e658dbe384f Mon Sep 17 00:00:00 2001 From: James Jia Date: Mon, 2 Aug 2021 17:11:38 -0700 Subject: [PATCH 105/180] Remove accountId as a param for historical funding (#107) * remove accountId as a param for historical funding * version bump --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 86fe522..180909b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.20", + "version": "1.0.22", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f4dbb6a..03b27cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.21", + "version": "1.0.22", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index ef84be5..ecaea34 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -687,14 +687,12 @@ export default class Private { * @description get historical pnl ticks for an account between certain times * * @param { - * @account being checked * @createdBeforeOrAt latest historical pnl tick being returned * @createdOnOrAfter earliest historical pnl tick being returned * } */ getHistoricalPnl( params: { - accountId: string, createdBeforeOrAt?: ISO8601, createdOnOrAfter?: ISO8601, }, From 7bc6b51f7ac1b2edccbba9fcfb4e07097147dd95 Mon Sep 17 00:00:00 2001 From: James Jia Date: Fri, 13 Aug 2021 14:04:47 -0700 Subject: [PATCH 106/180] v1.0.23 Add new candle types to v3-client (#110) * add candle types to v3-client * bump package version --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 180909b..a2e708c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.22", + "version": "1.0.23", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 03b27cb..896a310 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.22", + "version": "1.0.23", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index a882601..9280fe2 100644 --- a/src/types.ts +++ b/src/types.ts @@ -56,7 +56,10 @@ export enum MarketStatisticDay { export enum CandleResolution { ONE_DAY = '1DAY', + FOUR_HOURS = '4HOURS', ONE_HOUR = '1HOUR', + FIVE_MINS = '5MINS', + ONE_MIN = '1MIN', } export enum OrderType { From 90697393b257097006bcbf177b37e6b81066d264 Mon Sep 17 00:00:00 2001 From: James Jia Date: Mon, 16 Aug 2021 10:53:21 -0700 Subject: [PATCH 107/180] 1.0.24 Add rewards endpoints [BAC-1688] (#111) * rewards endpoints * version bump * comments --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 62 +++++++++++++++++++++++++++++++++++++++++ src/modules/public.ts | 18 ++++++++++++ src/types.ts | 63 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 145 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index a2e708c..88ee7fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.23", + "version": "1.0.24", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 896a310..77557e5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.23", + "version": "1.0.24", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index ecaea34..33cbf72 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -39,6 +39,7 @@ import { HistoricalPnlResponseObject, ISO8601, LeaderboardPnlPeriod, + LiquidityProviderRewardsResponseObject, Market, OrderResponseObject, OrderSide, @@ -48,6 +49,8 @@ import { PositionResponseObject, PositionStatus, Provider, + RetroactiveMiningRewardsResponseObject, + TradingRewardsResponseObject, TransferParams, TransferResponseObject, UserResponseObject, @@ -707,6 +710,65 @@ export default class Private { ); } + /** + * @description get trading rewards for a user for a given epoch + * + * @param { + * @epoch to request rewards data for (optional) + * } + */ + getTradingRewards( + params: { + epoch?: number, + }, + genericParams: GenericParams = {}, + ): Promise<{ tradingRewards: TradingRewardsResponseObject }> { + return this._get( + 'rewards/weight', + { + ...params, + ...genericParams, + }, + ); + } + + /** + * @description get liquidity provider rewards for a user for a given epoch + * + * @param { + * @epoch to request rewards data for (optional) + * } + */ + getLiquidityProviderRewards( + params: { + epoch?: number, + }, + genericParams: GenericParams = {}, + ): Promise<{ liquidityRewards: LiquidityProviderRewardsResponseObject }> { + return this._get( + 'rewards/liquidity', + { + ...params, + ...genericParams, + }, + ); + } + + /** + * @description get retroactive mining rewards for a user for a given epoch + * + */ + getRetroactiveMiningRewards( + genericParams: GenericParams = {}, + ): Promise<{ retroactiveMiningRewards: RetroactiveMiningRewardsResponseObject }> { + return this._get( + 'rewards/retroactive-mining', + { + ...genericParams, + }, + ); + } + /** * @description get the key ids associated with an ethereumAddress * diff --git a/src/modules/public.ts b/src/modules/public.ts index 24270d6..4d20f0e 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -18,6 +18,7 @@ import { LeaderboardPnlSortBy, LeaderboardPnlPeriod, LeaderboardPnlResponseObject, + PublicRetroactiveMiningRewardsResponseObject, } from '../types'; export default class Public { @@ -230,6 +231,23 @@ export default class Public { ); } + /** + * @description get retroactive mining rewards for an ethereum address + * + * @param ethereumAddress An Ethereum address of a user + */ + getPublicRetroactiveMiningRewards( + ethereumAddress: string, + ): Promise { + const uri: string = 'rewards/public-retroactive-mining'; + return this.get( + uri, + { + ethereumAddress, + }, + ); + } + /** * @description verify email for user with token * diff --git a/src/types.ts b/src/types.ts index 9280fe2..7eabd5f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -404,6 +404,69 @@ export interface Trade { createdAt: ISO8601, } +export interface TradingRewardsResponseObject { + epoch: number, + epochStart: ISO8601, + epochEnd: ISO8601, + fees: Fees, + openInterest: OpenInterest, + weight: Weight, + totalRewards: string, + estimatedRewards: string, +} + +export interface Fees { + feesPaid: string, + totalFeesPaid: string, +} + +export interface OpenInterest { + averageOpenInterest: string, + totalAverageOpenInterest: string, +} + +export interface Weight { + weight: string, + totalWeight: string, +} + +export interface LiquidityProviderRewardsResponseObject { + epoch: number, + epochStart: ISO8601, + epochEnd: ISO8601, + markets: { + [market: string]: LiquidityRewards, + }, +} + +export interface LiquidityRewards { + market: Market, + uptime: string, + score: string, + totalScore: string, + totalRewards: string, + estimatedRewards: string, +} + +export interface RetroactiveMiningRewardsResponseObject { + epoch: number, + epochStart: ISO8601, + epochEnd: ISO8601, + retroactiveMining: RetroactiveMiningRewards, + estimatedRewards: string, +} + +export interface RetroactiveMiningRewards { + allocation: string, + targetVolume: string, + volume: string, +} + +export interface PublicRetroactiveMiningRewardsResponseObject { + allocation: string, + targetVolume: string, +} + // ============ Ethereum Signing ============ export enum OnboardingActionString { From 165289fa9bd5999e3a3c2e52e9647a4fa80b09d7 Mon Sep 17 00:00:00 2001 From: James Jia Date: Mon, 16 Aug 2021 13:56:25 -0700 Subject: [PATCH 108/180] new candle resolutions (#113) --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 88ee7fe..103710f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.24", + "version": "1.0.25", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 77557e5..feffc35 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.24", + "version": "1.0.25", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index 7eabd5f..f898bb8 100644 --- a/src/types.ts +++ b/src/types.ts @@ -58,6 +58,8 @@ export enum CandleResolution { ONE_DAY = '1DAY', FOUR_HOURS = '4HOURS', ONE_HOUR = '1HOUR', + THIRTY_MINS = '30MINS', + FIFTEEN_MINS = '15MINS', FIVE_MINS = '5MINS', ONE_MIN = '1MIN', } From a6a81a97abd28cd4b6fb1b4c5ce3272b1ee097be Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Mon, 23 Aug 2021 09:42:33 -0700 Subject: [PATCH 109/180] update order types (#115) --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 103710f..204441a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.25", + "version": "1.0.26", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index feffc35..dc498b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.25", + "version": "1.0.26", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index f898bb8..be582b7 100644 --- a/src/types.ts +++ b/src/types.ts @@ -66,7 +66,8 @@ export enum CandleResolution { export enum OrderType { LIMIT = 'LIMIT', - STOP = 'STOP', + MARKET = 'MARKET', + STOP_LIMIT = 'STOP_LIMIT', TRAILING_STOP = 'TRAILING_STOP', TAKE_PROFIT = 'TAKE_PROFIT', } From a61e4d869ad3bbfb1883b3a6f278ea6d21cec590 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Wed, 1 Sep 2021 15:18:37 -0700 Subject: [PATCH 110/180] update put user with isSharing fields and appropriate optional fields (#117) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 16 ++++++++++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 204441a..2c59a10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.26", + "version": "1.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index dc498b0..c02bd35 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.0.26", + "version": "1.1.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 33cbf72..1a4bcab 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -191,25 +191,33 @@ export default class Private { * @description update information for the user * * @param { + * @userData specifiying information about the user * @email associated with the user * @username for the user - * @userData specifiying information about the user + * @isSharingUsername if the user wants their username publically shared + * @isSharingAddress if the user wants their ethereumAddress publically shared * } */ async updateUser({ + userData, email, username, - userData, + isSharingUsername, + isSharingAddress, }: { - email: string, - username: string, userData: {}, + email?: string, + username?: string, + isSharingUsername?: boolean, + isSharingAddress?: boolean, }): Promise<{ user: UserResponseObject }> { return this.put( 'users', { email, username, + isSharingUsername, + isSharingAddress, userData: JSON.stringify(userData), }, ); From b6d1855e276b6bc115ec004af36a4c74a8eb83ce Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Wed, 1 Sep 2021 15:21:21 -0700 Subject: [PATCH 111/180] fix spelling (#118) --- src/modules/private.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/private.ts b/src/modules/private.ts index 1a4bcab..e3ef7bc 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -194,8 +194,8 @@ export default class Private { * @userData specifiying information about the user * @email associated with the user * @username for the user - * @isSharingUsername if the user wants their username publically shared - * @isSharingAddress if the user wants their ethereumAddress publically shared + * @isSharingUsername if the user wants their username publicly shared + * @isSharingAddress if the user wants their ethereumAddress publicly shared * } */ async updateUser({ From 5dc68a8c7a0c69a2219c4a1f898209101a32be05 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Fri, 3 Sep 2021 12:35:42 -0700 Subject: [PATCH 112/180] bump client (#119) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2c59a10..50820f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.1.0", + "version": "1.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c02bd35..e96a448 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.1.0", + "version": "1.2.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { From 63acf29ee90d3de0a6625cfda81d16bd6d7a4496 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Fri, 3 Sep 2021 13:35:16 -0700 Subject: [PATCH 113/180] fix all repsonse types (#120) --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 53 ++++++++++++++++++++++++++++++++++++----------- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 50820f3..b683478 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.2.0", + "version": "1.2.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e96a448..65b55b1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.2.0", + "version": "1.2.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index be582b7..5ae420f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -186,26 +186,28 @@ export interface ApiFastWithdrawalParams extends ApiFastWithdrawal { export interface MarketResponseObject { market: Market; - status: string; + status: MarketStatus; baseAsset: Asset; quoteAsset: Asset; - stepSize: string; tickSize: string; indexPrice: string; oraclePrice: string; nextFundingRate: string; + nextFundingAt: ISO8601; minOrderSize: string; type: string; initialMarginFraction: string; maintenanceMarginFraction: string; + stepSize: string; priceChange24H: string; volume24H: string; trades24H: string; openInterest: string; - maxPositionSize: string; incrementalInitialMarginFraction: string; + baselinePositionSize: string; incrementalPositionSize: string; - basePositionSize: string; + maxPositionSize: string; + assetResolution: string; } export interface MarketsResponseObject { @@ -221,12 +223,11 @@ export interface MarketStatisticResponseObject { baseVolume: string; quoteVolume: string; type: string; - nextFundingRate: ISO8601; } export interface OrderResponseObject { id: string; - clientId: string; + clientId?: string; accountId: string; market: Market; side: OrderSide; @@ -238,7 +239,7 @@ export interface OrderResponseObject { type: OrderType; createdAt: ISO8601; unfillableAt?: ISO8601 | null; - expiresAt: ISO8601; + expiresAt?: ISO8601; status: OrderStatus; timeInForce: TimeInForce; postOnly: boolean; @@ -257,24 +258,41 @@ export interface PositionResponseObject { realizedPnl?: string; createdAt: ISO8601; closedAt?: ISO8601; + sumOpen?: string; + sumClose?: string; + netFunding?: string; } export interface FillResponseObject { id: string; - accountId: string; side: OrderSide; liquidity: string; + type: OrderType; market: Market; - orderId: string; price: string; size: string; fee: string; createdAt: ISO8601; + orderId: string | null | undefined; } export interface UserResponseObject { ethereumAddress: string; - userData: string; + isRegistered: boolean; + email: string | null; + username: string | null; + userData: {}; + makerFeeRate: string | null; + takerFeeRate: string | null; + makerVolume30D: string | null; + takerVolume30D: string | null; + fees30D: string | null; + referredByAffiliateLink: string | null; + isSharingUsername: boolean | null; + isSharingAddress: boolean | null; + dydxTokenBalance: string; + stakedDydxTokenBalance: string; + isEmailVerified: boolean; } export interface AccountResponseObject { @@ -285,12 +303,13 @@ export interface AccountResponseObject { pendingDeposits: string, pendingWithdrawals: string, openPositions: PositionsMap, + accountNumber: string, id: string; + quoteBalance: string; } export interface TransferResponseObject { id: string; - accountId: string; type: string; debitAsset: Asset creditAsset: Asset; @@ -306,7 +325,6 @@ export interface TransferResponseObject { } export interface FundingResponseObject { - accountId: string; market: Market; payment: string; rate: string; @@ -351,6 +369,7 @@ export interface CandleResponseObject { baseTokenVolume: string; trades: string; usdVolume: string; + startingOpenInterest: string; } export interface ConfigResponseObject { @@ -470,6 +489,16 @@ export interface PublicRetroactiveMiningRewardsResponseObject { targetVolume: string, } +// ============ API Response Field Types ============ + +enum MarketStatus { + ONLINE = 'ONLINE', + OFFLINE = 'OFFLINE', + POST_ONLY = 'POST_ONLY', + CANCEL_ONLY = 'CANCEL_ONLY', + INITIALIZING = 'INITIALIZING', +} + // ============ Ethereum Signing ============ export enum OnboardingActionString { From 8b7226db521b9caf4900725fc8242a5970c72c0c Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Fri, 3 Sep 2021 14:17:52 -0700 Subject: [PATCH 114/180] return fees from market-statistics (#121) --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b683478..73df9aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.2.1", + "version": "1.2.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 65b55b1..b29cf31 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.2.1", + "version": "1.2.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index 5ae420f..f3a995f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -223,6 +223,7 @@ export interface MarketStatisticResponseObject { baseVolume: string; quoteVolume: string; type: string; + fees: string; } export interface OrderResponseObject { From 65c94fadd3dd8fd7721eed17b928e7f1e19b0d37 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Fri, 3 Sep 2021 16:30:23 -0700 Subject: [PATCH 115/180] v1.3.0: make stats market optional (#122) * make stats market optional * fix --- package-lock.json | 2 +- package.json | 2 +- src/modules/public.ts | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 73df9aa..2030d62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.2.2", + "version": "1.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b29cf31..4b322a9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.2.2", + "version": "1.3.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/public.ts b/src/modules/public.ts index 4d20f0e..e8dbc3e 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -108,10 +108,12 @@ export default class Public { market, days, }: { - market: Market, + market?: Market, days?: MarketStatisticDay, }): Promise<{ markets: MarketStatisticResponseObject }> { - const uri: string = `stats/${market}`; + const uri: string = market !== undefined + ? `stats/${market}` + : 'stats'; return this.get(uri, { days }); } From 06a65c7b7c1f80628a75ef7ea898d9eb2fc4bc89 Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Tue, 7 Sep 2021 12:10:38 -0700 Subject: [PATCH 116/180] v1.3.1: Update GET v3/config types (#123) * add v3/config types * 1.3.1 --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2030d62..ab6e971 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.3.0", + "version": "1.3.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 4b322a9..dbfde56 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.3.0", + "version": "1.3.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index f3a995f..752129c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -374,9 +374,13 @@ export interface CandleResponseObject { } export interface ConfigResponseObject { - maxFastWithdrawalAmount: string; + collateralAssetId: string; + collateralTokenAddress: string; defaultMakerFee: string; defaultTakerFee: string; + exchangeAddress: string; + maxExpectedBatchLengthMinutes: string; + maxFastWithdrawalAmount: string; } export interface FastWithdrawalsResponseObject { From d2d9aec6067f7afbeefc5cc5c6eff0ed9dd8d6e9 Mon Sep 17 00:00:00 2001 From: James Jia Date: Wed, 29 Sep 2021 16:19:45 -0700 Subject: [PATCH 117/180] v1.3.2 enable COMPETITION for leaderboards (#127) --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab6e971..f311d71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.3.1", + "version": "1.3.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index dbfde56..620d5f5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.3.1", + "version": "1.3.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index 752129c..46c03c5 100644 --- a/src/types.ts +++ b/src/types.ts @@ -120,6 +120,7 @@ export enum LeaderboardPnlPeriod { WEEKLY = 'WEEKLY', MONTHLY = 'MONTHLY', ALL_TIME = 'ALL_TIME', + COMPETITION = 'COMPETITION', } export enum LeaderboardPnlSortBy { From 46e61b9727c3e481a1c1e342ce3ffa4d6a6763ff Mon Sep 17 00:00:00 2001 From: James Jia Date: Thu, 30 Sep 2021 16:44:00 -0700 Subject: [PATCH 118/180] v1.3.3 AccountLeaderboardPnlResponse: updatedAt can be null (#128) --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index f311d71..c01b835 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.3.2", + "version": "1.3.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 620d5f5..df27c36 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.3.2", + "version": "1.3.3", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index 46c03c5..f0b2428 100644 --- a/src/types.ts +++ b/src/types.ts @@ -409,7 +409,7 @@ export interface AccountLeaderboardPnlResponseObject { percentPnl: string; absoluteRank: number | null; percentRank: number | null; - updatedAt: ISO8601, + updatedAt: ISO8601 | null, accountId: string; } From fa473a8b776f72ad9da940826c250aee895645aa Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Mon, 11 Oct 2021 13:08:49 -0700 Subject: [PATCH 119/180] allow user.email to be null (#131) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index c01b835..ac301d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.3.3", + "version": "1.3.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index df27c36..a7b1ffc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.3.3", + "version": "1.3.4", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index e3ef7bc..2e562c7 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -206,7 +206,7 @@ export default class Private { isSharingAddress, }: { userData: {}, - email?: string, + email?: string | null, username?: string, isSharingUsername?: boolean, isSharingAddress?: boolean, From 6e03e0c5660ed4eb1d540ace83a9c08aad2f8903 Mon Sep 17 00:00:00 2001 From: James Jia Date: Mon, 25 Oct 2021 12:07:55 -0700 Subject: [PATCH 120/180] v1.3.5 add updatedAt to candlesResponseObject (#132) * v1.3.4 add updatedAt to candlesResponseObject * v1.3.5 --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ac301d9..fca6114 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.3.4", + "version": "1.3.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a7b1ffc..c89c214 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.3.4", + "version": "1.3.5", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index f0b2428..2addc19 100644 --- a/src/types.ts +++ b/src/types.ts @@ -362,6 +362,7 @@ export interface OrderbookResponseObject { export interface CandleResponseObject { startedAt: ISO8601; + updatedAt: ISO8601; market: Market; resolution: CandleResolution; low: string; From 4a609ca4870c5eb030c763fdac9c777e31d40b8f Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Wed, 27 Oct 2021 10:44:06 -0700 Subject: [PATCH 121/180] v1.3.6: bump starkex-eth (#133) --- package-lock.json | 57 ++++++++++++++++++++++++++++++----------------- package.json | 4 ++-- 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index fca6114..4d46c25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.3.5", + "version": "1.3.6", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -487,17 +487,33 @@ } }, "@dydxprotocol/starkex-eth": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.11.2.tgz", - "integrity": "sha512-XNRC3y37TEXwUrAKcO/owI3IJFlFL2IXM/zDB48XazCzBOMBl3PvLq4cRDskZhxxUj/HB5Sk7ef2y8v5SB6hYw==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.12.2.tgz", + "integrity": "sha512-lBzVzNvV0yLFQGPioUUeZAa3c5y5GCuNFpMHUtqWuEDSnRU21qOER7n07zz4v76Z33vwr+hhPUVke3IATicK8w==", "requires": { "@types/big.js": "^6.0.0", "@types/elliptic": "^6.4.12", + "axios": "^0.21.4", "big.js": "^6.0.0", "bignumber.js": "^9.0.1", "lodash": "^4.17.20", "starkware-crypto": "^1.9.7", "web3": "1.3.0" + }, + "dependencies": { + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" + } } }, "@dydxprotocol/starkex-lib": { @@ -1789,9 +1805,9 @@ } }, "@types/big.js": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.0.2.tgz", - "integrity": "sha512-7NdmOT3zjtghMofDwP1nAJCJWVjc/96V5msXRAZ4lPrvpGlajA95VQec7OXwA2wQaVmhjt+F5ko8pjvQU1tTFA==" + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.1.2.tgz", + "integrity": "sha512-h24JIZ52rvSvi2jkpYDk2yLH99VzZoCJiSfDWwjst7TwJVuXN61XVCUlPCzRl7mxKEMsGf8z42Q+J4TZwU3z2w==" }, "@types/bn.js": { "version": "4.11.6", @@ -4250,15 +4266,14 @@ } }, "ethereumjs-util": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.9.tgz", - "integrity": "sha512-cRqvYYKJoitq6vMKMf8pXeVwvTrX+dRD0JwHaYqm8jvogK14tqIoCWH/KUHcRwnVxVXEYF/o6pup5jRG4V0xzg==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz", + "integrity": "sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==", "requires": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", "create-hash": "^1.1.2", "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", "rlp": "^2.2.4" }, "dependencies": { @@ -4273,24 +4288,24 @@ } }, "ethereumjs-wallet": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.1.tgz", - "integrity": "sha512-3Z5g1hG1das0JWU6cQ9HWWTY2nt9nXCcwj7eXVNAHKbo00XAZO8+NHlwdgXDWrL0SXVQMvTWN8Q/82DRH/JhPw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz", + "integrity": "sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA==", "requires": { - "aes-js": "^3.1.1", + "aes-js": "^3.1.2", "bs58check": "^2.1.2", "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^7.0.2", - "randombytes": "^2.0.6", + "ethereumjs-util": "^7.1.2", + "randombytes": "^2.1.0", "scrypt-js": "^3.0.1", "utf8": "^3.0.0", - "uuid": "^3.3.2" + "uuid": "^8.3.2" }, "dependencies": { "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" } } }, diff --git a/package.json b/package.json index c89c214..0c2bda3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.3.5", + "version": "1.3.6", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -25,7 +25,7 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-eth": "0.11.2", + "@dydxprotocol/starkex-eth": "0.12.2", "@dydxprotocol/starkex-lib": "1.0.5", "axios": "^0.21.1", "bignumber.js": "^9.0.1", From 1234b0f36fb1e995233b868fe4a53774673162a5 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Thu, 28 Oct 2021 12:09:08 -0700 Subject: [PATCH 122/180] v1.4.0: add recovery endpoint [BAC-2015] (#134) * add recovery endpoint * jj1 --- __tests__/api-keys.test.ts | 2 +- __tests__/eth-signing/api-key-action.test.ts | 12 +++---- __tests__/index.test.ts | 2 +- package-lock.json | 2 +- package.json | 2 +- src/dydx-client.ts | 16 +++++----- ...pi-key-action.ts => eth-private-action.ts} | 14 ++++---- src/eth-signing/index.ts | 2 +- src/modules/{api-keys.ts => eth-private.ts} | 32 ++++++++++++++++--- src/types.ts | 2 +- 10 files changed, 55 insertions(+), 31 deletions(-) rename src/eth-signing/{api-key-action.ts => eth-private-action.ts} (70%) rename src/modules/{api-keys.ts => eth-private.ts} (72%) diff --git a/__tests__/api-keys.test.ts b/__tests__/api-keys.test.ts index ac3f614..4f4be75 100644 --- a/__tests__/api-keys.test.ts +++ b/__tests__/api-keys.test.ts @@ -42,7 +42,7 @@ describe('API Keys Module & Private Module', () => { const web3 = new Web3(); const account: EthereumAccount = web3.eth.accounts.wallet.create(1)[0]; const client = new DydxClient('https://example.com', { web3 }); - await client.apiKeys.deleteApiKey(apiKeyCredentials.key, account.address); + await client.ethPrivate.deleteApiKey(apiKeyCredentials.key, account.address); expect(axios).toHaveBeenCalledTimes(1); expect(axios).toHaveBeenCalledWith({ diff --git a/__tests__/eth-signing/api-key-action.test.ts b/__tests__/eth-signing/api-key-action.test.ts index 98a2aaf..3ff5cd1 100644 --- a/__tests__/eth-signing/api-key-action.test.ts +++ b/__tests__/eth-signing/api-key-action.test.ts @@ -1,7 +1,7 @@ import { ApiMethod } from '@dydxprotocol/starkex-lib'; import Web3 from 'web3'; -import { SignApiKeyAction } from '../../src/eth-signing'; +import { SignEthPrivateAction } from '../../src/eth-signing'; import { SigningMethod } from '../../src/types'; // DEFAULT GANACHE ACCOUNT FOR TESTING ONLY -- DO NOT USE IN PRODUCTION. @@ -25,16 +25,16 @@ const mockRequestWithBody = { body: JSON.stringify({ key: 'value', key2: 'value2' }), }; -let localSigner: SignApiKeyAction; -let remoteSigner: SignApiKeyAction; +let localSigner: SignEthPrivateAction; +let remoteSigner: SignEthPrivateAction; -describe('SignApiKeyAction', () => { +describe('SignEthPrivateAction', () => { describe('with a local Ethereum private key', () => { beforeAll(() => { const web3 = new Web3(); - localSigner = new SignApiKeyAction(web3, 1); + localSigner = new SignEthPrivateAction(web3, 1); web3.eth.accounts.wallet.add(GANACHE_PRIVATE_KEY); }); @@ -77,7 +77,7 @@ describe('SignApiKeyAction', () => { beforeAll(async () => { const web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545')); - remoteSigner = new SignApiKeyAction(web3, 1); + remoteSigner = new SignEthPrivateAction(web3, 1); }); it('signs and verifies using SigningMethod.Hash', async () => { diff --git a/__tests__/index.test.ts b/__tests__/index.test.ts index 5b38582..d28cca8 100644 --- a/__tests__/index.test.ts +++ b/__tests__/index.test.ts @@ -4,7 +4,7 @@ describe('DydxClient', () => { it('has separate modules', () => { const client = new DydxClient('https://example.com'); - expect(client.apiKeys).toBeTruthy(); + expect(client.ethPrivate).toBeTruthy(); expect(client.eth).toBeTruthy(); expect(client.onboarding).toBeTruthy(); expect(client.private).toBeTruthy(); diff --git a/package-lock.json b/package-lock.json index 4d46c25..532a4c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.3.6", + "version": "1.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0c2bda3..279940f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.3.6", + "version": "1.4.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/dydx-client.ts b/src/dydx-client.ts index aa1d0ae..788e236 100644 --- a/src/dydx-client.ts +++ b/src/dydx-client.ts @@ -2,8 +2,8 @@ import { StarkwareLib } from '@dydxprotocol/starkex-eth'; import { KeyPair } from '@dydxprotocol/starkex-lib'; import Web3 from 'web3'; -import ApiKeys from './modules/api-keys'; import Clock from './modules/clock'; +import EthPrivate from './modules/eth-private'; import Onboarding from './modules/onboarding'; import Private from './modules/private'; import Public from './modules/public'; @@ -39,7 +39,7 @@ export class DydxClient { // Modules. These are created on-demand. private _private?: Private; - private _apiKeys?: ApiKeys; + private _ethPrivate?: EthPrivate; private _onboarding?: Onboarding; private _eth?: StarkwareLib; @@ -103,10 +103,10 @@ export class DydxClient { /** * Get the keys module, used for managing API keys. Requires Ethereum key auth. */ - get apiKeys(): ApiKeys { - if (!this._apiKeys) { + get ethPrivate(): EthPrivate { + if (!this._ethPrivate) { if (this.web3) { - this._apiKeys = new ApiKeys({ + this._ethPrivate = new EthPrivate({ host: this.host, web3: this.web3, networkId: this.networkId, @@ -114,11 +114,11 @@ export class DydxClient { }); } else { return notSupported( - 'API key endpoints are not supported since neither web3 nor web3Provider was provided', - ) as ApiKeys; + 'Eth private endpoints are not supported since neither web3 nor web3Provider was provided', + ) as EthPrivate; } } - return this._apiKeys; + return this._ethPrivate; } /** diff --git a/src/eth-signing/api-key-action.ts b/src/eth-signing/eth-private-action.ts similarity index 70% rename from src/eth-signing/api-key-action.ts rename to src/eth-signing/eth-private-action.ts index 063e4f3..f2a2d68 100644 --- a/src/eth-signing/api-key-action.ts +++ b/src/eth-signing/eth-private-action.ts @@ -1,16 +1,16 @@ import Web3 from 'web3'; -import { ApiKeyAction } from '../types'; +import { EthPrivateAction } from '../types'; import { hashString } from './helpers'; import { SignOffChainAction } from './sign-off-chain-action'; -const EIP712_API_KEY_ACTION_STRUCT = [ +const EIP712_ETH_PRIVATE_ACTION_STRUCT = [ { type: 'string', name: 'method' }, { type: 'string', name: 'requestPath' }, { type: 'string', name: 'body' }, { type: 'string', name: 'timestamp' }, ]; -const EIP712_API_KEY_ACTION_STRUCT_STRING = ( +const EIP712_ETH_PRIVATE_ACTION_STRUCT_STRING = ( 'dYdX(' + 'string method,' + 'string requestPath,' + @@ -19,20 +19,20 @@ const EIP712_API_KEY_ACTION_STRUCT_STRING = ( ')' ); -export class SignApiKeyAction extends SignOffChainAction { +export class SignEthPrivateAction extends SignOffChainAction { constructor( web3: Web3, networkId: number, ) { - super(web3, networkId, EIP712_API_KEY_ACTION_STRUCT); + super(web3, networkId, EIP712_ETH_PRIVATE_ACTION_STRUCT); } public getHash( - message: ApiKeyAction, + message: EthPrivateAction, ): string { const structHash: string | null = Web3.utils.soliditySha3( - { t: 'bytes32', v: hashString(EIP712_API_KEY_ACTION_STRUCT_STRING) }, + { t: 'bytes32', v: hashString(EIP712_ETH_PRIVATE_ACTION_STRUCT_STRING) }, { t: 'bytes32', v: hashString(message.method) }, { t: 'bytes32', v: hashString(message.requestPath) }, { t: 'bytes32', v: hashString(message.body) }, diff --git a/src/eth-signing/index.ts b/src/eth-signing/index.ts index e898d89..5493217 100644 --- a/src/eth-signing/index.ts +++ b/src/eth-signing/index.ts @@ -1,2 +1,2 @@ -export { SignApiKeyAction } from './api-key-action'; +export { SignEthPrivateAction } from './eth-private-action'; export { SignOnboardingAction } from './onboarding-action'; diff --git a/src/modules/api-keys.ts b/src/modules/eth-private.ts similarity index 72% rename from src/modules/api-keys.ts rename to src/modules/eth-private.ts index 2b3a844..223c56e 100644 --- a/src/modules/api-keys.ts +++ b/src/modules/eth-private.ts @@ -2,7 +2,7 @@ import { ApiMethod } from '@dydxprotocol/starkex-lib'; import _ from 'lodash'; import Web3 from 'web3'; -import { SignApiKeyAction } from '../eth-signing'; +import { SignEthPrivateAction } from '../eth-signing'; import { generateQueryPath } from '../helpers/request-helpers'; import { axiosRequest, @@ -11,13 +11,14 @@ import { ApiKeyCredentials, Data, ISO8601, + PositionResponseObject, SigningMethod, } from '../types'; import Clock from './clock'; -export default class ApiKeys { +export default class EthPrivate { readonly host: string; - readonly signer: SignApiKeyAction; + readonly signer: SignEthPrivateAction; readonly clock: Clock; constructor({ @@ -32,7 +33,7 @@ export default class ApiKeys { clock: Clock, }) { this.host = host; - this.signer = new SignApiKeyAction(web3, networkId); + this.signer = new SignEthPrivateAction(web3, networkId); this.clock = clock; } @@ -88,6 +89,14 @@ export default class ApiKeys { return this.request(ApiMethod.DELETE, requestPath, ethereumAddress, signingMethod); } + protected async get( + endpoint: string, + ethereumAddress: string, + signingMethod: SigningMethod = SigningMethod.Hash, + ): Promise { + return this.request(ApiMethod.GET, endpoint, ethereumAddress, signingMethod); + } + // ============ Requests ============ /** @@ -116,4 +125,19 @@ export default class ApiKeys { ): Promise { return this.delete('api-keys', ethereumAddress, signingMethod, { apiKey }); } + + /** + * @description This is for if you can't recover your starkKey or apiKey and need an + * additional way to get your starkKey and balance on our exchange, both of which are needed to + * call the L1 solidity function needed to recover your funds. + * + * @param ethereumAddress the recovery is for + * @param signingMethod used to validate the request + */ + async recovery( + ethereumAddress: string, + signingMethod: SigningMethod = SigningMethod.Hash, + ): Promise<{ starkKey: string, quoteBalance: string, positions: PositionResponseObject[] }> { + return this.get('recovery', ethereumAddress, signingMethod); + } } diff --git a/src/types.ts b/src/types.ts index 2addc19..5ccbcb3 100644 --- a/src/types.ts +++ b/src/types.ts @@ -518,7 +518,7 @@ export interface OnboardingAction { onlySignOn?: 'https://trade.dydx.exchange'; } -export interface ApiKeyAction { +export interface EthPrivateAction { method: string, requestPath: string, body: string, From 27128b306c87455f68b83dd3163f8ef6fd93517f Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Thu, 28 Oct 2021 12:27:41 -0700 Subject: [PATCH 123/180] reverse get orders param (#135) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 532a4c4..6ba3c0b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.4.0", + "version": "1.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 279940f..43f9680 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.4.0", + "version": "1.4.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 2e562c7..eb996e5 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -323,7 +323,10 @@ export default class Private { * @side of the book the orders are on * @type of order * @limit to the number of orders returned - * @createdBeforeOrAt sets the time of the last fill that will be received * } + * @createdBeforeOrAt sets the time of the last fill that will be received + * @returnLatestOrders returns the latest orders instead of the oldest and the order is + * from most recent to least recent (up to limit) + * } */ async getOrders( params: { @@ -333,6 +336,7 @@ export default class Private { type?: OrderType, limit?: number, createdBeforeOrAt?: ISO8601, + returnLatestOrders?: boolean, } = {}, genericParams: GenericParams = {}, ): Promise<{ orders: OrderResponseObject[] }> { From e2e4b70f7a10108c8b364f3731512066f18728ff Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Thu, 28 Oct 2021 15:39:22 -0700 Subject: [PATCH 124/180] v1.4.2: return positionId from recovery (#136) --- package-lock.json | 2 +- package.json | 2 +- src/modules/eth-private.ts | 11 ++++++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6ba3c0b..1d3d93e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.4.1", + "version": "1.4.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 43f9680..76f9db8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.4.1", + "version": "1.4.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/eth-private.ts b/src/modules/eth-private.ts index 223c56e..baf0410 100644 --- a/src/modules/eth-private.ts +++ b/src/modules/eth-private.ts @@ -128,8 +128,8 @@ export default class EthPrivate { /** * @description This is for if you can't recover your starkKey or apiKey and need an - * additional way to get your starkKey and balance on our exchange, both of which are needed to - * call the L1 solidity function needed to recover your funds. + * additional way to get your starkKey, positionid and balance on our exchange, + * all of which are needed to call the L1 solidity function needed to recover your funds. * * @param ethereumAddress the recovery is for * @param signingMethod used to validate the request @@ -137,7 +137,12 @@ export default class EthPrivate { async recovery( ethereumAddress: string, signingMethod: SigningMethod = SigningMethod.Hash, - ): Promise<{ starkKey: string, quoteBalance: string, positions: PositionResponseObject[] }> { + ): Promise<{ + starkKey: string, + positionId: string, + quoteBalance: string, + positions: PositionResponseObject[], + }> { return this.get('recovery', ethereumAddress, signingMethod); } } From aecbde98036ee0c1f6c3da5430ff80f9abfbabc5 Mon Sep 17 00:00:00 2001 From: James Jia Date: Mon, 1 Nov 2021 10:48:45 -0700 Subject: [PATCH 125/180] v1.5.0 update ConfigResponseObject [BAC-1818] (#137) * v1.5.0 update ConfigResponseObject * add more details to v3/config --- package-lock.json | 2 +- package.json | 2 +- src/modules/public.ts | 5 +++-- src/types.ts | 19 +++++++++++++++++++ 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1d3d93e..0c4cf8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.4.2", + "version": "1.5.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 76f9db8..394c5e7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.4.2", + "version": "1.5.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/public.ts b/src/modules/public.ts index e8dbc3e..3fd1a13 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -286,8 +286,9 @@ export default class Public { } /** - * @description get any globally-defined variables from the server not associated with any - * particular market or account. + * @description get global config variables for the exchange as a whole. + * This includes (but is not limited to) details on the exchange, including addresses, + * fees, transfers, and rate limits. */ async getConfig(): Promise { return this.get('config', {}); diff --git a/src/types.ts b/src/types.ts index 5ccbcb3..cdd9e81 100644 --- a/src/types.ts +++ b/src/types.ts @@ -383,6 +383,25 @@ export interface ConfigResponseObject { exchangeAddress: string; maxExpectedBatchLengthMinutes: string; maxFastWithdrawalAmount: string; + cancelOrderRateLimiting: CancelOrderRateLimiting; + placeOrderRateLimiting: PlaceOrderRateLimiting; +} + +export interface CancelOrderRateLimiting { + maxPointsMulti: number; + maxPointsSingle: number; + windowSecMulti: number; + windowSecSingle: number; +} + +export interface PlaceOrderRateLimiting { + maxPoints: number; + windowSec: number; + targetNotional: number; + minLimitConsumption: number; + minMarketConsumption: number; + minTriggerableConsumption: number; + maxOrderConsumption: number; } export interface FastWithdrawalsResponseObject { From cdbe2def5a8a7df23030e0cbd5e47272c5567566 Mon Sep 17 00:00:00 2001 From: James Jia Date: Tue, 9 Nov 2021 11:54:31 -0800 Subject: [PATCH 126/180] v1.5.1 add token faucet function [BAC-2018] (#138) * v1.5.1 add token faucet endpoint * throw error if not ropsten --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0c4cf8e..1590b0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.0", + "version": "1.5.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 394c5e7..6785c2c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.0", + "version": "1.5.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index eb996e5..8907e4e 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -801,6 +801,22 @@ export default class Private { ); } + /** + * @description requests tokens on dYdX's staging server. + * NOTE: this will not work on Mainnet/Production. + */ + async requestTestnetTokens(): Promise<{ transfer: TransferResponseObject }> { + // Ropsten + if (this.networkId !== 3) { + throw new Error('Network is not Ropsten'); + } + + return this.post( + 'testnet/tokens', + {}, + ); + } + // ============ Signing ============ sign({ From 9d0860e375916106f427906a076ef3914a777716 Mon Sep 17 00:00:00 2001 From: James Jia Date: Wed, 10 Nov 2021 15:26:40 -0800 Subject: [PATCH 127/180] v1.5.2 add country [BAC-2017] (#139) * v1.5.2 add country * update docstring --- package-lock.json | 2 +- package.json | 2 +- src/modules/onboarding.ts | 3 +++ src/modules/private.ts | 5 +++++ src/types.ts | 3 +++ 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1590b0c..6612b48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.1", + "version": "1.5.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 6785c2c..5ff90bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.1", + "version": "1.5.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index a488475..1f2954b 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -15,6 +15,7 @@ import { AccountResponseObject, ApiKeyCredentials, Data, + ISO31661ALPHA2, OnboardingAction, OnboardingActionString, SigningMethod, @@ -90,12 +91,14 @@ export default class Onboarding { * @param signature validating the request * @param signingMethod for the request * @param referredByAffiliateLink of affiliate who referred the user + * @param country for the user (ISO 3166-1 Alpha-2 Compliant) */ async createUser( params: { starkKey: string, starkKeyYCoordinate: string, referredByAffiliateLink?: string, + country?: ISO31661ALPHA2, }, ethereumAddress: string, signature: string | null = null, diff --git a/src/modules/private.ts b/src/modules/private.ts index 8907e4e..89083ff 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -38,6 +38,7 @@ import { GenericParams, HistoricalPnlResponseObject, ISO8601, + ISO31661ALPHA2, LeaderboardPnlPeriod, LiquidityProviderRewardsResponseObject, Market, @@ -196,6 +197,7 @@ export default class Private { * @username for the user * @isSharingUsername if the user wants their username publicly shared * @isSharingAddress if the user wants their ethereumAddress publicly shared + * @country for the user (ISO 3166-1 Alpha-2 Compliant) * } */ async updateUser({ @@ -204,12 +206,14 @@ export default class Private { username, isSharingUsername, isSharingAddress, + country, }: { userData: {}, email?: string | null, username?: string, isSharingUsername?: boolean, isSharingAddress?: boolean, + country?: ISO31661ALPHA2, }): Promise<{ user: UserResponseObject }> { return this.put( 'users', @@ -219,6 +223,7 @@ export default class Private { isSharingUsername, isSharingAddress, userData: JSON.stringify(userData), + country, }, ); } diff --git a/src/types.ts b/src/types.ts index cdd9e81..b60a964 100644 --- a/src/types.ts +++ b/src/types.ts @@ -10,6 +10,8 @@ export { Account as EthereumAccount } from 'web3-core'; export type ISO8601 = string; +export type ISO31661ALPHA2 = string; + export type Address = string; export type Integer = BigNumber; @@ -295,6 +297,7 @@ export interface UserResponseObject { dydxTokenBalance: string; stakedDydxTokenBalance: string; isEmailVerified: boolean; + country: ISO31661ALPHA2 | null; } export interface AccountResponseObject { From 0ac36c45985c63dd6db3d1ae6f91c4ed67c63c0e Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Tue, 23 Nov 2021 07:57:23 -0800 Subject: [PATCH 128/180] v1.5.3: update recovery endpoint response (#140) --- package-lock.json | 2 +- package.json | 2 +- src/modules/eth-private.ts | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6612b48..d8189cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.2", + "version": "1.5.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5ff90bc..a7cd52b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.2", + "version": "1.5.3", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/eth-private.ts b/src/modules/eth-private.ts index baf0410..1891d9d 100644 --- a/src/modules/eth-private.ts +++ b/src/modules/eth-private.ts @@ -140,6 +140,8 @@ export default class EthPrivate { ): Promise<{ starkKey: string, positionId: string, + equity: string, + freeCollateral: string, quoteBalance: string, positions: PositionResponseObject[], }> { From ec8c3f3190ea91a9edaa8d73b434440af3ef342b Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Tue, 30 Nov 2021 17:04:23 -0800 Subject: [PATCH 129/180] v1.5.4: bump starkex-lib (#141) * v1.5.4: bump starkex-lib * add @types/ffi-napi Co-authored-by: James Jia --- package-lock.json | 150 ++++++++++++++++++++++++++++++++++++++++++++-- package.json | 5 +- 2 files changed, 149 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d8189cf..f3e3133 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.3", + "version": "1.5.4", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -517,16 +517,18 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.0.5.tgz", - "integrity": "sha512-sSMdY3t8U6j9sNcwYsz0UjHPCO/iGs0tP8ZYWzgvFsJVYz94uxAJxnVvDU+pBoyPwRCu1gfyqbumQBEjDJW+RQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.1.2.tgz", + "integrity": "sha512-KkcYzYFOgLcck7E9V8RXdpTn14kx3G6Eif4/1afFqnEBMmehGHrBJdhU10atnnYVi91M33y9R+5izgm/haE68A==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", "big.js": "6.0.3", + "bigint-buffer": "^1.1.5", "bip39": "^3.0.3", "bn.js": "5.1.3", "ethereum-cryptography": "^0.1.3", + "ffi-napi": "^3.1.0", "hash.js": "^1.1.7" }, "dependencies": { @@ -1837,6 +1839,17 @@ "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", "dev": true }, + "@types/ffi-napi": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/ffi-napi/-/ffi-napi-4.0.4.tgz", + "integrity": "sha512-okbJHGWpRsZTKudP9StCsxe8sWJozdF0WwXC2CLrfKWb9fkwc7nJaSJRfGQ9OeF9lQ9ihZEaOpcsuUvkdZ8Ksw==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/ref-napi": "*", + "@types/ref-struct-di": "*" + } + }, "@types/graceful-fs": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", @@ -1923,6 +1936,24 @@ "integrity": "sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA==", "dev": true }, + "@types/ref-napi": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/ref-napi/-/ref-napi-3.0.4.tgz", + "integrity": "sha512-ng8SCmdZbz1GHaW3qgGoX9IaHoIvgMqgBHLe3sv18NbAkHVgnjRW8fJq51VTUm4lnJyLu60q9/002o7qjOg13g==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/ref-struct-di": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@types/ref-struct-di/-/ref-struct-di-1.1.5.tgz", + "integrity": "sha512-8pPFcSyw+jI7tvUC5Du9NqOhZeKOvt2LxvPN+9aKnXAu68URpWYrwY99LaraH58+XQIYWbD8tw3SH+h4/1A5vA==", + "dev": true, + "requires": { + "@types/ref-napi": "*" + } + }, "@types/secp256k1": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz", @@ -2562,6 +2593,14 @@ "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.0.3.tgz", "integrity": "sha512-n6yn1FyVL1EW2DBAr4jlU/kObhRzmr+NNRESl65VIOT8WBJj/Kezpx2zFdhJUqYI6qrtTW7moCStYL5VxeVdPA==" }, + "bigint-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", + "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==", + "requires": { + "bindings": "^1.3.0" + } + }, "bignumber.js": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", @@ -2573,6 +2612,14 @@ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bip39": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.3.tgz", @@ -4738,6 +4785,34 @@ "bser": "2.1.1" } }, + "ffi-napi": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ffi-napi/-/ffi-napi-3.1.0.tgz", + "integrity": "sha512-EsHO+sP2p/nUC/3l/l8m9niee1BLm4asUFDzkkBGR4kYVgp2KqdAYUomZhkKtzim4Fq7mcYHjpUaIHsMqs+E1g==", + "requires": { + "debug": "^4.1.1", + "get-uv-event-loop-napi-h": "^1.0.5", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.1", + "ref-napi": "^2.0.1", + "ref-struct-di": "^1.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "file-entry-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", @@ -4747,6 +4822,11 @@ "flat-cache": "^3.0.4" } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4920,6 +5000,19 @@ "pump": "^3.0.0" } }, + "get-symbol-from-current-process-h": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-from-current-process-h/-/get-symbol-from-current-process-h-1.0.2.tgz", + "integrity": "sha512-syloC6fsCt62ELLrr1VKBM1ggOpMdetX9hTrdW77UQdcApPHLmf7CI7OKcN1c9kYuNxKcDe4iJ4FY9sX3aw2xw==" + }, + "get-uv-event-loop-napi-h": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/get-uv-event-loop-napi-h/-/get-uv-event-loop-napi-h-1.0.6.tgz", + "integrity": "sha512-t5c9VNR84nRoF+eLiz6wFrEp1SE2Acg0wS+Ysa2zF0eROes+LzOfuTaVHxGy8AbS8rq7FHEJzjnCZo1BupwdJg==", + "requires": { + "get-symbol-from-current-process-h": "^1.0.1" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -7711,6 +7804,55 @@ "picomatch": "^2.2.1" } }, + "ref-napi": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ref-napi/-/ref-napi-2.1.2.tgz", + "integrity": "sha512-aFl+vrIuLWUXMUTQGAwGAuSNLX3Ub5W3iVP8b7KyFFZUdn4+i4U1TXXTop0kCTUfGNu8glBGVz4lowkwMcPVVA==", + "requires": { + "debug": "^4.1.1", + "get-symbol-from-current-process-h": "^1.0.2", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.1" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "ref-struct-di": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ref-struct-di/-/ref-struct-di-1.1.1.tgz", + "integrity": "sha512-2Xyn/0Qgz89VT+++WP0sTosdm9oeowLP23wRJYhG4BFdMUrLj3jhwHZNEytYNYgtPKLNTP3KJX4HEgBvM1/Y2g==", + "requires": { + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", diff --git a/package.json b/package.json index a7cd52b..1726e9b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.3", + "version": "1.5.4", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-eth": "0.12.2", - "@dydxprotocol/starkex-lib": "1.0.5", + "@dydxprotocol/starkex-lib": "1.1.2", "axios": "^0.21.1", "bignumber.js": "^9.0.1", "es6-promisify": "^6.0.1", @@ -37,6 +37,7 @@ "devDependencies": { "@dydxprotocol/node-service-base-dev": "0.0.11", "@types/es6-promisify": "^6.0.0", + "@types/ffi-napi": "^4.0.4", "@types/uuid": "^8.3.0" } } From 5637e36be559f9db551c0781daf2bfda6b129bea Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Fri, 3 Dec 2021 11:32:28 -0800 Subject: [PATCH 130/180] v1.5.5: bump for new markets (#142) --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f3e3133..1788b13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.4", + "version": "1.5.5", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -517,9 +517,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.1.2.tgz", - "integrity": "sha512-KkcYzYFOgLcck7E9V8RXdpTn14kx3G6Eif4/1afFqnEBMmehGHrBJdhU10atnnYVi91M33y9R+5izgm/haE68A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.1.3.tgz", + "integrity": "sha512-oC3Xj7FbQbQOHZe6y/i6UqlIAknP0nUWclokthpFNz3Iye7K1EjigMeA+QAIBAKgvYcm1lLmpUxmR1qWEtVSkw==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index 1726e9b..d530654 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.4", + "version": "1.5.5", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-eth": "0.12.2", - "@dydxprotocol/starkex-lib": "1.1.2", + "@dydxprotocol/starkex-lib": "1.1.3", "axios": "^0.21.1", "bignumber.js": "^9.0.1", "es6-promisify": "^6.0.1", From 9647721241d3240561a6886fbfc6ffc6882aef8f Mon Sep 17 00:00:00 2001 From: James Jia Date: Mon, 6 Dec 2021 07:16:18 -0800 Subject: [PATCH 131/180] v1.5.6 leaderboard (#143) --- src/modules/private.ts | 8 +++++++- src/modules/public.ts | 3 +++ src/types.ts | 4 ++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/modules/private.ts b/src/modules/private.ts index 89083ff..5a989b7 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -283,11 +283,17 @@ export default class Private { */ async getAccountLeaderboardPnl( period: LeaderboardPnlPeriod, + params: { + startingBeforeOrAt?: ISO8601, + }, genericParams: GenericParams = {}, ): Promise<{ leaderboardPnl: AccountLeaderboardPnlResponseObject }> { return this._get( `accounts/leaderboard-pnl/${period}`, - genericParams, + { + ...params, + ...genericParams, + }, ); } diff --git a/src/modules/public.ts b/src/modules/public.ts index 3fd1a13..b51954c 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -215,10 +215,12 @@ export default class Public { */ getLeaderboardPnls({ period, + startingBeforeOrAt, sortBy, limit, }: { period: LeaderboardPnlPeriod, + startingBeforeOrAt?: ISO8601, sortBy: LeaderboardPnlSortBy, limit?: number, }): Promise { @@ -227,6 +229,7 @@ export default class Public { uri, { period, + startingBeforeOrAt, sortBy, limit, }, diff --git a/src/types.ts b/src/types.ts index b60a964..04e8bd9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -415,6 +415,8 @@ export interface FastWithdrawalsResponseObject { export interface LeaderboardPnlResponseObject { topPnls: LeaderboardPnl[]; + startedAt: ISO8601 | null; + endsAt: ISO8601 | null; updatedAt: ISO8601; } @@ -433,6 +435,8 @@ export interface AccountLeaderboardPnlResponseObject { absoluteRank: number | null; percentRank: number | null; updatedAt: ISO8601 | null, + startedAt: ISO8601 | null, + endsAt: ISO8601 | null, accountId: string; } From dad8a0d1a4886e1661c55a02e065228300fce506 Mon Sep 17 00:00:00 2001 From: James Jia Date: Mon, 6 Dec 2021 16:09:13 -0800 Subject: [PATCH 132/180] v1.5.6 (#144) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1788b13..21359da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.5", + "version": "1.5.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d530654..3ceb21e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.5", + "version": "1.5.6", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { From a8210404b32f65634ae5b165a00df16a5916b230 Mon Sep 17 00:00:00 2001 From: James Jia Date: Wed, 8 Dec 2021 12:50:37 -0800 Subject: [PATCH 133/180] v1.5.7 getAccountLeaderboardPnls startedBeforeOrAt (#145) --- package-lock.json | 2 +- package.json | 3 ++- src/modules/private.ts | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 21359da..0a7054a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.6", + "version": "1.5.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 3ceb21e..dda2216 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.6", + "version": "1.5.7", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -10,6 +10,7 @@ "coverage": "npm run test -- --coverage", "fix": "npm run lint -- --fix", "lint": "eslint --ext .ts,.js .", + "start": "node build/src/index.js", "prepublishOnly": "npm run compile", "test": "NODE_ENV=test jest", "test:watch": "npm test -- --watch" diff --git a/src/modules/private.ts b/src/modules/private.ts index 5a989b7..0a15414 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -284,7 +284,7 @@ export default class Private { async getAccountLeaderboardPnl( period: LeaderboardPnlPeriod, params: { - startingBeforeOrAt?: ISO8601, + startedBeforeOrAt?: ISO8601, }, genericParams: GenericParams = {}, ): Promise<{ leaderboardPnl: AccountLeaderboardPnlResponseObject }> { From a51f909a67712734abd2197b4333bc627f7daa83 Mon Sep 17 00:00:00 2001 From: James Jia Date: Wed, 8 Dec 2021 16:52:36 -0800 Subject: [PATCH 134/180] v1.5.8 Bump starkex-lib (#146) * bump starkex-lib * v1.5.8 --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0a7054a..95e3256 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.7", + "version": "1.5.8", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -517,9 +517,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.1.3.tgz", - "integrity": "sha512-oC3Xj7FbQbQOHZe6y/i6UqlIAknP0nUWclokthpFNz3Iye7K1EjigMeA+QAIBAKgvYcm1lLmpUxmR1qWEtVSkw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.1.4.tgz", + "integrity": "sha512-NRs5GbsxVaVdocZt7/egDJgLgRJ+lZBiowM9zI+LbLHT6ZxvFG83uv/8Qcb1Sm+wTaukfh3tLQ9khYLF9h1VDQ==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index dda2216..1ae6cbe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.7", + "version": "1.5.8", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -27,7 +27,7 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-eth": "0.12.2", - "@dydxprotocol/starkex-lib": "1.1.3", + "@dydxprotocol/starkex-lib": "1.1.4", "axios": "^0.21.1", "bignumber.js": "^9.0.1", "es6-promisify": "^6.0.1", From f609c0e387e6b52ba3b9abad9bbdd6565b2d3dab Mon Sep 17 00:00:00 2001 From: James Jia Date: Fri, 10 Dec 2021 16:24:45 -0800 Subject: [PATCH 135/180] getMarkets syntheticAssetId (#147) --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 95e3256..0b73d91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.8", + "version": "1.5.9", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1ae6cbe..73a05ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.8", + "version": "1.5.9", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index 04e8bd9..cc19431 100644 --- a/src/types.ts +++ b/src/types.ts @@ -211,6 +211,7 @@ export interface MarketResponseObject { incrementalPositionSize: string; maxPositionSize: string; assetResolution: string; + syntheticAssetId: string; } export interface MarketsResponseObject { From abd58636bde9336ef33951f5d43cc6c8cabf4921 Mon Sep 17 00:00:00 2001 From: James Jia Date: Wed, 22 Dec 2021 12:41:58 -0800 Subject: [PATCH 136/180] v1.5.10 Update rewards response objects [BAC-2154] (#148) * update rewards response objects * comment --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 11 +++++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0b73d91..5dca2b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.9", + "version": "1.5.10", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 73a05ce..fa02631 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.9", + "version": "1.5.10", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index cc19431..d11a7fe 100644 --- a/src/types.ts +++ b/src/types.ts @@ -467,6 +467,7 @@ export interface TradingRewardsResponseObject { fees: Fees, openInterest: OpenInterest, weight: Weight, + stakedDYDX: StakedDYDXIncludingFloor, totalRewards: string, estimatedRewards: string, } @@ -486,6 +487,15 @@ export interface Weight { totalWeight: string, } +export interface StakedDYDX { + averageStakedDYDX: string, + totalAverageStakedDYDX: string, +} + +export interface StakedDYDXIncludingFloor extends StakedDYDX { + averageStakedDYDXWithFloor: string, +} + export interface LiquidityProviderRewardsResponseObject { epoch: number, epochStart: ISO8601, @@ -493,6 +503,7 @@ export interface LiquidityProviderRewardsResponseObject { markets: { [market: string]: LiquidityRewards, }, + stakedDYDX: StakedDYDX, } export interface LiquidityRewards { From 00f779159e055c60d13d920229c9bc0343332f2a Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Thu, 30 Dec 2021 14:27:52 -0800 Subject: [PATCH 137/180] v1.15.11: active-orders endpoints (#149) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 55 ++++++++++++++++++++++++++++++++++++++++++ src/types.ts | 9 +++++++ 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5dca2b9..95005ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.10", + "version": "1.5.11", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index fa02631..6832d38 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.10", + "version": "1.5.11", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 0a15414..60b1f80 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -55,6 +55,7 @@ import { TransferParams, TransferResponseObject, UserResponseObject, + ActiveOrderResponseObject, } from '../types'; import Clock from './clock'; @@ -360,6 +361,33 @@ export default class Private { ); } + /** + * @description get active orders (PENDING, OPEN, UNTRIGGERED) for a user by a set of query + * parameters - if id is included then side is required + * + * @param { + * @market the orders are for + * @side of the book the orders are on + * @id of the order + * } + */ + async getActiveOrders( + market: Market, + side?: OrderSide, + id?: string, + genericParams: GenericParams = {}, + ): Promise<{ orders: ActiveOrderResponseObject[] }> { + return this._get( + 'active-orders', + { + market, + side, + id, + ...genericParams, + }, + ); + } + /** * @description get an order by a unique id * @@ -471,6 +499,33 @@ export default class Private { ); } + /** + * @description cancel active orders (PENDING, OPEN, UNTRIGGERED) for a user by a set of query + * parameters - if id is included then side is required + * + * @param { + * @market the orders are for + * @side of the book the orders are on + * @id of the order + * } + */ + async cancelActiveOrders( + market: Market, + side?: OrderSide, + id?: string, + genericParams: GenericParams = {}, + ): Promise<{ cancelOrders: ActiveOrderResponseObject[] }> { + return this.delete( + 'active-orders', + { + market, + side, + id, + ...genericParams, + }, + ); + } + /** *@description get fills for a user by a set of query parameters * diff --git a/src/types.ts b/src/types.ts index d11a7fe..d409ad7 100644 --- a/src/types.ts +++ b/src/types.ts @@ -251,6 +251,15 @@ export interface OrderResponseObject { cancelReason?: string | null; } +export interface ActiveOrderResponseObject { + id: string; + accountId: string; + remainingSize: string; + price: string; + market: Market; + side: OrderSide; +} + export interface PositionResponseObject { market: Market; status: PositionStatus; From 0f478ad171bee4395785f107df7b0f0f23210e5b Mon Sep 17 00:00:00 2001 From: James Jia Date: Thu, 13 Jan 2022 11:34:42 -0800 Subject: [PATCH 138/180] v1.6.0 update leaderboard endpoints (#151) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 4 ++-- src/types.ts | 30 +++++++++++++++++++++++++++--- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 95005ba..089a511 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.11", + "version": "1.6.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 6832d38..9f6f1b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.5.11", + "version": "1.6.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 60b1f80..78022b4 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -24,6 +24,7 @@ import { import { getAccountId } from '../lib/db'; import { AccountAction, + AccountLeaderboardPnlPeriod, AccountLeaderboardPnlResponseObject, AccountResponseObject, ApiFastWithdrawal, @@ -39,7 +40,6 @@ import { HistoricalPnlResponseObject, ISO8601, ISO31661ALPHA2, - LeaderboardPnlPeriod, LiquidityProviderRewardsResponseObject, Market, OrderResponseObject, @@ -283,7 +283,7 @@ export default class Private { * @param period the period of pnls to retrieve */ async getAccountLeaderboardPnl( - period: LeaderboardPnlPeriod, + period: AccountLeaderboardPnlPeriod, params: { startedBeforeOrAt?: ISO8601, }, diff --git a/src/types.ts b/src/types.ts index d409ad7..6bd2baa 100644 --- a/src/types.ts +++ b/src/types.ts @@ -117,12 +117,26 @@ export enum SignatureTypes { PERSONAL = 3, } +export enum AccountLeaderboardPnlPeriod { + DAILY = 'DAILY', + WEEKLY = 'WEEKLY', + MONTHLY = 'MONTHLY', + ALL_TIME = 'ALL_TIME', + COMPETITION = 'COMPETITION', + LEAGUES = 'LEAGUES', +} + export enum LeaderboardPnlPeriod { DAILY = 'DAILY', WEEKLY = 'WEEKLY', MONTHLY = 'MONTHLY', ALL_TIME = 'ALL_TIME', COMPETITION = 'COMPETITION', + BRONZE = 'BRONZE', + SILVER = 'SILVER', + GOLD = 'GOLD', + PLATINUM = 'PLATINUM', + DIAMOND = 'DIAMOND', } export enum LeaderboardPnlSortBy { @@ -130,6 +144,12 @@ export enum LeaderboardPnlSortBy { PERCENT = 'PERCENT', } +export enum LeaguesExpectedOutcome { + PROMOTION = 'PROMOTION', + RELEGATION = 'RELEGATION', + SAME_LEAGUE = 'SAME_LEAGUE', +} + // ============ API Request Types ============ interface ApiStarkwareSigned { @@ -425,6 +445,7 @@ export interface FastWithdrawalsResponseObject { export interface LeaderboardPnlResponseObject { topPnls: LeaderboardPnl[]; + numParticipants: number; startedAt: ISO8601 | null; endsAt: ISO8601 | null; updatedAt: ISO8601; @@ -437,6 +458,7 @@ export interface LeaderboardPnl { percentPnl: string; absoluteRank: number | null; percentRank: number | null; + seasonExpectedOutcome: LeaguesExpectedOutcome | null; } export interface AccountLeaderboardPnlResponseObject { @@ -444,10 +466,12 @@ export interface AccountLeaderboardPnlResponseObject { percentPnl: string; absoluteRank: number | null; percentRank: number | null; - updatedAt: ISO8601 | null, - startedAt: ISO8601 | null, - endsAt: ISO8601 | null, + updatedAt: ISO8601 | null; + startedAt: ISO8601 | null; + endsAt: ISO8601 | null; accountId: string; + period: LeaderboardPnlPeriod; + seasonExpectedOutcome: LeaguesExpectedOutcome | null; } export interface LiquidityProviderInfo { From f5589b4a9c1501a7a318a5500d5195edfe7e28b2 Mon Sep 17 00:00:00 2001 From: James Jia Date: Fri, 28 Jan 2022 09:25:33 -0800 Subject: [PATCH 139/180] v1.6.1 update leaderboard endpoints with new fields (#155) --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 15 ++++++++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 089a511..d117e85 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.0", + "version": "1.6.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9f6f1b8..f349ff4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.0", + "version": "1.6.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index 6bd2baa..0b834a2 100644 --- a/src/types.ts +++ b/src/types.ts @@ -146,8 +146,11 @@ export enum LeaderboardPnlSortBy { export enum LeaguesExpectedOutcome { PROMOTION = 'PROMOTION', - RELEGATION = 'RELEGATION', + DEMOTION = 'DEMOTION', SAME_LEAGUE = 'SAME_LEAGUE', + + // deprecated. + RELEGATION = 'RELEGATION', } // ============ API Request Types ============ @@ -443,12 +446,21 @@ export interface FastWithdrawalsResponseObject { }; } +// some fields are leagues specific export interface LeaderboardPnlResponseObject { topPnls: LeaderboardPnl[]; numParticipants: number; startedAt: ISO8601 | null; endsAt: ISO8601 | null; updatedAt: ISO8601; + seasonNumber: number | null; + prizePool: number | null; + numHedgiesWinners: number | null; + numPrizeWinners: number | null; + ratioPromoted: number | null; + ratioDemoted: number | null; + minimumEquity: number | null; + minimumDYDXTokens: number | null; } export interface LeaderboardPnl { @@ -472,6 +484,7 @@ export interface AccountLeaderboardPnlResponseObject { accountId: string; period: LeaderboardPnlPeriod; seasonExpectedOutcome: LeaguesExpectedOutcome | null; + seasonNumber: number | null; } export interface LiquidityProviderInfo { From 59ed970c1cb142a7d91db62c911681e47b697e24 Mon Sep 17 00:00:00 2001 From: James Jia Date: Thu, 3 Feb 2022 10:39:32 -0800 Subject: [PATCH 140/180] v1.6.2 add DAILY_COMPETITION, hedgieWon, prizeWon (#158) --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index d117e85..13e6206 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.1", + "version": "1.6.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f349ff4..1126df1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.1", + "version": "1.6.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index 0b834a2..4b7c58c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -123,6 +123,7 @@ export enum AccountLeaderboardPnlPeriod { MONTHLY = 'MONTHLY', ALL_TIME = 'ALL_TIME', COMPETITION = 'COMPETITION', + DAILY_COMPETITION = 'DAILY_COMPETITION', LEAGUES = 'LEAGUES', } @@ -132,6 +133,7 @@ export enum LeaderboardPnlPeriod { MONTHLY = 'MONTHLY', ALL_TIME = 'ALL_TIME', COMPETITION = 'COMPETITION', + DAILY_COMPETITION = 'DAILY_COMPETITION', BRONZE = 'BRONZE', SILVER = 'SILVER', GOLD = 'GOLD', @@ -471,6 +473,8 @@ export interface LeaderboardPnl { absoluteRank: number | null; percentRank: number | null; seasonExpectedOutcome: LeaguesExpectedOutcome | null; + hedgieWon: number | null; + prizeWon: string | null; } export interface AccountLeaderboardPnlResponseObject { @@ -485,6 +489,8 @@ export interface AccountLeaderboardPnlResponseObject { period: LeaderboardPnlPeriod; seasonExpectedOutcome: LeaguesExpectedOutcome | null; seasonNumber: number | null; + hedgieWon: number | null; + prizeWon: string | null; } export interface LiquidityProviderInfo { From f171f36fc8b27efaa005cbeaece364a10364f173 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Thu, 3 Feb 2022 13:31:21 -0800 Subject: [PATCH 141/180] v1.6.3: expose hedgie endpoints (#159) --- package-lock.json | 2 +- package.json | 2 +- src/modules/public.ts | 35 +++++++++++++++++++++++++++++++++++ src/types.ts | 11 +++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 13e6206..dc8f73e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.2", + "version": "1.6.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1126df1..01a542a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.2", + "version": "1.6.3", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/public.ts b/src/modules/public.ts index b51954c..7e6dfbc 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -1,3 +1,4 @@ +import { HedgiePeriodResponseObject, NftRevealType } from '..'; import { generateQueryPath } from '../helpers/request-helpers'; import { axiosRequest } from '../lib/axios'; import { @@ -268,6 +269,40 @@ export default class Public { ); } + /** + * @description get currently revealed Hedgies + */ + getCurrentlyRevealedHedgies(): Promise<{ + daily?: HedgiePeriodResponseObject, + weekly?: HedgiePeriodResponseObject, + }> { + return this.get('hedgies/current', {}); + } + + /** + * @description get historically revealed Hedgies + */ + getHistoricallyRevealedHedgies({ + nftRevealType, + start, + end, + }: { + nftRevealType: NftRevealType, + start?: number, + end?: number, + }): Promise<{ + historicalTokenIds: HedgiePeriodResponseObject[], + }> { + return this.get( + 'hedgies/history', + { + nftRevealType, + start, + end, + }, + ); + } + /** * @description get api server time as iso and as epoch in seconds with MS */ diff --git a/src/types.ts b/src/types.ts index 4b7c58c..dee37f8 100644 --- a/src/types.ts +++ b/src/types.ts @@ -155,6 +155,11 @@ export enum LeaguesExpectedOutcome { RELEGATION = 'RELEGATION', } +export enum NftRevealType { + DAY = 'DAY', + WEEK = 'WEEK', +} + // ============ API Request Types ============ interface ApiStarkwareSigned { @@ -586,6 +591,12 @@ export interface PublicRetroactiveMiningRewardsResponseObject { targetVolume: string, } +export interface HedgiePeriodResponseObject { + blockNumber: number, + competitionPeriod: number, + tokenIds: string[], +} + // ============ API Response Field Types ============ enum MarketStatus { From 34aa0e34ee55253faf960a1b70b3f3c774615997 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Thu, 3 Feb 2022 13:40:20 -0800 Subject: [PATCH 142/180] v1.6.4: lint client (#160) --- package-lock.json | 2 +- package.json | 2 +- src/modules/public.ts | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index dc8f73e..859d218 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.3", + "version": "1.6.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 01a542a..d29570e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.3", + "version": "1.6.4", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/public.ts b/src/modules/public.ts index 7e6dfbc..91fe05d 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -1,4 +1,3 @@ -import { HedgiePeriodResponseObject, NftRevealType } from '..'; import { generateQueryPath } from '../helpers/request-helpers'; import { axiosRequest } from '../lib/axios'; import { @@ -20,6 +19,8 @@ import { LeaderboardPnlPeriod, LeaderboardPnlResponseObject, PublicRetroactiveMiningRewardsResponseObject, + NftRevealType, + HedgiePeriodResponseObject, } from '../types'; export default class Public { From e4d4ef09c627d5a4083cb6bb476ed19c8812c7f1 Mon Sep 17 00:00:00 2001 From: Eric Semeniuc <3838856+esemeniuc@users.noreply.github.com> Date: Fri, 4 Mar 2022 15:03:00 -0800 Subject: [PATCH 143/180] update nsb-dev (#165) Co-authored-by: Eric Semeniuc --- package-lock.json | 2534 +++++++++++++++++++++++++-------------------- package.json | 4 +- 2 files changed, 1440 insertions(+), 1098 deletions(-) diff --git a/package-lock.json b/package-lock.json index 859d218..b9f5e7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,18 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.4", + "version": "1.6.5", "lockfileVersion": 1, "requires": true, "dependencies": { + "@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" + } + }, "@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", @@ -13,42 +22,57 @@ "@babel/highlight": "^7.10.4" } }, + "@babel/compat-data": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", + "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", + "dev": true + }, "@babel/core": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", - "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.10", + "version": "7.17.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", + "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.17.2", + "@babel/parser": "^7.17.3", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "semver": "^6.3.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" } }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -61,26 +85,20 @@ "dev": true }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", + "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", "dev": true, "requires": { - "@babel/types": "^7.12.11", + "@babel/types": "^7.17.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -93,130 +111,143 @@ } } }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "@babel/helper-compilation-targets": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", "dev": true, "requires": { - "@babel/types": "^7.12.10" + "@babel/types": "^7.16.7" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", - "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "dev": true, "requires": { - "@babel/types": "^7.12.7" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" } }, - "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "dev": true, "requires": { - "@babel/types": "^7.12.5" + "@babel/types": "^7.16.7" } }, - "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" + "@babel/types": "^7.16.7" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", - "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dev": true, "requires": { - "@babel/types": "^7.12.10" + "@babel/types": "^7.16.7" } }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", - "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", + "@babel/helper-module-transforms": { + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz", + "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.7", - "@babel/helper-optimise-call-expression": "^7.12.10", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.11" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" } }, + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "dev": true + }, "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.16.7" } }, "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dev": true, "requires": { - "@babel/types": "^7.12.11" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", "dev": true }, "@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", + "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0" } }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -256,6 +287,12 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -274,9 +311,9 @@ } }, "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", + "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -298,12 +335,12 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-import-meta": { @@ -379,46 +416,67 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + } } }, "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -439,13 +497,12 @@ } }, "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, @@ -466,24 +523,25 @@ } }, "@dydxprotocol/node-service-base-dev": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@dydxprotocol/node-service-base-dev/-/node-service-base-dev-0.0.11.tgz", - "integrity": "sha512-tF73NtG7hCdmKXL7tkpOSKWWH6/eMXNWIRJZD/44MbqcX6hdcVklFLWpuqYl9jxCKeX8Qz4W4NLbCykJd89W5w==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@dydxprotocol/node-service-base-dev/-/node-service-base-dev-0.2.5.tgz", + "integrity": "sha512-vo3lrFwMoU5LuSD16RIHa6Pdnu5Pq9aAUOS7r24UiI03uk4r+APGWHP9FTsCxrs6pYR4WPxfB0yrSQ+whS0RAQ==", "dev": true, "requires": { - "@types/jest": "^26.0.13", + "@types/jest": "^26.0.19", "@types/lodash": "^4.14.161", "@types/node": "^14.6.4", - "@typescript-eslint/eslint-plugin": "^4.0.1", - "@typescript-eslint/parser": "^4.0.1", + "@typescript-eslint/eslint-plugin": "^4.32.0", + "@typescript-eslint/parser": "^4.32.0", "coveralls": "^3.1.0", "dotenv-flow": "^3.2.0", "eslint": "^7.8.0", "eslint-config-airbnb-typescript": "^9.0.0", "eslint-plugin-import": "^2.22.0", - "jest": "^26.4.2", + "eslint-plugin-no-only-tests": "2.4.0", + "jest": "^26.6.3", "nodemon": "^2.0.4", - "typescript": "^4.0.2" + "typescript": "^4.4.3" } }, "@dydxprotocol/starkex-eth": { @@ -540,27 +598,26 @@ } }, "@eslint/eslintrc": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", - "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.1.1", "espree": "^7.3.0", - "globals": "^12.1.0", + "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", - "lodash": "^4.17.19", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -1440,6 +1497,40 @@ "@ethersproject/strings": "^5.0.4" } }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1511,9 +1602,9 @@ } }, "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, "@jest/console": { @@ -1708,29 +1799,51 @@ "chalk": "^4.0.0" } }, + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, @@ -1740,9 +1853,9 @@ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, "@sinonjs/commons": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", - "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -1765,10 +1878,16 @@ "defer-to-connect": "^1.0.1" } }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, "@types/babel__core": { - "version": "7.1.12", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", - "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", + "version": "7.1.18", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", + "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1779,18 +1898,18 @@ } }, "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1798,9 +1917,9 @@ } }, "@types/babel__traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", - "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -1851,18 +1970,18 @@ } }, "@types/graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "dev": true, "requires": { "@types/node": "*" } }, "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "@types/istanbul-lib-report": { @@ -1875,18 +1994,18 @@ } }, "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" } }, "@types/jest": { - "version": "26.0.19", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.19.tgz", - "integrity": "sha512-jqHoirTG61fee6v6rwbnEuKhpSKih0tuhqeFbCmMmErhtu3BYlOZaXWjffgOstMM4S/3iQD31lI5bGLTrs97yQ==", + "version": "26.0.24", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", + "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", "dev": true, "requires": { "jest-diff": "^26.0.0", @@ -1894,9 +2013,9 @@ } }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "@types/json5": { @@ -1906,9 +2025,9 @@ "dev": true }, "@types/lodash": { - "version": "4.14.167", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.167.tgz", - "integrity": "sha512-w7tQPjARrvdeBkX/Rwg95S592JwxqOjmms3zWQ0XZgSyxSLdzWaYH3vErBhdVS/lRBX7F8aBYcYJYTr5TMGOzw==", + "version": "4.14.179", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.179.tgz", + "integrity": "sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w==", "dev": true }, "@types/node": { @@ -1917,9 +2036,9 @@ "integrity": "sha512-BfbIHP9IapdupGhq/hc+jT5dyiBVZ2DdeC5WwJWQWDb0GijQlzUFAeIQn/2GtvZcd2HVUU7An8felIICFTC2qg==" }, "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, "@types/pbkdf2": { @@ -1931,9 +2050,9 @@ } }, "@types/prettier": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.6.tgz", - "integrity": "sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", + "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==", "dev": true }, "@types/ref-napi": { @@ -1963,9 +2082,9 @@ } }, "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, "@types/uuid": { @@ -1975,39 +2094,40 @@ "dev": true }, "@types/yargs": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", - "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.12.0.tgz", - "integrity": "sha512-wHKj6q8s70sO5i39H2g1gtpCXCvjVszzj6FFygneNFyIAxRvNSVz9GML7XpqrB9t7hNutXw+MHnLN/Ih6uyB8Q==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", + "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.12.0", - "@typescript-eslint/scope-manager": "4.12.0", - "debug": "^4.1.1", + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", + "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -2022,35 +2142,35 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.12.0.tgz", - "integrity": "sha512-MpXZXUAvHt99c9ScXijx7i061o5HEjXltO+sbYfZAAHxv3XankQkPaNi5myy0Yh0Tyea3Hdq1pi7Vsh0GJb0fA==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", + "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.12.0", - "@typescript-eslint/types": "4.12.0", - "@typescript-eslint/typescript-estree": "4.12.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.12.0.tgz", - "integrity": "sha512-9XxVADAo9vlfjfoxnjboBTxYOiNY93/QuvcPgsiKvHxW6tOZx1W4TvkIQ2jB3k5M0pbFP5FlXihLK49TjZXhuQ==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", + "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.12.0", - "@typescript-eslint/types": "4.12.0", - "@typescript-eslint/typescript-estree": "4.12.0", - "debug": "^4.1.1" + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "debug": "^4.3.1" }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -2065,41 +2185,40 @@ } }, "@typescript-eslint/scope-manager": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.12.0.tgz", - "integrity": "sha512-QVf9oCSVLte/8jvOsxmgBdOaoe2J0wtEmBr13Yz0rkBNkl5D8bfnf6G4Vhox9qqMIoG7QQoVwd2eG9DM/ge4Qg==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", "dev": true, "requires": { - "@typescript-eslint/types": "4.12.0", - "@typescript-eslint/visitor-keys": "4.12.0" + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" } }, "@typescript-eslint/types": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.12.0.tgz", - "integrity": "sha512-N2RhGeheVLGtyy+CxRmxdsniB7sMSCfsnbh8K/+RUIXYYq3Ub5+sukRCjVE80QerrUBvuEvs4fDhz5AW/pcL6g==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.12.0.tgz", - "integrity": "sha512-gZkFcmmp/CnzqD2RKMich2/FjBTsYopjiwJCroxqHZIY11IIoN0l5lKqcgoAPKHt33H2mAkSfvzj8i44Jm7F4w==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", "dev": true, "requires": { - "@typescript-eslint/types": "4.12.0", - "@typescript-eslint/visitor-keys": "4.12.0", - "debug": "^4.1.1", - "globby": "^11.0.1", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -2114,12 +2233,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.12.0.tgz", - "integrity": "sha512-hVpsLARbDh4B9TKYz5cLbcdMIOAoBYgFPCSP9FFS/liSF+b33gVNq8JHY3QGhHNVz85hObvL7BEYLlgx553WCw==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.12.0", + "@typescript-eslint/types": "4.33.0", "eslint-visitor-keys": "^2.0.0" } }, @@ -2161,9 +2280,9 @@ } }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true }, "acorn-walk": { @@ -2177,6 +2296,32 @@ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2189,52 +2334,12 @@ } }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "string-width": "^4.1.0" } }, "ansi-colors": { @@ -2244,26 +2349,26 @@ "dev": true }, "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" }, "dependencies": { "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true } } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -2276,9 +2381,9 @@ } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -2318,16 +2423,16 @@ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "array-includes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz", - "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "get-intrinsic": "^1.0.1", - "is-string": "^1.0.5" + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" } }, "array-union": { @@ -2343,14 +2448,14 @@ "dev": true }, "array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" + "es-abstract": "^1.19.0" } }, "asn1": { @@ -2447,16 +2552,37 @@ } }, "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "babel-plugin-jest-hoist": { @@ -2502,9 +2628,9 @@ } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "base": { @@ -2607,9 +2733,9 @@ "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" }, "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "bindings": { @@ -2678,29 +2804,36 @@ } }, "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dev": true, "requires": { "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" }, "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } } } @@ -2801,6 +2934,19 @@ "safe-buffer": "^5.2.0" } }, + "browserslist": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz", + "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001312", + "electron-to-chromium": "^1.4.71", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + } + }, "bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -2838,9 +2984,9 @@ } }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "buffer-to-arraybuffer": { @@ -2920,13 +3066,13 @@ } }, "call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" + "get-intrinsic": "^1.0.2" } }, "callsites": { @@ -2941,6 +3087,12 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "caniuse-lite": { + "version": "1.0.30001313", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001313.tgz", + "integrity": "sha512-rI1UN0koZUiKINjysQDuRi2VeSCce3bYJNmDcj3PIKREiAmjakugBul1QSkg/fPrlULYl6oWfGg3PbgOSY9X4Q==", + "dev": true + }, "capture-exit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", @@ -2956,9 +3108,9 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -2972,19 +3124,19 @@ "dev": true }, "chokidar": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.0.tgz", - "integrity": "sha512-JgQM9JS92ZbFR4P90EvmzNpSGhpPBGBSj10PILeDyYFwp4h2/D9OM03wsJ4zW1fEp4ka2DGrnUeD7FuvQ2aZ2Q==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" } }, "chownr": { @@ -3161,15 +3313,9 @@ } }, "confusing-browser-globals": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", - "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", "dev": true }, "content-disposition": { @@ -3203,9 +3349,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -3255,9 +3401,9 @@ } }, "coveralls": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz", - "integrity": "sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", + "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", "dev": true, "requires": { "js-yaml": "^3.13.1", @@ -3409,9 +3555,9 @@ "dev": true }, "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", "dev": true }, "decode-uri-component": { @@ -3434,9 +3580,9 @@ "dev": true }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "deepmerge": { @@ -3603,9 +3749,9 @@ } }, "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", "dev": true }, "dotenv-flow": { @@ -3636,6 +3782,12 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "electron-to-chromium": { + "version": "1.4.75", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.75.tgz", + "integrity": "sha512-LxgUNeu3BVU7sXaKjUDD9xivocQLxFtq6wgERrutdY/yIOps3ODOZExK1jg8DTEg4U8TUCb5MLGeWFOYuxjF3Q==", + "dev": true + }, "elliptic": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", @@ -3718,23 +3870,31 @@ } }, "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", "dev": true, "requires": { + "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" } }, "es-to-primitive": { @@ -3782,6 +3942,12 @@ "ext": "^1.1.2" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "escape-goat": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", @@ -3794,24 +3960,30 @@ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, "requires": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", + "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" }, "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -3854,29 +4026,32 @@ } }, "eslint": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.17.0.tgz", - "integrity": "sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.2.2", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", "espree": "^7.3.1", - "esquery": "^1.2.0", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^6.0.0", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -3884,7 +4059,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.19", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -3893,20 +4068,37 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^6.0.4", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" } }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -4012,14 +4204,23 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" } }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", @@ -4035,58 +4236,97 @@ } }, "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dev": true, "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } } }, "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", + "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", "dev": true, "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" + "debug": "^3.2.7", + "find-up": "^2.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } } }, "eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", + "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", "dev": true, "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.2", "has": "^1.0.3", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.12.0" }, "dependencies": { "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "^2.0.2" } } } }, + "eslint-plugin-no-only-tests": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.4.0.tgz", + "integrity": "sha512-azP9PwQYfGtXJjW273nIxQH9Ygr+5/UyeW2wEjYoDtVYPI+WPKwbj0+qcAKYUXFZLRumq4HKkFaoDBAwBoXImQ==", + "dev": true + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -4098,26 +4338,18 @@ } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "eslint-visitor-keys": "^2.0.0" } }, "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, "espree": { @@ -4146,18 +4378,18 @@ "dev": true }, "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -4172,9 +4404,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -4451,9 +4683,9 @@ } }, "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", "dev": true }, "execa": { @@ -4743,17 +4975,16 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -4768,9 +4999,9 @@ "dev": true }, "fastq": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", - "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -4814,9 +5045,9 @@ } }, "file-entry-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", - "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { "flat-cache": "^3.0.4" @@ -4870,9 +5101,9 @@ } }, "flatted": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz", - "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, "follow-redirects": { @@ -4945,9 +5176,9 @@ "dev": true }, "fsevents": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", - "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -4976,9 +5207,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", - "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -5000,6 +5231,16 @@ "pump": "^3.0.0" } }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "get-symbol-from-current-process-h": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-symbol-from-current-process-h/-/get-symbol-from-current-process-h-1.0.2.tgz", @@ -5028,9 +5269,9 @@ } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -5042,9 +5283,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -5060,34 +5301,34 @@ } }, "global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", "dev": true, "requires": { - "ini": "1.3.7" + "ini": "2.0.0" } }, "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" } }, "globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" } }, @@ -5144,6 +5385,12 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5156,9 +5403,9 @@ "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, "has-to-string-tag-x": { @@ -5169,6 +5416,15 @@ "has-symbol-support-x": "^1.4.1" } }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -5257,9 +5513,9 @@ } }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "html-encoding-sniffer": { @@ -5306,6 +5562,34 @@ "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -5316,6 +5600,33 @@ "sshpk": "^1.7.0" } }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -5351,9 +5662,9 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "ignore-by-default": { @@ -5379,73 +5690,13 @@ "dev": true }, "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - } } }, "imurmurhash": { @@ -5470,16 +5721,21 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } }, "ipaddr.js": { "version": "1.9.1", @@ -5512,6 +5768,15 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -5521,6 +5786,16 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -5528,9 +5803,9 @@ "dev": true }, "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true }, "is-ci": { @@ -5543,9 +5818,9 @@ } }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "dev": true, "requires": { "has": "^1.0.3" @@ -5572,10 +5847,13 @@ } }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-descriptor": { "version": "0.1.6", @@ -5597,9 +5875,9 @@ } }, "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "optional": true }, @@ -5633,9 +5911,9 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -5647,25 +5925,25 @@ "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" }, "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dev": true, "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" } }, "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", "dev": true }, "is-number": { @@ -5674,6 +5952,15 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", @@ -5686,9 +5973,9 @@ "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" }, "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, "is-plain-obj": { @@ -5706,18 +5993,19 @@ } }, "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-retry-allowed": { @@ -5725,24 +6013,33 @@ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.2" } }, "is-typedarray": { @@ -5750,6 +6047,15 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -5796,9 +6102,9 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-instrument": { @@ -5833,9 +6139,9 @@ } }, "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", @@ -5844,9 +6150,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -5861,9 +6167,9 @@ } }, "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -5951,9 +6257,9 @@ } }, "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "npm-run-path": { @@ -6185,100 +6491,6 @@ "read-pkg-up": "^7.0.1", "resolve": "^1.18.1", "slash": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - } } }, "jest-resolve-dependencies": { @@ -6426,9 +6638,9 @@ }, "dependencies": { "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true } } @@ -6486,48 +6698,66 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsdom": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "dev": true, "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", + "abab": "^2.0.5", + "acorn": "^8.2.4", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", - "cssstyle": "^2.2.0", + "cssstyle": "^2.3.0", "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", + "decimal.js": "^10.2.1", "domexception": "^2.0.1", - "escodegen": "^1.14.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", + "tough-cookie": "^4.0.0", "w3c-hr-time": "^1.0.2", "w3c-xmlserializer": "^2.0.0", "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", "xml-name-validator": "^3.0.0" }, "dependencies": { - "tough-cookie": { + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + }, + "form-data": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" } } } @@ -6658,24 +6888,12 @@ "type-check": "~0.4.0" } }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -6691,10 +6909,16 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", "dev": true }, "log-driver": { @@ -6743,12 +6967,12 @@ } }, "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "requires": { - "tmpl": "1.0.x" + "tmpl": "1.0.5" } }, "map-cache": { @@ -6804,13 +7028,13 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "miller-rabin": { @@ -6877,9 +7101,9 @@ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -7054,16 +7278,10 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, "node-notifier": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz", - "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", "dev": true, "optional": true, "requires": { @@ -7075,22 +7293,28 @@ "which": "^2.0.2" } }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "dev": true + }, "nodemon": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", - "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", "dev": true, "requires": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", + "chokidar": "^3.5.2", + "debug": "^3.2.7", "ignore-by-default": "^1.0.1", "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", + "pstree.remy": "^1.1.8", "semver": "^5.7.1", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" }, "dependencies": { "debug": { @@ -7252,9 +7476,9 @@ } }, "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "dev": true }, "object-keys": { @@ -7285,15 +7509,14 @@ } }, "object.entries": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" + "es-abstract": "^1.19.1" } }, "object.pick": { @@ -7306,15 +7529,14 @@ } }, "object.values": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", - "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" + "es-abstract": "^1.19.1" } }, "oboe": { @@ -7459,18 +7681,21 @@ "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" }, "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { - "error-ex": "^1.2.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, "parseurl": { @@ -7503,9 +7728,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-to-regexp": { @@ -7536,34 +7761,82 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true }, "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "find-up": "^2.1.0" + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } } }, "posix-character-classes": { @@ -7607,9 +7880,9 @@ "dev": true }, "prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "requires": { "kleur": "^3.0.3", @@ -7694,6 +7967,12 @@ "strict-uri-encode": "^1.0.0" } }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -7739,6 +8018,12 @@ "strip-json-comments": "~2.0.1" }, "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -7748,41 +8033,97 @@ } }, "react-is": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", - "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "dependencies": { - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true } } }, "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } } }, "readable-stream": { @@ -7796,9 +8137,9 @@ } }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -7864,9 +8205,9 @@ } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "registry-auth-token": { @@ -7894,9 +8235,9 @@ "dev": true }, "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "dev": true }, "repeat-string": { @@ -7939,26 +8280,6 @@ } } }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -7978,13 +8299,14 @@ "dev": true }, "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { @@ -8092,10 +8414,13 @@ "dev": true }, "run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } }, "safe-buffer": { "version": "5.2.1", @@ -8282,9 +8607,9 @@ } }, "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -8427,10 +8752,21 @@ "dev": true, "optional": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "simple-concat": { @@ -8604,9 +8940,9 @@ } }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -8614,9 +8950,9 @@ } }, "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, "spdx-correct": { @@ -8646,9 +8982,9 @@ } }, "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", "dev": true }, "split-string": { @@ -8683,9 +9019,9 @@ } }, "stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" @@ -8746,21 +9082,15 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-length": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", - "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "requires": { "char-regex": "^1.0.2", @@ -8768,33 +9098,33 @@ } }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, "string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, @@ -8807,12 +9137,12 @@ } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -8857,15 +9187,21 @@ } }, "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", "dev": true, "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "swarm-js": { "version": "0.1.40", "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", @@ -8937,21 +9273,22 @@ "dev": true }, "table": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", - "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", "dev": true, "requires": { - "ajv": "^7.0.2", - "lodash": "^4.17.20", + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "dependencies": { "ajv": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz", - "integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -8982,12 +9319,6 @@ "yallist": "^3.0.3" } }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true - }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -9027,9 +9358,9 @@ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-fast-properties": { @@ -9108,18 +9439,18 @@ } }, "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, "requires": { "punycode": "^2.1.1" } }, "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.13.0.tgz", + "integrity": "sha512-nWuffZppoaYK0vQ1SQmkSsQzJoHA4s6uzdb2waRpD806x9yfq153AdVsWz4je2qZcW+pENrMQXbGQ3sMCkXuhw==", "dev": true, "requires": { "@types/json5": "^0.0.29", @@ -9135,9 +9466,9 @@ "dev": true }, "tsutils": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.19.0.tgz", - "integrity": "sha512-A7BaLUPvcQ1cxVu72YfD+UMI3SQPTDv/w4ol6TOwLyI0hwfG9EC+cYlhdflJTmtYTgZ3KqdPSe/otxU4K3kArg==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -9177,9 +9508,9 @@ "dev": true }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "type-is": { @@ -9200,9 +9531,9 @@ } }, "typescript": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", - "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", + "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", "dev": true }, "ultron": { @@ -9210,15 +9541,24 @@ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" }, - "undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "dev": true, "requires": { - "debug": "^2.2.0" + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" } }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, "underscore": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", @@ -9296,36 +9636,25 @@ } }, "update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", "dev": true, "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", + "boxen": "^5.0.0", + "chalk": "^4.1.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "uri-js": { @@ -9402,15 +9731,15 @@ "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==" }, "v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "v8-to-istanbul": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", - "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -9475,12 +9804,12 @@ } }, "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "requires": { - "makeerror": "1.0.x" + "makeerror": "1.0.12" } }, "web3": { @@ -9850,13 +10179,13 @@ "dev": true }, "whatwg-url": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", + "lodash": "^4.7.0", + "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" } }, @@ -9869,6 +10198,19 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -9919,9 +10261,9 @@ } }, "ws": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", - "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", "dev": true }, "xdg-basedir": { @@ -9989,9 +10331,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yaeti": { diff --git a/package.json b/package.json index d29570e..fd1e56a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.4", + "version": "1.6.5", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -36,7 +36,7 @@ "web3": "1.3.0" }, "devDependencies": { - "@dydxprotocol/node-service-base-dev": "0.0.11", + "@dydxprotocol/node-service-base-dev": "0.2.5", "@types/es6-promisify": "^6.0.0", "@types/ffi-napi": "^4.0.4", "@types/uuid": "^8.3.0" From 87c305e4b70ac549a196bc244c7be1703d1963e6 Mon Sep 17 00:00:00 2001 From: Eric Semeniuc <3838856+esemeniuc@users.noreply.github.com> Date: Fri, 4 Mar 2022 15:25:56 -0800 Subject: [PATCH 144/180] fix linting (#166) Co-authored-by: Eric Semeniuc --- .eslintrc.js | 5 +++++ jest.config.js | 2 +- package-lock.json | 2 +- package.json | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index d90b8e8..7a3bcba 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -12,5 +12,10 @@ module.exports = { // Extend the base rule set. rules: { + // These lint checks triggered for https://linear.app/dydx/issue/BAC-2265 + // Ignore them for now since we violate them across the codebase too often + '@typescript-eslint/require-await': 'off', + '@typescript-eslint/strict-boolean-expressions': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', }, }; diff --git a/jest.config.js b/jest.config.js index 6bd4789..0650272 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,5 +1,5 @@ module.exports = { /* eslint-disable global-require */ - ...require('./node_modules/@dydxprotocol/node-service-base-dev/jest.config.js'), + ...require('./node_modules/@dydxprotocol/node-service-base-dev/jest.config'), name: 'v3-client', }; diff --git a/package-lock.json b/package-lock.json index b9f5e7e..22db3fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.5", + "version": "1.6.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index fd1e56a..cf3ebcf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.5", + "version": "1.6.6", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { From a577027abe82e00a68b9e42f9767b87ce2cb2442 Mon Sep 17 00:00:00 2001 From: "Eugene Y. Q. Shen" Date: Thu, 10 Mar 2022 09:48:00 -0800 Subject: [PATCH 145/180] v1.6.7 add getInsuranceFundBalance endpoint [BAC-1372] (#167) * v1.6.7 add getInsuranceFundBalance endpoint [BAC-1372] * dydx --- package-lock.json | 2 +- package.json | 2 +- src/modules/public.ts | 9 ++++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 22db3fc..8757cd8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.6", + "version": "1.6.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index cf3ebcf..c0c010d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.6", + "version": "1.6.7", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/public.ts b/src/modules/public.ts index 91fe05d..69f8c9b 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -325,7 +325,14 @@ export default class Public { } /** - * @description get global config variables for the exchange as a whole. + * @description get balance of the dYdX insurance fund + */ + async getInsuranceFundBalance(): Promise<{ balance: number }> { + return this.get('insurance-fund/balance', {}); + } + + /** + * @description get global config variables for the exchange as a whole. * This includes (but is not limited to) details on the exchange, including addresses, * fees, transfers, and rate limits. */ From 47301f0867f65dc6037a444ee7286d24b23203d4 Mon Sep 17 00:00:00 2001 From: James Jia Date: Thu, 10 Mar 2022 12:15:45 -0800 Subject: [PATCH 146/180] v1.6.7 restrictions endpoints [BAC-2336] [BAC-2365] (#168) --- src/modules/private.ts | 39 +++++++++++++++++++++++++++++++++++++++ src/types.ts | 24 ++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/src/modules/private.ts b/src/modules/private.ts index 78022b4..ce07988 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -56,6 +56,8 @@ import { TransferResponseObject, UserResponseObject, ActiveOrderResponseObject, + RestrictionResponseObject, + UserComplianceResponseObject, } from '../types'; import Clock from './clock'; @@ -883,6 +885,43 @@ export default class Private { ); } + /** + * @description get ethereum address restrictions on the dYdX protocol. + */ + async getRestrictions( + genericParams: GenericParams = {}, + ): Promise<{ restrictions: RestrictionResponseObject }> { + return this._get( + 'restrictions', + { + ...genericParams, + }, + ); + } + + /** + * @description comply to dYdX terms of service after a first offense. + */ + async postRestrictionsCompliance( + { + residenceCountry, + tradingCountry, + }: { + residenceCountry: ISO31661ALPHA2, + tradingCountry: ISO31661ALPHA2, + }, + genericParams: GenericParams = {}, + ): Promise<{ restrictions: UserComplianceResponseObject }> { + return this.post( + 'restrictions/compliance', + { + residenceCountry, + tradingCountry, + ...genericParams, + }, + ); + } + // ============ Signing ============ sign({ diff --git a/src/types.ts b/src/types.ts index dee37f8..d7f6081 100644 --- a/src/types.ts +++ b/src/types.ts @@ -160,6 +160,15 @@ export enum NftRevealType { WEEK = 'WEEK', } +export enum AddressRestrictionType { + RESTRICTED = 'RESTRICTED', + RESTRICTED_TRANSFER = 'RESTRICTED_TRANSFER', + RESTRICTED_WITHDRAWAL = 'RESTRICTED_WITHDRAWAL', + RESTRICTED_COUNTRY = 'RESTRICTED_COUNTRY', + FIRST_OFFENSE = 'FIRST_OFFENSE', + COMPLIED = 'COMPLIED', +} + // ============ API Request Types ============ interface ApiStarkwareSigned { @@ -597,6 +606,21 @@ export interface HedgiePeriodResponseObject { tokenIds: string[], } +export interface RestrictionResponseObject { + isRestricted: boolean, + restrictionType: AddressRestrictionType | null, + canTrade: boolean, + canTransfer: boolean, + canFastWithdraw: boolean, + canSlowWithdraw: boolean, + reason: string | null, +} + +export interface UserComplianceResponseObject { + isBanned: boolean, + reason: string | null, +} + // ============ API Response Field Types ============ enum MarketStatus { From 8aaaec53a072609aec177949fe8fc0fb8dfd473b Mon Sep 17 00:00:00 2001 From: Christopher-Li Date: Wed, 16 Mar 2022 12:50:00 -0700 Subject: [PATCH 147/180] v1.6.8 [BAC-2373] historical leaderboard pnls and profile endpoints (#170) * v1.6.8 [BAC-2373] historical leaderboard pnls and profile endpoints * nits --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 39 +++++++++++++++++++++++++++++++++++- src/modules/public.ts | 12 +++++++++++ src/types.ts | 45 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 97 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8757cd8..14152fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.7", + "version": "1.6.8", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c0c010d..40b08ee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.7", + "version": "1.6.8", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index ce07988..aaacc4a 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -58,6 +58,8 @@ import { ActiveOrderResponseObject, RestrictionResponseObject, UserComplianceResponseObject, + ProfilePrivateResponseObject, + HistoricalLeaderboardPnlsResponseObject, } from '../types'; import Clock from './clock'; @@ -280,7 +282,7 @@ export default class Private { } /** - * @description get leaderboard pnl for period and accountNumber 0 + * @description get leaderboard pnl for period * * @param period the period of pnls to retrieve */ @@ -300,6 +302,27 @@ export default class Private { ); } + /** + * @description get historical leaderboard pnls for period + * + * @param period the period of pnls to retrieve + */ + async getAccountHistoricalLeaderboardPnl( + period: AccountLeaderboardPnlPeriod, + params: { + limit?: number, + }, + genericParams: GenericParams = {}, + ): Promise { + return this._get( + `accounts/historical-leaderboard-pnls/${period}`, + { + ...params, + ...genericParams, + }, + ); + } + /** * @description get all positions for an account, meeting query parameters * @@ -922,6 +945,20 @@ export default class Private { ); } + /** + * @description get private profile information + */ + async getProfilePrivate( + genericParams: GenericParams = {}, + ): Promise { + return this._get( + 'profile/private', + { + ...genericParams, + }, + ); + } + // ============ Signing ============ sign({ diff --git a/src/modules/public.ts b/src/modules/public.ts index 69f8c9b..6aeac06 100644 --- a/src/modules/public.ts +++ b/src/modules/public.ts @@ -21,6 +21,7 @@ import { PublicRetroactiveMiningRewardsResponseObject, NftRevealType, HedgiePeriodResponseObject, + ProfilePublicResponseObject, } from '../types'; export default class Public { @@ -331,6 +332,17 @@ export default class Public { return this.get('insurance-fund/balance', {}); } + /** + * @description get public profile information + */ + async getProfilePublic({ + publicId, + }: { + publicId: string, + }): Promise { + return this.get(`profile/${publicId}`, {}); + } + /** * @description get global config variables for the exchange as a whole. * This includes (but is not limited to) details on the exchange, including addresses, diff --git a/src/types.ts b/src/types.ts index d7f6081..a5c87b5 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,3 +1,4 @@ +import { Decimal } from '@dydxprotocol/starkex-eth'; import { DydxAsset, DydxMarket, @@ -507,6 +508,25 @@ export interface AccountLeaderboardPnlResponseObject { prizeWon: string | null; } +export interface HistoricalLeaderboardPnlObject { + period: LeaderboardPnlPeriod, + absolutePnl: string, + percentPnl: string, + absoluteRank: number | null, + percentRank: number | null, + updatedAt: ISO8601, + startedAt: ISO8601 | null, + endsAt: ISO8601 | null, + seasonOutcome: LeaguesExpectedOutcome | null, + seasonNumber: number | null, + hedgieWon: number | null, + prizeWon: string | null, +} + +export interface HistoricalLeaderboardPnlsResponseObject { + leaderboardPnls: HistoricalLeaderboardPnlObject[]; +} + export interface LiquidityProviderInfo { availableFunds: string; starkKey: string; @@ -621,6 +641,31 @@ export interface UserComplianceResponseObject { reason: string | null, } +export interface ProfilePublicResponseObject { + username: string | null, + ethereumAddress: string | null, + DYDXHoldings: string | null, + hedgiesHeld: number[], + twitterHandle: string | null, + tradingLeagues: { + currentLeague: string | null, + currentLeagueRanking: number | null, + }, + tradingPnls: { + absolutePnl30D: string | null, + percentPnl30D: string | null, + }, +} + +export interface ProfilePrivateResponseObject extends ProfilePublicResponseObject { + publicId: string, + tradingRewards: { + curEpoch: number, + curEpochEstimatedRewards: Decimal, + prevEpochEstimatedRewards: Decimal, + }, +} + // ============ API Response Field Types ============ enum MarketStatus { From c01caa06864f1f4cf35d296d61e5e9ca5c774e29 Mon Sep 17 00:00:00 2001 From: Christopher-Li Date: Mon, 21 Mar 2022 10:30:06 -0700 Subject: [PATCH 148/180] v1.6.9: [BAC-2410]: Add additional profile fields (#171) --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 14152fb..ee58e00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.8", + "version": "1.6.9", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 40b08ee..48382e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.8", + "version": "1.6.9", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index a5c87b5..cabc7c5 100644 --- a/src/types.ts +++ b/src/types.ts @@ -645,6 +645,7 @@ export interface ProfilePublicResponseObject { username: string | null, ethereumAddress: string | null, DYDXHoldings: string | null, + stakedDYDXHoldings: string | null, hedgiesHeld: number[], twitterHandle: string | null, tradingLeagues: { @@ -654,6 +655,7 @@ export interface ProfilePublicResponseObject { tradingPnls: { absolutePnl30D: string | null, percentPnl30D: string | null, + volume30D: string, }, } From 2753ce575e75be56365dff0b5abfdcd45db69175 Mon Sep 17 00:00:00 2001 From: Christopher-Li Date: Wed, 23 Mar 2022 11:27:28 -0700 Subject: [PATCH 149/180] v1.7.0: [BAC-2439]: Fix response types (#172) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ee58e00..8ce389a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.9", + "version": "1.7.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 48382e9..722ab38 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.6.9", + "version": "1.7.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index aaacc4a..004c958 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -825,7 +825,7 @@ export default class Private { epoch?: number, }, genericParams: GenericParams = {}, - ): Promise<{ tradingRewards: TradingRewardsResponseObject }> { + ): Promise { return this._get( 'rewards/weight', { @@ -847,7 +847,7 @@ export default class Private { epoch?: number, }, genericParams: GenericParams = {}, - ): Promise<{ liquidityRewards: LiquidityProviderRewardsResponseObject }> { + ): Promise { return this._get( 'rewards/liquidity', { @@ -863,7 +863,7 @@ export default class Private { */ getRetroactiveMiningRewards( genericParams: GenericParams = {}, - ): Promise<{ retroactiveMiningRewards: RetroactiveMiningRewardsResponseObject }> { + ): Promise { return this._get( 'rewards/retroactive-mining', { From 8b2f52ae3bfcff785e260acb6f9e3ddacc7d6385 Mon Sep 17 00:00:00 2001 From: Christopher-Li Date: Wed, 23 Mar 2022 13:00:20 -0700 Subject: [PATCH 150/180] v1.8.0: [BAC-2439]: Fix restrictions endpoints response types (#173) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ce389a..f355370 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.7.0", + "version": "1.8.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 722ab38..a64eea1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.7.0", + "version": "1.8.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 004c958..967ae49 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -913,7 +913,7 @@ export default class Private { */ async getRestrictions( genericParams: GenericParams = {}, - ): Promise<{ restrictions: RestrictionResponseObject }> { + ): Promise { return this._get( 'restrictions', { @@ -934,7 +934,7 @@ export default class Private { tradingCountry: ISO31661ALPHA2, }, genericParams: GenericParams = {}, - ): Promise<{ restrictions: UserComplianceResponseObject }> { + ): Promise { return this.post( 'restrictions/compliance', { From fd2ccc9deb690e699703c79e96f3aeb4dabeccc2 Mon Sep 17 00:00:00 2001 From: samweinberg23 Date: Fri, 25 Mar 2022 07:08:54 -0700 Subject: [PATCH 151/180] v1.8.1: bump for new market batch (#175) --- package-lock.json | 50 ++++++++++++++++++++++++++++------------------- package.json | 4 ++-- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index f355370..e2a8ee1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.0", + "version": "1.8.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -575,9 +575,9 @@ } }, "@dydxprotocol/starkex-lib": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.1.4.tgz", - "integrity": "sha512-NRs5GbsxVaVdocZt7/egDJgLgRJ+lZBiowM9zI+LbLHT6ZxvFG83uv/8Qcb1Sm+wTaukfh3tLQ9khYLF9h1VDQ==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.1.8.tgz", + "integrity": "sha512-fxfbrHxczSoNye5G7U30lb2YuqlR4fhzul+w8dwvTymPThmEK+wfFXqoE57Y4MKkTIVRebZjWv1IJIv0+Kikog==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", @@ -586,7 +586,7 @@ "bip39": "^3.0.3", "bn.js": "5.1.3", "ethereum-cryptography": "^0.1.3", - "ffi-napi": "^3.1.0", + "ffi-napi": "^4.0.1", "hash.js": "^1.1.7" }, "dependencies": { @@ -5017,22 +5017,22 @@ } }, "ffi-napi": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ffi-napi/-/ffi-napi-3.1.0.tgz", - "integrity": "sha512-EsHO+sP2p/nUC/3l/l8m9niee1BLm4asUFDzkkBGR4kYVgp2KqdAYUomZhkKtzim4Fq7mcYHjpUaIHsMqs+E1g==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ffi-napi/-/ffi-napi-4.0.3.tgz", + "integrity": "sha512-PMdLCIvDY9mS32RxZ0XGb95sonPRal8aqRhLbeEtWKZTe2A87qRFG9HjOhvG8EX2UmQw5XNRMIOT+1MYlWmdeg==", "requires": { "debug": "^4.1.1", "get-uv-event-loop-napi-h": "^1.0.5", - "node-addon-api": "^2.0.0", + "node-addon-api": "^3.0.0", "node-gyp-build": "^4.2.1", - "ref-napi": "^2.0.1", + "ref-napi": "^2.0.1 || ^3.0.2", "ref-struct-di": "^1.1.0" }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -5041,6 +5041,11 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" } } }, @@ -8146,20 +8151,20 @@ } }, "ref-napi": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ref-napi/-/ref-napi-2.1.2.tgz", - "integrity": "sha512-aFl+vrIuLWUXMUTQGAwGAuSNLX3Ub5W3iVP8b7KyFFZUdn4+i4U1TXXTop0kCTUfGNu8glBGVz4lowkwMcPVVA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ref-napi/-/ref-napi-3.0.3.tgz", + "integrity": "sha512-LiMq/XDGcgodTYOMppikEtJelWsKQERbLQsYm0IOOnzhwE9xYZC7x8txNnFC9wJNOkPferQI4vD4ZkC0mDyrOA==", "requires": { "debug": "^4.1.1", "get-symbol-from-current-process-h": "^1.0.2", - "node-addon-api": "^2.0.0", + "node-addon-api": "^3.0.0", "node-gyp-build": "^4.2.1" }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -8168,6 +8173,11 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" } } }, diff --git a/package.json b/package.json index a64eea1..655599e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.0", + "version": "1.8.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -27,7 +27,7 @@ "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { "@dydxprotocol/starkex-eth": "0.12.2", - "@dydxprotocol/starkex-lib": "1.1.4", + "@dydxprotocol/starkex-lib": "1.1.8", "axios": "^0.21.1", "bignumber.js": "^9.0.1", "es6-promisify": "^6.0.1", From 16b171f49b0822b7c51d8d9290576a208893250a Mon Sep 17 00:00:00 2001 From: Christopher-Li Date: Mon, 28 Mar 2022 11:23:36 -0700 Subject: [PATCH 152/180] v1.8.2: [BAC-2441]: Add publicId to /v3/leaderboard-pnl endpoint (#174) * v1.8.1: [BAC-2441]: Add publicId to /v3/leaderboard-pnl endpoint * bump version --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index e2a8ee1..1f345b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.1", + "version": "1.8.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 655599e..b6c84c9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.1", + "version": "1.8.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index cabc7c5..cd77b7f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -483,6 +483,7 @@ export interface LeaderboardPnlResponseObject { export interface LeaderboardPnl { username: string; ethereumAddress: string | null; + publicId: string; absolutePnl: string; percentPnl: string; absoluteRank: number | null; From 2d908b14d7d42a091a2cbe3ab8fd93f862c5357c Mon Sep 17 00:00:00 2001 From: Christopher-Li Date: Tue, 19 Apr 2022 23:37:54 -0700 Subject: [PATCH 153/180] Add publicId to leaderboard-pnl endpoint (#180) From a2e424d634a44c7b61a83f090ae8dcf3eb294d0f Mon Sep 17 00:00:00 2001 From: Valentin Matter Date: Wed, 4 May 2022 19:16:34 +0200 Subject: [PATCH 154/180] Fix getFundingPayments' return type (#179) --- src/modules/private.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/private.ts b/src/modules/private.ts index 967ae49..a7b5aef 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -779,7 +779,7 @@ export default class Private { effectiveBeforeOrAt?: ISO8601, }, genericParams: GenericParams = {}, - ): Promise<{ fundingPayments: FundingResponseObject }> { + ): Promise<{ fundingPayments: FundingResponseObject[] }> { return this._get( 'funding', { From 117114f2e1f39ee7563c52ce5e36144e2ee79ed6 Mon Sep 17 00:00:00 2001 From: James Jia Date: Wed, 4 May 2022 13:20:14 -0400 Subject: [PATCH 155/180] v1.8.3 (#182) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1f345b8..184a740 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.2", + "version": "1.8.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b6c84c9..18442d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.2", + "version": "1.8.3", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { From 74bbae489003fc96dc4df2f3d200774b42867d4e Mon Sep 17 00:00:00 2001 From: Eric Semeniuc <3838856+esemeniuc@users.noreply.github.com> Date: Fri, 13 May 2022 09:04:28 -0700 Subject: [PATCH 156/180] v1.8.4 Add slippageTolerance field to fast withdrawals [BAC-2727] (#183) * add new param * tweaks * update ordering Co-authored-by: Eric Semeniuc --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 184a740..8953e44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.3", + "version": "1.8.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 18442d3..9d5f61b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.3", + "version": "1.8.4", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index cd77b7f..501de7c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -219,6 +219,7 @@ export interface ApiFastWithdrawal extends ApiStarkwareSigned { toAddress: string; lpPositionId: string; clientId: string; + slippageTolerance?: string; } export interface ApiFastWithdrawalParams extends ApiFastWithdrawal { From 752af4aaec8dd707bc3e632a5f4c59989f1fb8e0 Mon Sep 17 00:00:00 2001 From: jayy04 <103467857+jayy04@users.noreply.github.com> Date: Fri, 13 May 2022 16:53:10 -0400 Subject: [PATCH 157/180] v1.8.5 add generic params to createOrder (#184) * BAC-2651 support generic parameter in createOrder * version bump to 1.8.5 * reorder params --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8953e44..6ba1e46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.4", + "version": "1.8.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9d5f61b..b63cd5c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.4", + "version": "1.8.5", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index a7b5aef..efc7966 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -465,6 +465,7 @@ export default class Private { async createOrder( params: PartialBy, positionId: string, + genericParams: GenericParams = {}, ): Promise<{ order: OrderResponseObject }> { const clientId = params.clientId || generateRandomClientId(); @@ -495,7 +496,10 @@ export default class Private { return this.post( 'orders', - order, + { + ...order, + ...genericParams, + }, ); } From cc81d9eae97aa0ad171bda8815b28fd03f5c742a Mon Sep 17 00:00:00 2001 From: Christopher-Li Date: Wed, 18 May 2022 14:12:39 -0700 Subject: [PATCH 158/180] v1.8.6: Add AffiliateApplicationStatus to profile/private endpoint (#185) * v1.8.6: Add AffiliateApplicationStatus to profile/private endpoint * linter --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6ba1e46..b082715 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.5", + "version": "1.8.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b63cd5c..2522f4c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.5", + "version": "1.8.6", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index 501de7c..2330eb1 100644 --- a/src/types.ts +++ b/src/types.ts @@ -170,6 +170,13 @@ export enum AddressRestrictionType { COMPLIED = 'COMPLIED', } +export enum AffiliateApplicationStatuses { + APPROVED = 'APPROVED', + PENDING = 'PENDING', + REJECTED = 'REJECTED', + REJECTED_AND_BANNED = 'REJECTED_AND_BANNED' +} + // ============ API Request Types ============ interface ApiStarkwareSigned { @@ -663,6 +670,7 @@ export interface ProfilePublicResponseObject { export interface ProfilePrivateResponseObject extends ProfilePublicResponseObject { publicId: string, + affiliateApplicationStatus: AffiliateApplicationStatuses, tradingRewards: { curEpoch: number, curEpochEstimatedRewards: Decimal, From cecb404ad1c6dba1e298af77e383d4d509fcbba0 Mon Sep 17 00:00:00 2001 From: James Jia Date: Fri, 20 May 2022 18:51:14 -0400 Subject: [PATCH 159/180] v1.8.7 add new LiquidityRewards fields (#186) --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b082715..49afa2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.6", + "version": "1.8.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2522f4c..70a8651 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.6", + "version": "1.8.7", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index 2330eb1..768a827 100644 --- a/src/types.ts +++ b/src/types.ts @@ -603,9 +603,13 @@ export interface LiquidityProviderRewardsResponseObject { export interface LiquidityRewards { market: Market, + depthSpreadScore: string, uptime: string, + maxUptime: string, score: string, totalScore: string, + makerVolume: string, + totalMakerVolume: string, totalRewards: string, estimatedRewards: string, } From 29fe2815ca9f720a6ea25ddcf012f211792e51a1 Mon Sep 17 00:00:00 2001 From: James Jia Date: Tue, 24 May 2022 16:58:53 -0400 Subject: [PATCH 160/180] v1.8.8 linked users endpoints (#187) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 50 ++++++++++++++++++++++++++++++++++++++++++ src/types.ts | 30 +++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 49afa2e..6311b41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.7", + "version": "1.8.8", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 70a8651..37a4793 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.7", + "version": "1.8.8", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index efc7966..bf87c91 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -60,6 +60,9 @@ import { UserComplianceResponseObject, ProfilePrivateResponseObject, HistoricalLeaderboardPnlsResponseObject, + UserLinksResponseObject, + UserLinkRequestsResponseObject, + LinkAction, } from '../types'; import Clock from './clock'; @@ -963,6 +966,53 @@ export default class Private { ); } + /** + * @description get information on active linked users + */ + async getUserLinks( + genericParams: GenericParams = {}, + ): Promise { + return this._get( + 'users/links', + { + ...genericParams, + }, + ); + } + + /** + * @description send a link request action + */ + async sendLinkRequest( + params: { + action: LinkAction, + address: string, + }, + genericParams: GenericParams = {}, + ): Promise<{}> { + return this.post( + 'users/links', + { + ...params, + ...genericParams, + }, + ); + } + + /** + * @description get information on pending linked user requests + */ + async getUserPendingLinkRequests( + genericParams: GenericParams = {}, + ): Promise { + return this._get( + 'users/links/requests', + { + ...genericParams, + }, + ); + } + // ============ Signing ============ sign({ diff --git a/src/types.ts b/src/types.ts index 768a827..af4721f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -177,6 +177,19 @@ export enum AffiliateApplicationStatuses { REJECTED_AND_BANNED = 'REJECTED_AND_BANNED' } +export enum LinkType { + PRIMARY = 'PRIMARY', + SECONDARY = 'SECONDARY', +} + +export enum LinkAction { + CREATE_SECONDARY_REQUEST = 'CREATE_SECONDARY_REQUEST', + DELETE_SECONDARY_REQUEST = 'DELETE_SECONDARY_REQUEST', + ACCEPT_PRIMARY_REQUEST = 'ACCEPT_PRIMARY_REQUEST', + REJECT_PRIMARY_REQUEST = 'REJECT_PRIMARY_REQUEST', + REMOVE = 'REMOVE', +} + // ============ API Request Types ============ interface ApiStarkwareSigned { @@ -682,6 +695,23 @@ export interface ProfilePrivateResponseObject extends ProfilePublicResponseObjec }, } +export interface UserLinksResponseObject { + userType: LinkType | null, + primaryAddress: string | null, + linkedAddresses: string[] | null, +} + +export interface UserLinkRequestsResponseObject { + userType: LinkType | null, + outgoingRequests: LinkRequest[] | null, + incomingRequests: LinkRequest[] | null, +} + +export interface LinkRequest { + primaryAddress: string, + secondaryAddress: string, +} + // ============ API Response Field Types ============ enum MarketStatus { From 40e39d174fe280749e1d2cd80f028c5b0fa9bec0 Mon Sep 17 00:00:00 2001 From: Christopher-Li Date: Wed, 25 May 2022 08:22:54 -0700 Subject: [PATCH 161/180] v1.8.9: Add affiliateLinks and affiliateStatistics to /v3/profile/private (#188) --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6311b41..5cdb7a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.8", + "version": "1.8.9", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 37a4793..be88f59 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.8", + "version": "1.8.9", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index af4721f..a079d0c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -688,11 +688,29 @@ export interface ProfilePublicResponseObject { export interface ProfilePrivateResponseObject extends ProfilePublicResponseObject { publicId: string, affiliateApplicationStatus: AffiliateApplicationStatuses, + affiliateLinks: AffiliateLinkData[], tradingRewards: { curEpoch: number, curEpochEstimatedRewards: Decimal, prevEpochEstimatedRewards: Decimal, }, + affiliateStatistics: { + currentEpoch: { + usersReferred: string, + revenue: string, + revenueShareRate: string, + }, + previousEpoch: { + usersReferred: string, + revenue: string, + }, + lastEpochPaid: string, + }, +} + +export interface AffiliateLinkData { + link: string, + discountRate: string, } export interface UserLinksResponseObject { From 433aef3cffb441b0ae7065745d9a7da3c251d263 Mon Sep 17 00:00:00 2001 From: Christopher-Li Date: Wed, 25 May 2022 09:32:03 -0700 Subject: [PATCH 162/180] fix previousEpoch to previousEpochs (#189) --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5cdb7a1..664b839 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.9", + "version": "1.9.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index be88f59..15d00de 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.8.9", + "version": "1.9.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index a079d0c..6beb458 100644 --- a/src/types.ts +++ b/src/types.ts @@ -700,7 +700,7 @@ export interface ProfilePrivateResponseObject extends ProfilePublicResponseObjec revenue: string, revenueShareRate: string, }, - previousEpoch: { + previousEpochs: { usersReferred: string, revenue: string, }, From 0695afa7ae324fbd8eb406f9f282904a220e57a4 Mon Sep 17 00:00:00 2001 From: James Jia Date: Wed, 25 May 2022 17:52:09 -0400 Subject: [PATCH 163/180] v1.9.1 update get rewards for linked addresses (#190) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 2 ++ src/types.ts | 1 + 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 664b839..22be436 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.9.0", + "version": "1.9.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 15d00de..951f095 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.9.0", + "version": "1.9.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index bf87c91..76923be 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -830,6 +830,7 @@ export default class Private { getTradingRewards( params: { epoch?: number, + secondaryAddress?: string, }, genericParams: GenericParams = {}, ): Promise { @@ -852,6 +853,7 @@ export default class Private { getLiquidityProviderRewards( params: { epoch?: number, + secondaryAddress?: string, }, genericParams: GenericParams = {}, ): Promise { diff --git a/src/types.ts b/src/types.ts index 6beb458..db6f8d6 100644 --- a/src/types.ts +++ b/src/types.ts @@ -596,6 +596,7 @@ export interface Weight { } export interface StakedDYDX { + primaryStakedDYDX: string, averageStakedDYDX: string, totalAverageStakedDYDX: string, } From da32b52963c6cd7b60eef00d72b3a53edee7ea5f Mon Sep 17 00:00:00 2001 From: Teddy Ding Date: Wed, 29 Jun 2022 12:54:08 -0400 Subject: [PATCH 164/180] [BAC-1299] 1.10.0 add reduceOnly param to v3-client (#192) * add reduceOnly param to v3-client * bump version --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 1 + src/types.ts | 2 ++ 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 22be436..84465e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.9.1", + "version": "1.10.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 951f095..05ae3f7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.9.1", + "version": "1.10.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 76923be..1b5b796 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -459,6 +459,7 @@ export default class Private { * @price of the order * @limitFee of the order * @expiration of the order + * @reduceOnly whether the order is reduce-only (optional) * @cancelId if the order is replacing an existing one * @triggerPrice of the order if the order is a triggerable order * @trailingPercent of the order if the order is a trailing stop order diff --git a/src/types.ts b/src/types.ts index db6f8d6..63c77b8 100644 --- a/src/types.ts +++ b/src/types.ts @@ -208,6 +208,7 @@ export interface ApiOrder extends ApiStarkwareSigned { postOnly: boolean; limitFee: string; cancelId?: string; + reduceOnly?: boolean; triggerPrice?: string; trailingPercent?: string; } @@ -309,6 +310,7 @@ export interface OrderResponseObject { status: OrderStatus; timeInForce: TimeInForce; postOnly: boolean; + reduceOnly?: boolean; cancelReason?: string | null; } From 42eaca980be4a31547b4b402839d75965d2597a1 Mon Sep 17 00:00:00 2001 From: "Eugene Y. Q. Shen" Date: Fri, 1 Jul 2022 18:02:58 -0400 Subject: [PATCH 165/180] v1.10.1: add languageCode to PUT v3/users/ [BAC-2826] (#193) --- package-lock.json | 2 +- package.json | 2 +- src/modules/private.ts | 5 +++++ src/types.ts | 3 +++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 84465e2..ee6b49f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.10.0", + "version": "1.10.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 05ae3f7..f37fc38 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.10.0", + "version": "1.10.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index 1b5b796..eea54bd 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -63,6 +63,7 @@ import { UserLinksResponseObject, UserLinkRequestsResponseObject, LinkAction, + ISO6391, } from '../types'; import Clock from './clock'; @@ -206,6 +207,7 @@ export default class Private { * @isSharingUsername if the user wants their username publicly shared * @isSharingAddress if the user wants their ethereumAddress publicly shared * @country for the user (ISO 3166-1 Alpha-2 Compliant) + * @languageCode for the user (ISO 639-1 Compliant, including 'zh-CN') * } */ async updateUser({ @@ -215,6 +217,7 @@ export default class Private { isSharingUsername, isSharingAddress, country, + languageCode, }: { userData: {}, email?: string | null, @@ -222,6 +225,7 @@ export default class Private { isSharingUsername?: boolean, isSharingAddress?: boolean, country?: ISO31661ALPHA2, + languageCode?: ISO6391, }): Promise<{ user: UserResponseObject }> { return this.put( 'users', @@ -232,6 +236,7 @@ export default class Private { isSharingAddress, userData: JSON.stringify(userData), country, + languageCode, }, ); } diff --git a/src/types.ts b/src/types.ts index 63c77b8..17180c1 100644 --- a/src/types.ts +++ b/src/types.ts @@ -9,6 +9,8 @@ import { HttpProvider, IpcProvider, WebsocketProvider } from 'web3-core'; export { Account as EthereumAccount } from 'web3-core'; +export type ISO6391 = string; + export type ISO8601 = string; export type ISO31661ALPHA2 = string; @@ -371,6 +373,7 @@ export interface UserResponseObject { stakedDydxTokenBalance: string; isEmailVerified: boolean; country: ISO31661ALPHA2 | null; + languageCode: ISO6391 | null; } export interface AccountResponseObject { From 0b1c447f0d215827b8263a60043aafff15ebdc96 Mon Sep 17 00:00:00 2001 From: James Jia Date: Tue, 5 Jul 2022 11:04:40 -0700 Subject: [PATCH 166/180] v1.11.0 add celebrity competition, fix rewards endpoints (#194) --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ee6b49f..2805e44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.10.1", + "version": "1.11.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f37fc38..54dbc78 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.10.1", + "version": "1.11.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index 17180c1..d1fcbd8 100644 --- a/src/types.ts +++ b/src/types.ts @@ -126,6 +126,7 @@ export enum AccountLeaderboardPnlPeriod { MONTHLY = 'MONTHLY', ALL_TIME = 'ALL_TIME', COMPETITION = 'COMPETITION', + CELEBRITY_COMPETITION = 'CELEBRITY_COMPETITION', DAILY_COMPETITION = 'DAILY_COMPETITION', LEAGUES = 'LEAGUES', } @@ -136,6 +137,7 @@ export enum LeaderboardPnlPeriod { MONTHLY = 'MONTHLY', ALL_TIME = 'ALL_TIME', COMPETITION = 'COMPETITION', + CELEBRITY_COMPETITION = 'CELEBRITY_COMPETITION', DAILY_COMPETITION = 'DAILY_COMPETITION', BRONZE = 'BRONZE', SILVER = 'SILVER', @@ -601,7 +603,6 @@ export interface Weight { } export interface StakedDYDX { - primaryStakedDYDX: string, averageStakedDYDX: string, totalAverageStakedDYDX: string, } @@ -624,6 +625,7 @@ export interface LiquidityRewards { market: Market, depthSpreadScore: string, uptime: string, + linkedUptime: string, maxUptime: string, score: string, totalScore: string, From 5780bbb8fa8b24cacd4826c54b504907ea9add44 Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Fri, 22 Jul 2022 11:11:47 -0700 Subject: [PATCH 167/180] v1.11.1: Add optional `liquidation` boolean to `Trade` struct (#195) * add liquidation to trade endpoint * 1.11.1 --- package-lock.json | 2 +- package.json | 2 +- src/types.ts | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2805e44..e81e322 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.11.0", + "version": "1.11.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 54dbc78..674a645 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.11.0", + "version": "1.11.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/types.ts b/src/types.ts index d1fcbd8..bdb7214 100644 --- a/src/types.ts +++ b/src/types.ts @@ -573,6 +573,7 @@ export interface Trade { size: string, price: string, createdAt: ISO8601, + liquidation?: boolean, } export interface TradingRewardsResponseObject { From cecc6dddefecfb029f6e7d6ba6eb875157f42e87 Mon Sep 17 00:00:00 2001 From: "Eugene Y. Q. Shen" Date: Tue, 16 Aug 2022 13:24:02 -0400 Subject: [PATCH 168/180] v1.11.2: add postLivenessTokens endpoint [GROW-1092] (#200) --- package-lock.json | 4609 +++++++++++----------------------------- package.json | 4 +- src/modules/private.ts | 7 + 3 files changed, 1284 insertions(+), 3336 deletions(-) diff --git a/package-lock.json b/package-lock.json index e81e322..06cd479 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,82 +1,71 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.11.1", + "version": "1.11.2", "lockfileVersion": 1, "requires": true, "dependencies": { "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.18.6" } }, "@babel/compat-data": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", - "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", "dev": true }, "@babel/core": { - "version": "7.17.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", - "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", + "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.17.2", - "@babel/parser": "^7.17.3", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", + "json5": "^2.2.1", "semver": "^6.3.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" } }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "ms": { "version": "2.1.2", @@ -93,33 +82,38 @@ } }, "@babel/generator": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", - "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", + "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", "dev": true, "requires": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.18.10", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } } } }, "@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", "semver": "^6.3.0" }, "dependencies": { @@ -132,122 +126,115 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true }, "@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-transforms": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz", - "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", "dev": true }, "@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "dev": true + }, "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true }, "@babel/helpers": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", - "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "dev": true, "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.0", - "@babel/types": "^7.17.0" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -284,19 +271,13 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "supports-color": { @@ -311,9 +292,9 @@ } }, "@babel/parser": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", - "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", + "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -424,59 +405,48 @@ "@babel/helper-plugin-utils": "^7.14.5" } }, + "@babel/plugin-syntax-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - } + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" } }, "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", + "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.11", + "@babel/types": "^7.18.10", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -497,12 +467,13 @@ } }, "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", + "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, @@ -512,23 +483,14 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, "@dydxprotocol/node-service-base-dev": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@dydxprotocol/node-service-base-dev/-/node-service-base-dev-0.2.5.tgz", - "integrity": "sha512-vo3lrFwMoU5LuSD16RIHa6Pdnu5Pq9aAUOS7r24UiI03uk4r+APGWHP9FTsCxrs6pYR4WPxfB0yrSQ+whS0RAQ==", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@dydxprotocol/node-service-base-dev/-/node-service-base-dev-0.2.9.tgz", + "integrity": "sha512-FCldO8HdO7gRQxLh1gTg561w27FFsTGQCX1/S7Kvr4NabEG0BJFGs9cG3D8dWs5ivfIKTxPF8hdSxNn2xdMYww==", "dev": true, "requires": { - "@types/jest": "^26.0.19", + "@types/ffi-napi": "^4.0.5", + "@types/jest": "^28.1.1", "@types/lodash": "^4.14.161", "@types/node": "^14.6.4", "@typescript-eslint/eslint-plugin": "^4.32.0", @@ -539,9 +501,22 @@ "eslint-config-airbnb-typescript": "^9.0.0", "eslint-plugin-import": "^2.22.0", "eslint-plugin-no-only-tests": "2.4.0", - "jest": "^26.6.3", + "jest": "^28.1.1", "nodemon": "^2.0.4", - "typescript": "^4.4.3" + "typescript": "^4.7.3" + }, + "dependencies": { + "@types/ffi-napi": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/ffi-napi/-/ffi-napi-4.0.5.tgz", + "integrity": "sha512-WDPpCcHaPhHmP1FIw3ds/+OLt8bYQ/h3SO7o+8kH771PL21kHVzTwii7+WyMBXMQrBsR6xVU2y7w+h+9ggpaQw==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/ref-napi": "*", + "@types/ref-struct-di": "*" + } + } } }, "@dydxprotocol/starkex-eth": { @@ -615,9 +590,9 @@ }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -1509,9 +1484,9 @@ }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -1544,55 +1519,6 @@ "resolve-from": "^5.0.0" }, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -1608,213 +1534,298 @@ "dev": true }, "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^28.1.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", "slash": "^3.0.0" } }, "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz", + "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^28.1.3", + "@jest/reporters": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", + "ci-info": "^3.2.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^28.1.3", + "jest-config": "^28.1.3", + "jest-haste-map": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-resolve-dependencies": "^28.1.3", + "jest-runner": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "jest-watcher": "^28.1.3", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + } } }, "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", + "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", "dev": true, "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", "@types/node": "*", - "jest-mock": "^26.6.2" + "jest-mock": "^28.1.3" + } + }, + "@jest/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", + "dev": true, + "requires": { + "expect": "^28.1.3", + "jest-snapshot": "^28.1.3" + } + }, + "@jest/expect-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", + "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "dev": true, + "requires": { + "jest-get-type": "^28.0.2" } }, "@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", + "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", + "@jest/types": "^28.1.3", + "@sinonjs/fake-timers": "^9.1.2", "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-message-util": "^28.1.3", + "jest-mock": "^28.1.3", + "jest-util": "^28.1.3" } }, "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", + "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", "dev": true, "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" + "@jest/environment": "^28.1.3", + "@jest/expect": "^28.1.3", + "@jest/types": "^28.1.3" } }, "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz", + "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@jridgewell/trace-mapping": "^0.3.13", + "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "jest-worker": "^28.1.3", "slash": "^3.0.0", - "source-map": "^0.6.0", "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" + "v8-to-istanbul": "^9.0.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + } + } + }, + "@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.24.1" } }, "@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "version": "28.1.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", + "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.13", "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" + "graceful-fs": "^4.2.9" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + } } }, "@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", + "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", "dev": true, "requires": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" + "@jest/test-result": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "slash": "^3.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + } } }, "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", + "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", + "@babel/core": "^7.11.6", + "@jest/types": "^28.1.3", + "@jridgewell/trace-mapping": "^0.3.13", + "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" + "write-file-atomic": "^4.0.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + } } }, "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", "dev": true, "requires": { + "@jest/schemas": "^28.1.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^15.0.0", + "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true }, "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", @@ -1847,6 +1858,12 @@ "fastq": "^1.6.0" } }, + "@sinclair/typebox": { + "version": "0.24.28", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.28.tgz", + "integrity": "sha512-dgJd3HLOkLmz4Bw50eZx/zJwtBq65nms3N9VBYu5LTjJ883oBFkTyXRlCB/ZGGwqYpJJHA5zW2Ibhl5ngITfow==", + "dev": true + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -1862,9 +1879,9 @@ } }, "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" @@ -1878,16 +1895,10 @@ "defer-to-connect": "^1.0.1" } }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, "@types/babel__core": { - "version": "7.1.18", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", - "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1917,9 +1928,9 @@ } }, "@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz", + "integrity": "sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -2003,31 +2014,31 @@ } }, "@types/jest": { - "version": "26.0.24", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", - "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", + "version": "28.1.7", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.7.tgz", + "integrity": "sha512-acDN4VHD40V24tgu0iC44jchXavRNVFXQ/E6Z5XNsswgoSO/4NgsXoEYmPUGookKldlZQyIpmrEXsHI9cA3ZTA==", "dev": true, "requires": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" + "expect": "^28.0.0", + "pretty-format": "^28.0.0" } }, "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/lodash": { - "version": "4.14.179", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.179.tgz", - "integrity": "sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w==", + "version": "4.14.182", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", + "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==", "dev": true }, "@types/node": { @@ -2035,12 +2046,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.0.tgz", "integrity": "sha512-BfbIHP9IapdupGhq/hc+jT5dyiBVZ2DdeC5WwJWQWDb0GijQlzUFAeIQn/2GtvZcd2HVUU7An8felIICFTC2qg==" }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, "@types/pbkdf2": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", @@ -2050,9 +2055,9 @@ } }, "@types/prettier": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", - "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz", + "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==", "dev": true }, "@types/ref-napi": { @@ -2094,9 +2099,9 @@ "dev": true }, "@types/yargs": { - "version": "15.0.14", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", - "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "version": "17.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", + "integrity": "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -2125,9 +2130,9 @@ }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -2168,9 +2173,9 @@ }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -2216,9 +2221,9 @@ }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -2242,12 +2247,6 @@ "eslint-visitor-keys": "^2.0.0" } }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2269,59 +2268,17 @@ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, "aes-js": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2333,19 +2290,10 @@ "uri-js": "^4.2.2" } }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - } - }, "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true }, "ansi-escapes": { @@ -2399,38 +2347,20 @@ "sprintf-js": "~1.0.2" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", "get-intrinsic": "^1.1.1", "is-string": "^1.0.7" } @@ -2441,21 +2371,16 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" } }, "asn1": { @@ -2489,12 +2414,6 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -2511,12 +2430,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -2536,19 +2449,26 @@ } }, "babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", + "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", "dev": true, "requires": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", + "@jest/transform": "^28.1.3", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^28.1.3", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "slash": "^3.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + } } }, "babel-plugin-istanbul": { @@ -2562,38 +2482,17 @@ "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", + "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", "dev": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", + "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, @@ -2618,12 +2517,12 @@ } }, "babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", + "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^26.6.2", + "babel-plugin-jest-hoist": "^28.1.3", "babel-preset-current-node-syntax": "^1.0.0" } }, @@ -2633,61 +2532,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "base-x": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", @@ -2803,41 +2647,6 @@ } } }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2862,12 +2671,6 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -2935,16 +2738,15 @@ } }, "browserslist": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz", - "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001312", - "electron-to-chromium": "^1.4.71", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" } }, "bs58": { @@ -3019,23 +2821,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", @@ -3088,20 +2873,11 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001313", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001313.tgz", - "integrity": "sha512-rI1UN0koZUiKINjysQDuRi2VeSCce3bYJNmDcj3PIKREiAmjakugBul1QSkg/fPrlULYl6oWfGg3PbgOSY9X4Q==", + "version": "1.0.30001377", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001377.tgz", + "integrity": "sha512-I5XeHI1x/mRSGl96LFOaSk528LA/yZG3m3iQgImGujjO8gotd/DL8QaI1R1h1dg5ATeI2jqPblMpKq4Tr5iKfQ==", "dev": true }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -3145,9 +2921,9 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", "dev": true }, "cids": { @@ -3183,9 +2959,9 @@ } }, "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, "class-is": { @@ -3193,44 +2969,15 @@ "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" } }, "clone-response": { @@ -3244,7 +2991,7 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true }, "collect-v8-coverage": { @@ -3253,16 +3000,6 @@ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3286,32 +3023,12 @@ "delayed-stream": "~1.0.0" } }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, "confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -3380,12 +3097,6 @@ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -3483,35 +3194,6 @@ "randomfill": "^1.0.3" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -3529,17 +3211,6 @@ "assert-plus": "^1.0.0" } }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3548,18 +3219,6 @@ "ms": "2.0.0" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -3573,10 +3232,10 @@ "mimic-response": "^1.0.0" } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, "deep-is": { @@ -3597,53 +3256,13 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "delayed-stream": { @@ -3677,9 +3296,9 @@ "dev": true }, "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", "dev": true }, "diffie-hellman": { @@ -3722,32 +3341,6 @@ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, "dotenv": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", @@ -3783,9 +3376,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.4.75", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.75.tgz", - "integrity": "sha512-LxgUNeu3BVU7sXaKjUDD9xivocQLxFtq6wgERrutdY/yIOps3ODOZExK1jg8DTEg4U8TUCb5MLGeWFOYuxjF3Q==", + "version": "1.4.221", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.221.tgz", + "integrity": "sha512-aWg2mYhpxZ6Q6Xvyk7B2ziBca4YqrCDlXzmcD7wuRs65pVEVkMT1u2ifdjpAQais2O2o0rW964ZWWWYRlAL/kw==", "dev": true }, "elliptic": { @@ -3810,9 +3403,9 @@ } }, "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", "dev": true }, "emoji-regex": { @@ -3870,31 +3463,43 @@ } }, "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", - "has-symbols": "^1.0.2", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" } }, "es-to-primitive": { @@ -3948,83 +3553,17 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, "eslint": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", @@ -4073,15 +3612,30 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" } }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, "eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", @@ -4204,9 +3758,9 @@ } }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -4263,13 +3817,12 @@ } }, "eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", "dev": true, "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "dependencies": { "debug": { @@ -4290,9 +3843,9 @@ } }, "eslint-plugin-import": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", - "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "dev": true, "requires": { "array-includes": "^3.1.4", @@ -4300,14 +3853,14 @@ "debug": "^2.6.9", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.2", + "eslint-module-utils": "^2.7.3", "has": "^1.0.3", - "is-core-module": "^2.8.0", + "is-core-module": "^2.8.1", "is-glob": "^4.0.3", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.12.0" + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" }, "dependencies": { "doctrine": { @@ -4682,131 +4235,54 @@ "safe-buffer": "^5.1.1" } }, - "exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true - }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" + "@jest/expect-utils": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3" } }, "express": { @@ -4878,106 +4354,20 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -4995,7 +4385,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "fastq": { @@ -5087,12 +4477,13 @@ } }, "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "flat-cache": { @@ -5106,9 +4497,9 @@ } }, "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", "dev": true }, "follow-redirects": { @@ -5116,12 +4507,6 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -5142,15 +4527,6 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -5177,7 +4553,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "fsevents": { @@ -5193,10 +4569,28 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, "gensync": { @@ -5212,14 +4606,14 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" } }, "get-package-type": { @@ -5259,12 +4653,6 @@ "get-symbol-from-current-process-h": "^1.0.1" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -5274,15 +4662,15 @@ } }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -5305,19 +4693,10 @@ "process": "~0.5.1" } }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "requires": { - "ini": "2.0.0" - } - }, "globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -5360,13 +4739,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -5391,9 +4763,9 @@ } }, "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, "has-flag": { @@ -5402,6 +4774,15 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", @@ -5430,64 +4811,6 @@ "has-symbols": "^1.0.2" } }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -5517,21 +4840,6 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -5567,34 +4875,6 @@ "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -5605,37 +4885,10 @@ "sshpk": "^1.7.0" } }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "iconv-lite": { @@ -5675,7 +4928,7 @@ "ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true }, "import-fresh": { @@ -5688,12 +4941,6 @@ "resolve-from": "^4.0.0" } }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -5707,13 +4954,13 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -5725,12 +4972,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -5747,30 +4988,10 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "is-bigint": { @@ -5801,56 +5022,21 @@ "has-tostringtag": "^1.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "is-callable": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", "dev": true, "requires": { "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -5860,42 +5046,10 @@ "has-tostringtag": "^1.0.0" } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "optional": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-fullwidth-code-point": { @@ -5929,28 +5083,12 @@ "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -5958,51 +5096,24 @@ "dev": true }, "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" } }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, "is-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -6019,14 +5130,17 @@ "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" }, "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-string": { @@ -6061,44 +5175,10 @@ "call-bind": "^1.0.2" } }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "isstream": { @@ -6113,14 +5193,15 @@ "dev": true }, "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", "dev": true, "requires": { - "@babel/core": "^7.7.5", + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" }, "dependencies": { @@ -6155,9 +5236,9 @@ }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -6172,9 +5253,9 @@ } }, "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -6191,282 +5272,278 @@ } }, "jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", + "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==", "dev": true, "requires": { - "@jest/core": "^26.6.3", + "@jest/core": "^28.1.3", + "@jest/types": "^28.1.3", "import-local": "^3.0.2", - "jest-cli": "^26.6.3" + "jest-cli": "^28.1.3" }, "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", + "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", "dev": true, "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/core": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", "chalk": "^4.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", + "jest-config": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", "prompts": "^2.0.1", - "yargs": "^15.4.1" + "yargs": "^17.3.1" } } } }, "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", + "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" + "execa": "^5.0.0", + "p-limit": "^3.1.0" }, "dependencies": { - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "pump": "^3.0.0" + "yocto-queue": "^0.1.0" } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + } + } + }, + "jest-circus": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", + "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.3", + "@jest/expect": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^28.1.3", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "p-limit": "^3.1.0", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "path-key": "^3.0.0" + "yocto-queue": "^0.1.0" } } } }, "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", + "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^28.1.3", + "@jest/types": "^28.1.3", + "babel-jest": "^28.1.3", "chalk": "^4.0.0", + "ci-info": "^3.2.0", "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^28.1.3", + "jest-environment-node": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-runner": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + } } }, "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", + "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" } }, "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", + "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", + "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^28.1.3", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - } - }, - "jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" + "jest-get-type": "^28.0.2", + "jest-util": "^28.1.3", + "pretty-format": "^28.1.3" } }, "jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", + "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", "dev": true, "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^28.1.3", + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-mock": "^28.1.3", + "jest-util": "^28.1.3" } }, "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", "dev": true }, "jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", + "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", + "@jest/types": "^28.1.3", + "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "jest-worker": "^28.1.3", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + } } }, "jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", + "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", "dev": true, "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" } }, "jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", + "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" } }, "jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", "slash": "^3.0.0", - "stack-utils": "^2.0.2" + "stack-utils": "^2.0.3" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + } } }, "jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", + "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^28.1.3", "@types/node": "*" } }, @@ -6477,101 +5554,128 @@ "dev": true }, "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", "dev": true }, "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", + "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", "dev": true, "requires": { - "@jest/types": "^26.6.2", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", "slash": "^3.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + } } }, "jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", + "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" + "jest-regex-util": "^28.0.2", + "jest-snapshot": "^28.1.3" } }, "jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", + "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^28.1.3", + "@jest/environment": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" + "emittery": "^0.10.2", + "graceful-fs": "^4.2.9", + "jest-docblock": "^28.1.1", + "jest-environment-node": "^28.1.3", + "jest-haste-map": "^28.1.3", + "jest-leak-detector": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-resolve": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-util": "^28.1.3", + "jest-watcher": "^28.1.3", + "jest-worker": "^28.1.3", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + } } }, "jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", + "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.3", + "@jest/fake-timers": "^28.1.3", + "@jest/globals": "^28.1.3", + "@jest/source-map": "^28.1.2", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", + "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", + "execa": "^5.0.0", "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-mock": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" + "strip-bom": "^4.0.0" }, "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, "strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -6580,66 +5684,79 @@ } } }, - "jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, "jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", + "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", "dev": true, "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", + "expect": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-haste-map": "^28.1.3", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" + "pretty-format": "^28.1.3", + "semver": "^7.3.5" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + } } }, "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^28.1.3", "@types/node": "*", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + } } }, "jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", + "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", + "@jest/types": "^28.1.3", + "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", + "jest-get-type": "^28.0.2", "leven": "^3.1.0", - "pretty-format": "^26.6.2" + "pretty-format": "^28.1.3" }, "dependencies": { "camelcase": { @@ -6651,29 +5768,41 @@ } }, "jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", "dev": true, "requires": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^26.6.2", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "js-sha3": { @@ -6702,71 +5831,6 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - } - } - } - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -6797,7 +5861,7 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "json-stringify-safe": { @@ -6850,31 +5914,16 @@ "json-buffer": "3.0.0" } }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, "lcov-parse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", - "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", + "integrity": "sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==", "dev": true }, "leven": { @@ -6900,13 +5949,12 @@ "dev": true }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { @@ -6923,7 +5971,7 @@ "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, "log-driver": { @@ -6980,21 +6028,6 @@ "tmpl": "1.0.5" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -7033,13 +6066,13 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "miller-rabin": { @@ -7136,27 +6169,6 @@ "minipass": "^2.9.0" } }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -7226,29 +6238,10 @@ "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "negotiator": { @@ -7261,12 +6254,6 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", @@ -7280,34 +6267,19 @@ "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, - "node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - } - }, "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, "nodemon": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", - "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", + "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", "dev": true, "requires": { "chokidar": "^3.5.2", @@ -7316,10 +6288,10 @@ "minimatch": "^3.0.4", "pstree.remy": "^1.1.8", "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.5", - "update-notifier": "^5.1.0" + "undefsafe": "^2.0.5" }, "dependencies": { "debug": { @@ -7334,7 +6306,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "ms": { @@ -7363,32 +6335,12 @@ "nopt": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", "dev": true, "requires": { "abbrev": "1" } }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -7401,20 +6353,12 @@ "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "path-key": "^2.0.0" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - } + "path-key": "^3.0.0" } }, "number-to-bn": { @@ -7433,12 +6377,6 @@ } } }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -7449,41 +6387,10 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true }, "object-keys": { @@ -7492,24 +6399,15 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.3.tgz", + "integrity": "sha512-ZFJnX3zltyjcYJL0RoCJuzb+11zWGyaDbjgxZbdV7rFEcHQuYxrZqhow67aA7xpes6LhojyFDaBKAFfogQrikA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, @@ -7524,15 +6422,6 @@ "es-abstract": "^1.19.1" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "object.values": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", @@ -7596,33 +6485,27 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, - "p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true - }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "p-try": "^1.0.0" + "p-try": "^2.0.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "p-limit": "^2.2.0" } }, "p-timeout": { @@ -7634,35 +6517,15 @@ } }, "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { "callsites": "^3.0.0" @@ -7697,33 +6560,21 @@ "lines-and-columns": "^1.1.6" } }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-key": { @@ -7791,65 +6642,8 @@ "dev": true, "requires": { "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7862,15 +6656,23 @@ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } } }, "process": { @@ -7948,15 +6750,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -8011,126 +6804,12 @@ "unpipe": "1.0.0" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - } - } - }, "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -8204,14 +6883,15 @@ } } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" } }, "regexpp": { @@ -8220,42 +6900,6 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -8293,7 +6937,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, "require-from-string": { @@ -8302,19 +6946,13 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "requires": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -8342,10 +6980,10 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", "dev": true }, "responselike": { @@ -8356,12 +6994,6 @@ "lowercase-keys": "^1.0.0" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -8417,12 +7049,6 @@ } } }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -8437,170 +7063,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, "scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", @@ -8617,31 +7084,14 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", @@ -8692,35 +7142,6 @@ "xhr": "^2.3.3" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -8755,261 +7176,98 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", - "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" } }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "simple-update-notifier": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } } }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "sshpk": { @@ -9066,27 +7324,6 @@ "resolved": "https://registry.npmjs.org/starkware-types/-/starkware-types-1.2.0.tgz", "integrity": "sha512-6/G+VGJ59nzaNOOampAP/aAjgkzIeJBWIpIX8CJEnJwz5GaADk8hFTe9jv+yqpW4nAwPJk+THw1WvEoEaaR07A==" }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -9119,23 +7356,25 @@ } }, "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "string_decoder": { @@ -9158,13 +7397,7 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, "strip-final-newline": { @@ -9276,12 +7509,6 @@ } } }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, "table": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", @@ -9296,9 +7523,9 @@ }, "dependencies": { "ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -9353,13 +7580,7 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "timed-out": { @@ -9376,46 +7597,14 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -9448,25 +7637,24 @@ "punycode": "^2.1.1" } }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, "tsconfig-paths": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.13.0.tgz", - "integrity": "sha512-nWuffZppoaYK0vQ1SQmkSsQzJoHA4s6uzdb2waRpD806x9yfq153AdVsWz4je2qZcW+pENrMQXbGQ3sMCkXuhw==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "dev": true, "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.1", - "minimist": "^1.2.0", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + } } }, "tslib": { @@ -9541,9 +7729,9 @@ } }, "typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true }, "ultron": { @@ -9552,14 +7740,14 @@ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" }, "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, @@ -9574,27 +7762,6 @@ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -9605,66 +7772,14 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", "dev": true, "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" } }, "uri-js": { @@ -9675,12 +7790,6 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -9699,12 +7808,6 @@ "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "utf-8-validate": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.2.tgz", @@ -9747,32 +7850,14 @@ "dev": true }, "v8-to-istanbul": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", - "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "convert-source-map": "^1.6.0" } }, "varint": { @@ -9795,24 +7880,6 @@ "extsprintf": "^1.2.0" } }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, "walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -10154,12 +8221,6 @@ } } }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, "websocket": { "version": "1.0.32", "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.32.tgz", @@ -10173,32 +8234,6 @@ "yaeti": "^0.0.6" } }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -10221,21 +8256,6 @@ "is-symbol": "^1.0.3" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -10243,9 +8263,9 @@ "dev": true }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -10259,29 +8279,15 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", + "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", "dev": true, "requires": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "signal-exit": "^3.0.7" } }, - "ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "dev": true - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, "xhr": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", @@ -10323,27 +8329,15 @@ "cookiejar": "^2.1.1" } }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yaeti": { @@ -10357,84 +8351,31 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index 674a645..4ed4c3b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.11.1", + "version": "1.11.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -36,7 +36,7 @@ "web3": "1.3.0" }, "devDependencies": { - "@dydxprotocol/node-service-base-dev": "0.2.5", + "@dydxprotocol/node-service-base-dev": "0.2.9", "@types/es6-promisify": "^6.0.0", "@types/ffi-napi": "^4.0.4", "@types/uuid": "^8.3.0" diff --git a/src/modules/private.ts b/src/modules/private.ts index eea54bd..f1d4e0b 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -1021,6 +1021,13 @@ export default class Private { ); } + /** + * @description get a token to send to the Sumsub liveness verification widget + */ + async postLivenessTokens(): Promise<{ token: string }> { + return this.post('users/liveness/tokens', {}); + } + // ============ Signing ============ sign({ From f14a31ad097139f0104ebc8dc9618a0535738cea Mon Sep 17 00:00:00 2001 From: "Eugene Y. Q. Shen" Date: Tue, 16 Aug 2022 19:10:58 -0400 Subject: [PATCH 169/180] upgrade to Alpine Linux 3.15 [BAC-2929] (#199) --- .circleci/config.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5b9fe3d..26b4494 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,7 +2,7 @@ version: 2 jobs: checkout_and_install: docker: - - image: dydxprotocol/node:12.18.3-alpine + - image: dydxprotocol/node:12.22.12-alpine working_directory: ~/build steps: - checkout @@ -24,7 +24,7 @@ jobs: - ~/build lint: docker: - - image: dydxprotocol/node:12.18.3-alpine + - image: dydxprotocol/node:12.22.12-alpine working_directory: ~/build steps: - restore_cache: @@ -34,7 +34,7 @@ jobs: command: npm run lint build: docker: - - image: dydxprotocol/node:12.18.3-alpine + - image: dydxprotocol/node:12.22.12-alpine working_directory: ~/build steps: - restore_cache: @@ -48,7 +48,7 @@ jobs: - ~/build test: docker: - - image: dydxprotocol/node:12.18.3-alpine + - image: dydxprotocol/node:12.22.12-alpine - image: trufflesuite/ganache-cli:v6.8.2 command: -d -k=istanbul -i 1001 working_directory: ~/build @@ -60,7 +60,7 @@ jobs: command: npm test coverage: docker: - - image: dydxprotocol/node:12.18.3-alpine + - image: dydxprotocol/node:12.22.12-alpine - image: trufflesuite/ganache-cli:v6.8.2 command: -d -k=istanbul -i 1001 working_directory: ~/build @@ -75,7 +75,7 @@ jobs: command: cat coverage/lcov.info | node_modules/.bin/coveralls publish: docker: - - image: dydxprotocol/node:12.18.3-alpine + - image: dydxprotocol/node:12.22.12-alpine working_directory: ~/build steps: - restore_cache: From ba0d2d968a87d6c3394554fe738d60bde3e73082 Mon Sep 17 00:00:00 2001 From: James Jia Date: Wed, 31 Aug 2022 12:12:04 -0700 Subject: [PATCH 170/180] v1.11.3 getLiquidityProviderRewardsV2 [BAC-2960] (#202) * v1.x.x getLiquidityProviderRewardsV2 * v1.11.3 * fix type --- package-lock.json | 52 ++++++++++----------- package.json | 2 +- src/modules/private.ts | 100 ++++++++++++++++++++++++++--------------- src/types.ts | 17 ++++++- 4 files changed, 106 insertions(+), 65 deletions(-) diff --git a/package-lock.json b/package-lock.json index 06cd479..7fbc0fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.11.2", + "version": "1.11.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2032,7 +2032,7 @@ "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, "@types/lodash": { @@ -2991,7 +2991,7 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, "collect-v8-coverage": { @@ -3026,7 +3026,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "confusing-browser-globals": { @@ -4269,7 +4269,7 @@ "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, "expect": { @@ -4385,7 +4385,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "fastq": { @@ -4553,7 +4553,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fsevents": { @@ -4584,7 +4584,7 @@ "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, "functions-have-names": { @@ -4928,7 +4928,7 @@ "ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, "import-fresh": { @@ -4954,13 +4954,13 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", @@ -4991,7 +4991,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-bigint": { @@ -5049,7 +5049,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-fullwidth-code-point": { @@ -5178,7 +5178,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "isstream": { @@ -5861,7 +5861,7 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, "json-stringify-safe": { @@ -5923,7 +5923,7 @@ "lcov-parse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", - "integrity": "sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==", + "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", "dev": true }, "leven": { @@ -5971,7 +5971,7 @@ "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", "dev": true }, "log-driver": { @@ -6241,7 +6241,7 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, "negotiator": { @@ -6267,7 +6267,7 @@ "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, "node-releases": { @@ -6335,7 +6335,7 @@ "nopt": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", "dev": true, "requires": { "abbrev": "1" @@ -6574,7 +6574,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { @@ -6937,7 +6937,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-from-string": { @@ -7267,7 +7267,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "sshpk": { @@ -7397,7 +7397,7 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, "strip-final-newline": { @@ -7580,7 +7580,7 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "timed-out": { @@ -7597,7 +7597,7 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, "to-readable-stream": { diff --git a/package.json b/package.json index 4ed4c3b..2607504 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.11.2", + "version": "1.11.3", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/modules/private.ts b/src/modules/private.ts index f1d4e0b..5151f1d 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -64,6 +64,7 @@ import { UserLinkRequestsResponseObject, LinkAction, ISO6391, + LiquidityProviderRewardsV2ResponseObject, } from '../types'; import Clock from './clock'; @@ -200,7 +201,7 @@ export default class Private { /** * @description update information for the user * - * @param { + * @params { * @userData specifiying information about the user * @email associated with the user * @username for the user @@ -334,7 +335,7 @@ export default class Private { /** * @description get all positions for an account, meeting query parameters * - * @param { + * @params { * @market the positions are for * @status of the positions * @limit to the number of positions returned @@ -362,7 +363,7 @@ export default class Private { /** * @description get orders for a user by a set of query parameters * - * @param { + * @params { * @market the orders are for * @status the orders have * @side of the book the orders are on @@ -398,7 +399,7 @@ export default class Private { * @description get active orders (PENDING, OPEN, UNTRIGGERED) for a user by a set of query * parameters - if id is included then side is required * - * @param { + * @params { * @market the orders are for * @side of the book the orders are on * @id of the order @@ -454,7 +455,7 @@ export default class Private { /** *@description place a new order * - * @param { + * @params { * @market of the order * @side of the order * @type of the order @@ -541,7 +542,7 @@ export default class Private { * @description cancel active orders (PENDING, OPEN, UNTRIGGERED) for a user by a set of query * parameters - if id is included then side is required * - * @param { + * @params { * @market the orders are for * @side of the book the orders are on * @id of the order @@ -567,7 +568,7 @@ export default class Private { /** *@description get fills for a user by a set of query parameters * - * @param { + * @params { * @market the fills are for * @orderId associated with the fills * @limit to the number of fills returned @@ -595,7 +596,7 @@ export default class Private { /** * @description get transfers for a user by a set of query parameters * - * @param { + * @params { * @type of transfer * @limit to the number of transfers returned * @createdBeforeOrAt sets the time of the last transfer that will be received @@ -621,7 +622,7 @@ export default class Private { /** * @description post a new withdrawal * - * @param { + * @params { * @amount specifies the size of the withdrawal * @asset specifies the asset being withdrawn * @clientId specifies the clientId for the address @@ -666,16 +667,16 @@ export default class Private { /** * @description post a new fast-withdrawal * - * @param { - * @creditAmount specifies the size of the withdrawal - * @debitAmount specifies the amount to be debited - * @creditAsset specifies the asset being withdrawn - * @toAddress is the address being withdrawn to - * @lpPositionId is the LP positionId for the fast withdrawal - * @clientId specifies the clientId for the address - * @signature starkware specific signature for fast-withdrawal - * } - */ + * @params { + * @creditAmount specifies the size of the withdrawal + * @debitAmount specifies the amount to be debited + * @creditAsset specifies the asset being withdrawn + * @toAddress is the address being withdrawn to + * @lpPositionId is the LP positionId for the fast withdrawal + * @clientId specifies the clientId for the address + * @signature starkware specific signature for fast-withdrawal + * } + */ async createFastWithdrawal( { lpStarkKey, @@ -725,18 +726,18 @@ export default class Private { } /** - * @description post a new transfer - * - * @param { - * @amount specifies the size of the transfer - * @receiverAccountId specifies the receiver account id - * @receiverPublicKey specifies the receiver public key - * @receiverPositionId specifies the receiver position id - * @clientId specifies the clientId for the address - * @signature starkware specific signature for the transfer - * } - * @param positionId specifies the associated position for the transfer - */ + * @description post a new transfer + * + * @params { + * @amount specifies the size of the transfer + * @receiverAccountId specifies the receiver account id + * @receiverPublicKey specifies the receiver public key + * @receiverPositionId specifies the receiver position id + * @clientId specifies the clientId for the address + * @signature starkware specific signature for the transfer + * } + * @param positionId specifies the associated position for the transfer + */ async createTransfer( params: PartialBy, positionId: string, @@ -779,7 +780,7 @@ export default class Private { /** * @description get a user's funding payments by a set of query parameters * - * @param { + * @params { * @market the funding payments are for * @limit to the number of funding payments returned * @effectiveBeforeOrAt sets the latest funding payment received @@ -805,7 +806,7 @@ export default class Private { /** * @description get historical pnl ticks for an account between certain times * - * @param { + * @params { * @createdBeforeOrAt latest historical pnl tick being returned * @createdOnOrAfter earliest historical pnl tick being returned * } @@ -829,7 +830,7 @@ export default class Private { /** * @description get trading rewards for a user for a given epoch * - * @param { + * @params { * @epoch to request rewards data for (optional) * } */ @@ -850,11 +851,36 @@ export default class Private { } /** - * @description get liquidity provider rewards for a user for a given epoch + * @description get liquidity provider rewards for a user for a given epoch. use for epochs 13+. * - * @param { - * @epoch to request rewards data for (optional) + * @params { + * @epoch to request rewards data for (optional) * } + * + */ + getLiquidityProviderRewardsV2( + params: { + epoch?: number, + }, + genericParams: GenericParams = {}, + ): Promise { + return this._get( + 'rewards/liquidity-provider', + { + ...params, + ...genericParams, + }, + ); + } + + /** + * @description (deprecated) get liquidity provider rewards for a user for a given epoch. use for + * epochs 0-12. + * + * @params { + * @epoch to request rewards data for (optional) + * } + * */ getLiquidityProviderRewards( params: { diff --git a/src/types.ts b/src/types.ts index bdb7214..e186e7a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -622,6 +622,20 @@ export interface LiquidityProviderRewardsResponseObject { stakedDYDX: StakedDYDX, } +export interface LiquidityProviderRewardsV2ResponseObject + extends LiquidityProviderRewardsResponseObject { + linkedAddressRewards: { + [address: string]: PerAddressLiquidityRewards, + } +} + +export interface PerAddressLiquidityRewards { + averageStakedDYDX: string, + markets: { + [market: string]: LiquidityRewards, + }, +} + export interface LiquidityRewards { market: Market, depthSpreadScore: string, @@ -632,8 +646,9 @@ export interface LiquidityRewards { totalScore: string, makerVolume: string, totalMakerVolume: string, - totalRewards: string, estimatedRewards: string, + totalRewards: string, + secondaryAllocation: string, } export interface RetroactiveMiningRewardsResponseObject { From b7c9e868c57a67973768c575804e37edbd347f9b Mon Sep 17 00:00:00 2001 From: James Jia Date: Fri, 9 Sep 2022 13:34:34 -0700 Subject: [PATCH 171/180] v1.12.0 Ropsten -> Goerli [BAC-2887] (#203) * v1.12.0 Ropsten -> Goerli * fix test * oops --- __tests__/onboarding.test.ts | 44 ++++++++++++++++++------------------ package-lock.json | 38 +++++++++++++++---------------- package.json | 6 ++--- src/modules/private.ts | 43 +++++++++++++++++++---------------- 4 files changed, 67 insertions(+), 64 deletions(-) diff --git a/__tests__/onboarding.test.ts b/__tests__/onboarding.test.ts index 96f8b97..c49c0ac 100644 --- a/__tests__/onboarding.test.ts +++ b/__tests__/onboarding.test.ts @@ -16,21 +16,21 @@ const EXPECTED_STARK_KEY_PAIR_MAINNET = { publicKeyYCoordinate: '02bdd58a2c2acb241070bc5d55659a85bba65211890a8c47019a33902aba8400', privateKey: '0170d807cafe3d8b5758f3f698331d292bf5aeb71f6fd282f0831dee094ee891', }; -const EXPECTED_API_KEY_CREDENTIALS_ROPSTEN = { - key: '9c1d91a5-0a30-1ed4-2d3d-b840a479b965', - secret: 'hHYEswFe5MHMm8gFb81Jas9b7iLQUicsVv5YBRMY', - passphrase: '9z5Ew7m2DLQd87Xlk7Hd', +const EXPECTED_API_KEY_CREDENTIALS_GOERLI = { + key: '1871d1ba-537c-7fe8-743c-172bcd4ae5c6', + secret: 'tQxclqFWip0HL4Q-xkwZb_lTfOQz4GD5CHHpYzWa', + passphrase: 'B8JFepDVn8eixnor7Imv', }; -const EXPECTED_STARK_KEY_PAIR_ROPSTEN = { - publicKey: '035e23a936e596969a6b3131cfccbd18b71779f28276d30e8215cd0d3e9252c2', - publicKeyYCoordinate: '0557d1a1be389d9921b9d16415eac12bd276b05e2564c4b30a7730ace13a0e19', - privateKey: '050505654b282eb3debadddeddfa1bc76545a6837dcd59d7d41f6a282a4bbccc', +const EXPECTED_STARK_KEY_PAIR_GOERLI = { + publicKey: '03ea05770b452df14427b3f07ff600faa132ecc3d7643275042cb4da6ad99972', + publicKeyYCoordinate: '07310e2ab01978806a6fb6e51a9ee1c9a5c5117c63530ad7dead2b9f72094cc3', + privateKey: '01019187d91b8effe153ab1932930e27c8d01c56ad9cc937c777633c0ffc5a7e', }; let onboardingMainnetRemote: Onboarding; -let onboardingRopstenRemote: Onboarding; +let onboardingGoerliRemote: Onboarding; let onboardingMainnetLocal: Onboarding; -let onboardingRopstenLocal: Onboarding; +let onboardingGoerliLocal: Onboarding; describe('Onboarding module', () => { @@ -52,21 +52,21 @@ describe('Onboarding module', () => { }); }); - describe('Ropsten, with a web3 provider', () => { + describe('Goerli, with a web3 provider', () => { beforeAll(async () => { const web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545')); - onboardingRopstenRemote = new Onboarding('http://example.com', web3, 3); + onboardingGoerliRemote = new Onboarding('http://example.com', web3, 5); }); it('derives the default STARK key pair', async () => { - const keyPair = await onboardingRopstenRemote.deriveStarkKey(GANACHE_ADDRESS); - expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_ROPSTEN); + const keyPair = await onboardingGoerliRemote.deriveStarkKey(GANACHE_ADDRESS); + expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_GOERLI); }); it('derives the default API key pair', async () => { - const apiKey = await onboardingRopstenRemote.recoverDefaultApiCredentials(GANACHE_ADDRESS); - expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_ROPSTEN); + const apiKey = await onboardingGoerliRemote.recoverDefaultApiCredentials(GANACHE_ADDRESS); + expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_GOERLI); }); }); @@ -89,22 +89,22 @@ describe('Onboarding module', () => { }); }); - describe('Ropsten, with a local Ethereum private key', () => { + describe('Goerli, with a local Ethereum private key', () => { beforeAll(() => { const web3 = new Web3(); - onboardingRopstenLocal = new Onboarding('http://example.com', web3, 3); + onboardingGoerliLocal = new Onboarding('http://example.com', web3, 5); web3.eth.accounts.wallet.add(GANACHE_PRIVATE_KEY); }); it('derives the default STARK key pair', async () => { - const keyPair = await onboardingRopstenLocal.deriveStarkKey(GANACHE_ADDRESS); - expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_ROPSTEN); + const keyPair = await onboardingGoerliLocal.deriveStarkKey(GANACHE_ADDRESS); + expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_GOERLI); }); it('derives the default API key pair', async () => { - const apiKey = await onboardingRopstenLocal.recoverDefaultApiCredentials(GANACHE_ADDRESS); - expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_ROPSTEN); + const apiKey = await onboardingGoerliLocal.recoverDefaultApiCredentials(GANACHE_ADDRESS); + expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_GOERLI); }); }); }); diff --git a/package-lock.json b/package-lock.json index 7fbc0fc..1d4a013 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.11.3", + "version": "1.12.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -520,9 +520,9 @@ } }, "@dydxprotocol/starkex-eth": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.12.2.tgz", - "integrity": "sha512-lBzVzNvV0yLFQGPioUUeZAa3c5y5GCuNFpMHUtqWuEDSnRU21qOER7n07zz4v76Z33vwr+hhPUVke3IATicK8w==", + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.14.7.tgz", + "integrity": "sha512-dXdNj/mtCVR5I22tv0yfPZZQW440D0sObRmSoZlAmpgXbAp9Nn/onhE14mL7uICm/E3mj8/nBqQJlzMb05GH/g==", "requires": { "@types/big.js": "^6.0.0", "@types/elliptic": "^6.4.12", @@ -543,16 +543,16 @@ } }, "follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" } } }, "@dydxprotocol/starkex-lib": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.1.8.tgz", - "integrity": "sha512-fxfbrHxczSoNye5G7U30lb2YuqlR4fhzul+w8dwvTymPThmEK+wfFXqoE57Y4MKkTIVRebZjWv1IJIv0+Kikog==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.1.10.tgz", + "integrity": "sha512-LTkU2+QhfAmD25V6xYPdZHZsN0W5+ZeROQH0KSP0uZ/pZ+nE+45/Qpq+xlgXlmDLe7HQix+IypUkhVu5iKPN+A==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", @@ -1937,9 +1937,9 @@ } }, "@types/big.js": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.1.2.tgz", - "integrity": "sha512-h24JIZ52rvSvi2jkpYDk2yLH99VzZoCJiSfDWwjst7TwJVuXN61XVCUlPCzRl7mxKEMsGf8z42Q+J4TZwU3z2w==" + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.1.5.tgz", + "integrity": "sha512-UiWyJ6TLWoHeHZ8VUyngzCOwJDVxTsPnqfAMR/85X93rkRk5A4T2U42BCx0wCmZdtMHGHN/utJ8ft5xWu0V1bA==" }, "@types/bn.js": { "version": "4.11.6", @@ -4098,9 +4098,9 @@ } }, "ethereumjs-util": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz", - "integrity": "sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "requires": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -4110,9 +4110,9 @@ }, "dependencies": { "@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", "requires": { "@types/node": "*" } diff --git a/package.json b/package.json index 2607504..2bf42d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.11.3", + "version": "1.12.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,8 +26,8 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-eth": "0.12.2", - "@dydxprotocol/starkex-lib": "1.1.8", + "@dydxprotocol/starkex-eth": "0.14.7", + "@dydxprotocol/starkex-lib": "1.1.10", "axios": "^0.21.1", "bignumber.js": "^9.0.1", "es6-promisify": "^6.0.1", diff --git a/src/modules/private.ts b/src/modules/private.ts index 5151f1d..668b55b 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -3,23 +3,26 @@ import crypto from 'crypto'; import { StarkwareLib } from '@dydxprotocol/starkex-eth'; import { ApiMethod, - KeyPair, - OrderWithClientId, - SignableOrder, - SignableWithdrawal, asEcKeyPair, asSimpleKeyPair, + KeyPair, + nonceFromClientId, + OrderWithClientId, SignableConditionalTransfer, + SignableOrder, SignableTransfer, - nonceFromClientId, + SignableWithdrawal, TransferParams as StarklibTransferParams, } from '@dydxprotocol/starkex-lib'; import _ from 'lodash'; -import { generateQueryPath, generateRandomClientId } from '../helpers/request-helpers'; import { - RequestMethod, + generateQueryPath, + generateRandomClientId, +} from '../helpers/request-helpers'; +import { axiosRequest, + RequestMethod, } from '../lib/axios'; import { getAccountId } from '../lib/db'; import { @@ -27,6 +30,7 @@ import { AccountLeaderboardPnlPeriod, AccountLeaderboardPnlResponseObject, AccountResponseObject, + ActiveOrderResponseObject, ApiFastWithdrawal, ApiFastWithdrawalParams, ApiKeyCredentials, @@ -37,10 +41,14 @@ import { FillResponseObject, FundingResponseObject, GenericParams, + HistoricalLeaderboardPnlsResponseObject, HistoricalPnlResponseObject, - ISO8601, ISO31661ALPHA2, + ISO6391, + ISO8601, + LinkAction, LiquidityProviderRewardsResponseObject, + LiquidityProviderRewardsV2ResponseObject, Market, OrderResponseObject, OrderSide, @@ -49,22 +57,17 @@ import { PartialBy, PositionResponseObject, PositionStatus, + ProfilePrivateResponseObject, Provider, + RestrictionResponseObject, RetroactiveMiningRewardsResponseObject, TradingRewardsResponseObject, TransferParams, TransferResponseObject, - UserResponseObject, - ActiveOrderResponseObject, - RestrictionResponseObject, UserComplianceResponseObject, - ProfilePrivateResponseObject, - HistoricalLeaderboardPnlsResponseObject, - UserLinksResponseObject, UserLinkRequestsResponseObject, - LinkAction, - ISO6391, - LiquidityProviderRewardsV2ResponseObject, + UserLinksResponseObject, + UserResponseObject, } from '../types'; import Clock from './clock'; @@ -938,9 +941,9 @@ export default class Private { * NOTE: this will not work on Mainnet/Production. */ async requestTestnetTokens(): Promise<{ transfer: TransferResponseObject }> { - // Ropsten - if (this.networkId !== 3) { - throw new Error('Network is not Ropsten'); + // Goerli + if (this.networkId !== 5) { + throw new Error('Network is not Goerli'); } return this.post( From 2f2615380a54a1a521289c481b9ee0408f08afe1 Mon Sep 17 00:00:00 2001 From: James Jia Date: Wed, 14 Sep 2022 09:25:51 -0700 Subject: [PATCH 172/180] v1.12.1 bump starkex-eth (#204) --- package-lock.json | 20 ++++++++++---------- package.json | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1d4a013..dc4ed94 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.12.0", + "version": "1.12.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -520,9 +520,9 @@ } }, "@dydxprotocol/starkex-eth": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.14.7.tgz", - "integrity": "sha512-dXdNj/mtCVR5I22tv0yfPZZQW440D0sObRmSoZlAmpgXbAp9Nn/onhE14mL7uICm/E3mj8/nBqQJlzMb05GH/g==", + "version": "0.14.9", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.14.9.tgz", + "integrity": "sha512-tjpMA2fATiupACHUsXlx2jN1pQOVvYBdKGIQxIViXIsDvob0axXnybnIYzBQsLgymQnIYojhPtlxbQ8+XiToWQ==", "requires": { "@types/big.js": "^6.0.0", "@types/elliptic": "^6.4.12", @@ -543,9 +543,9 @@ } }, "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" } } }, @@ -1937,9 +1937,9 @@ } }, "@types/big.js": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.1.5.tgz", - "integrity": "sha512-UiWyJ6TLWoHeHZ8VUyngzCOwJDVxTsPnqfAMR/85X93rkRk5A4T2U42BCx0wCmZdtMHGHN/utJ8ft5xWu0V1bA==" + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.1.6.tgz", + "integrity": "sha512-0r9J+Zz9rYm2hOTwiMAVkm3XFQ4u5uTK37xrQMhc9bysn/sf/okzovWMYYIBMFTn/yrEZ11pusgLEaoarTlQbA==" }, "@types/bn.js": { "version": "4.11.6", diff --git a/package.json b/package.json index 2bf42d5..81c8cdc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.12.0", + "version": "1.12.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-eth": "0.14.7", + "@dydxprotocol/starkex-eth": "0.14.9", "@dydxprotocol/starkex-lib": "1.1.10", "axios": "^0.21.1", "bignumber.js": "^9.0.1", From 04aea1a94a8bc92bd32dc213e7701e32487ebfe9 Mon Sep 17 00:00:00 2001 From: James Jia Date: Mon, 19 Sep 2022 08:27:37 -0700 Subject: [PATCH 173/180] v1.13.0 Bump starkex-eth for fresh goerli deployment (#205) * Bump starkex-eth for fresh goerli deployment * v1.13.0 --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index dc4ed94..610250f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.12.1", + "version": "1.13.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -520,9 +520,9 @@ } }, "@dydxprotocol/starkex-eth": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.14.9.tgz", - "integrity": "sha512-tjpMA2fATiupACHUsXlx2jN1pQOVvYBdKGIQxIViXIsDvob0axXnybnIYzBQsLgymQnIYojhPtlxbQ8+XiToWQ==", + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.14.10.tgz", + "integrity": "sha512-9a+qwg86ckiZLFnn/bPko6JUVxeQTf4L/sxBX0mrbaGiAg8uGri6oqEmWIzgdOLGQLSmpwRLPKMPrlcMlcY4mw==", "requires": { "@types/big.js": "^6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index 81c8cdc..8a0000d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.12.1", + "version": "1.13.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-eth": "0.14.9", + "@dydxprotocol/starkex-eth": "0.14.10", "@dydxprotocol/starkex-lib": "1.1.10", "axios": "^0.21.1", "bignumber.js": "^9.0.1", From 1ec095fcffee70869a76119667313d29a3fa16df Mon Sep 17 00:00:00 2001 From: James Jia Date: Mon, 26 Sep 2022 13:07:28 -0700 Subject: [PATCH 174/180] Update CircleCI Fingerprint (#206) --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 26b4494..9decc8c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -82,7 +82,7 @@ jobs: key: cache-completed-build-{{ .Environment.CIRCLE_SHA1 }} - add_ssh_keys: fingerprints: - - "sUNBaY12LhlRvWoAZgFJorDbQDtXUiheNAAK+2Ds33Q" + - "SHA256:o8lmTQJ5ywu9V0p5LU+l8gAj1uWJZvaawwRMSD9FtOk" - run: name: Authenticate with registry command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/build/.npmrc From 635fecab4b6c2f8699899e0a46fa3b40b5756aa5 Mon Sep 17 00:00:00 2001 From: James Jia Date: Tue, 27 Sep 2022 15:51:00 -0700 Subject: [PATCH 175/180] v1.14.0 New Goerli environment (#207) --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 610250f..16e0a03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.13.0", + "version": "1.14.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -520,9 +520,9 @@ } }, "@dydxprotocol/starkex-eth": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.14.10.tgz", - "integrity": "sha512-9a+qwg86ckiZLFnn/bPko6JUVxeQTf4L/sxBX0mrbaGiAg8uGri6oqEmWIzgdOLGQLSmpwRLPKMPrlcMlcY4mw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.15.0.tgz", + "integrity": "sha512-kIrfPU0i83CDnfI7f9AN6pzgXnGBXUrXG0lXtv0Nc924xwP22Nj+/+QOTZguPPyjWCdVVjM02q8e6/+2xmGotQ==", "requires": { "@types/big.js": "^6.0.0", "@types/elliptic": "^6.4.12", diff --git a/package.json b/package.json index 8a0000d..c2c13e8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.13.0", + "version": "1.14.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,7 +26,7 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-eth": "0.14.10", + "@dydxprotocol/starkex-eth": "0.15.0", "@dydxprotocol/starkex-lib": "1.1.10", "axios": "^0.21.1", "bignumber.js": "^9.0.1", From ec1b338a831619986aef6c67967f42b846e76e58 Mon Sep 17 00:00:00 2001 From: James Jia Date: Thu, 26 Jan 2023 11:58:43 -0800 Subject: [PATCH 176/180] v1.14.1 Remove CircleCI, use Github Actions (#214) Signed-off-by: James Jia - Test Signed-off-by: James Jia - Test --- .circleci/config.yml | 124 -------------------------- .github/workflows/lint-build-test.yml | 13 +++ .github/workflows/publish-to-npm.yml | 13 +++ package-lock.json | 2 +- package.json | 2 +- 5 files changed, 28 insertions(+), 126 deletions(-) delete mode 100644 .circleci/config.yml create mode 100644 .github/workflows/lint-build-test.yml create mode 100644 .github/workflows/publish-to-npm.yml diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 9decc8c..0000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,124 +0,0 @@ -version: 2 -jobs: - checkout_and_install: - docker: - - image: dydxprotocol/node:12.22.12-alpine - working_directory: ~/build - steps: - - checkout - - restore_cache: - keys: - - dependency-cache-{{ .Environment.DEP_CACHE_VERSION }}-{{ .Branch }}-{{ checksum "package-lock.json" }} - - dependency-cache-{{ .Environment.DEP_CACHE_VERSION }}-{{ .Branch }}- - - dependency-cache-{{ .Environment.DEP_CACHE_VERSION }}- - - run: - name: Install Dependencies - command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc && npm ci - - save_cache: - key: dependency-cache-{{ .Environment.DEP_CACHE_VERSION }}-{{ .Branch }}-{{ checksum "package-lock.json" }} - paths: - - "$HOME/.npm" - - save_cache: - key: cache-{{ .Environment.CIRCLE_SHA1 }} - paths: - - ~/build - lint: - docker: - - image: dydxprotocol/node:12.22.12-alpine - working_directory: ~/build - steps: - - restore_cache: - key: cache-{{ .Environment.CIRCLE_SHA1 }} - - run: - name: Lint - command: npm run lint - build: - docker: - - image: dydxprotocol/node:12.22.12-alpine - working_directory: ~/build - steps: - - restore_cache: - key: cache-{{ .Environment.CIRCLE_SHA1 }} - - run: - name: Build - command: npm run build - - save_cache: - key: cache-completed-build-{{ .Environment.CIRCLE_SHA1 }} - paths: - - ~/build - test: - docker: - - image: dydxprotocol/node:12.22.12-alpine - - image: trufflesuite/ganache-cli:v6.8.2 - command: -d -k=istanbul -i 1001 - working_directory: ~/build - steps: - - restore_cache: - key: cache-completed-build-{{ .Environment.CIRCLE_SHA1 }} - - run: - name: Test - command: npm test - coverage: - docker: - - image: dydxprotocol/node:12.22.12-alpine - - image: trufflesuite/ganache-cli:v6.8.2 - command: -d -k=istanbul -i 1001 - working_directory: ~/build - steps: - - restore_cache: - key: cache-completed-build-{{ .Environment.CIRCLE_SHA1 }} - - run: - name: Coverage - command: npm run coverage - - run: - name: Coveralls - command: cat coverage/lcov.info | node_modules/.bin/coveralls - publish: - docker: - - image: dydxprotocol/node:12.22.12-alpine - working_directory: ~/build - steps: - - restore_cache: - key: cache-completed-build-{{ .Environment.CIRCLE_SHA1 }} - - add_ssh_keys: - fingerprints: - - "SHA256:o8lmTQJ5ywu9V0p5LU+l8gAj1uWJZvaawwRMSD9FtOk" - - run: - name: Authenticate with registry - command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/build/.npmrc - - run: - command: | - ./scripts/publish-if-not-exists.sh -workflows: - version: 2 - build_and_test: - jobs: - - checkout_and_install: - context: Node Service Context - - lint: - context: Node Service Context - requires: - - checkout_and_install - - build: - context: Node Service Context - requires: - - checkout_and_install - - test: - context: Node Service Context - requires: - - build - - checkout_and_install - - coverage: - context: Node Service Context - requires: - - build - - checkout_and_install - - publish: - context: Node Service Context - requires: - - lint - - build - - test - filters: - branches: - only: master diff --git a/.github/workflows/lint-build-test.yml b/.github/workflows/lint-build-test.yml new file mode 100644 index 0000000..87b8b13 --- /dev/null +++ b/.github/workflows/lint-build-test.yml @@ -0,0 +1,13 @@ +name: Lint/Build/Test + +on: + pull_request: + push: + branches: + - master + +jobs: + main: + with: + USE_GANACHE: true + uses: dydxprotocol/actions-public/.github/workflows/v3-lint-build-test.yml@main diff --git a/.github/workflows/publish-to-npm.yml b/.github/workflows/publish-to-npm.yml new file mode 100644 index 0000000..57855fa --- /dev/null +++ b/.github/workflows/publish-to-npm.yml @@ -0,0 +1,13 @@ +name: Publish to NPM + +on: + push: + branches: + - master + +jobs: + main: + uses: dydxprotocol/actions-public/.github/workflows/v3-publish-to-npm.yml@main + secrets: inherit + permissions: + contents: write diff --git a/package-lock.json b/package-lock.json index 16e0a03..d031560 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.14.0", + "version": "1.14.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c2c13e8..2e86015 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.14.0", + "version": "1.14.1", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { From e71d20082ee30b1f78a55f5d625ab205b800d08d Mon Sep 17 00:00:00 2001 From: Jared Vu Date: Mon, 13 Feb 2023 12:51:08 -0800 Subject: [PATCH 177/180] v1.14.2: Add deriveAllStarkKeys method, utilizing rotated signature (#215) * v1.14.2: Add deriveAllStarkKeys method, utilizing rotated signature * lint: fix * Onboarding: Consolidate stark key derivation signing and add test for signature rotation * Rotate v and t values * Nit: Edit description, remove newline * Nits: avoid mixing strings, return signature directly * Add async to signal that the method returns a promise. --- .../eth-signing/signature-helpers.test.ts | 42 +++++++++++ __tests__/onboarding.test.ts | 74 ++++++++++++++++++- package.json | 2 +- src/eth-signing/helpers.ts | 47 ++++++++++++ src/modules/onboarding.ts | 69 +++++++++++++---- 5 files changed, 219 insertions(+), 15 deletions(-) create mode 100644 __tests__/eth-signing/signature-helpers.test.ts diff --git a/__tests__/eth-signing/signature-helpers.test.ts b/__tests__/eth-signing/signature-helpers.test.ts new file mode 100644 index 0000000..bde406c --- /dev/null +++ b/__tests__/eth-signing/signature-helpers.test.ts @@ -0,0 +1,42 @@ +import { getAllSignatureRotations } from '../../src/eth-signing/helpers'; + +const ONBOARDING_SIGNATURE_RS = ( + '0x429e616f0d1f73dedbb8ab1d975dca6737b7d2b800ce144c4d1176208288d6cf03' + + '3b5c589fe04c2ec02fefb6d5af44648d74efa3b25da8708e2d33e648a34837' +); +const ONBOARDING_SIGNATURE = `${ONBOARDING_SIGNATURE_RS}1c00`; +const ONBOARDING_SIGNATURE_ROTATED_V = `${ONBOARDING_SIGNATURE_RS}0100`; +const ONBOARDING_SIGNATURE_ROTATED_T = `${ONBOARDING_SIGNATURE_RS}1c03`; +const ONBOARDING_SIGNATURE_BOTH_ROTATED = `${ONBOARDING_SIGNATURE_RS}0103`; + +describe('Signature Formatting', () => { + describe('getAllSignatureRotations', () => { + it('rotates a valid signature', () => { + expect(getAllSignatureRotations(ONBOARDING_SIGNATURE)).toEqual([ + ONBOARDING_SIGNATURE, + ONBOARDING_SIGNATURE_ROTATED_V, + ONBOARDING_SIGNATURE_ROTATED_T, + ONBOARDING_SIGNATURE_BOTH_ROTATED, + ]); + }); + it('does not rotate v when invalid', () => { + expect(getAllSignatureRotations(`${ONBOARDING_SIGNATURE_RS}1d00`)).toEqual([ + `${ONBOARDING_SIGNATURE_RS}1d00`, + `${ONBOARDING_SIGNATURE_RS}1d00`, + `${ONBOARDING_SIGNATURE_RS}1d03`, + `${ONBOARDING_SIGNATURE_RS}1d03`, + ]); + }); + it('does not rotate t when invalid', () => { + expect(getAllSignatureRotations(`${ONBOARDING_SIGNATURE_RS}1c02`)).toEqual([ + `${ONBOARDING_SIGNATURE_RS}1c02`, + `${ONBOARDING_SIGNATURE_RS}0102`, + `${ONBOARDING_SIGNATURE_RS}1c02`, + `${ONBOARDING_SIGNATURE_RS}0102`, + ]); + }); + it('throws on invalid signature', () => { + expect(() => getAllSignatureRotations(ONBOARDING_SIGNATURE_RS)).toThrow(`Invalid signature: ${ONBOARDING_SIGNATURE_RS}`); + }); + }); +}); diff --git a/__tests__/onboarding.test.ts b/__tests__/onboarding.test.ts index c49c0ac..c36be18 100644 --- a/__tests__/onboarding.test.ts +++ b/__tests__/onboarding.test.ts @@ -16,6 +16,21 @@ const EXPECTED_STARK_KEY_PAIR_MAINNET = { publicKeyYCoordinate: '02bdd58a2c2acb241070bc5d55659a85bba65211890a8c47019a33902aba8400', privateKey: '0170d807cafe3d8b5758f3f698331d292bf5aeb71f6fd282f0831dee094ee891', }; +const EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_V_SIG_MAINNET = { + privateKey: '01a8a594a38fe22a533d43a427481d018596bb3ff4eef77001d4651bd4354a97', + publicKey: '03676c30c45400611dd290b0c6210e1524ba3ce6cee1fb5a0726c6c4d4a0d9e9', + publicKeyYCoordinate: '0761bdde4fb0229edf02cc67c7d00cac24ee481b8a222a8d176d3550dc96835e', +}; +const EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_T_SIG_MAINNET = { + privateKey: '00b2ada65a8f233eef4f778dc1bb2155e7893da8ce58ea3d494fe1cd0a937596', + publicKey: '04e38aa24246634ce880d876f36a80d3781ebf8220d5f9ce6a65c2e7c99d7790', + publicKeyYCoordinate: '01a205fdd182ee55867a87dc81e859c7ea2238c4c250c1256d88d9e52f5045f9', +}; +const EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_VT_SIG_MAINNET = { + privateKey: '06822e98032edc6d91b091a29b926c374d74ca8c952e5de9f6e27564b0a1799b', + publicKey: '078fd43a3ba640a1ff71713e86537ddc08ba25fe9ea37815746f486d790e9115', + publicKeyYCoordinate: '0005e95993fd25cfcdd2ec5820b07b784ab8a95d608e8f920240f3ca907ff56d', +}; const EXPECTED_API_KEY_CREDENTIALS_GOERLI = { key: '1871d1ba-537c-7fe8-743c-172bcd4ae5c6', secret: 'tQxclqFWip0HL4Q-xkwZb_lTfOQz4GD5CHHpYzWa', @@ -26,6 +41,21 @@ const EXPECTED_STARK_KEY_PAIR_GOERLI = { publicKeyYCoordinate: '07310e2ab01978806a6fb6e51a9ee1c9a5c5117c63530ad7dead2b9f72094cc3', privateKey: '01019187d91b8effe153ab1932930e27c8d01c56ad9cc937c777633c0ffc5a7e', }; +const EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_V_SIG_GOERLI = { + privateKey: '052e820782c82a686f59863828095e82b7287c05bbed2b7b35bada66374bca02', + publicKey: '022cf874307a6352b487d768d1c22f17cdfbcd2044762abae3e2ccab205e7c5f', + publicKeyYCoordinate: '04aa067c547596d6db587ae892fe0c3743c7eec220ed873c39a879c6c7b7aeb6', +}; +const EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_T_SIG_GOERLI = { + privateKey: '04e31b91e0808be680168ee5cac6144d4a32e550be387731528ee032fd5d7571', + publicKey: '06e254645e25d32fc90763b386e99b8fe23927205f31fe61c162a446e862ddae', + publicKeyYCoordinate: '063f47210857f29c8a52437e5f070cb646118f88181f9991d4ba3d1dffcceda5', +}; +const EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_VT_SIG_GOERLI = { + privateKey: '035289da1da837881b780d00e14312c97c3c695378d4adbb3d76bde98ecdbc96', + publicKey: '006d181da12e58394e450cd0f577150dc10574a88f2bee37323228d2fd717f66', + publicKeyYCoordinate: '05d1420b2502f89c23e947a0b54a189b17a24fbb15a98e7792504ca271c919c3', +}; let onboardingMainnetRemote: Onboarding; let onboardingGoerliRemote: Onboarding; @@ -46,6 +76,17 @@ describe('Onboarding module', () => { expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_MAINNET); }); + it('derives all possible STARK key pairs', async () => { + const allKeyPairs = await onboardingMainnetRemote.deriveAllStarkKeys(GANACHE_ADDRESS); + + expect(allKeyPairs).toStrictEqual([ + EXPECTED_STARK_KEY_PAIR_MAINNET, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_V_SIG_MAINNET, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_T_SIG_MAINNET, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_VT_SIG_MAINNET, + ]); + }); + it('derives the default API key pair', async () => { const apiKey = await onboardingMainnetRemote.recoverDefaultApiCredentials(GANACHE_ADDRESS); expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_MAINNET); @@ -64,6 +105,16 @@ describe('Onboarding module', () => { expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_GOERLI); }); + it('derives all possible STARK key pairs', async () => { + const allKeyPairs = await onboardingGoerliRemote.deriveAllStarkKeys(GANACHE_ADDRESS); + expect(allKeyPairs).toStrictEqual([ + EXPECTED_STARK_KEY_PAIR_GOERLI, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_V_SIG_GOERLI, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_T_SIG_GOERLI, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_VT_SIG_GOERLI, + ]); + }); + it('derives the default API key pair', async () => { const apiKey = await onboardingGoerliRemote.recoverDefaultApiCredentials(GANACHE_ADDRESS); expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_GOERLI); @@ -71,7 +122,6 @@ describe('Onboarding module', () => { }); describe('mainnet, with a local Ethereum private key', () => { - beforeAll(() => { const web3 = new Web3(); onboardingMainnetLocal = new Onboarding('http://example.com', web3, 1); @@ -83,6 +133,17 @@ describe('Onboarding module', () => { expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_MAINNET); }); + it('derives all possible STARK key pairs', async () => { + const allKeyPairs = await onboardingMainnetLocal.deriveAllStarkKeys(GANACHE_ADDRESS); + + expect(allKeyPairs).toStrictEqual([ + EXPECTED_STARK_KEY_PAIR_MAINNET, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_V_SIG_MAINNET, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_T_SIG_MAINNET, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_VT_SIG_MAINNET, + ]); + }); + it('derives the default API key pair', async () => { const apiKey = await onboardingMainnetLocal.recoverDefaultApiCredentials(GANACHE_ADDRESS); expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_MAINNET); @@ -102,6 +163,17 @@ describe('Onboarding module', () => { expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_GOERLI); }); + it('derives all possible STARK key pairs', async () => { + const allKeyPairs = await onboardingGoerliLocal.deriveAllStarkKeys(GANACHE_ADDRESS); + + expect(allKeyPairs).toStrictEqual([ + EXPECTED_STARK_KEY_PAIR_GOERLI, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_V_SIG_GOERLI, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_T_SIG_GOERLI, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_VT_SIG_GOERLI, + ]); + }); + it('derives the default API key pair', async () => { const apiKey = await onboardingGoerliLocal.recoverDefaultApiCredentials(GANACHE_ADDRESS); expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_GOERLI); diff --git a/package.json b/package.json index 2e86015..e6f5afa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.14.1", + "version": "1.14.2", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { diff --git a/src/eth-signing/helpers.ts b/src/eth-signing/helpers.ts index 9971efd..3d85173 100644 --- a/src/eth-signing/helpers.ts +++ b/src/eth-signing/helpers.ts @@ -35,6 +35,19 @@ export const EIP712_DOMAIN_STRUCT_NO_CONTRACT = [ { name: 'chainId', type: 'uint256' }, ]; +const ROTATED_V_VALUES: { [v: string]: string } = { + '00': '1b', + '01': '1c', + '1b': '00', + '1c': '01', +}; + +// PERSONAL and NO_PREPEND are the only SignatureTypes the frontend app deal with. +const ROTATED_T_VALUES: { [t: string]: string } = { + [`0${SignatureTypes.NO_PREPEND}`]: `0${SignatureTypes.PERSONAL}`, + [`0${SignatureTypes.PERSONAL}`]: `0${SignatureTypes.NO_PREPEND}`, +}; + export function isValidSigType( sigType: number, ): boolean { @@ -133,6 +146,40 @@ export function fixRawSignature( } } +/** + * @description get signatures that have a rotated 'v' value, a rotated 't' value, and + * have both values rotated. If 'v' or 't' cannot be rotated they will keep their original values. + * + * @param signature to rotate + * + * @throws Error if signature has an invalid length + * + * @returns the list of signatures in the following order: + * [0]: original + * [1]: rotated 'v' value + * [2]: rotated 't' value + * [3]: rotated 'v' and 't' value + */ +export function getAllSignatureRotations(signature: string): string[] { + const stripped = stripHexPrefix(signature); + const rs = stripped.slice(0, 128); + const v = stripped.slice(128, 130); + const t = stripped.slice(130, 132); + const rotatedV: string = ROTATED_V_VALUES[v] || v; + const rotatedT: string = ROTATED_T_VALUES[t] || t; + + if (stripped.length !== 132) { + throw new Error(`Invalid signature: ${signature}`); + } + + return [ + `0x${stripped}`, + `0x${rs}${rotatedV}${t}`, + `0x${rs}${v}${rotatedT}`, + `0x${rs}${rotatedV}${rotatedT}`, + ]; +} + // ============ Byte Helpers ============ export function stripHexPrefix(input: string) { diff --git a/src/modules/onboarding.ts b/src/modules/onboarding.ts index 1f2954b..c057d04 100644 --- a/src/modules/onboarding.ts +++ b/src/modules/onboarding.ts @@ -5,7 +5,7 @@ import { import Web3 from 'web3'; import { SignOnboardingAction } from '../eth-signing'; -import { stripHexPrefix } from '../eth-signing/helpers'; +import { getAllSignatureRotations, stripHexPrefix } from '../eth-signing/helpers'; import { keccak256Buffer } from '../helpers/request-helpers'; import { RequestMethod, @@ -77,6 +77,33 @@ export default class Onboarding { }); } + /** + * Sign the 'key derivation' onboarding message to receive a signature. + * + * @param ethereumAddress of the account + * @param signingMethod Method to use for signing + * @returns Signature used to derive your STARK key pairs + */ + protected async signStarkKeyDerivationMessage( + ethereumAddress: string, + signingMethod: SigningMethod = SigningMethod.TypedData, + ): Promise { + if (!KEY_DERIVATION_SUPPORTED_SIGNING_METHODS.includes(signingMethod)) { + throw new Error('Unsupported signing method for API key derivation'); + } + + const message: OnboardingAction = { + action: OnboardingActionString.KEY_DERIVATION, + }; + + // On mainnet, include an extra onlySignOn parameter. + if (this.networkId === 1) { + message.onlySignOn = 'https://trade.dydx.exchange'; + } + + return this.signer.sign(ethereumAddress, signingMethod, message); + } + // ============ Requests ============ /** @@ -132,23 +159,39 @@ export default class Onboarding { ethereumAddress: string, signingMethod: SigningMethod = SigningMethod.TypedData, ): Promise { - if (!KEY_DERIVATION_SUPPORTED_SIGNING_METHODS.includes(signingMethod)) { - throw new Error('Unsupported signing method for API key derivation'); - } - - const message: OnboardingAction = { action: OnboardingActionString.KEY_DERIVATION }; + const signature: string = await this.signStarkKeyDerivationMessage( + ethereumAddress, + signingMethod, + ); - // On mainnet, include an extra onlySignOn parameter. - if (this.networkId === 1) { - message.onlySignOn = 'https://trade.dydx.exchange'; - } + return keyPairFromData(Buffer.from(stripHexPrefix(signature), 'hex')); + } - const signature = await this.signer.sign( + /** + * @description Derive four STARK key pairs deterministically from an Ethereum key, with three + * of the STARK key pairs using a signature that has had either their 'v' value, 't' value, or + * both values rotated. + * + * This is used by the frontend app to derive the two STARK key pairs to ensure there will be + * no STARK key mismatch due to a signature's 'v' or 't' value. + * + * @param ethereumAddress Ethereum address of the account to use for signing. + * @param signingMethod Method to use for signing. + */ + async deriveAllStarkKeys( + ethereumAddress: string, + signingMethod: SigningMethod = SigningMethod.TypedData, + ): Promise { + const signature: string = await this.signStarkKeyDerivationMessage( ethereumAddress, signingMethod, - message, ); - return keyPairFromData(Buffer.from(stripHexPrefix(signature), 'hex')); + + const rotatedSignatures: string[] = getAllSignatureRotations(signature); + + return rotatedSignatures.map((rotatedSignature: string) => keyPairFromData( + Buffer.from(stripHexPrefix(rotatedSignature), 'hex'), + )); } /** From ecdc9a520156b7bdc0da4fc0faaa409e649c5e54 Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Tue, 21 Mar 2023 15:22:22 -0400 Subject: [PATCH 178/180] v1.15.0: Bump web3 to v1.3.6, starkex-eth to v0.16.1 (#220) * bump web3 to v1.3.6 * update starketh-eth to v0.16.1 * 1.15.0 --- package-lock.json | 1709 +++++++++++++++++++++++++++------------------ package.json | 7 +- 2 files changed, 1028 insertions(+), 688 deletions(-) diff --git a/package-lock.json b/package-lock.json index d031560..c490d3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.14.1", + "version": "1.15.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -520,9 +520,9 @@ } }, "@dydxprotocol/starkex-eth": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.15.0.tgz", - "integrity": "sha512-kIrfPU0i83CDnfI7f9AN6pzgXnGBXUrXG0lXtv0Nc924xwP22Nj+/+QOTZguPPyjWCdVVjM02q8e6/+2xmGotQ==", + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.16.1.tgz", + "integrity": "sha512-G82a9Yg0UWjZVtObB0b6TlwuPabgSpzbJczXzJsNYF3Njc9nA270Th8obIuFlEp7I/dMOmRKZjRNbHF1cT688g==", "requires": { "@types/big.js": "^6.0.0", "@types/elliptic": "^6.4.12", @@ -531,7 +531,10 @@ "bignumber.js": "^9.0.1", "lodash": "^4.17.20", "starkware-crypto": "^1.9.7", - "web3": "1.3.0" + "web3": "1.3.6", + "web3-core": "1.3.6", + "web3-eth-contract": "1.3.6", + "web3-utils": "1.3.6" }, "dependencies": { "axios": { @@ -613,19 +616,19 @@ } }, "@ethersproject/abi": { - "version": "5.0.0-beta.153", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz", - "integrity": "sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", + "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", "requires": { - "@ethersproject/address": ">=5.0.0-beta.128", - "@ethersproject/bignumber": ">=5.0.0-beta.130", - "@ethersproject/bytes": ">=5.0.0-beta.129", - "@ethersproject/constants": ">=5.0.0-beta.128", - "@ethersproject/hash": ">=5.0.0-beta.128", - "@ethersproject/keccak256": ">=5.0.0-beta.127", - "@ethersproject/logger": ">=5.0.0-beta.129", - "@ethersproject/properties": ">=5.0.0-beta.131", - "@ethersproject/strings": ">=5.0.0-beta.130" + "@ethersproject/address": "^5.0.4", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/hash": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/strings": "^5.0.4" } }, "@ethersproject/abstract-provider": { @@ -1949,6 +1952,17 @@ "@types/node": "*" } }, + "@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, "@types/elliptic": { "version": "6.4.12", "resolved": "https://registry.npmjs.org/@types/elliptic/-/elliptic-6.4.12.tgz", @@ -1989,6 +2003,11 @@ "@types/node": "*" } }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + }, "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -2035,6 +2054,14 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "requires": { + "@types/node": "*" + } + }, "@types/lodash": { "version": "4.14.182", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", @@ -2078,6 +2105,14 @@ "@types/ref-napi": "*" } }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "requires": { + "@types/node": "*" + } + }, "@types/secp256k1": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz", @@ -2254,12 +2289,27 @@ "dev": true }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + } } }, "acorn": { @@ -2350,7 +2400,7 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "array-includes": { "version": "3.1.5", @@ -2403,9 +2453,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -2430,6 +2480,11 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -2541,9 +2596,9 @@ } }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -2624,26 +2679,31 @@ "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", + "bytes": "3.1.2", + "content-type": "~1.0.5", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } } } }, @@ -2706,19 +2766,12 @@ } }, "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "requires": { - "bn.js": "^4.1.0", + "bn.js": "^5.0.0", "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } } }, "browserify-sign": { @@ -2777,9 +2830,9 @@ } }, "buffer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.0.tgz", - "integrity": "sha512-cd+5r1VLBwUqTrmnzW+D7ABkJUM6mr7uv1dv+6jRw4Rcl7tFIFHDqHPL98LhpGFn3dbAt3gtLxtrWp4m1kFrqg==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -2794,7 +2847,7 @@ "buffer-to-arraybuffer": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" }, "buffer-xor": { "version": "1.0.3", @@ -2802,24 +2855,29 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "bufferutil": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.1.tgz", - "integrity": "sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", "requires": { - "node-gyp-build": "~3.7.0" + "node-gyp-build": "^4.3.0" }, "dependencies": { "node-gyp-build": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz", - "integrity": "sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==" + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==" } } }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" }, "cacheable-request": { "version": "6.1.0", @@ -2854,7 +2912,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -2981,9 +3038,9 @@ } }, "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "requires": { "mimic-response": "^1.0.0" } @@ -3036,18 +3093,11 @@ "dev": true }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } + "safe-buffer": "5.2.1" } }, "content-hash": { @@ -3061,9 +3111,9 @@ } }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, "convert-source-map": { "version": "1.8.0", @@ -3083,19 +3133,19 @@ } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" }, "core-util-is": { "version": "1.0.2", @@ -3134,9 +3184,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -3220,14 +3270,14 @@ } }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "requires": { "mimic-response": "^1.0.0" } @@ -3271,9 +3321,9 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "des.js": { "version": "1.0.1", @@ -3285,9 +3335,9 @@ } }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "detect-newline": { "version": "3.1.0", @@ -3312,9 +3362,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -3357,9 +3407,9 @@ } }, "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" }, "ecc-jsbn": { "version": "0.1.2", @@ -3373,7 +3423,7 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { "version": "1.4.221", @@ -3434,7 +3484,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "end-of-stream": { "version": "1.4.4", @@ -3514,19 +3564,19 @@ } }, "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" } }, "es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "requires": { "d": "1", "es5-ext": "^0.10.35", @@ -3556,7 +3606,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { "version": "1.0.5", @@ -3979,12 +4029,12 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "eth-ens-namehash": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", + "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", "requires": { "idna-uts46-hx": "^2.3.1", "js-sha3": "^0.5.7" @@ -3993,7 +4043,7 @@ "js-sha3": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" } } }, @@ -4011,31 +4061,16 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, "ethereum-bloom-filters": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz", - "integrity": "sha512-cDcJJSJ9GMAcURiAWO3DxIEhTL/uWqlQnvgKpuYQzYPrt/izuGU+1ntQmHt0IRq6ADoSYHFnB+aCEFIldjhkMQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", + "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", "requires": { "js-sha3": "^0.8.0" } @@ -4077,9 +4112,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "ethereumjs-util": { "version": "6.2.1", @@ -4199,7 +4234,7 @@ "ethjs-unit": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", "requires": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -4208,7 +4243,7 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" } } }, @@ -4286,66 +4321,95 @@ } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } } } }, "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "requires": { - "type": "^2.0.0" + "type": "^2.7.2" }, "dependencies": { "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" } } }, @@ -4463,16 +4527,16 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" } }, @@ -4507,6 +4571,14 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -4523,14 +4595,14 @@ } }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "fs-extra": { "version": "4.0.3", @@ -4566,8 +4638,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "function.prototype.name": { "version": "1.1.5", @@ -4609,7 +4680,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -4685,12 +4755,12 @@ } }, "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", "requires": { "min-document": "^2.19.0", - "process": "~0.5.1" + "process": "^0.11.10" } }, "globals": { @@ -4716,6 +4786,26 @@ "slash": "^3.0.0" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + } + } + }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -4735,9 +4825,9 @@ } }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "har-schema": { "version": "2.0.0", @@ -4757,7 +4847,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -4783,30 +4872,15 @@ "get-intrinsic": "^1.1.1" } }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" - }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "requires": { - "has-symbol-support-x": "^1.4.1" - } + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -4847,33 +4921,26 @@ "dev": true }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" } }, "http-https": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" }, "http-signature": { "version": "1.2.0", @@ -4885,6 +4952,15 @@ "sshpk": "^1.7.0" } }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -4910,7 +4986,7 @@ "punycode": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==" } } }, @@ -4988,6 +5064,15 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -5025,8 +5110,7 @@ "is-callable": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" }, "is-core-module": { "version": "2.10.0", @@ -5069,6 +5153,14 @@ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -5081,7 +5173,7 @@ "is-hex-prefixed": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==" }, "is-negative-zero": { "version": "2.0.2", @@ -5104,16 +5196,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -5124,11 +5206,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" - }, "is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -5138,11 +5215,6 @@ "call-bind": "^1.0.2" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -5161,6 +5233,18 @@ "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -5262,15 +5346,6 @@ "istanbul-lib-report": "^3.0.0" } }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, "jest": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", @@ -5840,7 +5915,7 @@ "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -5881,7 +5956,7 @@ "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "requires": { "graceful-fs": "^4.1.6" } @@ -6041,12 +6116,12 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "merge-stream": { "version": "2.0.0", @@ -6063,7 +6138,7 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "micromatch": { "version": "4.0.5", @@ -6085,9 +6160,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -6123,7 +6198,7 @@ "min-document": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", "requires": { "dom-walk": "^0.1.0" } @@ -6150,7 +6225,8 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true }, "minipass": { "version": "2.9.0", @@ -6170,25 +6246,22 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.5.tgz", + "integrity": "sha512-jbjfql+shJtAPrFoKxHOXip4xS+kul9W3OzfzzrqueWK2QMGon2bFH2opl6W9EagBThjEz+iysyi/swOoVfB/w==" }, "mkdirp-promise": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", "requires": { "mkdirp": "*" } }, "mock-fs": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.13.0.tgz", - "integrity": "sha512-DD0vOdofJdoaRNtnWcrXe6RQbpHkPPmtqGq14uRX0F8ZKJ5nv89CVTYl/BZdppDxBDaV0hl75htg3abpEWlPZA==" + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" }, "ms": { "version": "2.0.0", @@ -6236,7 +6309,7 @@ "nano-json-stream-parser": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" + "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" }, "natural-compare": { "version": "1.4.0", @@ -6245,14 +6318,14 @@ "dev": true }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, "node-addon-api": { "version": "2.0.2", @@ -6348,9 +6421,9 @@ "dev": true }, "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" }, "npm-run-path": { "version": "4.0.1", @@ -6364,7 +6437,7 @@ "number-to-bn": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", "requires": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -6373,7 +6446,7 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" } } }, @@ -6385,13 +6458,12 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" }, "object-keys": { "version": "1.1.1", @@ -6436,15 +6508,15 @@ "oboe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=", + "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", "requires": { "http-https": "^1.0.0" } }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { "ee-first": "1.1.1" } @@ -6485,11 +6557,6 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -6508,14 +6575,6 @@ "p-limit": "^2.2.0" } }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "requires": { - "p-finally": "^1.0.0" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -6544,9 +6603,9 @@ } }, "parse-headers": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", - "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" }, "parse-json": { "version": "5.2.0", @@ -6592,7 +6651,7 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "path-type": { "version": "4.0.0", @@ -6653,7 +6712,7 @@ "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" }, "pretty-format": { "version": "28.1.3", @@ -6676,9 +6735,9 @@ } }, "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" }, "progress": { "version": "2.0.3", @@ -6697,11 +6756,11 @@ } }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, @@ -6730,9 +6789,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -6771,6 +6830,11 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -6794,12 +6858,12 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -6957,6 +7021,11 @@ "supports-preserve-symlinks-flag": "^1.0.0" } }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, "resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", @@ -6989,7 +7058,7 @@ "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "requires": { "lowercase-keys": "^1.0.0" } @@ -7093,41 +7162,41 @@ } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" } }, "servify": { @@ -7148,9 +7217,9 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "sha.js": { "version": "2.4.11", @@ -7180,7 +7249,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -7199,9 +7267,9 @@ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" }, "simple-get": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", - "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", + "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", "requires": { "decompress-response": "^3.3.0", "once": "^1.3.1", @@ -7325,14 +7393,14 @@ "integrity": "sha512-6/G+VGJ59nzaNOOampAP/aAjgkzIeJBWIpIX8CJEnJwz5GaADk8hFTe9jv+yqpW4nAwPJk+THw1WvEoEaaR07A==" }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==" }, "string-length": { "version": "4.0.2", @@ -7409,7 +7477,7 @@ "strip-hex-prefix": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", "requires": { "is-hex-prefixed": "1.0.0" } @@ -7446,15 +7514,15 @@ "dev": true }, "swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", + "version": "0.1.42", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", + "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", "requires": { "bluebird": "^3.5.0", "buffer": "^5.0.5", "eth-lib": "^0.1.26", "fs-extra": "^4.0.2", - "got": "^7.1.0", + "got": "^11.8.5", "mime-types": "^2.1.16", "mkdirp-promise": "^5.0.1", "mock-fs": "^4.1.0", @@ -7463,48 +7531,111 @@ "xhr-request": "^1.0.1" }, "dependencies": { + "@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" + }, + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + } + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" + }, "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } }, "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" } }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "requires": { + "json-buffer": "3.0.1" + } }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" + }, + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "requires": { - "prepend-http": "^1.0.1" + "lowercase-keys": "^2.0.0" } } } @@ -7543,17 +7674,32 @@ } }, "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "requires": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + } } }, "terminal-link": { @@ -7586,7 +7732,7 @@ "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==" }, "tmpl": { "version": "1.0.5", @@ -7615,9 +7761,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "touch": { "version": "3.1.0", @@ -7758,9 +7904,9 @@ "dev": true }, "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" }, "universalify": { "version": "0.1.2", @@ -7770,7 +7916,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "update-browserslist-db": { "version": "1.0.5", @@ -7793,7 +7939,7 @@ "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", "requires": { "prepend-http": "^2.0.0" } @@ -7801,25 +7947,20 @@ "url-set-query": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==" }, "utf-8-validate": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.2.tgz", - "integrity": "sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", "requires": { - "node-gyp-build": "~3.7.0" + "node-gyp-build": "^4.3.0" }, "dependencies": { "node-gyp-build": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz", - "integrity": "sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==" + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==" } } }, @@ -7828,6 +7969,18 @@ "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -7836,7 +7989,7 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, "uuid": { "version": "8.3.1", @@ -7868,7 +8021,7 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, "verror": { "version": "1.10.0", @@ -7890,309 +8043,465 @@ } }, "web3": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.3.0.tgz", - "integrity": "sha512-4q9dna0RecnrlgD/bD1C5S+81Untbd6Z/TBD7rb+D5Bvvc0Wxjr4OP70x+LlnwuRDjDtzBwJbNUblh2grlVArw==", - "requires": { - "web3-bzz": "1.3.0", - "web3-core": "1.3.0", - "web3-eth": "1.3.0", - "web3-eth-personal": "1.3.0", - "web3-net": "1.3.0", - "web3-shh": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-bzz": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.3.0.tgz", - "integrity": "sha512-ibYAnKab+sgTo/UdfbrvYfWblXjjgSMgyy9/FHa6WXS14n/HVB+HfWqGz2EM3fok8Wy5XoKGMvdqvERQ/mzq1w==", - "requires": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40", - "underscore": "1.9.1" + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.3.6.tgz", + "integrity": "sha512-jEpPhnL6GDteifdVh7ulzlPrtVQeA30V9vnki9liYlUvLV82ZM7BNOQJiuzlDePuE+jZETZSP/0G/JlUVt6pOA==", + "requires": { + "web3-bzz": "1.3.6", + "web3-core": "1.3.6", + "web3-eth": "1.3.6", + "web3-eth-personal": "1.3.6", + "web3-net": "1.3.6", + "web3-shh": "1.3.6", + "web3-utils": "1.3.6" }, "dependencies": { + "@ethersproject/abi": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", + "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", + "requires": { + "@ethersproject/address": "^5.0.4", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/hash": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/strings": "^5.0.4" + } + }, "@types/node": { - "version": "12.19.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.2.tgz", - "integrity": "sha512-SRH6QM0IMOBBFmDiJ75vlhcbUEYEquvSuhsVW9ijG20JvdFTfOrB1p6ddZxz5y/JNnbf+9HoHhjhOVSX2hsJyA==" + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "web3-bzz": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.3.6.tgz", + "integrity": "sha512-ibHdx1wkseujFejrtY7ZyC0QxQ4ATXjzcNUpaLrvM6AEae8prUiyT/OloG9FWDgFD2CPLwzKwfSQezYQlANNlw==", + "requires": { + "@types/node": "^12.12.6", + "got": "9.6.0", + "swarm-js": "^0.1.40", + "underscore": "1.12.1" + } + }, + "web3-core": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.6.tgz", + "integrity": "sha512-gkLDM4T1Sc0T+HZIwxrNrwPg0IfWI0oABSglP2X5ZbBAYVUeEATA0o92LWV8BeF+okvKXLK1Fek/p6axwM/h3Q==", + "requires": { + "@types/bn.js": "^4.11.5", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.3.6", + "web3-core-method": "1.3.6", + "web3-core-requestmanager": "1.3.6", + "web3-utils": "1.3.6" + } + }, + "web3-core-helpers": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.6.tgz", + "integrity": "sha512-nhtjA2ZbkppjlxTSwG0Ttu6FcPkVu1rCN5IFAOVpF/L0SEt+jy+O5l90+cjDq0jAYvlBwUwnbh2mR9hwDEJCNA==", + "requires": { + "underscore": "1.12.1", + "web3-eth-iban": "1.3.6", + "web3-utils": "1.3.6" + } + }, + "web3-core-method": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.6.tgz", + "integrity": "sha512-RyegqVGxn0cyYW5yzAwkPlsSEynkdPiegd7RxgB4ak1eKk2Cv1q2x4C7D2sZjeeCEF+q6fOkVmo2OZNqS2iQxg==", + "requires": { + "@ethersproject/transactions": "^5.0.0-beta.135", + "underscore": "1.12.1", + "web3-core-helpers": "1.3.6", + "web3-core-promievent": "1.3.6", + "web3-core-subscriptions": "1.3.6", + "web3-utils": "1.3.6" + } + }, + "web3-core-promievent": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.6.tgz", + "integrity": "sha512-Z+QzfyYDTXD5wJmZO5wwnRO8bAAHEItT1XNSPVb4J1CToV/I/SbF7CuF8Uzh2jns0Cm1109o666H7StFFvzVKw==", + "requires": { + "eventemitter3": "4.0.4" + } + }, + "web3-core-requestmanager": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.6.tgz", + "integrity": "sha512-2rIaeuqeo7QN1Eex7aXP0ZqeteJEPWXYFS/M3r3LXMiV8R4STQBKE+//dnHJXoo2ctzEB5cgd+7NaJM8S3gPyA==", + "requires": { + "underscore": "1.12.1", + "util": "^0.12.0", + "web3-core-helpers": "1.3.6", + "web3-providers-http": "1.3.6", + "web3-providers-ipc": "1.3.6", + "web3-providers-ws": "1.3.6" + } + }, + "web3-core-subscriptions": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.6.tgz", + "integrity": "sha512-wi9Z9X5X75OKvxAg42GGIf81ttbNR2TxzkAsp1g+nnp5K8mBwgZvXrIsDuj7Z7gx72Y45mWJADCWjk/2vqNu8g==", + "requires": { + "eventemitter3": "4.0.4", + "underscore": "1.12.1", + "web3-core-helpers": "1.3.6" + } + }, + "web3-eth": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.3.6.tgz", + "integrity": "sha512-9+rnywRRpyX3C4hfsAQXPQh6vHh9XzQkgLxo3gyeXfbhbShUoq2gFVuy42vsRs//6JlsKdyZS7Z3hHPHz2wreA==", + "requires": { + "underscore": "1.12.1", + "web3-core": "1.3.6", + "web3-core-helpers": "1.3.6", + "web3-core-method": "1.3.6", + "web3-core-subscriptions": "1.3.6", + "web3-eth-abi": "1.3.6", + "web3-eth-accounts": "1.3.6", + "web3-eth-contract": "1.3.6", + "web3-eth-ens": "1.3.6", + "web3-eth-iban": "1.3.6", + "web3-eth-personal": "1.3.6", + "web3-net": "1.3.6", + "web3-utils": "1.3.6" + } + }, + "web3-eth-abi": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.6.tgz", + "integrity": "sha512-Or5cRnZu6WzgScpmbkvC6bfNxR26hqiKK4i8sMPFeTUABQcb/FU3pBj7huBLYbp9dH+P5W79D2MqwbWwjj9DoQ==", + "requires": { + "@ethersproject/abi": "5.0.7", + "underscore": "1.12.1", + "web3-utils": "1.3.6" + } + }, + "web3-eth-accounts": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.3.6.tgz", + "integrity": "sha512-Ilr0hG6ONbCdSlVKffasCmNwftD5HsNpwyQASevocIQwHdTlvlwO0tb3oGYuajbKOaDzNTwXfz25bttAEoFCGA==", + "requires": { + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.8", + "ethereumjs-common": "^1.3.2", + "ethereumjs-tx": "^2.1.1", + "scrypt-js": "^3.0.1", + "underscore": "1.12.1", + "uuid": "3.3.2", + "web3-core": "1.3.6", + "web3-core-helpers": "1.3.6", + "web3-core-method": "1.3.6", + "web3-utils": "1.3.6" + } + }, + "web3-eth-contract": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.3.6.tgz", + "integrity": "sha512-8gDaRrLF2HCg+YEZN1ov0zN35vmtPnGf3h1DxmJQK5Wm2lRMLomz9rsWsuvig3UJMHqZAQKD7tOl3ocJocQsmA==", + "requires": { + "@types/bn.js": "^4.11.5", + "underscore": "1.12.1", + "web3-core": "1.3.6", + "web3-core-helpers": "1.3.6", + "web3-core-method": "1.3.6", + "web3-core-promievent": "1.3.6", + "web3-core-subscriptions": "1.3.6", + "web3-eth-abi": "1.3.6", + "web3-utils": "1.3.6" + } + }, + "web3-eth-ens": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.3.6.tgz", + "integrity": "sha512-n27HNj7lpSkRxTgSx+Zo7cmKAgyg2ElFilaFlUu/X2CNH23lXfcPm2bWssivH9z0ndhg0OyR4AYFZqPaqDHkJA==", + "requires": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "underscore": "1.12.1", + "web3-core": "1.3.6", + "web3-core-helpers": "1.3.6", + "web3-core-promievent": "1.3.6", + "web3-eth-abi": "1.3.6", + "web3-eth-contract": "1.3.6", + "web3-utils": "1.3.6" + } + }, + "web3-eth-iban": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.6.tgz", + "integrity": "sha512-nfMQaaLA/zsg5W4Oy/EJQbs8rSs1vBAX6b/35xzjYoutXlpHMQadujDx2RerTKhSHqFXSJeQAfE+2f6mdhYkRQ==", + "requires": { + "bn.js": "^4.11.9", + "web3-utils": "1.3.6" + } + }, + "web3-eth-personal": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.3.6.tgz", + "integrity": "sha512-pOHU0+/h1RFRYoh1ehYBehRbcKWP4OSzd4F7mDljhHngv6W8ewMHrAN8O1ol9uysN2MuCdRE19qkRg5eNgvzFQ==", + "requires": { + "@types/node": "^12.12.6", + "web3-core": "1.3.6", + "web3-core-helpers": "1.3.6", + "web3-core-method": "1.3.6", + "web3-net": "1.3.6", + "web3-utils": "1.3.6" + } + }, + "web3-net": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.3.6.tgz", + "integrity": "sha512-KhzU3wMQY/YYjyMiQzbaLPt2kut88Ncx2iqjy3nw28vRux3gVX0WOCk9EL/KVJBiAA/fK7VklTXvgy9dZnnipw==", + "requires": { + "web3-core": "1.3.6", + "web3-core-method": "1.3.6", + "web3-utils": "1.3.6" + } + }, + "web3-providers-http": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.6.tgz", + "integrity": "sha512-OQkT32O1A06dISIdazpGLveZcOXhEo5cEX6QyiSQkiPk/cjzDrXMw4SKZOGQbbS1+0Vjizm1Hrp7O8Vp2D1M5Q==", + "requires": { + "web3-core-helpers": "1.3.6", + "xhr2-cookies": "1.1.0" + } + }, + "web3-providers-ipc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.6.tgz", + "integrity": "sha512-+TVsSd2sSVvVgHG4s6FXwwYPPT91boKKcRuEFXqEfAbUC5t52XOgmyc2LNiD9LzPhed65FbV4LqICpeYGUvSwA==", + "requires": { + "oboe": "2.1.5", + "underscore": "1.12.1", + "web3-core-helpers": "1.3.6" + } + }, + "web3-providers-ws": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.6.tgz", + "integrity": "sha512-bk7MnJf5or0Re2zKyhR3L3CjGululLCHXx4vlbc/drnaTARUVvi559OI5uLytc/1k5HKUUyENAxLvetz2G1dnQ==", + "requires": { + "eventemitter3": "4.0.4", + "underscore": "1.12.1", + "web3-core-helpers": "1.3.6", + "websocket": "^1.0.32" + } + }, + "web3-shh": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.3.6.tgz", + "integrity": "sha512-9zRo415O0iBslxBnmu9OzYjNErzLnzOsy+IOvSpIreLYbbAw0XkDWxv3SfcpKnTIWIACBR4AYMIxmmyi5iB3jw==", + "requires": { + "web3-core": "1.3.6", + "web3-core-method": "1.3.6", + "web3-core-subscriptions": "1.3.6", + "web3-net": "1.3.6" + } + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + } } } }, "web3-core": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.0.tgz", - "integrity": "sha512-BwWvAaKJf4KFG9QsKRi3MNoNgzjI6szyUlgme1qNPxUdCkaS3Rdpa0VKYNHP7M/YTk82/59kNE66mH5vmoaXjA==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.6.tgz", + "integrity": "sha512-gkLDM4T1Sc0T+HZIwxrNrwPg0IfWI0oABSglP2X5ZbBAYVUeEATA0o92LWV8BeF+okvKXLK1Fek/p6axwM/h3Q==", "requires": { "@types/bn.js": "^4.11.5", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-requestmanager": "1.3.0", - "web3-utils": "1.3.0" + "web3-core-helpers": "1.3.6", + "web3-core-method": "1.3.6", + "web3-core-requestmanager": "1.3.6", + "web3-utils": "1.3.6" }, "dependencies": { "@types/node": { - "version": "12.19.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.2.tgz", - "integrity": "sha512-SRH6QM0IMOBBFmDiJ75vlhcbUEYEquvSuhsVW9ijG20JvdFTfOrB1p6ddZxz5y/JNnbf+9HoHhjhOVSX2hsJyA==" - }, - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" } } }, "web3-core-helpers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.0.tgz", - "integrity": "sha512-+MFb1kZCrRctf7UYE7NCG4rGhSXaQJ/KF07di9GVK1pxy1K0+rFi61ZobuV1ky9uQp+uhhSPts4Zp55kRDB5sw==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.6.tgz", + "integrity": "sha512-nhtjA2ZbkppjlxTSwG0Ttu6FcPkVu1rCN5IFAOVpF/L0SEt+jy+O5l90+cjDq0jAYvlBwUwnbh2mR9hwDEJCNA==", "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.3.0", - "web3-utils": "1.3.0" + "underscore": "1.12.1", + "web3-eth-iban": "1.3.6", + "web3-utils": "1.3.6" } }, "web3-core-method": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.0.tgz", - "integrity": "sha512-h0yFDrYVzy5WkLxC/C3q+hiMnzxdWm9p1T1rslnuHgOp6nYfqzu/6mUIXrsS4h/OWiGJt+BZ0xVZmtC31HDWtg==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.6.tgz", + "integrity": "sha512-RyegqVGxn0cyYW5yzAwkPlsSEynkdPiegd7RxgB4ak1eKk2Cv1q2x4C7D2sZjeeCEF+q6fOkVmo2OZNqS2iQxg==", "requires": { "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "web3-core-promievent": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-utils": "1.3.0" + "underscore": "1.12.1", + "web3-core-helpers": "1.3.6", + "web3-core-promievent": "1.3.6", + "web3-core-subscriptions": "1.3.6", + "web3-utils": "1.3.6" } }, "web3-core-promievent": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.0.tgz", - "integrity": "sha512-blv69wrXw447TP3iPvYJpllkhW6B18nfuEbrfcr3n2Y0v1Jx8VJacNZFDFsFIcgXcgUIVCtOpimU7w9v4+rtaw==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.6.tgz", + "integrity": "sha512-Z+QzfyYDTXD5wJmZO5wwnRO8bAAHEItT1XNSPVb4J1CToV/I/SbF7CuF8Uzh2jns0Cm1109o666H7StFFvzVKw==", "requires": { "eventemitter3": "4.0.4" } }, "web3-core-requestmanager": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.0.tgz", - "integrity": "sha512-3yMbuGcomtzlmvTVqNRydxsx7oPlw3ioRL6ReF9PeNYDkUsZaUib+6Dp5eBt7UXh5X+SIn/xa1smhDHz5/HpAw==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.6.tgz", + "integrity": "sha512-2rIaeuqeo7QN1Eex7aXP0ZqeteJEPWXYFS/M3r3LXMiV8R4STQBKE+//dnHJXoo2ctzEB5cgd+7NaJM8S3gPyA==", "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "web3-providers-http": "1.3.0", - "web3-providers-ipc": "1.3.0", - "web3-providers-ws": "1.3.0" + "underscore": "1.12.1", + "util": "^0.12.0", + "web3-core-helpers": "1.3.6", + "web3-providers-http": "1.3.6", + "web3-providers-ipc": "1.3.6", + "web3-providers-ws": "1.3.6" } }, "web3-core-subscriptions": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.0.tgz", - "integrity": "sha512-MUUQUAhJDb+Nz3S97ExVWveH4utoUnsbPWP+q1HJH437hEGb4vunIb9KvN3hFHLB+aHJfPeStM/4yYTz5PeuyQ==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.6.tgz", + "integrity": "sha512-wi9Z9X5X75OKvxAg42GGIf81ttbNR2TxzkAsp1g+nnp5K8mBwgZvXrIsDuj7Z7gx72Y45mWJADCWjk/2vqNu8g==", "requires": { "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0" - } - }, - "web3-eth": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.3.0.tgz", - "integrity": "sha512-/bzJcxXPM9EM18JM5kO2JjZ3nEqVo3HxqU93aWAEgJNqaP/Lltmufl2GpvIB2Hvj+FXAjAXquxUdQ2/xP7BzHQ==", - "requires": { - "underscore": "1.9.1", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-eth-abi": "1.3.0", - "web3-eth-accounts": "1.3.0", - "web3-eth-contract": "1.3.0", - "web3-eth-ens": "1.3.0", - "web3-eth-iban": "1.3.0", - "web3-eth-personal": "1.3.0", - "web3-net": "1.3.0", - "web3-utils": "1.3.0" + "underscore": "1.12.1", + "web3-core-helpers": "1.3.6" } }, "web3-eth-abi": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.0.tgz", - "integrity": "sha512-1OrZ9+KGrBeBRd3lO8upkpNua9+7cBsQAgor9wbA25UrcUYSyL8teV66JNRu9gFxaTbkpdrGqM7J/LXpraXWrg==", - "requires": { - "@ethersproject/abi": "5.0.0-beta.153", - "underscore": "1.9.1", - "web3-utils": "1.3.0" - } - }, - "web3-eth-accounts": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.3.0.tgz", - "integrity": "sha512-/Q7EVW4L2wWUbNRtOTwAIrYvJid/5UnKMw67x/JpvRMwYC+e+744P536Ja6SG4X3MnzFvd3E/jruV4qa6k+zIw==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.6.tgz", + "integrity": "sha512-Or5cRnZu6WzgScpmbkvC6bfNxR26hqiKK4i8sMPFeTUABQcb/FU3pBj7huBLYbp9dH+P5W79D2MqwbWwjj9DoQ==", "requires": { - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-js": "^3.0.1", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-utils": "1.3.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - } + "@ethersproject/abi": "5.0.7", + "underscore": "1.12.1", + "web3-utils": "1.3.6" } }, "web3-eth-contract": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.3.0.tgz", - "integrity": "sha512-3SCge4SRNCnzLxf0R+sXk6vyTOl05g80Z5+9/B5pERwtPpPWaQGw8w01vqYqsYBKC7zH+dxhMaUgVzU2Dgf7bQ==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.3.6.tgz", + "integrity": "sha512-8gDaRrLF2HCg+YEZN1ov0zN35vmtPnGf3h1DxmJQK5Wm2lRMLomz9rsWsuvig3UJMHqZAQKD7tOl3ocJocQsmA==", "requires": { "@types/bn.js": "^4.11.5", - "underscore": "1.9.1", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-promievent": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-eth-abi": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-eth-ens": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.3.0.tgz", - "integrity": "sha512-WnOru+EcuM5dteiVYJcHXo/I7Wq+ei8RrlS2nir49M0QpYvUPGbCGgTbifcjJQTWamgORtWdljSA1s2Asdb74w==", - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-promievent": "1.3.0", - "web3-eth-abi": "1.3.0", - "web3-eth-contract": "1.3.0", - "web3-utils": "1.3.0" + "underscore": "1.12.1", + "web3-core": "1.3.6", + "web3-core-helpers": "1.3.6", + "web3-core-method": "1.3.6", + "web3-core-promievent": "1.3.6", + "web3-core-subscriptions": "1.3.6", + "web3-eth-abi": "1.3.6", + "web3-utils": "1.3.6" } }, "web3-eth-iban": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.0.tgz", - "integrity": "sha512-v9mZWhR4fPF17/KhHLiWir4YHWLe09O3B/NTdhWqw3fdAMJNztzMHGzgHxA/4fU+rhrs/FhDzc4yt32zMEXBZw==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.6.tgz", + "integrity": "sha512-nfMQaaLA/zsg5W4Oy/EJQbs8rSs1vBAX6b/35xzjYoutXlpHMQadujDx2RerTKhSHqFXSJeQAfE+2f6mdhYkRQ==", "requires": { "bn.js": "^4.11.9", - "web3-utils": "1.3.0" + "web3-utils": "1.3.6" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, - "web3-eth-personal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.3.0.tgz", - "integrity": "sha512-2czUhElsJdLpuNfun9GeLiClo5O6Xw+bLSjl3f4bNG5X2V4wcIjX2ygep/nfstLLtkz8jSkgl/bV7esANJyeRA==", - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-net": "1.3.0", - "web3-utils": "1.3.0" - }, - "dependencies": { - "@types/node": { - "version": "12.19.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.2.tgz", - "integrity": "sha512-SRH6QM0IMOBBFmDiJ75vlhcbUEYEquvSuhsVW9ijG20JvdFTfOrB1p6ddZxz5y/JNnbf+9HoHhjhOVSX2hsJyA==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, - "web3-net": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.3.0.tgz", - "integrity": "sha512-Xz02KylOyrB2YZzCkysEDrY7RbKxb7LADzx3Zlovfvuby7HBwtXVexXKtoGqksa+ns1lvjQLLQGb+OeLi7Sr7w==", - "requires": { - "web3-core": "1.3.0", - "web3-core-method": "1.3.0", - "web3-utils": "1.3.0" - } - }, "web3-providers-http": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.0.tgz", - "integrity": "sha512-cMKhUI6PqlY/EC+ZDacAxajySBu8AzW8jOjt1Pe/mbRQgS0rcZyvLePGTTuoyaA8C21F8UW+EE5jj7YsNgOuqA==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.6.tgz", + "integrity": "sha512-OQkT32O1A06dISIdazpGLveZcOXhEo5cEX6QyiSQkiPk/cjzDrXMw4SKZOGQbbS1+0Vjizm1Hrp7O8Vp2D1M5Q==", "requires": { - "web3-core-helpers": "1.3.0", + "web3-core-helpers": "1.3.6", "xhr2-cookies": "1.1.0" } }, "web3-providers-ipc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.0.tgz", - "integrity": "sha512-0CrLuRofR+1J38nEj4WsId/oolwQEM6Yl1sOt41S/6bNI7htdkwgVhSloFIMJMDFHtRw229QIJ6wIaKQz0X1Og==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.6.tgz", + "integrity": "sha512-+TVsSd2sSVvVgHG4s6FXwwYPPT91boKKcRuEFXqEfAbUC5t52XOgmyc2LNiD9LzPhed65FbV4LqICpeYGUvSwA==", "requires": { "oboe": "2.1.5", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0" + "underscore": "1.12.1", + "web3-core-helpers": "1.3.6" } }, "web3-providers-ws": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.0.tgz", - "integrity": "sha512-Im5MthhJnJst8nSoq0TgbyOdaiFQFa5r6sHPOVllhgIgViDqzbnlAFW9sNzQ0Q8VXPNfPIQKi9cOrHlSRNPjRw==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.6.tgz", + "integrity": "sha512-bk7MnJf5or0Re2zKyhR3L3CjGululLCHXx4vlbc/drnaTARUVvi559OI5uLytc/1k5HKUUyENAxLvetz2G1dnQ==", "requires": { "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", + "underscore": "1.12.1", + "web3-core-helpers": "1.3.6", "websocket": "^1.0.32" } }, - "web3-shh": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.3.0.tgz", - "integrity": "sha512-IZTojA4VCwVq+7eEIHuL1tJXtU+LJDhO8Y2QmuwetEWW1iBgWCGPHZasipWP+7kDpSm/5lo5GRxL72FF/Os/tA==", - "requires": { - "web3-core": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-net": "1.3.0" - } - }, "web3-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz", - "integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", "requires": { "bn.js": "^4.11.9", "eth-lib": "0.2.8", @@ -8200,14 +8509,14 @@ "ethjs-unit": "0.1.6", "number-to-bn": "1.7.0", "randombytes": "^2.1.0", - "underscore": "1.9.1", + "underscore": "1.12.1", "utf8": "3.0.0" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "eth-lib": { "version": "0.2.8", @@ -8222,9 +8531,9 @@ } }, "websocket": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.32.tgz", - "integrity": "sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==", + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", "requires": { "bufferutil": "^4.0.1", "debug": "^2.2.0", @@ -8256,6 +8565,19 @@ "is-symbol": "^1.0.3" } }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -8288,12 +8610,29 @@ "signal-exit": "^3.0.7" } }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, "xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", "requires": { - "global": "~4.3.0", + "global": "~4.4.0", "is-function": "^1.0.1", "parse-headers": "^2.0.0", "xtend": "^4.0.0" @@ -8324,7 +8663,7 @@ "xhr2-cookies": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", + "integrity": "sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g==", "requires": { "cookiejar": "^2.1.1" } @@ -8343,7 +8682,7 @@ "yaeti": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==" }, "yallist": { "version": "3.1.1", diff --git a/package.json b/package.json index e6f5afa..9f01921 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.14.2", + "version": "1.15.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,14 +26,15 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-eth": "0.15.0", + "@dydxprotocol/starkex-eth": "0.16.1", "@dydxprotocol/starkex-lib": "1.1.10", "axios": "^0.21.1", "bignumber.js": "^9.0.1", "es6-promisify": "^6.0.1", "ethers": "5.0.18", "uuid": "^8.3.1", - "web3": "1.3.0" + "web3": "1.3.6", + "web3-core": "1.3.6" }, "devDependencies": { "@dydxprotocol/node-service-base-dev": "0.2.9", From 6eaa45e04285e4bdfa4fe59228eae1db4bf6d118 Mon Sep 17 00:00:00 2001 From: James Jia Date: Mon, 11 Dec 2023 09:29:19 -0500 Subject: [PATCH 179/180] v1.16.0 Add sepolia (#223) --- __tests__/onboarding.test.ts | 88 ++++++++++---------- package-lock.json | 156 +++++++++++++++++------------------ package.json | 6 +- src/modules/private.ts | 6 +- 4 files changed, 128 insertions(+), 128 deletions(-) diff --git a/__tests__/onboarding.test.ts b/__tests__/onboarding.test.ts index c36be18..1aa9875 100644 --- a/__tests__/onboarding.test.ts +++ b/__tests__/onboarding.test.ts @@ -31,36 +31,36 @@ const EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_VT_SIG_MAINNET = { publicKey: '078fd43a3ba640a1ff71713e86537ddc08ba25fe9ea37815746f486d790e9115', publicKeyYCoordinate: '0005e95993fd25cfcdd2ec5820b07b784ab8a95d608e8f920240f3ca907ff56d', }; -const EXPECTED_API_KEY_CREDENTIALS_GOERLI = { - key: '1871d1ba-537c-7fe8-743c-172bcd4ae5c6', - secret: 'tQxclqFWip0HL4Q-xkwZb_lTfOQz4GD5CHHpYzWa', - passphrase: 'B8JFepDVn8eixnor7Imv', +const EXPECTED_API_KEY_CREDENTIALS_SEPOLIA = { + key: '30cb6046-8f4a-5677-a19c-a494ccb7c7e5', + secret: '4Yd_6JtH_-I2taoNQKAhkCifnVHQ2Unue88sIeuc', + passphrase: 'Db1GQK5KpI_qeddgjF66', }; -const EXPECTED_STARK_KEY_PAIR_GOERLI = { - publicKey: '03ea05770b452df14427b3f07ff600faa132ecc3d7643275042cb4da6ad99972', - publicKeyYCoordinate: '07310e2ab01978806a6fb6e51a9ee1c9a5c5117c63530ad7dead2b9f72094cc3', - privateKey: '01019187d91b8effe153ab1932930e27c8d01c56ad9cc937c777633c0ffc5a7e', +const EXPECTED_STARK_KEY_PAIR_SEPOLIA = { + publicKey: '015e2e074a7ac9e78edb2ee9f11a0c0c0a080c79758ab81616eea9c032c75265', + publicKeyYCoordinate: '0360408546b64238f80d7a8a336d7304d75f122a7e5bb22cbb7a14f550eac5a8', + privateKey: '02d21c094fedea3e72bef27fbcdceaafd34e88fc4b7586859e26e98b21e63a60', }; -const EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_V_SIG_GOERLI = { - privateKey: '052e820782c82a686f59863828095e82b7287c05bbed2b7b35bada66374bca02', - publicKey: '022cf874307a6352b487d768d1c22f17cdfbcd2044762abae3e2ccab205e7c5f', - publicKeyYCoordinate: '04aa067c547596d6db587ae892fe0c3743c7eec220ed873c39a879c6c7b7aeb6', +const EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_V_SIG_SEPOLIA = { + privateKey: '06a7689f8d44827c8e86f364c858161dc7d3074cc34e83e032691112dcb964f6', + publicKey: '044403c08df2abf4f726f4b7f83761097bb1a84ee4cfd4910bf0fd1a59081cf3', + publicKeyYCoordinate: '006819da149c8fc04391e0a9eb5f0263900a867a5485a093c3f98ec796fe91a4', }; -const EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_T_SIG_GOERLI = { - privateKey: '04e31b91e0808be680168ee5cac6144d4a32e550be387731528ee032fd5d7571', - publicKey: '06e254645e25d32fc90763b386e99b8fe23927205f31fe61c162a446e862ddae', - publicKeyYCoordinate: '063f47210857f29c8a52437e5f070cb646118f88181f9991d4ba3d1dffcceda5', +const EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_T_SIG_SEPOLIA = { + privateKey: '00904b77ed3fde9c6a7f2485e4056eb878ebf473ded2380b0174e629dbfa6f13', + publicKey: '0534e01015261e838b58e855642ccf708f7805be2a820a0daa8c96ad5b23f82c', + publicKeyYCoordinate: '06d87eb3625f7a9ebdc2172fc477bd793490c18337ea06045de86d0d0001dd5b', }; -const EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_VT_SIG_GOERLI = { - privateKey: '035289da1da837881b780d00e14312c97c3c695378d4adbb3d76bde98ecdbc96', - publicKey: '006d181da12e58394e450cd0f577150dc10574a88f2bee37323228d2fd717f66', - publicKeyYCoordinate: '05d1420b2502f89c23e947a0b54a189b17a24fbb15a98e7792504ca271c919c3', +const EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_VT_SIG_SEPOLIA = { + privateKey: '03f9afcb719a7e94a1599fb41d241a0c540a78bed04d31b5446b95497fb9d6cc', + publicKey: '05f39f9f33daa5d36079c7b91e2c34c9eb05a6f73513465a09c3cf74ed8e5008', + publicKeyYCoordinate: '058f723422fca55bdadc4ae8c3b7ab162a5c154949cdbf0acd612b70ad64b75f', }; let onboardingMainnetRemote: Onboarding; -let onboardingGoerliRemote: Onboarding; +let onboardingSepoliaRemote: Onboarding; let onboardingMainnetLocal: Onboarding; -let onboardingGoerliLocal: Onboarding; +let onboardingSepoliaLocal: Onboarding; describe('Onboarding module', () => { @@ -93,31 +93,31 @@ describe('Onboarding module', () => { }); }); - describe('Goerli, with a web3 provider', () => { + describe('SEPOLIA, with a web3 provider', () => { beforeAll(async () => { const web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545')); - onboardingGoerliRemote = new Onboarding('http://example.com', web3, 5); + onboardingSepoliaRemote = new Onboarding('http://example.com', web3, 11155111); }); it('derives the default STARK key pair', async () => { - const keyPair = await onboardingGoerliRemote.deriveStarkKey(GANACHE_ADDRESS); - expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_GOERLI); + const keyPair = await onboardingSepoliaRemote.deriveStarkKey(GANACHE_ADDRESS); + expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_SEPOLIA); }); it('derives all possible STARK key pairs', async () => { - const allKeyPairs = await onboardingGoerliRemote.deriveAllStarkKeys(GANACHE_ADDRESS); + const allKeyPairs = await onboardingSepoliaRemote.deriveAllStarkKeys(GANACHE_ADDRESS); expect(allKeyPairs).toStrictEqual([ - EXPECTED_STARK_KEY_PAIR_GOERLI, - EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_V_SIG_GOERLI, - EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_T_SIG_GOERLI, - EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_VT_SIG_GOERLI, + EXPECTED_STARK_KEY_PAIR_SEPOLIA, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_V_SIG_SEPOLIA, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_T_SIG_SEPOLIA, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_VT_SIG_SEPOLIA, ]); }); it('derives the default API key pair', async () => { - const apiKey = await onboardingGoerliRemote.recoverDefaultApiCredentials(GANACHE_ADDRESS); - expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_GOERLI); + const apiKey = await onboardingSepoliaRemote.recoverDefaultApiCredentials(GANACHE_ADDRESS); + expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_SEPOLIA); }); }); @@ -150,33 +150,33 @@ describe('Onboarding module', () => { }); }); - describe('Goerli, with a local Ethereum private key', () => { + describe('SEPOLIA, with a local Ethereum private key', () => { beforeAll(() => { const web3 = new Web3(); - onboardingGoerliLocal = new Onboarding('http://example.com', web3, 5); + onboardingSepoliaLocal = new Onboarding('http://example.com', web3, 11155111); web3.eth.accounts.wallet.add(GANACHE_PRIVATE_KEY); }); it('derives the default STARK key pair', async () => { - const keyPair = await onboardingGoerliLocal.deriveStarkKey(GANACHE_ADDRESS); - expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_GOERLI); + const keyPair = await onboardingSepoliaLocal.deriveStarkKey(GANACHE_ADDRESS); + expect(keyPair).toStrictEqual(EXPECTED_STARK_KEY_PAIR_SEPOLIA); }); it('derives all possible STARK key pairs', async () => { - const allKeyPairs = await onboardingGoerliLocal.deriveAllStarkKeys(GANACHE_ADDRESS); + const allKeyPairs = await onboardingSepoliaLocal.deriveAllStarkKeys(GANACHE_ADDRESS); expect(allKeyPairs).toStrictEqual([ - EXPECTED_STARK_KEY_PAIR_GOERLI, - EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_V_SIG_GOERLI, - EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_T_SIG_GOERLI, - EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_VT_SIG_GOERLI, + EXPECTED_STARK_KEY_PAIR_SEPOLIA, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_V_SIG_SEPOLIA, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_T_SIG_SEPOLIA, + EXPECTED_STARK_KEY_PAIR_FROM_ROTATED_VT_SIG_SEPOLIA, ]); }); it('derives the default API key pair', async () => { - const apiKey = await onboardingGoerliLocal.recoverDefaultApiCredentials(GANACHE_ADDRESS); - expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_GOERLI); + const apiKey = await onboardingSepoliaLocal.recoverDefaultApiCredentials(GANACHE_ADDRESS); + expect(apiKey).toStrictEqual(EXPECTED_API_KEY_CREDENTIALS_SEPOLIA); }); }); }); diff --git a/package-lock.json b/package-lock.json index c490d3a..0a2c2e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.15.0", + "version": "1.16.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -520,9 +520,9 @@ } }, "@dydxprotocol/starkex-eth": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.16.1.tgz", - "integrity": "sha512-G82a9Yg0UWjZVtObB0b6TlwuPabgSpzbJczXzJsNYF3Njc9nA270Th8obIuFlEp7I/dMOmRKZjRNbHF1cT688g==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-eth/-/starkex-eth-0.18.0.tgz", + "integrity": "sha512-TEaJUiDdpwls1XE3ppOMy7f2GIWu4MlCkz8f7Au6v+hZLl7DF5EtkGPhLJs1qpA+8SBMQ83hBkLMUi+NIF+b4w==", "requires": { "@types/big.js": "^6.0.0", "@types/elliptic": "^6.4.12", @@ -546,16 +546,16 @@ } }, "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" } } }, "@dydxprotocol/starkex-lib": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.1.10.tgz", - "integrity": "sha512-LTkU2+QhfAmD25V6xYPdZHZsN0W5+ZeROQH0KSP0uZ/pZ+nE+45/Qpq+xlgXlmDLe7HQix+IypUkhVu5iKPN+A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@dydxprotocol/starkex-lib/-/starkex-lib-1.2.0.tgz", + "integrity": "sha512-YK+1b+VtX+YWmoZYYTQ8GcvXKa7AlZmiDEI00iyIMoeMBJx0uA/oXdFmt1e4rd9/WiUSlDuy5dz+qtoKhrR1ZQ==", "requires": { "@types/big.js": "6.0.0", "@types/elliptic": "^6.4.12", @@ -572,6 +572,11 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.0.0.tgz", "integrity": "sha512-EESIS1UIBimpfgoO0Ns9C4wnu/dA5pGa6mZDBSwZkshPRAmgLPu9yHEM8xDsmhZRT5sy+q/o6y922G2tP5kY2w==" + }, + "big.js": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.0.3.tgz", + "integrity": "sha512-n6yn1FyVL1EW2DBAr4jlU/kObhRzmr+NNRESl65VIOT8WBJj/Kezpx2zFdhJUqYI6qrtTW7moCStYL5VxeVdPA==" } } }, @@ -1835,6 +1840,11 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1940,9 +1950,9 @@ } }, "@types/big.js": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.1.6.tgz", - "integrity": "sha512-0r9J+Zz9rYm2hOTwiMAVkm3XFQ4u5uTK37xrQMhc9bysn/sf/okzovWMYYIBMFTn/yrEZ11pusgLEaoarTlQbA==" + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.2.2.tgz", + "integrity": "sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==" }, "@types/bn.js": { "version": "4.11.6", @@ -1964,9 +1974,9 @@ } }, "@types/elliptic": { - "version": "6.4.12", - "resolved": "https://registry.npmjs.org/@types/elliptic/-/elliptic-6.4.12.tgz", - "integrity": "sha512-gP1KsqoouLJGH6IJa28x7PXb3cRqh83X8HCLezd2dF+XcAIMKYv53KV+9Zn6QA561E120uOqZBQ+Jy/cl+fviw==", + "version": "6.4.18", + "resolved": "https://registry.npmjs.org/@types/elliptic/-/elliptic-6.4.18.tgz", + "integrity": "sha512-UseG6H5vjRiNpQvrhy4VF/JXdA3V/Fp5amvveaL+fs28BZ6xIKJBPnUPRlEaZpysD9MbpfaLi8lbl7PGUAkpWw==", "requires": { "@types/bn.js": "*" } @@ -2400,7 +2410,7 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "array-includes": { "version": "3.1.5", @@ -2614,9 +2624,9 @@ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "big.js": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.0.3.tgz", - "integrity": "sha512-n6yn1FyVL1EW2DBAr4jlU/kObhRzmr+NNRESl65VIOT8WBJj/Kezpx2zFdhJUqYI6qrtTW7moCStYL5VxeVdPA==" + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", + "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==" }, "bigint-buffer": { "version": "1.1.5", @@ -2646,21 +2656,11 @@ } }, "bip39": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.3.tgz", - "integrity": "sha512-P0dKrz4g0V0BjXfx7d9QNkJ/Txcz/k+hM9TnjqjUaXtuOfAvxXSw2rJw8DX0e3ZPwnK/IgDxoRqf0bvoVCqbMg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", "requires": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - }, - "dependencies": { - "@types/node": { - "version": "11.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" - } + "@noble/hashes": "^1.2.0" } }, "blakejs": { @@ -2847,7 +2847,7 @@ "buffer-to-arraybuffer": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" + "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" }, "buffer-xor": { "version": "1.0.3", @@ -3140,7 +3140,7 @@ "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "cookiejar": { "version": "2.1.4", @@ -3277,7 +3277,7 @@ "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "requires": { "mimic-response": "^1.0.0" } @@ -3423,7 +3423,7 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { "version": "1.4.221", @@ -3484,7 +3484,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "end-of-stream": { "version": "1.4.4", @@ -3576,7 +3576,7 @@ "es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { "d": "1", "es5-ext": "^0.10.35", @@ -3606,7 +3606,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", @@ -4029,12 +4029,12 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eth-ens-namehash": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", "requires": { "idna-uts46-hx": "^2.3.1", "js-sha3": "^0.5.7" @@ -4043,7 +4043,7 @@ "js-sha3": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" } } }, @@ -4145,9 +4145,9 @@ }, "dependencies": { "@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", "requires": { "@types/node": "*" } @@ -4234,7 +4234,7 @@ "ethjs-unit": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", "requires": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -4243,7 +4243,7 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" } } }, @@ -4602,7 +4602,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "fs-extra": { "version": "4.0.3", @@ -4940,7 +4940,7 @@ "http-https": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" }, "http-signature": { "version": "1.2.0", @@ -4986,7 +4986,7 @@ "punycode": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==" + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" } } }, @@ -5173,7 +5173,7 @@ "is-hex-prefixed": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==" + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" }, "is-negative-zero": { "version": "2.0.2", @@ -5915,7 +5915,7 @@ "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -5956,7 +5956,7 @@ "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { "graceful-fs": "^4.1.6" } @@ -6116,12 +6116,12 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "merge-stream": { "version": "2.0.0", @@ -6138,7 +6138,7 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { "version": "4.0.5", @@ -6198,7 +6198,7 @@ "min-document": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", "requires": { "dom-walk": "^0.1.0" } @@ -6253,7 +6253,7 @@ "mkdirp-promise": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", "requires": { "mkdirp": "*" } @@ -6309,7 +6309,7 @@ "nano-json-stream-parser": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" + "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" }, "natural-compare": { "version": "1.4.0", @@ -6437,7 +6437,7 @@ "number-to-bn": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", "requires": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -6446,7 +6446,7 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" } } }, @@ -6458,7 +6458,7 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-inspect": { "version": "1.12.2", @@ -6508,7 +6508,7 @@ "oboe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", + "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=", "requires": { "http-https": "^1.0.0" } @@ -6651,7 +6651,7 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { "version": "4.0.0", @@ -6712,7 +6712,7 @@ "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, "pretty-format": { "version": "28.1.3", @@ -7058,7 +7058,7 @@ "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "requires": { "lowercase-keys": "^1.0.0" } @@ -7400,7 +7400,7 @@ "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==" + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-length": { "version": "4.0.2", @@ -7477,7 +7477,7 @@ "strip-hex-prefix": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", "requires": { "is-hex-prefixed": "1.0.0" } @@ -7732,7 +7732,7 @@ "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==" + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "tmpl": { "version": "1.0.5", @@ -7916,7 +7916,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "update-browserslist-db": { "version": "1.0.5", @@ -7939,7 +7939,7 @@ "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", "requires": { "prepend-http": "^2.0.0" } @@ -7947,7 +7947,7 @@ "url-set-query": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==" + "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" }, "utf-8-validate": { "version": "5.0.10", @@ -7989,7 +7989,7 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { "version": "8.3.1", @@ -8021,7 +8021,7 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "verror": { "version": "1.10.0", @@ -8663,7 +8663,7 @@ "xhr2-cookies": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g==", + "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", "requires": { "cookiejar": "^2.1.1" } @@ -8682,7 +8682,7 @@ "yaeti": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==" + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" }, "yallist": { "version": "3.1.1", diff --git a/package.json b/package.json index 9f01921..8a48681 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dydxprotocol/v3-client", - "version": "1.15.0", + "version": "1.16.0", "description": "Trading client library for the new dYdX system (v3 API)", "main": "build/src/index.js", "scripts": { @@ -26,8 +26,8 @@ }, "homepage": "https://github.com/dydxprotocol/v3-client#readme", "dependencies": { - "@dydxprotocol/starkex-eth": "0.16.1", - "@dydxprotocol/starkex-lib": "1.1.10", + "@dydxprotocol/starkex-eth": "0.18.0", + "@dydxprotocol/starkex-lib": "1.2.0", "axios": "^0.21.1", "bignumber.js": "^9.0.1", "es6-promisify": "^6.0.1", diff --git a/src/modules/private.ts b/src/modules/private.ts index 668b55b..63651bb 100644 --- a/src/modules/private.ts +++ b/src/modules/private.ts @@ -941,9 +941,9 @@ export default class Private { * NOTE: this will not work on Mainnet/Production. */ async requestTestnetTokens(): Promise<{ transfer: TransferResponseObject }> { - // Goerli - if (this.networkId !== 5) { - throw new Error('Network is not Goerli'); + // Sepolia + if (this.networkId !== 11155111) { + throw new Error('Network is not Sepolia'); } return this.post( From 72340cf730c735e28dddac5bf443342444ca1be2 Mon Sep 17 00:00:00 2001 From: HEARTLIN KARAN MACHADO Date: Fri, 6 Feb 2026 20:31:16 +0000 Subject: [PATCH 180/180] chore(security): add BlockIntel signing guard (optional) --- .gitignore | 2 +- blockintel-gate.ts | 17 +++++++++++++++++ package.json | 5 +++-- 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 blockintel-gate.ts diff --git a/.gitignore b/.gitignore index fd5065b..4303553 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,4 @@ npm-debug.log # vim *.swo -*.swp +*.swp*.nexus.backup diff --git a/blockintel-gate.ts b/blockintel-gate.ts new file mode 100644 index 0000000..cd45543 --- /dev/null +++ b/blockintel-gate.ts @@ -0,0 +1,17 @@ +/** + * BlockIntel Gate — use sendWithGate(signer, tx) for Gate-protected transaction sends. + * Replace signer.sendTransaction(tx) with: + * import { sendWithGate } from "./blockintel-gate"; + * await sendWithGate(signer, tx); + */ +import { Gate } from "blockintel-gate-sdk"; + +const gate = new Gate({ apiKey: process.env.BLOCKINTEL_API_KEY }); +const ctx = { requestId: "nexus_v1", reason: "opt-in" }; + +export async function sendWithGate( + signer: { sendTransaction: (tx: unknown) => Promise }, + tx: unknown +): Promise { + return gate.guard(ctx, async () => signer.sendTransaction(tx)); +} diff --git a/package.json b/package.json index 8a48681..ee1a3a0 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,8 @@ "ethers": "5.0.18", "uuid": "^8.3.1", "web3": "1.3.6", - "web3-core": "1.3.6" + "web3-core": "1.3.6", + "blockintel-gate-sdk": "^0.3.6" }, "devDependencies": { "@dydxprotocol/node-service-base-dev": "0.2.9", @@ -42,4 +43,4 @@ "@types/ffi-napi": "^4.0.4", "@types/uuid": "^8.3.0" } -} +} \ No newline at end of file