diff --git a/package.json b/package.json index d7061e9..e1e850c 100644 --- a/package.json +++ b/package.json @@ -22,12 +22,10 @@ "test": "npm run compile-test && mocha 'src/**/__tests__/*.test.ts'" }, "peerDependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/providers": "^5.7.1" + "ethers": "^6.4.0" }, "devDependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/providers": "^5.7.1", + "ethers": "^6.4.0", "@types/chai": "^4.3.4", "@types/chai-as-promised": "^7.1.5", "@types/mocha": "^10.0.1", @@ -45,9 +43,5 @@ "ts-node": "^10.9.1", "tsc-alias": "^1.8.2", "typescript": "^4.8.3" - }, - "dependencies": { - "@ethersproject/contracts": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" } } diff --git a/src/models/response-types.ts b/src/models/response-types.ts index d689663..5a82158 100644 --- a/src/models/response-types.ts +++ b/src/models/response-types.ts @@ -1,4 +1,5 @@ -import { BigNumber } from '@ethersproject/bignumber'; +/// +import { PreparedTransactionRequest } from 'ethers'; import { MerkletreeScanStatus } from './merkletree-scan'; import { FeesSerialized } from './network-config'; @@ -24,45 +25,21 @@ export type TransactionGasDetails = export type TransactionGasDetailsType0 = { evmGasType: EVMGasType.Type0; - gasEstimate: BigNumber; - gasPrice: BigNumber; + gasEstimate: bigint; + gasPrice: bigint; }; export type TransactionGasDetailsType1 = { evmGasType: EVMGasType.Type1; - gasEstimate: BigNumber; - gasPrice: BigNumber; + gasEstimate: bigint; + gasPrice: bigint; }; export type TransactionGasDetailsType2 = { evmGasType: EVMGasType.Type2; - gasEstimate: BigNumber; - maxFeePerGas: BigNumber; - maxPriorityFeePerGas: BigNumber; -}; - -export type TransactionGasDetailsSerialized = - | TransactionGasDetailsSerializedType0 - | TransactionGasDetailsSerializedType1 - | TransactionGasDetailsSerializedType2; - -export type TransactionGasDetailsSerializedType0 = { - evmGasType: EVMGasType.Type0; - gasEstimateString: string; - gasPriceString: string; -}; - -export type TransactionGasDetailsSerializedType1 = { - evmGasType: EVMGasType.Type1; - gasEstimateString: string; - gasPriceString: string; -}; - -export type TransactionGasDetailsSerializedType2 = { - evmGasType: EVMGasType.Type2; - gasEstimateString: string; - maxFeePerGasString: string; - maxPriorityFeePerGasString: string; + gasEstimate: bigint; + maxFeePerGas: bigint; + maxPriorityFeePerGas: bigint; }; export enum ChainType { @@ -96,9 +73,9 @@ export type RailgunWalletInfo = { railgunAddress: string; }; -export type RailgunWalletAddressDataSerialized = { - masterPublicKey: string; - viewingPublicKey: string; +export type RailgunWalletAddressData = { + masterPublicKey: bigint; + viewingPublicKey: bigint; }; export type RailgunTxidFromNullifiersResponse = { @@ -106,18 +83,18 @@ export type RailgunTxidFromNullifiersResponse = { }; export type RailgunPopulateTransactionResponse = { - serializedTransaction: string; + transaction: PreparedTransactionRequest; nullifiers?: string[]; }; export type RailgunTransactionGasEstimateResponse = { - gasEstimateString: string; + gasEstimate: bigint; relayerFeeCommitment?: CommitmentSummary; }; export type RailgunERC20Amount = { tokenAddress: string; - amountString: string; + amount: bigint; }; export type RailgunERC20AmountRecipient = RailgunERC20Amount & { @@ -136,7 +113,7 @@ export type RailgunNFTAmount = { nftAddress: string; nftTokenType: NFTTokenType; tokenSubID: string; - amountString: string; + amount: bigint; }; export type RailgunNFTAmountRecipient = RailgunNFTAmount & { @@ -212,10 +189,6 @@ export type TransactionHistoryItem = { category: TransactionHistoryItemCategory; }; -export type TransactionHistorySerializedResponse = { - items: TransactionHistoryItem[]; -}; - type Ciphertext = { iv: string; tag: string; diff --git a/src/utils/__tests__/gas.test.ts b/src/utils/__tests__/gas.test.ts index bf46141..ad8acf8 100644 --- a/src/utils/__tests__/gas.test.ts +++ b/src/utils/__tests__/gas.test.ts @@ -1,57 +1,26 @@ import chai from 'chai'; import chaiAsPromised from 'chai-as-promised'; -import { BigNumber } from '@ethersproject/bignumber'; -import { - calculateGasLimit, - calculateMaximumGas, - deserializeTransactionGasDetails, - serializeTransactionGasDetails, -} from '../gas'; -import { decimalStringToHexString, decimalToHexString } from '../format'; -import { - EVMGasType, - TransactionGasDetails, - TransactionGasDetailsSerialized, -} from '../../models/response-types'; +import { calculateGasLimit, calculateMaximumGas } from '../gas'; +import { EVMGasType, TransactionGasDetails } from '../../models/response-types'; chai.use(chaiAsPromised); const { expect } = chai; describe('gas', () => { it('Should calculate gas limit correctly', () => { - const gasEstimate = BigNumber.from('100000'); - const gasLimitString = calculateGasLimit(gasEstimate).toHexString(); - expect(gasLimitString).to.equal(decimalStringToHexString('120000')); + const gasEstimate = BigInt('100000'); + const gasLimit = calculateGasLimit(gasEstimate); + expect(Number(gasLimit)).to.equal(120000); }); it('Should calculate maximum gas correctly', () => { const gasDetails: TransactionGasDetails = { evmGasType: EVMGasType.Type2, - gasEstimate: BigNumber.from('100000'), - maxFeePerGas: BigNumber.from('20000'), - maxPriorityFeePerGas: BigNumber.from('500'), + gasEstimate: BigInt('100000'), + maxFeePerGas: BigInt('20000'), + maxPriorityFeePerGas: BigInt('500'), }; - const gasLimitString = calculateMaximumGas(gasDetails).toHexString(); - expect(gasLimitString).to.equal(decimalStringToHexString('2400000000')); - }); - - it('Should serialize tx gas details', () => { - const gasDetails: TransactionGasDetails = { - evmGasType: EVMGasType.Type2, - gasEstimate: BigNumber.from('10'), - maxFeePerGas: BigNumber.from('20'), - maxPriorityFeePerGas: BigNumber.from('1'), - }; - const serialized = serializeTransactionGasDetails(gasDetails); - const expectedSerialized: TransactionGasDetailsSerialized = { - evmGasType: EVMGasType.Type2, - gasEstimateString: decimalToHexString(10), - maxFeePerGasString: decimalToHexString(20), - maxPriorityFeePerGasString: decimalToHexString(1), - }; - expect(serialized).to.deep.equal(expectedSerialized); - expect(deserializeTransactionGasDetails(serialized)).to.deep.equal( - gasDetails, - ); + const gasLimit = calculateMaximumGas(gasDetails); + expect(gasLimit.toString()).to.equal('2400000000'); }); }); diff --git a/src/utils/available-rpc.ts b/src/utils/available-rpc.ts index c45ac7c..87d4e41 100644 --- a/src/utils/available-rpc.ts +++ b/src/utils/available-rpc.ts @@ -1,4 +1,4 @@ -import { JsonRpcProvider } from '@ethersproject/providers'; +import { JsonRpcProvider } from 'ethers'; import { ProviderJson } from './fallback-provider'; import { getUpperBoundMedian } from './median'; import { promiseTimeout } from './promises'; diff --git a/src/utils/fallback-provider.ts b/src/utils/fallback-provider.ts index d2d857c..3dc9268 100644 --- a/src/utils/fallback-provider.ts +++ b/src/utils/fallback-provider.ts @@ -1,8 +1,5 @@ -import { - FallbackProvider, - StaticJsonRpcProvider, - WebSocketProvider, -} from '@ethersproject/providers'; +import { FallbackProvider, WebSocketProvider } from 'ethers'; +import { PollingJsonRpcProvider } from './polling-json-rpc-provider'; export type FallbackProviderJsonConfig = { chainId: number; @@ -15,47 +12,15 @@ export type ProviderJson = { provider: string; }; -type ProviderDebug = { - action: string; - rid: number; - backend: { - weight: number; - start: number; - duration: number; - result?: string[]; - error?: typeof Error; - provider?: StaticJsonRpcProvider; - }; - request: { method: string; params: { filter?: object } }; - provider: FallbackProvider; -}; - export const createFallbackProviderFromJsonConfig = ( config: FallbackProviderJsonConfig, - debugMessage?: (msg: string) => void, ): FallbackProvider => { try { const providers = config.providers.map(json => { const isWebsocket = json.provider.startsWith('wss'); const provider = isWebsocket ? new WebSocketProvider(json.provider, Number(config.chainId)) - : new StaticJsonRpcProvider(json.provider, Number(config.chainId)); - - if (debugMessage) { - provider.on('debug', (debug: ProviderDebug) => { - if (debug.backend && debug.backend.error) { - debugMessage(`Provider error: ${debug.backend.error}`); - debugMessage( - `Provider connection: ${ - debug.backend.provider - ? debug.backend.provider.connection - : undefined - }`, - ); - } - }); - } - + : new PollingJsonRpcProvider(json.provider, Number(config.chainId)); return { ...json, provider, diff --git a/src/utils/format.ts b/src/utils/format.ts index 21c40fc..36b7837 100644 --- a/src/utils/format.ts +++ b/src/utils/format.ts @@ -1,9 +1,3 @@ -import { BigNumber } from '@ethersproject/bignumber'; - -export const decimalStringToHexString = (dec: string) => { - return BigNumber.from(dec).toHexString(); -}; - -export const decimalToHexString = (dec: number) => { - return BigNumber.from(dec).toHexString(); +export const decimalToHexString = (dec: string | number) => { + return BigInt(dec).toString(16); }; diff --git a/src/utils/gas.ts b/src/utils/gas.ts index 9bacd11..5612585 100644 --- a/src/utils/gas.ts +++ b/src/utils/gas.ts @@ -1,11 +1,5 @@ -/// -import { BigNumber } from '@ethersproject/bignumber'; import { NetworkName, NETWORK_CONFIG } from '../models/network-config'; -import { - EVMGasType, - TransactionGasDetails, - TransactionGasDetailsSerialized, -} from '../models/response-types'; +import { EVMGasType, TransactionGasDetails } from '../models/response-types'; export const getEVMGasTypeForTransaction = ( networkName: NetworkName, @@ -22,9 +16,9 @@ export const getEVMGasTypeForTransaction = ( return defaultEVMGasType; }; -export const calculateGasLimit = (gasEstimate: BigNumber): BigNumber => { +export const calculateGasLimit = (gasEstimate: bigint): bigint => { // Gas Limit: Add 20% to gas estimate. - return gasEstimate.mul(12000).div(10000); + return (gasEstimate * 12000n) / 10000n; }; export const calculateGasPrice = (gasDetails: TransactionGasDetails) => { @@ -44,73 +38,13 @@ export const calculateTotalGas = ( ) => { const gasPrice = calculateGasPrice(transactionGasDetails); const { gasEstimate } = transactionGasDetails; - return gasEstimate.mul(gasPrice); + return gasEstimate * gasPrice; }; export const calculateMaximumGas = ( transactionGasDetails: TransactionGasDetails, -): BigNumber => { +): bigint => { const gasPrice = calculateGasPrice(transactionGasDetails); const { gasEstimate } = transactionGasDetails; - return calculateGasLimit(gasEstimate).mul(gasPrice); -}; - -export const serializeTransactionGasDetails = ( - gasDetails: TransactionGasDetails, -): TransactionGasDetailsSerialized => { - switch (gasDetails.evmGasType) { - case EVMGasType.Type0: - case EVMGasType.Type1: { - const { evmGasType, gasEstimate, gasPrice } = gasDetails; - return { - evmGasType, - gasEstimateString: gasEstimate.toHexString(), - gasPriceString: gasPrice.toHexString(), - }; - } - case EVMGasType.Type2: { - const { evmGasType, gasEstimate, maxFeePerGas, maxPriorityFeePerGas } = - gasDetails; - return { - evmGasType, - gasEstimateString: gasEstimate.toHexString(), - maxFeePerGasString: maxFeePerGas.toHexString(), - maxPriorityFeePerGasString: maxPriorityFeePerGas.toHexString(), - }; - } - } -}; - -export const deserializeTransactionGasDetails = ( - gasDetailsSerialized: Optional, -): Optional => { - if (!gasDetailsSerialized) { - return undefined; - } - switch (gasDetailsSerialized.evmGasType) { - case EVMGasType.Type0: - case EVMGasType.Type1: { - const { evmGasType, gasEstimateString, gasPriceString } = - gasDetailsSerialized; - return { - evmGasType, - gasEstimate: BigNumber.from(gasEstimateString), - gasPrice: BigNumber.from(gasPriceString), - }; - } - case EVMGasType.Type2: { - const { - evmGasType, - gasEstimateString, - maxFeePerGasString, - maxPriorityFeePerGasString, - } = gasDetailsSerialized; - return { - evmGasType, - gasEstimate: BigNumber.from(gasEstimateString), - maxFeePerGas: BigNumber.from(maxFeePerGasString), - maxPriorityFeePerGas: BigNumber.from(maxPriorityFeePerGasString), - }; - } - } + return calculateGasLimit(gasEstimate) * gasPrice; }; diff --git a/src/utils/index.ts b/src/utils/index.ts index f934afd..831031f 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -7,5 +7,4 @@ export * from './format'; export * from './gas'; export * from './network'; export * from './promises'; -export * from './serializer'; export * from './versions'; diff --git a/src/utils/polling-json-rpc-provider.ts b/src/utils/polling-json-rpc-provider.ts new file mode 100644 index 0000000..fbca814 --- /dev/null +++ b/src/utils/polling-json-rpc-provider.ts @@ -0,0 +1,11 @@ +import { JsonRpcProvider, Networkish } from 'ethers'; + +/** + * Uses a setting in JsonRpcProvider to poll for events, + * rather than using sparsely-implemented eth_filter events. + */ +export class PollingJsonRpcProvider extends JsonRpcProvider { + constructor(url: string, network: Networkish) { + super(url, network, { polling: true }); + } +} diff --git a/src/utils/serializer.ts b/src/utils/serializer.ts deleted file mode 100644 index ef2276f..0000000 --- a/src/utils/serializer.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { PopulatedTransaction } from '@ethersproject/contracts'; -import { parse, serialize, Transaction } from '@ethersproject/transactions'; -import { TransactionRequest } from '@ethersproject/providers'; -import { EVMGasType } from '../models/response-types'; - -const validatePreserialize = (transaction: PopulatedTransaction) => { - if (transaction.from) { - throw new Error(`Cannot serialize 'from' field on transaction.`); - } - if (transaction.type === EVMGasType.Type0 && transaction.accessList) { - throw new Error( - `Cannot serialize 'accessList' field on Type0 transaction.`, - ); - } -}; - -export const serializeUnsignedTransaction = ( - transaction: PopulatedTransaction, -): string => { - validatePreserialize(transaction); - return serialize(transaction); -}; - -// export const serializeSignedTransaction = ( -// transaction: PopulatedTransaction, -// signature: SignatureLike, -// ): string => { -// validatePreserialize(transaction); -// return serialize(transaction, signature); -// }; - -export const deserializeTransaction = ( - rawTransaction: string, - nonce: Optional, - chainId: number, -): TransactionRequest => { - const transaction: Transaction = parse(rawTransaction); - return removeUndefinedValues({ - ...transaction, - type: transaction.type ?? undefined, - nonce, - chainId, - - // Set gas-related vars as undefined if they're zero. - gasLimit: transaction.gasLimit?.eq(0) ? undefined : transaction.gasLimit, - gasPrice: transaction.gasPrice?.eq(0) ? undefined : transaction.gasPrice, - maxFeePerGas: transaction.maxFeePerGas?.eq(0) - ? undefined - : transaction.maxFeePerGas, - maxPriorityFeePerGas: transaction.maxPriorityFeePerGas?.eq(0) - ? undefined - : transaction.maxPriorityFeePerGas, - }); -}; - -const removeUndefinedValues = (tx: TransactionRequest): TransactionRequest => { - return Object.fromEntries( - // eslint-disable-next-line @typescript-eslint/no-unused-vars - Object.entries(tx).filter(([_key, value]) => value !== undefined), - ); -}; diff --git a/tsconfig.json b/tsconfig.json index 41c568b..08a45c9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,7 @@ { "compilerOptions": { + "target": "es2020", + "moduleResolution": "node", "sourceMap": true, "inlineSources": true, "declaration": true, diff --git a/yarn.lock b/yarn.lock index 13d83ef..8c13737 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,10 @@ # yarn lockfile v1 +"@adraffy/ens-normalize@git+https://github.com/ricmoo/ens-normalize.js.git": + version "1.9.0" + resolved "git+https://github.com/ricmoo/ens-normalize.js.git#2d040533e57e4f25f9a7cc4715e219658ad454b5" + "@babel/parser@^7.0.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.0.tgz#10a8d4e656bc01128d299a787aa006ce1a91e112" @@ -29,250 +33,6 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@ethersproject/abi@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" - integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/abstract-provider@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" - integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - -"@ethersproject/abstract-signer@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" - integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/address@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" - integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - -"@ethersproject/base64@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" - integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - -"@ethersproject/basex@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" - integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/bignumber@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" - integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - bn.js "^5.2.1" - -"@ethersproject/bytes@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" - integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/constants@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" - integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - -"@ethersproject/contracts@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" - integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== - dependencies: - "@ethersproject/abi" "^5.7.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - -"@ethersproject/hash@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" - integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/keccak256@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" - integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" - integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== - -"@ethersproject/networks@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" - integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/properties@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" - integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/providers@^5.7.1": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.1.tgz#b0799b616d5579cd1067a8ebf1fc1ec74c1e122c" - integrity sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/random@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" - integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/rlp@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" - integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/sha2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" - integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - hash.js "1.1.7" - -"@ethersproject/signing-key@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" - integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - bn.js "^5.2.1" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/strings@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" - integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/transactions@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" - integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - -"@ethersproject/web@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" - integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== - dependencies: - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@humanwhocodes/config-array@^0.10.5": version "0.10.6" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.6.tgz#70b53559baf544dc2cc5eea6082bf90467ccb1dc" @@ -315,6 +75,16 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@noble/hashes@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" + integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== + +"@noble/secp256k1@1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -383,6 +153,11 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== +"@types/node@18.15.13": + version "18.15.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" + integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== + "@types/node@^18.7.23": version "18.7.23" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.23.tgz#75c580983846181ebe5f4abc40fe9dfb2d65665f" @@ -514,6 +289,11 @@ acorn@^8.8.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -615,11 +395,6 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -bech32@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -634,16 +409,6 @@ bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -666,11 +431,6 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -1011,19 +771,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -elliptic@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - 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" - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -1273,6 +1020,19 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +ethers@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.4.0.tgz#82c230a3a018a2627593d24ec4b9c20e9681c341" + integrity sha512-nksaMCwX+BOdV2NQ1/57OehSD2JtujbhrdC2+Fb9VpvBO0WO6h+WWwu3oMMw7aUiTa5lvQcWX1vl4aOy7Q3CTg== + dependencies: + "@adraffy/ens-normalize" "https://github.com/ricmoo/ens-normalize.js" + "@noble/hashes" "1.1.2" + "@noble/secp256k1" "1.7.1" + "@types/node" "18.15.13" + aes-js "4.0.0-beta.5" + tslib "2.4.0" + ws "8.5.0" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -1564,28 +1324,11 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -1802,11 +1545,6 @@ js-sdsl@^4.1.4: resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.4.tgz#78793c90f80e8430b7d8dc94515b6c77d98a26a6" integrity sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw== -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - js-yaml@4.1.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -1945,16 +1683,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - minimatch@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" @@ -2672,6 +2400,11 @@ tsconfig-paths@^3.10.1, tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -2804,10 +2537,10 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -ws@7.4.6: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== y18n@^5.0.5: version "5.0.8"