From 358b9e041006380191c3706e92675fec38773038 Mon Sep 17 00:00:00 2001 From: Nazar Hussain Date: Sun, 26 Mar 2023 15:28:07 +0200 Subject: [PATCH] Lodestar prover for execution api (#5222) * Add package skeleton * Add implementation for the verification * Update package versions * Update teh provdier structure to store full execution payload * Add a test script * Split the utils to scoped files * Add multiple web3 providers * Add a proxy factory method * Add the CLI for the prover proxy * Rename few functions to make those consistent * Add some required unit tests * Add unit tests * Add e2e tests * Fix duplicate Buffer error * Fix lint error * Fix lint errors * Update the lightclient to sync in background * Validate the execution payload * Update initWithRest to init * Update the max limit for the payloads to not cross finalized slot * Remove the usage for finalizedPayloadHeaders tracking * Rename update to lcHeader * Update the code as per feedback * Fix readme * Update the payload store logic * Add the cleanup logic to payload store * Update the code as per feedback * Fix few types in the tests * Move the usage to isForkWithdrawls * Fix a unit test --- packages/light-client/src/events.ts | 11 +- packages/light-client/src/index.ts | 44 +- .../light-client/test/unit/sync.node.test.ts | 4 +- packages/params/src/index.ts | 1 + packages/prover/.gitignore | 10 + packages/prover/.mocharc.yaml | 8 + packages/prover/.nycrc.json | 3 + packages/prover/LICENSE | 201 +++ packages/prover/README.md | 68 + packages/prover/bin/lodestar-prover.js | 3 + packages/prover/karma.config.cjs | 9 + packages/prover/package.json | 89 + packages/prover/src/cli/cli.ts | 54 + packages/prover/src/cli/cmds/index.ts | 3 + packages/prover/src/cli/cmds/start/handler.ts | 27 + packages/prover/src/cli/cmds/start/index.ts | 17 + packages/prover/src/cli/cmds/start/options.ts | 78 + packages/prover/src/cli/index.ts | 30 + packages/prover/src/constants.ts | 4 + packages/prover/src/index.ts | 3 + packages/prover/src/index.web.ts | 2 + packages/prover/src/interfaces.ts | 51 + .../prover/src/proof_provider/ordered_map.ts | 25 + .../src/proof_provider/payload_store.ts | 184 ++ .../src/proof_provider/proof_provider.ts | 189 ++ packages/prover/src/types.ts | 35 + packages/prover/src/utils/assertion.ts | 53 + packages/prover/src/utils/command.ts | 43 + packages/prover/src/utils/consensus.ts | 105 ++ packages/prover/src/utils/conversion.ts | 21 + packages/prover/src/utils/errors.ts | 4 + packages/prover/src/utils/execution.ts | 108 ++ .../prover/src/utils/gitData/gitDataPath.ts | 49 + packages/prover/src/utils/gitData/index.ts | 71 + .../prover/src/utils/gitData/writeGitData.ts | 10 + packages/prover/src/utils/json_rpc.ts | 35 + packages/prover/src/utils/logger.ts | 46 + packages/prover/src/utils/req_resp.ts | 34 + packages/prover/src/utils/version.ts | 75 + .../src/verified_requests/eth_getBalance.ts | 29 + packages/prover/src/web3_provider.ts | 142 ++ packages/prover/src/web3_proxy.ts | 122 ++ .../prover/test/e2e/web3_provider.test.ts | 45 + packages/prover/test/setup.ts | 6 + .../prover/test/unit/utils/assertion.test.ts | 27 + .../prover/test/unit/utils/execution.test.ts | 192 ++ .../prover/test/unit/web3_provider.test.ts | 42 + packages/prover/tsconfig.build.json | 9 + packages/prover/tsconfig.json | 12 + packages/prover/webpack.test.config.cjs | 5 + yarn.lock | 1582 ++++++++++++++++- 51 files changed, 3960 insertions(+), 60 deletions(-) create mode 100644 packages/prover/.gitignore create mode 100644 packages/prover/.mocharc.yaml create mode 100644 packages/prover/.nycrc.json create mode 100644 packages/prover/LICENSE create mode 100644 packages/prover/README.md create mode 100755 packages/prover/bin/lodestar-prover.js create mode 100644 packages/prover/karma.config.cjs create mode 100644 packages/prover/package.json create mode 100644 packages/prover/src/cli/cli.ts create mode 100644 packages/prover/src/cli/cmds/index.ts create mode 100644 packages/prover/src/cli/cmds/start/handler.ts create mode 100644 packages/prover/src/cli/cmds/start/index.ts create mode 100644 packages/prover/src/cli/cmds/start/options.ts create mode 100644 packages/prover/src/cli/index.ts create mode 100644 packages/prover/src/constants.ts create mode 100644 packages/prover/src/index.ts create mode 100644 packages/prover/src/index.web.ts create mode 100644 packages/prover/src/interfaces.ts create mode 100644 packages/prover/src/proof_provider/ordered_map.ts create mode 100644 packages/prover/src/proof_provider/payload_store.ts create mode 100644 packages/prover/src/proof_provider/proof_provider.ts create mode 100644 packages/prover/src/types.ts create mode 100644 packages/prover/src/utils/assertion.ts create mode 100644 packages/prover/src/utils/command.ts create mode 100644 packages/prover/src/utils/consensus.ts create mode 100644 packages/prover/src/utils/conversion.ts create mode 100644 packages/prover/src/utils/errors.ts create mode 100644 packages/prover/src/utils/execution.ts create mode 100644 packages/prover/src/utils/gitData/gitDataPath.ts create mode 100644 packages/prover/src/utils/gitData/index.ts create mode 100644 packages/prover/src/utils/gitData/writeGitData.ts create mode 100644 packages/prover/src/utils/json_rpc.ts create mode 100644 packages/prover/src/utils/logger.ts create mode 100644 packages/prover/src/utils/req_resp.ts create mode 100644 packages/prover/src/utils/version.ts create mode 100644 packages/prover/src/verified_requests/eth_getBalance.ts create mode 100644 packages/prover/src/web3_provider.ts create mode 100644 packages/prover/src/web3_proxy.ts create mode 100644 packages/prover/test/e2e/web3_provider.test.ts create mode 100644 packages/prover/test/setup.ts create mode 100644 packages/prover/test/unit/utils/assertion.test.ts create mode 100644 packages/prover/test/unit/utils/execution.test.ts create mode 100644 packages/prover/test/unit/web3_provider.test.ts create mode 100644 packages/prover/tsconfig.build.json create mode 100644 packages/prover/tsconfig.json create mode 100644 packages/prover/webpack.test.config.cjs diff --git a/packages/light-client/src/events.ts b/packages/light-client/src/events.ts index 3bc500f461..9bb6bcb0b5 100644 --- a/packages/light-client/src/events.ts +++ b/packages/light-client/src/events.ts @@ -1,13 +1,16 @@ import {allForks} from "@lodestar/types"; +import {RunStatusCode} from "./index.js"; export enum LightclientEvent { - lightClientOptimisticUpdate = "light_client_optimistic_update", - lightClientFinalityUpdate = "light_client_finality_update", + lightClientOptimisticHeader = "light_client_optimistic_header", + lightClientFinalityHeader = "light_client_finality_header", + statusChange = "light_client_status_change", } export type LightclientEmitterEvents = { - [LightclientEvent.lightClientOptimisticUpdate]: (newHeader: allForks.LightClientHeader) => void; - [LightclientEvent.lightClientFinalityUpdate]: (newHeader: allForks.LightClientHeader) => void; + [LightclientEvent.lightClientOptimisticHeader]: (newHeader: allForks.LightClientHeader) => void; + [LightclientEvent.lightClientFinalityHeader]: (newHeader: allForks.LightClientHeader) => void; + [LightclientEvent.statusChange]: (code: RunStatusCode) => void; }; export type LightclientEmitter = MittEmitter; diff --git a/packages/light-client/src/index.ts b/packages/light-client/src/index.ts index aa5d03b797..a060538874 100644 --- a/packages/light-client/src/index.ts +++ b/packages/light-client/src/index.ts @@ -49,12 +49,14 @@ const ON_ERROR_RETRY_MS = 1000; // TODO: Customize with option const ALLOW_FORCED_UPDATES = true; -enum RunStatusCode { +export enum RunStatusCode { + uninitialized, started, syncing, stopped, } type RunStatus = + | {code: RunStatusCode.uninitialized} | {code: RunStatusCode.started; controller: AbortController} | {code: RunStatusCode.syncing} | {code: RunStatusCode.stopped}; @@ -104,7 +106,7 @@ export class Lightclient { private readonly lightclientSpec: LightclientSpec; - private status: RunStatus = {code: RunStatusCode.stopped}; + private runStatus: RunStatus = {code: RunStatusCode.stopped}; constructor({config, logger, genesisData, bootstrap, transport}: LightclientInitArgs) { this.genesisTime = genesisData.genesisTime; @@ -116,17 +118,18 @@ export class Lightclient { this.config = createBeaconConfig(config, this.genesisValidatorsRoot); this.logger = logger ?? getLcLoggerConsole(); this.transport = transport; + this.runStatus = {code: RunStatusCode.uninitialized}; this.lightclientSpec = new LightclientSpec( this.config, { allowForcedUpdates: ALLOW_FORCED_UPDATES, onSetFinalizedHeader: (header) => { - this.emitter.emit(LightclientEvent.lightClientFinalityUpdate, header); + this.emitter.emit(LightclientEvent.lightClientFinalityHeader, header); this.logger.debug("Updated state.finalizedHeader", {slot: header.beacon.slot}); }, onSetOptimisticHeader: (header) => { - this.emitter.emit(LightclientEvent.lightClientOptimisticUpdate, header); + this.emitter.emit(LightclientEvent.lightClientOptimisticHeader, header); this.logger.debug("Updated state.optimisticHeader", {slot: header.beacon.slot}); }, }, @@ -134,6 +137,10 @@ export class Lightclient { ); } + get status(): RunStatusCode { + return this.runStatus.code; + } + // Embed lightweight clock. The epoch cycles are handled with `this.runLoop()` get currentSlot(): number { return getCurrentSlot(this.config, this.genesisTime); @@ -167,16 +174,20 @@ export class Lightclient { } stop(): void { - if (this.status.code !== RunStatusCode.started) return; + if (this.runStatus.code !== RunStatusCode.started) return; - this.status.controller.abort(); - this.status = {code: RunStatusCode.stopped}; + this.runStatus.controller.abort(); + this.updateRunStatus({code: RunStatusCode.stopped}); } getHead(): allForks.LightClientHeader { return this.lightclientSpec.store.optimisticHeader; } + getFinalized(): allForks.LightClientHeader { + return this.lightclientSpec.store.finalizedHeader; + } + async sync(fromPeriod: SyncPeriod, toPeriod: SyncPeriod): Promise { // Initialize the BLS implementation. This may requires initializing the WebAssembly instance // so why it's a an async process. This should be initialized once before any bls operations. @@ -212,12 +223,12 @@ export class Lightclient { // Check if we have a sync committee for the current clock period if (!this.lightclientSpec.store.syncCommittees.has(currentPeriod)) { // Stop head tracking - if (this.status.code === RunStatusCode.started) { - this.status.controller.abort(); + if (this.runStatus.code === RunStatusCode.started) { + this.runStatus.controller.abort(); } // Go into sync mode - this.status = {code: RunStatusCode.syncing}; + this.updateRunStatus({code: RunStatusCode.syncing}); const headPeriod = computeSyncPeriodAtSlot(this.getHead().beacon.slot); this.logger.debug("Syncing", {lastPeriod: headPeriod, currentPeriod}); @@ -243,9 +254,9 @@ export class Lightclient { } // After successfully syncing, track head if not already - if (this.status.code !== RunStatusCode.started) { + if (this.runStatus.code !== RunStatusCode.started) { const controller = new AbortController(); - this.status = {code: RunStatusCode.started, controller}; + this.updateRunStatus({code: RunStatusCode.started, controller}); this.logger.debug("Started tracking the head"); this.transport.onOptimisticUpdate(this.processOptimisticUpdate.bind(this)); @@ -268,11 +279,11 @@ export class Lightclient { } // Wait for the next epoch - if (this.status.code !== RunStatusCode.started) { + if (this.runStatus.code !== RunStatusCode.started) { return; } else { try { - await sleep(timeUntilNextEpoch(this.config, this.genesisTime), this.status.controller.signal); + await sleep(timeUntilNextEpoch(this.config, this.genesisTime), this.runStatus.controller.signal); } catch (e) { if (isErrorAborted(e)) { return; @@ -306,4 +317,9 @@ export class Lightclient { private currentSlotWithTolerance(): Slot { return slotWithFutureTolerance(this.config, this.genesisTime, MAX_CLOCK_DISPARITY_SEC); } + + private updateRunStatus(runStatus: RunStatus): void { + this.runStatus = runStatus; + this.emitter.emit(LightclientEvent.statusChange, this.runStatus.code); + } } diff --git a/packages/light-client/test/unit/sync.node.test.ts b/packages/light-client/test/unit/sync.node.test.ts index f65030bd2b..91e3da59cf 100644 --- a/packages/light-client/test/unit/sync.node.test.ts +++ b/packages/light-client/test/unit/sync.node.test.ts @@ -106,7 +106,7 @@ describe("sync", () => { // Sync periods to current await new Promise((resolve) => { - lightclient.emitter.on(LightclientEvent.lightClientFinalityUpdate, (header) => { + lightclient.emitter.on(LightclientEvent.lightClientFinalityHeader, (header) => { if (computeSyncPeriodAtSlot(header.beacon.slot) >= targetPeriod) { resolve(); } @@ -128,7 +128,7 @@ describe("sync", () => { // Track head + reference states with some known data const syncCommittee = getInteropSyncCommittee(targetPeriod); await new Promise((resolve) => { - lightclient.emitter.on(LightclientEvent.lightClientOptimisticUpdate, (header) => { + lightclient.emitter.on(LightclientEvent.lightClientOptimisticHeader, (header) => { if (header.beacon.slot === targetSlot) { resolve(); } diff --git a/packages/params/src/index.ts b/packages/params/src/index.ts index 7e008389bb..2a8742e83e 100644 --- a/packages/params/src/index.ts +++ b/packages/params/src/index.ts @@ -13,6 +13,7 @@ export { ForkExecution, ForkBlobs, isForkExecution, + isForkWithdrawals, isForkBlobs, isForkLightClient, } from "./forkName.js"; diff --git a/packages/prover/.gitignore b/packages/prover/.gitignore new file mode 100644 index 0000000000..668e0a04c0 --- /dev/null +++ b/packages/prover/.gitignore @@ -0,0 +1,10 @@ +node_modules/ +lib +.nyc_output/ +coverage/** +.DS_Store +*.swp +.idea +yarn-error.log +package-lock.json +dist* diff --git a/packages/prover/.mocharc.yaml b/packages/prover/.mocharc.yaml new file mode 100644 index 0000000000..f9375365e5 --- /dev/null +++ b/packages/prover/.mocharc.yaml @@ -0,0 +1,8 @@ +colors: true +timeout: 2000 +exit: true +extension: ["ts"] +require: + - ./test/setup.ts +node-option: + - "loader=ts-node/esm" diff --git a/packages/prover/.nycrc.json b/packages/prover/.nycrc.json new file mode 100644 index 0000000000..69aa626339 --- /dev/null +++ b/packages/prover/.nycrc.json @@ -0,0 +1,3 @@ +{ + "extends": "../../.nycrc.json" +} diff --git a/packages/prover/LICENSE b/packages/prover/LICENSE new file mode 100644 index 0000000000..f49a4e16e6 --- /dev/null +++ b/packages/prover/LICENSE @@ -0,0 +1,201 @@ + 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/packages/prover/README.md b/packages/prover/README.md new file mode 100644 index 0000000000..345f529abf --- /dev/null +++ b/packages/prover/README.md @@ -0,0 +1,68 @@ +# Lodestar Eth Consensus Lightclient Prover + +[![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord)](https://discord.gg/aMxzVcr) +[![ETH Beacon APIs Spec v2.1.0](https://img.shields.io/badge/ETH%20beacon--APIs-2.1.0-blue)](https://github.com/ethereum/beacon-APIs/releases/tag/v2.1.0) +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-18.x-green) + +> This package is part of [ChainSafe's Lodestar](https://lodestar.chainsafe.io) project + +Typescript REST client for the [Ethereum Consensus API spec](https://github.com/ethereum/beacon-apis) + +## Usage + +You can use the `@lodestar/prover` in two ways, as a Web3 Provider and as proxy. For prover use case see below example. + +```ts +import Web3 from "web3"; +import {createVerifiedExecutionProvider, LCTransport} from "@lodestar/prover"; + +const {provider, proofProvider} = createVerifiedExecutionProvider( + new Web3.providers.HttpProvider("https://lodestar-sepoliarpc.chainsafe.io"), { + transport: LCTransport.Rest, + urls: ["https://lodestar-sepolia.chainsafe.io"], + network: "sepolia", + wsCheckpoint: "trusted-checkpoint" +}); + +const web3 = new Web3(provider); + +const address = "0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134"; +const balance = await web3.eth.getBalance(address, "latest"); +console.log({balance, address}); +``` + +You can also invoke the package as binary. + +```bash +npm -i g @lodestar/prover + +lodestar-prover start \ + --network sepolia \ + --execution-rpc https://lodestar-sepoliarpc.chainsafe.io \ + --mode rest \ + --beacon-rpc https://lodestar-sepolia.chainsafe.io \ + --port 8080 +``` + +## Prerequisites + +- [Lerna](https://github.com/lerna/lerna) +- [Yarn](https://yarnpkg.com/) + +## What you need + +You will need to go over the [specification](https://github.com/ethereum/beacon-apis). You will also need to have a [basic understanding of lightclient](https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/light-client/light-client.md). + +## Getting started + +- Follow the [installation guide](https://chainsafe.github.io/lodestar/) to install Lodestar. +- Quickly try out the whole stack by [starting a local testnet](https://chainsafe.github.io/lodestar/usage/local). + +## Contributors + +Read our [contributors document](/CONTRIBUTING.md), [submit an issue](https://github.com/ChainSafe/lodestar/issues/new/choose) or talk to us on our [discord](https://discord.gg/yjyvFRP)! + +## License + +Apache-2.0 [ChainSafe Systems](https://chainsafe.io) diff --git a/packages/prover/bin/lodestar-prover.js b/packages/prover/bin/lodestar-prover.js new file mode 100755 index 0000000000..1e7ea329ce --- /dev/null +++ b/packages/prover/bin/lodestar-prover.js @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +await import("../lib/cli/index.js"); diff --git a/packages/prover/karma.config.cjs b/packages/prover/karma.config.cjs new file mode 100644 index 0000000000..a3ebb967e2 --- /dev/null +++ b/packages/prover/karma.config.cjs @@ -0,0 +1,9 @@ +const karmaConfig = require("../../karma.base.config.js"); +const webpackConfig = require("./webpack.test.config.cjs"); + +module.exports = function karmaConfigurator(config) { + config.set({ + ...karmaConfig, + webpack: webpackConfig, + }); +}; diff --git a/packages/prover/package.json b/packages/prover/package.json new file mode 100644 index 0000000000..8894844ba2 --- /dev/null +++ b/packages/prover/package.json @@ -0,0 +1,89 @@ +{ + "name": "@lodestar/prover", + "description": "A Typescript implementation of the Ethereum Consensus light client", + "license": "Apache-2.0", + "author": "ChainSafe Systems", + "homepage": "https://github.com/ChainSafe/lodestar#readme", + "repository": { + "type": "git", + "url": "git+https://github.com:ChainSafe/lodestar.git" + }, + "bugs": { + "url": "https://github.com/ChainSafe/lodestar/issues" + }, + "version": "1.4.3", + "type": "module", + "exports": { + ".": { + "import": "./lib/index.js", + "browser": "./lib/index.web.js" + } + }, + "bin": { + "lodestar-prover": "lib/cli/index.js" + }, + "typesVersions": { + "*": { + "*": [ + "*", + "lib/*", + "lib/*/index" + ] + } + }, + "types": "./lib/index.d.ts", + "files": [ + "lib/**/*.d.ts", + "lib/**/*.js", + "lib/**/*.js.map", + "*.d.ts", + "*.js" + ], + "scripts": { + "clean": "rm -rf lib && rm -f *.tsbuildinfo", + "build": "tsc -p tsconfig.build.json", + "build:release": "yarn clean && yarn run build", + "check-build": "node -e \"(async function() { await import('./lib/index.js') })()\"", + "check-types": "tsc", + "coverage": "codecov -F lodestar-api", + "lint": "eslint --color --ext .ts src/ test/", + "lint:fix": "yarn run lint --fix", + "pretest": "yarn run check-types", + "test": "yarn test:unit && yarn test:e2e", + "test:unit": "nyc --cache-dir .nyc_output/.cache -e .ts mocha 'test/unit/**/*.test.ts'", + "test:browsers": "yarn karma start karma.config.cjs", + "test:e2e": "mocha 'test/e2e/**/*.test.ts'", + "check-readme": "typescript-docs-verifier" + }, + "dependencies": { + "@lodestar/api": "^1.5.0", + "@lodestar/types": "^1.5.0", + "@lodestar/utils": "^1.5.0", + "@lodestar/config": "^1.5.0", + "@lodestar/light-client": "^1.5.0", + "@ethereumjs/trie": "^5.0.4", + "@ethereumjs/util": "^8.0.5", + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^1.2.0", + "http-proxy": "^1.18.1", + "yargs": "^16.1.0", + "source-map-support": "^0.5.19", + "find-up": "^5.0.0" + }, + "devDependencies": { + "@types/http-proxy": "^1.17.10", + "@types/yargs": "^15.0.9", + "web3": "^1.8.2", + "ethers": "^6.1.0" + }, + "peerDependencies": { + }, + "keywords": [ + "ethereum", + "eth-consensus", + "beacon", + "api", + "blockchain", + "prover" + ] +} diff --git a/packages/prover/src/cli/cli.ts b/packages/prover/src/cli/cli.ts new file mode 100644 index 0000000000..cfd6e8213f --- /dev/null +++ b/packages/prover/src/cli/cli.ts @@ -0,0 +1,54 @@ +// Must not use `* as yargs`, see https://github.com/yargs/yargs/issues/1131 +import yargs from "yargs"; +// @ts-expect-error no type +import {hideBin} from "yargs/helpers"; +import {registerCommandToYargs} from "../utils/command.js"; +import {getVersionData} from "../utils/version.js"; +import {cmds} from "./cmds/index.js"; + +const {version} = getVersionData(); +const topBanner = `🌟 Lodestar Prover Proxy: Ethereum RPC proxy for RPC responses, verified against the trusted block hashes. + * Version: ${version} + * by ChainSafe Systems, 2018-2022`; +const bottomBanner = `📖 For more information, check the CLI reference: + * https://chainsafe.github.io/lodestar/reference/cli + +✍️ Give feedback and report issues on GitHub: + * https://github.com/ChainSafe/lodestar`; + +export const yarg = yargs((hideBin as (args: string[]) => string[])(process.argv)); + +/** + * Common factory for running the CLI and running integration tests + * The CLI must actually be executed in a different script + */ +export function getLodestarProverCli(): yargs.Argv { + const prover = yarg + .env("LODESTAR") + .parserConfiguration({ + // As of yargs v16.1.0 dot-notation breaks strictOptions() + // Manually processing options is typesafe tho more verbose + "dot-notation": false, + }) + // blank scriptName so that help text doesn't display the cli name before each command + .scriptName("") + .demandCommand(1) + // Control show help behaviour below on .fail() + .showHelpOnFail(false) + .usage(topBanner) + .epilogue(bottomBanner) + .version(topBanner) + .alias("h", "help") + .alias("v", "version") + .recommendCommands(); + + // yargs.command and all ./cmds + for (const cmd of cmds) { + registerCommandToYargs(prover, cmd); + } + + // throw an error if we see an unrecognized cmd + prover.recommendCommands().strict(); + + return prover; +} diff --git a/packages/prover/src/cli/cmds/index.ts b/packages/prover/src/cli/cmds/index.ts new file mode 100644 index 0000000000..c96cf7d067 --- /dev/null +++ b/packages/prover/src/cli/cmds/index.ts @@ -0,0 +1,3 @@ +import {proverProxyStartCommand} from "./start/index.js"; + +export const cmds = [proverProxyStartCommand]; diff --git a/packages/prover/src/cli/cmds/start/handler.ts b/packages/prover/src/cli/cmds/start/handler.ts new file mode 100644 index 0000000000..29ed0f7104 --- /dev/null +++ b/packages/prover/src/cli/cmds/start/handler.ts @@ -0,0 +1,27 @@ +import {LCTransport} from "../../../interfaces.js"; +import {createVerifiedExecutionProxy, VerifiedProxyOptions} from "../../../web3_proxy.js"; +import {stdLogger} from "../../../utils/logger.js"; +import {parseStartArgs, StartArgs} from "./options.js"; + +/** + * Runs a beacon node. + */ +export async function proverProxyStartHandler(args: StartArgs): Promise { + const opts = parseStartArgs(args); + const {network, executionRpcUrl, port, wsCheckpoint} = opts; + const options: VerifiedProxyOptions = { + logger: stdLogger, + network, + executionRpcUrl, + wsCheckpoint, + ...(opts.transport === LCTransport.Rest + ? {transport: LCTransport.Rest, urls: opts.urls} + : {transport: LCTransport.P2P, bootnodes: opts.bootnodes}), + }; + + const {server, proofProvider} = createVerifiedExecutionProxy(options); + + server.listen(port); + + await proofProvider.waitToBeReady(); +} diff --git a/packages/prover/src/cli/cmds/start/index.ts b/packages/prover/src/cli/cmds/start/index.ts new file mode 100644 index 0000000000..b28f182e5d --- /dev/null +++ b/packages/prover/src/cli/cmds/start/index.ts @@ -0,0 +1,17 @@ +import {CliCommand, CliCommandOptions} from "../../../utils/command.js"; +import {proverProxyStartHandler} from "./handler.js"; +import {StartArgs, startOptions} from "./options.js"; + +export const proverProxyStartCommand: CliCommand = { + command: "start", + describe: "Start proxy server", + examples: [ + { + command: + "start --network sepolia --execution-rpc https://lodestar-sepoliarpc.chainsafe.io --mode rest --beacon-rpc https://lodestar-sepolia.chainsafe.io", + description: "Start a proxy server and connect to the sepolia testnet", + }, + ], + options: startOptions as CliCommandOptions, + handler: proverProxyStartHandler, +}; diff --git a/packages/prover/src/cli/cmds/start/options.ts b/packages/prover/src/cli/cmds/start/options.ts new file mode 100644 index 0000000000..647317aae4 --- /dev/null +++ b/packages/prover/src/cli/cmds/start/options.ts @@ -0,0 +1,78 @@ +import {NetworkName, networksChainConfig} from "@lodestar/config/networks"; +import {LCTransport} from "../../../interfaces.js"; +import {CliCommandOptions} from "../../../utils/command.js"; + +export type StartArgs = { + port: number; + network: string; + "execution-rpc-url": string; + transport: "rest" | "p2p"; + "beacon-urls"?: string[]; + "beacon-bootnodes"?: string[]; + "ws-checkpoint"?: string; +}; + +export type StartOptions = { + network: NetworkName; + executionRpcUrl: string; + port: number; + wsCheckpoint?: string; +} & ({transport: LCTransport.Rest; urls: string[]} | {transport: LCTransport.P2P; bootnodes: string[]}); + +export const startOptions: CliCommandOptions = { + port: { + description: "Port number to start the proxy.", + type: "number", + default: 8080, + }, + + network: { + description: "Specify the network to connect.", + type: "string", + choices: Object.keys(networksChainConfig), + }, + + "execution-rpc-url": { + description: "RPC url for the execution node.", + type: "string", + }, + + transport: { + description: "The Light client mode to connect to. 'rest', 'p2p'", + type: "string", + choices: ["rest", "p2p"], + }, + + "beacon-urls": { + description: "The beacon node PRC urls for 'rest' mode.", + type: "string", + array: true, + demandOption: false, + }, + + "beacon-bootnodes": { + description: "The beacon node PRC urls for 'p2p' mode.", + type: "string", + array: true, + demandOption: false, + }, + + "ws-checkpoint": { + description: + "The trusted checkpoint root to start the lightclient. If not provided will initialize from the latest finalized slot. It shouldn't be older than weak subjectivity period", + type: "string", + }, +}; + +export function parseStartArgs(args: StartArgs): StartOptions { + // Remove undefined values to allow deepmerge to inject default values downstream + return { + port: args["port"], + network: args["network"] as NetworkName, + executionRpcUrl: args["execution-rpc-url"], + transport: args["transport"] === "p2p" ? LCTransport.P2P : LCTransport.Rest, + urls: args["transport"] === "rest" ? args["beacon-urls"] ?? [] : [], + bootnodes: args["transport"] === "p2p" ? args["beacon-bootnodes"] ?? [] : [], + wsCheckpoint: args["ws-checkpoint"], + }; +} diff --git a/packages/prover/src/cli/index.ts b/packages/prover/src/cli/index.ts new file mode 100644 index 0000000000..8930a931e2 --- /dev/null +++ b/packages/prover/src/cli/index.ts @@ -0,0 +1,30 @@ +#!/usr/bin/env node + +// MUST import first to apply preset from args +import {YargsError} from "../utils/errors.js"; +import {getLodestarProverCli, yarg} from "./cli.js"; +import "source-map-support/register.js"; + +const prover = getLodestarProverCli(); + +prover + .fail((msg, err) => { + if (msg) { + // Show command help message when no command is provided + if (msg.includes("Not enough non-option arguments")) { + yarg.showHelp(); + // eslint-disable-next-line no-console + console.log("\n"); + } + } + + const errorMessage = + err !== undefined ? (err instanceof YargsError ? err.message : err.stack) : msg || "Unknown error"; + + // eslint-disable-next-line no-console + console.error(` ✖ ${errorMessage}\n`); + process.exit(1); + }) + + // Execute CLI + .parse(); diff --git a/packages/prover/src/constants.ts b/packages/prover/src/constants.ts new file mode 100644 index 0000000000..4c16622e65 --- /dev/null +++ b/packages/prover/src/constants.ts @@ -0,0 +1,4 @@ +// https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/light-client/p2p-interface.md#configuration +export const MAX_REQUEST_LIGHT_CLIENT_UPDATES = 128; +export const MAX_PAYLOAD_HISTORY = 32; +export const UNVERIFIED_RESPONSE_CODE = -33091; diff --git a/packages/prover/src/index.ts b/packages/prover/src/index.ts new file mode 100644 index 0000000000..59390455dc --- /dev/null +++ b/packages/prover/src/index.ts @@ -0,0 +1,3 @@ +export * from "./interfaces.js"; +export {createVerifiedExecutionProvider} from "./web3_provider.js"; +export {createVerifiedExecutionProxy} from "./web3_proxy.js"; diff --git a/packages/prover/src/index.web.ts b/packages/prover/src/index.web.ts new file mode 100644 index 0000000000..bdde6e5542 --- /dev/null +++ b/packages/prover/src/index.web.ts @@ -0,0 +1,2 @@ +export * from "./interfaces.js"; +export {createVerifiedExecutionProvider} from "./web3_provider.js"; diff --git a/packages/prover/src/interfaces.ts b/packages/prover/src/interfaces.ts new file mode 100644 index 0000000000..a3c4d5bb48 --- /dev/null +++ b/packages/prover/src/interfaces.ts @@ -0,0 +1,51 @@ +import {ChainForkConfig} from "@lodestar/config"; +import {NetworkName} from "@lodestar/config/networks"; +import {ProofProvider} from "./proof_provider/proof_provider.js"; +import {ELRequestPayload, ELResponse} from "./types.js"; + +export enum LCTransport { + Rest = "Rest", + P2P = "P2P", +} + +export type RootProviderInitOptions = { + network: NetworkName; + signal: AbortSignal; + config?: ChainForkConfig; + wsCheckpoint?: string; +} & ({transport: LCTransport.Rest; urls: string[]} | {transport: LCTransport.P2P; bootnodes: string[]}); + +export type ELRequestMethod = (payload: ELRequestPayload) => Promise; + +// Modern providers uses this structure e.g. Web3 4.x +export interface EIP1193Provider { + request: (payload: ELRequestPayload) => Promise; +} + +// Some providers uses `request` instead of the `send`. e.g. Ganache +export interface RequestProvider { + request(payload: ELRequestPayload, callback: (err: Error | undefined, response: ELResponse) => void): void; +} + +// The legacy Web3 1.x use this structure +export interface SendProvider { + send(payload: ELRequestPayload, callback: (err?: Error | null, response?: ELResponse) => void): void; +} + +// Ethers provider uses this structure +export interface EthersProvider { + send(method: string, params: Array): Promise; +} + +// Some legacy providers use this very old structure +export interface SendAsyncProvider { + sendAsync(payload: ELRequestPayload): Promise; +} + +export type Web3Provider = SendProvider | EthersProvider | SendAsyncProvider | RequestProvider | EIP1193Provider; + +export type ELVerifiedRequestHandler = (opts: { + payload: ELRequestPayload; + handler: ELRequestMethod; + rootProvider: ProofProvider; +}) => Promise>; diff --git a/packages/prover/src/proof_provider/ordered_map.ts b/packages/prover/src/proof_provider/ordered_map.ts new file mode 100644 index 0000000000..943941569d --- /dev/null +++ b/packages/prover/src/proof_provider/ordered_map.ts @@ -0,0 +1,25 @@ +export class OrderedMap extends Map { + private _min = 0; + private _max = 0; + + get min(): number { + return this._min; + } + + get max(): number { + return this._max; + } + + set(key: number, value: T): this { + if (key < this._min) { + this._min = key; + } + + if (key > this._max) { + this._max = key; + } + + super.set(key, value); + return this; + } +} diff --git a/packages/prover/src/proof_provider/payload_store.ts b/packages/prover/src/proof_provider/payload_store.ts new file mode 100644 index 0000000000..d5dc1e74a5 --- /dev/null +++ b/packages/prover/src/proof_provider/payload_store.ts @@ -0,0 +1,184 @@ +import {Api} from "@lodestar/api"; +import {allForks, capella} from "@lodestar/types"; +import {MAX_PAYLOAD_HISTORY} from "../constants.js"; +import {getExecutionPayloadForBlockNumber, getExecutionPayloads} from "../utils/consensus.js"; +import {bufferToHex, hexToNumber} from "../utils/conversion.js"; +import {OrderedMap} from "./ordered_map.js"; + +type BlockELRoot = string; +type BlockCLRoot = string; + +/** + * The in-memory store for the execution payloads to be used to verify the proofs + */ +export class PayloadStore { + // We store the block numbers only for finalized blocks + private finalizedRoots = new OrderedMap(); + + // Unfinalized blocks are stored by the roots of the beacon chain + private unfinalizedRoots = new Map(); + + // Payloads store with BlockELRoot as key + private payloads = new Map(); + + private latestBlockRoot: BlockELRoot | null = null; + + constructor(private opts: {api: Api}) {} + + get finalized(): allForks.ExecutionPayload | undefined { + const finalizedMaxRoot = this.finalizedRoots.get(this.finalizedRoots.max); + if (finalizedMaxRoot) { + return this.payloads.get(finalizedMaxRoot); + } + + return undefined; + } + + get latest(): allForks.ExecutionPayload | undefined { + if (this.latestBlockRoot) { + return this.payloads.get(this.latestBlockRoot); + } + + return undefined; + } + + async get(blockId: number | string): Promise { + // Given block id is a block hash in hex (32 bytes root takes 64 hex chars + 2 for 0x prefix) + if (typeof blockId === "string" && blockId.startsWith("0x") && blockId.length === 64 + 2) { + return this.payloads.get(blockId); + } + + // Given block id is a block number in hex + if (typeof blockId === "string" && blockId.startsWith("0x")) { + return this.getOrFetchFinalizedPayload(hexToNumber(blockId)); + } + + // Given block id is a block number in decimal string + if (typeof blockId === "string" && !blockId.startsWith("0x")) { + return this.getOrFetchFinalizedPayload(parseInt(blockId, 10)); + } + + // Given block id is a block number in decimal + if (typeof blockId === "number") { + return this.getOrFetchFinalizedPayload(blockId); + } + + return undefined; + } + + async getOrFetchFinalizedPayload(blockNumber: number): Promise { + if (blockNumber > this.finalizedRoots.max) { + throw new Error( + `Block number ${blockNumber} is higher than the latest finalized block number. We recommend to use block hash for unfinalized blocks.` + ); + } + + let blockELRoot = this.finalizedRoots.get(blockNumber); + // check if we have payload cached locally else fetch from api + if (!blockELRoot) { + const payloads = await getExecutionPayloadForBlockNumber(this.opts.api, this.finalizedRoots.min, blockNumber); + for (const payload of Object.values(payloads)) { + this.set(payload, true); + } + } + + blockELRoot = this.finalizedRoots.get(blockNumber); + if (blockELRoot) { + return this.payloads.get(blockELRoot); + } + + return undefined; + } + + set(payload: allForks.ExecutionPayload, finalized: boolean): void { + const blockRoot = bufferToHex(payload.blockHash); + this.payloads.set(blockRoot, payload); + + if (this.latestBlockRoot) { + const latestPayload = this.payloads.get(this.latestBlockRoot); + if (latestPayload && latestPayload.blockNumber < payload.blockNumber) { + this.latestBlockRoot = blockRoot; + } + } + + if (finalized) { + this.finalizedRoots.set(payload.blockNumber, blockRoot); + } + } + + async processLCHeader(header: capella.LightClientHeader, finalized = false): Promise { + const blockSlot = header.beacon.slot; + const blockNumber = header.execution.blockNumber; + const blockELRoot = bufferToHex(header.execution.blockHash); + const blockCLRoot = bufferToHex(header.beacon.stateRoot); + const existingELRoot = this.unfinalizedRoots.get(blockCLRoot); + + // ==== Finalized blocks ==== + // if the block is finalized, we need to update the finalizedRoots map + if (finalized) { + this.finalizedRoots.set(blockNumber, blockELRoot); + + // If the block is finalized and we already have the payload + // We can remove it from the unfinalizedRoots map and do nothing else + if (existingELRoot) { + this.unfinalizedRoots.delete(blockCLRoot); + } + + // If the block is finalized and we do not have the payload + // We need to fetch and set the payload + else if (finalized && !existingELRoot) { + this.payloads.set( + bufferToHex(header.execution.blockHash), + (await getExecutionPayloads(this.opts.api, blockSlot, blockSlot))[blockSlot] + ); + } + + return; + } + + // ==== Unfinalized blocks ==== + // We already have the payload for this block + if (existingELRoot && existingELRoot === blockELRoot) { + return; + } + + // Re-org happened, we need to update the payload + if (existingELRoot && existingELRoot !== blockELRoot) { + this.payloads.delete(existingELRoot); + this.unfinalizedRoots.set(blockCLRoot, blockELRoot); + } + + // We do not have the payload for this block, we need to fetch it + const payload = (await getExecutionPayloads(this.opts.api, blockSlot, blockSlot))[blockSlot]; + this.set(payload, false); + this.prune(); + } + + private prune(): void { + if (this.finalizedRoots.size <= MAX_PAYLOAD_HISTORY) return; + + for ( + let blockNumber = this.finalizedRoots.max - MAX_PAYLOAD_HISTORY; + blockNumber > this.finalizedRoots.min; + blockNumber-- + ) { + const blockELRoot = this.finalizedRoots.get(blockNumber); + if (blockELRoot) { + this.payloads.delete(blockELRoot); + this.finalizedRoots.delete(blockNumber); + } + } + + for (const [clRoot, elRoot] of this.unfinalizedRoots) { + const payload = this.payloads.get(elRoot); + if (!payload) { + this.unfinalizedRoots.delete(clRoot); + continue; + } + + if (payload.blockNumber < this.finalizedRoots.min) { + this.unfinalizedRoots.delete(clRoot); + } + } + } +} diff --git a/packages/prover/src/proof_provider/proof_provider.ts b/packages/prover/src/proof_provider/proof_provider.ts new file mode 100644 index 0000000000..221460f271 --- /dev/null +++ b/packages/prover/src/proof_provider/proof_provider.ts @@ -0,0 +1,189 @@ +import {Api, getClient} from "@lodestar/api/beacon"; +import {ChainForkConfig, createChainForkConfig} from "@lodestar/config"; +import {networksChainConfig} from "@lodestar/config/networks"; +import {Lightclient, LightclientEvent, RunStatusCode} from "@lodestar/light-client"; +import {LightClientRestTransport} from "@lodestar/light-client/transport"; +import {isForkWithdrawals} from "@lodestar/params"; +import {allForks, capella} from "@lodestar/types"; +import {LCTransport, RootProviderInitOptions} from "../interfaces.js"; +import {assertLightClient} from "../utils/assertion.js"; +import { + getExecutionPayloads, + getGenesisData, + getSyncCheckpoint, + getUnFinalizedRangeForPayloads, +} from "../utils/consensus.js"; +import {PayloadStore} from "./payload_store.js"; + +type RootProviderOptions = Omit & { + transport: LightClientRestTransport; + api: Api; + config: ChainForkConfig; +}; + +export class ProofProvider { + private store: PayloadStore; + + // Make sure readyPromise doesn't throw unhandled exceptions + private readyPromise?: Promise; + lightClient?: Lightclient; + + constructor(private opts: RootProviderOptions) { + this.store = new PayloadStore({api: opts.api}); + } + + async waitToBeReady(): Promise { + return this.readyPromise; + } + + static init(opts: RootProviderInitOptions): ProofProvider { + if (opts.transport === LCTransport.P2P) { + throw new Error("P2P mode not supported yet"); + } + + const config = createChainForkConfig(networksChainConfig[opts.network]); + const api = getClient({urls: opts.urls}, {config}); + const transport = new LightClientRestTransport(api); + + const provider = new ProofProvider({ + ...opts, + config, + api, + transport, + }); + + provider.readyPromise = provider.sync(opts.wsCheckpoint).catch((e) => { + // TODO: will be replaced by logger in the next PR. + // eslint-disable-next-line no-console + console.error("Error while syncing", e); + return Promise.reject("Error while syncing"); + }); + + return provider; + } + + private async sync(wsCheckpoint?: string): Promise { + if (this.lightClient !== undefined) { + throw Error("Light client already initialized and syncing."); + } + + const {api, config, transport} = this.opts; + const checkpointRoot = await getSyncCheckpoint(api, wsCheckpoint); + const genesisData = await getGenesisData(api); + + this.lightClient = await Lightclient.initializeFromCheckpointRoot({ + checkpointRoot, + config, + transport, + genesisData, + }); + + assertLightClient(this.lightClient); + // Wait for the lightclient to start + await new Promise((resolve) => { + const lightClientStarted = (status: RunStatusCode): void => { + if (status === RunStatusCode.started) { + this.lightClient?.emitter.off(LightclientEvent.statusChange, lightClientStarted); + resolve(); + } + }; + this.lightClient?.emitter.on(LightclientEvent.statusChange, lightClientStarted); + this.lightClient?.start(); + }); + this.registerEvents(); + + // Load the payloads from the CL + const {start, end} = await getUnFinalizedRangeForPayloads(this.lightClient); + const payloads = await getExecutionPayloads(this.opts.api, start, end); + for (const payload of Object.values(payloads)) { + this.store.set(payload, false); + } + + // Load the finalized payload from the CL + const finalizedSlot = this.lightClient.getFinalized().beacon.slot; + const finalizedPayload = await getExecutionPayloads(this.opts.api, finalizedSlot, finalizedSlot); + this.store.set(finalizedPayload[finalizedSlot], true); + } + + getStatus(): {latest: number; finalized: number; status: RunStatusCode} { + if (!this.lightClient) { + return { + latest: 0, + finalized: 0, + status: RunStatusCode.uninitialized, + }; + } + + return { + latest: this.lightClient.getHead().beacon.slot, + finalized: this.lightClient.getFinalized().beacon.slot, + status: this.lightClient.status, + }; + } + + async getExecutionPayload(blockNumber: number | string | "finalized" | "latest"): Promise { + assertLightClient(this.lightClient); + + if (typeof blockNumber === "string" && blockNumber === "finalized") { + const payload = this.store.finalized; + if (!payload) throw new Error("No finalized payload"); + return payload; + } + + if (typeof blockNumber === "string" && blockNumber === "latest") { + const payload = this.store.latest; + if (!payload) throw new Error("No latest payload"); + return payload; + } + + if ((typeof blockNumber === "string" && blockNumber.startsWith("0x")) || typeof blockNumber === "number") { + const payload = await this.store.get(blockNumber); + if (!payload) throw new Error(`No payload for blockNumber ${blockNumber}`); + return payload; + } + + throw new Error(`Invalid blockNumber "${blockNumber}"`); + } + + async processLCHeader(lcHeader: allForks.LightClientHeader, finalized = false): Promise { + const fork = this.opts.config.getForkName(lcHeader.beacon.slot); + + if (!isForkWithdrawals(fork)) { + return; + } + + const sszType = this.opts.config.getExecutionForkTypes(lcHeader.beacon.slot).ExecutionPayloadHeader; + if ( + isForkWithdrawals(fork) && + (!("execution" in lcHeader) || sszType.equals(lcHeader.execution, sszType.defaultValue())) + ) { + throw new Error("Execution payload is required for execution fork"); + } + + await this.store.processLCHeader(lcHeader as capella.LightClientHeader, finalized); + } + + private registerEvents(): void { + assertLightClient(this.lightClient); + + this.opts.signal.addEventListener("abort", () => { + this.lightClient?.stop(); + }); + + this.lightClient.emitter.on(LightclientEvent.lightClientFinalityHeader, async (data) => { + await this.processLCHeader(data, true).catch((e) => { + // Will be replaced with logger in next PR. + // eslint-disable-next-line no-console + console.error(e); + }); + }); + + this.lightClient.emitter.on(LightclientEvent.lightClientOptimisticHeader, async (data) => { + await this.processLCHeader(data).catch((e) => { + // Will be replaced with logger in next PR. + // eslint-disable-next-line no-console + console.error(e); + }); + }); + } +} diff --git a/packages/prover/src/types.ts b/packages/prover/src/types.ts new file mode 100644 index 0000000000..9001e4091b --- /dev/null +++ b/packages/prover/src/types.ts @@ -0,0 +1,35 @@ +export interface ELRequestPayload { + readonly jsonrpc: string & ("2.0" | "1.0"); + readonly id: number | string; + readonly method: string; + readonly params: T; + readonly requestOptions?: unknown; +} + +// Make the very flexible el response type to match different libraries easily +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type ELResponse = { + readonly id: number | string; + jsonrpc: string; + result?: T; + error?: { + readonly code?: number; + readonly data?: E; + readonly message: string; + }; +}; +export interface ELProof { + readonly address: string; + readonly balance: string; + readonly codeHash: string; + readonly nonce: string; + readonly storageHash: string; + readonly accountProof: string[]; + readonly storageProof: { + readonly key: string; + readonly value: string; + readonly proof: string[]; + }[]; +} +export type ELStorageProof = Pick; +export type HexString = string; diff --git a/packages/prover/src/utils/assertion.ts b/packages/prover/src/utils/assertion.ts new file mode 100644 index 0000000000..f61d0700e7 --- /dev/null +++ b/packages/prover/src/utils/assertion.ts @@ -0,0 +1,53 @@ +import {Lightclient} from "@lodestar/light-client"; +import { + EIP1193Provider, + EthersProvider, + RequestProvider, + SendAsyncProvider, + SendProvider, + Web3Provider, +} from "../interfaces.js"; + +export function assertLightClient(client?: Lightclient): asserts client is Lightclient { + if (!client) { + throw new Error("Light client is not initialized yet."); + } +} + +export function isSendProvider(provider: Web3Provider): provider is SendProvider { + return ( + "send" in provider && + typeof provider.send === "function" && + provider.send.length > 1 && + provider.send.constructor.name !== "AsyncFunction" + ); +} + +export function isEthersProvider(provider: Web3Provider): provider is EthersProvider { + return ( + "send" in provider && + typeof provider.send === "function" && + provider.send.length > 1 && + provider.send.constructor.name === "AsyncFunction" + ); +} + +export function isRequestProvider(provider: Web3Provider): provider is RequestProvider { + return "request" in provider && typeof provider.request === "function" && provider.request.length > 1; +} + +export function isSendAsyncProvider(provider: Web3Provider): provider is SendAsyncProvider { + return ( + "sendAsync" in provider && + typeof provider.sendAsync === "function" && + provider.sendAsync.constructor.name === "AsyncFunction" + ); +} + +export function isEIP1193Provider(provider: Web3Provider): provider is EIP1193Provider { + return ( + "request" in provider && + typeof provider.request === "function" && + provider.request.constructor.name === "AsyncFunction" + ); +} diff --git a/packages/prover/src/utils/command.ts b/packages/prover/src/utils/command.ts new file mode 100644 index 0000000000..f22aca319a --- /dev/null +++ b/packages/prover/src/utils/command.ts @@ -0,0 +1,43 @@ +import {Options, Argv} from "yargs"; + +export type CliCommandOptions = Required<{[key in keyof OwnArgs]: Options}>; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export interface CliCommand, ParentArgs = Record, R = any> { + command: string; + describe: string; + examples?: {command: string; description: string}[]; + options?: CliCommandOptions; + // 1st arg: any = free own sub command options + // 2nd arg: subcommand parent options is = to this command options + parent options + // eslint-disable-next-line @typescript-eslint/no-explicit-any + subcommands?: CliCommand[]; + handler?: (args: OwnArgs & ParentArgs) => Promise; +} + +/** + * Register a CliCommand type to yargs. Recursively registers subcommands too. + * @param yargs + * @param cliCommand + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function registerCommandToYargs(yargs: Argv, cliCommand: CliCommand): void { + yargs.command({ + command: cliCommand.command, + describe: cliCommand.describe, + builder: (yargsBuilder) => { + yargsBuilder.options(cliCommand.options || {}); + for (const subcommand of cliCommand.subcommands || []) { + registerCommandToYargs(yargsBuilder, subcommand); + } + if (cliCommand.examples) { + for (const example of cliCommand.examples) { + yargsBuilder.example(`$0 ${example.command}`, example.description); + } + } + return yargs; + }, + // eslint-disable-next-line @typescript-eslint/no-empty-function + handler: cliCommand.handler || function emptyHandler(): void {}, + }); +} diff --git a/packages/prover/src/utils/consensus.ts b/packages/prover/src/utils/consensus.ts new file mode 100644 index 0000000000..38c1b163f4 --- /dev/null +++ b/packages/prover/src/utils/consensus.ts @@ -0,0 +1,105 @@ +import {Api} from "@lodestar/api/beacon"; +import {allForks, Bytes32, capella} from "@lodestar/types"; +import {GenesisData, Lightclient} from "@lodestar/light-client"; +import {ApiError} from "@lodestar/api"; +import {MAX_PAYLOAD_HISTORY} from "../constants.js"; +import {hexToBuffer} from "./conversion.js"; + +export async function fetchNearestBlock( + api: Api, + slot: number, + direction: "up" | "down" = "down" +): Promise { + const res = await api.beacon.getBlockV2(slot); + + if (res.ok) return res.response.data; + + if (!res.ok && res.error.code === 404) { + return fetchNearestBlock(api, direction === "down" ? slot - 1 : slot + 1); + } + + throw new Error(`Can not fetch nearest block for slot=${slot}`); +} + +export async function getUnFinalizedRangeForPayloads(lightClient: Lightclient): Promise<{start: number; end: number}> { + const headSlot = lightClient.getHead().beacon.slot; + const finalizeSlot = lightClient.getFinalized().beacon.slot; + const endSlot = headSlot - MAX_PAYLOAD_HISTORY; + + return { + start: headSlot, + end: endSlot < finalizeSlot ? finalizeSlot : endSlot, + }; +} + +export async function getExecutionPayloads( + api: Api, + startSlot: number, + endSlot: number +): Promise> { + [startSlot, endSlot] = [Math.min(startSlot, endSlot), Math.max(startSlot, endSlot)]; + + const payloads: Record = {}; + + let slot = endSlot; + let block = (await fetchNearestBlock(api, slot, "down")) as capella.SignedBeaconBlock; + payloads[block.message.slot] = block.message.body.executionPayload; + + while (slot >= startSlot) { + const previousBlock = (await fetchNearestBlock(api, block.message.slot - 1, "down")) as capella.SignedBeaconBlock; + + if (block.message.body.executionPayload.parentHash === previousBlock.message.body.executionPayload.blockHash) { + payloads[block.message.slot] = block.message.body.executionPayload; + } + + slot = block.message.slot - 1; + block = previousBlock; + } + + return payloads; +} + +export async function getExecutionPayloadForBlockNumber( + api: Api, + startSlot: number, + blockNumber: number +): Promise> { + const payloads: Record = {}; + + let block = (await fetchNearestBlock(api, startSlot, "down")) as capella.SignedBeaconBlock; + payloads[block.message.slot] = block.message.body.executionPayload; + + while (payloads[block.message.slot].blockNumber !== blockNumber) { + const previousBlock = (await fetchNearestBlock(api, block.message.slot - 1, "down")) as capella.SignedBeaconBlock; + block = previousBlock; + } + + return payloads; +} + +export async function getGenesisData(api: Pick): Promise { + const res = await api.beacon.getGenesis(); + ApiError.assert(res); + + return { + genesisTime: Number(res.response.data.genesisTime), + genesisValidatorsRoot: res.response.data.genesisValidatorsRoot, + }; +} + +export async function getSyncCheckpoint(api: Pick, checkpoint?: string): Promise { + if (checkpoint && checkpoint.length !== 32) { + throw Error(`Checkpoint root must be 32 bytes long: ${checkpoint.length}`); + } + let syncCheckpoint: Uint8Array; + + if (checkpoint) { + syncCheckpoint = hexToBuffer(checkpoint); + } else { + const res = await api.beacon.getStateFinalityCheckpoints("head"); + ApiError.assert(res); + syncCheckpoint = res.response.data.finalized.root; + } + + return syncCheckpoint; +} diff --git a/packages/prover/src/utils/conversion.ts b/packages/prover/src/utils/conversion.ts new file mode 100644 index 0000000000..8f3fd3f806 --- /dev/null +++ b/packages/prover/src/utils/conversion.ts @@ -0,0 +1,21 @@ +export function numberToHex(n: number | bigint): string { + return "0x" + n.toString(16); +} + +export function hexToNumber(n: string): number { + return n.startsWith("0x") ? parseInt(n.slice(2), 16) : parseInt(n, 16); +} + +export function bufferToHex(buffer: Buffer | Uint8Array): string { + return "0x" + Buffer.from(buffer).toString("hex"); +} + +export function hexToBuffer(v: string): Buffer { + return Buffer.from(v.replace("0x", ""), "hex"); +} + +export function padLeft(v: Uint8Array, length: number): Uint8Array { + const buf = Buffer.alloc(length); + Buffer.from(v).copy(buf, length - v.length); + return buf; +} diff --git a/packages/prover/src/utils/errors.ts b/packages/prover/src/utils/errors.ts new file mode 100644 index 0000000000..8f492842f4 --- /dev/null +++ b/packages/prover/src/utils/errors.ts @@ -0,0 +1,4 @@ +/** + * Expected error that shouldn't print a stack trace + */ +export class YargsError extends Error {} diff --git a/packages/prover/src/utils/execution.ts b/packages/prover/src/utils/execution.ts new file mode 100644 index 0000000000..b42ff8b19f --- /dev/null +++ b/packages/prover/src/utils/execution.ts @@ -0,0 +1,108 @@ +import {RLP} from "@ethereumjs/rlp"; +import {Trie} from "@ethereumjs/trie"; +import {Account} from "@ethereumjs/util"; +import {keccak256} from "ethereum-cryptography/keccak.js"; +import {Bytes32} from "@lodestar/types"; +import {ethGetBalance} from "../verified_requests/eth_getBalance.js"; +import {ELRequestPayload, ELResponse, ELProof, ELStorageProof, HexString} from "../types.js"; +import {ProofProvider} from "../proof_provider/proof_provider.js"; +import {ELRequestMethod, ELVerifiedRequestHandler} from "../interfaces.js"; +import {hexToBuffer, padLeft} from "./conversion.js"; + +const emptyAccountSerialize = new Account().serialize(); +const storageKeyLength = 32; + +// eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-explicit-any +const supportedELRequests: Record> = {eth_getBalance: ethGetBalance}; + +export async function processAndVerifyRequest({ + payload, + handler, + proofProvider, +}: { + payload: ELRequestPayload; + handler: ELRequestMethod; + proofProvider: ProofProvider; +}): Promise { + await proofProvider.waitToBeReady(); + const verifiedHandler = supportedELRequests[payload.method]; + + if (verifiedHandler !== undefined) { + return verifiedHandler({payload, handler, rootProvider: proofProvider}); + } + + // eslint-disable-next-line no-console + console.warn(`Request handler for ${payload.method} is not implemented.`); + return handler(payload); +} + +export async function getELProof( + handler: ELRequestMethod, + args: [address: string, storageKeys: string[], block: number | string] +): Promise { + // TODO: Find better way to generate random id + const proof = await handler({ + jsonrpc: "2.0", + method: "eth_getProof", + params: args, + id: (Math.random() * 10000).toFixed(0), + }); + if (!proof) { + throw new Error("Can not find proof for given address."); + } + return proof.result as ELProof; +} + +export async function isValidAccount({ + address, + stateRoot, + proof, +}: { + address: HexString; + stateRoot: Bytes32; + proof: ELProof; +}): Promise { + const trie = await Trie.create(); + const key = keccak256(hexToBuffer(address)); + + const expectedAccountRLP = await trie.verifyProof( + Buffer.from(stateRoot), + Buffer.from(key), + proof.accountProof.map(hexToBuffer) + ); + + // Shresth Agrawal (2022) Patronum source code. https://github.com/lightclients/patronum + const account = Account.fromAccountData({ + nonce: BigInt(proof.nonce), + balance: BigInt(proof.balance), + storageRoot: proof.storageHash, + codeHash: proof.codeHash, + }); + return account.serialize().equals(expectedAccountRLP ? expectedAccountRLP : emptyAccountSerialize); +} + +export async function isValidStorageKeys({ + storageKeys, + proof, +}: { + storageKeys: HexString[]; + proof: ELStorageProof; +}): Promise { + const trie = await Trie.create(); + + for (let i = 0; i < storageKeys.length; i++) { + const sp = proof.storageProof[i]; + const key = keccak256(padLeft(hexToBuffer(storageKeys[i]), storageKeyLength)); + const expectedStorageRLP = await trie.verifyProof( + hexToBuffer(proof.storageHash), + Buffer.from(key), + sp.proof.map(hexToBuffer) + ); + const isStorageValid = + (!expectedStorageRLP && sp.value === "0x0") || + (!!expectedStorageRLP && expectedStorageRLP.equals(RLP.encode(sp.value))); + if (!isStorageValid) return false; + } + + return true; +} diff --git a/packages/prover/src/utils/gitData/gitDataPath.ts b/packages/prover/src/utils/gitData/gitDataPath.ts new file mode 100644 index 0000000000..e243ca433f --- /dev/null +++ b/packages/prover/src/utils/gitData/gitDataPath.ts @@ -0,0 +1,49 @@ +import path from "node:path"; +import fs from "node:fs"; +import {fileURLToPath} from "node:url"; + +// Global variable __dirname no longer available in ES6 modules. +// Solutions: https://stackoverflow.com/questions/46745014/alternative-for-dirname-in-node-js-when-using-es6-modules +// eslint-disable-next-line @typescript-eslint/naming-convention +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +// Persist git data and distribute through NPM so CLI consumers can know exactly +// at what commit was this src build. This is used in the metrics and to log initially. +// +// - For NPM release (stable): Only the version is persisted. Once must then track the version's tag +// in Github to resolve that version to a specific commit. While this is okay, git-data.json gives +// a gurantee of the exact commit at build time. +// +// - For NPM release (dev): canary commits include the commit, so this feature is not really +// necessary. However, it's more cumbersome to have conditional logic on stable / dev. +// +// - For build from source: .git folder is available in the context of the built code, so it can extract +// branch and commit directly without the need for .git-data.json. +// +// - For build from source dockerized: This feature is required to know the branch and commit, since +// git data is not persisted past the build. However, .dockerignore prevents .git folder from being +// copied into the container's context, so .git-data.json can't be generated. + +/** + * WARNING!! If you change this path make sure to update: + * - 'packages/cli/package.json' -> .files -> `".git-data.json"` + */ +export const gitDataPath = path.resolve(__dirname, "../../../.git-data.json"); + +/** Git data type used to construct version information string and persistence. */ +export type GitData = { + /** "developer-feature" */ + branch: string; + /** "80c248bb392f512cc115d95059e22239a17bbd7d" */ + commit: string; +}; + +/** Writes a persistent git data file. */ +export function writeGitDataFile(gitData: GitData): void { + fs.writeFileSync(gitDataPath, JSON.stringify(gitData, null, 2)); +} + +/** Reads the persistent git data file. */ +export function readGitDataFile(): GitData { + return JSON.parse(fs.readFileSync(gitDataPath, "utf8")) as GitData; +} diff --git a/packages/prover/src/utils/gitData/index.ts b/packages/prover/src/utils/gitData/index.ts new file mode 100644 index 0000000000..96c5e4bbae --- /dev/null +++ b/packages/prover/src/utils/gitData/index.ts @@ -0,0 +1,71 @@ +import {execSync} from "node:child_process"; + +// This file is created in the build step and is distributed through NPM +// MUST be in sync with `-/gitDataPath.ts` and `package.json` files. +import {readGitDataFile, GitData} from "./gitDataPath.js"; + +/** Reads git data from a persisted file or local git data at build time. */ +export function readAndGetGitData(): GitData { + try { + // Gets git data containing current branch and commit info from persistent file. + let persistedGitData: Partial; + try { + persistedGitData = readGitDataFile(); + } catch (e) { + persistedGitData = {}; + } + + const currentGitData = getGitData(); + + return { + // If the CLI is run from source, prioritze current git data + // over `.git-data.json` file, which might be stale here. + branch: + currentGitData.branch && currentGitData.branch.length > 0 + ? currentGitData.branch + : persistedGitData.branch ?? "", + commit: + currentGitData.commit && currentGitData.commit.length > 0 + ? currentGitData.commit + : persistedGitData.commit ?? "", + }; + } catch (e) { + return { + branch: "", + commit: "", + }; + } +} + +/** Gets git data containing current branch and commit info from CLI. */ +export function getGitData(): GitData { + return { + branch: process.env.GIT_BRANCH ?? getBranch(), + commit: process.env.GIT_COMMIT ?? getCommit(), + }; +} + +/** Tries to get branch from git CLI. */ +function getBranch(): string { + try { + return shellSilent("git rev-parse --abbrev-ref HEAD"); + } catch (e) { + return ""; + } +} + +/** Tries to get commit from git from git CLI. */ +function getCommit(): string { + try { + return shellSilent("git rev-parse --verify HEAD"); + } catch (e) { + return ""; + } +} + +/** Silent shell that won't pollute stdout, or stderr */ +function shellSilent(cmd: string): string { + return execSync(cmd, {stdio: ["ignore", "pipe", "ignore"]}) + .toString() + .trim(); +} diff --git a/packages/prover/src/utils/gitData/writeGitData.ts b/packages/prover/src/utils/gitData/writeGitData.ts new file mode 100644 index 0000000000..f2d974d140 --- /dev/null +++ b/packages/prover/src/utils/gitData/writeGitData.ts @@ -0,0 +1,10 @@ +#!/usr/bin/env node + +// For RATIONALE of this file, check packages/cli/src/util/gitData/gitDataPath.ts +// Persist exact commit in NPM distributions for easier tracking of the build + +import {writeGitDataFile} from "./gitDataPath.js"; +import {getGitData} from "./index.js"; + +// Script to write the git data file (json) used by the build procedures to persist git data. +writeGitDataFile(getGitData()); diff --git a/packages/prover/src/utils/json_rpc.ts b/packages/prover/src/utils/json_rpc.ts new file mode 100644 index 0000000000..de0de46dff --- /dev/null +++ b/packages/prover/src/utils/json_rpc.ts @@ -0,0 +1,35 @@ +import {UNVERIFIED_RESPONSE_CODE} from "../constants.js"; +import {ELRequestPayload, ELResponse} from "../types.js"; + +export function generateRPCResponseForPayload( + payload: ELRequestPayload

, + res?: R, + error?: { + readonly code?: number; + readonly data?: E; + readonly message: string; + } +): ELResponse { + return { + jsonrpc: payload.jsonrpc, + id: payload.id, + result: res, + error, + }; +} + +export function generateUnverifiedResponseForPayload( + payload: ELRequestPayload

, + message: string, + data?: D +): ELResponse { + return { + jsonrpc: payload.jsonrpc, + id: payload.id, + error: { + code: UNVERIFIED_RESPONSE_CODE, + message, + data, + }, + }; +} diff --git a/packages/prover/src/utils/logger.ts b/packages/prover/src/utils/logger.ts new file mode 100644 index 0000000000..db2b6d6920 --- /dev/null +++ b/packages/prover/src/utils/logger.ts @@ -0,0 +1,46 @@ +import {LogData, Logger, LoggerChildOpts} from "@lodestar/utils"; +import {ELRequestPayload} from "../types.js"; + +const printLogData = (data: LogData): string => { + if (!Array.isArray(data) && data !== null && typeof data === "object") { + return Object.entries(data) + .map(([key, value]) => `${key}=${value}`) + .join(" "); + } + return JSON.stringify(data); +}; + +const stdLogHandler = (level: string): ((message: string, context?: LogData, error?: Error | undefined) => void) => { + if (process === undefined) { + return (message: string, context?: LogData, error?: Error | undefined): void => { + // eslint-disable-next-line no-console + console.log( + `${level}: ${message} ${context === undefined ? "" : printLogData(context)} ${error ? error.stack : ""}` + ); + }; + } + return (message: string, context?: LogData, error?: Error | undefined): void => { + const stream = level === "error" ? process.stderr : process.stdout; + stream.write( + `${level}: ${message} ${context === undefined ? "" : printLogData(context)} ${error ? error.stack : ""}\n` + ); + }; +}; + +export const stdLogger: Logger = { + error: stdLogHandler("error"), + warn: stdLogHandler("warn"), + info: stdLogHandler("info"), + debug: stdLogHandler("debug"), + verbose: stdLogHandler("verb"), + // eslint-disable-next-line func-names + child: function (_options: LoggerChildOpts): Logger { + throw new Error("Not supported."); + }, +}; + +export function logRequest({logger, payload}: {logger: Logger; payload: ELRequestPayload}): void { + logger.debug( + `Req method=${payload.method} params=${payload.params === undefined ? "" : JSON.stringify(payload.params)}` + ); +} diff --git a/packages/prover/src/utils/req_resp.ts b/packages/prover/src/utils/req_resp.ts new file mode 100644 index 0000000000..36effc7020 --- /dev/null +++ b/packages/prover/src/utils/req_resp.ts @@ -0,0 +1,34 @@ +import http from "node:http"; +import {ELRequestPayload, ELResponse} from "../types.js"; + +export const fetchRequestPayload = async (req: http.IncomingMessage): Promise => { + return new Promise((resolve, reject) => { + let body = ""; + req.on("data", (chunk) => { + body += chunk; + }); + req.on("end", () => { + try { + resolve(JSON.parse(body) as ELRequestPayload); + } catch (err) { + reject(err); + } + }); + }); +}; + +export const fetchResponseBody = async (res: http.IncomingMessage): Promise => { + return new Promise((resolve, reject) => { + let body = ""; + res.on("data", (chunk) => { + body += chunk; + }); + res.on("end", () => { + try { + resolve(JSON.parse(body) as ELResponse); + } catch (err) { + reject(err); + } + }); + }); +}; diff --git a/packages/prover/src/utils/version.ts b/packages/prover/src/utils/version.ts new file mode 100644 index 0000000000..eb6bf865c2 --- /dev/null +++ b/packages/prover/src/utils/version.ts @@ -0,0 +1,75 @@ +import fs from "node:fs"; +import path from "node:path"; +import {fileURLToPath} from "node:url"; +import findUp from "find-up"; +import {readAndGetGitData} from "./gitData/index.js"; + +// Global variable __dirname no longer available in ES6 modules. +// Solutions: https://stackoverflow.com/questions/46745014/alternative-for-dirname-in-node-js-when-using-es6-modules +// eslint-disable-next-line @typescript-eslint/naming-convention +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +type VersionJson = { + /** "0.28.2" */ + version: string; +}; + +const BRANCH_IGNORE = /^(HEAD|master|unstable|main)$/; + +/** + * Gathers all information on package version including Git data. + * @returns a version string, e.g. + * - Stable release: `v0.36.0/80c248bb` + * - Dev release: `v0.36.0-dev.80c248bb/80c248bb` + * - Test branch: `v0.36.0/developer-feature/80c248bb` + */ +export function getVersionData(): { + version: string; + commit: string; +} { + const parts: string[] = []; + + /** Returns local version from `lerna.json` or `package.json` as `"0.28.2"` */ + const localVersion = readCliPackageJson() || readVersionFromLernaJson(); + if (localVersion) { + parts.push(`v${localVersion}`); + } + + const {branch, commit} = readAndGetGitData(); + + // Add branch only if not present and not an ignore value + if (branch && !BRANCH_IGNORE.test(branch)) parts.push(branch); + + // Add commit only if present. 7 characters to be consistent with Github + if (commit) { + const commitShort = commit.slice(0, 7); + // Don't add commit if it's already in the version string (dev versions) + if (!localVersion || !localVersion.includes(commitShort)) { + parts.push(commitShort); + } + } + + return { + // Guard against empty parts array + version: parts.length > 0 ? parts.join("/") : "unknown", + commit, + }; +} + +/** Read version information from lerna.json */ +function readVersionFromLernaJson(): string | undefined { + const filePath = findUp.sync("lerna.json", {cwd: __dirname}); + if (!filePath) return undefined; + + const lernaJson = JSON.parse(fs.readFileSync(filePath, "utf8")) as VersionJson; + return lernaJson.version; +} + +/** Read version information from package.json */ +function readCliPackageJson(): string | undefined { + const filePath = findUp.sync("package.json", {cwd: __dirname}); + if (!filePath) return undefined; + + const packageJson = JSON.parse(fs.readFileSync(filePath, "utf8")) as VersionJson; + return packageJson.version; +} diff --git a/packages/prover/src/verified_requests/eth_getBalance.ts b/packages/prover/src/verified_requests/eth_getBalance.ts new file mode 100644 index 0000000000..2ec1fe5fb2 --- /dev/null +++ b/packages/prover/src/verified_requests/eth_getBalance.ts @@ -0,0 +1,29 @@ +import {ELVerifiedRequestHandler} from "../interfaces.js"; +import {bufferToHex} from "../utils/conversion.js"; +import {getELProof, isValidAccount, isValidStorageKeys} from "../utils/execution.js"; +import {generateRPCResponseForPayload, generateUnverifiedResponseForPayload} from "../utils/json_rpc.js"; + +export const ethGetBalance: ELVerifiedRequestHandler<[address: string, block?: number | string], string> = async ({ + handler, + payload, + rootProvider, +}) => { + const { + params: [address, block], + } = payload; + const executionPayload = await rootProvider.getExecutionPayload(block ?? "latest"); + const proof = await getELProof(handler, [address, [], bufferToHex(executionPayload.blockHash)]); + + if ( + (await isValidAccount({ + address: address, + stateRoot: executionPayload.stateRoot, + proof, + })) && + (await isValidStorageKeys({storageKeys: [], proof})) + ) { + return generateRPCResponseForPayload(payload, proof.balance); + } + + return generateUnverifiedResponseForPayload(payload, "eth_getBalance request can not be verified."); +}; diff --git a/packages/prover/src/web3_provider.ts b/packages/prover/src/web3_provider.ts new file mode 100644 index 0000000000..b1e0ad7123 --- /dev/null +++ b/packages/prover/src/web3_provider.ts @@ -0,0 +1,142 @@ +import {NetworkName} from "@lodestar/config/networks"; +import { + EIP1193Provider, + EthersProvider, + LCTransport, + RequestProvider, + SendAsyncProvider, + SendProvider, + Web3Provider, +} from "./interfaces.js"; +import {ProofProvider} from "./proof_provider/proof_provider.js"; +import {ELRequestPayload, ELResponse} from "./types.js"; +import { + isEIP1193Provider, + isEthersProvider, + isRequestProvider, + isSendAsyncProvider, + isSendProvider, +} from "./utils/assertion.js"; +import {processAndVerifyRequest} from "./utils/execution.js"; + +type ProvableProviderInitOpts = {network?: NetworkName; wsCheckpoint?: string} & ( + | {transport: LCTransport.Rest; urls: string[]} + | {transport: LCTransport.P2P; bootnodes: string[]} +); + +const defaultNetwork = "mainnet"; + +export function createVerifiedExecutionProvider( + provider: T, + opts: ProvableProviderInitOpts +): {provider: T; proofProvider: ProofProvider} { + const controller = new AbortController(); + const proofProvider = ProofProvider.init({ + ...opts, + network: opts.network ?? defaultNetwork, + signal: controller.signal, + }); + + if (isSendProvider(provider)) { + return {provider: handleSendProvider(provider, proofProvider) as T, proofProvider: proofProvider}; + } + + if (isEthersProvider(provider)) { + return {provider: handleEthersProvider(provider, proofProvider) as T, proofProvider: proofProvider}; + } + + if (isRequestProvider(provider)) { + return {provider: handleRequestProvider(provider, proofProvider) as T, proofProvider: proofProvider}; + } + + if (isSendAsyncProvider(provider)) { + return {provider: handleSendAsyncProvider(provider, proofProvider) as T, proofProvider: proofProvider}; + } + + if (isEIP1193Provider(provider)) { + return {provider: handleEIP1193Provider(provider, proofProvider) as T, proofProvider: proofProvider}; + } + + return {provider, proofProvider: proofProvider}; +} + +function handleSendProvider(provider: SendProvider, rootProvider: ProofProvider): SendProvider { + const send = provider.send.bind(provider); + const handler = (payload: ELRequestPayload): Promise => + new Promise((resolve, reject) => { + send(payload, (err, response) => { + if (err) { + reject(err); + } else { + resolve(response); + } + }); + }); + + function newSend(payload: ELRequestPayload, callback: (err?: Error | null, response?: ELResponse) => void): void { + processAndVerifyRequest({payload, handler, proofProvider: rootProvider}) + .then((response) => callback(undefined, response)) + .catch((err) => callback(err, undefined)); + } + + return Object.assign(provider, {send: newSend}); +} + +function handleRequestProvider(provider: RequestProvider, rootProvider: ProofProvider): RequestProvider { + const request = provider.request.bind(provider); + const handler = (payload: ELRequestPayload): Promise => + new Promise((resolve, reject) => { + request(payload, (err, response) => { + if (err) { + reject(err); + } else { + resolve(response); + } + }); + }); + + function newRequest(payload: ELRequestPayload, callback: (err?: Error | null, response?: ELResponse) => void): void { + processAndVerifyRequest({payload, handler, proofProvider: rootProvider}) + .then((response) => callback(undefined, response)) + .catch((err) => callback(err, undefined)); + } + + return Object.assign(provider, {request: newRequest}); +} + +function handleSendAsyncProvider(provider: SendAsyncProvider, rootProvider: ProofProvider): SendAsyncProvider { + const sendAsync = provider.sendAsync.bind(provider); + const handler = (payload: ELRequestPayload): Promise => sendAsync(payload); + + async function newSendAsync(payload: ELRequestPayload): Promise { + return processAndVerifyRequest({payload, handler, proofProvider: rootProvider}); + } + + return Object.assign(provider, {sendAsync: newSendAsync}); +} + +function handleEIP1193Provider(provider: EIP1193Provider, rootProvider: ProofProvider): EIP1193Provider { + const request = provider.request.bind(provider); + const handler = (payload: ELRequestPayload): Promise => request(payload); + + async function newRequest(payload: ELRequestPayload): Promise { + return processAndVerifyRequest({payload, handler, proofProvider: rootProvider}); + } + + return Object.assign(provider, {request: newRequest}); +} + +function handleEthersProvider(provider: EthersProvider, rootProvider: ProofProvider): EthersProvider { + const send = provider.send.bind(provider); + const handler = (payload: ELRequestPayload): Promise => send(payload.method, payload.params); + + async function newSend(method: string, params: Array): Promise { + return processAndVerifyRequest({ + payload: {jsonrpc: "2.0", id: 0, method, params}, + handler, + proofProvider: rootProvider, + }); + } + + return Object.assign(provider, {send: newSend}); +} diff --git a/packages/prover/src/web3_proxy.ts b/packages/prover/src/web3_proxy.ts new file mode 100644 index 0000000000..0cdd85ea23 --- /dev/null +++ b/packages/prover/src/web3_proxy.ts @@ -0,0 +1,122 @@ +import http from "node:http"; +import https from "node:https"; +import url from "node:url"; +import httpProxy from "http-proxy"; +import {NetworkName} from "@lodestar/config/networks"; +import {Logger} from "@lodestar/utils"; +import {LCTransport} from "./interfaces.js"; +import {ProofProvider} from "./proof_provider/proof_provider.js"; +import {ELRequestPayload, ELResponse} from "./types.js"; +import {processAndVerifyRequest} from "./utils/execution.js"; +import {logRequest} from "./utils/logger.js"; +import {generateRPCResponseForPayload} from "./utils/json_rpc.js"; +import {fetchRequestPayload, fetchResponseBody} from "./utils/req_resp.js"; + +export type VerifiedProxyOptions = { + network: NetworkName; + executionRpcUrl: string; + logger: Logger; + wsCheckpoint?: string; +} & ({transport: LCTransport.Rest; urls: string[]} | {transport: LCTransport.P2P; bootnodes: string[]}); + +export function createVerifiedExecutionProxy( + opts: VerifiedProxyOptions +): {server: http.Server; proofProvider: ProofProvider} { + const {executionRpcUrl: executionUrl, logger, network} = opts; + const controller = new AbortController(); + + const proofProvider = ProofProvider.init({ + ...opts, + network: network, + signal: controller.signal, + }); + + const proxy = httpProxy.createProxy({ + target: executionUrl, + ws: executionUrl.startsWith("ws"), + agent: https.globalAgent, + xfwd: true, + ignorePath: true, + changeOrigin: true, + }); + + let proxyServerListeningAddress: {host: string; port: number} | undefined; + + function handler(payload: ELRequestPayload): Promise { + return new Promise((resolve, reject) => { + if (!proxyServerListeningAddress) return reject(new Error("Proxy server not listening")); + const req = http.request( + { + method: "POST", + path: "/proxy", + port: proxyServerListeningAddress.port, + host: proxyServerListeningAddress.host, + signal: controller.signal, + headers: { + "Content-Type": "application/json", + }, + }, + (res) => { + fetchResponseBody(res).then(resolve).catch(reject); + } + ); + req.write(JSON.stringify(payload)); + req.end(); + }); + } + + const proxyServer = http.createServer(function proxyRequestHandler(req, res) { + if (req.url === "/proxy") { + proxy.web(req, res); + return; + } + + let payload: ELRequestPayload; + fetchRequestPayload(req) + .then((data) => { + payload = data; + logRequest({payload, logger}); + return processAndVerifyRequest({payload, proofProvider, handler}); + }) + .then((response) => { + res.write(JSON.stringify(response)); + res.end(); + }) + .catch((err) => { + res.write(JSON.stringify(generateRPCResponseForPayload(payload, undefined, {message: (err as Error).message}))); + res.end(); + }); + }); + + proxyServer.on("listening", () => { + const address = proxyServer.address(); + + if (address === null) { + throw new Error("Invalid proxy server address"); + } + + if (typeof address === "string") { + const rawUrl = url.parse(address); + if (!rawUrl.host || !rawUrl.port || !rawUrl.protocol) { + throw new Error(`Invalid proxy server address: ${address}`); + } + proxyServerListeningAddress = {host: rawUrl.host, port: parseInt(rawUrl.port)}; + } else { + proxyServerListeningAddress = {host: address.address, port: address.port}; + } + + logger.info( + `Lodestar Prover Proxy listening on ${proxyServerListeningAddress.host}:${proxyServerListeningAddress.port}` + ); + }); + + proxyServer.on("upgrade", function proxyRequestUpgrade(req, socket, head) { + proxy.ws(req, socket, head); + }); + + controller.signal.addEventListener("abort", () => { + proxyServer.close(); + }); + + return {server: proxyServer, proofProvider}; +} diff --git a/packages/prover/test/e2e/web3_provider.test.ts b/packages/prover/test/e2e/web3_provider.test.ts new file mode 100644 index 0000000000..4a1f1da274 --- /dev/null +++ b/packages/prover/test/e2e/web3_provider.test.ts @@ -0,0 +1,45 @@ +import {expect} from "chai"; +import Web3 from "web3"; +import {ethers} from "ethers"; +import {LCTransport} from "../../src/interfaces.js"; +import {createVerifiedExecutionProvider} from "../../src/web3_provider.js"; + +describe("web3_provider", () => { + describe("createVerifiedExecutionProvider", function () { + // As the code will try to sync the light client, it may take a while + this.timeout(10000); + + describe("web3", () => { + it("should connect to the network and call non-verified method", async () => { + const {provider} = createVerifiedExecutionProvider( + new Web3.providers.HttpProvider("https://lodestar-sepoliarpc.chainsafe.io"), + { + transport: LCTransport.Rest, + urls: ["https://lodestar-sepolia.chainsafe.io"], + network: "sepolia", + } + ); + + const web3 = new Web3(provider); + // `getProof` will always remain the non-verified method + // as we use it to create proof and verify + await expect(web3.eth.getProof("0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134", [], "latest")).fulfilled; + }); + }); + + describe("ethers", () => { + it("should connect to the network and call non-verified method", async () => { + const {provider} = createVerifiedExecutionProvider( + new ethers.JsonRpcProvider("https://lodestar-sepoliarpc.chainsafe.io"), + { + transport: LCTransport.Rest, + urls: ["https://lodestar-sepolia.chainsafe.io"], + network: "sepolia", + } + ); + await expect(provider.send("eth_getProof", ["0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134", [], "latest"])) + .fulfilled; + }); + }); + }); +}); diff --git a/packages/prover/test/setup.ts b/packages/prover/test/setup.ts new file mode 100644 index 0000000000..b83e6cb785 --- /dev/null +++ b/packages/prover/test/setup.ts @@ -0,0 +1,6 @@ +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; +import sinonChai from "sinon-chai"; + +chai.use(chaiAsPromised); +chai.use(sinonChai); diff --git a/packages/prover/test/unit/utils/assertion.test.ts b/packages/prover/test/unit/utils/assertion.test.ts new file mode 100644 index 0000000000..1cb9a4b1f4 --- /dev/null +++ b/packages/prover/test/unit/utils/assertion.test.ts @@ -0,0 +1,27 @@ +import {expect} from "chai"; +import {ethers} from "ethers"; +import Web3 from "web3"; +import {isSendProvider} from "../../../src/utils/assertion.js"; + +describe("utils/assertion", () => { + describe("isSendProvider", () => { + it("should return true if provider is SendProvider", () => { + const provider = { + send: (_payload: any, _cb: () => void) => { + // Do nothing; + }, + }; + expect(isSendProvider(provider)).to.be.true; + }); + + it("should return false for ethers provider", () => { + const provider = new ethers.JsonRpcProvider(""); + expect(isSendProvider(provider)).to.be.false; + }); + + it("should return true for web3 provider", () => { + const provider = new Web3.providers.HttpProvider(""); + expect(isSendProvider(provider)).to.be.true; + }); + }); +}); diff --git a/packages/prover/test/unit/utils/execution.test.ts b/packages/prover/test/unit/utils/execution.test.ts new file mode 100644 index 0000000000..65054bb2dc --- /dev/null +++ b/packages/prover/test/unit/utils/execution.test.ts @@ -0,0 +1,192 @@ +import {expect} from "chai"; +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; +import {ELProof, ELStorageProof} from "../../../src/types.js"; +import {isValidAccount, isValidStorageKeys} from "../../../src/utils/execution.js"; + +chai.use(chaiAsPromised); + +describe("uitls/verification", () => { + describe("isValidAccount", () => { + it("should return true if account is valid", async () => { + const address = "0xf97e180c050e5ab072211ad2c213eb5aee4df134"; + const stateRoot = Buffer.from("7c0f9a6f21d82c2d7690db7aa36c9938de11891071eed6e50ff8b06b5ae7018a", "hex"); + const proof: ELProof = { + address: "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + accountProof: [ + "0xf90211a0d75d80002d4636855e0a3641ca53b495f0ccc3647af350ed23e86c4a9a21e089a0336a6387ac802d0d0433b65144610247ae2c4308b5f08683c641cddae571de52a0660dfa6b7ff69e6c4fe394e28c04097fd7c0d1e24d4d33731517ffeedeb73157a07d9a0299ad17ee459de4036254a522384bff041c32824761717abe82ed2250d5a0048f46242274fcfb2987dd9e1071335f966065322639b21a62a45ef9c4364707a06ab5c805de0350d7eb8641cfa3e985b58506529fc4f2175d018485b100fc8b57a030319f5efe302ba7d2cb593508af9e5b09eb8b961aac077f3e93e7c30d72b23aa08062584b94684d3585bc5cff5eb14ce8288cae9e6cca02d0145111fdeaec1ce8a05439df26136570dd0e3091ae189084e5445551e73de9032a589da1e858f493f7a074bfd76b5dfbaeb33d5caa06b0606eddfa9e2650b162a806e834535297a43f6fa0424651d0c1014d6575f418d84813d5fe61807162ae61eb9e2e29c099b62cff15a0717da7ec37ee17527323649684010b25b7fd7a53017645c92302aef90f66c696a0ce494b7c363d3ae8cca6fa9a6e60cf27b824f4e5acfa286b5b972d62e378d210a0861ef474c4cdeabd705bae1f3cc0a414129e7c2ad5c4fde69d5eea1757302046a0d8cc468f942d47cbc8349d221f958ae0505da2a4573db6a59859b743568cffcaa0fd6408c5b26aeba4d614d7043fd04082b9262e44dc966ad2c88add47b580325c80", + "0xf90211a03aa3b28c58df0f2425569105f33d2b6f06682549a6086ca70e435e083bc86642a03177615c6149235d6c65e332ee7cc959b359d5dfdf9f6e3d29148d0f21aae9cba00357883423f1f4d1c5a21ef3c3bac9d87df1776aac962b1179c6ab4fa4c90eb1a0e5cdccfd420d7d0a115819805fc36372603d3a17ce1c8b3eb475d5c92f48090ea001b2c7e0885020c533a4bffc63735c409a118c774fa9927f56f54670de7a66bda054744b8c7e8ef96f30199b4038ea26467ea1803d205c2941e64a92a4b69f3457a0b3d5d0084572d60091cfd0e24a4ffba0b3fb53b53b9b6f91b0bb09714738ea46a052b016189553636fc18eaefd5ca00364dce332376a2988c936fa2527d15e215fa095f7f13944352c399335b7fe8971641db0e9922d9a91279e422f10cc75e16c26a0f5e63e53a4ab4157d7f3824747518d45567f1fab8fe1d41d569d33a97cb0e252a086928b3e984b0b92e24a8c27465e673e6c6336b7a9967b758e9a77ff92edb4e3a0bf10d9217a9bee1822e8f9edf82ac1d17725748fb9dcb0a16364da24bfbaa002a020eacf91465e7edefad05c0cc88c9209278edd213329f2f157969884985ecfaba02a195ddc556ebd100289d11ba8a6c54724bca5c93de0cec1e567f4f4537d952ca07237f43e3b1c16b5d7112fff823c08ffdd6891f4c9d2cb06b6300a0e3551f5faa0410d0b37714dbc23a76101f88a9b5876ab6d0d026391a2b456ea6bb245ef3c9680", + "0xf90211a05cad7b7b1877521c405da0d0600be8f8dbfb6fe593fe7e0ff79b07cae70c0d44a04d7fa730f2cf4127121a4fbd783e97c372d00e2278f1475bd46df26ed1aba7e0a0d5368b792c687cfe7942dc1f9ece7941967d5a0b7d7c569c0dc3ec3c00cd8254a05c9f8de738470a1c962b38e95b32932afd26eae633f436960789acc024ac02c1a0b89a8e0ac2119c1ab9f40b233e2fb6878f7e41ccffa431c725d9e12c6589685ea059e306727f0c5c7ea0bc89ddbccd2d83ba5d9bc845a1be74e8677defcd0382a6a0a26aac0a6ff0f5e9e24eb6a0cc2d0813dd931d588941ce9ab4c74fd67bfe1b7fa07761bda76f79d20fc56a7f75d31295b3456fe001e12cb35bcd9cc12fdb5363faa07607ec1df2eca793d11953260a679a586793a1da4a55a2c8797741ee7ebd446ba0775277855b4d28645a7e3309d307616866e0df43f30255a5a8c0687430e0f0e4a0246affb48f550d0ea5f7b0ccdb14dd2b413356ae109d2522fd91379ecbe4c60ca0e82662910f79c26e9e5681ecbf79642fb02fe797ec7d17f23054543b00ef34dea0b6d81b91c67ac2db3e32d1556d6e6f699ce1cd7f2c0100be64c6264a0cd090d8a061a554d18934beddc75a67777326400ba6e254366d1ef59ee47bcfa91b3279e4a06f13cd680786a409ccbc9b84471b978a9efa02b09d1a64670ff6451a32d37b96a0e929123e076756fb6d43d668ddb199aca289b8c5869ec93842f1ef89c39c604f80", + "0xf90211a028f2b0b77d46dd1a39fd0164d641b78e69ef29ce2ab676f02ee116d910b323cea0fcef9afa59d09cb714351378fd2c64becee3b1e9f09220687596670befb3a216a035d92a41b8e7e8c8f22abdce06272884cf1e53be96aa39a8aa722f97d0c8ea85a028b36435bf98dd8bac1edb6fc162737117320b000cd7609ec0d418e8dcad859ba062aaed887f8084e22f78779a671181c603cfeadc33629e4dc716fb4b8165d782a0180471c441c16211a8f2a3d9cc3859216965338971ece92d5386a972e6460c4ea0f3267b9acf4d4d47c8f563625c3f6a05e6d919312692945a28d44ada0408a8a4a0f157cf2e66744bb885c90b96b0ac50f45677262671224a4f754b1693930545b0a024db528d804e437bcbd74c6478d09fdcd95104bed7a110c01d89d4b24c283caea0f7ddca48dbfc34175322b37e35be0e10b7e8f0cf4b0f3c0c64ca4cc7409558a7a0fc03b71345f0f7c2c784b3e9bb8793c8358553eaa9811943af4b7e1ab827d64ca09db546d194941254910642424ed644cc13d27862d797faec1c73d72d4d1aff38a07ad68175fa8ccebae05aca2ac077b98f8906dfe1c01a526060d45948794badeba0383a06be4451de334f19162fd2f2b3a01ccaa318f0b19f6053c7f6274702a92ea0c92e0b54e5c7e5f6f18e0aa9762e09e911f0f519654b945103d517154125e695a0dcf537bda42520ce6670c2f3fb546ea12d28518f06310da26a9df887a1fc2a4880", + "0xf90131a02fc4b4a237a100d29804e54134a3f590fe14cfc5932cf0d7db7d10b7c19359a580a07fb3394fdb1dc6cb6ee6bf74e16772783361840df5878b10284ef41f457a9cdda0b5d3f9bd4f88da36a3fbb68526053d7394f35411433bd88799510ce8a51e08dea0700e6a715dd6d428d31cbc9543cf768212e07692a79bd560e56d4f9547f3b6fb8080a0b295e4bf173f6a21ab742c03976070c3ba873b5fe457831de8411bf5ca988d08a057c069ca8e65fea0a889e16e770a7cc4f3125a35820deb3f0e6f8ae22e08d2eba0781511eba2101b49120073b03e24e79a3cdb0a02ee2d948e05a99a8b3b4145a4a011504843006186cba62c7f5563b3aee69c9f0325d6aadddc4c7c5ea246e50772a0ec6a3ac8944ef87fd684400258ef36a89194599884b606b032bedb29f42bcd008080808080", + "0xf8729e31610ff568919eaebec883afe43d94f9558d9c666ca54b3d3bfef2311d37b851f84f0c8b034f248d17939c513a7e80a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + ], + balance: "0x34f248d17939c513a7e80", + codeHash: "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + nonce: "0xc", + storageHash: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + storageProof: [], + }; + + await expect( + isValidAccount({ + proof, + address, + stateRoot, + }) + ).eventually.to.be.true; + }); + + it("should fail with error if proof is valid but address is wrong", async () => { + const address = "0xe97e180c050e5ab072211ad2c213eb5aee4df134"; + const stateRoot = Buffer.from("7c0f9a6f21d82c2d7690db7aa36c9938de11891071eed6e50ff8b06b5ae7018a", "hex"); + const proof: ELProof = { + address: "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + accountProof: [ + "0xf90211a0d75d80002d4636855e0a3641ca53b495f0ccc3647af350ed23e86c4a9a21e089a0336a6387ac802d0d0433b65144610247ae2c4308b5f08683c641cddae571de52a0660dfa6b7ff69e6c4fe394e28c04097fd7c0d1e24d4d33731517ffeedeb73157a07d9a0299ad17ee459de4036254a522384bff041c32824761717abe82ed2250d5a0048f46242274fcfb2987dd9e1071335f966065322639b21a62a45ef9c4364707a06ab5c805de0350d7eb8641cfa3e985b58506529fc4f2175d018485b100fc8b57a030319f5efe302ba7d2cb593508af9e5b09eb8b961aac077f3e93e7c30d72b23aa08062584b94684d3585bc5cff5eb14ce8288cae9e6cca02d0145111fdeaec1ce8a05439df26136570dd0e3091ae189084e5445551e73de9032a589da1e858f493f7a074bfd76b5dfbaeb33d5caa06b0606eddfa9e2650b162a806e834535297a43f6fa0424651d0c1014d6575f418d84813d5fe61807162ae61eb9e2e29c099b62cff15a0717da7ec37ee17527323649684010b25b7fd7a53017645c92302aef90f66c696a0ce494b7c363d3ae8cca6fa9a6e60cf27b824f4e5acfa286b5b972d62e378d210a0861ef474c4cdeabd705bae1f3cc0a414129e7c2ad5c4fde69d5eea1757302046a0d8cc468f942d47cbc8349d221f958ae0505da2a4573db6a59859b743568cffcaa0fd6408c5b26aeba4d614d7043fd04082b9262e44dc966ad2c88add47b580325c80", + "0xf90211a03aa3b28c58df0f2425569105f33d2b6f06682549a6086ca70e435e083bc86642a03177615c6149235d6c65e332ee7cc959b359d5dfdf9f6e3d29148d0f21aae9cba00357883423f1f4d1c5a21ef3c3bac9d87df1776aac962b1179c6ab4fa4c90eb1a0e5cdccfd420d7d0a115819805fc36372603d3a17ce1c8b3eb475d5c92f48090ea001b2c7e0885020c533a4bffc63735c409a118c774fa9927f56f54670de7a66bda054744b8c7e8ef96f30199b4038ea26467ea1803d205c2941e64a92a4b69f3457a0b3d5d0084572d60091cfd0e24a4ffba0b3fb53b53b9b6f91b0bb09714738ea46a052b016189553636fc18eaefd5ca00364dce332376a2988c936fa2527d15e215fa095f7f13944352c399335b7fe8971641db0e9922d9a91279e422f10cc75e16c26a0f5e63e53a4ab4157d7f3824747518d45567f1fab8fe1d41d569d33a97cb0e252a086928b3e984b0b92e24a8c27465e673e6c6336b7a9967b758e9a77ff92edb4e3a0bf10d9217a9bee1822e8f9edf82ac1d17725748fb9dcb0a16364da24bfbaa002a020eacf91465e7edefad05c0cc88c9209278edd213329f2f157969884985ecfaba02a195ddc556ebd100289d11ba8a6c54724bca5c93de0cec1e567f4f4537d952ca07237f43e3b1c16b5d7112fff823c08ffdd6891f4c9d2cb06b6300a0e3551f5faa0410d0b37714dbc23a76101f88a9b5876ab6d0d026391a2b456ea6bb245ef3c9680", + "0xf90211a05cad7b7b1877521c405da0d0600be8f8dbfb6fe593fe7e0ff79b07cae70c0d44a04d7fa730f2cf4127121a4fbd783e97c372d00e2278f1475bd46df26ed1aba7e0a0d5368b792c687cfe7942dc1f9ece7941967d5a0b7d7c569c0dc3ec3c00cd8254a05c9f8de738470a1c962b38e95b32932afd26eae633f436960789acc024ac02c1a0b89a8e0ac2119c1ab9f40b233e2fb6878f7e41ccffa431c725d9e12c6589685ea059e306727f0c5c7ea0bc89ddbccd2d83ba5d9bc845a1be74e8677defcd0382a6a0a26aac0a6ff0f5e9e24eb6a0cc2d0813dd931d588941ce9ab4c74fd67bfe1b7fa07761bda76f79d20fc56a7f75d31295b3456fe001e12cb35bcd9cc12fdb5363faa07607ec1df2eca793d11953260a679a586793a1da4a55a2c8797741ee7ebd446ba0775277855b4d28645a7e3309d307616866e0df43f30255a5a8c0687430e0f0e4a0246affb48f550d0ea5f7b0ccdb14dd2b413356ae109d2522fd91379ecbe4c60ca0e82662910f79c26e9e5681ecbf79642fb02fe797ec7d17f23054543b00ef34dea0b6d81b91c67ac2db3e32d1556d6e6f699ce1cd7f2c0100be64c6264a0cd090d8a061a554d18934beddc75a67777326400ba6e254366d1ef59ee47bcfa91b3279e4a06f13cd680786a409ccbc9b84471b978a9efa02b09d1a64670ff6451a32d37b96a0e929123e076756fb6d43d668ddb199aca289b8c5869ec93842f1ef89c39c604f80", + "0xf90211a028f2b0b77d46dd1a39fd0164d641b78e69ef29ce2ab676f02ee116d910b323cea0fcef9afa59d09cb714351378fd2c64becee3b1e9f09220687596670befb3a216a035d92a41b8e7e8c8f22abdce06272884cf1e53be96aa39a8aa722f97d0c8ea85a028b36435bf98dd8bac1edb6fc162737117320b000cd7609ec0d418e8dcad859ba062aaed887f8084e22f78779a671181c603cfeadc33629e4dc716fb4b8165d782a0180471c441c16211a8f2a3d9cc3859216965338971ece92d5386a972e6460c4ea0f3267b9acf4d4d47c8f563625c3f6a05e6d919312692945a28d44ada0408a8a4a0f157cf2e66744bb885c90b96b0ac50f45677262671224a4f754b1693930545b0a024db528d804e437bcbd74c6478d09fdcd95104bed7a110c01d89d4b24c283caea0f7ddca48dbfc34175322b37e35be0e10b7e8f0cf4b0f3c0c64ca4cc7409558a7a0fc03b71345f0f7c2c784b3e9bb8793c8358553eaa9811943af4b7e1ab827d64ca09db546d194941254910642424ed644cc13d27862d797faec1c73d72d4d1aff38a07ad68175fa8ccebae05aca2ac077b98f8906dfe1c01a526060d45948794badeba0383a06be4451de334f19162fd2f2b3a01ccaa318f0b19f6053c7f6274702a92ea0c92e0b54e5c7e5f6f18e0aa9762e09e911f0f519654b945103d517154125e695a0dcf537bda42520ce6670c2f3fb546ea12d28518f06310da26a9df887a1fc2a4880", + "0xf90131a02fc4b4a237a100d29804e54134a3f590fe14cfc5932cf0d7db7d10b7c19359a580a07fb3394fdb1dc6cb6ee6bf74e16772783361840df5878b10284ef41f457a9cdda0b5d3f9bd4f88da36a3fbb68526053d7394f35411433bd88799510ce8a51e08dea0700e6a715dd6d428d31cbc9543cf768212e07692a79bd560e56d4f9547f3b6fb8080a0b295e4bf173f6a21ab742c03976070c3ba873b5fe457831de8411bf5ca988d08a057c069ca8e65fea0a889e16e770a7cc4f3125a35820deb3f0e6f8ae22e08d2eba0781511eba2101b49120073b03e24e79a3cdb0a02ee2d948e05a99a8b3b4145a4a011504843006186cba62c7f5563b3aee69c9f0325d6aadddc4c7c5ea246e50772a0ec6a3ac8944ef87fd684400258ef36a89194599884b606b032bedb29f42bcd008080808080", + "0xf8729e31610ff568919eaebec883afe43d94f9558d9c666ca54b3d3bfef2311d37b851f84f0c8b034f248d17939c513a7e80a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + ], + balance: "0x34f248d17939c513a7e80", + codeHash: "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + nonce: "0xc", + storageHash: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + storageProof: [], + }; + + await expect( + isValidAccount({ + proof, + address, + stateRoot, + }) + ).rejectedWith("Invalid proof provided"); + }); + + it("should fail with error if account is not valid", async () => { + const address = "0xf97e180c050e5ab072211ad2c213eb5aee4df134"; + const stateRoot = Buffer.from("7c0f9a6f21d82c2d7690db7aa36c9938de11891071eed6e50ff8b06b5ae7018a", "hex"); + const proof: ELProof = { + address: "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + accountProof: [ + "0xf90211a0d75d80002d4636755e0a3641ca53b495f0ccc3647af350ed23e86c4a9a21e089a0336a6387ac802d0d0433b65144610247ae2c4308b5f08683c641cddae571de52a0660dfa6b7ff69e6c4fe394e28c04097fd7c0d1e24d4d33731517ffeedeb73157a07d9a0299ad17ee459de4036254a522384bff041c32824761717abe82ed2250d5a0048f46242274fcfb2987dd9e1071335f966065322639b21a62a45ef9c4364707a06ab5c805de0350d7eb8641cfa3e985b58506529fc4f2175d018485b100fc8b57a030319f5efe302ba7d2cb593508af9e5b09eb8b961aac077f3e93e7c30d72b23aa08062584b94684d3585bc5cff5eb14ce8288cae9e6cca02d0145111fdeaec1ce8a05439df26136570dd0e3091ae189084e5445551e73de9032a589da1e858f493f7a074bfd76b5dfbaeb33d5caa06b0606eddfa9e2650b162a806e834535297a43f6fa0424651d0c1014d6575f418d84813d5fe61807162ae61eb9e2e29c099b62cff15a0717da7ec37ee17527323649684010b25b7fd7a53017645c92302aef90f66c696a0ce494b7c363d3ae8cca6fa9a6e60cf27b824f4e5acfa286b5b972d62e378d210a0861ef474c4cdeabd705bae1f3cc0a414129e7c2ad5c4fde69d5eea1757302046a0d8cc468f942d47cbc8349d221f958ae0505da2a4573db6a59859b743568cffcaa0fd6408c5b26aeba4d614d7043fd04082b9262e44dc966ad2c88add47b580325c80", + "0xf90211a03aa3b28c58df0f2425569105f33d2b6f06682549a6086ca70e435e083bc86642a03177615c6149235d6c65e332ee7cc959b359d5dfdf9f6e3d29148d0f21aae9cba00357883423f1f4d1c5a21ef3c3bac9d87df1776aac962b1179c6ab4fa4c90eb1a0e5cdccfd420d7d0a115819805fc36372603d3a17ce1c8b3eb475d5c92f48090ea001b2c7e0885020c533a4bffc63735c409a118c774fa9927f56f54670de7a66bda054744b8c7e8ef96f30199b4038ea26467ea1803d205c2941e64a92a4b69f3457a0b3d5d0084572d60091cfd0e24a4ffba0b3fb53b53b9b6f91b0bb09714738ea46a052b016189553636fc18eaefd5ca00364dce332376a2988c936fa2527d15e215fa095f7f13944352c399335b7fe8971641db0e9922d9a91279e422f10cc75e16c26a0f5e63e53a4ab4157d7f3824747518d45567f1fab8fe1d41d569d33a97cb0e252a086928b3e984b0b92e24a8c27465e673e6c6336b7a9967b758e9a77ff92edb4e3a0bf10d9217a9bee1822e8f9edf82ac1d17725748fb9dcb0a16364da24bfbaa002a020eacf91465e7edefad05c0cc88c9209278edd213329f2f157969884985ecfaba02a195ddc556ebd100289d11ba8a6c54724bca5c93de0cec1e567f4f4537d952ca07237f43e3b1c16b5d7112fff823c08ffdd6891f4c9d2cb06b6300a0e3551f5faa0410d0b37714dbc23a76101f88a9b5876ab6d0d026391a2b456ea6bb245ef3c9680", + "0xf90211a05cad7b7b1877521c405da0d0600be8f8dbfb6fe593fe7e0ff79b07cae70c0d44a04d7fa730f2cf4127121a4fbd783e97c372d00e2278f1475bd46df26ed1aba7e0a0d5368b792c687cfe7942dc1f9ece7941967d5a0b7d7c569c0dc3ec3c00cd8254a05c9f8de738470a1c962b38e95b32932afd26eae633f436960789acc024ac02c1a0b89a8e0ac2119c1ab9f40b233e2fb6878f7e41ccffa431c725d9e12c6589685ea059e306727f0c5c7ea0bc89ddbccd2d83ba5d9bc845a1be74e8677defcd0382a6a0a26aac0a6ff0f5e9e24eb6a0cc2d0813dd931d588941ce9ab4c74fd67bfe1b7fa07761bda76f79d20fc56a7f75d31295b3456fe001e12cb35bcd9cc12fdb5363faa07607ec1df2eca793d11953260a679a586793a1da4a55a2c8797741ee7ebd446ba0775277855b4d28645a7e3309d307616866e0df43f30255a5a8c0687430e0f0e4a0246affb48f550d0ea5f7b0ccdb14dd2b413356ae109d2522fd91379ecbe4c60ca0e82662910f79c26e9e5681ecbf79642fb02fe797ec7d17f23054543b00ef34dea0b6d81b91c67ac2db3e32d1556d6e6f699ce1cd7f2c0100be64c6264a0cd090d8a061a554d18934beddc75a67777326400ba6e254366d1ef59ee47bcfa91b3279e4a06f13cd680786a409ccbc9b84471b978a9efa02b09d1a64670ff6451a32d37b96a0e929123e076756fb6d43d668ddb199aca289b8c5869ec93842f1ef89c39c604f80", + "0xf90211a028f2b0b77d46dd1a39fd0164d641b78e69ef29ce2ab676f02ee116d910b323cea0fcef9afa59d09cb714351378fd2c64becee3b1e9f09220687596670befb3a216a035d92a41b8e7e8c8f22abdce06272884cf1e53be96aa39a8aa722f97d0c8ea85a028b36435bf98dd8bac1edb6fc162737117320b000cd7609ec0d418e8dcad859ba062aaed887f8084e22f78779a671181c603cfeadc33629e4dc716fb4b8165d782a0180471c441c16211a8f2a3d9cc3859216965338971ece92d5386a972e6460c4ea0f3267b9acf4d4d47c8f563625c3f6a05e6d919312692945a28d44ada0408a8a4a0f157cf2e66744bb885c90b96b0ac50f45677262671224a4f754b1693930545b0a024db528d804e437bcbd74c6478d09fdcd95104bed7a110c01d89d4b24c283caea0f7ddca48dbfc34175322b37e35be0e10b7e8f0cf4b0f3c0c64ca4cc7409558a7a0fc03b71345f0f7c2c784b3e9bb8793c8358553eaa9811943af4b7e1ab827d64ca09db546d194941254910642424ed644cc13d27862d797faec1c73d72d4d1aff38a07ad68175fa8ccebae05aca2ac077b98f8906dfe1c01a526060d45948794badeba0383a06be4451de334f19162fd2f2b3a01ccaa318f0b19f6053c7f6274702a92ea0c92e0b54e5c7e5f6f18e0aa9762e09e911f0f519654b945103d517154125e695a0dcf537bda42520ce6670c2f3fb546ea12d28518f06310da26a9df887a1fc2a4880", + "0xf90131a02fc4b4a237a100d29804e54134a3f590fe14cfc5932cf0d7db7d10b7c19359a580a07fb3394fdb1dc6cb6ee6bf74e16772783361840df5878b10284ef41f457a9cdda0b5d3f9bd4f88da36a3fbb68526053d7394f35411433bd88799510ce8a51e08dea0700e6a715dd6d428d31cbc9543cf768212e07692a79bd560e56d4f9547f3b6fb8080a0b295e4bf173f6a21ab742c03976070c3ba873b5fe457831de8411bf5ca988d08a057c069ca8e65fea0a889e16e770a7cc4f3125a35820deb3f0e6f8ae22e08d2eba0781511eba2101b49120073b03e24e79a3cdb0a02ee2d948e05a99a8b3b4145a4a011504843006186cba62c7f5563b3aee69c9f0325d6aadddc4c7c5ea246e50772a0ec6a3ac8944ef87fd684400258ef36a89194599884b606b032bedb29f42bcd008080808080", + "0xf8729e31610ff568919eaebec883afe43d94f9558d9c666ca54b3d3bfef2311d37b851f84f0c8b034f248d17939c513a7e80a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + ], + balance: "0x34f248d17939c513a7e80", + codeHash: "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + nonce: "0xc", + storageHash: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + storageProof: [], + }; + + await expect( + isValidAccount({ + proof, + address, + stateRoot, + }) + ).rejectedWith("Invalid proof provided"); + }); + }); + + describe("isValidStorageKeys", () => { + it("should return true if storage keys are valid", async () => { + const proof: ELStorageProof = { + storageHash: "0x1b6a3261a5285e7d20f74f6f86134c894d395e39e15993eb4fad87a40f6af5e4", + storageProof: [ + { + key: "0xa934b07068f5d95a11413ed6d08a4a1122dc4b8c14a6ab2d94f8b279dac63042", + value: "0x0", + proof: [ + "0xf90211a035f929f33e4ff13e3c7a0f0cc1df0fd87ed58ac8a819091a0a1c05bb2f0cfc52a0d0ec64fd9c5883b3df24861cca332e437968ee38d98ec88670d09a235e94fd7aa0fcc64807aa553ac5e7e7ed716f5fb30b2af33a5e3e91ca60d7a5f2aa0dd6b0eca0edfd8d0f1559f25e5005ab9c2587f747a20e921145dc2cb276f717580ef49218a06066949aba34a1cdbc27e2a2de9f2673dd67a97729cadb8fd9e0be6bb8505e6da00023406388cbba918bd64aa14d6d1550f457aaaf212975d9ffa4a619363d8706a05b310a0ebf7270ef604b1f1c10f8e27dc1fc51b535715e3215f1ee04b47fe71ba01d1c1727fb02071b7350e1705cfcd88936d0465e4e075724e10cc6b0f1b18ef9a045e7acbb3d9f3a9886bad2befcebbc92ea7e338565ac76be3768e8da5bdbbf58a0d76ea3d82a08c5b565c7d6dffd7b9a8559006e8af04a264e8ae9c79ce729c3a7a0f1a8ba3190c4636f9570501509db1d209d8ac650b070a6a2ee973339b53efacca0e7c5ad879837168fd39cb45c986bffd8d3c99e487685213fef9fc54d06770e04a00556a20c4e9a24f2467ac80045c5d4c0671a2e79f9d475f12317119267b560f3a0c159b311bef30ab466930a3694c6ccc9ecf728332fb039aec3e49795f0469befa0ec31caaaa48bba20bbcf1c5b953ec47b491cd5c6903640e4102ce54613db19baa09e76eadd4788600b5b37b9dfb2e355802ac75ce65de5fb87e4d930974e5d3e2180", + "0xf90211a0a7af35500f30484963b3168c62d7a86299e02b5cd0b698a541fc75a637611a80a0eaa57f45d3864fd735614b8c3de99875e8537e3d957b8647cbadcfe503965128a07caa21a62ef79a3cb87cb922cc267d5675d2dfed0487edc35d888846f63cf5e8a05179f38e0b309df3cca585eccb07a2df7d158eecb1dcde8792db7d99af6658e4a0fcf8de500c8c8659a762438d35c8a24e535a4f6156ef55095f2c9682eda15115a0542184034e298de70cad346481b45a38b8c4a68b01d864d3bc753c37cad8922ba0efb0e25dce2f783c3ed699971ffed4397250c1f8947c93902215e0c4d4284812a016a20023cf42f458b9207aaf3864266953dde6718f07837104ab19231c331af6a08ac356f497d61d607c566be1c85bd331b7a192d4bf4fd579b3b08b97e69b0c90a004e200625b0f83e93b8225f044090fc899957964dcccda7a62b54e1a8d5e6a79a0bdaa3c3b540ceb4faefd4415196fb9f997cbf7f6c0e3e5c4c0cb881dcbdbfb5ba0124e452071958a977fd7606712ed22f0b814f8d0e46f6e161a74d449c328bafaa077caef292e5b69ba5dd1779ac56b58c6a0410ae0bc3463ca964c281b99ae624ba05b2cc97bc76ec70df7de2d470a36d299dda926c64d6886e574911e8f7c8b2b42a0626fbd444bbee61a5bd65703d9f3b60a17faeedc48e74308f76130142b3b5471a0f9c47f1313d03542e8e845d0f1f03a84d5bf1bd8ec209b73b0570fff7764ce3b80", + "0xf90211a0003d99fbd5ed6a3c36b3a94a7676f94e7320eb29f664d66350cef4e87e71d0a6a0e40b6e4d13bc2e79a1842c0459506e8d1eaf23c2abe6da8b652e9ac79887819ba082e41d8c0a86d81f229743c97ba23d0cfdcb348dc410a4d199c22b43954dc061a0ade1a10055a1b8dc66eb1d0b3f66533440f003a4b30435090cc737ccda7077c3a0a0391531281ea5fcfad3ac057627c3e5a7b26d8178fa3290db3d4bfeed426b17a0a18d4ea1516b9ce01b66a926e03cd545faef205594a9ab09ff181e4062900425a0aa0f007dc836777093c7a156c0a897b14b0cf31bbec89aea65df86f67e2a09c2a03973162b1b6133f91d10a420fb38d339f51f5b8e650d43a9644f82c17747b6f7a0429b1a67530253c5ef6d90799cefceea90d7623e7dc666d0611364feec413d40a0f5f898635d366ab1e1cc762044dc128879632b3463859a3b25e83796cf1c9bcda060ae20f12695ddcf0dcbf8c197314960faaf2b8a4a5d2ecb9a2c449d9dccd880a032b52c3864ece34069e471bd44057e066c80696db9755c1df264ce86c6aa9ee1a032b7170ee13afc61011dfad9d0df2c07dea31a3c316f6af67b94f00f044e1c7fa0ca5e38fbc4de6dad4903623374f29d92ea5ed65551f606f0f28261b0c773160fa009d43e3e4c62b2e15d7dd43ae54a2fc8708d24cd2cec9eafd69141a0d872f64aa03724b18354a914bd8d51cf2314d7c24f43319ab481ca16f49e70e77d74cbb51a80", + "0xf90211a048fdea9831823100a1666ec3f96d5a00d2f37a8a868a747e68021d88670290eca04646b8016c0e7af43ad1c940b3a5712f1c6ac58fbda60bde92b6016e931177f3a0b6b0831b8cf22b5174aa27fd4c544bcc0871bb168608d295cbd9b7f8d1ca079ba02801d39deb1c357535be4d33faaf8de67427e9811618fe479a24e76fe4811d12a0a8cf036b716b82b1fa92913d96d9c6a241b50b38bc8cae5ab9372b7a9fa3dfcea0377aba70aacf837b1e564f4b43e46176efcdd903f4cec79a537638513afaafe0a06e0d9903116d936bc8f961885433c183d1d4bc3508a60289cf05ad1b60f7f5e6a077875df7cc2ad0f68179dde7e0f6368febd10910ed53d21d00e0fcc507371342a07c511ff39ef9256b52e15888b132139226e1b2e224ae23e38df76b4d06a95544a0ca56d3fec4ca10d7cf0a5c0aabab6817e035e9659b7778d9a88a5dae4722db12a08f8c8c721d135838e16dbd50c4712841dd470088c244f509752bcff920253364a082ece15a206f20af75cf7242bc86e1bed19f54b19b6033d38b841bd896fd1933a0680e28a5de96750595091a9dd272aa9ff14ba945e146d179325267b7bf6f6508a081fe9eb2ce69e888a70a56d72568eb0e4891af7f20d4dd8f612280d0ca23cf40a0fa411cb7b0ec0a8f66bbd8253482161c7d01afed481a2777bf24793f36f71b22a027005997273df6d06aea5ad7de32f03713b0b482e805f9fcd83afd8c59d8848580", + "0xf90211a02747d543c8a3410efd989fa588c47d2507c9861bdec29574d4854653f6fc3ea6a072d4a756f1068e020f8f92bba67e0138bca21f12f6aca57dfdc2cc8a3d5e879aa063943cd42f578736b6298145ec83caa1d754a1088a188fae7cf4f47c61db4b10a08f71f34254ecc5537cc20a2f4a0f2af820a1dcca58dd3591e734eb53def4e67fa09f3f6123a8eb258afed0dd8975dab70f18e272e891a991c8df9822c8d0db20e5a089dcf67f4dad3b2d9cdb2bae92e6c00ec513e550f676b5810c25a98965307f02a0309d0894cf155124874ae733160c8dde21ea7edb97dd73e1bab37975933c4e83a0849e9985e2a24b8dc933ea58a6fde011c3860a1b246d372d47171cf54e1b2cf0a08f4d56cdabf06696c2ecf01a18c1df56897bc917e87d5372789d579801db445ea0f51d5ce538ee11f8d47b3734341b21d10503ce1252eab6d19cb3b153c5ff6f8ba0ede4a747adc81cea257ae5e7e9b3cbb32f5e10d146c78e9220ace7971ee147f4a0e20ab73cad6db6a50ef9db3905cfb48e332641f68e6cad00c7b4355c6bd20b7aa0c592be83fa9438fc7badb7cac1d852a54b0c730919ecb61ea39453f6958c1260a08bfccb533b082b21c4f3c0309eaca036037bd92ccfccfab95a1e14090862c8d1a091eb455f1fab1864a4fafc77d01887549131084fd8e9256fe506b556d873d4c3a0e442ec67b6d98eb50d369580dadcfe8e824f9cfa4f029269d2838137b3c614c080", + "0xf87180808080a08b5c90a6d4b6e4e89f1c192579185789fc3ffc6f8a17dac49c3053865934fca0808080a006c198dc3c6142b298108fee66b5688269b86a4a30429c43e53355699a765dda8080a007c901ff1e048505f63dbfb895b6a85403ff1b921066e12bfbc3878f803e909c8080808080", + ], + }, + ], + }; + const storageKeys = ["0xa934b07068f5d95a11413ed6d08a4a1122dc4b8c14a6ab2d94f8b279dac63042"]; + + await expect( + isValidStorageKeys({ + proof, + storageKeys, + }) + ).eventually.to.be.true; + }); + + it("should fail with error for a wrong proof", async () => { + const proof: ELStorageProof = { + storageHash: "0x1b6a3261a5285e7d20f74f6f86134c894d395e39e15993eb4fad87a40f6af5e4", + storageProof: [ + { + key: "0xa934b07068f5d95a11413ed6d08a4a1122dc4b8c14a6ab2d94f8b279dac63042", + value: "0x0", + proof: [ + "0xe90211a035f929f33e4ff13e3c7a0f0cc1df0fd87ed58ac8a819091a0a1c05bb2f0cfc52a0d0ec64fd9c5883b3df24861cca332e437968ee38d98ec88670d09a235e94fd7aa0fcc64807aa553ac5e7e7ed716f5fb30b2af33a5e3e91ca60d7a5f2aa0dd6b0eca0edfd8d0f1559f25e5005ab9c2587f747a20e921145dc2cb276f717580ef49218a06066949aba34a1cdbc27e2a2de9f2673dd67a97729cadb8fd9e0be6bb8505e6da00023406388cbba918bd64aa14d6d1550f457aaaf212975d9ffa4a619363d8706a05b310a0ebf7270ef604b1f1c10f8e27dc1fc51b535715e3215f1ee04b47fe71ba01d1c1727fb02071b7350e1705cfcd88936d0465e4e075724e10cc6b0f1b18ef9a045e7acbb3d9f3a9886bad2befcebbc92ea7e338565ac76be3768e8da5bdbbf58a0d76ea3d82a08c5b565c7d6dffd7b9a8559006e8af04a264e8ae9c79ce729c3a7a0f1a8ba3190c4636f9570501509db1d209d8ac650b070a6a2ee973339b53efacca0e7c5ad879837168fd39cb45c986bffd8d3c99e487685213fef9fc54d06770e04a00556a20c4e9a24f2467ac80045c5d4c0671a2e79f9d475f12317119267b560f3a0c159b311bef30ab466930a3694c6ccc9ecf728332fb039aec3e49795f0469befa0ec31caaaa48bba20bbcf1c5b953ec47b491cd5c6903640e4102ce54613db19baa09e76eadd4788600b5b37b9dfb2e355802ac75ce65de5fb87e4d930974e5d3e2180", + "0xf90211a0a7af35500f30484963b3168c62d7a86299e02b5cd0b698a541fc75a637611a80a0eaa57f45d3864fd735614b8c3de99875e8537e3d957b8647cbadcfe503965128a07caa21a62ef79a3cb87cb922cc267d5675d2dfed0487edc35d888846f63cf5e8a05179f38e0b309df3cca585eccb07a2df7d158eecb1dcde8792db7d99af6658e4a0fcf8de500c8c8659a762438d35c8a24e535a4f6156ef55095f2c9682eda15115a0542184034e298de70cad346481b45a38b8c4a68b01d864d3bc753c37cad8922ba0efb0e25dce2f783c3ed699971ffed4397250c1f8947c93902215e0c4d4284812a016a20023cf42f458b9207aaf3864266953dde6718f07837104ab19231c331af6a08ac356f497d61d607c566be1c85bd331b7a192d4bf4fd579b3b08b97e69b0c90a004e200625b0f83e93b8225f044090fc899957964dcccda7a62b54e1a8d5e6a79a0bdaa3c3b540ceb4faefd4415196fb9f997cbf7f6c0e3e5c4c0cb881dcbdbfb5ba0124e452071958a977fd7606712ed22f0b814f8d0e46f6e161a74d449c328bafaa077caef292e5b69ba5dd1779ac56b58c6a0410ae0bc3463ca964c281b99ae624ba05b2cc97bc76ec70df7de2d470a36d299dda926c64d6886e574911e8f7c8b2b42a0626fbd444bbee61a5bd65703d9f3b60a17faeedc48e74308f76130142b3b5471a0f9c47f1313d03542e8e845d0f1f03a84d5bf1bd8ec209b73b0570fff7764ce3b80", + "0xf90211a0003d99fbd5ed6a3c36b3a94a7676f94e7320eb29f664d66350cef4e87e71d0a6a0e40b6e4d13bc2e79a1842c0459506e8d1eaf23c2abe6da8b652e9ac79887819ba082e41d8c0a86d81f229743c97ba23d0cfdcb348dc410a4d199c22b43954dc061a0ade1a10055a1b8dc66eb1d0b3f66533440f003a4b30435090cc737ccda7077c3a0a0391531281ea5fcfad3ac057627c3e5a7b26d8178fa3290db3d4bfeed426b17a0a18d4ea1516b9ce01b66a926e03cd545faef205594a9ab09ff181e4062900425a0aa0f007dc836777093c7a156c0a897b14b0cf31bbec89aea65df86f67e2a09c2a03973162b1b6133f91d10a420fb38d339f51f5b8e650d43a9644f82c17747b6f7a0429b1a67530253c5ef6d90799cefceea90d7623e7dc666d0611364feec413d40a0f5f898635d366ab1e1cc762044dc128879632b3463859a3b25e83796cf1c9bcda060ae20f12695ddcf0dcbf8c197314960faaf2b8a4a5d2ecb9a2c449d9dccd880a032b52c3864ece34069e471bd44057e066c80696db9755c1df264ce86c6aa9ee1a032b7170ee13afc61011dfad9d0df2c07dea31a3c316f6af67b94f00f044e1c7fa0ca5e38fbc4de6dad4903623374f29d92ea5ed65551f606f0f28261b0c773160fa009d43e3e4c62b2e15d7dd43ae54a2fc8708d24cd2cec9eafd69141a0d872f64aa03724b18354a914bd8d51cf2314d7c24f43319ab481ca16f49e70e77d74cbb51a80", + "0xf90211a048fdea9831823100a1666ec3f96d5a00d2f37a8a868a747e68021d88670290eca04646b8016c0e7af43ad1c940b3a5712f1c6ac58fbda60bde92b6016e931177f3a0b6b0831b8cf22b5174aa27fd4c544bcc0871bb168608d295cbd9b7f8d1ca079ba02801d39deb1c357535be4d33faaf8de67427e9811618fe479a24e76fe4811d12a0a8cf036b716b82b1fa92913d96d9c6a241b50b38bc8cae5ab9372b7a9fa3dfcea0377aba70aacf837b1e564f4b43e46176efcdd903f4cec79a537638513afaafe0a06e0d9903116d936bc8f961885433c183d1d4bc3508a60289cf05ad1b60f7f5e6a077875df7cc2ad0f68179dde7e0f6368febd10910ed53d21d00e0fcc507371342a07c511ff39ef9256b52e15888b132139226e1b2e224ae23e38df76b4d06a95544a0ca56d3fec4ca10d7cf0a5c0aabab6817e035e9659b7778d9a88a5dae4722db12a08f8c8c721d135838e16dbd50c4712841dd470088c244f509752bcff920253364a082ece15a206f20af75cf7242bc86e1bed19f54b19b6033d38b841bd896fd1933a0680e28a5de96750595091a9dd272aa9ff14ba945e146d179325267b7bf6f6508a081fe9eb2ce69e888a70a56d72568eb0e4891af7f20d4dd8f612280d0ca23cf40a0fa411cb7b0ec0a8f66bbd8253482161c7d01afed481a2777bf24793f36f71b22a027005997273df6d06aea5ad7de32f03713b0b482e805f9fcd83afd8c59d8848580", + "0xf90211a02747d543c8a3410efd989fa588c47d2507c9861bdec29574d4854653f6fc3ea6a072d4a756f1068e020f8f92bba67e0138bca21f12f6aca57dfdc2cc8a3d5e879aa063943cd42f578736b6298145ec83caa1d754a1088a188fae7cf4f47c61db4b10a08f71f34254ecc5537cc20a2f4a0f2af820a1dcca58dd3591e734eb53def4e67fa09f3f6123a8eb258afed0dd8975dab70f18e272e891a991c8df9822c8d0db20e5a089dcf67f4dad3b2d9cdb2bae92e6c00ec513e550f676b5810c25a98965307f02a0309d0894cf155124874ae733160c8dde21ea7edb97dd73e1bab37975933c4e83a0849e9985e2a24b8dc933ea58a6fde011c3860a1b246d372d47171cf54e1b2cf0a08f4d56cdabf06696c2ecf01a18c1df56897bc917e87d5372789d579801db445ea0f51d5ce538ee11f8d47b3734341b21d10503ce1252eab6d19cb3b153c5ff6f8ba0ede4a747adc81cea257ae5e7e9b3cbb32f5e10d146c78e9220ace7971ee147f4a0e20ab73cad6db6a50ef9db3905cfb48e332641f68e6cad00c7b4355c6bd20b7aa0c592be83fa9438fc7badb7cac1d852a54b0c730919ecb61ea39453f6958c1260a08bfccb533b082b21c4f3c0309eaca036037bd92ccfccfab95a1e14090862c8d1a091eb455f1fab1864a4fafc77d01887549131084fd8e9256fe506b556d873d4c3a0e442ec67b6d98eb50d369580dadcfe8e824f9cfa4f029269d2838137b3c614c080", + "0xf87180808080a08b5c90a6d4b6e4e89f1c192579185789fc3ffc6f8a17dac49c3053865934fca0808080a006c198dc3c6142b298108fee66b5688269b86a4a30429c43e53355699a765dda8080a007c901ff1e048505f63dbfb895b6a85403ff1b921066e12bfbc3878f803e909c8080808080", + ], + }, + ], + }; + const storageKeys = ["0xa934b07068f5d95a11413ed6d08a4a1122dc4b8c14a6ab2d94f8b279dac63042"]; + + await expect( + isValidStorageKeys({ + proof, + storageKeys, + }) + ).rejectedWith("Invalid proof provided"); + }); + + it("should fail with error for a non existance key", async () => { + const proof: ELStorageProof = { + storageHash: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + storageProof: [ + { + key: "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + value: "0x0", + proof: [], + }, + ], + }; + const storageKeys = ["0xa934b07068f5d95a11413ed6d08a4a1122dc4b8c14a6ab2d94f8b279dac63042"]; + + await expect( + isValidStorageKeys({ + proof, + storageKeys, + }) + ).rejectedWith("Invalid proof provided"); + }); + + it("should return true empty keys", async () => { + const proof: ELStorageProof = { + storageHash: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + storageProof: [], + }; + const storageKeys: string[] = []; + + await expect( + isValidStorageKeys({ + proof, + storageKeys, + }) + ).eventually.to.be.true; + }); + }); +}); diff --git a/packages/prover/test/unit/web3_provider.test.ts b/packages/prover/test/unit/web3_provider.test.ts new file mode 100644 index 0000000000..babfcebf6a --- /dev/null +++ b/packages/prover/test/unit/web3_provider.test.ts @@ -0,0 +1,42 @@ +import {expect} from "chai"; +import Web3 from "web3"; +import {ethers} from "ethers"; +import {LCTransport} from "../../src/interfaces.js"; +import {ProofProvider} from "../../src/proof_provider/proof_provider.js"; +import {createVerifiedExecutionProvider} from "../../src/web3_provider.js"; + +describe("web3_provider", () => { + describe("createVerifiedExecutionProvider", () => { + describe("web3", () => { + it("should create a verified execution provider for the web3 provider", () => { + const {provider, proofProvider} = createVerifiedExecutionProvider( + new Web3.providers.HttpProvider("https://lodestar-sepoliarpc.chainsafe.io"), + { + transport: LCTransport.Rest, + urls: ["https://lodestar-sepolia.chainsafe.io"], + network: "sepolia", + } + ); + + expect(provider).be.instanceof(Web3.providers.HttpProvider); + expect(proofProvider).be.instanceOf(ProofProvider); + }); + }); + + describe("ethers", () => { + it("should create a verified execution provider for the ethers provider", () => { + const {provider, proofProvider} = createVerifiedExecutionProvider( + new ethers.JsonRpcProvider("https://lodestar-sepoliarpc.chainsafe.io"), + { + transport: LCTransport.Rest, + urls: ["https://lodestar-sepolia.chainsafe.io"], + network: "sepolia", + } + ); + + expect(provider).be.instanceof(ethers.JsonRpcProvider); + expect(proofProvider).be.instanceOf(ProofProvider); + }); + }); + }); +}); diff --git a/packages/prover/tsconfig.build.json b/packages/prover/tsconfig.build.json new file mode 100644 index 0000000000..ded7401728 --- /dev/null +++ b/packages/prover/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.build.json", + "include": ["src"], + "compilerOptions": { + "outDir": "lib", + // Had to add it because compiling error `Duplicate identifier 'Buffer'` + "skipLibCheck": true + } +} diff --git a/packages/prover/tsconfig.json b/packages/prover/tsconfig.json new file mode 100644 index 0000000000..ea7688c57a --- /dev/null +++ b/packages/prover/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + // To fix error "Duplicate identifier 'Buffer'" + // This can save time during compilation at the expense of type-system accuracy. + // For example, two libraries could define two copies of the same type in an inconsistent way. + // Rather than doing a full check of all d.ts files, TypeScript will type check + // the code you specifically refer to in your app’s source code. + // https://www.typescriptlang.org/tsconfig#skipLibCheck + "skipLibCheck": true + } +} diff --git a/packages/prover/webpack.test.config.cjs b/packages/prover/webpack.test.config.cjs new file mode 100644 index 0000000000..711c6ac891 --- /dev/null +++ b/packages/prover/webpack.test.config.cjs @@ -0,0 +1,5 @@ +const webpackConfig = require("../../webpack.test.config.js"); + +module.exports = { + ...webpackConfig, +}; diff --git a/yarn.lock b/yarn.lock index 7c0f4d0aae..508f4194a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -92,6 +92,11 @@ resolved "https://registry.npmjs.org/@actions/io/-/io-1.1.1.tgz" integrity sha512-Qi4JoKXjmE0O67wAOH6y0n26QXhMKMFo7GD/4IXNVcrtLjUlGjGuVys6pQgwF3ArfGTQu0XpqaNr0YhED2RaRA== +"@adraffy/ens-normalize@1.8.9": + version "1.8.9" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.8.9.tgz#67b3acadebbb551669c9a1da15fac951db795b85" + integrity sha512-93OmGCV0vO8+JQ3FHG+gZk/MPHzzMPDRiCiFcCQNTCnHaaxsacO3ScTPGlu2wX2dOtgfalbchPcw1cOYYjHCYQ== + "@azure/abort-controller@^1.0.0": version "1.0.4" resolved "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.4.tgz" @@ -579,6 +584,13 @@ uint8arraylist "^2.3.2" uint8arrays "^4.0.2" +"@chainsafe/persistent-merkle-tree@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" + integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" @@ -603,6 +615,15 @@ buffer-from "^1.1.1" snappy "^6.3.5" +"@chainsafe/ssz@0.9.4": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" + integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.4.2" + case "^1.6.3" + "@chainsafe/ssz@^0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.1.tgz#c05ec168a3c7de1e6b72eac170afbe497ffca329" @@ -688,6 +709,55 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@ethereumjs/common@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" + integrity sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.1" + +"@ethereumjs/common@^2.5.0": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" + integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.5" + +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/trie@^5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@ethereumjs/trie/-/trie-5.0.4.tgz#eb06ce2c7957f6a8f07c0db43fb0335b256f3705" + integrity sha512-ycYtAF7BJAu9eaCtrEX+efE5xEQEfItRXXHBcTSMHsF7NfLHcniI0S7KUVYXbJ6imczBmnMHeggCqv8PYQbbOw== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + "@ethereumjs/util" "^8.0.5" + "@types/readable-stream" "^2.3.13" + ethereum-cryptography "^1.1.2" + readable-stream "^3.6.0" + +"@ethereumjs/tx@3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.2.tgz#348d4624bf248aaab6c44fec2ae67265efe3db00" + integrity sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog== + dependencies: + "@ethereumjs/common" "^2.5.0" + ethereumjs-util "^7.1.2" + +"@ethereumjs/util@^8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.0.5.tgz#b9088fc687cc13f0c1243d6133d145dfcf3fe446" + integrity sha512-259rXKK3b3D8HRVdRmlOEi6QFvwxdt304hhrEAmpZhsj7ufXEOTIc9JRZPMnXatKjECokdLNBcDOFBeBSzAIaw== + dependencies: + "@chainsafe/ssz" "0.9.4" + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^1.1.2" + "@ethersproject/abi@5.1.2", "@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.1.0": version "5.1.2" resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.1.2.tgz" @@ -703,6 +773,21 @@ "@ethersproject/properties" "^5.1.0" "@ethersproject/strings" "^5.1.0" +"@ethersproject/abi@^5.6.3": + 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.1.0", "@ethersproject/abstract-provider@^5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.1.0.tgz" @@ -716,6 +801,19 @@ "@ethersproject/transactions" "^5.1.0" "@ethersproject/web" "^5.1.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.1.0", "@ethersproject/abstract-signer@^5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.1.0.tgz" @@ -727,6 +825,17 @@ "@ethersproject/logger" "^5.1.0" "@ethersproject/properties" "^5.1.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.1.0", "@ethersproject/address@^5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.1.0.tgz" @@ -738,6 +847,17 @@ "@ethersproject/logger" "^5.1.0" "@ethersproject/rlp" "^5.1.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.1.0", "@ethersproject/base64@^5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.1.0.tgz" @@ -745,6 +865,13 @@ dependencies: "@ethersproject/bytes" "^5.1.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.1.0", "@ethersproject/basex@^5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.1.0.tgz" @@ -762,6 +889,15 @@ "@ethersproject/logger" "^5.1.0" bn.js "^4.4.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.1.0", "@ethersproject/bytes@^5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.1.0.tgz" @@ -769,6 +905,13 @@ dependencies: "@ethersproject/logger" "^5.1.0" +"@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.1.0", "@ethersproject/constants@^5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.1.0.tgz" @@ -776,6 +919,13 @@ dependencies: "@ethersproject/bignumber" "^5.1.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.1.1": version "5.1.1" resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.1.1.tgz" @@ -806,6 +956,21 @@ "@ethersproject/properties" "^5.1.0" "@ethersproject/strings" "^5.1.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/hdnode@5.1.0", "@ethersproject/hdnode@^5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.1.0.tgz" @@ -851,11 +1016,24 @@ "@ethersproject/bytes" "^5.1.0" js-sha3 "0.5.7" +"@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.1.0", "@ethersproject/logger@^5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.1.0.tgz" integrity sha512-wtUaD1lBX10HBXjjKV9VHCBnTdUaKQnQ2XSET1ezglqLdPdllNOIlLfhyCRqXm5xwcjExVI5ETokOYfjPtaAlw== +"@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.1.0", "@ethersproject/networks@^5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.1.0.tgz" @@ -863,6 +1041,13 @@ dependencies: "@ethersproject/logger" "^5.1.0" +"@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/pbkdf2@5.1.0", "@ethersproject/pbkdf2@^5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.1.0.tgz" @@ -878,6 +1063,13 @@ dependencies: "@ethersproject/logger" "^5.1.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.1.2": version "5.1.2" resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.1.2.tgz" @@ -919,6 +1111,14 @@ "@ethersproject/bytes" "^5.1.0" "@ethersproject/logger" "^5.1.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.1.0", "@ethersproject/sha2@^5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.1.0.tgz" @@ -939,6 +1139,18 @@ bn.js "^4.4.0" elliptic "6.5.4" +"@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/solidity@5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.1.0.tgz" @@ -959,6 +1171,15 @@ "@ethersproject/constants" "^5.1.0" "@ethersproject/logger" "^5.1.0" +"@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.1.1", "@ethersproject/transactions@^5.1.0": version "5.1.1" resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.1.1.tgz" @@ -974,6 +1195,21 @@ "@ethersproject/rlp" "^5.1.0" "@ethersproject/signing-key" "^5.1.0" +"@ethersproject/transactions@^5.6.2", "@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/units@5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.1.0.tgz" @@ -1015,6 +1251,17 @@ "@ethersproject/properties" "^5.1.0" "@ethersproject/strings" "^5.1.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" + "@ethersproject/wordlists@5.1.0", "@ethersproject/wordlists@^5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.1.0.tgz" @@ -2308,11 +2555,26 @@ resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.6.0.tgz#b55f7c9e532b478bf1d7c4f609e1f3a37850b583" integrity sha512-UKju89WV37IUALIMfKhKW3psO8AqmrE/GvH6QbPKjzolQ98zM7WmGUeY+xdIgSf5tqPFf75ZCYMgym6E9Jsw3Q== +"@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/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + "@noble/hashes@^1.0.0", "@noble/hashes@~1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.0.0.tgz" integrity sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg== +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + "@noble/secp256k1@^1.5.4": version "1.6.0" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.0.tgz#602afbbfcfb7e169210469b697365ef740d7e930" @@ -2867,6 +3129,28 @@ resolved "https://registry.npmjs.org/@scure/base/-/base-1.0.0.tgz" integrity sha512-gIVaYhUsy+9s58m/ETjSJVKHhKTBMmcRb9cEV5/5dwvfDlfORjKrFsDeDHWRrm6RjcPvCLZFwGJjAjLj1gg4HA== +"@scure/base@~1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" + integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== + +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== + dependencies: + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + "@scure/bip39@^1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.0.0.tgz" @@ -2880,7 +3164,7 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@sindresorhus/is@^4.6.0": +"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": version "4.6.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== @@ -3036,6 +3320,13 @@ dependencies: defer-to-connect "^1.0.1" +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + "@szmarczak/http-timer@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" @@ -3100,6 +3391,13 @@ "@types/node" "*" "@types/readable-stream" "*" +"@types/bn.js@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== + dependencies: + "@types/node" "*" + "@types/buffer-xor@^2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/@types/buffer-xor/-/buffer-xor-2.0.0.tgz" @@ -3107,6 +3405,16 @@ dependencies: "@types/node" "*" +"@types/cacheable-request@^6.0.1": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + "@types/cacheable-request@^6.0.2": version "6.0.2" resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" @@ -3242,6 +3550,13 @@ resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz" integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== +"@types/http-proxy@^1.17.10": + version "1.17.10" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.10.tgz#e576c8e4a0cc5c6a138819025a88e167ebb38d6c" + integrity sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g== + dependencies: + "@types/node" "*" + "@types/inquirer@^8.2.3": version "8.2.5" resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-8.2.5.tgz#c508423bcc11126db278170ab07347783ac2300c" @@ -3276,6 +3591,13 @@ dependencies: "@types/node" "*" +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" + "@types/level-errors@*": version "3.0.0" resolved "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz" @@ -3374,6 +3696,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.22.tgz#76f7401362ad63d9d7eefa7dcdfa5fcd9baddff3" integrity sha512-TsmoXYd4zrkkKjJB0URF/mTIKPl+kVcbqClB2F/ykU7vil1BfWZVndOnpEIozPv4fURD28gyPFeIkW2G+KXOvw== +"@types/node@^12.12.6": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + "@types/node@^16.11.26": version "16.11.45" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.45.tgz#155b13a33c665ef2b136f7f245fa525da419e810" @@ -3419,6 +3746,14 @@ "@types/node" "*" safe-buffer "*" +"@types/readable-stream@^2.3.13": + version "2.3.15" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" + integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== + dependencies: + "@types/node" "*" + safe-buffer "~5.1.1" + "@types/responselike@*", "@types/responselike@^1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz" @@ -3845,6 +4180,11 @@ abortable-iterator@^4.0.2: get-iterator "^2.0.0" it-stream-types "^1.0.3" +abortcontroller-polyfill@^1.7.3: + version "1.7.5" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" + integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== + abstract-level@^1.0.2, abstract-level@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" @@ -3875,7 +4215,7 @@ abstract-logging@^2.0.0: resolved "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz" integrity sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA== -accepts@~1.3.4: +accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -3918,6 +4258,11 @@ aes-js@3.0.0: resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= +aes-js@4.0.0-beta.3: + version "4.0.0-beta.3" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.3.tgz#da2253f0ff03a0b3a9e445c8cbdf78e7fda7d48c" + integrity sha512-/xJX0/VTPcbc5xQE2VUP91y1xN8q/rDfhEzLm+vLc3hYvb5+qHCnpJRuFcrKn63zumK/sCwYYzhG8HP78JYSTA== + agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" @@ -3967,7 +4312,7 @@ ajv@^6.12.2: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.12.4, ajv@^6.12.5, ajv@^6.12.6: +ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.12.6: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -4158,6 +4503,11 @@ array-filter@^1.0.0: resolved "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz" integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" @@ -4214,13 +4564,18 @@ asn1.js@^5.2.0: minimalistic-assert "^1.0.0" safer-buffer "^2.1.0" -asn1@^0.2.4: +asn1@^0.2.4, asn1@~0.2.3: version "0.2.6" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + assert@^1.1.1: version "1.5.0" resolved "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz" @@ -4244,6 +4599,11 @@ assertion-error@^1.1.0: resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + async-retry@^1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz" @@ -4303,6 +4663,16 @@ aws-sdk@^2.932.0: uuid "3.3.2" xml2js "0.4.19" +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + axios@^0.21.0: version "0.21.2" resolved "https://registry.npmjs.org/axios/-/axios-0.21.2.tgz" @@ -4330,6 +4700,13 @@ base-x@^3.0.2: dependencies: safe-buffer "^5.0.1" +base-x@^3.0.8: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" @@ -4345,7 +4722,7 @@ base64url@^3.0.1: resolved "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz" integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== -bcrypt-pbkdf@^1.0.2: +bcrypt-pbkdf@^1.0.0, bcrypt-pbkdf@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= @@ -4385,6 +4762,11 @@ bigint-buffer@^1.1.5: dependencies: bindings "^1.3.0" +bignumber.js@^9.0.0: + version "9.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== + bin-links@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-3.0.3.tgz#3842711ef3db2cd9f16a5f404a996a12db355a6e" @@ -4451,7 +4833,17 @@ bls-eth-wasm@^0.4.8: resolved "https://registry.npmjs.org/bls-eth-wasm/-/bls-eth-wasm-0.4.8.tgz" integrity sha512-ye7+G6KFLb3i9xSrLASAoYqOUK5WLB6XA5DD8Sh0UQpZ3T999ylsYbFdoOJpmvTDuBuMi23Vy8Jm0pn/GF01CA== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.1, bn.js@^4.11.9, bn.js@^4.4.0: +bluebird@^3.5.0: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.9, bn.js@^4.4.0: version "4.12.0" resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -4461,6 +4853,47 @@ bn.js@^5.0.0, bn.js@^5.1.1: resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== +bn.js@^5.1.2, bn.js@^5.2.0, 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== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + 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" + +body-parser@^1.16.0: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + 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.2" + type-is "~1.6.18" + unpipe "1.0.0" + body-parser@^1.19.0: version "1.20.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" @@ -4651,6 +5084,11 @@ buffer-from@^1.1.1: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer-to-arraybuffer@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" + integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ== + buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" @@ -4672,7 +5110,7 @@ buffer@4.9.2, buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.4.3, buffer@^5.5.0: +buffer@^5.0.5, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -4688,6 +5126,13 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" +bufferutil@^4.0.1: + version "4.0.7" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" + integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== + dependencies: + node-gyp-build "^4.3.0" + bufio@~1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/bufio/-/bufio-1.0.7.tgz" @@ -4816,6 +5261,11 @@ cacache@^16.1.0: tar "^6.1.11" unique-filename "^1.1.1" +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + cacheable-lookup@^6.0.4: version "6.0.4" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-6.0.4.tgz#65c0e51721bb7f9f2cb513aed6da4a1b93ad7dc8" @@ -4899,6 +5349,11 @@ case@^1.6.3: resolved "https://registry.npmjs.org/case/-/case-1.6.3.tgz" integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + catering@^2.0.0, catering@^2.1.0, catering@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" @@ -5002,6 +5457,17 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +cids@^0.7.1: + version "0.7.5" + resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" + integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== + dependencies: + buffer "^5.5.0" + class-is "^1.1.0" + multibase "~0.6.0" + multicodec "^1.0.0" + multihashes "~0.4.15" + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" @@ -5010,6 +5476,11 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +class-is@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" + integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== + classic-level@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.2.0.tgz#2d52bdec8e7a27f534e67fdeb890abef3e643c27" @@ -5186,7 +5657,7 @@ combine-source-map@~0.8.0: lodash.memoize "~3.0.3" source-map "~0.5.3" -combined-stream@^1.0.6, combined-stream@^1.0.8: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -5298,11 +5769,32 @@ constants-browserify@^1.0.0: resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-hash@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" + integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== + dependencies: + cids "^0.7.1" + multicodec "^0.5.5" + multihashes "^0.4.15" + content-type@^1.0.4, content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + conventional-changelog-angular@^5.0.12: version "5.0.13" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" @@ -5402,6 +5894,16 @@ convert-source-map@~1.2.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.2.0.tgz#44c08c2506f10fb3ca6fd888d5a3444cf8d6a669" integrity sha512-S8g9WfpATYd4Qajgygr9CsIRSvd+omrKmaqLE0Lz4dSWprOFpWSqYTrXBTNrYqM+x4OaLlFWhJSOJHU8vuU1wA== +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + cookie@^0.4.0: version "0.4.1" resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz" @@ -5422,12 +5924,17 @@ core-js@^2.4.0: resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cors@~2.8.5: +cors@^2.8.1, cors@~2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== @@ -5562,11 +6069,26 @@ custom-event@~1.0.0: resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + datastore-core@^8.0.1: version "8.0.3" resolved "https://registry.yarnpkg.com/datastore-core/-/datastore-core-8.0.3.tgz#d14bda75184b03d319c80d94f49ff36b27a619d4" @@ -5609,7 +6131,7 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@2.6.9, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -5660,6 +6182,11 @@ decamelize@^4.0.0: resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" @@ -5732,7 +6259,7 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== -defer-to-connect@^2.0.1: +defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== @@ -5937,6 +6464,11 @@ dom-serialize@^2.2.1: extend "^3.0.0" void-elements "^2.0.0" +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz" @@ -5971,6 +6503,14 @@ duplexer@^0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -5990,7 +6530,7 @@ electron@^21.0.1: "@types/node" "^16.11.26" extract-zip "^2.0.1" -elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.3: +elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3: version "6.5.4" resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -6202,16 +6742,47 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.62" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" + es6-error@^4.0.1, es6-error@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + es6-object-assign@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz" integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= +es6-promise@^4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -6429,6 +7000,47 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eth-ens-namehash@2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" + integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== + dependencies: + idna-uts46-hx "^2.3.1" + js-sha3 "^0.5.7" + +eth-lib@0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" + integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + xhr-request-promise "^0.1.2" + +eth-lib@^0.1.26: + version "0.1.29" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" + integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== + dependencies: + 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" + +ethereum-bloom-filters@^1.0.6: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + dependencies: + js-sha3 "^0.8.0" + ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" @@ -6450,6 +7062,27 @@ ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" +ethereum-cryptography@^1.1.2, ethereum-cryptography@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== + dependencies: + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" + +ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + ethers@^5.0.2: version "5.1.4" resolved "https://registry.npmjs.org/ethers/-/ethers-5.1.4.tgz" @@ -6486,6 +7119,26 @@ ethers@^5.0.2: "@ethersproject/web" "5.1.0" "@ethersproject/wordlists" "5.1.0" +ethers@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.1.0.tgz#de9c3acbb865fda6c080e80ec88ae0aada046947" + integrity sha512-aC45YGbvgXt7Nses5WsdQwc1cUIrrQt32zeFShNW7ZT3RQCIHBnd4nmbE5sJmrp70uTdwkRHkr4cZr1D/YwFPg== + dependencies: + "@adraffy/ens-normalize" "1.8.9" + "@noble/hashes" "1.1.2" + "@noble/secp256k1" "1.7.1" + aes-js "4.0.0-beta.3" + tslib "2.4.0" + ws "8.5.0" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + event-iterator@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/event-iterator/-/event-iterator-2.0.0.tgz#10f06740cc1e9fd6bc575f334c2bc1ae9d2dbf62" @@ -6496,6 +7149,11 @@ event-target-shim@^5.0.0: resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== +eventemitter3@4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" + integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + eventemitter3@^4.0.0, eventemitter3@^4.0.4, eventemitter3@^4.0.7: version "4.0.7" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" @@ -6556,7 +7214,51 @@ expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -extend@^3.0.0: +express@^4.14.0: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + 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.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + 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" + +ext@^1.1.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + +extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -6581,6 +7283,16 @@ extract-zip@^2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + fast-decode-uri-component@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz" @@ -6784,6 +7496,19 @@ finalhandler@1.1.2: statuses "~1.5.0" unpipe "~1.0.0" +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + find-cache-dir@^3.2.0: version "3.3.1" resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz" @@ -6882,6 +7607,11 @@ foreground-child@^2.0.0: cross-spawn "^7.0.0" signal-exit "^3.0.2" +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + form-data-encoder@1.7.1: version "1.7.1" resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96" @@ -6914,6 +7644,15 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + formidable@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.0.1.tgz#4310bc7965d185536f9565184dee74fbb75557ff" @@ -6934,6 +7673,11 @@ freeport-promise@^2.0.0: resolved "https://registry.yarnpkg.com/freeport-promise/-/freeport-promise-2.0.0.tgz#11e4f81e24d680b88a20c15b2103551f4b6663d8" integrity sha512-dwWpT1DdQcwrhmRwnDnPM/ZFny+FtzU+k50qF2eid3KxaQDsMiBrwo1i0G3qSugkN5db6Cb0zgfc68QeTOpEFg== +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + fromentries@^1.2.0: version "1.3.2" resolved "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz" @@ -6953,6 +7697,15 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -7162,6 +7915,13 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + git-raw-commits@^2.0.8: version "2.0.11" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" @@ -7304,6 +8064,14 @@ global-tunnel-ng@^2.7.1: npm-conf "^1.1.3" tunnel "^0.0.6" +global@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" @@ -7335,7 +8103,7 @@ globby@^11.0.2, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -got@^12.1.0: +got@12.1.0, got@^12.1.0: version "12.1.0" resolved "https://registry.yarnpkg.com/got/-/got-12.1.0.tgz#099f3815305c682be4fd6b0ee0726d8e4c6b0af4" integrity sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig== @@ -7354,6 +8122,23 @@ got@^12.1.0: p-cancelable "^3.0.0" responselike "^2.0.0" +got@^11.8.5: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@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" + got@^9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -7398,6 +8183,19 @@ handlebars@^4.7.7: optionalDependencies: uglify-js "^3.1.4" +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" @@ -7466,7 +8264,7 @@ hash.js@1.1.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" -hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -7560,6 +8358,11 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-https@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" + integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== + http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -7587,6 +8390,23 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + http2-wrapper@^2.1.10: version "2.1.11" resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.1.11.tgz#d7c980c7ffb85be3859b6a96c800b2951ae257ef" @@ -7634,6 +8454,13 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +idna-uts46-hx@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" + integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== + dependencies: + punycode "2.1.0" + ieee754@1.1.13: version "1.1.13" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz" @@ -7957,6 +8784,11 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-function@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + is-generator-function@^1.0.7: version "1.0.8" resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz" @@ -7976,6 +8808,11 @@ is-glob@^4.0.1, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" @@ -8114,7 +8951,7 @@ is-typed-array@^1.1.3: foreach "^2.0.5" has-symbols "^1.0.1" -is-typedarray@^1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== @@ -8168,6 +9005,11 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: version "3.0.0" resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz" @@ -8373,11 +9215,16 @@ jmespath@0.15.0: resolved "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz" integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= -js-sha3@0.5.7: +js-sha3@0.5.7, js-sha3@^0.5.7: version "0.5.7" resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz" integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= +js-sha3@0.8.0, 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-string-escape@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" @@ -8408,6 +9255,11 @@ jsbn@1.1.0: resolved "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz" integrity sha1-sBMHyym2GKHtJux56RH4A8TaAEA= +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" @@ -8443,6 +9295,11 @@ json-schema-traverse@^1.0.0: resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" @@ -8453,7 +9310,7 @@ json-stringify-nice@^1.1.4: resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== -json-stringify-safe@^5.0.1: +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== @@ -8498,6 +9355,16 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + just-diff-apply@^5.2.0: version "5.4.1" resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.4.1.tgz#1debed059ad009863b4db0e8d8f333d743cdd83b" @@ -9207,6 +10074,11 @@ meow@^8.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + merge-options@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz" @@ -9224,7 +10096,7 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -methods@^1.1.2: +methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= @@ -9250,13 +10122,18 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.16, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mime@2.6.0, mime@^2.5.2: version "2.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" @@ -9277,6 +10154,13 @@ mimic-response@^3.1.0: resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== + dependencies: + dom-walk "^0.1.0" + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -9462,6 +10346,18 @@ mkdirp-infer-owner@^2.0.0: infer-owner "^1.0.4" mkdirp "^1.0.3" +mkdirp-promise@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" + integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w== + dependencies: + mkdirp "*" + +mkdirp@*: + version "2.1.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.3.tgz#b083ff37be046fd3d6552468c1f0ff44c1545d1f" + integrity sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw== + mkdirp@^0.5.1, mkdirp@^0.5.5: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -9502,6 +10398,11 @@ mocha@^10.0.0: yargs-parser "20.2.4" yargs-unparser "2.0.0" +mock-fs@^4.1.0: + version "4.14.0" + resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" + integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== + mockery@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz" @@ -9547,6 +10448,22 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multibase@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" + integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== + dependencies: + base-x "^3.0.8" + buffer "^5.5.0" + +multibase@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" + integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== + dependencies: + base-x "^3.0.8" + buffer "^5.5.0" + multicast-dns@^7.2.0: version "7.2.2" resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.2.tgz" @@ -9555,6 +10472,21 @@ multicast-dns@^7.2.0: dns-packet "^4.0.0" thunky "^1.0.2" +multicodec@^0.5.5: + version "0.5.7" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" + integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== + dependencies: + varint "^5.0.0" + +multicodec@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" + integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== + dependencies: + buffer "^5.6.0" + varint "^5.0.0" + multiformats@^10.0.0: version "10.0.2" resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-10.0.2.tgz#e549ae833dac77edb534bece4adf1d1a214879f0" @@ -9570,6 +10502,15 @@ multiformats@^9.4.2: resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== +multihashes@^0.4.15, multihashes@~0.4.15: + version "0.4.21" + resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" + integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== + dependencies: + buffer "^5.5.0" + multibase "^0.7.0" + varint "^5.0.0" + multimatch@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" @@ -9601,6 +10542,11 @@ nan@^2.15.0, nan@^2.16.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916" integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== +nano-json-stream-parser@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" + integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== + nanoid@3.3.3, nanoid@^3.0.2, nanoid@^3.1.20: version "3.3.3" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" @@ -9655,6 +10601,11 @@ netmask@^2.0.2: resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" @@ -10024,6 +10975,14 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + nx@14.7.13, "nx@>=14.6.1 < 16": version "14.7.13" resolved "https://registry.yarnpkg.com/nx/-/nx-14.7.13.tgz#1c71c0a2b574cdfadf146650b57807cda7d7d789" @@ -10097,6 +11056,11 @@ nyc@^15.1.0: test-exclude "^6.0.0" yargs "^15.0.2" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" @@ -10149,6 +11113,13 @@ object.values@^1.1.5: define-properties "^1.1.3" es-abstract "^1.19.1" +oboe@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" + integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== + dependencies: + http-https "^1.0.0" + observable-fns@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/observable-fns/-/observable-fns-0.6.1.tgz" @@ -10263,6 +11234,11 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + p-cancelable@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" @@ -10504,6 +11480,11 @@ parse-conflict-json@^2.0.1: just-diff "^5.0.1" just-diff-apply "^5.2.0" +parse-headers@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" + integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -10586,6 +11567,11 @@ path-parse@^1.0.5, path-parse@^1.0.6, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + path-to-regexp@^1.7.0: version "1.8.0" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" @@ -10626,6 +11612,11 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -10901,7 +11892,7 @@ protons-runtime@^4.0.1: protobufjs "^7.0.0" uint8arraylist "^2.3.2" -proxy-addr@^2.0.7: +proxy-addr@^2.0.7, proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== @@ -10960,6 +11951,11 @@ punycode@1.3.2: resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= +punycode@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== + punycode@^1.2.4, punycode@^1.3.2: version "1.4.1" resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" @@ -10987,18 +11983,18 @@ qs@6.10.3: dependencies: side-channel "^1.0.4" -qs@6.9.3: - version "6.9.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" - integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== - -qs@^6.10.3: +qs@6.11.0, qs@^6.10.3: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" +qs@6.9.3: + version "6.9.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" + integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== + qs@^6.11.1: version "6.11.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.1.tgz#6c29dff97f0c0060765911ba65cbc9764186109f" @@ -11006,6 +12002,20 @@ qs@^6.11.1: dependencies: side-channel "^1.0.4" +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" @@ -11056,7 +12066,7 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -range-parser@^1.2.1: +range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== @@ -11081,6 +12091,16 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + rc@^1.2.7: version "1.2.8" resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" @@ -11249,6 +12269,32 @@ release-zalgo@^1.0.0: dependencies: es6-error "^4.0.1" +request@^2.79.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -11269,7 +12315,7 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -resolve-alpn@^1.2.0: +resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== @@ -11419,6 +12465,13 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + rlp@^2.2.6: version "2.2.6" resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz" @@ -11471,7 +12524,7 @@ rxjs@^7.5.5: dependencies: tslib "^2.1.0" -safe-buffer@*, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@*, safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -11497,7 +12550,7 @@ safe-regex2@^2.0.0: dependencies: ret "~0.2.0" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -11528,7 +12581,7 @@ schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" -scrypt-js@3.0.1, scrypt-js@^3.0.0: +scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== @@ -11581,6 +12634,25 @@ semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semve dependencies: lru-cache "^6.0.0" +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + 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 "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + serialize-error@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" @@ -11595,6 +12667,27 @@ serialize-javascript@6.0.0, serialize-javascript@^6.0.0: dependencies: randombytes "^2.1.0" +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +servify@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" + integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== + dependencies: + body-parser "^1.16.0" + cors "^2.8.1" + express "^4.14.0" + request "^2.79.0" + xhr "^2.3.3" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" @@ -11926,6 +13019,21 @@ ssh2@^1.11.0, ssh2@^1.4.0: cpu-features "~0.0.4" nan "^2.16.0" +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + ssri@^8.0.0, ssri@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" @@ -12020,6 +13128,11 @@ strict-event-emitter-types@^2.0.0: resolved "https://registry.npmjs.org/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz" integrity sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA== +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== + string-similarity@^4.0.1: version "4.0.4" resolved "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz" @@ -12113,6 +13226,13 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -12202,6 +13322,23 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +swarm-js@^0.1.40: + version "0.1.42" + resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.42.tgz#497995c62df6696f6e22372f457120e43e727979" + integrity sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ== + dependencies: + bluebird "^3.5.0" + buffer "^5.0.5" + eth-lib "^0.1.26" + fs-extra "^4.0.2" + got "^11.8.5" + 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" + systeminformation@^5.17.9: version "5.17.9" resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.17.9.tgz#8a47bc84f076982734d7b7a0c71371d23bbbfd52" @@ -12266,7 +13403,7 @@ tar-stream@^2.0.0, tar-stream@^2.1.4, tar-stream@^2.2.0, tar-stream@~2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^4: +tar@^4, tar@^4.0.2: version "4.4.19" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== @@ -12402,6 +13539,11 @@ thunky@^1.0.2: resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== + timeout-abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/timeout-abort-controller/-/timeout-abort-controller-3.0.0.tgz" @@ -12492,6 +13634,14 @@ tough-cookie@^4.0.0: punycode "^2.1.1" universalify "^0.1.2" +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + treeverse@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-2.0.0.tgz#036dcef04bc3fd79a9b79a68d4da03e882d8a9ca" @@ -12568,6 +13718,11 @@ tslib@2.3.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tslib@2.4.0, tslib@^2.3.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.10.0, tslib@^1.8.1: version "1.14.1" resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" @@ -12583,11 +13738,6 @@ tslib@^2.1.0: resolved "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz" integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== -tslib@^2.3.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@~2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz" @@ -12617,7 +13767,7 @@ tunnel@0.0.6, tunnel@^0.0.6: resolved "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz" integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== -tweetnacl@^0.14.3: +tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== @@ -12677,6 +13827,16 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -12752,6 +13912,11 @@ uint8arrays@^4.0.2: dependencies: multiformats "^10.0.0" +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== + unbox-primitive@^1.0.0, unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -12837,6 +14002,11 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" +url-set-query@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" + integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== + url@0.10.3: version "0.10.3" resolved "https://registry.npmjs.org/url/-/url-0.10.3.tgz" @@ -12860,11 +14030,23 @@ urlgrey@1.0.0: dependencies: fast-url-parser "^1.1.3" +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + dependencies: + node-gyp-build "^4.3.0" + utf8-byte-length@^1.0.1: version "1.0.4" resolved "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz" integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -12896,6 +14078,17 @@ util@^0.12.0: safe-buffer "^5.1.2" which-typed-array "^1.1.2" +util@^0.12.5: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + 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" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -12916,6 +14109,11 @@ uuid@^3.3.2, uuid@^3.3.3: resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + uuidv4@^6.1.1: version "6.2.7" resolved "https://registry.npmjs.org/uuidv4/-/uuidv4-6.2.7.tgz" @@ -12956,16 +14154,30 @@ validate-npm-package-name@^4.0.0: dependencies: builtins "^5.0.0" +varint@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" + integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== + varint@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz" integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== -vary@^1, vary@^1.1.2: +vary@^1, vary@^1.1.2, vary@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" @@ -12996,6 +14208,235 @@ wcwidth@^1.0.0, wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web3-bzz@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.8.2.tgz#67ea1c775874056250eece551ded22905ed08784" + integrity sha512-1EEnxjPnFnvNWw3XeeKuTR8PBxYd0+XWzvaLK7OJC/Go9O8llLGxrxICbKV+8cgIE0sDRBxiYx02X+6OhoAQ9w== + dependencies: + "@types/node" "^12.12.6" + got "12.1.0" + swarm-js "^0.1.40" + +web3-core-helpers@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.8.2.tgz#82066560f8085e6c7b93bcc8e88b441289ea9f9f" + integrity sha512-6B1eLlq9JFrfealZBomd1fmlq1o4A09vrCVQSa51ANoib/jllT3atZrRDr0zt1rfI7TSZTZBXdN/aTdeN99DWw== + dependencies: + web3-eth-iban "1.8.2" + web3-utils "1.8.2" + +web3-core-method@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.8.2.tgz#ba5ec68084e903f0516415010477618be017eac2" + integrity sha512-1qnr5mw5wVyULzLOrk4B+ryO3gfGjGd/fx8NR+J2xCGLf1e6OSjxT9vbfuQ3fErk/NjSTWWreieYWLMhaogcRA== + dependencies: + "@ethersproject/transactions" "^5.6.2" + web3-core-helpers "1.8.2" + web3-core-promievent "1.8.2" + web3-core-subscriptions "1.8.2" + web3-utils "1.8.2" + +web3-core-promievent@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.8.2.tgz#e670d6b4453632e6ecfd9ad82da44f77ac1585c9" + integrity sha512-nvkJWDVgoOSsolJldN33tKW6bKKRJX3MCPDYMwP5SUFOA/mCzDEoI88N0JFofDTXkh1k7gOqp1pvwi9heuaxGg== + dependencies: + eventemitter3 "4.0.4" + +web3-core-requestmanager@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.8.2.tgz#dda95e83ca4808949612a41e54ecea557f78ef26" + integrity sha512-p1d090RYs5Mu7DK1yyc3GCBVZB/03rBtFhYFoS2EruGzOWs/5Q0grgtpwS/DScdRAm8wB8mYEBhY/RKJWF6B2g== + dependencies: + util "^0.12.5" + web3-core-helpers "1.8.2" + web3-providers-http "1.8.2" + web3-providers-ipc "1.8.2" + web3-providers-ws "1.8.2" + +web3-core-subscriptions@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.8.2.tgz#0c8bd49439d83c6f0a03c70f00b24a915a70a5ed" + integrity sha512-vXQogHDmAIQcKpXvGiMddBUeP9lnKgYF64+yQJhPNE5PnWr1sAibXuIPV7mIPihpFr/n/DORRj6Wh1pUv9zaTw== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.8.2" + +web3-core@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.8.2.tgz#333e93d7872b1a36efe758ed8b89a7acbdd962c2" + integrity sha512-DJTVEAYcNqxkqruJE+Rxp3CIv0y5AZMwPHQmOkz/cz+MM75SIzMTc0AUdXzGyTS8xMF8h3YWMQGgGEy8SBf1PQ== + dependencies: + "@types/bn.js" "^5.1.0" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.8.2" + web3-core-method "1.8.2" + web3-core-requestmanager "1.8.2" + web3-utils "1.8.2" + +web3-eth-abi@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.8.2.tgz#16e1e9be40e2527404f041a4745111211488f31a" + integrity sha512-Om9g3kaRNjqiNPAgKwGT16y+ZwtBzRe4ZJFGjLiSs6v5I7TPNF+rRMWuKnR6jq0azQZDj6rblvKFMA49/k48Og== + dependencies: + "@ethersproject/abi" "^5.6.3" + web3-utils "1.8.2" + +web3-eth-accounts@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.8.2.tgz#b894f5d5158fcae429da42de75d96520d0712971" + integrity sha512-c367Ij63VCz9YdyjiHHWLFtN85l6QghgwMQH2B1eM/p9Y5lTlTX7t/Eg/8+f1yoIStXbk2w/PYM2lk+IkbqdLA== + dependencies: + "@ethereumjs/common" "2.5.0" + "@ethereumjs/tx" "3.3.2" + eth-lib "0.2.8" + ethereumjs-util "^7.1.5" + scrypt-js "^3.0.1" + uuid "^9.0.0" + web3-core "1.8.2" + web3-core-helpers "1.8.2" + web3-core-method "1.8.2" + web3-utils "1.8.2" + +web3-eth-contract@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.8.2.tgz#5388b7130923d2b790c09a420391a81312a867fb" + integrity sha512-ID5A25tHTSBNwOPjiXSVzxruz006ULRIDbzWTYIFTp7NJ7vXu/kynKK2ag/ObuTqBpMbobP8nXcA9b5EDkIdQA== + dependencies: + "@types/bn.js" "^5.1.0" + web3-core "1.8.2" + web3-core-helpers "1.8.2" + web3-core-method "1.8.2" + web3-core-promievent "1.8.2" + web3-core-subscriptions "1.8.2" + web3-eth-abi "1.8.2" + web3-utils "1.8.2" + +web3-eth-ens@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.8.2.tgz#0a086ad4d919102e28b9fd3036df246add9df22a" + integrity sha512-PWph7C/CnqdWuu1+SH4U4zdrK4t2HNt0I4XzPYFdv9ugE8EuojselioPQXsVGvjql+Nt3jDLvQvggPqlMbvwRw== + dependencies: + content-hash "^2.5.2" + eth-ens-namehash "2.0.8" + web3-core "1.8.2" + web3-core-helpers "1.8.2" + web3-core-promievent "1.8.2" + web3-eth-abi "1.8.2" + web3-eth-contract "1.8.2" + web3-utils "1.8.2" + +web3-eth-iban@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.8.2.tgz#5cb3022234b13986f086353b53f0379a881feeaf" + integrity sha512-h3vNblDWkWMuYx93Q27TAJz6lhzpP93EiC3+45D6xoz983p6si773vntoQ+H+5aZhwglBtoiBzdh7PSSOnP/xQ== + dependencies: + bn.js "^5.2.1" + web3-utils "1.8.2" + +web3-eth-personal@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.8.2.tgz#3526c1ebaa4e7bf3a0a8ec77e34f067cc9a750b2" + integrity sha512-Vg4HfwCr7doiUF/RC+Jz0wT4+cYaXcOWMAW2AHIjHX6Z7Xwa8nrURIeQgeEE62qcEHAzajyAdB1u6bJyTfuCXw== + dependencies: + "@types/node" "^12.12.6" + web3-core "1.8.2" + web3-core-helpers "1.8.2" + web3-core-method "1.8.2" + web3-net "1.8.2" + web3-utils "1.8.2" + +web3-eth@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.8.2.tgz#8562287ae1803c30eb54dc7d832092e5739ce06a" + integrity sha512-JoTiWWc4F4TInpbvDUGb0WgDYJsFhuIjJlinc5ByjWD88Gvh+GKLsRjjFdbqe5YtwIGT4NymwoC5LQd1K6u/QQ== + dependencies: + web3-core "1.8.2" + web3-core-helpers "1.8.2" + web3-core-method "1.8.2" + web3-core-subscriptions "1.8.2" + web3-eth-abi "1.8.2" + web3-eth-accounts "1.8.2" + web3-eth-contract "1.8.2" + web3-eth-ens "1.8.2" + web3-eth-iban "1.8.2" + web3-eth-personal "1.8.2" + web3-net "1.8.2" + web3-utils "1.8.2" + +web3-net@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.8.2.tgz#97e1e0015fabc4cda31017813e98d0b5468dd04f" + integrity sha512-1itkDMGmbgb83Dg9nporFes9/fxsU7smJ3oRXlFkg4ZHn8YJyP1MSQFPJWWwSc+GrcCFt4O5IrUTvEkHqE3xag== + dependencies: + web3-core "1.8.2" + web3-core-method "1.8.2" + web3-utils "1.8.2" + +web3-providers-http@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.8.2.tgz#fbda3a3bbc8db004af36e91bec35f80273b37885" + integrity sha512-2xY94IIEQd16+b+vIBF4IC1p7GVaz9q4EUFscvMUjtEq4ru4Atdzjs9GP+jmcoo49p70II0UV3bqQcz0TQfVyQ== + dependencies: + abortcontroller-polyfill "^1.7.3" + cross-fetch "^3.1.4" + es6-promise "^4.2.8" + web3-core-helpers "1.8.2" + +web3-providers-ipc@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.8.2.tgz#e52a7250f40c83b99a2482ec5b4cf2728377ae5c" + integrity sha512-p6fqKVGFg+WiXGHWnB1hu43PbvPkDHTz4RgoEzbXugv5rtv5zfYLqm8Ba6lrJOS5ks9kGKR21a0y3NzE3u7V4w== + dependencies: + oboe "2.1.5" + web3-core-helpers "1.8.2" + +web3-providers-ws@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.8.2.tgz#56a2b701387011aca9154ca4bc06ea4b5f27e4ef" + integrity sha512-3s/4K+wHgbiN+Zrp9YjMq2eqAF6QGABw7wFftPdx+m5hWImV27/MoIx57c6HffNRqZXmCHnfWWFCNHHsi7wXnA== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.8.2" + websocket "^1.0.32" + +web3-shh@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.8.2.tgz#217a417f0d6e243dd4d441848ffc2bd164cea8a0" + integrity sha512-uZ+3MAoNcaJsXXNCDnizKJ5viBNeHOFYsCbFhV755Uu52FswzTOw6DtE7yK9nYXMtIhiSgi7nwl1RYzP8pystw== + dependencies: + web3-core "1.8.2" + web3-core-method "1.8.2" + web3-core-subscriptions "1.8.2" + web3-net "1.8.2" + +web3-utils@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.2.tgz#c32dec5e9b955acbab220eefd7715bc540b75cc9" + integrity sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA== + dependencies: + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +web3@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.8.2.tgz#95a4e5398fd0f01325264bf8e5e8cdc69a7afe86" + integrity sha512-92h0GdEHW9wqDICQQKyG4foZBYi0OQkyg4CRml2F7XBl/NG+fu9o6J19kzfFXzSBoA4DnJXbyRgj/RHZv5LRiw== + dependencies: + web3-bzz "1.8.2" + web3-core "1.8.2" + web3-eth "1.8.2" + web3-eth-personal "1.8.2" + web3-net "1.8.2" + web3-shh "1.8.2" + web3-utils "1.8.2" + webpack-merge@^4.1.5: version "4.2.2" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" @@ -13038,6 +14479,18 @@ webpack@^5.74.0: watchpack "^2.4.0" webpack-sources "^3.2.3" +websocket@^1.0.32: + version "1.0.34" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" + integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== + dependencies: + 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" + wherearewe@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/wherearewe/-/wherearewe-2.0.1.tgz#37c97a7bf112dca8db34bfefb2f6c997af312bb8" @@ -13248,11 +14701,55 @@ ws@7.2.3: resolved "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz" integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + +ws@^3.0.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + ws@~8.2.3: version "8.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== +xhr-request-promise@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" + integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== + dependencies: + xhr-request "^1.1.0" + +xhr-request@^1.0.1, xhr-request@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" + integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== + dependencies: + 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@^2.0.4, xhr@^2.3.3: + version "2.6.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== + dependencies: + global "~4.4.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + xml2js@0.4.19: version "0.4.19" resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz" @@ -13304,6 +14801,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yaeti@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== + yallist@^3.0.0, yallist@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"