diff --git a/packages/bridge-ui-v2/.eslintignore b/packages/bridge-ui-v2/.eslintignore index cf90f39dfda..d31e3142a9d 100644 --- a/packages/bridge-ui-v2/.eslintignore +++ b/packages/bridge-ui-v2/.eslintignore @@ -1,5 +1,6 @@ .DS_Store node_modules +coverage /build /.svelte-kit /package diff --git a/packages/bridge-ui-v2/.prettierignore b/packages/bridge-ui-v2/.prettierignore index cf90f39dfda..d31e3142a9d 100644 --- a/packages/bridge-ui-v2/.prettierignore +++ b/packages/bridge-ui-v2/.prettierignore @@ -1,5 +1,6 @@ .DS_Store node_modules +coverage /build /.svelte-kit /package diff --git a/packages/bridge-ui-v2/package.json b/packages/bridge-ui-v2/package.json index f3dc6062d89..eebbbf12654 100644 --- a/packages/bridge-ui-v2/package.json +++ b/packages/bridge-ui-v2/package.json @@ -7,8 +7,9 @@ "build": "vite build", "preview": "vite preview", "test:pw": "playwright test", - "test:unit": "vitest run", - "test:unit:coverage": "vitest run --coverage", + "test:unit": "vitest run --silent", + "test:unit:debug": "vitest run", + "test:unit:coverage": "vitest run --silent --coverage", "test:unit:watch": "vitest", "svelte:check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --ignore ./wagmi.config.ts", "svelte:check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --ignore ./wagmi.config.ts --watch", @@ -25,6 +26,7 @@ "@types/debug": "^4.1.7", "@typescript-eslint/eslint-plugin": "^5.45.0", "@typescript-eslint/parser": "^5.45.0", + "@vitest/coverage-v8": "^0.33.0", "@wagmi/cli": "^1.0.1", "autoprefixer": "^10.4.14", "daisyui": "3.1.7", diff --git a/packages/bridge-ui-v2/src/libs/token/checkMintable.test.ts b/packages/bridge-ui-v2/src/libs/token/checkMintable.test.ts new file mode 100644 index 00000000000..2733f6e4d36 --- /dev/null +++ b/packages/bridge-ui-v2/src/libs/token/checkMintable.test.ts @@ -0,0 +1,120 @@ +import { + type Chain, + getContract, + type GetContractResult, + getPublicClient, + getWalletClient, + type PublicClient, + type WalletClient, +} from '@wagmi/core'; + +import { checkMintable } from './checkMintable'; +import { MintableError, type Token } from './types'; + +vi.mock('@wagmi/core', () => { + return { + getWalletClient: vi.fn(), + getPublicClient: vi.fn(), + getContract: vi.fn(), + }; +}); + +const mockNetwork = { id: 1 } as Chain; + +const mockToken = { + addresses: { 1: '0x123' }, +} as unknown as Token; + +const mockWalletClient = { + account: { address: '0x123' }, +} as unknown as WalletClient; + +const mockTokenContract = { + read: { + minters: vi.fn(), + }, + estimateGas: { + mint: vi.fn(), + }, +} as unknown as GetContractResult; + +const mockPublicClient = { + getGasPrice: vi.fn(), + getBalance: vi.fn(), +} as unknown as PublicClient; + +describe('checkMintable', () => { + beforeAll(() => { + vi.mocked(getWalletClient).mockResolvedValue(mockWalletClient); + vi.mocked(getContract).mockReturnValue(mockTokenContract); + vi.mocked(getPublicClient).mockReturnValue(mockPublicClient); + }); + + it('should throw when wallet is not connected', async () => { + vi.mocked(getWalletClient).mockResolvedValueOnce(null); + + try { + await checkMintable(mockToken, mockNetwork); + expect.fail('should have thrown'); + } catch (error) { + const { cause } = error as Error; + expect(cause).toBe(MintableError.NOT_CONNECTED); + } + }); + + it('should throw when user has already minted', async () => { + vi.mocked(mockTokenContract.read.minters).mockResolvedValueOnce(true); + + try { + await checkMintable(mockToken, mockNetwork); + expect.fail('should have thrown'); + } catch (error) { + const { cause } = error as Error; + expect(cause).toBe(MintableError.TOKEN_MINTED); + } + }); + + it('should throw when user has insufficient balance', async () => { + vi.mocked(mockTokenContract.read.minters).mockResolvedValueOnce(false); + + // Estimated gas to mint is 100 + vi.mocked(mockTokenContract.estimateGas.mint).mockResolvedValueOnce(BigInt(100)); + + // Gas price is 2 + vi.mocked(mockPublicClient.getGasPrice).mockResolvedValueOnce(BigInt(2)); + + // Estimated cost is 100 * 2 = 200 + + // User balance is 100 (less than 200) + vi.mocked(mockPublicClient.getBalance).mockResolvedValueOnce(BigInt(100)); + + try { + await checkMintable(mockToken, mockNetwork); + expect.fail('should have thrown'); + } catch (error) { + const { cause } = error as Error; + expect(cause).toBe(MintableError.INSUFFICIENT_BALANCE); + } + }); + + it('should not throw', async () => { + vi.mocked(mockTokenContract.read.minters).mockResolvedValueOnce(false); + + // Estimated gas to mint is 100 + vi.mocked(mockTokenContract.estimateGas.mint).mockResolvedValueOnce(BigInt(100)); + + // Gas price is 2 + vi.mocked(mockPublicClient.getGasPrice).mockResolvedValueOnce(BigInt(2)); + + // Estimated cost is 100 * 2 = 200 + + // User balance is 300 (more than 200) + vi.mocked(mockPublicClient.getBalance).mockResolvedValueOnce(BigInt(300)); + + try { + await checkMintable(mockToken, mockNetwork); + } catch (error) { + expect.fail('should not have thrown'); + } + }); +}); diff --git a/packages/bridge-ui-v2/src/libs/token/checkMintable.ts b/packages/bridge-ui-v2/src/libs/token/checkMintable.ts index d1bb15cb2f6..848de485316 100644 --- a/packages/bridge-ui-v2/src/libs/token/checkMintable.ts +++ b/packages/bridge-ui-v2/src/libs/token/checkMintable.ts @@ -14,7 +14,7 @@ export async function checkMintable(token: Token, network: Chain) { const walletClient = await getWalletClient({ chainId }); if (!walletClient) { - throw new Error(`user is not connected to ${network.name}`, { cause: MintableError.NOT_CONNECTED }); + throw Error(`user is not connected to ${network.name}`, { cause: MintableError.NOT_CONNECTED }); } const tokenContract = getContract({ diff --git a/packages/bridge-ui-v2/src/libs/token/mint.test.ts b/packages/bridge-ui-v2/src/libs/token/mint.test.ts new file mode 100644 index 00000000000..b7aaae9456d --- /dev/null +++ b/packages/bridge-ui-v2/src/libs/token/mint.test.ts @@ -0,0 +1,46 @@ +import { getContract, type GetContractResult, getWalletClient, type WalletClient } from '@wagmi/core'; + +import { mint } from './mint'; +import type { Token } from './types'; + +vi.mock('@wagmi/core', () => { + return { + getWalletClient: vi.fn(), + getContract: vi.fn(), + }; +}); + +const mockToken = { + symbol: 'MKT', + addresses: { 1: '0x123' }, +} as unknown as Token; + +const mockWalletClient = { + account: { address: '0x123' }, + chain: { id: 1 }, +} as unknown as WalletClient; + +const mockTokenContract = { + write: { + mint: vi.fn(), + }, +} as unknown as GetContractResult; + +describe('mint', () => { + beforeAll(() => { + vi.mocked(getWalletClient).mockResolvedValue(mockWalletClient); + vi.mocked(getContract).mockReturnValue(mockTokenContract); + }); + + it('should throw an error when minting', async () => { + vi.mocked(mockTokenContract.write.mint).mockRejectedValue(new Error('BAM!!')); + + await expect(mint(mockToken, mockWalletClient)).rejects.toThrow(`found a problem minting ${mockToken.symbol}`); + }); + + it('should return a tx hash when minting', async () => { + vi.mocked(mockTokenContract.write.mint).mockResolvedValue('0x123'); + + await expect(mint(mockToken, mockWalletClient)).resolves.toEqual('0x123'); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e7012fa12fc..7aab63b4ba3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -249,6 +249,9 @@ importers: '@typescript-eslint/parser': specifier: ^5.45.0 version: 5.45.0(eslint@8.28.0)(typescript@5.1.6) + '@vitest/coverage-v8': + specifier: ^0.33.0 + version: 0.33.0(vitest@0.32.2) '@wagmi/cli': specifier: ^1.0.1 version: 1.0.1(@wagmi/core@1.3.6)(typescript@5.1.6) @@ -5045,12 +5048,12 @@ packages: /@types/bn.js@4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} dependencies: - '@types/node': 12.20.55 + '@types/node': 20.4.1 /@types/bn.js@5.1.1: resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==} dependencies: - '@types/node': 12.20.55 + '@types/node': 20.4.1 dev: true /@types/cacheable-request@6.0.3: @@ -5058,7 +5061,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 12.20.55 + '@types/node': 20.4.1 '@types/responselike': 1.0.0 dev: true optional: true @@ -5080,13 +5083,13 @@ packages: /@types/concat-stream@1.6.1: resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} dependencies: - '@types/node': 12.20.55 + '@types/node': 20.4.1 dev: true /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 12.20.55 + '@types/node': 20.4.1 /@types/cookie@0.5.1: resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} @@ -5144,14 +5147,14 @@ packages: /@types/form-data@0.0.33: resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} dependencies: - '@types/node': 12.20.55 + '@types/node': 20.4.1 dev: true /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 12.20.55 + '@types/node': 20.4.1 dev: true /@types/glob@8.1.0: @@ -5228,7 +5231,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 12.20.55 + '@types/node': 20.4.1 dev: true optional: true @@ -5241,7 +5244,7 @@ packages: dependencies: '@types/abstract-leveldown': 7.2.1 '@types/level-errors': 3.0.0 - '@types/node': 12.20.55 + '@types/node': 20.4.1 dev: true /@types/lru-cache@5.1.1: @@ -5273,7 +5276,7 @@ packages: /@types/mkdirp@0.5.2: resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} dependencies: - '@types/node': 12.20.55 + '@types/node': 20.4.1 dev: true /@types/mocha@9.1.1: @@ -5286,7 +5289,7 @@ packages: /@types/node-fetch@2.6.4: resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} dependencies: - '@types/node': 12.20.55 + '@types/node': 20.4.1 form-data: 3.0.1 dev: true @@ -5342,20 +5345,20 @@ packages: /@types/readable-stream@2.3.15: resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} dependencies: - '@types/node': 12.20.55 + '@types/node': 20.4.1 safe-buffer: 5.1.2 dev: true /@types/resolve@0.0.8: resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} dependencies: - '@types/node': 12.20.55 + '@types/node': 20.4.1 dev: true /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 12.20.55 + '@types/node': 20.4.1 dev: true optional: true @@ -5430,7 +5433,7 @@ packages: /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 12.20.55 + '@types/node': 20.4.1 /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} @@ -5938,6 +5941,27 @@ packages: resolution: {integrity: sha512-Ux0c9qUfkcPqng3vrR0GTrlQdqNJ2JREn/2ydrVuKwM3RtMfF2mWX31Ijqo1opSjNAq6rK76PwtANw6kl6TAow==} dev: false + /@vitest/coverage-v8@0.33.0(vitest@0.32.2): + resolution: {integrity: sha512-Rj5IzoLF7FLj6yR7TmqsfRDSeaFki6NAJ/cQexqhbWkHEV2htlVGrmuOde3xzvFsCbLCagf4omhcIaVmfU8Okg==} + peerDependencies: + vitest: '>=0.32.0 <1' + dependencies: + '@ampproject/remapping': 2.2.1 + '@bcoe/v8-coverage': 0.2.3 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + magic-string: 0.30.1 + picocolors: 1.0.0 + std-env: 3.3.3 + test-exclude: 6.0.0 + v8-to-istanbul: 9.1.0 + vitest: 0.32.2 + transitivePeerDependencies: + - supports-color + dev: true + /@vitest/expect@0.32.2: resolution: {integrity: sha512-6q5yzweLnyEv5Zz1fqK5u5E83LU+gOMVBDuxBl2d2Jfx1BAp5M+rZgc5mlyqdnxquyoiOXpXmFNkcGcfFnFH3Q==} dependencies: @@ -10511,7 +10535,7 @@ packages: supports-color: optional: true dependencies: - ms: 2.1.1 + ms: 2.1.3 supports-color: 6.0.0 dev: true @@ -12391,7 +12415,7 @@ packages: /eth-json-rpc-middleware@1.6.0: resolution: {integrity: sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==} dependencies: - async: 2.6.2 + async: 2.6.4 eth-query: 2.1.2 eth-tx-summary: 3.2.4 ethereumjs-block: 1.7.1 @@ -12490,7 +12514,7 @@ packages: /eth-tx-summary@3.2.4: resolution: {integrity: sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==} dependencies: - async: 2.6.2 + async: 2.6.4 clone: 2.1.2 concat-stream: 1.6.2 end-of-stream: 1.4.4 @@ -12506,7 +12530,7 @@ packages: resolution: {integrity: sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==} deprecated: 'New package name format for new versions: @ethereumjs/ethash. Please update.' dependencies: - async: 2.6.2 + async: 2.6.4 buffer-xor: 2.0.2 ethereumjs-util: 7.1.5 miller-rabin: 4.0.1 @@ -12607,7 +12631,7 @@ packages: resolution: {integrity: sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==} deprecated: 'New package name format for new versions: @ethereumjs/block. Please update.' dependencies: - async: 2.6.2 + async: 2.6.4 ethereum-common: 0.2.0 ethereumjs-tx: 1.3.7 ethereumjs-util: 5.2.1 @@ -12618,7 +12642,7 @@ packages: resolution: {integrity: sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==} deprecated: 'New package name format for new versions: @ethereumjs/block. Please update.' dependencies: - async: 2.6.2 + async: 2.6.4 ethereumjs-common: 1.5.0 ethereumjs-tx: 2.1.2 ethereumjs-util: 5.2.1 @@ -12629,7 +12653,7 @@ packages: resolution: {integrity: sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ==} deprecated: 'New package name format for new versions: @ethereumjs/blockchain. Please update.' dependencies: - async: 2.6.2 + async: 2.6.4 ethashjs: 0.0.8 ethereumjs-block: 2.2.2 ethereumjs-common: 1.5.0 @@ -12709,7 +12733,7 @@ packages: resolution: {integrity: sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==} deprecated: 'New package name format for new versions: @ethereumjs/vm. Please update.' dependencies: - async: 2.6.2 + async: 2.6.4 async-eventemitter: 0.2.4 ethereumjs-account: 2.0.5 ethereumjs-block: 2.2.2 @@ -12726,7 +12750,7 @@ packages: resolution: {integrity: sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA==} deprecated: 'New package name format for new versions: @ethereumjs/vm. Please update.' dependencies: - async: 2.6.2 + async: 2.6.4 async-eventemitter: 0.2.4 core-js-pure: 3.31.1 ethereumjs-account: 3.0.0 @@ -13690,7 +13714,7 @@ packages: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.0.4 + minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 dev: true @@ -13712,7 +13736,7 @@ packages: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.0.8 + minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 dev: true @@ -15699,7 +15723,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 12.20.55 + '@types/node': 20.4.1 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -15860,7 +15884,7 @@ packages: /json-rpc-engine@3.8.0: resolution: {integrity: sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==} dependencies: - async: 2.6.2 + async: 2.6.4 babel-preset-env: 1.7.0 babelify: 7.3.0 json-rpc-error: 2.0.0 @@ -16262,7 +16286,7 @@ packages: /level-post@1.0.7: resolution: {integrity: sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==} dependencies: - ltgt: 2.1.3 + ltgt: 2.2.1 dev: true /level-sublevel@6.6.4: @@ -17102,7 +17126,7 @@ packages: /merkle-patricia-tree@3.0.0: resolution: {integrity: sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ==} dependencies: - async: 2.6.2 + async: 2.6.4 ethereumjs-util: 5.2.1 level-mem: 3.0.1 level-ws: 1.0.0 @@ -18329,7 +18353,7 @@ packages: resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} hasBin: true dependencies: - abbrev: 1.0.9 + abbrev: 1.1.1 dev: true /nopt@5.0.0: @@ -23017,6 +23041,15 @@ packages: source-map: 0.7.4 dev: true + /v8-to-istanbul@9.1.0: + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -23752,7 +23785,7 @@ packages: /web3-provider-engine@14.2.1: resolution: {integrity: sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==} dependencies: - async: 2.6.2 + async: 2.6.4 backoff: 2.5.0 clone: 2.1.2 cross-fetch: 2.2.6