From 0df1480c51294148e04c0a715bbfad24f49689df Mon Sep 17 00:00:00 2001 From: neeraj Date: Tue, 21 May 2024 17:34:28 +0530 Subject: [PATCH] Generate secured finance watcher --- .eslintignore | 2 + .eslintrc.json | 28 + .gitignore | 6 + .husky/pre-commit | 4 + .npmrc | 1 + LICENSE | 661 ++ README.md | 213 +- environments/local.toml | 103 + package.json | 76 + src/artifacts/Example.json | 183 + src/artifacts/FundManagementLogic.json | 800 ++ .../LendingMarketOperationLogic.json | 379 + src/artifacts/LiquidationLogic.json | 152 + src/artifacts/OrderActionLogic.json | 359 + src/artifacts/OrderBookLogic.json | 593 ++ src/artifacts/TokenVault.json | 1732 ++++ src/cli/checkpoint-cmds/create.ts | 44 + src/cli/checkpoint-cmds/verify.ts | 40 + src/cli/checkpoint.ts | 39 + src/cli/export-state.ts | 38 + src/cli/import-state.ts | 39 + src/cli/index-block.ts | 38 + src/cli/inspect-cid.ts | 38 + src/cli/reset-cmds/job-queue.ts | 22 + src/cli/reset-cmds/state.ts | 24 + src/cli/reset-cmds/watcher.ts | 37 + src/cli/reset.ts | 24 + src/cli/watch-contract.ts | 38 + src/client.ts | 55 + src/database.ts | 294 + src/entity/BlockProgress.ts | 48 + src/entity/Contract.ts | 27 + src/entity/DailyVolume.ts | 43 + src/entity/Deposit.ts | 34 + src/entity/Event.ts | 38 + src/entity/FrothyEntity.ts | 21 + src/entity/LendingMarket.ts | 49 + src/entity/Liquidation.ts | 49 + src/entity/Order.ts | 77 + src/entity/Protocol.ts | 28 + src/entity/State.ts | 31 + src/entity/StateSyncStatus.ts | 17 + src/entity/Subscriber.ts | 21 + src/entity/SyncStatus.ts | 45 + src/entity/Transaction.ts | 72 + src/entity/TransactionCandleStick.ts | 62 + src/entity/Transfer.ts | 47 + src/entity/User.ts | 40 + src/fill.ts | 48 + src/gql/index.ts | 3 + src/gql/mutations/index.ts | 4 + src/gql/mutations/watchContract.gql | 3 + src/gql/queries/_meta.gql | 11 + src/gql/queries/dailyVolume.gql | 21 + src/gql/queries/dailyVolumes.gql | 21 + src/gql/queries/deposit.gql | 15 + src/gql/queries/deposits.gql | 15 + src/gql/queries/events.gql | 273 + src/gql/queries/eventsInRange.gql | 273 + src/gql/queries/getState.gql | 15 + src/gql/queries/getStateByCID.gql | 15 + src/gql/queries/getSyncStatus.gql | 12 + src/gql/queries/index.ts | 29 + src/gql/queries/lendingMarket.gql | 54 + src/gql/queries/lendingMarkets.gql | 54 + src/gql/queries/liquidation.gql | 20 + src/gql/queries/liquidations.gql | 20 + src/gql/queries/order.gql | 54 + src/gql/queries/orders.gql | 54 + src/gql/queries/protocol.gql | 6 + src/gql/queries/protocols.gql | 6 + src/gql/queries/transaction.gql | 54 + src/gql/queries/transactionCandleStick.gql | 27 + src/gql/queries/transactionCandleSticks.gql | 27 + src/gql/queries/transactions.gql | 54 + src/gql/queries/transfer.gql | 19 + src/gql/queries/transfers.gql | 19 + src/gql/queries/user.gql | 67 + src/gql/queries/users.gql | 67 + src/gql/subscriptions/index.ts | 4 + src/gql/subscriptions/onEvent.gql | 273 + src/hooks.ts | 86 + src/indexer.ts | 1008 +++ src/job-runner.ts | 48 + src/resolvers.ts | 527 ++ src/schema.gql | 1755 ++++ src/server.ts | 43 + src/types.ts | 27 + .../FundManagementLogic.wasm | Bin 0 -> 224478 bytes .../abis/FundManagementLogic.json | 798 ++ .../LendingMarketOperationLogic.wasm | Bin 0 -> 223950 bytes .../abis/LendingMarketOperationLogic.json | 377 + .../LiquidationLogic/LiquidationLogic.wasm | Bin 0 -> 222316 bytes .../abis/LiquidationLogic.json | 150 + .../abis/OrderActionLogic.json | 357 + .../OrderBookLogic/abis/OrderBookLogic.json | 591 ++ subgraph-build/TokenVault/TokenVault.wasm | Bin 0 -> 223035 bytes .../TokenVault/abis/TokenVault.json | 1730 ++++ subgraph-build/schema.graphql | 158 + subgraph-build/subgraph.yaml | 146 + .../OrderActionLogic/OrderActionLogic.wasm | Bin 0 -> 249883 bytes tsconfig.json | 74 + yarn.lock | 7398 +++++++++++++++++ 103 files changed, 23720 insertions(+), 1 deletion(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100755 .husky/pre-commit create mode 100644 .npmrc create mode 100644 LICENSE create mode 100644 environments/local.toml create mode 100644 package.json create mode 100644 src/artifacts/Example.json create mode 100644 src/artifacts/FundManagementLogic.json create mode 100644 src/artifacts/LendingMarketOperationLogic.json create mode 100644 src/artifacts/LiquidationLogic.json create mode 100644 src/artifacts/OrderActionLogic.json create mode 100644 src/artifacts/OrderBookLogic.json create mode 100644 src/artifacts/TokenVault.json create mode 100644 src/cli/checkpoint-cmds/create.ts create mode 100644 src/cli/checkpoint-cmds/verify.ts create mode 100644 src/cli/checkpoint.ts create mode 100644 src/cli/export-state.ts create mode 100644 src/cli/import-state.ts create mode 100644 src/cli/index-block.ts create mode 100644 src/cli/inspect-cid.ts create mode 100644 src/cli/reset-cmds/job-queue.ts create mode 100644 src/cli/reset-cmds/state.ts create mode 100644 src/cli/reset-cmds/watcher.ts create mode 100644 src/cli/reset.ts create mode 100644 src/cli/watch-contract.ts create mode 100644 src/client.ts create mode 100644 src/database.ts create mode 100644 src/entity/BlockProgress.ts create mode 100644 src/entity/Contract.ts create mode 100644 src/entity/DailyVolume.ts create mode 100644 src/entity/Deposit.ts create mode 100644 src/entity/Event.ts create mode 100644 src/entity/FrothyEntity.ts create mode 100644 src/entity/LendingMarket.ts create mode 100644 src/entity/Liquidation.ts create mode 100644 src/entity/Order.ts create mode 100644 src/entity/Protocol.ts create mode 100644 src/entity/State.ts create mode 100644 src/entity/StateSyncStatus.ts create mode 100644 src/entity/Subscriber.ts create mode 100644 src/entity/SyncStatus.ts create mode 100644 src/entity/Transaction.ts create mode 100644 src/entity/TransactionCandleStick.ts create mode 100644 src/entity/Transfer.ts create mode 100644 src/entity/User.ts create mode 100644 src/fill.ts create mode 100644 src/gql/index.ts create mode 100644 src/gql/mutations/index.ts create mode 100644 src/gql/mutations/watchContract.gql create mode 100644 src/gql/queries/_meta.gql create mode 100644 src/gql/queries/dailyVolume.gql create mode 100644 src/gql/queries/dailyVolumes.gql create mode 100644 src/gql/queries/deposit.gql create mode 100644 src/gql/queries/deposits.gql create mode 100644 src/gql/queries/events.gql create mode 100644 src/gql/queries/eventsInRange.gql create mode 100644 src/gql/queries/getState.gql create mode 100644 src/gql/queries/getStateByCID.gql create mode 100644 src/gql/queries/getSyncStatus.gql create mode 100644 src/gql/queries/index.ts create mode 100644 src/gql/queries/lendingMarket.gql create mode 100644 src/gql/queries/lendingMarkets.gql create mode 100644 src/gql/queries/liquidation.gql create mode 100644 src/gql/queries/liquidations.gql create mode 100644 src/gql/queries/order.gql create mode 100644 src/gql/queries/orders.gql create mode 100644 src/gql/queries/protocol.gql create mode 100644 src/gql/queries/protocols.gql create mode 100644 src/gql/queries/transaction.gql create mode 100644 src/gql/queries/transactionCandleStick.gql create mode 100644 src/gql/queries/transactionCandleSticks.gql create mode 100644 src/gql/queries/transactions.gql create mode 100644 src/gql/queries/transfer.gql create mode 100644 src/gql/queries/transfers.gql create mode 100644 src/gql/queries/user.gql create mode 100644 src/gql/queries/users.gql create mode 100644 src/gql/subscriptions/index.ts create mode 100644 src/gql/subscriptions/onEvent.gql create mode 100644 src/hooks.ts create mode 100644 src/indexer.ts create mode 100644 src/job-runner.ts create mode 100644 src/resolvers.ts create mode 100644 src/schema.gql create mode 100644 src/server.ts create mode 100644 src/types.ts create mode 100644 subgraph-build/FundManagementLogic/FundManagementLogic.wasm create mode 100644 subgraph-build/FundManagementLogic/abis/FundManagementLogic.json create mode 100644 subgraph-build/LendingMarketOperationLogic/LendingMarketOperationLogic.wasm create mode 100644 subgraph-build/LendingMarketOperationLogic/abis/LendingMarketOperationLogic.json create mode 100644 subgraph-build/LiquidationLogic/LiquidationLogic.wasm create mode 100644 subgraph-build/LiquidationLogic/abis/LiquidationLogic.json create mode 100644 subgraph-build/OrderActionLogic/abis/OrderActionLogic.json create mode 100644 subgraph-build/OrderBookLogic/abis/OrderBookLogic.json create mode 100644 subgraph-build/TokenVault/TokenVault.wasm create mode 100644 subgraph-build/TokenVault/abis/TokenVault.json create mode 100644 subgraph-build/schema.graphql create mode 100644 subgraph-build/subgraph.yaml create mode 100644 subgraph-build/templates/OrderActionLogic/OrderActionLogic.wasm create mode 100644 tsconfig.json create mode 100644 yarn.lock diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..55cb522 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +# Don't lint build output. +dist diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..a2b842c --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,28 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "semistandard", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 12, + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "indent": ["error", 2, { "SwitchCase": 1 }], + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/explicit-module-boundary-types": [ + "warn", + { + "allowArgumentsExplicitlyTypedAsAny": true + } + ] + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b4cc3f --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +dist/ +out/ + +.vscode +.idea diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..9dcd433 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +yarn lint diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..6b64c5b --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +@cerc-io:registry=https://git.vdb.to/api/packages/cerc-io/npm/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..331f7cf --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for + software and other kinds of works, specifically designed to ensure + cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed + to take away your freedom to share and change the works. By contrast, + our General Public Licenses are intended to guarantee your freedom to + share and change all versions of a program--to make sure it remains free + software for all its users. + + When we speak of free software, we are referring to freedom, not + price. Our General Public Licenses are designed to make sure that you + have the freedom to distribute copies of free software (and charge for + them if you wish), that you receive source code or can get it if you + want it, that you can change the software or use pieces of it in new + free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights + with two steps: (1) assert copyright on the software, and (2) offer + you this License which gives you legal permission to copy, distribute + and/or modify the software. + + A secondary benefit of defending all users' freedom is that + improvements made in alternate versions of the program, if they + receive widespread use, become available for other developers to + incorporate. Many developers of free software are heartened and + encouraged by the resulting cooperation. However, in the case of + software used on network servers, this result may fail to come about. + The GNU General Public License permits making a modified version and + letting the public access it on a server without ever releasing its + source code to the public. + + The GNU Affero General Public License is designed specifically to + ensure that, in such cases, the modified source code becomes available + to the community. It requires the operator of a network server to + provide the source code of the modified version running there to the + users of that server. Therefore, public use of a modified version, on + a publicly accessible server, gives the public access to the source + code of the modified version. + + An older license, called the Affero General Public License and + published by Affero, was designed to accomplish similar goals. This is + a different license, not a version of the Affero GPL, but Affero has + released a new version of the Affero GPL which permits relicensing under + this license. + + The precise terms and conditions for copying, distribution and + modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of + works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this + License. Each licensee is addressed as "you". "Licensees" and + "recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work + in a fashion requiring copyright permission, other than the making of an + exact copy. The resulting work is called a "modified version" of the + earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based + on the Program. + + To "propagate" a work means to do anything with it that, without + permission, would make you directly or secondarily liable for + infringement under applicable copyright law, except executing it on a + computer or modifying a private copy. Propagation includes copying, + distribution (with or without modification), making available to the + public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other + parties to make or receive copies. Mere interaction with a user through + a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" + to the extent that it includes a convenient and prominently visible + feature that (1) displays an appropriate copyright notice, and (2) + tells the user that there is no warranty for the work (except to the + extent that warranties are provided), that licensees may convey the + work under this License, and how to view a copy of this License. If + the interface presents a list of user commands or options, such as a + menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work + for making modifications to it. "Object code" means any non-source + form of a work. + + A "Standard Interface" means an interface that either is an official + standard defined by a recognized standards body, or, in the case of + interfaces specified for a particular programming language, one that + is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other + than the work as a whole, that (a) is included in the normal form of + packaging a Major Component, but which is not part of that Major + Component, and (b) serves only to enable use of the work with that + Major Component, or to implement a Standard Interface for which an + implementation is available to the public in source code form. A + "Major Component", in this context, means a major essential component + (kernel, window system, and so on) of the specific operating system + (if any) on which the executable work runs, or a compiler used to + produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all + the source code needed to generate, install, and (for an executable + work) run the object code and to modify the work, including scripts to + control those activities. However, it does not include the work's + System Libraries, or general-purpose tools or generally available free + programs which are used unmodified in performing those activities but + which are not part of the work. For example, Corresponding Source + includes interface definition files associated with source files for + the work, and the source code for shared libraries and dynamically + linked subprograms that the work is specifically designed to require, + such as by intimate data communication or control flow between those + subprograms and other parts of the work. + + The Corresponding Source need not include anything that users + can regenerate automatically from other parts of the Corresponding + Source. + + The Corresponding Source for a work in source code form is that + same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of + copyright on the Program, and are irrevocable provided the stated + conditions are met. This License explicitly affirms your unlimited + permission to run the unmodified Program. The output from running a + covered work is covered by this License only if the output, given its + content, constitutes a covered work. This License acknowledges your + rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not + convey, without conditions so long as your license otherwise remains + in force. You may convey covered works to others for the sole purpose + of having them make modifications exclusively for you, or provide you + with facilities for running those works, provided that you comply with + the terms of this License in conveying all material for which you do + not control copyright. Those thus making or running the covered works + for you must do so exclusively on your behalf, under your direction + and control, on terms that prohibit them from making any copies of + your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under + the conditions stated below. Sublicensing is not allowed; section 10 + makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological + measure under any applicable law fulfilling obligations under article + 11 of the WIPO copyright treaty adopted on 20 December 1996, or + similar laws prohibiting or restricting circumvention of such + measures. + + When you convey a covered work, you waive any legal power to forbid + circumvention of technological measures to the extent such circumvention + is effected by exercising rights under this License with respect to + the covered work, and you disclaim any intention to limit operation or + modification of the work as a means of enforcing, against the work's + users, your or third parties' legal rights to forbid circumvention of + technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you + receive it, in any medium, provided that you conspicuously and + appropriately publish on each copy an appropriate copyright notice; + keep intact all notices stating that this License and any + non-permissive terms added in accord with section 7 apply to the code; + keep intact all notices of the absence of any warranty; and give all + recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, + and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to + produce it from the Program, in the form of source code under the + terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent + works, which are not by their nature extensions of the covered work, + and which are not combined with it such as to form a larger program, + in or on a volume of a storage or distribution medium, is called an + "aggregate" if the compilation and its resulting copyright are not + used to limit the access or legal rights of the compilation's users + beyond what the individual works permit. Inclusion of a covered work + in an aggregate does not cause this License to apply to the other + parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms + of sections 4 and 5, provided that you also convey the + machine-readable Corresponding Source under the terms of this License, + in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded + from the Corresponding Source as a System Library, need not be + included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any + tangible personal property which is normally used for personal, family, + or household purposes, or (2) anything designed or sold for incorporation + into a dwelling. In determining whether a product is a consumer product, + doubtful cases shall be resolved in favor of coverage. For a particular + product received by a particular user, "normally used" refers to a + typical or common use of that class of product, regardless of the status + of the particular user or of the way in which the particular user + actually uses, or expects or is expected to use, the product. A product + is a consumer product regardless of whether the product has substantial + commercial, industrial or non-consumer uses, unless such uses represent + the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, + procedures, authorization keys, or other information required to install + and execute modified versions of a covered work in that User Product from + a modified version of its Corresponding Source. The information must + suffice to ensure that the continued functioning of the modified object + code is in no case prevented or interfered with solely because + modification has been made. + + If you convey an object code work under this section in, or with, or + specifically for use in, a User Product, and the conveying occurs as + part of a transaction in which the right of possession and use of the + User Product is transferred to the recipient in perpetuity or for a + fixed term (regardless of how the transaction is characterized), the + Corresponding Source conveyed under this section must be accompanied + by the Installation Information. But this requirement does not apply + if neither you nor any third party retains the ability to install + modified object code on the User Product (for example, the work has + been installed in ROM). + + The requirement to provide Installation Information does not include a + requirement to continue to provide support service, warranty, or updates + for a work that has been modified or installed by the recipient, or for + the User Product in which it has been modified or installed. Access to a + network may be denied when the modification itself materially and + adversely affects the operation of the network or violates the rules and + protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, + in accord with this section must be in a format that is publicly + documented (and with an implementation available to the public in + source code form), and must require no special password or key for + unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this + License by making exceptions from one or more of its conditions. + Additional permissions that are applicable to the entire Program shall + be treated as though they were included in this License, to the extent + that they are valid under applicable law. If additional permissions + apply only to part of the Program, that part may be used separately + under those permissions, but the entire Program remains governed by + this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option + remove any additional permissions from that copy, or from any part of + it. (Additional permissions may be written to require their own + removal in certain cases when you modify the work.) You may place + additional permissions on material, added by you to a covered work, + for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you + add to a covered work, you may (if authorized by the copyright holders of + that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further + restrictions" within the meaning of section 10. If the Program as you + received it, or any part of it, contains a notice stating that it is + governed by this License along with a term that is a further + restriction, you may remove that term. If a license document contains + a further restriction but permits relicensing or conveying under this + License, you may add to a covered work material governed by the terms + of that license document, provided that the further restriction does + not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you + must place, in the relevant source files, a statement of the + additional terms that apply to those files, or a notice indicating + where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the + form of a separately written license, or stated as exceptions; + the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly + provided under this License. Any attempt otherwise to propagate or + modify it is void, and will automatically terminate your rights under + this License (including any patent licenses granted under the third + paragraph of section 11). + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the copyright + holder fails to notify you of the violation by some reasonable means + prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from that + copyright holder, and you cure the violation prior to 30 days after + your receipt of the notice. + + Termination of your rights under this section does not terminate the + licenses of parties who have received copies or rights from you under + this License. If your rights have been terminated and not permanently + reinstated, you do not qualify to receive new licenses for the same + material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or + run a copy of the Program. Ancillary propagation of a covered work + occurring solely as a consequence of using peer-to-peer transmission + to receive a copy likewise does not require acceptance. However, + nothing other than this License grants you permission to propagate or + modify any covered work. These actions infringe copyright if you do + not accept this License. Therefore, by modifying or propagating a + covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically + receives a license from the original licensors, to run, modify and + propagate that work, subject to this License. You are not responsible + for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an + organization, or substantially all assets of one, or subdividing an + organization, or merging organizations. If propagation of a covered + work results from an entity transaction, each party to that + transaction who receives a copy of the work also receives whatever + licenses to the work the party's predecessor in interest had or could + give under the previous paragraph, plus a right to possession of the + Corresponding Source of the work from the predecessor in interest, if + the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the + rights granted or affirmed under this License. For example, you may + not impose a license fee, royalty, or other charge for exercise of + rights granted under this License, and you may not initiate litigation + (including a cross-claim or counterclaim in a lawsuit) alleging that + any patent claim is infringed by making, using, selling, offering for + sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this + License of the Program or a work on which the Program is based. The + work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims + owned or controlled by the contributor, whether already acquired or + hereafter acquired, that would be infringed by some manner, permitted + by this License, of making, using, or selling its contributor version, + but do not include claims that would be infringed only as a + consequence of further modification of the contributor version. For + purposes of this definition, "control" includes the right to grant + patent sublicenses in a manner consistent with the requirements of + this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free + patent license under the contributor's essential patent claims, to + make, use, sell, offer for sale, import and otherwise run, modify and + propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express + agreement or commitment, however denominated, not to enforce a patent + (such as an express permission to practice a patent or covenant not to + sue for patent infringement). To "grant" such a patent license to a + party means to make such an agreement or commitment not to enforce a + patent against the party. + + If you convey a covered work, knowingly relying on a patent license, + and the Corresponding Source of the work is not available for anyone + to copy, free of charge and under the terms of this License, through a + publicly available network server or other readily accessible means, + then you must either (1) cause the Corresponding Source to be so + available, or (2) arrange to deprive yourself of the benefit of the + patent license for this particular work, or (3) arrange, in a manner + consistent with the requirements of this License, to extend the patent + license to downstream recipients. "Knowingly relying" means you have + actual knowledge that, but for the patent license, your conveying the + covered work in a country, or your recipient's use of the covered work + in a country, would infringe one or more identifiable patents in that + country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or + arrangement, you convey, or propagate by procuring conveyance of, a + covered work, and grant a patent license to some of the parties + receiving the covered work authorizing them to use, propagate, modify + or convey a specific copy of the covered work, then the patent license + you grant is automatically extended to all recipients of the covered + work and works based on it. + + A patent license is "discriminatory" if it does not include within + the scope of its coverage, prohibits the exercise of, or is + conditioned on the non-exercise of one or more of the rights that are + specifically granted under this License. You may not convey a covered + work if you are a party to an arrangement with a third party that is + in the business of distributing software, under which you make payment + to the third party based on the extent of your activity of conveying + the work, and under which the third party grants, to any of the + parties who would receive the covered work from you, a discriminatory + patent license (a) in connection with copies of the covered work + conveyed by you (or copies made from those copies), or (b) primarily + for and in connection with specific products or compilations that + contain the covered work, unless you entered into that arrangement, + or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting + any implied license or other defenses to infringement that may + otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot convey a + covered work so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you may + not convey it at all. For example, if you agree to terms that obligate you + to collect a royalty for further conveying from those to whom you convey + the Program, the only way you could satisfy both those terms and this + License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the + Program, your modified version must prominently offer all users + interacting with it remotely through a computer network (if your version + supports such interaction) an opportunity to receive the Corresponding + Source of your version by providing access to the Corresponding Source + from a network server at no charge, through some standard or customary + means of facilitating copying of software. This Corresponding Source + shall include the Corresponding Source for any work covered by version 3 + of the GNU General Public License that is incorporated pursuant to the + following paragraph. + + Notwithstanding any other provision of this License, you have + permission to link or combine any covered work with a work licensed + under version 3 of the GNU General Public License into a single + combined work, and to convey the resulting work. The terms of this + License will continue to apply to the part which is the covered work, + but the work with which it is combined will remain governed by version + 3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of + the GNU Affero General Public License from time to time. Such new versions + will be similar in spirit to the present version, but may differ in detail to + address new problems or concerns. + + Each version is given a distinguishing version number. If the + Program specifies that a certain numbered version of the GNU Affero General + Public License "or any later version" applies to it, you have the + option of following the terms and conditions either of that numbered + version or of any later version published by the Free Software + Foundation. If the Program does not specify a version number of the + GNU Affero General Public License, you may choose any version ever published + by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future + versions of the GNU Affero General Public License can be used, that proxy's + public statement of acceptance of a version permanently authorizes you + to choose that version for the Program. + + Later license versions may give you additional or different + permissions. However, no additional obligations are imposed on any + author or copyright holder as a result of your choosing to follow a + later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY + OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM + IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF + ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS + THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY + GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE + USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), + EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF + SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided + above cannot be given local legal effect according to their terms, + reviewing courts shall apply local law that most closely approximates + an absolute waiver of all civil liability in connection with the + Program, unless a warranty or assumption of liability accompanies a + copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest + possible use to the public, the best way to achieve this is to make it + free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest + to attach them to the start of each source file to most effectively + state the exclusion of warranty; and each file should have at least + the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer + network, you should also make sure that it provides a way for users to + get its source. For example, if your program is a web application, its + interface could display a "Source" link that leads users to an archive + of the code. There are many ways you could offer source, and different + solutions will be better for different programs; see section 13 for the + specific requirements. + + You should also get your employer (if you work as a programmer) or school, + if any, to sign a "copyright disclaimer" for the program, if necessary. + For more information on this, and how to apply and follow the GNU AGPL, see + . diff --git a/README.md b/README.md index aa67b77..1a86760 100644 --- a/README.md +++ b/README.md @@ -1 +1,212 @@ -# secured-finance-watcher-ts \ No newline at end of file +# secured-finance-watcher-ts + +## Setup + +* Run the following command to install required packages: + + ```bash + yarn + ``` + +* Create a postgres12 database for the watcher: + + ```bash + sudo su - postgres + createdb secured-finance-watcher-ts + ``` + +* If the watcher is an `active` watcher: + + Create database for the job queue and enable the `pgcrypto` extension on them (https://github.com/timgit/pg-boss/blob/master/docs/usage.md#intro): + + ``` + createdb secured-finance-watcher-ts-job-queue + ``` + + ``` + postgres@tesla:~$ psql -U postgres -h localhost secured-finance-watcher-ts-job-queue + Password for user postgres: + psql (12.7 (Ubuntu 12.7-1.pgdg18.04+1)) + SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) + Type "help" for help. + + secured-finance-watcher-ts-job-queue=# CREATE EXTENSION pgcrypto; + CREATE EXTENSION + secured-finance-watcher-ts-job-queue=# exit + ``` + +* In the [config file](./environments/local.toml): + + * Update the database connection settings. + + * Update the `upstream` config and provide the `ipld-eth-server` GQL API endpoint. + + * Update the `server` config with state checkpoint settings. + +## Customize + +* Indexing on an event: + + * Edit the custom hook function `handleEvent` (triggered on an event) in [hooks.ts](./src/hooks.ts) to perform corresponding indexing using the `Indexer` object. + + * While using the indexer storage methods for indexing, pass `diff` as true if default state is desired to be generated using the state variables being indexed. + +* Generating state: + + * Edit the custom hook function `createInitialState` (triggered if the watcher passes the start block, checkpoint: `true`) in [hooks.ts](./src/hooks.ts) to save an initial `State` using the `Indexer` object. + + * Edit the custom hook function `createStateDiff` (triggered on a block) in [hooks.ts](./src/hooks.ts) to save the state in a `diff` `State` using the `Indexer` object. The default state (if exists) is updated. + + * Edit the custom hook function `createStateCheckpoint` (triggered just before default and CLI checkpoint) in [hooks.ts](./src/hooks.ts) to save the state in a `checkpoint` `State` using the `Indexer` object. + +### GQL Caching + +To enable GQL requests caching: + +* Update the `server.gqlCache` config with required settings. + +* In the GQL [schema file](./src/schema.gql), use the `cacheControl` directive to apply cache hints at schema level. + + * Eg. Set `inheritMaxAge` to true for non-scalar fields of a type. + +* In the GQL [resolvers file](./src/resolvers.ts), uncomment the `setGQLCacheHints()` calls in resolvers for required queries. + +## Run + +* If the watcher is a `lazy` watcher: + + * Run the server: + + ```bash + yarn server + ``` + + GQL console: http://localhost:3008/graphql + +* If the watcher is an `active` watcher: + + * Run the job-runner: + + ```bash + yarn job-runner + ``` + + * Run the server: + + ```bash + yarn server + ``` + + GQL console: http://localhost:3008/graphql + + * To watch a contract: + + ```bash + yarn watch:contract --address --kind --checkpoint --starting-block [block-number] + ``` + + * `address`: Address or identifier of the contract to be watched. + * `kind`: Kind of the contract. + * `checkpoint`: Turn checkpointing on (`true` | `false`). + * `starting-block`: Starting block for the contract (default: `1`). + + Examples: + + Watch a contract with its address and checkpointing on: + + ```bash + yarn watch:contract --address 0x1F78641644feB8b64642e833cE4AFE93DD6e7833 --kind ERC20 --checkpoint true + ``` + + Watch a contract with its identifier and checkpointing on: + + ```bash + yarn watch:contract --address MyProtocol --kind protocol --checkpoint true + ``` + + * To fill a block range: + + ```bash + yarn fill --start-block --end-block + ``` + + * `start-block`: Block number to start filling from. + * `end-block`: Block number till which to fill. + + * To create a checkpoint for a contract: + + ```bash + yarn checkpoint create --address --block-hash [block-hash] + ``` + + * `address`: Address or identifier of the contract for which to create a checkpoint. + * `block-hash`: Hash of a block (in the pruned region) at which to create the checkpoint (default: latest canonical block hash). + + * To verify a checkpoint: + + ```bash + yarn checkpoint verify --cid + ``` + + `cid`: CID of the checkpoint for which to verify. + + * To reset the watcher to a previous block number: + + * Reset watcher: + + ```bash + yarn reset watcher --block-number + ``` + + * Reset job-queue: + + ```bash + yarn reset job-queue + ``` + + * Reset state: + + ```bash + yarn reset state --block-number + ``` + + * `block-number`: Block number to which to reset the watcher. + + * To export and import the watcher state: + + * In source watcher, export watcher state: + + ```bash + yarn export-state --export-file [export-file-path] --block-number [snapshot-block-height] + ``` + + * `export-file`: Path of file to which to export the watcher data. + * `block-number`: Block height at which to take snapshot for export. + + * In target watcher, run job-runner: + + ```bash + yarn job-runner + ``` + + * Import watcher state: + + ```bash + yarn import-state --import-file + ``` + + * `import-file`: Path of file from which to import the watcher data. + + * Run server: + + ```bash + yarn server + ``` + + * To inspect a CID: + + ```bash + yarn inspect-cid --cid + ``` + + * `cid`: CID to be inspected. diff --git a/environments/local.toml b/environments/local.toml new file mode 100644 index 0000000..dadd5ce --- /dev/null +++ b/environments/local.toml @@ -0,0 +1,103 @@ +[server] + host = "127.0.0.1" + port = 3008 + kind = "active" + gqlPath = "/graphql" + + # Checkpointing state. + checkpointing = true + + # Checkpoint interval in number of blocks. + checkpointInterval = 2000 + + # Enable state creation + # CAUTION: Disable only if state creation is not desired or can be filled subsequently + enableState = true + + subgraphPath = "./subgraph-build" + + # Interval to restart wasm instance periodically + wasmRestartBlocksInterval = 20 + + # Interval in number of blocks at which to clear entities cache. + clearEntitiesCacheInterval = 1000 + + # Max block range for which to return events in eventsInRange GQL query. + # Use -1 for skipping check on block range. + maxEventsBlockRange = 1000 + + # Flag to specify whether RPC endpoint supports block hash as block tag parameter + rpcSupportsBlockHashParam = true + + # GQL cache settings + [server.gqlCache] + enabled = true + + # Max in-memory cache size (in bytes) (default 8 MB) + # maxCacheSize + + # GQL cache-control max-age settings (in seconds) + maxAge = 15 + timeTravelMaxAge = 86400 # 1 day + +[metrics] + host = "127.0.0.1" + port = 9000 + [metrics.gql] + port = 9001 + +[database] + type = "postgres" + host = "localhost" + port = 5432 + database = "secured-finance-watcher-ts" + username = "postgres" + password = "postgres" + synchronize = true + logging = false + +[upstream] + [upstream.ethServer] + gqlApiEndpoint = "http://127.0.0.1:8082/graphql" + rpcProviderEndpoints = [ + "http://127.0.0.1:8081" + ] + + # Boolean flag to specify if rpc-eth-client should be used for RPC endpoint instead of ipld-eth-client (ipld-eth-server GQL client) + rpcClient = false + + # Boolean flag to specify if rpcProviderEndpoint is an FEVM RPC endpoint + isFEVM = false + + # Boolean flag to filter event logs by contracts + filterLogsByAddresses = true + # Boolean flag to filter event logs by topics + filterLogsByTopics = true + + [upstream.cache] + name = "requests" + enabled = false + deleteOnStart = false + +[jobQueue] + dbConnectionString = "postgres://postgres:postgres@localhost/secured-finance-watcher-ts-job-queue" + maxCompletionLagInSecs = 300 + jobDelayInMilliSecs = 100 + eventsInBatch = 50 + subgraphEventsOrder = true + blockDelayInMilliSecs = 2000 + + # Boolean to switch between modes of processing events when starting the server. + # Setting to true will fetch filtered events and required blocks in a range of blocks and then process them. + # Setting to false will fetch blocks consecutively with its events and then process them (Behaviour is followed in realtime processing near head). + useBlockRanges = true + + # Block range in which logs are fetched during historical blocks processing + historicalLogsBlockRange = 2000 + + # Max block range of historical processing after which it waits for completion of events processing + # If set to -1 historical processing does not wait for events processing and completes till latest canonical block + historicalMaxFetchAhead = 10000 + + # Max number of retries to fetch new block after which watcher will failover to other RPC endpoints + maxNewBlockRetries = 3 diff --git a/package.json b/package.json new file mode 100644 index 0000000..5cb68e3 --- /dev/null +++ b/package.json @@ -0,0 +1,76 @@ +{ + "name": "@cerc-io/secured-finance-watcher-ts", + "version": "0.1.0", + "description": "secured-finance-watcher-ts", + "private": true, + "main": "dist/index.js", + "scripts": { + "lint": "eslint --max-warnings=0 .", + "build": "yarn clean && tsc && yarn copy-assets", + "clean": "rm -rf ./dist", + "prepare": "husky install", + "copy-assets": "copyfiles -u 1 src/**/*.gql dist/", + "server": "DEBUG=vulcanize:* YARN_CHILD_PROCESS=true node --enable-source-maps dist/server.js", + "server:dev": "DEBUG=vulcanize:* YARN_CHILD_PROCESS=true ts-node src/server.ts", + "job-runner": "DEBUG=vulcanize:* YARN_CHILD_PROCESS=true node --enable-source-maps dist/job-runner.js", + "job-runner:dev": "DEBUG=vulcanize:* YARN_CHILD_PROCESS=true ts-node src/job-runner.ts", + "watch:contract": "DEBUG=vulcanize:* ts-node src/cli/watch-contract.ts", + "fill": "DEBUG=vulcanize:* ts-node src/fill.ts", + "fill:state": "DEBUG=vulcanize:* ts-node src/fill.ts --state", + "reset": "DEBUG=vulcanize:* ts-node src/cli/reset.ts", + "checkpoint": "DEBUG=vulcanize:* node --enable-source-maps dist/cli/checkpoint.js", + "checkpoint:dev": "DEBUG=vulcanize:* ts-node src/cli/checkpoint.ts", + "export-state": "DEBUG=vulcanize:* node --enable-source-maps dist/cli/export-state.js", + "export-state:dev": "DEBUG=vulcanize:* ts-node src/cli/export-state.ts", + "import-state": "DEBUG=vulcanize:* node --enable-source-maps dist/cli/import-state.js", + "import-state:dev": "DEBUG=vulcanize:* ts-node src/cli/import-state.ts", + "inspect-cid": "DEBUG=vulcanize:* ts-node src/cli/inspect-cid.ts", + "index-block": "DEBUG=vulcanize:* ts-node src/cli/index-block.ts" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/cerc-io/watcher-ts.git" + }, + "author": "", + "license": "AGPL-3.0", + "bugs": { + "url": "https://github.com/cerc-io/watcher-ts/issues" + }, + "homepage": "https://github.com/cerc-io/watcher-ts#readme", + "dependencies": { + "@apollo/client": "^3.3.19", + "@cerc-io/cli": "^0.2.90", + "@cerc-io/ipld-eth-client": "^0.2.90", + "@cerc-io/solidity-mapper": "^0.2.90", + "@cerc-io/util": "^0.2.90", + "@cerc-io/graph-node": "^0.2.90", + "@ethersproject/providers": "^5.4.4", + "debug": "^4.3.1", + "decimal.js": "^10.3.1", + "ethers": "^5.4.4", + "graphql": "^15.5.0", + "json-bigint": "^1.0.0", + "reflect-metadata": "^0.1.13", + "typeorm": "0.2.37", + "yargs": "^17.0.1" + }, + "devDependencies": { + "@ethersproject/abi": "^5.3.0", + "@types/debug": "^4.1.5", + "@types/json-bigint": "^1.0.0", + "@types/yargs": "^17.0.0", + "@typescript-eslint/eslint-plugin": "^5.47.1", + "@typescript-eslint/parser": "^5.47.1", + "copyfiles": "^2.4.1", + "eslint": "^8.35.0", + "eslint-config-semistandard": "^15.0.1", + "eslint-config-standard": "^16.0.3", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^5.1.0", + "eslint-plugin-standard": "^5.0.0", + "husky": "^7.0.2", + "ts-node": "^10.2.1", + "typescript": "^5.0.2" + } +} diff --git a/src/artifacts/Example.json b/src/artifacts/Example.json new file mode 100644 index 0000000..0ffa834 --- /dev/null +++ b/src/artifacts/Example.json @@ -0,0 +1,183 @@ +{ + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "param1", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "param2", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "param3", + "type": "uint256" + } + ], + "name": "Test", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint128", + "name": "bidAmount1", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "bidAmount2", + "type": "uint128" + } + ], + "name": "addMethod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "addressUintMap", + "outputs": [ + { + "internalType": "uint128", + "name": "", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "emitEvent", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getMethod", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint128", + "name": "bidAmount1", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "bidAmount2", + "type": "uint128" + } + ], + "name": "structMethod", + "outputs": [ + { + "components": [ + { + "internalType": "uint128", + "name": "bidAmount1", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "bidAmount2", + "type": "uint128" + } + ], + "internalType": "struct Example.Bid", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "storageLayout": { + "storage": [ + { + "astId": 3, + "contract": "Example.sol:Example", + "label": "_test", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 7, + "contract": "Example.sol:Example", + "label": "addressUintMap", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_uint128)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_uint128)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint128)", + "numberOfBytes": "32", + "value": "t_uint128" + }, + "t_uint128": { + "encoding": "inplace", + "label": "uint128", + "numberOfBytes": "16" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/src/artifacts/FundManagementLogic.json b/src/artifacts/FundManagementLogic.json new file mode 100644 index 0000000..87f332e --- /dev/null +++ b/src/artifacts/FundManagementLogic.json @@ -0,0 +1,800 @@ +{ + "abi": [ + { + "inputs": [], + "name": "AlreadyRedeemed", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientCollateral", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "MissingAddress", + "type": "error" + }, + { + "inputs": [], + "name": "NoRedemptionAmount", + "type": "error" + }, + { + "inputs": [], + "name": "NoRepaymentAmount", + "type": "error" + }, + { + "inputs": [], + "name": "NotRedemptionPeriod", + "type": "error" + }, + { + "inputs": [], + "name": "NotRepaymentPeriod", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "EmergencySettlementExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "enum ProtocolTypes.Side", + "name": "side", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountInFV", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "feeInFV", + "type": "uint256" + } + ], + "name": "OrderFilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint48", + "name": "orderId", + "type": "uint48" + }, + { + "indexed": true, + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "enum ProtocolTypes.Side", + "name": "side", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountInFV", + "type": "uint256" + } + ], + "name": "OrderPartiallyFilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "enum ProtocolTypes.Side", + "name": "side", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountInFV", + "type": "uint256" + } + ], + "name": "OrdersFilledInAsync", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "RedemptionExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "RepaymentExecuted", + "type": "event" + }, + { + "inputs": [], + "name": "BASE_MIN_DEBT_UNIT_PRICE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_maturity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_presentValue", + "type": "uint256" + } + ], + "name": "calculateFVFromPV", + "outputs": [ + { + "internalType": "uint256", + "name": "futureValue", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_maturity", + "type": "uint256" + }, + { + "internalType": "int256", + "name": "_presentValue", + "type": "int256" + } + ], + "name": "calculateFVFromPV", + "outputs": [ + { + "internalType": "int256", + "name": "futureValue", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "workingLendOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimableAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "workingBorrowOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "borrowedAmount", + "type": "uint256" + } + ], + "internalType": "struct ILendingMarketController.AdditionalFunds", + "name": "_additionalFunds", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_liquidationThresholdRate", + "type": "uint256" + } + ], + "name": "calculateFunds", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "workingLendOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimableAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "collateralAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unallocatedCollateralAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "workingBorrowOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "borrowedAmount", + "type": "uint256" + } + ], + "internalType": "struct ILendingMarketController.CalculatedFunds", + "name": "funds", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_maturity", + "type": "uint256" + }, + { + "internalType": "int256", + "name": "_futureValue", + "type": "int256" + } + ], + "name": "calculatePVFromFV", + "outputs": [ + { + "internalType": "int256", + "name": "presentValue", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "workingLendOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimableAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "workingBorrowOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "borrowedAmount", + "type": "uint256" + } + ], + "internalType": "struct ILendingMarketController.AdditionalFunds", + "name": "_additionalFunds", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_liquidationThresholdRate", + "type": "uint256" + } + ], + "name": "calculateTotalFundsInBaseCurrency", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "plusDepositAmountInAdditionalFundsCcy", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minusDepositAmountInAdditionalFundsCcy", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "workingLendOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimableAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "collateralAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "workingBorrowOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "borrowedAmount", + "type": "uint256" + } + ], + "internalType": "struct ILendingMarketController.CalculatedTotalFunds", + "name": "totalFunds", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_maturity", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minDebtUnitPrice", + "type": "uint256" + } + ], + "name": "getActualFunds", + "outputs": [ + { + "components": [ + { + "internalType": "int256", + "name": "presentValue", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "claimableAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtAmount", + "type": "uint256" + }, + { + "internalType": "int256", + "name": "futureValue", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "workingLendOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "workingBorrowOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "borrowedAmount", + "type": "uint256" + }, + { + "internalType": "int256", + "name": "genesisValue", + "type": "int256" + }, + { + "internalType": "int256", + "name": "genesisValueInPV", + "type": "int256" + }, + { + "internalType": "int256", + "name": "genesisValueInFV", + "type": "int256" + } + ], + "internalType": "struct FundManagementLogic.ActualFunds", + "name": "actualFunds", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_maturity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_minDebtUnitPrice", + "type": "uint256" + } + ], + "name": "getCurrentMinDebtUnitPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getGenesisValue", + "outputs": [ + { + "internalType": "int256", + "name": "amount", + "type": "int256" + }, + { + "internalType": "int256", + "name": "amountInPV", + "type": "int256" + }, + { + "internalType": "int256", + "name": "amountInFV", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_maturity", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getPosition", + "outputs": [ + { + "internalType": "int256", + "name": "presentValue", + "type": "int256" + }, + { + "internalType": "int256", + "name": "futureValue", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getUsedMaturities", + "outputs": [ + { + "internalType": "uint256[]", + "name": "maturities", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/src/artifacts/LendingMarketOperationLogic.json b/src/artifacts/LendingMarketOperationLogic.json new file mode 100644 index 0000000..33dc09a --- /dev/null +++ b/src/artifacts/LendingMarketOperationLogic.json @@ -0,0 +1,379 @@ +{ + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + } + ], + "name": "AlreadyZCTokenExists", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidCompoundFactor", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidCurrency", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + } + ], + "name": "InvalidMaturity", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidMinDebtUnitPrice", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidOpeningDate", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidPreOpeningDate", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidTimestamp", + "type": "error" + }, + { + "inputs": [], + "name": "LendingMarketNotInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "MissingAddress", + "type": "error" + }, + { + "inputs": [], + "name": "NotEnoughOrderBooks", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "internalType": "uint8", + "name": "decimals", + "type": "uint8" + } + ], + "name": "TooManyTokenDecimals", + "type": "error" + }, + { + "inputs": [], + "name": "ZcTokenIsZero", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "EmergencyTerminationExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "genesisDate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "compoundFactor", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "orderFeeRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "circuitBreakerLimitRange", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "lendingMarket", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "futureValueVault", + "type": "address" + } + ], + "name": "LendingMarketInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minDebtUnitPrice", + "type": "uint256" + } + ], + "name": "MinDebtUnitPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint8", + "name": "orderBookId", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "openingDate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "preOpeningDate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + } + ], + "name": "OrderBookCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldMaturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newMaturity", + "type": "uint256" + } + ], + "name": "OrderBooksRotated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "decimals", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "address", + "name": "tokenAddress", + "type": "address" + } + ], + "name": "ZCTokenCreated", + "type": "event" + }, + { + "inputs": [], + "name": "COMPOUND_FACTOR_DECIMALS", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "OBSERVATION_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PRE_ORDER_BASE_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ZC_TOKEN_BASE_DECIMALS", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_bytes32", + "type": "bytes32" + } + ], + "name": "bytes32ToString", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_period", + "type": "uint256" + } + ], + "name": "calculateNextMaturity", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/src/artifacts/LiquidationLogic.json b/src/artifacts/LiquidationLogic.json new file mode 100644 index 0000000..2963288 --- /dev/null +++ b/src/artifacts/LiquidationLogic.json @@ -0,0 +1,152 @@ +{ + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + } + ], + "name": "InvalidCurrency", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidLiquidation", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidOperationExecution", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "MissingAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + } + ], + "name": "NoDebt", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + } + ], + "name": "NoLiquidationAmount", + "type": "error" + }, + { + "inputs": [], + "name": "NotRepaymentPeriod", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "collateralCcy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "debtCcy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "debtMaturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "debtAmount", + "type": "uint256" + } + ], + "name": "ForcedRepaymentExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "collateralCcy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "debtCcy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "debtMaturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "debtAmount", + "type": "uint256" + } + ], + "name": "LiquidationExecuted", + "type": "event" + } + ] +} \ No newline at end of file diff --git a/src/artifacts/OrderActionLogic.json b/src/artifacts/OrderActionLogic.json new file mode 100644 index 0000000..297a106 --- /dev/null +++ b/src/artifacts/OrderActionLogic.json @@ -0,0 +1,359 @@ +{ + "abi": [ + { + "inputs": [], + "name": "EmptyOrderBook", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidFutureValue", + "type": "error" + }, + { + "inputs": [], + "name": "OppositeSideOrderExists", + "type": "error" + }, + { + "inputs": [], + "name": "PastMaturityOrderExists", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "blockUnitPrice", + "type": "uint256" + } + ], + "name": "BlockUnitPriceHistoryUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint48", + "name": "orderId", + "type": "uint48" + }, + { + "indexed": true, + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum ProtocolTypes.Side", + "name": "side", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unitPrice", + "type": "uint256" + } + ], + "name": "OrderCanceled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum ProtocolTypes.Side", + "name": "side", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "inputAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "inputUnitPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "filledAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "filledUnitPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "filledAmountInFV", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "feeInFV", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint48", + "name": "placedOrderId", + "type": "uint48" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "placedAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "placedUnitPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isCircuitBreakerTriggered", + "type": "bool" + } + ], + "name": "OrderExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint48[]", + "name": "orderIds", + "type": "uint48[]" + }, + { + "indexed": true, + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum ProtocolTypes.Side", + "name": "side", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "futureValue", + "type": "uint256" + } + ], + "name": "OrdersCleaned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum ProtocolTypes.Side", + "name": "side", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "inputFutureValue", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "filledAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "filledUnitPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "filledAmountInFV", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "feeInFV", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isCircuitBreakerTriggered", + "type": "bool" + } + ], + "name": "PositionUnwound", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum ProtocolTypes.Side", + "name": "side", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unitPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint48", + "name": "orderId", + "type": "uint48" + } + ], + "name": "PreOrderExecuted", + "type": "event" + } + ] +} \ No newline at end of file diff --git a/src/artifacts/OrderBookLogic.json b/src/artifacts/OrderBookLogic.json new file mode 100644 index 0000000..0b54c3e --- /dev/null +++ b/src/artifacts/OrderBookLogic.json @@ -0,0 +1,593 @@ +{ + "abi": [ + { + "inputs": [], + "name": "InvalidCircuitBreakerLimitRange", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidOrderFeeRate", + "type": "error" + }, + { + "inputs": [], + "name": "OrderBookNotMatured", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "previousRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rate", + "type": "uint256" + } + ], + "name": "CircuitBreakerLimitRangeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "openingUnitPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lastLendUnitPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lastBorrowUnitPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "offsetAmount", + "type": "uint256" + } + ], + "name": "ItayoseExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "orderBookId", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "openingDate", + "type": "uint256" + } + ], + "name": "OrderBookCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "previousRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rate", + "type": "uint256" + } + ], + "name": "OrderFeeRateUpdated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + } + ], + "name": "getBestBorrowUnitPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8[]", + "name": "_orderBookIds", + "type": "uint8[]" + } + ], + "name": "getBestBorrowUnitPrices", + "outputs": [ + { + "internalType": "uint256[]", + "name": "unitPrices", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + } + ], + "name": "getBestLendUnitPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8[]", + "name": "_orderBookIds", + "type": "uint8[]" + } + ], + "name": "getBestLendUnitPrices", + "outputs": [ + { + "internalType": "uint256[]", + "name": "unitPrices", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "_count", + "type": "uint256" + } + ], + "name": "getBlockUnitPriceAverage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + } + ], + "name": "getBlockUnitPriceHistory", + "outputs": [ + { + "internalType": "uint256[]", + "name": "unitPrices", + "type": "uint256[]" + }, + { + "internalType": "uint48", + "name": "timestamp", + "type": "uint48" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "_start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_limit", + "type": "uint256" + } + ], + "name": "getBorrowOrderBook", + "outputs": [ + { + "internalType": "uint256[]", + "name": "unitPrices", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "quantities", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "next", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + } + ], + "name": "getCircuitBreakerThresholds", + "outputs": [ + { + "internalType": "uint256", + "name": "maxLendUnitPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minBorrowUnitPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + } + ], + "name": "getItayoseEstimation", + "outputs": [ + { + "internalType": "uint256", + "name": "openingUnitPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastLendUnitPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastBorrowUnitPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalOffsetAmount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + } + ], + "name": "getLastOrderTimestamp", + "outputs": [ + { + "internalType": "uint48", + "name": "", + "type": "uint48" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "_start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_limit", + "type": "uint256" + } + ], + "name": "getLendOrderBook", + "outputs": [ + { + "internalType": "uint256[]", + "name": "unitPrices", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "quantities", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "next", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + } + ], + "name": "getMarketUnitPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8[]", + "name": "_orderBookIds", + "type": "uint8[]" + } + ], + "name": "getMaturities", + "outputs": [ + { + "internalType": "uint256[]", + "name": "maturities", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + } + ], + "name": "getOrderBookDetail", + "outputs": [ + { + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "openingDate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preOpeningDate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + } + ], + "name": "isItayosePeriod", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + } + ], + "name": "isMatured", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + } + ], + "name": "isOpened", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + } + ], + "name": "isPreOrderPeriod", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_orderBookId", + "type": "uint8" + } + ], + "name": "isReady", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/src/artifacts/TokenVault.json b/src/artifacts/TokenVault.json new file mode 100644 index 0000000..9d6ab0d --- /dev/null +++ b/src/artifacts/TokenVault.json @@ -0,0 +1,1732 @@ +{ + "abi": [ + { + "inputs": [], + "name": "AmountIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "CallerNotBaseCurrency", + "type": "error" + }, + { + "inputs": [], + "name": "CallerNotOperator", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "msgValue", + "type": "uint256" + } + ], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidCurrency", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidFullLiquidationThresholdRate", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidLiquidationProtocolFeeRate", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidLiquidationThresholdRate", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidLiquidatorFeeRate", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidToken", + "type": "error" + }, + { + "inputs": [], + "name": "MarketTerminated", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "MissingAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "NotAllowedAccess", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "OnlyAcceptedContract", + "type": "error" + }, + { + "inputs": [], + "name": "RedemptionIsRequired", + "type": "error" + }, + { + "inputs": [], + "name": "ResolverAlreadyRegistered", + "type": "error" + }, + { + "inputs": [], + "name": "UnregisteredCurrency", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "name", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "destination", + "type": "address" + } + ], + "name": "CacheUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isCollateral", + "type": "bool" + } + ], + "name": "CurrencyRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isCollateral", + "type": "bool" + } + ], + "name": "CurrencyUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "previousRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ratio", + "type": "uint256" + } + ], + "name": "FullLiquidationThresholdRateUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "previousRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ratio", + "type": "uint256" + } + ], + "name": "LiquidationProtocolFeeRateUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "previousRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ratio", + "type": "uint256" + } + ], + "name": "LiquidationThresholdRateUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "previousRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ratio", + "type": "uint256" + } + ], + "name": "LiquidatorFeeRateUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "OPERATOR_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addDepositAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + } + ], + "name": "addOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "buildCache", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "workingLendOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimableAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "workingBorrowOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "borrowedAmount", + "type": "uint256" + } + ], + "internalType": "struct ILendingMarketController.AdditionalFunds", + "name": "_additionalFunds", + "type": "tuple" + } + ], + "name": "calculateCoverage", + "outputs": [ + { + "internalType": "uint256", + "name": "coverage", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isInsufficientDepositAmount", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "calculateLiquidationFees", + "outputs": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidatorFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "cleanUpUsedCurrencies", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "depositFrom", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_onBehalfOf", + "type": "address" + } + ], + "name": "depositTo", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "_permitV", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "_permitR", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_permitS", + "type": "bytes32" + } + ], + "name": "depositWithPermitFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_onBehalfOf", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "_permitV", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "_permitR", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_permitS", + "type": "bytes32" + } + ], + "name": "depositWithPermitTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "executeForcedReset", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "getBorrowableAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "getCollateralAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCollateralCurrencies", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getCollateralDetail", + "outputs": [ + { + "internalType": "uint256", + "name": "totalCollateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalUsedCollateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDeposit", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getCoverage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "getDepositAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_liquidationCcy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_liquidationAmountMaximum", + "type": "uint256" + } + ], + "name": "getLiquidationAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "liquidationAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidatorFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLiquidationConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "liquidationThresholdRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "fullLiquidationThresholdRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidationProtocolFeeRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidatorFeeRate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLiquidationThresholdRate", + "outputs": [ + { + "internalType": "uint256", + "name": "rate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRevision", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "getTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getTotalCollateralAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "totalCollateralAmount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "getTotalDepositAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getTotalUnusedCollateralAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getUsedCurrencies", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getWithdrawableCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getWithdrawableCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_liquidationThresholdRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_fullLiquidationThresholdRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationProtocolFeeRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidatorFeeRate", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_nativeToken", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_ccys", + "type": "bytes32[]" + } + ], + "name": "isCollateral", + "outputs": [ + { + "internalType": "bool[]", + "name": "isCollateralCurrencies", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "isCollateral", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_orderCcy", + "type": "bytes32" + } + ], + "name": "isCovered", + "outputs": [ + { + "internalType": "bool", + "name": "isEnoughCollateral", + "type": "bool" + }, + { + "internalType": "bool", + "name": "isEnoughDepositInOrderCcy", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "isRegisteredCurrency", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isResolverCached", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "bool", + "name": "_isCollateral", + "type": "bool" + } + ], + "name": "registerCurrency", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeDepositAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + } + ], + "name": "removeOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "requiredContracts", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "contracts", + "type": "bytes32[]" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "resolver", + "outputs": [ + { + "internalType": "contract IAddressResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "uint256", + "name": "untransferredAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "_isCollateral", + "type": "bool" + } + ], + "name": "updateCurrency", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationThresholdRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_fullLiquidationThresholdRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationProtocolFeeRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidatorFeeRate", + "type": "uint256" + } + ], + "name": "updateLiquidationConfiguration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] +} \ No newline at end of file diff --git a/src/cli/checkpoint-cmds/create.ts b/src/cli/checkpoint-cmds/create.ts new file mode 100644 index 0000000..e771c70 --- /dev/null +++ b/src/cli/checkpoint-cmds/create.ts @@ -0,0 +1,44 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import { CreateCheckpointCmd } from '@cerc-io/cli'; +import { getGraphDbAndWatcher } from '@cerc-io/graph-node'; + +import { Database, ENTITY_QUERY_TYPE_MAP, ENTITY_TO_LATEST_ENTITY_MAP } from '../../database'; +import { Indexer } from '../../indexer'; + +export const command = 'create'; + +export const desc = 'Create checkpoint'; + +export const builder = { + address: { + type: 'string', + require: true, + demandOption: true, + describe: 'Contract address to create the checkpoint for.' + }, + blockHash: { + type: 'string', + describe: 'Blockhash at which to create the checkpoint.' + } +}; + +export const handler = async (argv: any): Promise => { + const createCheckpointCmd = new CreateCheckpointCmd(); + await createCheckpointCmd.init(argv, Database); + + const { graphWatcher } = await getGraphDbAndWatcher( + createCheckpointCmd.config.server, + createCheckpointCmd.clients.ethClient, + createCheckpointCmd.ethProvider, + createCheckpointCmd.database.baseDatabase, + ENTITY_QUERY_TYPE_MAP, + ENTITY_TO_LATEST_ENTITY_MAP + ); + + await createCheckpointCmd.initIndexer(Indexer, graphWatcher); + + await createCheckpointCmd.exec(); +}; diff --git a/src/cli/checkpoint-cmds/verify.ts b/src/cli/checkpoint-cmds/verify.ts new file mode 100644 index 0000000..3709f54 --- /dev/null +++ b/src/cli/checkpoint-cmds/verify.ts @@ -0,0 +1,40 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import { VerifyCheckpointCmd } from '@cerc-io/cli'; +import { getGraphDbAndWatcher } from '@cerc-io/graph-node'; + +import { Database, ENTITY_QUERY_TYPE_MAP, ENTITY_TO_LATEST_ENTITY_MAP } from '../../database'; +import { Indexer } from '../../indexer'; + +export const command = 'verify'; + +export const desc = 'Verify checkpoint'; + +export const builder = { + cid: { + type: 'string', + alias: 'c', + demandOption: true, + describe: 'Checkpoint CID to be verified' + } +}; + +export const handler = async (argv: any): Promise => { + const verifyCheckpointCmd = new VerifyCheckpointCmd(); + await verifyCheckpointCmd.init(argv, Database); + + const { graphWatcher, graphDb } = await getGraphDbAndWatcher( + verifyCheckpointCmd.config.server, + verifyCheckpointCmd.clients.ethClient, + verifyCheckpointCmd.ethProvider, + verifyCheckpointCmd.database.baseDatabase, + ENTITY_QUERY_TYPE_MAP, + ENTITY_TO_LATEST_ENTITY_MAP + ); + + await verifyCheckpointCmd.initIndexer(Indexer, graphWatcher); + + await verifyCheckpointCmd.exec(graphDb); +}; diff --git a/src/cli/checkpoint.ts b/src/cli/checkpoint.ts new file mode 100644 index 0000000..d05ad8a --- /dev/null +++ b/src/cli/checkpoint.ts @@ -0,0 +1,39 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import yargs from 'yargs'; +import 'reflect-metadata'; +import debug from 'debug'; + +import { DEFAULT_CONFIG_PATH } from '@cerc-io/util'; + +import { hideBin } from 'yargs/helpers'; + +const log = debug('vulcanize:checkpoint'); + +const main = async () => { + return yargs(hideBin(process.argv)) + .parserConfiguration({ + 'parse-numbers': false + }).options({ + configFile: { + alias: 'f', + type: 'string', + require: true, + demandOption: true, + describe: 'configuration file path (toml)', + default: DEFAULT_CONFIG_PATH + } + }) + .commandDir('checkpoint-cmds', { extensions: ['ts', 'js'], exclude: /([a-zA-Z0-9\s_\\.\-:])+(.d.ts)$/ }) + .demandCommand(1) + .help() + .argv; +}; + +main().then(() => { + process.exit(); +}).catch(err => { + log(err); +}); diff --git a/src/cli/export-state.ts b/src/cli/export-state.ts new file mode 100644 index 0000000..bcd1c8a --- /dev/null +++ b/src/cli/export-state.ts @@ -0,0 +1,38 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import 'reflect-metadata'; +import debug from 'debug'; + +import { ExportStateCmd } from '@cerc-io/cli'; +import { getGraphDbAndWatcher } from '@cerc-io/graph-node'; + +import { Database, ENTITY_QUERY_TYPE_MAP, ENTITY_TO_LATEST_ENTITY_MAP } from '../database'; +import { Indexer } from '../indexer'; + +const log = debug('vulcanize:export-state'); + +const main = async (): Promise => { + const exportStateCmd = new ExportStateCmd(); + await exportStateCmd.init(Database); + + const { graphWatcher } = await getGraphDbAndWatcher( + exportStateCmd.config.server, + exportStateCmd.clients.ethClient, + exportStateCmd.ethProvider, + exportStateCmd.database.baseDatabase, + ENTITY_QUERY_TYPE_MAP, + ENTITY_TO_LATEST_ENTITY_MAP + ); + + await exportStateCmd.initIndexer(Indexer, graphWatcher); + + await exportStateCmd.exec(); +}; + +main().catch(err => { + log(err); +}).finally(() => { + process.exit(0); +}); diff --git a/src/cli/import-state.ts b/src/cli/import-state.ts new file mode 100644 index 0000000..04ce0e8 --- /dev/null +++ b/src/cli/import-state.ts @@ -0,0 +1,39 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import 'reflect-metadata'; +import debug from 'debug'; + +import { ImportStateCmd } from '@cerc-io/cli'; +import { getGraphDbAndWatcher } from '@cerc-io/graph-node'; + +import { Database, ENTITY_QUERY_TYPE_MAP, ENTITY_TO_LATEST_ENTITY_MAP } from '../database'; +import { Indexer } from '../indexer'; +import { State } from '../entity/State'; + +const log = debug('vulcanize:import-state'); + +export const main = async (): Promise => { + const importStateCmd = new ImportStateCmd(); + await importStateCmd.init(Database); + + const { graphWatcher, graphDb } = await getGraphDbAndWatcher( + importStateCmd.config.server, + importStateCmd.clients.ethClient, + importStateCmd.ethProvider, + importStateCmd.database.baseDatabase, + ENTITY_QUERY_TYPE_MAP, + ENTITY_TO_LATEST_ENTITY_MAP + ); + + await importStateCmd.initIndexer(Indexer, graphWatcher); + + await importStateCmd.exec(State, graphDb); +}; + +main().catch(err => { + log(err); +}).finally(() => { + process.exit(0); +}); diff --git a/src/cli/index-block.ts b/src/cli/index-block.ts new file mode 100644 index 0000000..19a302a --- /dev/null +++ b/src/cli/index-block.ts @@ -0,0 +1,38 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import 'reflect-metadata'; +import debug from 'debug'; + +import { IndexBlockCmd } from '@cerc-io/cli'; +import { getGraphDbAndWatcher } from '@cerc-io/graph-node'; + +import { Database, ENTITY_QUERY_TYPE_MAP, ENTITY_TO_LATEST_ENTITY_MAP } from '../database'; +import { Indexer } from '../indexer'; + +const log = debug('vulcanize:index-block'); + +const main = async (): Promise => { + const indexBlockCmd = new IndexBlockCmd(); + await indexBlockCmd.init(Database); + + const { graphWatcher } = await getGraphDbAndWatcher( + indexBlockCmd.config.server, + indexBlockCmd.clients.ethClient, + indexBlockCmd.ethProvider, + indexBlockCmd.database.baseDatabase, + ENTITY_QUERY_TYPE_MAP, + ENTITY_TO_LATEST_ENTITY_MAP + ); + + await indexBlockCmd.initIndexer(Indexer, graphWatcher); + + await indexBlockCmd.exec(); +}; + +main().catch(err => { + log(err); +}).finally(() => { + process.exit(0); +}); diff --git a/src/cli/inspect-cid.ts b/src/cli/inspect-cid.ts new file mode 100644 index 0000000..4f5955e --- /dev/null +++ b/src/cli/inspect-cid.ts @@ -0,0 +1,38 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import 'reflect-metadata'; +import debug from 'debug'; + +import { InspectCIDCmd } from '@cerc-io/cli'; +import { getGraphDbAndWatcher } from '@cerc-io/graph-node'; + +import { Database, ENTITY_QUERY_TYPE_MAP, ENTITY_TO_LATEST_ENTITY_MAP } from '../database'; +import { Indexer } from '../indexer'; + +const log = debug('vulcanize:inspect-cid'); + +const main = async (): Promise => { + const inspectCIDCmd = new InspectCIDCmd(); + await inspectCIDCmd.init(Database); + + const { graphWatcher } = await getGraphDbAndWatcher( + inspectCIDCmd.config.server, + inspectCIDCmd.clients.ethClient, + inspectCIDCmd.ethProvider, + inspectCIDCmd.database.baseDatabase, + ENTITY_QUERY_TYPE_MAP, + ENTITY_TO_LATEST_ENTITY_MAP + ); + + await inspectCIDCmd.initIndexer(Indexer, graphWatcher); + + await inspectCIDCmd.exec(); +}; + +main().catch(err => { + log(err); +}).finally(() => { + process.exit(0); +}); diff --git a/src/cli/reset-cmds/job-queue.ts b/src/cli/reset-cmds/job-queue.ts new file mode 100644 index 0000000..c33cbfd --- /dev/null +++ b/src/cli/reset-cmds/job-queue.ts @@ -0,0 +1,22 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import debug from 'debug'; + +import { getConfig, resetJobs, Config } from '@cerc-io/util'; + +const log = debug('vulcanize:reset-job-queue'); + +export const command = 'job-queue'; + +export const desc = 'Reset job queue'; + +export const builder = {}; + +export const handler = async (argv: any): Promise => { + const config: Config = await getConfig(argv.configFile); + await resetJobs(config); + + log('Job queue reset successfully'); +}; diff --git a/src/cli/reset-cmds/state.ts b/src/cli/reset-cmds/state.ts new file mode 100644 index 0000000..33211d6 --- /dev/null +++ b/src/cli/reset-cmds/state.ts @@ -0,0 +1,24 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import { ResetStateCmd } from '@cerc-io/cli'; + +import { Database } from '../../database'; + +export const command = 'state'; + +export const desc = 'Reset State to a given block number'; + +export const builder = { + blockNumber: { + type: 'number' + } +}; + +export const handler = async (argv: any): Promise => { + const resetStateCmd = new ResetStateCmd(); + await resetStateCmd.init(argv, Database); + + await resetStateCmd.exec(); +}; diff --git a/src/cli/reset-cmds/watcher.ts b/src/cli/reset-cmds/watcher.ts new file mode 100644 index 0000000..827fd28 --- /dev/null +++ b/src/cli/reset-cmds/watcher.ts @@ -0,0 +1,37 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { ResetWatcherCmd } from '@cerc-io/cli'; +import { getGraphDbAndWatcher } from '@cerc-io/graph-node'; + +import { Database, ENTITY_QUERY_TYPE_MAP, ENTITY_TO_LATEST_ENTITY_MAP } from '../../database'; +import { Indexer } from '../../indexer'; + +export const command = 'watcher'; + +export const desc = 'Reset watcher to a block number'; + +export const builder = { + blockNumber: { + type: 'number' + } +}; + +export const handler = async (argv: any): Promise => { + const resetWatcherCmd = new ResetWatcherCmd(); + await resetWatcherCmd.init(argv, Database); + + const { graphWatcher } = await getGraphDbAndWatcher( + resetWatcherCmd.config.server, + resetWatcherCmd.clients.ethClient, + resetWatcherCmd.ethProvider, + resetWatcherCmd.database.baseDatabase, + ENTITY_QUERY_TYPE_MAP, + ENTITY_TO_LATEST_ENTITY_MAP + ); + + await resetWatcherCmd.initIndexer(Indexer, graphWatcher); + + await resetWatcherCmd.exec(); +}; diff --git a/src/cli/reset.ts b/src/cli/reset.ts new file mode 100644 index 0000000..95648c8 --- /dev/null +++ b/src/cli/reset.ts @@ -0,0 +1,24 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import 'reflect-metadata'; +import debug from 'debug'; + +import { getResetYargs } from '@cerc-io/util'; + +const log = debug('vulcanize:reset'); + +const main = async () => { + return getResetYargs() + .commandDir('reset-cmds', { extensions: ['ts', 'js'], exclude: /([a-zA-Z0-9\s_\\.\-:])+(.d.ts)$/ }) + .demandCommand(1) + .help() + .argv; +}; + +main().then(() => { + process.exit(); +}).catch(err => { + log(err); +}); diff --git a/src/cli/watch-contract.ts b/src/cli/watch-contract.ts new file mode 100644 index 0000000..7d6ce1a --- /dev/null +++ b/src/cli/watch-contract.ts @@ -0,0 +1,38 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import 'reflect-metadata'; +import debug from 'debug'; + +import { WatchContractCmd } from '@cerc-io/cli'; +import { getGraphDbAndWatcher } from '@cerc-io/graph-node'; + +import { Database, ENTITY_QUERY_TYPE_MAP, ENTITY_TO_LATEST_ENTITY_MAP } from '../database'; +import { Indexer } from '../indexer'; + +const log = debug('vulcanize:watch-contract'); + +const main = async (): Promise => { + const watchContractCmd = new WatchContractCmd(); + await watchContractCmd.init(Database); + + const { graphWatcher } = await getGraphDbAndWatcher( + watchContractCmd.config.server, + watchContractCmd.clients.ethClient, + watchContractCmd.ethProvider, + watchContractCmd.database.baseDatabase, + ENTITY_QUERY_TYPE_MAP, + ENTITY_TO_LATEST_ENTITY_MAP + ); + + await watchContractCmd.initIndexer(Indexer, graphWatcher); + + await watchContractCmd.exec(); +}; + +main().catch(err => { + log(err); +}).finally(() => { + process.exit(0); +}); diff --git a/src/client.ts b/src/client.ts new file mode 100644 index 0000000..8bb2bb0 --- /dev/null +++ b/src/client.ts @@ -0,0 +1,55 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { gql } from '@apollo/client/core'; +import { GraphQLClient, GraphQLConfig } from '@cerc-io/ipld-eth-client'; + +import { queries, mutations, subscriptions } from './gql'; + +export class Client { + _config: GraphQLConfig; + _client: GraphQLClient; + + constructor (config: GraphQLConfig) { + this._config = config; + + this._client = new GraphQLClient(config); + } + + async getEvents (blockHash: string, contractAddress: string, name: string): Promise { + const { events } = await this._client.query( + gql(queries.events), + { blockHash, contractAddress, name } + ); + + return events; + } + + async getEventsInRange (fromBlockNumber: number, toBlockNumber: number): Promise { + const { eventsInRange } = await this._client.query( + gql(queries.eventsInRange), + { fromBlockNumber, toBlockNumber } + ); + + return eventsInRange; + } + + async watchContract (contractAddress: string, startingBlock?: number): Promise { + const { watchContract } = await this._client.mutate( + gql(mutations.watchContract), + { contractAddress, startingBlock } + ); + + return watchContract; + } + + async watchEvents (onNext: (value: any) => void): Promise { + return this._client.subscribe( + gql(subscriptions.onEvent), + ({ data }) => { + onNext(data.onEvent); + } + ); + } +} diff --git a/src/database.ts b/src/database.ts new file mode 100644 index 0000000..4e103b5 --- /dev/null +++ b/src/database.ts @@ -0,0 +1,294 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import assert from 'assert'; +import { Connection, ConnectionOptions, DeepPartial, FindConditions, QueryRunner, FindManyOptions, EntityTarget } from 'typeorm'; +import path from 'path'; + +import { + ENTITY_QUERY_TYPE, + Database as BaseDatabase, + DatabaseInterface, + QueryOptions, + StateKind, + Where +} from '@cerc-io/util'; + +import { Contract } from './entity/Contract'; +import { Event } from './entity/Event'; +import { SyncStatus } from './entity/SyncStatus'; +import { StateSyncStatus } from './entity/StateSyncStatus'; +import { BlockProgress } from './entity/BlockProgress'; +import { State } from './entity/State'; +import { Transaction } from './entity/Transaction'; +import { Order } from './entity/Order'; +import { LendingMarket } from './entity/LendingMarket'; +import { User } from './entity/User'; +import { DailyVolume } from './entity/DailyVolume'; +import { Protocol } from './entity/Protocol'; +import { Liquidation } from './entity/Liquidation'; +import { Transfer } from './entity/Transfer'; +import { Deposit } from './entity/Deposit'; +import { TransactionCandleStick } from './entity/TransactionCandleStick'; + +export const SUBGRAPH_ENTITIES = new Set([Transaction, Order, LendingMarket, User, DailyVolume, Protocol, Liquidation, Transfer, Deposit, TransactionCandleStick]); +export const ENTITIES = [...SUBGRAPH_ENTITIES]; +// Map: Entity to suitable query type. +export const ENTITY_QUERY_TYPE_MAP = new Map any, ENTITY_QUERY_TYPE>([]); + +export const ENTITY_TO_LATEST_ENTITY_MAP: Map = new Map(); + +export class Database implements DatabaseInterface { + _config: ConnectionOptions; + _conn!: Connection; + _baseDatabase: BaseDatabase; + _propColMaps: { [key: string]: Map; }; + + constructor (config: ConnectionOptions) { + assert(config); + + this._config = { + ...config, + subscribers: [path.join(__dirname, 'entity/Subscriber.*')], + entities: [path.join(__dirname, 'entity/*')] + }; + + this._baseDatabase = new BaseDatabase(this._config); + this._propColMaps = {}; + } + + get baseDatabase (): BaseDatabase { + return this._baseDatabase; + } + + async init (): Promise { + this._conn = await this._baseDatabase.init(); + } + + async close (): Promise { + return this._baseDatabase.close(); + } + + getNewState (): State { + return new State(); + } + + async getStates (where: FindConditions): Promise { + const repo = this._conn.getRepository(State); + + return this._baseDatabase.getStates(repo, where); + } + + async getLatestState (contractAddress: string, kind: StateKind | null, blockNumber?: number): Promise { + const repo = this._conn.getRepository(State); + + return this._baseDatabase.getLatestState(repo, contractAddress, kind, blockNumber); + } + + async getPrevState (blockHash: string, contractAddress: string, kind?: string): Promise { + const repo = this._conn.getRepository(State); + + return this._baseDatabase.getPrevState(repo, blockHash, contractAddress, kind); + } + + // Fetch all diff States after the specified block number. + async getDiffStatesInRange (contractAddress: string, startblock: number, endBlock: number): Promise { + const repo = this._conn.getRepository(State); + + return this._baseDatabase.getDiffStatesInRange(repo, contractAddress, startblock, endBlock); + } + + async saveOrUpdateState (dbTx: QueryRunner, state: State): Promise { + const repo = dbTx.manager.getRepository(State); + + return this._baseDatabase.saveOrUpdateState(repo, state); + } + + async removeStates (dbTx: QueryRunner, blockNumber: number, kind: string): Promise { + const repo = dbTx.manager.getRepository(State); + + await this._baseDatabase.removeStates(repo, blockNumber, kind); + } + + async removeStatesAfterBlock (dbTx: QueryRunner, blockNumber: number): Promise { + const repo = dbTx.manager.getRepository(State); + + await this._baseDatabase.removeStatesAfterBlock(repo, blockNumber); + } + + async getStateSyncStatus (): Promise { + const repo = this._conn.getRepository(StateSyncStatus); + + return this._baseDatabase.getStateSyncStatus(repo); + } + + async updateStateSyncStatusIndexedBlock (queryRunner: QueryRunner, blockNumber: number, force?: boolean): Promise { + const repo = queryRunner.manager.getRepository(StateSyncStatus); + + return this._baseDatabase.updateStateSyncStatusIndexedBlock(repo, blockNumber, force); + } + + async updateStateSyncStatusCheckpointBlock (queryRunner: QueryRunner, blockNumber: number, force?: boolean): Promise { + const repo = queryRunner.manager.getRepository(StateSyncStatus); + + return this._baseDatabase.updateStateSyncStatusCheckpointBlock(repo, blockNumber, force); + } + + async getContracts (): Promise { + const repo = this._conn.getRepository(Contract); + + return this._baseDatabase.getContracts(repo); + } + + async createTransactionRunner (): Promise { + return this._baseDatabase.createTransactionRunner(); + } + + async getProcessedBlockCountForRange (fromBlockNumber: number, toBlockNumber: number): Promise<{ expected: number, actual: number }> { + const repo = this._conn.getRepository(BlockProgress); + + return this._baseDatabase.getProcessedBlockCountForRange(repo, fromBlockNumber, toBlockNumber); + } + + async getEventsInRange (fromBlockNumber: number, toBlockNumber: number): Promise> { + const repo = this._conn.getRepository(Event); + + return this._baseDatabase.getEventsInRange(repo, fromBlockNumber, toBlockNumber); + } + + async saveEventEntity (queryRunner: QueryRunner, entity: Event): Promise { + const repo = queryRunner.manager.getRepository(Event); + return this._baseDatabase.saveEventEntity(repo, entity); + } + + async getBlockEvents (blockHash: string, where: Where, queryOptions: QueryOptions): Promise { + const repo = this._conn.getRepository(Event); + + return this._baseDatabase.getBlockEvents(repo, blockHash, where, queryOptions); + } + + async saveBlockWithEvents (queryRunner: QueryRunner, block: DeepPartial, events: DeepPartial[]): Promise { + const blockRepo = queryRunner.manager.getRepository(BlockProgress); + const eventRepo = queryRunner.manager.getRepository(Event); + + return this._baseDatabase.saveBlockWithEvents(blockRepo, eventRepo, block, events); + } + + async saveEvents (queryRunner: QueryRunner, events: Event[]): Promise { + const eventRepo = queryRunner.manager.getRepository(Event); + + return this._baseDatabase.saveEvents(eventRepo, events); + } + + async saveBlockProgress (queryRunner: QueryRunner, block: DeepPartial): Promise { + const repo = queryRunner.manager.getRepository(BlockProgress); + + return this._baseDatabase.saveBlockProgress(repo, block); + } + + async saveContract (queryRunner: QueryRunner, address: string, kind: string, checkpoint: boolean, startingBlock: number, context?: any): Promise { + const repo = queryRunner.manager.getRepository(Contract); + + return this._baseDatabase.saveContract(repo, address, kind, checkpoint, startingBlock, context); + } + + async updateSyncStatusIndexedBlock (queryRunner: QueryRunner, blockHash: string, blockNumber: number, force = false): Promise { + const repo = queryRunner.manager.getRepository(SyncStatus); + + return this._baseDatabase.updateSyncStatusIndexedBlock(repo, blockHash, blockNumber, force); + } + + async updateSyncStatusCanonicalBlock (queryRunner: QueryRunner, blockHash: string, blockNumber: number, force = false): Promise { + const repo = queryRunner.manager.getRepository(SyncStatus); + + return this._baseDatabase.updateSyncStatusCanonicalBlock(repo, blockHash, blockNumber, force); + } + + async updateSyncStatusChainHead (queryRunner: QueryRunner, blockHash: string, blockNumber: number, force = false): Promise { + const repo = queryRunner.manager.getRepository(SyncStatus); + + return this._baseDatabase.updateSyncStatusChainHead(repo, blockHash, blockNumber, force); + } + + async updateSyncStatusProcessedBlock (queryRunner: QueryRunner, blockHash: string, blockNumber: number, force = false): Promise { + const repo = queryRunner.manager.getRepository(SyncStatus); + + return this._baseDatabase.updateSyncStatusProcessedBlock(repo, blockHash, blockNumber, force); + } + + async updateSyncStatusIndexingError (queryRunner: QueryRunner, hasIndexingError: boolean): Promise { + const repo = queryRunner.manager.getRepository(SyncStatus); + + return this._baseDatabase.updateSyncStatusIndexingError(repo, hasIndexingError); + } + + async updateSyncStatus (queryRunner: QueryRunner, syncStatus: DeepPartial): Promise { + const repo = queryRunner.manager.getRepository(SyncStatus); + + return this._baseDatabase.updateSyncStatus(repo, syncStatus); + } + + async getSyncStatus (queryRunner: QueryRunner): Promise { + const repo = queryRunner.manager.getRepository(SyncStatus); + + return this._baseDatabase.getSyncStatus(repo); + } + + async getEvent (id: string): Promise { + const repo = this._conn.getRepository(Event); + + return this._baseDatabase.getEvent(repo, id); + } + + async getBlocksAtHeight (height: number, isPruned: boolean): Promise { + const repo = this._conn.getRepository(BlockProgress); + + return this._baseDatabase.getBlocksAtHeight(repo, height, isPruned); + } + + async markBlocksAsPruned (queryRunner: QueryRunner, blocks: BlockProgress[]): Promise { + const repo = queryRunner.manager.getRepository(BlockProgress); + + return this._baseDatabase.markBlocksAsPruned(repo, blocks); + } + + async getBlockProgress (blockHash: string): Promise { + const repo = this._conn.getRepository(BlockProgress); + return this._baseDatabase.getBlockProgress(repo, blockHash); + } + + async getBlockProgressEntities (where: FindConditions, options: FindManyOptions): Promise { + const repo = this._conn.getRepository(BlockProgress); + + return this._baseDatabase.getBlockProgressEntities(repo, where, options); + } + + async getEntitiesForBlock (blockHash: string, tableName: string): Promise { + return this._baseDatabase.getEntitiesForBlock(blockHash, tableName); + } + + async updateBlockProgress (queryRunner: QueryRunner, block: BlockProgress, lastProcessedEventIndex: number): Promise { + const repo = queryRunner.manager.getRepository(BlockProgress); + + return this._baseDatabase.updateBlockProgress(repo, block, lastProcessedEventIndex); + } + + async removeEntities (queryRunner: QueryRunner, entity: new () => Entity, findConditions?: FindManyOptions | FindConditions): Promise { + return this._baseDatabase.removeEntities(queryRunner, entity, findConditions); + } + + async deleteEntitiesByConditions (queryRunner: QueryRunner, entity: EntityTarget, findConditions: FindConditions): Promise { + await this._baseDatabase.deleteEntitiesByConditions(queryRunner, entity, findConditions); + } + + async getAncestorAtHeight (blockHash: string, height: number): Promise { + return this._baseDatabase.getAncestorAtHeight(blockHash, height); + } + + _getPropertyColumnMapForEntity (entityName: string): Map { + return this._conn.getMetadata(entityName).ownColumns.reduce((acc, curr) => { + return acc.set(curr.propertyName, curr.databaseName); + }, new Map()); + } +} diff --git a/src/entity/BlockProgress.ts b/src/entity/BlockProgress.ts new file mode 100644 index 0000000..ded4a86 --- /dev/null +++ b/src/entity/BlockProgress.ts @@ -0,0 +1,48 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index, CreateDateColumn } from 'typeorm'; +import { BlockProgressInterface } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash'], { unique: true }) +@Index(['blockNumber']) +@Index(['parentHash']) +export class BlockProgress implements BlockProgressInterface { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { nullable: true }) + cid!: string | null; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('varchar', { length: 66 }) + parentHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('integer') + blockTimestamp!: number; + + @Column('integer') + numEvents!: number; + + @Column('integer') + numProcessedEvents!: number; + + @Column('integer') + lastProcessedEventIndex!: number; + + @Column('boolean') + isComplete!: boolean; + + @Column('boolean', { default: false }) + isPruned!: boolean; + + @CreateDateColumn() + createdAt!: Date; +} diff --git a/src/entity/Contract.ts b/src/entity/Contract.ts new file mode 100644 index 0000000..e4defa8 --- /dev/null +++ b/src/entity/Contract.ts @@ -0,0 +1,27 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['address'], { unique: true }) +export class Contract { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 42 }) + address!: string; + + @Column('varchar') + kind!: string; + + @Column('boolean') + checkpoint!: boolean; + + @Column('integer') + startingBlock!: number; + + @Column('jsonb', { nullable: true }) + context!: Record; +} diff --git a/src/entity/DailyVolume.ts b/src/entity/DailyVolume.ts new file mode 100644 index 0000000..2a3b81e --- /dev/null +++ b/src/entity/DailyVolume.ts @@ -0,0 +1,43 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockNumber']) +export class DailyVolume { + @PrimaryColumn('varchar') + id!: string; + + @PrimaryColumn('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar') + currency!: string; + + @Column('numeric', { transformer: bigintTransformer }) + maturity!: bigint; + + @Column('varchar') + day!: string; + + @Column('numeric', { transformer: bigintTransformer }) + volume!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + timestamp!: bigint; + + @Column('varchar') + lendingMarket!: string; + + @Column('boolean', { default: false }) + isPruned!: boolean; + + @Column('boolean', { default: false }) + isRemoved!: boolean; +} diff --git a/src/entity/Deposit.ts b/src/entity/Deposit.ts new file mode 100644 index 0000000..37245f0 --- /dev/null +++ b/src/entity/Deposit.ts @@ -0,0 +1,34 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockNumber']) +export class Deposit { + @PrimaryColumn('varchar') + id!: string; + + @PrimaryColumn('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar') + user!: string; + + @Column('varchar') + currency!: string; + + @Column('numeric', { transformer: bigintTransformer }) + amount!: bigint; + + @Column('boolean', { default: false }) + isPruned!: boolean; + + @Column('boolean', { default: false }) + isRemoved!: boolean; +} diff --git a/src/entity/Event.ts b/src/entity/Event.ts new file mode 100644 index 0000000..91f1e6d --- /dev/null +++ b/src/entity/Event.ts @@ -0,0 +1,38 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index, ManyToOne } from 'typeorm'; +import { BlockProgress } from './BlockProgress'; + +@Entity() +@Index(['block', 'contract']) +@Index(['block', 'contract', 'eventName']) +export class Event { + @PrimaryGeneratedColumn() + id!: number; + + @ManyToOne(() => BlockProgress, { onDelete: 'CASCADE' }) + block!: BlockProgress; + + @Column('varchar', { length: 66 }) + txHash!: string; + + @Column('integer') + index!: number; + + @Column('varchar', { length: 42 }) + contract!: string; + + @Column('varchar', { length: 256 }) + eventName!: string; + + @Column('text') + eventInfo!: string; + + @Column('text') + extraInfo!: string; + + @Column('text') + proof!: string; +} diff --git a/src/entity/FrothyEntity.ts b/src/entity/FrothyEntity.ts new file mode 100644 index 0000000..9898ce8 --- /dev/null +++ b/src/entity/FrothyEntity.ts @@ -0,0 +1,21 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockNumber']) +export class FrothyEntity { + @PrimaryColumn('varchar') + id!: string; + + @PrimaryColumn('varchar') + name!: string; + + @PrimaryColumn('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; +} diff --git a/src/entity/LendingMarket.ts b/src/entity/LendingMarket.ts new file mode 100644 index 0000000..f176a29 --- /dev/null +++ b/src/entity/LendingMarket.ts @@ -0,0 +1,49 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockNumber']) +export class LendingMarket { + @PrimaryColumn('varchar') + id!: string; + + @PrimaryColumn('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar') + currency!: string; + + @Column('numeric', { transformer: bigintTransformer }) + maturity!: bigint; + + @Column('boolean') + isActive!: boolean; + + @Column('numeric', { transformer: bigintTransformer }) + volume!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + openingUnitPrice!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + lastLendUnitPrice!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + lastBorrowUnitPrice!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + offsetAmount!: bigint; + + @Column('boolean', { default: false }) + isPruned!: boolean; + + @Column('boolean', { default: false }) + isRemoved!: boolean; +} diff --git a/src/entity/Liquidation.ts b/src/entity/Liquidation.ts new file mode 100644 index 0000000..5b3d0f5 --- /dev/null +++ b/src/entity/Liquidation.ts @@ -0,0 +1,49 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockNumber']) +export class Liquidation { + @PrimaryColumn('varchar') + id!: string; + + @PrimaryColumn('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar') + collateralCurrency!: string; + + @Column('varchar') + debtCurrency!: string; + + @Column('numeric', { transformer: bigintTransformer }) + debtMaturity!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + debtAmount!: bigint; + + @Column('varchar') + user!: string; + + @Column('numeric', { transformer: bigintTransformer }) + timestamp!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + _blockNumber!: bigint; + + @Column('varchar') + txHash!: string; + + @Column('boolean', { default: false }) + isPruned!: boolean; + + @Column('boolean', { default: false }) + isRemoved!: boolean; +} diff --git a/src/entity/Order.ts b/src/entity/Order.ts new file mode 100644 index 0000000..86ab707 --- /dev/null +++ b/src/entity/Order.ts @@ -0,0 +1,77 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryColumn, Column, Index } from 'typeorm'; +import { OrderStatus, OrderType } from '../types'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockNumber']) +export class Order { + @PrimaryColumn('varchar') + id!: string; + + @PrimaryColumn('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('numeric', { transformer: bigintTransformer }) + orderId!: bigint; + + @Column('varchar') + user!: string; + + @Column('varchar') + currency!: string; + + @Column('integer') + side!: number; + + @Column('numeric', { transformer: bigintTransformer }) + maturity!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + inputUnitPrice!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + inputAmount!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + filledAmount!: bigint; + + @Column({ type: 'enum', enum: OrderStatus }) + status!: OrderStatus; + + @Column('numeric', { transformer: bigintTransformer }) + statusUpdatedAt!: bigint; + + @Column('varchar') + lendingMarket!: string; + + @Column('boolean') + isPreOrder!: boolean; + + @Column({ type: 'enum', enum: OrderType }) + type!: OrderType; + + @Column('boolean') + isCircuitBreakerTriggered!: boolean; + + @Column('numeric', { transformer: bigintTransformer }) + createdAt!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + _blockNumber!: bigint; + + @Column('varchar') + txHash!: string; + + @Column('boolean', { default: false }) + isPruned!: boolean; + + @Column('boolean', { default: false }) + isRemoved!: boolean; +} diff --git a/src/entity/Protocol.ts b/src/entity/Protocol.ts new file mode 100644 index 0000000..33efb7b --- /dev/null +++ b/src/entity/Protocol.ts @@ -0,0 +1,28 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockNumber']) +export class Protocol { + @PrimaryColumn('varchar') + id!: string; + + @PrimaryColumn('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('numeric', { transformer: bigintTransformer }) + totalUsers!: bigint; + + @Column('boolean', { default: false }) + isPruned!: boolean; + + @Column('boolean', { default: false }) + isRemoved!: boolean; +} diff --git a/src/entity/State.ts b/src/entity/State.ts new file mode 100644 index 0000000..bc05bca --- /dev/null +++ b/src/entity/State.ts @@ -0,0 +1,31 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index, ManyToOne } from 'typeorm'; +import { StateKind } from '@cerc-io/util'; +import { BlockProgress } from './BlockProgress'; + +@Entity() +@Index(['cid'], { unique: true }) +@Index(['block', 'contractAddress']) +@Index(['block', 'contractAddress', 'kind'], { unique: true }) +export class State { + @PrimaryGeneratedColumn() + id!: number; + + @ManyToOne(() => BlockProgress, { onDelete: 'CASCADE' }) + block!: BlockProgress; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar') + cid!: string; + + @Column({ type: 'enum', enum: StateKind }) + kind!: StateKind; + + @Column('bytea') + data!: Buffer; +} diff --git a/src/entity/StateSyncStatus.ts b/src/entity/StateSyncStatus.ts new file mode 100644 index 0000000..1535eb4 --- /dev/null +++ b/src/entity/StateSyncStatus.ts @@ -0,0 +1,17 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; + +@Entity() +export class StateSyncStatus { + @PrimaryGeneratedColumn() + id!: number; + + @Column('integer') + latestIndexedBlockNumber!: number; + + @Column('integer') + latestCheckpointBlockNumber!: number; +} diff --git a/src/entity/Subscriber.ts b/src/entity/Subscriber.ts new file mode 100644 index 0000000..2cccb84 --- /dev/null +++ b/src/entity/Subscriber.ts @@ -0,0 +1,21 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import { EventSubscriber, EntitySubscriberInterface, InsertEvent, UpdateEvent } from 'typeorm'; + +import { afterEntityInsertOrUpdate } from '@cerc-io/util'; + +import { FrothyEntity } from './FrothyEntity'; +import { ENTITY_TO_LATEST_ENTITY_MAP, SUBGRAPH_ENTITIES } from '../database'; + +@EventSubscriber() +export class EntitySubscriber implements EntitySubscriberInterface { + async afterInsert (event: InsertEvent): Promise { + await afterEntityInsertOrUpdate(FrothyEntity, SUBGRAPH_ENTITIES, event, ENTITY_TO_LATEST_ENTITY_MAP); + } + + async afterUpdate (event: UpdateEvent): Promise { + await afterEntityInsertOrUpdate(FrothyEntity, SUBGRAPH_ENTITIES, event, ENTITY_TO_LATEST_ENTITY_MAP); + } +} diff --git a/src/entity/SyncStatus.ts b/src/entity/SyncStatus.ts new file mode 100644 index 0000000..cc13c70 --- /dev/null +++ b/src/entity/SyncStatus.ts @@ -0,0 +1,45 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; +import { SyncStatusInterface } from '@cerc-io/util'; + +@Entity() +export class SyncStatus implements SyncStatusInterface { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + chainHeadBlockHash!: string; + + @Column('integer') + chainHeadBlockNumber!: number; + + @Column('varchar', { length: 66 }) + latestIndexedBlockHash!: string; + + @Column('integer') + latestIndexedBlockNumber!: number; + + @Column('varchar', { length: 66 }) + latestProcessedBlockHash!: string; + + @Column('integer') + latestProcessedBlockNumber!: number; + + @Column('varchar', { length: 66 }) + latestCanonicalBlockHash!: string; + + @Column('integer') + latestCanonicalBlockNumber!: number; + + @Column('varchar', { length: 66 }) + initialIndexedBlockHash!: string; + + @Column('integer') + initialIndexedBlockNumber!: number; + + @Column('boolean', { default: false }) + hasIndexingError!: boolean; +} diff --git a/src/entity/Transaction.ts b/src/entity/Transaction.ts new file mode 100644 index 0000000..53a31ce --- /dev/null +++ b/src/entity/Transaction.ts @@ -0,0 +1,72 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryColumn, Column, Index } from 'typeorm'; +import { TransactionExecutionType } from '../types'; +import { decimalTransformer, bigintTransformer } from '@cerc-io/util'; +import { Decimal } from 'decimal.js'; + +@Entity() +@Index(['blockNumber']) +export class Transaction { + @PrimaryColumn('varchar') + id!: string; + + @PrimaryColumn('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar') + currency!: string; + + @Column('numeric', { transformer: bigintTransformer }) + maturity!: bigint; + + @Column('integer') + side!: number; + + @Column('numeric', { transformer: bigintTransformer }) + executionPrice!: bigint; + + @Column('varchar') + user!: string; + + @Column({ type: 'enum', enum: TransactionExecutionType }) + executionType!: TransactionExecutionType; + + @Column('numeric', { transformer: bigintTransformer }) + futureValue!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + amount!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + feeInFV!: bigint; + + @Column('numeric', { transformer: decimalTransformer }) + averagePrice!: Decimal; + + @Column('varchar') + lendingMarket!: string; + + @Column('varchar') + order!: string; + + @Column('numeric', { transformer: bigintTransformer }) + createdAt!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + _blockNumber!: bigint; + + @Column('varchar') + txHash!: string; + + @Column('boolean', { default: false }) + isPruned!: boolean; + + @Column('boolean', { default: false }) + isRemoved!: boolean; +} diff --git a/src/entity/TransactionCandleStick.ts b/src/entity/TransactionCandleStick.ts new file mode 100644 index 0000000..0e78bda --- /dev/null +++ b/src/entity/TransactionCandleStick.ts @@ -0,0 +1,62 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryColumn, Column, Index } from 'typeorm'; +import { decimalTransformer, bigintTransformer } from '@cerc-io/util'; +import { Decimal } from 'decimal.js'; + +@Entity() +@Index(['blockNumber']) +export class TransactionCandleStick { + @PrimaryColumn('varchar') + id!: string; + + @PrimaryColumn('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('numeric', { transformer: bigintTransformer }) + interval!: bigint; + + @Column('varchar') + currency!: string; + + @Column('numeric', { transformer: bigintTransformer }) + maturity!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + timestamp!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + open!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + close!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + high!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + low!: bigint; + + @Column('numeric', { transformer: decimalTransformer }) + average!: Decimal; + + @Column('numeric', { transformer: bigintTransformer }) + volume!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + volumeInFV!: bigint; + + @Column('varchar') + lendingMarket!: string; + + @Column('boolean', { default: false }) + isPruned!: boolean; + + @Column('boolean', { default: false }) + isRemoved!: boolean; +} diff --git a/src/entity/Transfer.ts b/src/entity/Transfer.ts new file mode 100644 index 0000000..f6cc5bd --- /dev/null +++ b/src/entity/Transfer.ts @@ -0,0 +1,47 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryColumn, Column, Index } from 'typeorm'; +import { TransferType } from '../types'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockNumber']) +export class Transfer { + @PrimaryColumn('varchar') + id!: string; + + @PrimaryColumn('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar') + user!: string; + + @Column('varchar') + currency!: string; + + @Column('numeric', { transformer: bigintTransformer }) + amount!: bigint; + + @Column({ type: 'enum', enum: TransferType }) + transferType!: TransferType; + + @Column('numeric', { transformer: bigintTransformer }) + timestamp!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + _blockNumber!: bigint; + + @Column('varchar') + txHash!: string; + + @Column('boolean', { default: false }) + isPruned!: boolean; + + @Column('boolean', { default: false }) + isRemoved!: boolean; +} diff --git a/src/entity/User.ts b/src/entity/User.ts new file mode 100644 index 0000000..cff9251 --- /dev/null +++ b/src/entity/User.ts @@ -0,0 +1,40 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockNumber']) +export class User { + @PrimaryColumn('varchar') + id!: string; + + @PrimaryColumn('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('numeric', { transformer: bigintTransformer }) + createdAt!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + transactionCount!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + orderCount!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + liquidationCount!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + transferCount!: bigint; + + @Column('boolean', { default: false }) + isPruned!: boolean; + + @Column('boolean', { default: false }) + isRemoved!: boolean; +} diff --git a/src/fill.ts b/src/fill.ts new file mode 100644 index 0000000..210341e --- /dev/null +++ b/src/fill.ts @@ -0,0 +1,48 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import 'reflect-metadata'; +import debug from 'debug'; + +import { FillCmd } from '@cerc-io/cli'; +import { getContractEntitiesMap } from '@cerc-io/util'; +import { getGraphDbAndWatcher } from '@cerc-io/graph-node'; + +import { Database, ENTITY_QUERY_TYPE_MAP, ENTITY_TO_LATEST_ENTITY_MAP } from './database'; +import { Indexer } from './indexer'; + +const log = debug('vulcanize:fill'); + +export const main = async (): Promise => { + const fillCmd = new FillCmd(); + await fillCmd.init(Database); + + const { graphWatcher } = await getGraphDbAndWatcher( + fillCmd.config.server, + fillCmd.clients.ethClient, + fillCmd.ethProvider, + fillCmd.database.baseDatabase, + ENTITY_QUERY_TYPE_MAP, + ENTITY_TO_LATEST_ENTITY_MAP + ); + + await fillCmd.initIndexer(Indexer, graphWatcher); + + // Get contractEntitiesMap required for fill-state + // NOTE: Assuming each entity type is only mapped to a single contract + const contractEntitiesMap = getContractEntitiesMap(graphWatcher.dataSources); + + await fillCmd.exec(contractEntitiesMap); +}; + +main().catch(err => { + log(err); +}).finally(() => { + process.exit(); +}); + +process.on('SIGINT', () => { + log(`Exiting process ${process.pid} with code 0`); + process.exit(0); +}); diff --git a/src/gql/index.ts b/src/gql/index.ts new file mode 100644 index 0000000..4732f68 --- /dev/null +++ b/src/gql/index.ts @@ -0,0 +1,3 @@ +export * as mutations from './mutations'; +export * as queries from './queries'; +export * as subscriptions from './subscriptions'; diff --git a/src/gql/mutations/index.ts b/src/gql/mutations/index.ts new file mode 100644 index 0000000..0c3bd85 --- /dev/null +++ b/src/gql/mutations/index.ts @@ -0,0 +1,4 @@ +import fs from 'fs'; +import path from 'path'; + +export const watchContract = fs.readFileSync(path.join(__dirname, 'watchContract.gql'), 'utf8'); diff --git a/src/gql/mutations/watchContract.gql b/src/gql/mutations/watchContract.gql new file mode 100644 index 0000000..2ecc74f --- /dev/null +++ b/src/gql/mutations/watchContract.gql @@ -0,0 +1,3 @@ +mutation watchContract($address: String!, $kind: String!, $checkpoint: Boolean!, $startingBlock: Int){ + watchContract(address: $address, kind: $kind, checkpoint: $checkpoint, startingBlock: $startingBlock) +} \ No newline at end of file diff --git a/src/gql/queries/_meta.gql b/src/gql/queries/_meta.gql new file mode 100644 index 0000000..d686e04 --- /dev/null +++ b/src/gql/queries/_meta.gql @@ -0,0 +1,11 @@ +query _meta($block: Block_height){ + _meta(block: $block){ + block{ + hash + number + timestamp + } + deployment + hasIndexingErrors + } +} \ No newline at end of file diff --git a/src/gql/queries/dailyVolume.gql b/src/gql/queries/dailyVolume.gql new file mode 100644 index 0000000..62845ae --- /dev/null +++ b/src/gql/queries/dailyVolume.gql @@ -0,0 +1,21 @@ +query dailyVolume($id: ID!, $block: Block_height){ + dailyVolume(id: $id, block: $block){ + id + currency + maturity + day + volume + timestamp + lendingMarket{ + id + currency + maturity + isActive + volume + openingUnitPrice + lastLendUnitPrice + lastBorrowUnitPrice + offsetAmount + } + } +} \ No newline at end of file diff --git a/src/gql/queries/dailyVolumes.gql b/src/gql/queries/dailyVolumes.gql new file mode 100644 index 0000000..72bff80 --- /dev/null +++ b/src/gql/queries/dailyVolumes.gql @@ -0,0 +1,21 @@ +query dailyVolumes($block: Block_height, $where: DailyVolume_filter, $orderBy: DailyVolume_orderBy, $orderDirection: OrderDirection, $first: Int, $skip: Int){ + dailyVolumes(block: $block, where: $where, orderBy: $orderBy, orderDirection: $orderDirection, first: $first, skip: $skip){ + id + currency + maturity + day + volume + timestamp + lendingMarket{ + id + currency + maturity + isActive + volume + openingUnitPrice + lastLendUnitPrice + lastBorrowUnitPrice + offsetAmount + } + } +} \ No newline at end of file diff --git a/src/gql/queries/deposit.gql b/src/gql/queries/deposit.gql new file mode 100644 index 0000000..a41e93d --- /dev/null +++ b/src/gql/queries/deposit.gql @@ -0,0 +1,15 @@ +query deposit($id: ID!, $block: Block_height){ + deposit(id: $id, block: $block){ + id + user{ + id + createdAt + transactionCount + orderCount + liquidationCount + transferCount + } + currency + amount + } +} \ No newline at end of file diff --git a/src/gql/queries/deposits.gql b/src/gql/queries/deposits.gql new file mode 100644 index 0000000..6c6741d --- /dev/null +++ b/src/gql/queries/deposits.gql @@ -0,0 +1,15 @@ +query deposits($block: Block_height, $where: Deposit_filter, $orderBy: Deposit_orderBy, $orderDirection: OrderDirection, $first: Int, $skip: Int){ + deposits(block: $block, where: $where, orderBy: $orderBy, orderDirection: $orderDirection, first: $first, skip: $skip){ + id + user{ + id + createdAt + transactionCount + orderCount + liquidationCount + transferCount + } + currency + amount + } +} \ No newline at end of file diff --git a/src/gql/queries/events.gql b/src/gql/queries/events.gql new file mode 100644 index 0000000..03deea1 --- /dev/null +++ b/src/gql/queries/events.gql @@ -0,0 +1,273 @@ +query events($blockHash: String!, $contractAddress: String!, $name: String){ + events(blockHash: $blockHash, contractAddress: $contractAddress, name: $name){ + block{ + cid + hash + number + timestamp + parentHash + } + tx{ + hash + index + from + to + } + contract + eventIndex + event{ + ... on TestEvent { + param1 + param2 + param3 + } + ... on EmergencyTerminationExecutedEvent { + timestamp + } + ... on LendingMarketInitializedEvent { + ccy + genesisDate + compoundFactor + orderFeeRate + circuitBreakerLimitRange + lendingMarket + futureValueVault + } + ... on MinDebtUnitPriceUpdatedEvent { + ccy + minDebtUnitPrice + } + ... on OrderBookCreatedEvent { + ccy + orderBookId + openingDate + preOpeningDate + maturity + } + ... on OrderBooksRotatedEvent { + ccy + oldMaturity + newMaturity + } + ... on ZCTokenCreatedEvent { + ccy + maturity + name + symbol + decimals + tokenAddress + } + ... on CacheUpdatedEvent { + name + destination + } + ... on CurrencyRegisteredEvent { + ccy + tokenAddress + isCollateral + } + ... on CurrencyUpdatedEvent { + ccy + isCollateral + } + ... on DepositEvent { + user + ccy + amount + caller + } + ... on FullLiquidationThresholdRateUpdatedEvent { + previousRate + ratio + } + ... on InitializedEvent { + version + } + ... on LiquidationProtocolFeeRateUpdatedEvent { + previousRate + ratio + } + ... on LiquidationThresholdRateUpdatedEvent { + previousRate + ratio + } + ... on LiquidatorFeeRateUpdatedEvent { + previousRate + ratio + } + ... on OwnershipTransferredEvent { + previousOwner + newOwner + } + ... on PausedEvent { + account + } + ... on RoleAdminChangedEvent { + role + previousAdminRole + newAdminRole + } + ... on RoleGrantedEvent { + role + account + sender + } + ... on RoleRevokedEvent { + role + account + sender + } + ... on TransferEvent { + ccy + from + to + amount + } + ... on UnpausedEvent { + account + } + ... on WithdrawEvent { + user + ccy + amount + } + ... on EmergencySettlementExecutedEvent { + user + amount + } + ... on OrderFilledEvent { + taker + ccy + side + maturity + amount + amountInFV + feeInFV + } + ... on OrderPartiallyFilledEvent { + orderId + maker + ccy + side + maturity + amount + amountInFV + } + ... on OrdersFilledInAsyncEvent { + taker + ccy + side + maturity + amount + amountInFV + } + ... on RedemptionExecutedEvent { + user + ccy + maturity + amount + } + ... on RepaymentExecutedEvent { + user + ccy + maturity + amount + } + ... on ForcedRepaymentExecutedEvent { + user + collateralCcy + debtCcy + debtMaturity + debtAmount + } + ... on LiquidationExecutedEvent { + user + collateralCcy + debtCcy + debtMaturity + debtAmount + } + ... on BlockUnitPriceHistoryUpdatedEvent { + ccy + maturity + blockUnitPrice + } + ... on OrderCanceledEvent { + orderId + maker + side + ccy + maturity + amount + unitPrice + } + ... on OrderExecutedEvent { + user + side + ccy + maturity + inputAmount + inputUnitPrice + filledAmount + filledUnitPrice + filledAmountInFV + feeInFV + placedOrderId + placedAmount + placedUnitPrice + isCircuitBreakerTriggered + } + ... on OrdersCleanedEvent { + orderIds + maker + side + ccy + maturity + amount + futureValue + } + ... on PositionUnwoundEvent { + user + side + ccy + maturity + inputFutureValue + filledAmount + filledUnitPrice + filledAmountInFV + feeInFV + isCircuitBreakerTriggered + } + ... on PreOrderExecutedEvent { + user + side + ccy + maturity + amount + unitPrice + orderId + } + ... on CircuitBreakerLimitRangeUpdatedEvent { + ccy + previousRate + rate + } + ... on ItayoseExecutedEvent { + ccy + maturity + openingUnitPrice + lastLendUnitPrice + lastBorrowUnitPrice + offsetAmount + } + ... on OrderFeeRateUpdatedEvent { + ccy + previousRate + rate + } + } + proof{ + data + } + } +} \ No newline at end of file diff --git a/src/gql/queries/eventsInRange.gql b/src/gql/queries/eventsInRange.gql new file mode 100644 index 0000000..f49d363 --- /dev/null +++ b/src/gql/queries/eventsInRange.gql @@ -0,0 +1,273 @@ +query eventsInRange($fromBlockNumber: Int!, $toBlockNumber: Int!){ + eventsInRange(fromBlockNumber: $fromBlockNumber, toBlockNumber: $toBlockNumber){ + block{ + cid + hash + number + timestamp + parentHash + } + tx{ + hash + index + from + to + } + contract + eventIndex + event{ + ... on TestEvent { + param1 + param2 + param3 + } + ... on EmergencyTerminationExecutedEvent { + timestamp + } + ... on LendingMarketInitializedEvent { + ccy + genesisDate + compoundFactor + orderFeeRate + circuitBreakerLimitRange + lendingMarket + futureValueVault + } + ... on MinDebtUnitPriceUpdatedEvent { + ccy + minDebtUnitPrice + } + ... on OrderBookCreatedEvent { + ccy + orderBookId + openingDate + preOpeningDate + maturity + } + ... on OrderBooksRotatedEvent { + ccy + oldMaturity + newMaturity + } + ... on ZCTokenCreatedEvent { + ccy + maturity + name + symbol + decimals + tokenAddress + } + ... on CacheUpdatedEvent { + name + destination + } + ... on CurrencyRegisteredEvent { + ccy + tokenAddress + isCollateral + } + ... on CurrencyUpdatedEvent { + ccy + isCollateral + } + ... on DepositEvent { + user + ccy + amount + caller + } + ... on FullLiquidationThresholdRateUpdatedEvent { + previousRate + ratio + } + ... on InitializedEvent { + version + } + ... on LiquidationProtocolFeeRateUpdatedEvent { + previousRate + ratio + } + ... on LiquidationThresholdRateUpdatedEvent { + previousRate + ratio + } + ... on LiquidatorFeeRateUpdatedEvent { + previousRate + ratio + } + ... on OwnershipTransferredEvent { + previousOwner + newOwner + } + ... on PausedEvent { + account + } + ... on RoleAdminChangedEvent { + role + previousAdminRole + newAdminRole + } + ... on RoleGrantedEvent { + role + account + sender + } + ... on RoleRevokedEvent { + role + account + sender + } + ... on TransferEvent { + ccy + from + to + amount + } + ... on UnpausedEvent { + account + } + ... on WithdrawEvent { + user + ccy + amount + } + ... on EmergencySettlementExecutedEvent { + user + amount + } + ... on OrderFilledEvent { + taker + ccy + side + maturity + amount + amountInFV + feeInFV + } + ... on OrderPartiallyFilledEvent { + orderId + maker + ccy + side + maturity + amount + amountInFV + } + ... on OrdersFilledInAsyncEvent { + taker + ccy + side + maturity + amount + amountInFV + } + ... on RedemptionExecutedEvent { + user + ccy + maturity + amount + } + ... on RepaymentExecutedEvent { + user + ccy + maturity + amount + } + ... on ForcedRepaymentExecutedEvent { + user + collateralCcy + debtCcy + debtMaturity + debtAmount + } + ... on LiquidationExecutedEvent { + user + collateralCcy + debtCcy + debtMaturity + debtAmount + } + ... on BlockUnitPriceHistoryUpdatedEvent { + ccy + maturity + blockUnitPrice + } + ... on OrderCanceledEvent { + orderId + maker + side + ccy + maturity + amount + unitPrice + } + ... on OrderExecutedEvent { + user + side + ccy + maturity + inputAmount + inputUnitPrice + filledAmount + filledUnitPrice + filledAmountInFV + feeInFV + placedOrderId + placedAmount + placedUnitPrice + isCircuitBreakerTriggered + } + ... on OrdersCleanedEvent { + orderIds + maker + side + ccy + maturity + amount + futureValue + } + ... on PositionUnwoundEvent { + user + side + ccy + maturity + inputFutureValue + filledAmount + filledUnitPrice + filledAmountInFV + feeInFV + isCircuitBreakerTriggered + } + ... on PreOrderExecutedEvent { + user + side + ccy + maturity + amount + unitPrice + orderId + } + ... on CircuitBreakerLimitRangeUpdatedEvent { + ccy + previousRate + rate + } + ... on ItayoseExecutedEvent { + ccy + maturity + openingUnitPrice + lastLendUnitPrice + lastBorrowUnitPrice + offsetAmount + } + ... on OrderFeeRateUpdatedEvent { + ccy + previousRate + rate + } + } + proof{ + data + } + } +} \ No newline at end of file diff --git a/src/gql/queries/getState.gql b/src/gql/queries/getState.gql new file mode 100644 index 0000000..3b8f605 --- /dev/null +++ b/src/gql/queries/getState.gql @@ -0,0 +1,15 @@ +query getState($blockHash: String!, $contractAddress: String!, $kind: String){ + getState(blockHash: $blockHash, contractAddress: $contractAddress, kind: $kind){ + block{ + cid + hash + number + timestamp + parentHash + } + contractAddress + cid + kind + data + } +} \ No newline at end of file diff --git a/src/gql/queries/getStateByCID.gql b/src/gql/queries/getStateByCID.gql new file mode 100644 index 0000000..6c3c4fd --- /dev/null +++ b/src/gql/queries/getStateByCID.gql @@ -0,0 +1,15 @@ +query getStateByCID($cid: String!){ + getStateByCID(cid: $cid){ + block{ + cid + hash + number + timestamp + parentHash + } + contractAddress + cid + kind + data + } +} \ No newline at end of file diff --git a/src/gql/queries/getSyncStatus.gql b/src/gql/queries/getSyncStatus.gql new file mode 100644 index 0000000..48175b4 --- /dev/null +++ b/src/gql/queries/getSyncStatus.gql @@ -0,0 +1,12 @@ +query getSyncStatus{ + getSyncStatus{ + latestIndexedBlockHash + latestIndexedBlockNumber + latestCanonicalBlockHash + latestCanonicalBlockNumber + initialIndexedBlockHash + initialIndexedBlockNumber + latestProcessedBlockHash + latestProcessedBlockNumber + } +} \ No newline at end of file diff --git a/src/gql/queries/index.ts b/src/gql/queries/index.ts new file mode 100644 index 0000000..77bc4c3 --- /dev/null +++ b/src/gql/queries/index.ts @@ -0,0 +1,29 @@ +import fs from 'fs'; +import path from 'path'; + +export const events = fs.readFileSync(path.join(__dirname, 'events.gql'), 'utf8'); +export const eventsInRange = fs.readFileSync(path.join(__dirname, 'eventsInRange.gql'), 'utf8'); +export const transaction = fs.readFileSync(path.join(__dirname, 'transaction.gql'), 'utf8'); +export const transactions = fs.readFileSync(path.join(__dirname, 'transactions.gql'), 'utf8'); +export const order = fs.readFileSync(path.join(__dirname, 'order.gql'), 'utf8'); +export const orders = fs.readFileSync(path.join(__dirname, 'orders.gql'), 'utf8'); +export const lendingMarket = fs.readFileSync(path.join(__dirname, 'lendingMarket.gql'), 'utf8'); +export const lendingMarkets = fs.readFileSync(path.join(__dirname, 'lendingMarkets.gql'), 'utf8'); +export const user = fs.readFileSync(path.join(__dirname, 'user.gql'), 'utf8'); +export const users = fs.readFileSync(path.join(__dirname, 'users.gql'), 'utf8'); +export const dailyVolume = fs.readFileSync(path.join(__dirname, 'dailyVolume.gql'), 'utf8'); +export const dailyVolumes = fs.readFileSync(path.join(__dirname, 'dailyVolumes.gql'), 'utf8'); +export const protocol = fs.readFileSync(path.join(__dirname, 'protocol.gql'), 'utf8'); +export const protocols = fs.readFileSync(path.join(__dirname, 'protocols.gql'), 'utf8'); +export const liquidation = fs.readFileSync(path.join(__dirname, 'liquidation.gql'), 'utf8'); +export const liquidations = fs.readFileSync(path.join(__dirname, 'liquidations.gql'), 'utf8'); +export const transfer = fs.readFileSync(path.join(__dirname, 'transfer.gql'), 'utf8'); +export const transfers = fs.readFileSync(path.join(__dirname, 'transfers.gql'), 'utf8'); +export const deposit = fs.readFileSync(path.join(__dirname, 'deposit.gql'), 'utf8'); +export const deposits = fs.readFileSync(path.join(__dirname, 'deposits.gql'), 'utf8'); +export const transactionCandleStick = fs.readFileSync(path.join(__dirname, 'transactionCandleStick.gql'), 'utf8'); +export const transactionCandleSticks = fs.readFileSync(path.join(__dirname, 'transactionCandleSticks.gql'), 'utf8'); +export const _meta = fs.readFileSync(path.join(__dirname, '_meta.gql'), 'utf8'); +export const getStateByCID = fs.readFileSync(path.join(__dirname, 'getStateByCID.gql'), 'utf8'); +export const getState = fs.readFileSync(path.join(__dirname, 'getState.gql'), 'utf8'); +export const getSyncStatus = fs.readFileSync(path.join(__dirname, 'getSyncStatus.gql'), 'utf8'); diff --git a/src/gql/queries/lendingMarket.gql b/src/gql/queries/lendingMarket.gql new file mode 100644 index 0000000..7f76d1e --- /dev/null +++ b/src/gql/queries/lendingMarket.gql @@ -0,0 +1,54 @@ +query lendingMarket($id: ID!, $block: Block_height){ + lendingMarket(id: $id, block: $block){ + id + currency + maturity + isActive + transactions{ + id + currency + maturity + side + executionPrice + executionType + futureValue + amount + feeInFV + averagePrice + createdAt + blockNumber + txHash + } + orders{ + id + orderId + currency + side + maturity + inputUnitPrice + inputAmount + filledAmount + status + statusUpdatedAt + isPreOrder + type + isCircuitBreakerTriggered + createdAt + blockNumber + txHash + } + volume + dailyVolume{ + id + currency + maturity + day + volume + timestamp + } + openingUnitPrice + lastLendUnitPrice + lastBorrowUnitPrice + offsetAmount + } +} \ No newline at end of file diff --git a/src/gql/queries/lendingMarkets.gql b/src/gql/queries/lendingMarkets.gql new file mode 100644 index 0000000..934c652 --- /dev/null +++ b/src/gql/queries/lendingMarkets.gql @@ -0,0 +1,54 @@ +query lendingMarkets($block: Block_height, $where: LendingMarket_filter, $orderBy: LendingMarket_orderBy, $orderDirection: OrderDirection, $first: Int, $skip: Int){ + lendingMarkets(block: $block, where: $where, orderBy: $orderBy, orderDirection: $orderDirection, first: $first, skip: $skip){ + id + currency + maturity + isActive + transactions{ + id + currency + maturity + side + executionPrice + executionType + futureValue + amount + feeInFV + averagePrice + createdAt + blockNumber + txHash + } + orders{ + id + orderId + currency + side + maturity + inputUnitPrice + inputAmount + filledAmount + status + statusUpdatedAt + isPreOrder + type + isCircuitBreakerTriggered + createdAt + blockNumber + txHash + } + volume + dailyVolume{ + id + currency + maturity + day + volume + timestamp + } + openingUnitPrice + lastLendUnitPrice + lastBorrowUnitPrice + offsetAmount + } +} \ No newline at end of file diff --git a/src/gql/queries/liquidation.gql b/src/gql/queries/liquidation.gql new file mode 100644 index 0000000..974ce1a --- /dev/null +++ b/src/gql/queries/liquidation.gql @@ -0,0 +1,20 @@ +query liquidation($id: ID!, $block: Block_height){ + liquidation(id: $id, block: $block){ + id + collateralCurrency + debtCurrency + debtMaturity + debtAmount + user{ + id + createdAt + transactionCount + orderCount + liquidationCount + transferCount + } + timestamp + blockNumber + txHash + } +} \ No newline at end of file diff --git a/src/gql/queries/liquidations.gql b/src/gql/queries/liquidations.gql new file mode 100644 index 0000000..8fada56 --- /dev/null +++ b/src/gql/queries/liquidations.gql @@ -0,0 +1,20 @@ +query liquidations($block: Block_height, $where: Liquidation_filter, $orderBy: Liquidation_orderBy, $orderDirection: OrderDirection, $first: Int, $skip: Int){ + liquidations(block: $block, where: $where, orderBy: $orderBy, orderDirection: $orderDirection, first: $first, skip: $skip){ + id + collateralCurrency + debtCurrency + debtMaturity + debtAmount + user{ + id + createdAt + transactionCount + orderCount + liquidationCount + transferCount + } + timestamp + blockNumber + txHash + } +} \ No newline at end of file diff --git a/src/gql/queries/order.gql b/src/gql/queries/order.gql new file mode 100644 index 0000000..88986ed --- /dev/null +++ b/src/gql/queries/order.gql @@ -0,0 +1,54 @@ +query order($id: ID!, $block: Block_height){ + order(id: $id, block: $block){ + id + orderId + user{ + id + createdAt + transactionCount + orderCount + liquidationCount + transferCount + } + currency + side + maturity + inputUnitPrice + inputAmount + filledAmount + status + statusUpdatedAt + lendingMarket{ + id + currency + maturity + isActive + volume + openingUnitPrice + lastLendUnitPrice + lastBorrowUnitPrice + offsetAmount + } + isPreOrder + type + transactions{ + id + currency + maturity + side + executionPrice + executionType + futureValue + amount + feeInFV + averagePrice + createdAt + blockNumber + txHash + } + isCircuitBreakerTriggered + createdAt + blockNumber + txHash + } +} \ No newline at end of file diff --git a/src/gql/queries/orders.gql b/src/gql/queries/orders.gql new file mode 100644 index 0000000..b8a98e5 --- /dev/null +++ b/src/gql/queries/orders.gql @@ -0,0 +1,54 @@ +query orders($block: Block_height, $where: Order_filter, $orderBy: Order_orderBy, $orderDirection: OrderDirection, $first: Int, $skip: Int){ + orders(block: $block, where: $where, orderBy: $orderBy, orderDirection: $orderDirection, first: $first, skip: $skip){ + id + orderId + user{ + id + createdAt + transactionCount + orderCount + liquidationCount + transferCount + } + currency + side + maturity + inputUnitPrice + inputAmount + filledAmount + status + statusUpdatedAt + lendingMarket{ + id + currency + maturity + isActive + volume + openingUnitPrice + lastLendUnitPrice + lastBorrowUnitPrice + offsetAmount + } + isPreOrder + type + transactions{ + id + currency + maturity + side + executionPrice + executionType + futureValue + amount + feeInFV + averagePrice + createdAt + blockNumber + txHash + } + isCircuitBreakerTriggered + createdAt + blockNumber + txHash + } +} \ No newline at end of file diff --git a/src/gql/queries/protocol.gql b/src/gql/queries/protocol.gql new file mode 100644 index 0000000..8dd9e3f --- /dev/null +++ b/src/gql/queries/protocol.gql @@ -0,0 +1,6 @@ +query protocol($id: ID!, $block: Block_height){ + protocol(id: $id, block: $block){ + id + totalUsers + } +} \ No newline at end of file diff --git a/src/gql/queries/protocols.gql b/src/gql/queries/protocols.gql new file mode 100644 index 0000000..1421c7d --- /dev/null +++ b/src/gql/queries/protocols.gql @@ -0,0 +1,6 @@ +query protocols($block: Block_height, $where: Protocol_filter, $orderBy: Protocol_orderBy, $orderDirection: OrderDirection, $first: Int, $skip: Int){ + protocols(block: $block, where: $where, orderBy: $orderBy, orderDirection: $orderDirection, first: $first, skip: $skip){ + id + totalUsers + } +} \ No newline at end of file diff --git a/src/gql/queries/transaction.gql b/src/gql/queries/transaction.gql new file mode 100644 index 0000000..fbcb796 --- /dev/null +++ b/src/gql/queries/transaction.gql @@ -0,0 +1,54 @@ +query transaction($id: ID!, $block: Block_height){ + transaction(id: $id, block: $block){ + id + currency + maturity + side + executionPrice + user{ + id + createdAt + transactionCount + orderCount + liquidationCount + transferCount + } + executionType + futureValue + amount + feeInFV + averagePrice + lendingMarket{ + id + currency + maturity + isActive + volume + openingUnitPrice + lastLendUnitPrice + lastBorrowUnitPrice + offsetAmount + } + order{ + id + orderId + currency + side + maturity + inputUnitPrice + inputAmount + filledAmount + status + statusUpdatedAt + isPreOrder + type + isCircuitBreakerTriggered + createdAt + blockNumber + txHash + } + createdAt + blockNumber + txHash + } +} \ No newline at end of file diff --git a/src/gql/queries/transactionCandleStick.gql b/src/gql/queries/transactionCandleStick.gql new file mode 100644 index 0000000..b845e33 --- /dev/null +++ b/src/gql/queries/transactionCandleStick.gql @@ -0,0 +1,27 @@ +query transactionCandleStick($id: ID!, $block: Block_height){ + transactionCandleStick(id: $id, block: $block){ + id + interval + currency + maturity + timestamp + open + close + high + low + average + volume + volumeInFV + lendingMarket{ + id + currency + maturity + isActive + volume + openingUnitPrice + lastLendUnitPrice + lastBorrowUnitPrice + offsetAmount + } + } +} \ No newline at end of file diff --git a/src/gql/queries/transactionCandleSticks.gql b/src/gql/queries/transactionCandleSticks.gql new file mode 100644 index 0000000..6f7c695 --- /dev/null +++ b/src/gql/queries/transactionCandleSticks.gql @@ -0,0 +1,27 @@ +query transactionCandleSticks($block: Block_height, $where: TransactionCandleStick_filter, $orderBy: TransactionCandleStick_orderBy, $orderDirection: OrderDirection, $first: Int, $skip: Int){ + transactionCandleSticks(block: $block, where: $where, orderBy: $orderBy, orderDirection: $orderDirection, first: $first, skip: $skip){ + id + interval + currency + maturity + timestamp + open + close + high + low + average + volume + volumeInFV + lendingMarket{ + id + currency + maturity + isActive + volume + openingUnitPrice + lastLendUnitPrice + lastBorrowUnitPrice + offsetAmount + } + } +} \ No newline at end of file diff --git a/src/gql/queries/transactions.gql b/src/gql/queries/transactions.gql new file mode 100644 index 0000000..cf3c022 --- /dev/null +++ b/src/gql/queries/transactions.gql @@ -0,0 +1,54 @@ +query transactions($block: Block_height, $where: Transaction_filter, $orderBy: Transaction_orderBy, $orderDirection: OrderDirection, $first: Int, $skip: Int){ + transactions(block: $block, where: $where, orderBy: $orderBy, orderDirection: $orderDirection, first: $first, skip: $skip){ + id + currency + maturity + side + executionPrice + user{ + id + createdAt + transactionCount + orderCount + liquidationCount + transferCount + } + executionType + futureValue + amount + feeInFV + averagePrice + lendingMarket{ + id + currency + maturity + isActive + volume + openingUnitPrice + lastLendUnitPrice + lastBorrowUnitPrice + offsetAmount + } + order{ + id + orderId + currency + side + maturity + inputUnitPrice + inputAmount + filledAmount + status + statusUpdatedAt + isPreOrder + type + isCircuitBreakerTriggered + createdAt + blockNumber + txHash + } + createdAt + blockNumber + txHash + } +} \ No newline at end of file diff --git a/src/gql/queries/transfer.gql b/src/gql/queries/transfer.gql new file mode 100644 index 0000000..1a264b5 --- /dev/null +++ b/src/gql/queries/transfer.gql @@ -0,0 +1,19 @@ +query transfer($id: ID!, $block: Block_height){ + transfer(id: $id, block: $block){ + id + user{ + id + createdAt + transactionCount + orderCount + liquidationCount + transferCount + } + currency + amount + transferType + timestamp + blockNumber + txHash + } +} \ No newline at end of file diff --git a/src/gql/queries/transfers.gql b/src/gql/queries/transfers.gql new file mode 100644 index 0000000..cd97a62 --- /dev/null +++ b/src/gql/queries/transfers.gql @@ -0,0 +1,19 @@ +query transfers($block: Block_height, $where: Transfer_filter, $orderBy: Transfer_orderBy, $orderDirection: OrderDirection, $first: Int, $skip: Int){ + transfers(block: $block, where: $where, orderBy: $orderBy, orderDirection: $orderDirection, first: $first, skip: $skip){ + id + user{ + id + createdAt + transactionCount + orderCount + liquidationCount + transferCount + } + currency + amount + transferType + timestamp + blockNumber + txHash + } +} \ No newline at end of file diff --git a/src/gql/queries/user.gql b/src/gql/queries/user.gql new file mode 100644 index 0000000..0cc738b --- /dev/null +++ b/src/gql/queries/user.gql @@ -0,0 +1,67 @@ +query user($id: ID!, $block: Block_height){ + user(id: $id, block: $block){ + id + createdAt + transactionCount + transactions{ + id + currency + maturity + side + executionPrice + executionType + futureValue + amount + feeInFV + averagePrice + createdAt + blockNumber + txHash + } + orderCount + orders{ + id + orderId + currency + side + maturity + inputUnitPrice + inputAmount + filledAmount + status + statusUpdatedAt + isPreOrder + type + isCircuitBreakerTriggered + createdAt + blockNumber + txHash + } + liquidationCount + liquidations{ + id + collateralCurrency + debtCurrency + debtMaturity + debtAmount + timestamp + blockNumber + txHash + } + transferCount + transfers{ + id + currency + amount + transferType + timestamp + blockNumber + txHash + } + deposits{ + id + currency + amount + } + } +} \ No newline at end of file diff --git a/src/gql/queries/users.gql b/src/gql/queries/users.gql new file mode 100644 index 0000000..2fc6577 --- /dev/null +++ b/src/gql/queries/users.gql @@ -0,0 +1,67 @@ +query users($block: Block_height, $where: User_filter, $orderBy: User_orderBy, $orderDirection: OrderDirection, $first: Int, $skip: Int){ + users(block: $block, where: $where, orderBy: $orderBy, orderDirection: $orderDirection, first: $first, skip: $skip){ + id + createdAt + transactionCount + transactions{ + id + currency + maturity + side + executionPrice + executionType + futureValue + amount + feeInFV + averagePrice + createdAt + blockNumber + txHash + } + orderCount + orders{ + id + orderId + currency + side + maturity + inputUnitPrice + inputAmount + filledAmount + status + statusUpdatedAt + isPreOrder + type + isCircuitBreakerTriggered + createdAt + blockNumber + txHash + } + liquidationCount + liquidations{ + id + collateralCurrency + debtCurrency + debtMaturity + debtAmount + timestamp + blockNumber + txHash + } + transferCount + transfers{ + id + currency + amount + transferType + timestamp + blockNumber + txHash + } + deposits{ + id + currency + amount + } + } +} \ No newline at end of file diff --git a/src/gql/subscriptions/index.ts b/src/gql/subscriptions/index.ts new file mode 100644 index 0000000..f12910c --- /dev/null +++ b/src/gql/subscriptions/index.ts @@ -0,0 +1,4 @@ +import fs from 'fs'; +import path from 'path'; + +export const onEvent = fs.readFileSync(path.join(__dirname, 'onEvent.gql'), 'utf8'); diff --git a/src/gql/subscriptions/onEvent.gql b/src/gql/subscriptions/onEvent.gql new file mode 100644 index 0000000..f6aac45 --- /dev/null +++ b/src/gql/subscriptions/onEvent.gql @@ -0,0 +1,273 @@ +subscription onEvent{ + onEvent{ + block{ + cid + hash + number + timestamp + parentHash + } + tx{ + hash + index + from + to + } + contract + eventIndex + event{ + ... on TestEvent { + param1 + param2 + param3 + } + ... on EmergencyTerminationExecutedEvent { + timestamp + } + ... on LendingMarketInitializedEvent { + ccy + genesisDate + compoundFactor + orderFeeRate + circuitBreakerLimitRange + lendingMarket + futureValueVault + } + ... on MinDebtUnitPriceUpdatedEvent { + ccy + minDebtUnitPrice + } + ... on OrderBookCreatedEvent { + ccy + orderBookId + openingDate + preOpeningDate + maturity + } + ... on OrderBooksRotatedEvent { + ccy + oldMaturity + newMaturity + } + ... on ZCTokenCreatedEvent { + ccy + maturity + name + symbol + decimals + tokenAddress + } + ... on CacheUpdatedEvent { + name + destination + } + ... on CurrencyRegisteredEvent { + ccy + tokenAddress + isCollateral + } + ... on CurrencyUpdatedEvent { + ccy + isCollateral + } + ... on DepositEvent { + user + ccy + amount + caller + } + ... on FullLiquidationThresholdRateUpdatedEvent { + previousRate + ratio + } + ... on InitializedEvent { + version + } + ... on LiquidationProtocolFeeRateUpdatedEvent { + previousRate + ratio + } + ... on LiquidationThresholdRateUpdatedEvent { + previousRate + ratio + } + ... on LiquidatorFeeRateUpdatedEvent { + previousRate + ratio + } + ... on OwnershipTransferredEvent { + previousOwner + newOwner + } + ... on PausedEvent { + account + } + ... on RoleAdminChangedEvent { + role + previousAdminRole + newAdminRole + } + ... on RoleGrantedEvent { + role + account + sender + } + ... on RoleRevokedEvent { + role + account + sender + } + ... on TransferEvent { + ccy + from + to + amount + } + ... on UnpausedEvent { + account + } + ... on WithdrawEvent { + user + ccy + amount + } + ... on EmergencySettlementExecutedEvent { + user + amount + } + ... on OrderFilledEvent { + taker + ccy + side + maturity + amount + amountInFV + feeInFV + } + ... on OrderPartiallyFilledEvent { + orderId + maker + ccy + side + maturity + amount + amountInFV + } + ... on OrdersFilledInAsyncEvent { + taker + ccy + side + maturity + amount + amountInFV + } + ... on RedemptionExecutedEvent { + user + ccy + maturity + amount + } + ... on RepaymentExecutedEvent { + user + ccy + maturity + amount + } + ... on ForcedRepaymentExecutedEvent { + user + collateralCcy + debtCcy + debtMaturity + debtAmount + } + ... on LiquidationExecutedEvent { + user + collateralCcy + debtCcy + debtMaturity + debtAmount + } + ... on BlockUnitPriceHistoryUpdatedEvent { + ccy + maturity + blockUnitPrice + } + ... on OrderCanceledEvent { + orderId + maker + side + ccy + maturity + amount + unitPrice + } + ... on OrderExecutedEvent { + user + side + ccy + maturity + inputAmount + inputUnitPrice + filledAmount + filledUnitPrice + filledAmountInFV + feeInFV + placedOrderId + placedAmount + placedUnitPrice + isCircuitBreakerTriggered + } + ... on OrdersCleanedEvent { + orderIds + maker + side + ccy + maturity + amount + futureValue + } + ... on PositionUnwoundEvent { + user + side + ccy + maturity + inputFutureValue + filledAmount + filledUnitPrice + filledAmountInFV + feeInFV + isCircuitBreakerTriggered + } + ... on PreOrderExecutedEvent { + user + side + ccy + maturity + amount + unitPrice + orderId + } + ... on CircuitBreakerLimitRangeUpdatedEvent { + ccy + previousRate + rate + } + ... on ItayoseExecutedEvent { + ccy + maturity + openingUnitPrice + lastLendUnitPrice + lastBorrowUnitPrice + offsetAmount + } + ... on OrderFeeRateUpdatedEvent { + ccy + previousRate + rate + } + } + proof{ + data + } + } +} \ No newline at end of file diff --git a/src/hooks.ts b/src/hooks.ts new file mode 100644 index 0000000..d45498b --- /dev/null +++ b/src/hooks.ts @@ -0,0 +1,86 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import assert from 'assert'; + +import { + ResultEvent, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + updateStateForMappingType, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + updateStateForElementaryType +} from '@cerc-io/util'; + +import { Indexer } from './indexer'; + +/** + * Hook function to store an initial state. + * @param indexer Indexer instance. + * @param blockHash Hash of the concerned block. + * @param contractAddress Address of the concerned contract. + * @returns Data block to be stored. + */ +export async function createInitialState (indexer: Indexer, contractAddress: string, blockHash: string): Promise { + assert(indexer); + assert(blockHash); + assert(contractAddress); + + // Store an empty State. + const stateData: any = { + state: {} + }; + + // Use updateStateForElementaryType to update initial state with an elementary property. + // Eg. const stateData = updateStateForElementaryType(stateData, '_totalBalance', result.value.toString()); + + // Use updateStateForMappingType to update initial state with a nested property. + // Eg. const stateData = updateStateForMappingType(stateData, '_allowances', [owner, spender], allowance.value.toString()); + + // Return initial state data to be saved. + return stateData; +} + +/** + * Hook function to create state diff. + * @param indexer Indexer instance that contains methods to fetch the contract variable values. + * @param blockHash Block hash of the concerned block. + */ +export async function createStateDiff (indexer: Indexer, blockHash: string): Promise { + assert(indexer); + assert(blockHash); + + // Use indexer.createDiff() method to save custom state diff(s). +} + +/** + * Hook function to create state checkpoint + * @param indexer Indexer instance. + * @param contractAddress Address of the concerned contract. + * @param blockHash Block hash of the concerned block. + * @returns Whether to disable default checkpoint. If false, the state from this hook is updated with that from default checkpoint. + */ +export async function createStateCheckpoint (indexer: Indexer, contractAddress: string, blockHash: string): Promise { + assert(indexer); + assert(blockHash); + assert(contractAddress); + + // Use indexer.createStateCheckpoint() method to create a custom checkpoint. + + // Return false to update the state created by this hook by auto-generated checkpoint state. + // Return true to disable update of the state created by this hook by auto-generated checkpoint state. + return false; +} + +/** + * Event hook function. + * @param indexer Indexer instance that contains methods to fetch and update the contract values in the database. + * @param eventData ResultEvent object containing event information. + */ +export async function handleEvent (indexer: Indexer, eventData: ResultEvent): Promise { + assert(indexer); + assert(eventData); + + // Use indexer methods to index data. + // Pass `diff` parameter to indexer methods as true to save an auto-generated state from the indexed data. +} diff --git a/src/indexer.ts b/src/indexer.ts new file mode 100644 index 0000000..fdcc2b4 --- /dev/null +++ b/src/indexer.ts @@ -0,0 +1,1008 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import assert from 'assert'; +import { DeepPartial, FindConditions, FindManyOptions, ObjectLiteral } from 'typeorm'; +import debug from 'debug'; +import { ethers, constants } from 'ethers'; +import { GraphQLResolveInfo } from 'graphql'; + +import { JsonFragment } from '@ethersproject/abi'; +import { BaseProvider } from '@ethersproject/providers'; +import { MappingKey, StorageLayout } from '@cerc-io/solidity-mapper'; +import { + Indexer as BaseIndexer, + IndexerInterface, + ValueResult, + ServerConfig, + JobQueue, + Where, + QueryOptions, + BlockHeight, + ResultMeta, + updateSubgraphState, + dumpSubgraphState, + GraphWatcherInterface, + StateKind, + StateStatus, + ResultEvent, + getResultEvent, + DatabaseInterface, + Clients, + EthClient, + UpstreamConfig, + EthFullBlock, + EthFullTransaction, + ExtraEventData +} from '@cerc-io/util'; +import { GraphWatcher } from '@cerc-io/graph-node'; + +import ExampleArtifacts from './artifacts/Example.json'; +import LendingMarketOperationLogicArtifacts from './artifacts/LendingMarketOperationLogic.json'; +import TokenVaultArtifacts from './artifacts/TokenVault.json'; +import FundManagementLogicArtifacts from './artifacts/FundManagementLogic.json'; +import LiquidationLogicArtifacts from './artifacts/LiquidationLogic.json'; +import OrderActionLogicArtifacts from './artifacts/OrderActionLogic.json'; +import OrderBookLogicArtifacts from './artifacts/OrderBookLogic.json'; +import { Database, ENTITIES, SUBGRAPH_ENTITIES } from './database'; +import { createInitialState, handleEvent, createStateDiff, createStateCheckpoint } from './hooks'; +import { Contract } from './entity/Contract'; +import { Event } from './entity/Event'; +import { SyncStatus } from './entity/SyncStatus'; +import { StateSyncStatus } from './entity/StateSyncStatus'; +import { BlockProgress } from './entity/BlockProgress'; +import { State } from './entity/State'; +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { Transaction } from './entity/Transaction'; +import { Order } from './entity/Order'; +import { LendingMarket } from './entity/LendingMarket'; +import { User } from './entity/User'; +import { DailyVolume } from './entity/DailyVolume'; +import { Protocol } from './entity/Protocol'; +import { Liquidation } from './entity/Liquidation'; +import { Transfer } from './entity/Transfer'; +import { Deposit } from './entity/Deposit'; +import { TransactionCandleStick } from './entity/TransactionCandleStick'; +/* eslint-enable @typescript-eslint/no-unused-vars */ + +import { FrothyEntity } from './entity/FrothyEntity'; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +const log = debug('vulcanize:indexer'); + +const KIND_EXAMPLE = 'Example1'; + +const KIND_LENDINGMARKETOPERATIONLOGIC = 'LendingMarketOperationLogic'; + +const KIND_TOKENVAULT = 'TokenVault'; + +const KIND_FUNDMANAGEMENTLOGIC = 'FundManagementLogic'; + +const KIND_LIQUIDATIONLOGIC = 'LiquidationLogic'; + +const KIND_ORDERACTIONLOGIC = 'OrderActionLogic'; + +const KIND_ORDERBOOKLOGIC = 'OrderBookLogic'; + +export class Indexer implements IndexerInterface { + _db: Database; + _ethClient: EthClient; + _ethProvider: BaseProvider; + _baseIndexer: BaseIndexer; + _serverConfig: ServerConfig; + _upstreamConfig: UpstreamConfig; + _graphWatcher: GraphWatcher; + + _abiMap: Map; + _storageLayoutMap: Map; + _contractMap: Map; + eventSignaturesMap: Map; + + _entityTypesMap: Map; + _relationsMap: Map; + + _subgraphStateMap: Map; + + constructor ( + config: { + server: ServerConfig; + upstream: UpstreamConfig; + }, + db: DatabaseInterface, + clients: Clients, + ethProvider: BaseProvider, + jobQueue: JobQueue, + graphWatcher?: GraphWatcherInterface + ) { + assert(db); + assert(clients.ethClient); + + this._db = db as Database; + this._ethClient = clients.ethClient; + this._ethProvider = ethProvider; + this._serverConfig = config.server; + this._upstreamConfig = config.upstream; + this._baseIndexer = new BaseIndexer(config, this._db, this._ethClient, this._ethProvider, jobQueue); + assert(graphWatcher); + this._graphWatcher = graphWatcher as GraphWatcher; + + this._abiMap = new Map(); + this._storageLayoutMap = new Map(); + this._contractMap = new Map(); + this.eventSignaturesMap = new Map(); + + const { abi: ExampleABI, storageLayout: ExampleStorageLayout } = ExampleArtifacts; + + const { abi: LendingMarketOperationLogicABI } = LendingMarketOperationLogicArtifacts; + + const { abi: TokenVaultABI } = TokenVaultArtifacts; + + const { abi: FundManagementLogicABI } = FundManagementLogicArtifacts; + + const { abi: LiquidationLogicABI } = LiquidationLogicArtifacts; + + const { abi: OrderActionLogicABI } = OrderActionLogicArtifacts; + + const { abi: OrderBookLogicABI } = OrderBookLogicArtifacts; + + assert(ExampleABI); + this._abiMap.set(KIND_EXAMPLE, ExampleABI); + + const ExampleContractInterface = new ethers.utils.Interface(ExampleABI); + this._contractMap.set(KIND_EXAMPLE, ExampleContractInterface); + + const ExampleEventSignatures = Object.values(ExampleContractInterface.events).map(value => { + return ExampleContractInterface.getEventTopic(value); + }); + this.eventSignaturesMap.set(KIND_EXAMPLE, ExampleEventSignatures); + + assert(ExampleStorageLayout); + this._storageLayoutMap.set(KIND_EXAMPLE, ExampleStorageLayout); + + assert(LendingMarketOperationLogicABI); + this._abiMap.set(KIND_LENDINGMARKETOPERATIONLOGIC, LendingMarketOperationLogicABI); + + const LendingMarketOperationLogicContractInterface = new ethers.utils.Interface(LendingMarketOperationLogicABI); + this._contractMap.set(KIND_LENDINGMARKETOPERATIONLOGIC, LendingMarketOperationLogicContractInterface); + + const LendingMarketOperationLogicEventSignatures = Object.values(LendingMarketOperationLogicContractInterface.events).map(value => { + return LendingMarketOperationLogicContractInterface.getEventTopic(value); + }); + this.eventSignaturesMap.set(KIND_LENDINGMARKETOPERATIONLOGIC, LendingMarketOperationLogicEventSignatures); + + assert(TokenVaultABI); + this._abiMap.set(KIND_TOKENVAULT, TokenVaultABI); + + const TokenVaultContractInterface = new ethers.utils.Interface(TokenVaultABI); + this._contractMap.set(KIND_TOKENVAULT, TokenVaultContractInterface); + + const TokenVaultEventSignatures = Object.values(TokenVaultContractInterface.events).map(value => { + return TokenVaultContractInterface.getEventTopic(value); + }); + this.eventSignaturesMap.set(KIND_TOKENVAULT, TokenVaultEventSignatures); + + assert(FundManagementLogicABI); + this._abiMap.set(KIND_FUNDMANAGEMENTLOGIC, FundManagementLogicABI); + + const FundManagementLogicContractInterface = new ethers.utils.Interface(FundManagementLogicABI); + this._contractMap.set(KIND_FUNDMANAGEMENTLOGIC, FundManagementLogicContractInterface); + + const FundManagementLogicEventSignatures = Object.values(FundManagementLogicContractInterface.events).map(value => { + return FundManagementLogicContractInterface.getEventTopic(value); + }); + this.eventSignaturesMap.set(KIND_FUNDMANAGEMENTLOGIC, FundManagementLogicEventSignatures); + + assert(LiquidationLogicABI); + this._abiMap.set(KIND_LIQUIDATIONLOGIC, LiquidationLogicABI); + + const LiquidationLogicContractInterface = new ethers.utils.Interface(LiquidationLogicABI); + this._contractMap.set(KIND_LIQUIDATIONLOGIC, LiquidationLogicContractInterface); + + const LiquidationLogicEventSignatures = Object.values(LiquidationLogicContractInterface.events).map(value => { + return LiquidationLogicContractInterface.getEventTopic(value); + }); + this.eventSignaturesMap.set(KIND_LIQUIDATIONLOGIC, LiquidationLogicEventSignatures); + + assert(OrderActionLogicABI); + this._abiMap.set(KIND_ORDERACTIONLOGIC, OrderActionLogicABI); + + const OrderActionLogicContractInterface = new ethers.utils.Interface(OrderActionLogicABI); + this._contractMap.set(KIND_ORDERACTIONLOGIC, OrderActionLogicContractInterface); + + const OrderActionLogicEventSignatures = Object.values(OrderActionLogicContractInterface.events).map(value => { + return OrderActionLogicContractInterface.getEventTopic(value); + }); + this.eventSignaturesMap.set(KIND_ORDERACTIONLOGIC, OrderActionLogicEventSignatures); + + assert(OrderBookLogicABI); + this._abiMap.set(KIND_ORDERBOOKLOGIC, OrderBookLogicABI); + + const OrderBookLogicContractInterface = new ethers.utils.Interface(OrderBookLogicABI); + this._contractMap.set(KIND_ORDERBOOKLOGIC, OrderBookLogicContractInterface); + + const OrderBookLogicEventSignatures = Object.values(OrderBookLogicContractInterface.events).map(value => { + return OrderBookLogicContractInterface.getEventTopic(value); + }); + this.eventSignaturesMap.set(KIND_ORDERBOOKLOGIC, OrderBookLogicEventSignatures); + + this._entityTypesMap = new Map(); + this._populateEntityTypesMap(); + + this._relationsMap = new Map(); + this._populateRelationsMap(); + + this._subgraphStateMap = new Map(); + } + + get serverConfig (): ServerConfig { + return this._serverConfig; + } + + get upstreamConfig (): UpstreamConfig { + return this._upstreamConfig; + } + + get storageLayoutMap (): Map { + return this._storageLayoutMap; + } + + get graphWatcher (): GraphWatcher { + return this._graphWatcher; + } + + async init (): Promise { + await this._baseIndexer.fetchContracts(); + await this._baseIndexer.fetchStateStatus(); + } + + switchClients ({ ethClient, ethProvider }: { ethClient: EthClient, ethProvider: BaseProvider }): void { + this._ethClient = ethClient; + this._ethProvider = ethProvider; + this._baseIndexer.switchClients({ ethClient, ethProvider }); + this._graphWatcher.switchClients({ ethClient, ethProvider }); + } + + async getMetaData (block: BlockHeight): Promise { + return this._baseIndexer.getMetaData(block); + } + + getResultEvent (event: Event): ResultEvent { + return getResultEvent(event); + } + + async getStorageValue (storageLayout: StorageLayout, blockHash: string, contractAddress: string, variable: string, ...mappingKeys: MappingKey[]): Promise { + return this._baseIndexer.getStorageValue( + storageLayout, + blockHash, + contractAddress, + variable, + ...mappingKeys + ); + } + + async getEntitiesForBlock (blockHash: string, tableName: string): Promise { + return this._db.getEntitiesForBlock(blockHash, tableName); + } + + async processInitialState (contractAddress: string, blockHash: string): Promise { + // Call initial state hook. + return createInitialState(this, contractAddress, blockHash); + } + + async processStateCheckpoint (contractAddress: string, blockHash: string): Promise { + // Call checkpoint hook. + return createStateCheckpoint(this, contractAddress, blockHash); + } + + async processCanonicalBlock (blockHash: string, blockNumber: number): Promise { + console.time('time:indexer#processCanonicalBlock-finalize_auto_diffs'); + // Finalize staged diff blocks if any. + await this._baseIndexer.finalizeDiffStaged(blockHash); + console.timeEnd('time:indexer#processCanonicalBlock-finalize_auto_diffs'); + + // Call custom stateDiff hook. + await createStateDiff(this, blockHash); + + this._graphWatcher.pruneEntityCacheFrothyBlocks(blockHash, blockNumber); + } + + async processCheckpoint (blockHash: string): Promise { + // Return if checkpointInterval is <= 0. + const checkpointInterval = this._serverConfig.checkpointInterval; + if (checkpointInterval <= 0) return; + + console.time('time:indexer#processCheckpoint-checkpoint'); + await this._baseIndexer.processCheckpoint(this, blockHash, checkpointInterval); + console.timeEnd('time:indexer#processCheckpoint-checkpoint'); + } + + async processCLICheckpoint (contractAddress: string, blockHash?: string): Promise { + return this._baseIndexer.processCLICheckpoint(this, contractAddress, blockHash); + } + + async getPrevState (blockHash: string, contractAddress: string, kind?: string): Promise { + return this._db.getPrevState(blockHash, contractAddress, kind); + } + + async getLatestState (contractAddress: string, kind: StateKind | null, blockNumber?: number): Promise { + return this._db.getLatestState(contractAddress, kind, blockNumber); + } + + async getStatesByHash (blockHash: string): Promise { + return this._baseIndexer.getStatesByHash(blockHash); + } + + async getStateByCID (cid: string): Promise { + return this._baseIndexer.getStateByCID(cid); + } + + async getStates (where: FindConditions): Promise { + return this._db.getStates(where); + } + + getStateData (state: State): any { + return this._baseIndexer.getStateData(state); + } + + // Method used to create auto diffs (diff_staged). + async createDiffStaged (contractAddress: string, blockHash: string, data: any): Promise { + console.time('time:indexer#createDiffStaged-auto_diff'); + await this._baseIndexer.createDiffStaged(contractAddress, blockHash, data); + console.timeEnd('time:indexer#createDiffStaged-auto_diff'); + } + + // Method to be used by createStateDiff hook. + async createDiff (contractAddress: string, blockHash: string, data: any): Promise { + const block = await this.getBlockProgress(blockHash); + assert(block); + + await this._baseIndexer.createDiff(contractAddress, block, data); + } + + // Method to be used by createStateCheckpoint hook. + async createStateCheckpoint (contractAddress: string, blockHash: string, data: any): Promise { + const block = await this.getBlockProgress(blockHash); + assert(block); + + return this._baseIndexer.createStateCheckpoint(contractAddress, block, data); + } + + // Method to be used by export-state CLI. + async createCheckpoint (contractAddress: string, blockHash: string): Promise { + const block = await this.getBlockProgress(blockHash); + assert(block); + + return this._baseIndexer.createCheckpoint(this, contractAddress, block); + } + + // Method to be used by fill-state CLI. + async createInit (blockHash: string, blockNumber: number): Promise { + // Create initial state for contracts. + await this._baseIndexer.createInit(this, blockHash, blockNumber); + } + + async saveOrUpdateState (state: State): Promise { + return this._baseIndexer.saveOrUpdateState(state); + } + + async removeStates (blockNumber: number, kind: StateKind): Promise { + await this._baseIndexer.removeStates(blockNumber, kind); + } + + async getSubgraphEntity ( + entity: new () => Entity, + id: string, + block: BlockHeight, + queryInfo: GraphQLResolveInfo + ): Promise { + const data = await this._graphWatcher.getEntity(entity, id, this._relationsMap, block, queryInfo); + + return data; + } + + async getSubgraphEntities ( + entity: new () => Entity, + block: BlockHeight, + where: { [key: string]: any } = {}, + queryOptions: QueryOptions = {}, + queryInfo: GraphQLResolveInfo + ): Promise { + return this._graphWatcher.getEntities(entity, this._relationsMap, block, where, queryOptions, queryInfo); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async triggerIndexingOnEvent (event: Event, extraData: ExtraEventData): Promise { + const resultEvent = this.getResultEvent(event); + + console.time('time:indexer#processEvent-mapping_code'); + // Call subgraph handler for event. + await this._graphWatcher.handleEvent(resultEvent, extraData); + console.timeEnd('time:indexer#processEvent-mapping_code'); + + // Call custom hook function for indexing on event. + await handleEvent(this, resultEvent); + } + + async processEvent (event: Event, extraData: ExtraEventData): Promise { + // Trigger indexing of data based on the event. + await this.triggerIndexingOnEvent(event, extraData); + } + + async processBlock (blockProgress: BlockProgress): Promise { + console.time('time:indexer#processBlock-init_state'); + // Call a function to create initial state for contracts. + await this._baseIndexer.createInit(this, blockProgress.blockHash, blockProgress.blockNumber); + console.timeEnd('time:indexer#processBlock-init_state'); + + this._graphWatcher.updateEntityCacheFrothyBlocks(blockProgress); + } + + async processBlockAfterEvents (blockHash: string, blockNumber: number, extraData: ExtraEventData): Promise { + console.time('time:indexer#processBlockAfterEvents-mapping_code'); + // Call subgraph handler for block. + await this._graphWatcher.handleBlock(blockHash, blockNumber, extraData); + console.timeEnd('time:indexer#processBlockAfterEvents-mapping_code'); + + console.time('time:indexer#processBlockAfterEvents-dump_subgraph_state'); + // Persist subgraph state to the DB. + await this.dumpSubgraphState(blockHash); + console.timeEnd('time:indexer#processBlockAfterEvents-dump_subgraph_state'); + } + + parseEventNameAndArgs (kind: string, logObj: any): { eventParsed: boolean, eventDetails: any } { + const { topics, data } = logObj; + + const contract = this._contractMap.get(kind); + assert(contract); + + let logDescription: ethers.utils.LogDescription; + try { + logDescription = contract.parseLog({ data, topics }); + } catch (err) { + // Return if no matching event found + if ((err as Error).message.includes('no matching event')) { + log(`WARNING: Skipping event for contract ${kind} as no matching event found in the ABI`); + return { eventParsed: false, eventDetails: {} }; + } + + throw err; + } + + const { eventName, eventInfo, eventSignature } = this._baseIndexer.parseEvent(logDescription); + + return { + eventParsed: true, + eventDetails: { + eventName, + eventInfo, + eventSignature + } + }; + } + + async getStateSyncStatus (): Promise { + return this._db.getStateSyncStatus(); + } + + async updateStateSyncStatusIndexedBlock (blockNumber: number, force?: boolean): Promise { + if (!this._serverConfig.enableState) { + return; + } + + const dbTx = await this._db.createTransactionRunner(); + let res; + + try { + res = await this._db.updateStateSyncStatusIndexedBlock(dbTx, blockNumber, force); + await dbTx.commitTransaction(); + } catch (error) { + await dbTx.rollbackTransaction(); + throw error; + } finally { + await dbTx.release(); + } + + return res; + } + + async updateStateSyncStatusCheckpointBlock (blockNumber: number, force?: boolean): Promise { + const dbTx = await this._db.createTransactionRunner(); + let res; + + try { + res = await this._db.updateStateSyncStatusCheckpointBlock(dbTx, blockNumber, force); + await dbTx.commitTransaction(); + } catch (error) { + await dbTx.rollbackTransaction(); + throw error; + } finally { + await dbTx.release(); + } + + return res; + } + + async getLatestCanonicalBlock (): Promise { + const syncStatus = await this.getSyncStatus(); + assert(syncStatus); + + if (syncStatus.latestCanonicalBlockHash === constants.HashZero) { + return; + } + + const latestCanonicalBlock = await this.getBlockProgress(syncStatus.latestCanonicalBlockHash); + assert(latestCanonicalBlock); + + return latestCanonicalBlock; + } + + async getLatestStateIndexedBlock (): Promise { + return this._baseIndexer.getLatestStateIndexedBlock(); + } + + async addContracts (): Promise { + // Watching all the contracts in the subgraph. + await this._graphWatcher.addContracts(); + } + + async watchContract (address: string, kind: string, checkpoint: boolean, startingBlock: number, context?: any): Promise { + return this._baseIndexer.watchContract(address, kind, checkpoint, startingBlock, context); + } + + updateStateStatusMap (address: string, stateStatus: StateStatus): void { + this._baseIndexer.updateStateStatusMap(address, stateStatus); + } + + cacheContract (contract: Contract): void { + return this._baseIndexer.cacheContract(contract); + } + + async saveEventEntity (dbEvent: Event): Promise { + return this._baseIndexer.saveEventEntity(dbEvent); + } + + async saveEvents (dbEvents: Event[]): Promise { + return this._baseIndexer.saveEvents(dbEvents); + } + + async getEventsByFilter (blockHash: string, contract?: string, name?: string): Promise> { + return this._baseIndexer.getEventsByFilter(blockHash, contract, name); + } + + isWatchedContract (address : string): Contract | undefined { + return this._baseIndexer.isWatchedContract(address); + } + + getWatchedContracts (): Contract[] { + return this._baseIndexer.getWatchedContracts(); + } + + getContractsByKind (kind: string): Contract[] { + return this._baseIndexer.getContractsByKind(kind); + } + + async getProcessedBlockCountForRange (fromBlockNumber: number, toBlockNumber: number): Promise<{ expected: number, actual: number }> { + return this._baseIndexer.getProcessedBlockCountForRange(fromBlockNumber, toBlockNumber); + } + + async getEventsInRange (fromBlockNumber: number, toBlockNumber: number): Promise> { + return this._baseIndexer.getEventsInRange(fromBlockNumber, toBlockNumber, this._serverConfig.maxEventsBlockRange); + } + + async getSyncStatus (): Promise { + return this._baseIndexer.getSyncStatus(); + } + + async getBlocks (blockFilter: { blockHash?: string, blockNumber?: number }): Promise { + return this._baseIndexer.getBlocks(blockFilter); + } + + async updateSyncStatusIndexedBlock (blockHash: string, blockNumber: number, force = false): Promise { + return this._baseIndexer.updateSyncStatusIndexedBlock(blockHash, blockNumber, force); + } + + async updateSyncStatusChainHead (blockHash: string, blockNumber: number, force = false): Promise { + return this._baseIndexer.updateSyncStatusChainHead(blockHash, blockNumber, force); + } + + async updateSyncStatusCanonicalBlock (blockHash: string, blockNumber: number, force = false): Promise { + const syncStatus = this._baseIndexer.updateSyncStatusCanonicalBlock(blockHash, blockNumber, force); + await this.pruneFrothyEntities(blockNumber); + + return syncStatus; + } + + async updateSyncStatusProcessedBlock (blockHash: string, blockNumber: number, force = false): Promise { + return this._baseIndexer.updateSyncStatusProcessedBlock(blockHash, blockNumber, force); + } + + async updateSyncStatusIndexingError (hasIndexingError: boolean): Promise { + return this._baseIndexer.updateSyncStatusIndexingError(hasIndexingError); + } + + async updateSyncStatus (syncStatus: DeepPartial): Promise { + return this._baseIndexer.updateSyncStatus(syncStatus); + } + + async getEvent (id: string): Promise { + return this._baseIndexer.getEvent(id); + } + + async getBlockProgress (blockHash: string): Promise { + return this._baseIndexer.getBlockProgress(blockHash); + } + + async getBlockProgressEntities (where: FindConditions, options: FindManyOptions): Promise { + return this._baseIndexer.getBlockProgressEntities(where, options); + } + + async getBlocksAtHeight (height: number, isPruned: boolean): Promise { + return this._baseIndexer.getBlocksAtHeight(height, isPruned); + } + + async fetchAndSaveFilteredEventsAndBlocks (startBlock: number, endBlock: number): Promise<{ + blockProgress: BlockProgress, + events: DeepPartial[], + ethFullBlock: EthFullBlock; + ethFullTransactions: EthFullTransaction[]; + }[]> { + return this._baseIndexer.fetchAndSaveFilteredEventsAndBlocks(startBlock, endBlock, this.eventSignaturesMap, this.parseEventNameAndArgs.bind(this)); + } + + async fetchEventsForContracts (blockHash: string, blockNumber: number, addresses: string[]): Promise[]> { + return this._baseIndexer.fetchEventsForContracts(blockHash, blockNumber, addresses, this.eventSignaturesMap, this.parseEventNameAndArgs.bind(this)); + } + + async saveBlockAndFetchEvents (block: DeepPartial): Promise<[ + BlockProgress, + DeepPartial[], + EthFullTransaction[] + ]> { + return this._saveBlockAndFetchEvents(block); + } + + async getBlockEvents (blockHash: string, where: Where, queryOptions: QueryOptions): Promise> { + return this._baseIndexer.getBlockEvents(blockHash, where, queryOptions); + } + + async removeUnknownEvents (block: BlockProgress): Promise { + return this._baseIndexer.removeUnknownEvents(Event, block); + } + + async markBlocksAsPruned (blocks: BlockProgress[]): Promise { + await this._baseIndexer.markBlocksAsPruned(blocks); + + await this._graphWatcher.pruneEntities(FrothyEntity, blocks, SUBGRAPH_ENTITIES); + } + + async pruneFrothyEntities (blockNumber: number): Promise { + await this._graphWatcher.pruneFrothyEntities(FrothyEntity, blockNumber); + } + + async resetLatestEntities (blockNumber: number): Promise { + await this._graphWatcher.resetLatestEntities(blockNumber); + } + + async updateBlockProgress (block: BlockProgress, lastProcessedEventIndex: number): Promise { + return this._baseIndexer.updateBlockProgress(block, lastProcessedEventIndex); + } + + async getAncestorAtHeight (blockHash: string, height: number): Promise { + return this._baseIndexer.getAncestorAtHeight(blockHash, height); + } + + async resetWatcherToBlock (blockNumber: number): Promise { + const entities = [...ENTITIES, FrothyEntity]; + await this._baseIndexer.resetWatcherToBlock(blockNumber, entities); + + await this.resetLatestEntities(blockNumber); + } + + async clearProcessedBlockData (block: BlockProgress): Promise { + const entities = [...ENTITIES, FrothyEntity]; + await this._baseIndexer.clearProcessedBlockData(block, entities); + + await this.resetLatestEntities(block.blockNumber); + } + + getEntityTypesMap (): Map { + return this._entityTypesMap; + } + + getRelationsMap (): Map { + return this._relationsMap; + } + + updateSubgraphState (contractAddress: string, data: any): void { + return updateSubgraphState(this._subgraphStateMap, contractAddress, data); + } + + async dumpSubgraphState (blockHash: string, isStateFinalized = false): Promise { + return dumpSubgraphState(this, this._subgraphStateMap, blockHash, isStateFinalized); + } + + _populateEntityTypesMap (): void { + this._entityTypesMap.set('Transaction', { + id: 'ID', + currency: 'Bytes', + maturity: 'BigInt', + side: 'Int', + executionPrice: 'BigInt', + user: 'User', + executionType: 'TransactionExecutionType', + futureValue: 'BigInt', + amount: 'BigInt', + feeInFV: 'BigInt', + averagePrice: 'BigDecimal', + lendingMarket: 'LendingMarket', + order: 'Order', + createdAt: 'BigInt', + blockNumber: 'BigInt', + txHash: 'Bytes' + }); + this._entityTypesMap.set('Order', { + id: 'ID', + orderId: 'BigInt', + user: 'User', + currency: 'Bytes', + side: 'Int', + maturity: 'BigInt', + inputUnitPrice: 'BigInt', + inputAmount: 'BigInt', + filledAmount: 'BigInt', + status: 'OrderStatus', + statusUpdatedAt: 'BigInt', + lendingMarket: 'LendingMarket', + isPreOrder: 'Boolean', + type: 'OrderType', + isCircuitBreakerTriggered: 'Boolean', + createdAt: 'BigInt', + blockNumber: 'BigInt', + txHash: 'Bytes' + }); + this._entityTypesMap.set('LendingMarket', { + id: 'ID', + currency: 'Bytes', + maturity: 'BigInt', + isActive: 'Boolean', + volume: 'BigInt', + openingUnitPrice: 'BigInt', + lastLendUnitPrice: 'BigInt', + lastBorrowUnitPrice: 'BigInt', + offsetAmount: 'BigInt' + }); + this._entityTypesMap.set('User', { + id: 'ID', + createdAt: 'BigInt', + transactionCount: 'BigInt', + orderCount: 'BigInt', + liquidationCount: 'BigInt', + transferCount: 'BigInt' + }); + this._entityTypesMap.set('DailyVolume', { + id: 'ID', + currency: 'Bytes', + maturity: 'BigInt', + day: 'String', + volume: 'BigInt', + timestamp: 'BigInt', + lendingMarket: 'LendingMarket' + }); + this._entityTypesMap.set('Protocol', { + id: 'ID', + totalUsers: 'BigInt' + }); + this._entityTypesMap.set('Liquidation', { + id: 'ID', + collateralCurrency: 'Bytes', + debtCurrency: 'Bytes', + debtMaturity: 'BigInt', + debtAmount: 'BigInt', + user: 'User', + timestamp: 'BigInt', + blockNumber: 'BigInt', + txHash: 'Bytes' + }); + this._entityTypesMap.set('Transfer', { + id: 'ID', + user: 'User', + currency: 'Bytes', + amount: 'BigInt', + transferType: 'TransferType', + timestamp: 'BigInt', + blockNumber: 'BigInt', + txHash: 'Bytes' + }); + this._entityTypesMap.set('Deposit', { + id: 'ID', + user: 'User', + currency: 'Bytes', + amount: 'BigInt' + }); + this._entityTypesMap.set('TransactionCandleStick', { + id: 'ID', + interval: 'BigInt', + currency: 'Bytes', + maturity: 'BigInt', + timestamp: 'BigInt', + open: 'BigInt', + close: 'BigInt', + high: 'BigInt', + low: 'BigInt', + average: 'BigDecimal', + volume: 'BigInt', + volumeInFV: 'BigInt', + lendingMarket: 'LendingMarket' + }); + } + + _populateRelationsMap (): void { + this._relationsMap.set(Transaction, { + user: { + entity: User, + isArray: false, + isDerived: false + }, + lendingMarket: { + entity: LendingMarket, + isArray: false, + isDerived: false + }, + order: { + entity: Order, + isArray: false, + isDerived: false + } + }); + this._relationsMap.set(Order, { + user: { + entity: User, + isArray: false, + isDerived: false + }, + lendingMarket: { + entity: LendingMarket, + isArray: false, + isDerived: false + }, + transactions: { + entity: Transaction, + isArray: true, + isDerived: true, + field: 'order' + } + }); + this._relationsMap.set(LendingMarket, { + transactions: { + entity: Transaction, + isArray: true, + isDerived: true, + field: 'lendingMarket' + }, + orders: { + entity: Order, + isArray: true, + isDerived: true, + field: 'lendingMarket' + }, + dailyVolume: { + entity: DailyVolume, + isArray: true, + isDerived: true, + field: 'lendingMarket' + } + }); + this._relationsMap.set(User, { + transactions: { + entity: Transaction, + isArray: true, + isDerived: true, + field: 'user' + }, + orders: { + entity: Order, + isArray: true, + isDerived: true, + field: 'user' + }, + liquidations: { + entity: Liquidation, + isArray: true, + isDerived: true, + field: 'user' + }, + transfers: { + entity: Transfer, + isArray: true, + isDerived: true, + field: 'user' + }, + deposits: { + entity: Deposit, + isArray: true, + isDerived: true, + field: 'user' + } + }); + this._relationsMap.set(DailyVolume, { + lendingMarket: { + entity: LendingMarket, + isArray: false, + isDerived: false + } + }); + this._relationsMap.set(Liquidation, { + user: { + entity: User, + isArray: false, + isDerived: false + } + }); + this._relationsMap.set(Transfer, { + user: { + entity: User, + isArray: false, + isDerived: false + } + }); + this._relationsMap.set(Deposit, { + user: { + entity: User, + isArray: false, + isDerived: false + } + }); + this._relationsMap.set(TransactionCandleStick, { + lendingMarket: { + entity: LendingMarket, + isArray: false, + isDerived: false + } + }); + } + + async _saveBlockAndFetchEvents ({ + cid: blockCid, + blockHash, + blockNumber, + blockTimestamp, + parentHash + }: DeepPartial): Promise<[ + BlockProgress, + DeepPartial[], + EthFullTransaction[] + ]> { + assert(blockHash); + assert(blockNumber); + + const { events: dbEvents, transactions } = await this._baseIndexer.fetchEvents(blockHash, blockNumber, this.eventSignaturesMap, this.parseEventNameAndArgs.bind(this)); + + const dbTx = await this._db.createTransactionRunner(); + try { + const block = { + cid: blockCid, + blockHash, + blockNumber, + blockTimestamp, + parentHash + }; + + console.time(`time:indexer#_saveBlockAndFetchEvents-db-save-${blockNumber}`); + const blockProgress = await this._db.saveBlockWithEvents(dbTx, block, dbEvents); + await dbTx.commitTransaction(); + console.timeEnd(`time:indexer#_saveBlockAndFetchEvents-db-save-${blockNumber}`); + + return [blockProgress, [], transactions]; + } catch (error) { + await dbTx.rollbackTransaction(); + throw error; + } finally { + await dbTx.release(); + } + } + + async getFullTransactions (txHashList: string[]): Promise { + return this._baseIndexer.getFullTransactions(txHashList); + } +} diff --git a/src/job-runner.ts b/src/job-runner.ts new file mode 100644 index 0000000..93d6820 --- /dev/null +++ b/src/job-runner.ts @@ -0,0 +1,48 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import debug from 'debug'; + +import { JobRunnerCmd } from '@cerc-io/cli'; +import { JobRunner } from '@cerc-io/util'; +import { getGraphDbAndWatcher } from '@cerc-io/graph-node'; + +import { Indexer } from './indexer'; +import { Database, ENTITY_QUERY_TYPE_MAP, ENTITY_TO_LATEST_ENTITY_MAP } from './database'; + +const log = debug('vulcanize:job-runner'); + +export const main = async (): Promise => { + const jobRunnerCmd = new JobRunnerCmd(); + await jobRunnerCmd.init(Database); + + const { graphWatcher } = await getGraphDbAndWatcher( + jobRunnerCmd.config.server, + jobRunnerCmd.clients.ethClient, + jobRunnerCmd.ethProvider, + jobRunnerCmd.database.baseDatabase, + ENTITY_QUERY_TYPE_MAP, + ENTITY_TO_LATEST_ENTITY_MAP + ); + + await jobRunnerCmd.initIndexer(Indexer, graphWatcher); + + await jobRunnerCmd.exec(async (jobRunner: JobRunner): Promise => { + await jobRunner.subscribeBlockProcessingQueue(); + await jobRunner.subscribeHistoricalProcessingQueue(); + await jobRunner.subscribeEventProcessingQueue(); + await jobRunner.subscribeBlockCheckpointQueue(); + await jobRunner.subscribeHooksQueue(); + }); +}; + +main().then(() => { + log('Starting job runner...'); +}).catch(err => { + log(err); +}); + +process.on('uncaughtException', err => { + log('uncaughtException', err); +}); diff --git a/src/resolvers.ts b/src/resolvers.ts new file mode 100644 index 0000000..551d567 --- /dev/null +++ b/src/resolvers.ts @@ -0,0 +1,527 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import assert from 'assert'; +import debug from 'debug'; +import { GraphQLResolveInfo } from 'graphql'; + +import { + gqlTotalQueryCount, + gqlQueryCount, + getResultState, + IndexerInterface, + GraphQLBigInt, + GraphQLBigDecimal, + BlockHeight, + OrderDirection, + jsonBigIntStringReplacer, + EventWatcher, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + setGQLCacheHints +} from '@cerc-io/util'; + +import { Indexer } from './indexer'; + +import { Transaction } from './entity/Transaction'; +import { Order } from './entity/Order'; +import { LendingMarket } from './entity/LendingMarket'; +import { User } from './entity/User'; +import { DailyVolume } from './entity/DailyVolume'; +import { Protocol } from './entity/Protocol'; +import { Liquidation } from './entity/Liquidation'; +import { Transfer } from './entity/Transfer'; +import { Deposit } from './entity/Deposit'; +import { TransactionCandleStick } from './entity/TransactionCandleStick'; + +const log = debug('vulcanize:resolver'); + +export const createResolvers = async (indexerArg: IndexerInterface, eventWatcher: EventWatcher): Promise => { + const indexer = indexerArg as Indexer; + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const gqlCacheConfig = indexer.serverConfig.gqlCache; + + return { + BigInt: GraphQLBigInt, + + BigDecimal: GraphQLBigDecimal, + + Event: { + __resolveType: (obj: any) => { + assert(obj.__typename); + + return obj.__typename; + } + }, + + Subscription: { + onEvent: { + subscribe: () => eventWatcher.getEventIterator() + } + }, + + Mutation: { + watchContract: async (_: any, { address, kind, checkpoint, startingBlock = 1 }: { address: string, kind: string, checkpoint: boolean, startingBlock: number }): Promise => { + log('watchContract', address, kind, checkpoint, startingBlock); + await indexer.watchContract(address, kind, checkpoint, startingBlock); + + return true; + } + }, + + Query: { + transaction: async ( + _: any, + { id, block = {} }: { id: string, block: BlockHeight }, + __: any, + info: GraphQLResolveInfo + ) => { + log('transaction', id, JSON.stringify(block, jsonBigIntStringReplacer)); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('transaction').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntity(Transaction, id, block, info); + }, + + transactions: async ( + _: any, + { block = {}, where, first, skip, orderBy, orderDirection }: { block: BlockHeight, where: { [key: string]: any }, first: number, skip: number, orderBy: string, orderDirection: OrderDirection }, + __: any, + info: GraphQLResolveInfo + ) => { + log('transactions', JSON.stringify(block, jsonBigIntStringReplacer), JSON.stringify(where, jsonBigIntStringReplacer), first, skip, orderBy, orderDirection); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('transactions').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntities( + Transaction, + block, + where, + { limit: first, skip, orderBy, orderDirection }, + info + ); + }, + + order: async ( + _: any, + { id, block = {} }: { id: string, block: BlockHeight }, + __: any, + info: GraphQLResolveInfo + ) => { + log('order', id, JSON.stringify(block, jsonBigIntStringReplacer)); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('order').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntity(Order, id, block, info); + }, + + orders: async ( + _: any, + { block = {}, where, first, skip, orderBy, orderDirection }: { block: BlockHeight, where: { [key: string]: any }, first: number, skip: number, orderBy: string, orderDirection: OrderDirection }, + __: any, + info: GraphQLResolveInfo + ) => { + log('orders', JSON.stringify(block, jsonBigIntStringReplacer), JSON.stringify(where, jsonBigIntStringReplacer), first, skip, orderBy, orderDirection); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('orders').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntities( + Order, + block, + where, + { limit: first, skip, orderBy, orderDirection }, + info + ); + }, + + lendingMarket: async ( + _: any, + { id, block = {} }: { id: string, block: BlockHeight }, + __: any, + info: GraphQLResolveInfo + ) => { + log('lendingMarket', id, JSON.stringify(block, jsonBigIntStringReplacer)); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('lendingMarket').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntity(LendingMarket, id, block, info); + }, + + lendingMarkets: async ( + _: any, + { block = {}, where, first, skip, orderBy, orderDirection }: { block: BlockHeight, where: { [key: string]: any }, first: number, skip: number, orderBy: string, orderDirection: OrderDirection }, + __: any, + info: GraphQLResolveInfo + ) => { + log('lendingMarkets', JSON.stringify(block, jsonBigIntStringReplacer), JSON.stringify(where, jsonBigIntStringReplacer), first, skip, orderBy, orderDirection); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('lendingMarkets').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntities( + LendingMarket, + block, + where, + { limit: first, skip, orderBy, orderDirection }, + info + ); + }, + + user: async ( + _: any, + { id, block = {} }: { id: string, block: BlockHeight }, + __: any, + info: GraphQLResolveInfo + ) => { + log('user', id, JSON.stringify(block, jsonBigIntStringReplacer)); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('user').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntity(User, id, block, info); + }, + + users: async ( + _: any, + { block = {}, where, first, skip, orderBy, orderDirection }: { block: BlockHeight, where: { [key: string]: any }, first: number, skip: number, orderBy: string, orderDirection: OrderDirection }, + __: any, + info: GraphQLResolveInfo + ) => { + log('users', JSON.stringify(block, jsonBigIntStringReplacer), JSON.stringify(where, jsonBigIntStringReplacer), first, skip, orderBy, orderDirection); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('users').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntities( + User, + block, + where, + { limit: first, skip, orderBy, orderDirection }, + info + ); + }, + + dailyVolume: async ( + _: any, + { id, block = {} }: { id: string, block: BlockHeight }, + __: any, + info: GraphQLResolveInfo + ) => { + log('dailyVolume', id, JSON.stringify(block, jsonBigIntStringReplacer)); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('dailyVolume').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntity(DailyVolume, id, block, info); + }, + + dailyVolumes: async ( + _: any, + { block = {}, where, first, skip, orderBy, orderDirection }: { block: BlockHeight, where: { [key: string]: any }, first: number, skip: number, orderBy: string, orderDirection: OrderDirection }, + __: any, + info: GraphQLResolveInfo + ) => { + log('dailyVolumes', JSON.stringify(block, jsonBigIntStringReplacer), JSON.stringify(where, jsonBigIntStringReplacer), first, skip, orderBy, orderDirection); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('dailyVolumes').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntities( + DailyVolume, + block, + where, + { limit: first, skip, orderBy, orderDirection }, + info + ); + }, + + protocol: async ( + _: any, + { id, block = {} }: { id: string, block: BlockHeight }, + __: any, + info: GraphQLResolveInfo + ) => { + log('protocol', id, JSON.stringify(block, jsonBigIntStringReplacer)); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('protocol').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntity(Protocol, id, block, info); + }, + + protocols: async ( + _: any, + { block = {}, where, first, skip, orderBy, orderDirection }: { block: BlockHeight, where: { [key: string]: any }, first: number, skip: number, orderBy: string, orderDirection: OrderDirection }, + __: any, + info: GraphQLResolveInfo + ) => { + log('protocols', JSON.stringify(block, jsonBigIntStringReplacer), JSON.stringify(where, jsonBigIntStringReplacer), first, skip, orderBy, orderDirection); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('protocols').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntities( + Protocol, + block, + where, + { limit: first, skip, orderBy, orderDirection }, + info + ); + }, + + liquidation: async ( + _: any, + { id, block = {} }: { id: string, block: BlockHeight }, + __: any, + info: GraphQLResolveInfo + ) => { + log('liquidation', id, JSON.stringify(block, jsonBigIntStringReplacer)); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('liquidation').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntity(Liquidation, id, block, info); + }, + + liquidations: async ( + _: any, + { block = {}, where, first, skip, orderBy, orderDirection }: { block: BlockHeight, where: { [key: string]: any }, first: number, skip: number, orderBy: string, orderDirection: OrderDirection }, + __: any, + info: GraphQLResolveInfo + ) => { + log('liquidations', JSON.stringify(block, jsonBigIntStringReplacer), JSON.stringify(where, jsonBigIntStringReplacer), first, skip, orderBy, orderDirection); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('liquidations').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntities( + Liquidation, + block, + where, + { limit: first, skip, orderBy, orderDirection }, + info + ); + }, + + transfer: async ( + _: any, + { id, block = {} }: { id: string, block: BlockHeight }, + __: any, + info: GraphQLResolveInfo + ) => { + log('transfer', id, JSON.stringify(block, jsonBigIntStringReplacer)); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('transfer').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntity(Transfer, id, block, info); + }, + + transfers: async ( + _: any, + { block = {}, where, first, skip, orderBy, orderDirection }: { block: BlockHeight, where: { [key: string]: any }, first: number, skip: number, orderBy: string, orderDirection: OrderDirection }, + __: any, + info: GraphQLResolveInfo + ) => { + log('transfers', JSON.stringify(block, jsonBigIntStringReplacer), JSON.stringify(where, jsonBigIntStringReplacer), first, skip, orderBy, orderDirection); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('transfers').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntities( + Transfer, + block, + where, + { limit: first, skip, orderBy, orderDirection }, + info + ); + }, + + deposit: async ( + _: any, + { id, block = {} }: { id: string, block: BlockHeight }, + __: any, + info: GraphQLResolveInfo + ) => { + log('deposit', id, JSON.stringify(block, jsonBigIntStringReplacer)); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('deposit').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntity(Deposit, id, block, info); + }, + + deposits: async ( + _: any, + { block = {}, where, first, skip, orderBy, orderDirection }: { block: BlockHeight, where: { [key: string]: any }, first: number, skip: number, orderBy: string, orderDirection: OrderDirection }, + __: any, + info: GraphQLResolveInfo + ) => { + log('deposits', JSON.stringify(block, jsonBigIntStringReplacer), JSON.stringify(where, jsonBigIntStringReplacer), first, skip, orderBy, orderDirection); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('deposits').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntities( + Deposit, + block, + where, + { limit: first, skip, orderBy, orderDirection }, + info + ); + }, + + transactionCandleStick: async ( + _: any, + { id, block = {} }: { id: string, block: BlockHeight }, + __: any, + info: GraphQLResolveInfo + ) => { + log('transactionCandleStick', id, JSON.stringify(block, jsonBigIntStringReplacer)); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('transactionCandleStick').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntity(TransactionCandleStick, id, block, info); + }, + + transactionCandleSticks: async ( + _: any, + { block = {}, where, first, skip, orderBy, orderDirection }: { block: BlockHeight, where: { [key: string]: any }, first: number, skip: number, orderBy: string, orderDirection: OrderDirection }, + __: any, + info: GraphQLResolveInfo + ) => { + log('transactionCandleSticks', JSON.stringify(block, jsonBigIntStringReplacer), JSON.stringify(where, jsonBigIntStringReplacer), first, skip, orderBy, orderDirection); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('transactionCandleSticks').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, block, gqlCacheConfig); + + return indexer.getSubgraphEntities( + TransactionCandleStick, + block, + where, + { limit: first, skip, orderBy, orderDirection }, + info + ); + }, + + events: async (_: any, { blockHash, contractAddress, name }: { blockHash: string, contractAddress: string, name?: string }) => { + log('events', blockHash, contractAddress, name); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('events').inc(1); + + const block = await indexer.getBlockProgress(blockHash); + if (!block || !block.isComplete) { + throw new Error(`Block hash ${blockHash} number ${block?.blockNumber} not processed yet`); + } + + const events = await indexer.getEventsByFilter(blockHash, contractAddress, name); + return events.map(event => indexer.getResultEvent(event)); + }, + + eventsInRange: async (_: any, { fromBlockNumber, toBlockNumber }: { fromBlockNumber: number, toBlockNumber: number }) => { + log('eventsInRange', fromBlockNumber, toBlockNumber); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('eventsInRange').inc(1); + + const syncStatus = await indexer.getSyncStatus(); + + if (!syncStatus) { + throw new Error('No blocks processed yet'); + } + + if ((fromBlockNumber < syncStatus.initialIndexedBlockNumber) || (toBlockNumber > syncStatus.latestProcessedBlockNumber)) { + throw new Error(`Block range should be between ${syncStatus.initialIndexedBlockNumber} and ${syncStatus.latestProcessedBlockNumber}`); + } + + const events = await indexer.getEventsInRange(fromBlockNumber, toBlockNumber); + return events.map(event => indexer.getResultEvent(event)); + }, + + getStateByCID: async (_: any, { cid }: { cid: string }) => { + log('getStateByCID', cid); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getStateByCID').inc(1); + + const state = await indexer.getStateByCID(cid); + + return state && state.block.isComplete ? getResultState(state) : undefined; + }, + + getState: async (_: any, { blockHash, contractAddress, kind }: { blockHash: string, contractAddress: string, kind: string }) => { + log('getState', blockHash, contractAddress, kind); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getState').inc(1); + + const state = await indexer.getPrevState(blockHash, contractAddress, kind); + + return state && state.block.isComplete ? getResultState(state) : undefined; + }, + + _meta: async ( + _: any, + { block = {} }: { block: BlockHeight } + ) => { + log('_meta'); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('_meta').inc(1); + + return indexer.getMetaData(block); + }, + + getSyncStatus: async () => { + log('getSyncStatus'); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getSyncStatus').inc(1); + + return indexer.getSyncStatus(); + } + } + }; +}; diff --git a/src/schema.gql b/src/schema.gql new file mode 100644 index 0000000..5df53c5 --- /dev/null +++ b/src/schema.gql @@ -0,0 +1,1755 @@ +directive @cacheControl(maxAge: Int, inheritMaxAge: Boolean, scope: CacheControlScope) on FIELD_DEFINITION | OBJECT | INTERFACE | UNION + +enum CacheControlScope { + PUBLIC + PRIVATE +} + +scalar BigInt + +scalar BigDecimal + +scalar Bytes + +type Proof { + data: String! +} + +type _Block_ { + cid: String + hash: String! + number: Int! + timestamp: Int! + parentHash: String! +} + +type _Transaction_ { + hash: String! + index: Int! + from: String! + to: String! +} + +type ResultEvent { + block: _Block_! + tx: _Transaction_! + contract: String! + eventIndex: Int! + event: Event! + proof: Proof +} + +union Event = TestEvent | EmergencyTerminationExecutedEvent | LendingMarketInitializedEvent | MinDebtUnitPriceUpdatedEvent | OrderBookCreatedEvent | OrderBooksRotatedEvent | ZCTokenCreatedEvent | CacheUpdatedEvent | CurrencyRegisteredEvent | CurrencyUpdatedEvent | DepositEvent | FullLiquidationThresholdRateUpdatedEvent | InitializedEvent | LiquidationProtocolFeeRateUpdatedEvent | LiquidationThresholdRateUpdatedEvent | LiquidatorFeeRateUpdatedEvent | OwnershipTransferredEvent | PausedEvent | RoleAdminChangedEvent | RoleGrantedEvent | RoleRevokedEvent | TransferEvent | UnpausedEvent | WithdrawEvent | EmergencySettlementExecutedEvent | OrderFilledEvent | OrderPartiallyFilledEvent | OrdersFilledInAsyncEvent | RedemptionExecutedEvent | RepaymentExecutedEvent | ForcedRepaymentExecutedEvent | LiquidationExecutedEvent | BlockUnitPriceHistoryUpdatedEvent | OrderCanceledEvent | OrderExecutedEvent | OrdersCleanedEvent | PositionUnwoundEvent | PreOrderExecutedEvent | CircuitBreakerLimitRangeUpdatedEvent | ItayoseExecutedEvent | OrderFeeRateUpdatedEvent + +type TestEvent { + param1: String! + param2: Int! + param3: BigInt! +} + +type EmergencyTerminationExecutedEvent { + timestamp: BigInt! +} + +type LendingMarketInitializedEvent { + ccy: String! + genesisDate: BigInt! + compoundFactor: BigInt! + orderFeeRate: BigInt! + circuitBreakerLimitRange: BigInt! + lendingMarket: String! + futureValueVault: String! +} + +type MinDebtUnitPriceUpdatedEvent { + ccy: String! + minDebtUnitPrice: BigInt! +} + +type OrderBookCreatedEvent { + ccy: String + orderBookId: Int! + openingDate: BigInt! + preOpeningDate: BigInt + maturity: BigInt! +} + +type OrderBooksRotatedEvent { + ccy: String! + oldMaturity: BigInt! + newMaturity: BigInt! +} + +type ZCTokenCreatedEvent { + ccy: String! + maturity: BigInt! + name: String! + symbol: String! + decimals: Int! + tokenAddress: String! +} + +type CacheUpdatedEvent { + name: String! + destination: String! +} + +type CurrencyRegisteredEvent { + ccy: String! + tokenAddress: String! + isCollateral: Boolean! +} + +type CurrencyUpdatedEvent { + ccy: String! + isCollateral: Boolean! +} + +type DepositEvent { + user: String! + ccy: String! + amount: BigInt! + caller: String! +} + +type FullLiquidationThresholdRateUpdatedEvent { + previousRate: BigInt! + ratio: BigInt! +} + +type InitializedEvent { + version: Int! +} + +type LiquidationProtocolFeeRateUpdatedEvent { + previousRate: BigInt! + ratio: BigInt! +} + +type LiquidationThresholdRateUpdatedEvent { + previousRate: BigInt! + ratio: BigInt! +} + +type LiquidatorFeeRateUpdatedEvent { + previousRate: BigInt! + ratio: BigInt! +} + +type OwnershipTransferredEvent { + previousOwner: String! + newOwner: String! +} + +type PausedEvent { + account: String! +} + +type RoleAdminChangedEvent { + role: String! + previousAdminRole: String! + newAdminRole: String! +} + +type RoleGrantedEvent { + role: String! + account: String! + sender: String! +} + +type RoleRevokedEvent { + role: String! + account: String! + sender: String! +} + +type TransferEvent { + ccy: String! + from: String! + to: String! + amount: BigInt! +} + +type UnpausedEvent { + account: String! +} + +type WithdrawEvent { + user: String! + ccy: String! + amount: BigInt! +} + +type EmergencySettlementExecutedEvent { + user: String! + amount: BigInt! +} + +type OrderFilledEvent { + taker: String! + ccy: String! + side: Int! + maturity: BigInt! + amount: BigInt! + amountInFV: BigInt! + feeInFV: BigInt! +} + +type OrderPartiallyFilledEvent { + orderId: BigInt! + maker: String! + ccy: String! + side: Int! + maturity: BigInt! + amount: BigInt! + amountInFV: BigInt! +} + +type OrdersFilledInAsyncEvent { + taker: String! + ccy: String! + side: Int! + maturity: BigInt! + amount: BigInt! + amountInFV: BigInt! +} + +type RedemptionExecutedEvent { + user: String! + ccy: String! + maturity: BigInt! + amount: BigInt! +} + +type RepaymentExecutedEvent { + user: String! + ccy: String! + maturity: BigInt! + amount: BigInt! +} + +type ForcedRepaymentExecutedEvent { + user: String! + collateralCcy: String! + debtCcy: String! + debtMaturity: BigInt! + debtAmount: BigInt! +} + +type LiquidationExecutedEvent { + user: String! + collateralCcy: String! + debtCcy: String! + debtMaturity: BigInt! + debtAmount: BigInt! +} + +type BlockUnitPriceHistoryUpdatedEvent { + ccy: String! + maturity: BigInt! + blockUnitPrice: BigInt! +} + +type OrderCanceledEvent { + orderId: BigInt! + maker: String! + side: Int! + ccy: String! + maturity: BigInt! + amount: BigInt! + unitPrice: BigInt! +} + +type OrderExecutedEvent { + user: String! + side: Int! + ccy: String! + maturity: BigInt! + inputAmount: BigInt! + inputUnitPrice: BigInt! + filledAmount: BigInt! + filledUnitPrice: BigInt! + filledAmountInFV: BigInt! + feeInFV: BigInt! + placedOrderId: BigInt! + placedAmount: BigInt! + placedUnitPrice: BigInt! + isCircuitBreakerTriggered: Boolean! +} + +type OrdersCleanedEvent { + orderIds: [BigInt!] + maker: String! + side: Int! + ccy: String! + maturity: BigInt! + amount: BigInt! + futureValue: BigInt! +} + +type PositionUnwoundEvent { + user: String! + side: Int! + ccy: String! + maturity: BigInt! + inputFutureValue: BigInt! + filledAmount: BigInt! + filledUnitPrice: BigInt! + filledAmountInFV: BigInt! + feeInFV: BigInt! + isCircuitBreakerTriggered: Boolean! +} + +type PreOrderExecutedEvent { + user: String! + side: Int! + ccy: String! + maturity: BigInt! + amount: BigInt! + unitPrice: BigInt! + orderId: BigInt! +} + +type CircuitBreakerLimitRangeUpdatedEvent { + ccy: String! + previousRate: BigInt! + rate: BigInt! +} + +type ItayoseExecutedEvent { + ccy: String! + maturity: BigInt! + openingUnitPrice: BigInt! + lastLendUnitPrice: BigInt! + lastBorrowUnitPrice: BigInt! + offsetAmount: BigInt! +} + +type OrderFeeRateUpdatedEvent { + ccy: String! + previousRate: BigInt! + rate: BigInt! +} + +input Block_height { + hash: Bytes + number: Int +} + +input BlockChangedFilter { + number_gte: Int! +} + +enum OrderDirection { + asc + desc +} + +enum Transaction_orderBy { + id + currency + maturity + side + executionPrice + user + user__id + user__createdAt + user__transactionCount + user__orderCount + user__liquidationCount + user__transferCount + executionType + futureValue + amount + feeInFV + averagePrice + lendingMarket + lendingMarket__id + lendingMarket__currency + lendingMarket__maturity + lendingMarket__isActive + lendingMarket__volume + lendingMarket__openingUnitPrice + lendingMarket__lastLendUnitPrice + lendingMarket__lastBorrowUnitPrice + lendingMarket__offsetAmount + order + order__id + order__orderId + order__currency + order__side + order__maturity + order__inputUnitPrice + order__inputAmount + order__filledAmount + order__status + order__statusUpdatedAt + order__isPreOrder + order__type + order__isCircuitBreakerTriggered + order__createdAt + order__blockNumber + order__txHash + createdAt + blockNumber + txHash +} + +input Transaction_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + currency: Bytes + currency_not: Bytes + currency_gt: Bytes + currency_lt: Bytes + currency_gte: Bytes + currency_lte: Bytes + currency_in: [Bytes!] + currency_not_in: [Bytes!] + currency_contains: Bytes + currency_not_contains: Bytes + maturity: BigInt + maturity_not: BigInt + maturity_gt: BigInt + maturity_lt: BigInt + maturity_gte: BigInt + maturity_lte: BigInt + maturity_in: [BigInt!] + maturity_not_in: [BigInt!] + side: Int + side_not: Int + side_gt: Int + side_lt: Int + side_gte: Int + side_lte: Int + side_in: [Int!] + side_not_in: [Int!] + executionPrice: BigInt + executionPrice_not: BigInt + executionPrice_gt: BigInt + executionPrice_lt: BigInt + executionPrice_gte: BigInt + executionPrice_lte: BigInt + executionPrice_in: [BigInt!] + executionPrice_not_in: [BigInt!] + user: String + user_not: String + user_gt: String + user_lt: String + user_gte: String + user_lte: String + user_in: [String!] + user_not_in: [String!] + user_starts_with: String + user_starts_with_nocase: String + user_not_starts_with: String + user_not_starts_with_nocase: String + user_ends_with: String + user_ends_with_nocase: String + user_not_ends_with: String + user_not_ends_with_nocase: String + user_contains: String + user_not_contains: String + user_contains_nocase: String + user_not_contains_nocase: String + user_: User_filter + executionType: TransactionExecutionType + executionType_not: TransactionExecutionType + executionType_gt: TransactionExecutionType + executionType_lt: TransactionExecutionType + executionType_gte: TransactionExecutionType + executionType_lte: TransactionExecutionType + executionType_in: [TransactionExecutionType!] + executionType_not_in: [TransactionExecutionType!] + futureValue: BigInt + futureValue_not: BigInt + futureValue_gt: BigInt + futureValue_lt: BigInt + futureValue_gte: BigInt + futureValue_lte: BigInt + futureValue_in: [BigInt!] + futureValue_not_in: [BigInt!] + amount: BigInt + amount_not: BigInt + amount_gt: BigInt + amount_lt: BigInt + amount_gte: BigInt + amount_lte: BigInt + amount_in: [BigInt!] + amount_not_in: [BigInt!] + feeInFV: BigInt + feeInFV_not: BigInt + feeInFV_gt: BigInt + feeInFV_lt: BigInt + feeInFV_gte: BigInt + feeInFV_lte: BigInt + feeInFV_in: [BigInt!] + feeInFV_not_in: [BigInt!] + averagePrice: BigDecimal + averagePrice_not: BigDecimal + averagePrice_gt: BigDecimal + averagePrice_lt: BigDecimal + averagePrice_gte: BigDecimal + averagePrice_lte: BigDecimal + averagePrice_in: [BigDecimal!] + averagePrice_not_in: [BigDecimal!] + lendingMarket: String + lendingMarket_not: String + lendingMarket_gt: String + lendingMarket_lt: String + lendingMarket_gte: String + lendingMarket_lte: String + lendingMarket_in: [String!] + lendingMarket_not_in: [String!] + lendingMarket_starts_with: String + lendingMarket_starts_with_nocase: String + lendingMarket_not_starts_with: String + lendingMarket_not_starts_with_nocase: String + lendingMarket_ends_with: String + lendingMarket_ends_with_nocase: String + lendingMarket_not_ends_with: String + lendingMarket_not_ends_with_nocase: String + lendingMarket_contains: String + lendingMarket_not_contains: String + lendingMarket_contains_nocase: String + lendingMarket_not_contains_nocase: String + lendingMarket_: LendingMarket_filter + order: String + order_not: String + order_gt: String + order_lt: String + order_gte: String + order_lte: String + order_in: [String!] + order_not_in: [String!] + order_starts_with: String + order_starts_with_nocase: String + order_not_starts_with: String + order_not_starts_with_nocase: String + order_ends_with: String + order_ends_with_nocase: String + order_not_ends_with: String + order_not_ends_with_nocase: String + order_contains: String + order_not_contains: String + order_contains_nocase: String + order_not_contains_nocase: String + order_: Order_filter + createdAt: BigInt + createdAt_not: BigInt + createdAt_gt: BigInt + createdAt_lt: BigInt + createdAt_gte: BigInt + createdAt_lte: BigInt + createdAt_in: [BigInt!] + createdAt_not_in: [BigInt!] + blockNumber: BigInt + blockNumber_not: BigInt + blockNumber_gt: BigInt + blockNumber_lt: BigInt + blockNumber_gte: BigInt + blockNumber_lte: BigInt + blockNumber_in: [BigInt!] + blockNumber_not_in: [BigInt!] + txHash: Bytes + txHash_not: Bytes + txHash_gt: Bytes + txHash_lt: Bytes + txHash_gte: Bytes + txHash_lte: Bytes + txHash_in: [Bytes!] + txHash_not_in: [Bytes!] + txHash_contains: Bytes + txHash_not_contains: Bytes + _change_block: BlockChangedFilter + and: [Transaction_filter] + or: [Transaction_filter] +} + +enum TransactionExecutionType { + Maker + Taker +} + +enum Order_orderBy { + id + orderId + user + user__id + user__createdAt + user__transactionCount + user__orderCount + user__liquidationCount + user__transferCount + currency + side + maturity + inputUnitPrice + inputAmount + filledAmount + status + statusUpdatedAt + lendingMarket + lendingMarket__id + lendingMarket__currency + lendingMarket__maturity + lendingMarket__isActive + lendingMarket__volume + lendingMarket__openingUnitPrice + lendingMarket__lastLendUnitPrice + lendingMarket__lastBorrowUnitPrice + lendingMarket__offsetAmount + isPreOrder + type + transactions + isCircuitBreakerTriggered + createdAt + blockNumber + txHash +} + +input Order_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + orderId: BigInt + orderId_not: BigInt + orderId_gt: BigInt + orderId_lt: BigInt + orderId_gte: BigInt + orderId_lte: BigInt + orderId_in: [BigInt!] + orderId_not_in: [BigInt!] + user: String + user_not: String + user_gt: String + user_lt: String + user_gte: String + user_lte: String + user_in: [String!] + user_not_in: [String!] + user_starts_with: String + user_starts_with_nocase: String + user_not_starts_with: String + user_not_starts_with_nocase: String + user_ends_with: String + user_ends_with_nocase: String + user_not_ends_with: String + user_not_ends_with_nocase: String + user_contains: String + user_not_contains: String + user_contains_nocase: String + user_not_contains_nocase: String + user_: User_filter + currency: Bytes + currency_not: Bytes + currency_gt: Bytes + currency_lt: Bytes + currency_gte: Bytes + currency_lte: Bytes + currency_in: [Bytes!] + currency_not_in: [Bytes!] + currency_contains: Bytes + currency_not_contains: Bytes + side: Int + side_not: Int + side_gt: Int + side_lt: Int + side_gte: Int + side_lte: Int + side_in: [Int!] + side_not_in: [Int!] + maturity: BigInt + maturity_not: BigInt + maturity_gt: BigInt + maturity_lt: BigInt + maturity_gte: BigInt + maturity_lte: BigInt + maturity_in: [BigInt!] + maturity_not_in: [BigInt!] + inputUnitPrice: BigInt + inputUnitPrice_not: BigInt + inputUnitPrice_gt: BigInt + inputUnitPrice_lt: BigInt + inputUnitPrice_gte: BigInt + inputUnitPrice_lte: BigInt + inputUnitPrice_in: [BigInt!] + inputUnitPrice_not_in: [BigInt!] + inputAmount: BigInt + inputAmount_not: BigInt + inputAmount_gt: BigInt + inputAmount_lt: BigInt + inputAmount_gte: BigInt + inputAmount_lte: BigInt + inputAmount_in: [BigInt!] + inputAmount_not_in: [BigInt!] + filledAmount: BigInt + filledAmount_not: BigInt + filledAmount_gt: BigInt + filledAmount_lt: BigInt + filledAmount_gte: BigInt + filledAmount_lte: BigInt + filledAmount_in: [BigInt!] + filledAmount_not_in: [BigInt!] + status: OrderStatus + status_not: OrderStatus + status_gt: OrderStatus + status_lt: OrderStatus + status_gte: OrderStatus + status_lte: OrderStatus + status_in: [OrderStatus!] + status_not_in: [OrderStatus!] + statusUpdatedAt: BigInt + statusUpdatedAt_not: BigInt + statusUpdatedAt_gt: BigInt + statusUpdatedAt_lt: BigInt + statusUpdatedAt_gte: BigInt + statusUpdatedAt_lte: BigInt + statusUpdatedAt_in: [BigInt!] + statusUpdatedAt_not_in: [BigInt!] + lendingMarket: String + lendingMarket_not: String + lendingMarket_gt: String + lendingMarket_lt: String + lendingMarket_gte: String + lendingMarket_lte: String + lendingMarket_in: [String!] + lendingMarket_not_in: [String!] + lendingMarket_starts_with: String + lendingMarket_starts_with_nocase: String + lendingMarket_not_starts_with: String + lendingMarket_not_starts_with_nocase: String + lendingMarket_ends_with: String + lendingMarket_ends_with_nocase: String + lendingMarket_not_ends_with: String + lendingMarket_not_ends_with_nocase: String + lendingMarket_contains: String + lendingMarket_not_contains: String + lendingMarket_contains_nocase: String + lendingMarket_not_contains_nocase: String + lendingMarket_: LendingMarket_filter + isPreOrder: Boolean + isPreOrder_not: Boolean + isPreOrder_gt: Boolean + isPreOrder_lt: Boolean + isPreOrder_gte: Boolean + isPreOrder_lte: Boolean + isPreOrder_in: [Boolean!] + isPreOrder_not_in: [Boolean!] + type: OrderType + type_not: OrderType + type_gt: OrderType + type_lt: OrderType + type_gte: OrderType + type_lte: OrderType + type_in: [OrderType!] + type_not_in: [OrderType!] + transactions_: Transaction_filter + isCircuitBreakerTriggered: Boolean + isCircuitBreakerTriggered_not: Boolean + isCircuitBreakerTriggered_gt: Boolean + isCircuitBreakerTriggered_lt: Boolean + isCircuitBreakerTriggered_gte: Boolean + isCircuitBreakerTriggered_lte: Boolean + isCircuitBreakerTriggered_in: [Boolean!] + isCircuitBreakerTriggered_not_in: [Boolean!] + createdAt: BigInt + createdAt_not: BigInt + createdAt_gt: BigInt + createdAt_lt: BigInt + createdAt_gte: BigInt + createdAt_lte: BigInt + createdAt_in: [BigInt!] + createdAt_not_in: [BigInt!] + blockNumber: BigInt + blockNumber_not: BigInt + blockNumber_gt: BigInt + blockNumber_lt: BigInt + blockNumber_gte: BigInt + blockNumber_lte: BigInt + blockNumber_in: [BigInt!] + blockNumber_not_in: [BigInt!] + txHash: Bytes + txHash_not: Bytes + txHash_gt: Bytes + txHash_lt: Bytes + txHash_gte: Bytes + txHash_lte: Bytes + txHash_in: [Bytes!] + txHash_not_in: [Bytes!] + txHash_contains: Bytes + txHash_not_contains: Bytes + _change_block: BlockChangedFilter + and: [Order_filter] + or: [Order_filter] +} + +enum OrderStatus { + Open + PartiallyFilled + Filled + Killed + Cancelled +} + +enum OrderType { + Market + Limit + Unwind +} + +enum LendingMarket_orderBy { + id + currency + maturity + isActive + transactions + orders + volume + dailyVolume + openingUnitPrice + lastLendUnitPrice + lastBorrowUnitPrice + offsetAmount +} + +input LendingMarket_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + currency: Bytes + currency_not: Bytes + currency_gt: Bytes + currency_lt: Bytes + currency_gte: Bytes + currency_lte: Bytes + currency_in: [Bytes!] + currency_not_in: [Bytes!] + currency_contains: Bytes + currency_not_contains: Bytes + maturity: BigInt + maturity_not: BigInt + maturity_gt: BigInt + maturity_lt: BigInt + maturity_gte: BigInt + maturity_lte: BigInt + maturity_in: [BigInt!] + maturity_not_in: [BigInt!] + isActive: Boolean + isActive_not: Boolean + isActive_gt: Boolean + isActive_lt: Boolean + isActive_gte: Boolean + isActive_lte: Boolean + isActive_in: [Boolean!] + isActive_not_in: [Boolean!] + transactions_: Transaction_filter + orders_: Order_filter + volume: BigInt + volume_not: BigInt + volume_gt: BigInt + volume_lt: BigInt + volume_gte: BigInt + volume_lte: BigInt + volume_in: [BigInt!] + volume_not_in: [BigInt!] + dailyVolume_: DailyVolume_filter + openingUnitPrice: BigInt + openingUnitPrice_not: BigInt + openingUnitPrice_gt: BigInt + openingUnitPrice_lt: BigInt + openingUnitPrice_gte: BigInt + openingUnitPrice_lte: BigInt + openingUnitPrice_in: [BigInt!] + openingUnitPrice_not_in: [BigInt!] + lastLendUnitPrice: BigInt + lastLendUnitPrice_not: BigInt + lastLendUnitPrice_gt: BigInt + lastLendUnitPrice_lt: BigInt + lastLendUnitPrice_gte: BigInt + lastLendUnitPrice_lte: BigInt + lastLendUnitPrice_in: [BigInt!] + lastLendUnitPrice_not_in: [BigInt!] + lastBorrowUnitPrice: BigInt + lastBorrowUnitPrice_not: BigInt + lastBorrowUnitPrice_gt: BigInt + lastBorrowUnitPrice_lt: BigInt + lastBorrowUnitPrice_gte: BigInt + lastBorrowUnitPrice_lte: BigInt + lastBorrowUnitPrice_in: [BigInt!] + lastBorrowUnitPrice_not_in: [BigInt!] + offsetAmount: BigInt + offsetAmount_not: BigInt + offsetAmount_gt: BigInt + offsetAmount_lt: BigInt + offsetAmount_gte: BigInt + offsetAmount_lte: BigInt + offsetAmount_in: [BigInt!] + offsetAmount_not_in: [BigInt!] + _change_block: BlockChangedFilter + and: [LendingMarket_filter] + or: [LendingMarket_filter] +} + +enum User_orderBy { + id + createdAt + transactionCount + transactions + orderCount + orders + liquidationCount + liquidations + transferCount + transfers + deposits +} + +input User_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + createdAt: BigInt + createdAt_not: BigInt + createdAt_gt: BigInt + createdAt_lt: BigInt + createdAt_gte: BigInt + createdAt_lte: BigInt + createdAt_in: [BigInt!] + createdAt_not_in: [BigInt!] + transactionCount: BigInt + transactionCount_not: BigInt + transactionCount_gt: BigInt + transactionCount_lt: BigInt + transactionCount_gte: BigInt + transactionCount_lte: BigInt + transactionCount_in: [BigInt!] + transactionCount_not_in: [BigInt!] + transactions_: Transaction_filter + orderCount: BigInt + orderCount_not: BigInt + orderCount_gt: BigInt + orderCount_lt: BigInt + orderCount_gte: BigInt + orderCount_lte: BigInt + orderCount_in: [BigInt!] + orderCount_not_in: [BigInt!] + orders_: Order_filter + liquidationCount: BigInt + liquidationCount_not: BigInt + liquidationCount_gt: BigInt + liquidationCount_lt: BigInt + liquidationCount_gte: BigInt + liquidationCount_lte: BigInt + liquidationCount_in: [BigInt!] + liquidationCount_not_in: [BigInt!] + liquidations_: Liquidation_filter + transferCount: BigInt + transferCount_not: BigInt + transferCount_gt: BigInt + transferCount_lt: BigInt + transferCount_gte: BigInt + transferCount_lte: BigInt + transferCount_in: [BigInt!] + transferCount_not_in: [BigInt!] + transfers_: Transfer_filter + deposits_: Deposit_filter + _change_block: BlockChangedFilter + and: [User_filter] + or: [User_filter] +} + +enum DailyVolume_orderBy { + id + currency + maturity + day + volume + timestamp + lendingMarket + lendingMarket__id + lendingMarket__currency + lendingMarket__maturity + lendingMarket__isActive + lendingMarket__volume + lendingMarket__openingUnitPrice + lendingMarket__lastLendUnitPrice + lendingMarket__lastBorrowUnitPrice + lendingMarket__offsetAmount +} + +input DailyVolume_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + currency: Bytes + currency_not: Bytes + currency_gt: Bytes + currency_lt: Bytes + currency_gte: Bytes + currency_lte: Bytes + currency_in: [Bytes!] + currency_not_in: [Bytes!] + currency_contains: Bytes + currency_not_contains: Bytes + maturity: BigInt + maturity_not: BigInt + maturity_gt: BigInt + maturity_lt: BigInt + maturity_gte: BigInt + maturity_lte: BigInt + maturity_in: [BigInt!] + maturity_not_in: [BigInt!] + day: String + day_not: String + day_gt: String + day_lt: String + day_gte: String + day_lte: String + day_in: [String!] + day_not_in: [String!] + day_starts_with: String + day_starts_with_nocase: String + day_not_starts_with: String + day_not_starts_with_nocase: String + day_ends_with: String + day_ends_with_nocase: String + day_not_ends_with: String + day_not_ends_with_nocase: String + day_contains: String + day_not_contains: String + day_contains_nocase: String + day_not_contains_nocase: String + volume: BigInt + volume_not: BigInt + volume_gt: BigInt + volume_lt: BigInt + volume_gte: BigInt + volume_lte: BigInt + volume_in: [BigInt!] + volume_not_in: [BigInt!] + timestamp: BigInt + timestamp_not: BigInt + timestamp_gt: BigInt + timestamp_lt: BigInt + timestamp_gte: BigInt + timestamp_lte: BigInt + timestamp_in: [BigInt!] + timestamp_not_in: [BigInt!] + lendingMarket: String + lendingMarket_not: String + lendingMarket_gt: String + lendingMarket_lt: String + lendingMarket_gte: String + lendingMarket_lte: String + lendingMarket_in: [String!] + lendingMarket_not_in: [String!] + lendingMarket_starts_with: String + lendingMarket_starts_with_nocase: String + lendingMarket_not_starts_with: String + lendingMarket_not_starts_with_nocase: String + lendingMarket_ends_with: String + lendingMarket_ends_with_nocase: String + lendingMarket_not_ends_with: String + lendingMarket_not_ends_with_nocase: String + lendingMarket_contains: String + lendingMarket_not_contains: String + lendingMarket_contains_nocase: String + lendingMarket_not_contains_nocase: String + lendingMarket_: LendingMarket_filter + _change_block: BlockChangedFilter + and: [DailyVolume_filter] + or: [DailyVolume_filter] +} + +enum Protocol_orderBy { + id + totalUsers +} + +input Protocol_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + totalUsers: BigInt + totalUsers_not: BigInt + totalUsers_gt: BigInt + totalUsers_lt: BigInt + totalUsers_gte: BigInt + totalUsers_lte: BigInt + totalUsers_in: [BigInt!] + totalUsers_not_in: [BigInt!] + _change_block: BlockChangedFilter + and: [Protocol_filter] + or: [Protocol_filter] +} + +enum Liquidation_orderBy { + id + collateralCurrency + debtCurrency + debtMaturity + debtAmount + user + user__id + user__createdAt + user__transactionCount + user__orderCount + user__liquidationCount + user__transferCount + timestamp + blockNumber + txHash +} + +input Liquidation_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + collateralCurrency: Bytes + collateralCurrency_not: Bytes + collateralCurrency_gt: Bytes + collateralCurrency_lt: Bytes + collateralCurrency_gte: Bytes + collateralCurrency_lte: Bytes + collateralCurrency_in: [Bytes!] + collateralCurrency_not_in: [Bytes!] + collateralCurrency_contains: Bytes + collateralCurrency_not_contains: Bytes + debtCurrency: Bytes + debtCurrency_not: Bytes + debtCurrency_gt: Bytes + debtCurrency_lt: Bytes + debtCurrency_gte: Bytes + debtCurrency_lte: Bytes + debtCurrency_in: [Bytes!] + debtCurrency_not_in: [Bytes!] + debtCurrency_contains: Bytes + debtCurrency_not_contains: Bytes + debtMaturity: BigInt + debtMaturity_not: BigInt + debtMaturity_gt: BigInt + debtMaturity_lt: BigInt + debtMaturity_gte: BigInt + debtMaturity_lte: BigInt + debtMaturity_in: [BigInt!] + debtMaturity_not_in: [BigInt!] + debtAmount: BigInt + debtAmount_not: BigInt + debtAmount_gt: BigInt + debtAmount_lt: BigInt + debtAmount_gte: BigInt + debtAmount_lte: BigInt + debtAmount_in: [BigInt!] + debtAmount_not_in: [BigInt!] + user: String + user_not: String + user_gt: String + user_lt: String + user_gte: String + user_lte: String + user_in: [String!] + user_not_in: [String!] + user_starts_with: String + user_starts_with_nocase: String + user_not_starts_with: String + user_not_starts_with_nocase: String + user_ends_with: String + user_ends_with_nocase: String + user_not_ends_with: String + user_not_ends_with_nocase: String + user_contains: String + user_not_contains: String + user_contains_nocase: String + user_not_contains_nocase: String + user_: User_filter + timestamp: BigInt + timestamp_not: BigInt + timestamp_gt: BigInt + timestamp_lt: BigInt + timestamp_gte: BigInt + timestamp_lte: BigInt + timestamp_in: [BigInt!] + timestamp_not_in: [BigInt!] + blockNumber: BigInt + blockNumber_not: BigInt + blockNumber_gt: BigInt + blockNumber_lt: BigInt + blockNumber_gte: BigInt + blockNumber_lte: BigInt + blockNumber_in: [BigInt!] + blockNumber_not_in: [BigInt!] + txHash: Bytes + txHash_not: Bytes + txHash_gt: Bytes + txHash_lt: Bytes + txHash_gte: Bytes + txHash_lte: Bytes + txHash_in: [Bytes!] + txHash_not_in: [Bytes!] + txHash_contains: Bytes + txHash_not_contains: Bytes + _change_block: BlockChangedFilter + and: [Liquidation_filter] + or: [Liquidation_filter] +} + +enum Transfer_orderBy { + id + user + user__id + user__createdAt + user__transactionCount + user__orderCount + user__liquidationCount + user__transferCount + currency + amount + transferType + timestamp + blockNumber + txHash +} + +input Transfer_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + user: String + user_not: String + user_gt: String + user_lt: String + user_gte: String + user_lte: String + user_in: [String!] + user_not_in: [String!] + user_starts_with: String + user_starts_with_nocase: String + user_not_starts_with: String + user_not_starts_with_nocase: String + user_ends_with: String + user_ends_with_nocase: String + user_not_ends_with: String + user_not_ends_with_nocase: String + user_contains: String + user_not_contains: String + user_contains_nocase: String + user_not_contains_nocase: String + user_: User_filter + currency: Bytes + currency_not: Bytes + currency_gt: Bytes + currency_lt: Bytes + currency_gte: Bytes + currency_lte: Bytes + currency_in: [Bytes!] + currency_not_in: [Bytes!] + currency_contains: Bytes + currency_not_contains: Bytes + amount: BigInt + amount_not: BigInt + amount_gt: BigInt + amount_lt: BigInt + amount_gte: BigInt + amount_lte: BigInt + amount_in: [BigInt!] + amount_not_in: [BigInt!] + transferType: TransferType + transferType_not: TransferType + transferType_gt: TransferType + transferType_lt: TransferType + transferType_gte: TransferType + transferType_lte: TransferType + transferType_in: [TransferType!] + transferType_not_in: [TransferType!] + timestamp: BigInt + timestamp_not: BigInt + timestamp_gt: BigInt + timestamp_lt: BigInt + timestamp_gte: BigInt + timestamp_lte: BigInt + timestamp_in: [BigInt!] + timestamp_not_in: [BigInt!] + blockNumber: BigInt + blockNumber_not: BigInt + blockNumber_gt: BigInt + blockNumber_lt: BigInt + blockNumber_gte: BigInt + blockNumber_lte: BigInt + blockNumber_in: [BigInt!] + blockNumber_not_in: [BigInt!] + txHash: Bytes + txHash_not: Bytes + txHash_gt: Bytes + txHash_lt: Bytes + txHash_gte: Bytes + txHash_lte: Bytes + txHash_in: [Bytes!] + txHash_not_in: [Bytes!] + txHash_contains: Bytes + txHash_not_contains: Bytes + _change_block: BlockChangedFilter + and: [Transfer_filter] + or: [Transfer_filter] +} + +enum TransferType { + Deposit + Withdraw +} + +enum Deposit_orderBy { + id + user + user__id + user__createdAt + user__transactionCount + user__orderCount + user__liquidationCount + user__transferCount + currency + amount +} + +input Deposit_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + user: String + user_not: String + user_gt: String + user_lt: String + user_gte: String + user_lte: String + user_in: [String!] + user_not_in: [String!] + user_starts_with: String + user_starts_with_nocase: String + user_not_starts_with: String + user_not_starts_with_nocase: String + user_ends_with: String + user_ends_with_nocase: String + user_not_ends_with: String + user_not_ends_with_nocase: String + user_contains: String + user_not_contains: String + user_contains_nocase: String + user_not_contains_nocase: String + user_: User_filter + currency: Bytes + currency_not: Bytes + currency_gt: Bytes + currency_lt: Bytes + currency_gte: Bytes + currency_lte: Bytes + currency_in: [Bytes!] + currency_not_in: [Bytes!] + currency_contains: Bytes + currency_not_contains: Bytes + amount: BigInt + amount_not: BigInt + amount_gt: BigInt + amount_lt: BigInt + amount_gte: BigInt + amount_lte: BigInt + amount_in: [BigInt!] + amount_not_in: [BigInt!] + _change_block: BlockChangedFilter + and: [Deposit_filter] + or: [Deposit_filter] +} + +enum TransactionCandleStick_orderBy { + id + interval + currency + maturity + timestamp + open + close + high + low + average + volume + volumeInFV + lendingMarket + lendingMarket__id + lendingMarket__currency + lendingMarket__maturity + lendingMarket__isActive + lendingMarket__volume + lendingMarket__openingUnitPrice + lendingMarket__lastLendUnitPrice + lendingMarket__lastBorrowUnitPrice + lendingMarket__offsetAmount +} + +input TransactionCandleStick_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + interval: BigInt + interval_not: BigInt + interval_gt: BigInt + interval_lt: BigInt + interval_gte: BigInt + interval_lte: BigInt + interval_in: [BigInt!] + interval_not_in: [BigInt!] + currency: Bytes + currency_not: Bytes + currency_gt: Bytes + currency_lt: Bytes + currency_gte: Bytes + currency_lte: Bytes + currency_in: [Bytes!] + currency_not_in: [Bytes!] + currency_contains: Bytes + currency_not_contains: Bytes + maturity: BigInt + maturity_not: BigInt + maturity_gt: BigInt + maturity_lt: BigInt + maturity_gte: BigInt + maturity_lte: BigInt + maturity_in: [BigInt!] + maturity_not_in: [BigInt!] + timestamp: BigInt + timestamp_not: BigInt + timestamp_gt: BigInt + timestamp_lt: BigInt + timestamp_gte: BigInt + timestamp_lte: BigInt + timestamp_in: [BigInt!] + timestamp_not_in: [BigInt!] + open: BigInt + open_not: BigInt + open_gt: BigInt + open_lt: BigInt + open_gte: BigInt + open_lte: BigInt + open_in: [BigInt!] + open_not_in: [BigInt!] + close: BigInt + close_not: BigInt + close_gt: BigInt + close_lt: BigInt + close_gte: BigInt + close_lte: BigInt + close_in: [BigInt!] + close_not_in: [BigInt!] + high: BigInt + high_not: BigInt + high_gt: BigInt + high_lt: BigInt + high_gte: BigInt + high_lte: BigInt + high_in: [BigInt!] + high_not_in: [BigInt!] + low: BigInt + low_not: BigInt + low_gt: BigInt + low_lt: BigInt + low_gte: BigInt + low_lte: BigInt + low_in: [BigInt!] + low_not_in: [BigInt!] + average: BigDecimal + average_not: BigDecimal + average_gt: BigDecimal + average_lt: BigDecimal + average_gte: BigDecimal + average_lte: BigDecimal + average_in: [BigDecimal!] + average_not_in: [BigDecimal!] + volume: BigInt + volume_not: BigInt + volume_gt: BigInt + volume_lt: BigInt + volume_gte: BigInt + volume_lte: BigInt + volume_in: [BigInt!] + volume_not_in: [BigInt!] + volumeInFV: BigInt + volumeInFV_not: BigInt + volumeInFV_gt: BigInt + volumeInFV_lt: BigInt + volumeInFV_gte: BigInt + volumeInFV_lte: BigInt + volumeInFV_in: [BigInt!] + volumeInFV_not_in: [BigInt!] + lendingMarket: String + lendingMarket_not: String + lendingMarket_gt: String + lendingMarket_lt: String + lendingMarket_gte: String + lendingMarket_lte: String + lendingMarket_in: [String!] + lendingMarket_not_in: [String!] + lendingMarket_starts_with: String + lendingMarket_starts_with_nocase: String + lendingMarket_not_starts_with: String + lendingMarket_not_starts_with_nocase: String + lendingMarket_ends_with: String + lendingMarket_ends_with_nocase: String + lendingMarket_not_ends_with: String + lendingMarket_not_ends_with_nocase: String + lendingMarket_contains: String + lendingMarket_not_contains: String + lendingMarket_contains_nocase: String + lendingMarket_not_contains_nocase: String + lendingMarket_: LendingMarket_filter + _change_block: BlockChangedFilter + and: [TransactionCandleStick_filter] + or: [TransactionCandleStick_filter] +} + +type _MetaBlock_ { + hash: Bytes + number: Int! + timestamp: Int +} + +type _Meta_ { + block: _MetaBlock_! + deployment: String! + hasIndexingErrors: Boolean! +} + +type ResultState { + block: _Block_! + contractAddress: String! + cid: String! + kind: String! + data: String! +} + +type SyncStatus { + latestIndexedBlockHash: String! + latestIndexedBlockNumber: Int! + latestCanonicalBlockHash: String! + latestCanonicalBlockNumber: Int! + initialIndexedBlockHash: String! + initialIndexedBlockNumber: Int! + latestProcessedBlockHash: String! + latestProcessedBlockNumber: Int! +} + +type Query { + events(blockHash: String!, contractAddress: String!, name: String): [ResultEvent!] + eventsInRange(fromBlockNumber: Int!, toBlockNumber: Int!): [ResultEvent!] + transaction(id: ID!, block: Block_height): Transaction + transactions(block: Block_height, where: Transaction_filter, orderBy: Transaction_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Transaction!]! + order(id: ID!, block: Block_height): Order + orders(block: Block_height, where: Order_filter, orderBy: Order_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Order!]! + lendingMarket(id: ID!, block: Block_height): LendingMarket + lendingMarkets(block: Block_height, where: LendingMarket_filter, orderBy: LendingMarket_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [LendingMarket!]! + user(id: ID!, block: Block_height): User + users(block: Block_height, where: User_filter, orderBy: User_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [User!]! + dailyVolume(id: ID!, block: Block_height): DailyVolume + dailyVolumes(block: Block_height, where: DailyVolume_filter, orderBy: DailyVolume_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [DailyVolume!]! + protocol(id: ID!, block: Block_height): Protocol + protocols(block: Block_height, where: Protocol_filter, orderBy: Protocol_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Protocol!]! + liquidation(id: ID!, block: Block_height): Liquidation + liquidations(block: Block_height, where: Liquidation_filter, orderBy: Liquidation_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Liquidation!]! + transfer(id: ID!, block: Block_height): Transfer + transfers(block: Block_height, where: Transfer_filter, orderBy: Transfer_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Transfer!]! + deposit(id: ID!, block: Block_height): Deposit + deposits(block: Block_height, where: Deposit_filter, orderBy: Deposit_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Deposit!]! + transactionCandleStick(id: ID!, block: Block_height): TransactionCandleStick + transactionCandleSticks(block: Block_height, where: TransactionCandleStick_filter, orderBy: TransactionCandleStick_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [TransactionCandleStick!]! + _meta(block: Block_height): _Meta_ + getStateByCID(cid: String!): ResultState + getState(blockHash: String!, contractAddress: String!, kind: String): ResultState + getSyncStatus: SyncStatus +} + +type Transaction { + id: ID! + currency: Bytes! + maturity: BigInt! + side: Int! + executionPrice: BigInt! + user: User! + executionType: TransactionExecutionType! + futureValue: BigInt! + amount: BigInt! + feeInFV: BigInt! + averagePrice: BigDecimal! + lendingMarket: LendingMarket! + order: Order! + createdAt: BigInt! + blockNumber: BigInt! + txHash: Bytes! +} + +type User { + id: ID! + createdAt: BigInt! + transactionCount: BigInt! + transactions: [Transaction!]! + orderCount: BigInt! + orders: [Order!]! + liquidationCount: BigInt! + liquidations: [Liquidation!]! + transferCount: BigInt! + transfers: [Transfer!]! + deposits: [Deposit!]! +} + +type Order { + id: ID! + orderId: BigInt! + user: User! + currency: Bytes! + side: Int! + maturity: BigInt! + inputUnitPrice: BigInt! + inputAmount: BigInt! + filledAmount: BigInt! + status: OrderStatus! + statusUpdatedAt: BigInt! + lendingMarket: LendingMarket! + isPreOrder: Boolean! + type: OrderType! + transactions: [Transaction!]! + isCircuitBreakerTriggered: Boolean! + createdAt: BigInt! + blockNumber: BigInt! + txHash: Bytes! +} + +type LendingMarket { + id: ID! + currency: Bytes! + maturity: BigInt! + isActive: Boolean! + transactions: [Transaction!]! + orders: [Order!]! + volume: BigInt! + dailyVolume: [DailyVolume!]! + openingUnitPrice: BigInt! + lastLendUnitPrice: BigInt! + lastBorrowUnitPrice: BigInt! + offsetAmount: BigInt! +} + +type DailyVolume { + id: ID! + currency: Bytes! + maturity: BigInt! + day: String! + volume: BigInt! + timestamp: BigInt! + lendingMarket: LendingMarket! +} + +type Liquidation { + id: ID! + collateralCurrency: Bytes! + debtCurrency: Bytes! + debtMaturity: BigInt! + debtAmount: BigInt! + user: User! + timestamp: BigInt! + blockNumber: BigInt! + txHash: Bytes! +} + +type Transfer { + id: ID! + user: User! + currency: Bytes! + amount: BigInt! + transferType: TransferType! + timestamp: BigInt! + blockNumber: BigInt! + txHash: Bytes! +} + +type Deposit { + id: ID! + user: User! + currency: Bytes! + amount: BigInt! +} + +type Protocol { + id: ID! + totalUsers: BigInt! +} + +type TransactionCandleStick { + id: ID! + interval: BigInt! + currency: Bytes! + maturity: BigInt! + timestamp: BigInt! + open: BigInt! + close: BigInt! + high: BigInt! + low: BigInt! + average: BigDecimal! + volume: BigInt! + volumeInFV: BigInt! + lendingMarket: LendingMarket! +} + +type Mutation { + watchContract(address: String!, kind: String!, checkpoint: Boolean!, startingBlock: Int): Boolean! +} + +type Subscription { + onEvent: ResultEvent! +} diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 0000000..679134f --- /dev/null +++ b/src/server.ts @@ -0,0 +1,43 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import fs from 'fs'; +import path from 'path'; +import 'reflect-metadata'; +import debug from 'debug'; + +import { ServerCmd } from '@cerc-io/cli'; +import { getGraphDbAndWatcher } from '@cerc-io/graph-node'; + +import { createResolvers } from './resolvers'; +import { Indexer } from './indexer'; +import { Database, ENTITY_QUERY_TYPE_MAP, ENTITY_TO_LATEST_ENTITY_MAP } from './database'; + +const log = debug('vulcanize:server'); + +export const main = async (): Promise => { + const serverCmd = new ServerCmd(); + await serverCmd.init(Database); + + const { graphWatcher } = await getGraphDbAndWatcher( + serverCmd.config.server, + serverCmd.clients.ethClient, + serverCmd.ethProvider, + serverCmd.database.baseDatabase, + ENTITY_QUERY_TYPE_MAP, + ENTITY_TO_LATEST_ENTITY_MAP + ); + + await serverCmd.initIndexer(Indexer, graphWatcher); + + const typeDefs = fs.readFileSync(path.join(__dirname, 'schema.gql')).toString(); + + return serverCmd.exec(createResolvers, typeDefs); +}; + +main().then(() => { + log('Starting server...'); +}).catch(err => { + log(err); +}); diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..6cabc80 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,27 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +export enum TransactionExecutionType { + Maker = 'Maker', + Taker = 'Taker', +} + +export enum OrderType { + Market = 'Market', + Limit = 'Limit', + Unwind = 'Unwind', +} + +export enum OrderStatus { + Open = 'Open', + PartiallyFilled = 'PartiallyFilled', + Filled = 'Filled', + Killed = 'Killed', + Cancelled = 'Cancelled', +} + +export enum TransferType { + Deposit = 'Deposit', + Withdraw = 'Withdraw', +} diff --git a/subgraph-build/FundManagementLogic/FundManagementLogic.wasm b/subgraph-build/FundManagementLogic/FundManagementLogic.wasm new file mode 100644 index 0000000000000000000000000000000000000000..c5f41e5d26750e3c6c1ceb5e4fc55da1403f9a6d GIT binary patch literal 224478 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 literal 0 HcmV?d00001 diff --git a/subgraph-build/FundManagementLogic/abis/FundManagementLogic.json b/subgraph-build/FundManagementLogic/abis/FundManagementLogic.json new file mode 100644 index 0000000..e69dc4b --- /dev/null +++ b/subgraph-build/FundManagementLogic/abis/FundManagementLogic.json @@ -0,0 +1,798 @@ +[ + { + "inputs": [], + "name": "AlreadyRedeemed", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientCollateral", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "MissingAddress", + "type": "error" + }, + { + "inputs": [], + "name": "NoRedemptionAmount", + "type": "error" + }, + { + "inputs": [], + "name": "NoRepaymentAmount", + "type": "error" + }, + { + "inputs": [], + "name": "NotRedemptionPeriod", + "type": "error" + }, + { + "inputs": [], + "name": "NotRepaymentPeriod", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "EmergencySettlementExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "enum ProtocolTypes.Side", + "name": "side", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountInFV", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "feeInFV", + "type": "uint256" + } + ], + "name": "OrderFilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint48", + "name": "orderId", + "type": "uint48" + }, + { + "indexed": true, + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "enum ProtocolTypes.Side", + "name": "side", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountInFV", + "type": "uint256" + } + ], + "name": "OrderPartiallyFilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "enum ProtocolTypes.Side", + "name": "side", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountInFV", + "type": "uint256" + } + ], + "name": "OrdersFilledInAsync", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "RedemptionExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "RepaymentExecuted", + "type": "event" + }, + { + "inputs": [], + "name": "BASE_MIN_DEBT_UNIT_PRICE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_maturity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_presentValue", + "type": "uint256" + } + ], + "name": "calculateFVFromPV", + "outputs": [ + { + "internalType": "uint256", + "name": "futureValue", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_maturity", + "type": "uint256" + }, + { + "internalType": "int256", + "name": "_presentValue", + "type": "int256" + } + ], + "name": "calculateFVFromPV", + "outputs": [ + { + "internalType": "int256", + "name": "futureValue", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "workingLendOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimableAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "workingBorrowOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "borrowedAmount", + "type": "uint256" + } + ], + "internalType": "struct ILendingMarketController.AdditionalFunds", + "name": "_additionalFunds", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_liquidationThresholdRate", + "type": "uint256" + } + ], + "name": "calculateFunds", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "workingLendOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimableAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "collateralAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unallocatedCollateralAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "workingBorrowOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "borrowedAmount", + "type": "uint256" + } + ], + "internalType": "struct ILendingMarketController.CalculatedFunds", + "name": "funds", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_maturity", + "type": "uint256" + }, + { + "internalType": "int256", + "name": "_futureValue", + "type": "int256" + } + ], + "name": "calculatePVFromFV", + "outputs": [ + { + "internalType": "int256", + "name": "presentValue", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "workingLendOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimableAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "workingBorrowOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "borrowedAmount", + "type": "uint256" + } + ], + "internalType": "struct ILendingMarketController.AdditionalFunds", + "name": "_additionalFunds", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_liquidationThresholdRate", + "type": "uint256" + } + ], + "name": "calculateTotalFundsInBaseCurrency", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "plusDepositAmountInAdditionalFundsCcy", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minusDepositAmountInAdditionalFundsCcy", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "workingLendOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimableAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "collateralAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "workingBorrowOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "borrowedAmount", + "type": "uint256" + } + ], + "internalType": "struct ILendingMarketController.CalculatedTotalFunds", + "name": "totalFunds", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_maturity", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minDebtUnitPrice", + "type": "uint256" + } + ], + "name": "getActualFunds", + "outputs": [ + { + "components": [ + { + "internalType": "int256", + "name": "presentValue", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "claimableAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtAmount", + "type": "uint256" + }, + { + "internalType": "int256", + "name": "futureValue", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "workingLendOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "workingBorrowOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "borrowedAmount", + "type": "uint256" + }, + { + "internalType": "int256", + "name": "genesisValue", + "type": "int256" + }, + { + "internalType": "int256", + "name": "genesisValueInPV", + "type": "int256" + }, + { + "internalType": "int256", + "name": "genesisValueInFV", + "type": "int256" + } + ], + "internalType": "struct FundManagementLogic.ActualFunds", + "name": "actualFunds", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_maturity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_minDebtUnitPrice", + "type": "uint256" + } + ], + "name": "getCurrentMinDebtUnitPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getGenesisValue", + "outputs": [ + { + "internalType": "int256", + "name": "amount", + "type": "int256" + }, + { + "internalType": "int256", + "name": "amountInPV", + "type": "int256" + }, + { + "internalType": "int256", + "name": "amountInFV", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_maturity", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getPosition", + "outputs": [ + { + "internalType": "int256", + "name": "presentValue", + "type": "int256" + }, + { + "internalType": "int256", + "name": "futureValue", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getUsedMaturities", + "outputs": [ + { + "internalType": "uint256[]", + "name": "maturities", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/subgraph-build/LendingMarketOperationLogic/LendingMarketOperationLogic.wasm b/subgraph-build/LendingMarketOperationLogic/LendingMarketOperationLogic.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d79d0e181dc67eb114eb98f95e049edadd608f65 GIT binary patch literal 223950 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

1lJPt~=er_>h9GktM8!Xj#6Jp2iG{ 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 literal 0 HcmV?d00001 diff --git a/subgraph-build/LendingMarketOperationLogic/abis/LendingMarketOperationLogic.json b/subgraph-build/LendingMarketOperationLogic/abis/LendingMarketOperationLogic.json new file mode 100644 index 0000000..0cadb62 --- /dev/null +++ b/subgraph-build/LendingMarketOperationLogic/abis/LendingMarketOperationLogic.json @@ -0,0 +1,377 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + } + ], + "name": "AlreadyZCTokenExists", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidCompoundFactor", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidCurrency", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + } + ], + "name": "InvalidMaturity", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidMinDebtUnitPrice", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidOpeningDate", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidPreOpeningDate", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidTimestamp", + "type": "error" + }, + { + "inputs": [], + "name": "LendingMarketNotInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "MissingAddress", + "type": "error" + }, + { + "inputs": [], + "name": "NotEnoughOrderBooks", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "internalType": "uint8", + "name": "decimals", + "type": "uint8" + } + ], + "name": "TooManyTokenDecimals", + "type": "error" + }, + { + "inputs": [], + "name": "ZcTokenIsZero", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "EmergencyTerminationExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "genesisDate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "compoundFactor", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "orderFeeRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "circuitBreakerLimitRange", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "lendingMarket", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "futureValueVault", + "type": "address" + } + ], + "name": "LendingMarketInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minDebtUnitPrice", + "type": "uint256" + } + ], + "name": "MinDebtUnitPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint8", + "name": "orderBookId", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "openingDate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "preOpeningDate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + } + ], + "name": "OrderBookCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldMaturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newMaturity", + "type": "uint256" + } + ], + "name": "OrderBooksRotated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "maturity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "decimals", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "address", + "name": "tokenAddress", + "type": "address" + } + ], + "name": "ZCTokenCreated", + "type": "event" + }, + { + "inputs": [], + "name": "COMPOUND_FACTOR_DECIMALS", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "OBSERVATION_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PRE_ORDER_BASE_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ZC_TOKEN_BASE_DECIMALS", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_bytes32", + "type": "bytes32" + } + ], + "name": "bytes32ToString", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_period", + "type": "uint256" + } + ], + "name": "calculateNextMaturity", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } +] \ No newline at end of file diff --git a/subgraph-build/LiquidationLogic/LiquidationLogic.wasm b/subgraph-build/LiquidationLogic/LiquidationLogic.wasm new file mode 100644 index 0000000000000000000000000000000000000000..7bff9cbffac9ad37bc8e5bd69e6cc38821e4bd27 GIT binary patch literal 222316 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%0Au?as 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

5C3XlvDTFyB0R<6Ha>8#_xgH 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%0D>d^R-Ac06X%98F~Ov!T5u6XlFN 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 WI&E5(o@Ol)e;_6*CW#i~1&qHZUYn-? literal 0 HcmV?d00001 diff --git a/subgraph-build/TokenVault/abis/TokenVault.json b/subgraph-build/TokenVault/abis/TokenVault.json new file mode 100644 index 0000000..b5b4eb7 --- /dev/null +++ b/subgraph-build/TokenVault/abis/TokenVault.json @@ -0,0 +1,1730 @@ +[ + { + "inputs": [], + "name": "AmountIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "CallerNotBaseCurrency", + "type": "error" + }, + { + "inputs": [], + "name": "CallerNotOperator", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "msgValue", + "type": "uint256" + } + ], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidCurrency", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidFullLiquidationThresholdRate", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidLiquidationProtocolFeeRate", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidLiquidationThresholdRate", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidLiquidatorFeeRate", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidToken", + "type": "error" + }, + { + "inputs": [], + "name": "MarketTerminated", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "MissingAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "NotAllowedAccess", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "OnlyAcceptedContract", + "type": "error" + }, + { + "inputs": [], + "name": "RedemptionIsRequired", + "type": "error" + }, + { + "inputs": [], + "name": "ResolverAlreadyRegistered", + "type": "error" + }, + { + "inputs": [], + "name": "UnregisteredCurrency", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "name", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "destination", + "type": "address" + } + ], + "name": "CacheUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isCollateral", + "type": "bool" + } + ], + "name": "CurrencyRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isCollateral", + "type": "bool" + } + ], + "name": "CurrencyUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "previousRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ratio", + "type": "uint256" + } + ], + "name": "FullLiquidationThresholdRateUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "previousRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ratio", + "type": "uint256" + } + ], + "name": "LiquidationProtocolFeeRateUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "previousRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ratio", + "type": "uint256" + } + ], + "name": "LiquidationThresholdRateUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "previousRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ratio", + "type": "uint256" + } + ], + "name": "LiquidatorFeeRateUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "OPERATOR_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addDepositAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + } + ], + "name": "addOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "buildCache", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "workingLendOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimableAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "workingBorrowOrdersAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "borrowedAmount", + "type": "uint256" + } + ], + "internalType": "struct ILendingMarketController.AdditionalFunds", + "name": "_additionalFunds", + "type": "tuple" + } + ], + "name": "calculateCoverage", + "outputs": [ + { + "internalType": "uint256", + "name": "coverage", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isInsufficientDepositAmount", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "calculateLiquidationFees", + "outputs": [ + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidatorFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "cleanUpUsedCurrencies", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "depositFrom", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_onBehalfOf", + "type": "address" + } + ], + "name": "depositTo", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "_permitV", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "_permitR", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_permitS", + "type": "bytes32" + } + ], + "name": "depositWithPermitFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_onBehalfOf", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "_permitV", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "_permitR", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_permitS", + "type": "bytes32" + } + ], + "name": "depositWithPermitTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "executeForcedReset", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "getBorrowableAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "getCollateralAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCollateralCurrencies", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getCollateralDetail", + "outputs": [ + { + "internalType": "uint256", + "name": "totalCollateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalUsedCollateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDeposit", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getCoverage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "getDepositAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_liquidationCcy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_liquidationAmountMaximum", + "type": "uint256" + } + ], + "name": "getLiquidationAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "liquidationAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidatorFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLiquidationConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "liquidationThresholdRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "fullLiquidationThresholdRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidationProtocolFeeRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidatorFeeRate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLiquidationThresholdRate", + "outputs": [ + { + "internalType": "uint256", + "name": "rate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRevision", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "getTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getTotalCollateralAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "totalCollateralAmount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "getTotalDepositAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getTotalUnusedCollateralAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getUsedCurrencies", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getWithdrawableCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getWithdrawableCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_liquidationThresholdRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_fullLiquidationThresholdRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationProtocolFeeRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidatorFeeRate", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_nativeToken", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_ccys", + "type": "bytes32[]" + } + ], + "name": "isCollateral", + "outputs": [ + { + "internalType": "bool[]", + "name": "isCollateralCurrencies", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "isCollateral", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_orderCcy", + "type": "bytes32" + } + ], + "name": "isCovered", + "outputs": [ + { + "internalType": "bool", + "name": "isEnoughCollateral", + "type": "bool" + }, + { + "internalType": "bool", + "name": "isEnoughDepositInOrderCcy", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + } + ], + "name": "isRegisteredCurrency", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isResolverCached", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "bool", + "name": "_isCollateral", + "type": "bool" + } + ], + "name": "registerCurrency", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeDepositAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + } + ], + "name": "removeOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "requiredContracts", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "contracts", + "type": "bytes32[]" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "resolver", + "outputs": [ + { + "internalType": "contract IAddressResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "uint256", + "name": "untransferredAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "_isCollateral", + "type": "bool" + } + ], + "name": "updateCurrency", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationThresholdRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_fullLiquidationThresholdRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationProtocolFeeRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidatorFeeRate", + "type": "uint256" + } + ], + "name": "updateLiquidationConfiguration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_ccy", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } +] \ No newline at end of file diff --git a/subgraph-build/schema.graphql b/subgraph-build/schema.graphql new file mode 100644 index 0000000..a3fd3c2 --- /dev/null +++ b/subgraph-build/schema.graphql @@ -0,0 +1,158 @@ +type Transaction @entity { + id: ID! + currency: Bytes! + maturity: BigInt! + side: Int! + executionPrice: BigInt! + user: User! + executionType: TransactionExecutionType! + futureValue: BigInt! + amount: BigInt! + feeInFV: BigInt! + averagePrice: BigDecimal! + lendingMarket: LendingMarket! + order: Order! + + createdAt: BigInt! + blockNumber: BigInt! + txHash: Bytes! +} + +type Order @entity { + id: ID! + orderId: BigInt! + user: User! + currency: Bytes! + side: Int! + maturity: BigInt! + inputUnitPrice: BigInt! + inputAmount: BigInt! + filledAmount: BigInt! + status: OrderStatus! + statusUpdatedAt: BigInt! + lendingMarket: LendingMarket! + isPreOrder: Boolean! + type: OrderType! + transactions: [Transaction!]! @derivedFrom(field: "order") + isCircuitBreakerTriggered: Boolean! + + createdAt: BigInt! + blockNumber: BigInt! + txHash: Bytes! +} + +type LendingMarket @entity { + id: ID! + currency: Bytes! + maturity: BigInt! + isActive: Boolean! + transactions: [Transaction!]! @derivedFrom(field: "lendingMarket") + orders: [Order!]! @derivedFrom(field: "lendingMarket") + volume: BigInt! + dailyVolume: [DailyVolume!]! @derivedFrom(field: "lendingMarket") + openingUnitPrice: BigInt! + lastLendUnitPrice: BigInt! + lastBorrowUnitPrice: BigInt! + offsetAmount: BigInt! +} + +enum TransactionExecutionType { + Maker + Taker +} + +enum OrderType { + Market + Limit + Unwind +} + +enum OrderStatus { + Open + PartiallyFilled + Filled + Killed + Cancelled +} + +type User @entity { + id: ID! # wallet address + createdAt: BigInt! + transactionCount: BigInt! + transactions: [Transaction!]! @derivedFrom(field: "user") + orderCount: BigInt! + orders: [Order!]! @derivedFrom(field: "user") + liquidationCount: BigInt! + liquidations: [Liquidation!]! @derivedFrom(field: "user") + transferCount: BigInt! + transfers: [Transfer!]! @derivedFrom(field: "user") + deposits: [Deposit!]! @derivedFrom(field: "user") +} + +type DailyVolume @entity { + id: ID! # currency-maturity-date(yyyy-mm-dd) + currency: Bytes! + maturity: BigInt! + day: String! # dd-mm-yyyy + volume: BigInt! + timestamp: BigInt! + lendingMarket: LendingMarket! +} + +type Protocol @entity { + id: ID! # 1 + totalUsers: BigInt! +} + +type Liquidation @entity { + id: ID! + collateralCurrency: Bytes! + debtCurrency: Bytes! + debtMaturity: BigInt! + debtAmount: BigInt! + user: User! + + timestamp: BigInt! + blockNumber: BigInt! + txHash: Bytes! +} + +enum TransferType { + Deposit + Withdraw +} + +type Transfer @entity { + id: ID! + user: User! + currency: Bytes! + amount: BigInt! + transferType: TransferType! + + timestamp: BigInt! + blockNumber: BigInt! + txHash: Bytes! +} + +type Deposit @entity { + id: ID! + user: User! + currency: Bytes! + amount: BigInt! +} + +type TransactionCandleStick @entity { + id: ID! # A composite ID, e.g., "currency-maturity-interval-epochTime" + interval: BigInt! # interval in seconds + currency: Bytes! + maturity: BigInt! + timestamp: BigInt! # The start time of the interval + open: BigInt! + close: BigInt! + high: BigInt! + low: BigInt! + average: BigDecimal! + volume: BigInt! + volumeInFV: BigInt! + lendingMarket: LendingMarket! +} diff --git a/subgraph-build/subgraph.yaml b/subgraph-build/subgraph.yaml new file mode 100644 index 0000000..0bc5013 --- /dev/null +++ b/subgraph-build/subgraph.yaml @@ -0,0 +1,146 @@ +specVersion: 0.0.5 +description: Secured Finance is decentralized P2P banking business for digital assets +schema: + file: schema.graphql +dataSources: + - kind: ethereum + name: LendingMarketOperationLogic + network: filecoin-testnet + source: + abi: LendingMarketController + address: "0xbbF4eb28204d4c289a8C9bE82bff334Dd66e1cBC" + startBlock: 1493594 + mapping: + kind: ethereum/events + apiVersion: 0.0.7 + language: wasm/assemblyscript + entities: + - LendingMarket + abis: + - name: LendingMarketController + file: LendingMarketOperationLogic/abis/LendingMarketOperationLogic.json + eventHandlers: + - event: LendingMarketInitialized(indexed + bytes32,uint256,uint256,uint256,uint256,address,address) + handler: handleLendingMarketInitialized + - event: OrderBookCreated(indexed bytes32,indexed uint8,uint256,uint256,uint256) + handler: handleOrderBookCreated + - event: OrderBooksRotated(bytes32,uint256,uint256) + handler: handleOrderBooksRotated + file: LendingMarketOperationLogic/LendingMarketOperationLogic.wasm + - kind: ethereum + name: TokenVault + network: filecoin-testnet + source: + abi: TokenVault + address: "0x965920E2c6aa84b87dFDa8ac8495267edC3BC82C" + startBlock: 1493598 + mapping: + kind: ethereum/events + apiVersion: 0.0.7 + language: wasm/assemblyscript + entities: + - User + abis: + - name: TokenVault + file: TokenVault/abis/TokenVault.json + eventHandlers: + - event: Deposit(indexed address,bytes32,uint256,address) + handler: handleDeposit + - event: Withdraw(indexed address,bytes32,uint256) + handler: handleWithdraw + file: TokenVault/TokenVault.wasm + - kind: ethereum + name: FundManagementLogic + network: filecoin-testnet + source: + abi: LendingMarketController + address: "0xbbF4eb28204d4c289a8C9bE82bff334Dd66e1cBC" + startBlock: 1493594 + mapping: + kind: ethereum/events + apiVersion: 0.0.7 + language: wasm/assemblyscript + entities: + - Order + - Transaction + abis: + - name: LendingMarketController + file: FundManagementLogic/abis/FundManagementLogic.json + eventHandlers: + - event: OrderPartiallyFilled(uint48,indexed address,indexed + bytes32,uint8,uint256,uint256,uint256) + handler: handleOrderPartiallyFilled + file: FundManagementLogic/FundManagementLogic.wasm + - kind: ethereum + name: LiquidationLogic + network: filecoin-testnet + source: + abi: LendingMarketController + address: "0xbbF4eb28204d4c289a8C9bE82bff334Dd66e1cBC" + startBlock: 1493594 + mapping: + kind: ethereum/events + apiVersion: 0.0.7 + language: wasm/assemblyscript + entities: + - Liquidation + abis: + - name: LendingMarketController + file: LiquidationLogic/abis/LiquidationLogic.json + eventHandlers: + - event: LiquidationExecuted(indexed address,bytes32,indexed bytes32,indexed + uint256,uint256) + handler: handleLiquidationExecuted + file: LiquidationLogic/LiquidationLogic.wasm +templates: + - kind: ethereum + name: OrderActionLogic + network: filecoin-testnet + source: + abi: OrderActionLogic + mapping: + kind: ethereum/events + apiVersion: 0.0.7 + language: wasm/assemblyscript + entities: + - Order + - Transaction + - DailyVolume + abis: + - name: OrderActionLogic + file: OrderActionLogic/abis/OrderActionLogic.json + eventHandlers: + - event: OrderExecuted(indexed address,uint8,indexed bytes32,indexed + uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint48,uint256,uint256,bool) + handler: handleOrderExecuted + - event: PreOrderExecuted(indexed address,uint8,indexed bytes32,indexed + uint256,uint256,uint256,uint48) + handler: handlePreOrderExecuted + - event: PositionUnwound(indexed address,uint8,indexed bytes32,indexed + uint256,uint256,uint256,uint256,uint256,uint256,bool) + handler: handlePositionUnwound + - event: OrderCanceled(uint48,indexed address,uint8,bytes32,uint256,uint256,uint256) + handler: handleOrderCanceled + - event: OrdersCleaned(uint48[],indexed address,uint8,indexed + bytes32,uint256,uint256,uint256) + handler: handleOrdersCleaned + file: templates/OrderActionLogic/OrderActionLogic.wasm + - kind: ethereum + name: OrderBookLogic + network: filecoin-testnet + source: + abi: OrderBookLogic + mapping: + kind: ethereum/events + apiVersion: 0.0.7 + language: wasm/assemblyscript + entities: + - LendingMarket + abis: + - name: OrderBookLogic + file: OrderBookLogic/abis/OrderBookLogic.json + eventHandlers: + - event: ItayoseExecuted(bytes32,uint256,uint256,uint256,uint256,uint256) + handler: handleItayoseExecuted + file: templates/OrderActionLogic/OrderActionLogic.wasm diff --git a/subgraph-build/templates/OrderActionLogic/OrderActionLogic.wasm b/subgraph-build/templates/OrderActionLogic/OrderActionLogic.wasm new file mode 100644 index 0000000000000000000000000000000000000000..7d61e1324d8c2af1a8649f8fe2c17fa711ede314 GIT binary patch literal 249883 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 literal 0 HcmV?d00001 diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f4b8852 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,74 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + "lib": ["es2019"], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "dist", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true, /* Skip type checking of declaration files. */ + "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ + "resolveJsonModule": true /* Enabling the option allows importing JSON, and validating the types in that JSON file. */ + }, + "include": ["src/**/*"] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..f9f97b3 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,7398 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@achingbrain/ip-address@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@achingbrain/ip-address/-/ip-address-8.1.0.tgz#24f2e9cd7289e33f433d771b23bea56cfd0242c9" + integrity sha512-Zus4vMKVRDm+R1o0QJNhD0PD/8qRGO3Zx8YPsFG5lANt5utVtGg3iHVGBSAF80TfQmhi8rP+Kg/OigdxY0BXHw== + dependencies: + jsbn "1.1.0" + sprintf-js "1.1.2" + +"@achingbrain/nat-port-mapper@^1.0.3": + version "1.0.13" + resolved "https://registry.yarnpkg.com/@achingbrain/nat-port-mapper/-/nat-port-mapper-1.0.13.tgz#22519833c2d70d48addd551b5cccbf84010ccda5" + integrity sha512-B5GL6ILDek72OjoEyFGEuuNYaEOYxO06Ulhcaf/5iQ4EO8uaZWS+OkolYST7L+ecJrkjfaSNmSAsWRRuh+1Z5A== + dependencies: + "@achingbrain/ssdp" "^4.0.1" + "@libp2p/logger" "^4.0.1" + default-gateway "^7.2.2" + err-code "^3.0.1" + it-first "^3.0.1" + p-defer "^4.0.0" + p-timeout "^6.1.1" + xml2js "^0.6.0" + +"@achingbrain/ssdp@^4.0.1": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@achingbrain/ssdp/-/ssdp-4.0.6.tgz#eca66ac260dcfcfcb237d7a58e63c3c8e87591b4" + integrity sha512-Y4JE2L9150i50V6lg/Y8+ilhxRpUZKKv+PKo68Aj7MjPfaUAar6ZHilF9h4/Zb3q0fqGMXNc9o11cQLNI8J8bA== + dependencies: + event-iterator "^2.0.0" + freeport-promise "^2.0.0" + merge-options "^3.0.4" + xml2js "^0.6.2" + +"@apollo/client@^3.3.19", "@apollo/client@^3.7.1": + version "3.10.4" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.10.4.tgz#1abc488c79cf37dc63edf041aee6f9dc5aabc692" + integrity sha512-51gk0xOwN6Ls1EbTG5svFva1kdm2APHYTzmFhaAdvUQoJFDxfc0UwQgDxGptzH84vkPlo1qunY1FuboyF9LI3Q== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + "@wry/caches" "^1.0.0" + "@wry/equality" "^0.5.6" + "@wry/trie" "^0.5.0" + graphql-tag "^2.12.6" + hoist-non-react-statics "^3.3.2" + optimism "^0.18.0" + prop-types "^15.7.2" + rehackt "^0.1.0" + response-iterator "^0.2.6" + symbol-observable "^4.0.0" + ts-invariant "^0.10.3" + tslib "^2.3.0" + zen-observable-ts "^1.2.5" + +"@apollo/protobufjs@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.6.tgz#d601e65211e06ae1432bf5993a1a0105f2862f27" + integrity sha512-Wqo1oSHNUj/jxmsVp4iR3I480p6qdqHikn38lKrFhfzcDJ7lwd7Ck7cHRl4JE81tWNArl77xhnG/OkZhxKBYOw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.0" + "@types/node" "^10.1.0" + long "^4.0.0" + +"@apollo/protobufjs@1.2.7": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.7.tgz#3a8675512817e4a046a897e5f4f16415f16a7d8a" + integrity sha512-Lahx5zntHPZia35myYDBRuF58tlwPskwHc5CWBZC/4bMKB6siTBWwtMrkqXcsNwQiFSzSx5hKdRPUmemrEp3Gg== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.0" + long "^4.0.0" + +"@apollo/usage-reporting-protobuf@^4.0.0": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@apollo/usage-reporting-protobuf/-/usage-reporting-protobuf-4.1.1.tgz#407c3d18c7fbed7a264f3b9a3812620b93499de1" + integrity sha512-u40dIUePHaSKVshcedO7Wp+mPiZsaU6xjv9J+VyxpoU/zL6Jle+9zWeG98tr/+SZ0nZ4OXhrbb8SNr0rAPpIDA== + dependencies: + "@apollo/protobufjs" "1.2.7" + +"@apollo/utils.dropunuseddefinitions@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@apollo/utils.dropunuseddefinitions/-/utils.dropunuseddefinitions-1.1.0.tgz#02b04006442eaf037f4c4624146b12775d70d929" + integrity sha512-jU1XjMr6ec9pPoL+BFWzEPW7VHHulVdGKMkPAMiCigpVIT11VmCbnij0bWob8uS3ODJ65tZLYKAh/55vLw2rbg== + +"@apollo/utils.keyvaluecache@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-1.0.2.tgz#2bfe358c4d82f3a0950518451996758c52613f57" + integrity sha512-p7PVdLPMnPzmXSQVEsy27cYEjVON+SH/Wb7COyW3rQN8+wJgT1nv9jZouYtztWW8ZgTkii5T6tC9qfoDREd4mg== + dependencies: + "@apollo/utils.logger" "^1.0.0" + lru-cache "7.10.1 - 7.13.1" + +"@apollo/utils.logger@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@apollo/utils.logger/-/utils.logger-1.0.1.tgz#aea0d1bb7ceb237f506c6bbf38f10a555b99a695" + integrity sha512-XdlzoY7fYNK4OIcvMD2G94RoFZbzTQaNP0jozmqqMudmaGo2I/2Jx71xlDJ801mWA/mbYRihyaw6KJii7k5RVA== + +"@apollo/utils.printwithreducedwhitespace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@apollo/utils.printwithreducedwhitespace/-/utils.printwithreducedwhitespace-1.1.0.tgz#c466299a4766eef8577a2a64c8f27712e8bd7e30" + integrity sha512-GfFSkAv3n1toDZ4V6u2d7L4xMwLA+lv+6hqXicMN9KELSJ9yy9RzuEXaX73c/Ry+GzRsBy/fdSUGayGqdHfT2Q== + +"@apollo/utils.removealiases@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@apollo/utils.removealiases/-/utils.removealiases-1.0.0.tgz#75f6d83098af1fcae2d3beb4f515ad4a8452a8c1" + integrity sha512-6cM8sEOJW2LaGjL/0vHV0GtRaSekrPQR4DiywaApQlL9EdROASZU5PsQibe2MWeZCOhNrPRuHh4wDMwPsWTn8A== + +"@apollo/utils.sortast@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@apollo/utils.sortast/-/utils.sortast-1.1.0.tgz#93218c7008daf3e2a0725196085a33f5aab5ad07" + integrity sha512-VPlTsmUnOwzPK5yGZENN069y6uUHgeiSlpEhRnLFYwYNoJHsuJq2vXVwIaSmts015WTPa2fpz1inkLYByeuRQA== + dependencies: + lodash.sortby "^4.7.0" + +"@apollo/utils.stripsensitiveliterals@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@apollo/utils.stripsensitiveliterals/-/utils.stripsensitiveliterals-1.2.0.tgz#4920651f36beee8e260e12031a0c5863ad0c7b28" + integrity sha512-E41rDUzkz/cdikM5147d8nfCFVKovXxKBcjvLEQ7bjZm/cg9zEcXvS6vFY8ugTubI3fn6zoqo0CyU8zT+BGP9w== + +"@apollo/utils.usagereporting@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@apollo/utils.usagereporting/-/utils.usagereporting-1.0.1.tgz#3c70b49e554771659576fe35381c7a4b321d27fd" + integrity sha512-6dk+0hZlnDbahDBB2mP/PZ5ybrtCJdLMbeNJD+TJpKyZmSY6bA3SjI8Cr2EM9QA+AdziywuWg+SgbWUF3/zQqQ== + dependencies: + "@apollo/usage-reporting-protobuf" "^4.0.0" + "@apollo/utils.dropunuseddefinitions" "^1.1.0" + "@apollo/utils.printwithreducedwhitespace" "^1.1.0" + "@apollo/utils.removealiases" "1.0.0" + "@apollo/utils.sortast" "^1.1.0" + "@apollo/utils.stripsensitiveliterals" "^1.2.0" + +"@apollographql/apollo-tools@^0.5.3": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.5.4.tgz#cb3998c6cf12e494b90c733f44dd9935e2d8196c" + integrity sha512-shM3q7rUbNyXVVRkQJQseXv6bnYM3BUma/eZhwXR4xsuM+bqWnJKvW7SAfRjP7LuSCocrexa5AXhjjawNHrIlw== + +"@apollographql/graphql-playground-html@1.6.29": + version "1.6.29" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz#a7a646614a255f62e10dcf64a7f68ead41dec453" + integrity sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA== + dependencies: + xss "^1.0.8" + +"@cerc-io/assemblyscript@0.19.10-watcher-ts-0.1.2": + version "0.19.10-watcher-ts-0.1.2" + resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fassemblyscript/-/0.19.10-watcher-ts-0.1.2/assemblyscript-0.19.10-watcher-ts-0.1.2.tgz#c6a20eeddca44ddb08994831845c0b172433566b" + integrity sha512-iovY7xoH5ZMGQZgsK/Wy8175AN2z6I0WUnzEWaxykkAFQUvnErgiw/Y4crkcOb/fDp8gslRfTeEFtR90m1AyPA== + dependencies: + asyncify-wasm "^1.2.1" + binaryen "101.0.0-nightly.20210723" + long "^4.0.0" + +"@cerc-io/cache@^0.2.90": + version "0.2.90" + resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fcache/-/0.2.90/cache-0.2.90.tgz#95791f16443cc3c48658df8cdf24941c85a5c456" + integrity sha512-vezwldh6P97bKCDe820EbjVmweL1azsuWxZJM8KdmvTdjQNN56PP3JctvCt8agW5rrzfHIo64UBPptT9wheH0A== + dependencies: + canonical-json "^0.0.4" + debug "^4.3.1" + ethers "^5.4.4" + fs-extra "^10.0.0" + level "^7.0.0" + +"@cerc-io/cli@^0.2.90": + version "0.2.90" + resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fcli/-/0.2.90/cli-0.2.90.tgz#16de193b744f683479cfd5fd293f495ca7433bd2" + integrity sha512-DK4HK7+gGiwkzu/Iphe7E4MeVFABAflkAbMU+h8qHrp5T5rVh8rbLCsEF1sY64MZ2jwtUyq8jOYN0X5399uBmg== + dependencies: + "@apollo/client" "^3.7.1" + "@cerc-io/cache" "^0.2.90" + "@cerc-io/ipld-eth-client" "^0.2.90" + "@cerc-io/libp2p" "^0.42.2-laconic-0.1.4" + "@cerc-io/nitro-node" "^0.1.15" + "@cerc-io/peer" "^0.2.90" + "@cerc-io/rpc-eth-client" "^0.2.90" + "@cerc-io/util" "^0.2.90" + "@ethersproject/providers" "^5.4.4" + "@graphql-tools/utils" "^9.1.1" + "@ipld/dag-cbor" "^8.0.0" + "@libp2p/interface-peer-id" "^2.0.0" + apollo-server-express "^3.11.1" + debug "^4.3.1" + ethers "^5.4.4" + express "^4.18.2" + graphql "^15.5.0" + graphql-request "^6.1.0" + graphql-subscriptions "^2.0.0" + http-proxy-middleware "^2.0.6" + js-yaml "^4.0.0" + json-diff "^0.5.4" + lodash "^4.17.21" + pluralize "^8.0.0" + reflect-metadata "^0.1.13" + typeorm "0.2.37" + yargs "^17.0.1" + +"@cerc-io/graph-node@^0.2.90": + version "0.2.90" + resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fgraph-node/-/0.2.90/graph-node-0.2.90.tgz#4e5451a0f384801524d9c78f65be9705a820cca9" + integrity sha512-tMfPQBup+swhUjW+3S5/Kihy6dQ25VLynCwAo5ylE0vV1pm6U8suu8i2lcIu/Nu6Zkm/WzQ7FYl57phI4YdGuw== + dependencies: + "@apollo/client" "^3.3.19" + "@cerc-io/assemblyscript" "0.19.10-watcher-ts-0.1.2" + "@cerc-io/cache" "^0.2.90" + "@cerc-io/ipld-eth-client" "^0.2.90" + "@cerc-io/util" "^0.2.90" + "@types/json-diff" "^0.5.2" + "@types/yargs" "^17.0.0" + bn.js "^4.11.9" + debug "^4.3.1" + fs-extra "^10.0.0" + graphql "^15.5.0" + json-diff "^0.5.4" + lodash "^4.17.21" + omit-deep "^0.3.0" + pluralize "^8.0.0" + reflect-metadata "^0.1.13" + toml "^3.0.0" + typeorm "0.2.37" + typeorm-naming-strategies "^2.0.0" + yargs "^17.0.1" + +"@cerc-io/ipld-eth-client@^0.2.90": + version "0.2.90" + resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fipld-eth-client/-/0.2.90/ipld-eth-client-0.2.90.tgz#2dd907177d0f1bda45af1631f20a3c39f934c243" + integrity sha512-lQkDdawmMQhA9uYxrzvwURwuHr2hcbwaTArYy+p1Xyo/8DicJyxpwg+iHvDceKg971Iq/mDYjQa+HFvbTb+pxg== + dependencies: + "@apollo/client" "^3.7.1" + "@cerc-io/cache" "^0.2.90" + "@cerc-io/util" "^0.2.90" + cross-fetch "^3.1.4" + debug "^4.3.1" + ethers "^5.4.4" + graphql "^15.5.0" + graphql-ws "^5.11.2" + left-pad "^1.3.0" + ws "^8.11.0" + zen-observable-ts "^1.1.0" + +"@cerc-io/libp2p@0.42.2-laconic-0.1.4", "@cerc-io/libp2p@^0.42.2-laconic-0.1.4": + version "0.42.2-laconic-0.1.4" + resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Flibp2p/-/0.42.2-laconic-0.1.4/libp2p-0.42.2-laconic-0.1.4.tgz#ac9347e70d6d3cee040ad02074cae3070b91a8fb" + integrity sha512-gTC62YvkK3P7cWlaH8gQ6lDbqusNiaYI1q7y/+vQ/1s35uStwRn7fvXHC0aY9s36L4S3p1S0sxDzGXM8rtg6+w== + dependencies: + "@achingbrain/nat-port-mapper" "^1.0.3" + "@libp2p/crypto" "^1.0.4" + "@libp2p/interface-address-manager" "^2.0.0" + "@libp2p/interface-connection" "^3.0.2" + "@libp2p/interface-connection-encrypter" "^3.0.1" + "@libp2p/interface-connection-manager" "^1.1.1" + "@libp2p/interface-content-routing" "^2.0.0" + "@libp2p/interface-dht" "^2.0.0" + "@libp2p/interface-keychain" "^2.0.4" + "@libp2p/interface-libp2p" "^1.0.0" + "@libp2p/interface-metrics" "^4.0.0" + "@libp2p/interface-peer-discovery" "^1.0.1" + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interface-peer-info" "^1.0.3" + "@libp2p/interface-peer-routing" "^1.0.1" + "@libp2p/interface-peer-store" "^1.2.2" + "@libp2p/interface-pubsub" "^3.0.0" + "@libp2p/interface-registrar" "^2.0.3" + "@libp2p/interface-stream-muxer" "^3.0.0" + "@libp2p/interface-transport" "^2.1.0" + "@libp2p/interfaces" "^3.0.3" + "@libp2p/keychain" "^1.0.0" + "@libp2p/logger" "^2.0.1" + "@libp2p/multistream-select" "^3.0.0" + "@libp2p/peer-collections" "^3.0.0" + "@libp2p/peer-id" "^2.0.0" + "@libp2p/peer-id-factory" "^2.0.0" + "@libp2p/peer-record" "^5.0.0" + "@libp2p/peer-store" "^6.0.0" + "@libp2p/tracked-map" "^3.0.0" + "@libp2p/utils" "^3.0.2" + "@libp2p/webrtc-peer" "^2.0.2" + "@multiformats/mafmt" "^11.0.2" + "@multiformats/multiaddr" "^11.0.0" + abortable-iterator "^4.0.2" + any-signal "^3.0.0" + datastore-core "^8.0.1" + err-code "^3.0.1" + interface-datastore "^7.0.0" + it-all "^2.0.0" + it-drain "^2.0.0" + it-filter "^2.0.0" + it-first "^2.0.0" + it-handshake "^4.1.2" + it-length-prefixed "^8.0.2" + it-map "^2.0.0" + it-merge "^2.0.0" + it-pair "^2.0.2" + it-pipe "^2.0.3" + it-pushable "^3.1.2" + it-sort "^2.0.1" + it-stream-types "^1.0.4" + merge-options "^3.0.4" + multiformats "^11.0.0" + p-fifo "^1.0.0" + p-settle "^5.0.0" + private-ip "^3.0.0" + protons-runtime "^4.0.1" + rate-limiter-flexible "^2.3.11" + retimer "^3.0.0" + set-delayed-interval "^1.0.0" + timeout-abort-controller "^3.0.0" + uint8arraylist "^2.3.2" + uint8arrays "^4.0.2" + wherearewe "^2.0.0" + xsalsa20 "^1.1.0" + +"@cerc-io/nitro-node@^0.1.15": + version "0.1.16" + resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fnitro-node/-/0.1.16/nitro-node-0.1.16.tgz#7b90a120f85968d0d6642bd6de376256b1a257cc" + integrity sha512-rSjk5bSlhxFtY+gqLrDmjJrCCaB5sl3e/OpBL03hzQ/CjZ00Ggnubf56C1mjUsqI5fRpnyroLrSmdJLXF1ABew== + dependencies: + "@cerc-io/libp2p" "0.42.2-laconic-0.1.4" + "@cerc-io/nitro-util" "^0.1.16" + "@cerc-io/peer" "^0.2.65" + "@cerc-io/ts-channel" "1.0.3-ts-nitro-0.1.1" + "@jpwilliams/waitgroup" "^2.1.0" + "@libp2p/crypto" "^1.0.4" + "@libp2p/tcp" "^6.0.0" + "@multiformats/multiaddr" "^11.1.4" + "@statechannels/nitro-protocol" "^2.0.1-alpha.6" + assert "^2.0.0" + async-mutex "^0.4.0" + debug "^4.3.4" + ethers "^5.7.2" + heap "^0.2.7" + it-pipe "^2.0.5" + level "^8.0.0" + lodash "^4.17.21" + path-browserify "^1.0.1" + promjs "^0.4.2" + uint8arrays "^4.0.3" + +"@cerc-io/nitro-util@^0.1.16": + version "0.1.16" + resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fnitro-util/-/0.1.16/nitro-util-0.1.16.tgz#def62c68d90d4dd521ff6faef8d42b0bf6f049a0" + integrity sha512-1JnpnTooQNZfexD7PlpWnYovHjgR/N3cqbb2lLXTNpzfAuqfgibQ8R0zWpsJEmRp7qoX7OspsUfwklB72tZz5w== + dependencies: + "@cerc-io/ts-channel" "1.0.3-ts-nitro-0.1.1" + "@statechannels/nitro-protocol" "^2.0.1-alpha.6" + assert "^2.0.0" + debug "^4.3.4" + ethers "^5.7.2" + it-pipe "^3.0.1" + json-bigint "^1.0.0" + lodash "^4.17.21" + uint8arrays "^4.0.3" + +"@cerc-io/peer@^0.2.65", "@cerc-io/peer@^0.2.90": + version "0.2.90" + resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fpeer/-/0.2.90/peer-0.2.90.tgz#4507ab3d793b7c4e35af26f26470e2770aac6319" + integrity sha512-jrmbjJBXwrSYOqNkXaaAh2J30gVKV+4vXnZAiPYbpl6Tlo72iJOwWAzJLXJej48NNCkJkdpXkuxcsQZtsW90mQ== + dependencies: + "@cerc-io/libp2p" "^0.42.2-laconic-0.1.4" + "@cerc-io/prometheus-metrics" "1.1.4" + "@chainsafe/libp2p-gossipsub" "^6.0.0" + "@chainsafe/libp2p-noise" "^11.0.0" + "@chainsafe/libp2p-yamux" "3.0.7" + "@libp2p/floodsub" "^6.0.0" + "@libp2p/mplex" "^7.1.1" + "@libp2p/peer-id-factory" "^2.0.0" + "@libp2p/pubsub-peer-discovery" "^8.0.0" + "@libp2p/websockets" "^5.0.5" + "@multiformats/multiaddr" "^11.1.4" + assert "^2.0.0" + buffer "^6.0.3" + chai "^4.3.4" + debug "^4.3.1" + it-length-prefixed "^8.0.4" + it-map "^2.0.0" + it-pipe "^2.0.5" + it-pushable "^3.1.2" + mocha "^8.4.0" + p-event "^5.0.1" + uint8arrays "^4.0.3" + unique-names-generator "^4.7.1" + yargs "^17.0.1" + +"@cerc-io/prometheus-metrics@1.1.4": + version "1.1.4" + resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fprometheus-metrics/-/1.1.4/prometheus-metrics-1.1.4.tgz#51006b0b5bf6168394390c78072a1c0bb2b02f28" + integrity sha512-Mqg7o1Wer8zKv3/0NWB1sCMmW8hyYI0Fw58d/MR62+5EDZ2yPhwMUrLZUhyqdo3qXJzxMylAPSVx8URDcthmKA== + dependencies: + "@libp2p/interface-connection" "^3.0.2" + "@libp2p/interface-metrics" "^4.0.2" + "@libp2p/logger" "^2.0.2" + it-foreach "^1.0.0" + it-stream-types "^1.0.4" + promjs "^0.4.2" + +"@cerc-io/rpc-eth-client@^0.2.90": + version "0.2.90" + resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Frpc-eth-client/-/0.2.90/rpc-eth-client-0.2.90.tgz#e1c814571822cc790163df9f533ea562ed5f1d23" + integrity sha512-+MJ2kNGnZnJvS2KPHGy2iu8UFj6tNHz1Clz3ZbICXiQHGQv9ROs0yvugt/HgFXFin3zIjpPyPJcdQ0VkskJlsA== + dependencies: + "@cerc-io/cache" "^0.2.90" + "@cerc-io/ipld-eth-client" "^0.2.90" + "@cerc-io/util" "^0.2.90" + chai "^4.3.4" + ethers "^5.4.4" + left-pad "^1.3.0" + mocha "^8.4.0" + +"@cerc-io/solidity-mapper@^0.2.90": + version "0.2.90" + resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fsolidity-mapper/-/0.2.90/solidity-mapper-0.2.90.tgz#6b0da45b2030ed818d25a1212cf7485b80142fa4" + integrity sha512-0Ydbjb/WwRmbEYzBDzIBM4I58YpRl2tsdjp4mrdI68rBVonzFOFxNryrCutqkB2mWOUkayznKiUmPESZA3Yj9A== + dependencies: + dotenv "^10.0.0" + +"@cerc-io/ts-channel@1.0.3-ts-nitro-0.1.1": + version "1.0.3-ts-nitro-0.1.1" + resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fts-channel/-/1.0.3-ts-nitro-0.1.1/ts-channel-1.0.3-ts-nitro-0.1.1.tgz#0768781313a167295c0bf21307f47e02dc17e936" + integrity sha512-2jFICUSyffuZ+8+qRhXuLSJq4GJ6Y02wxiXoubH0Kzv2lIKkJtWICY1ZQQhtXAvP0ncAQB85WJHqtqwH8l7J3Q== + +"@cerc-io/util@^0.2.90": + version "0.2.90" + resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Futil/-/0.2.90/util-0.2.90.tgz#bd220c2ccf4cb118c078651078d59f3af92bd85c" + integrity sha512-LrbeZA0vLCxJTEj3bFQaCANwhF3VnBhmVipg34aw4An0pryqNc6OWOoz+aMK16wahrGLoMfNfd2iOUfmXalpAA== + dependencies: + "@apollo/utils.keyvaluecache" "^1.0.1" + "@cerc-io/nitro-node" "^0.1.15" + "@cerc-io/peer" "^0.2.90" + "@cerc-io/solidity-mapper" "^0.2.90" + "@cerc-io/ts-channel" "1.0.3-ts-nitro-0.1.1" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/providers" "^5.4.4" + "@ethersproject/web" "^5.7.1" + "@graphql-tools/schema" "^9.0.10" + "@graphql-tools/utils" "^9.1.1" + "@ipld/dag-cbor" "^6.0.12" + "@libp2p/interface-connection" "^3.0.2" + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/peer-id" "^2.0.0" + apollo-server-core "^3.11.1" + apollo-server-express "^3.11.1" + apollo-server-plugin-response-cache "^3.8.1" + apollo-type-bigint "^0.1.3" + bunyan "^1.8.15" + debug "^4.3.1" + decimal.js "^10.3.1" + ethers "^5.4.4" + express "^4.18.2" + express-queue "^0.0.13" + fs-extra "^10.0.0" + graphql "^15.5.0" + graphql-subscriptions "^2.0.0" + graphql-ws "^5.11.2" + ipfs-http-client "^56.0.3" + it-length-prefixed "^8.0.4" + it-pipe "^2.0.5" + it-pushable "^3.1.2" + js-yaml "^4.1.0" + json-bigint "^1.0.0" + lodash "^4.17.21" + lru-cache "^10.0.0" + mokka "^1.4.2" + multiformats "^9.4.8" + pg "^8.5.1" + pg-boss "^6.1.0" + prom-client "^14.0.1" + toml "^3.0.0" + typeorm "0.2.37" + typeorm-naming-strategies "^2.0.0" + ws "^8.11.0" + yargs "^17.0.1" + +"@chainsafe/is-ip@^2.0.1": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@chainsafe/is-ip/-/is-ip-2.0.2.tgz#7311e7403f11d8c5cfa48111f56fcecaac37c9f6" + integrity sha512-ndGqEMG1W5WkGagaqOZHpPU172AGdxr+LD15sv3WIUvT5oCFUrG1Y0CW/v2Egwj4JXEvSibaIIIqImsm98y1nA== + +"@chainsafe/libp2p-gossipsub@^6.0.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@chainsafe/libp2p-gossipsub/-/libp2p-gossipsub-6.3.0.tgz#0ef8b8548a4c8307233b01dfb23bfa605df6b0e2" + integrity sha512-yRgMB5JpyPROjmhOeOmzJUAKci19qBEnpH80201f8JkkviUJo7+X8i3MUkammlbFg0VhaTKBT98Osbko9+rT1w== + dependencies: + "@libp2p/crypto" "^1.0.3" + "@libp2p/interface-connection" "^4.0.0" + "@libp2p/interface-connection-manager" "^1.3.0" + "@libp2p/interface-keys" "^1.0.3" + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interface-peer-store" "^1.2.2" + "@libp2p/interface-pubsub" "^3.0.0" + "@libp2p/interface-registrar" "^2.0.3" + "@libp2p/interfaces" "^3.2.0" + "@libp2p/logger" "^2.0.0" + "@libp2p/peer-id" "^2.0.0" + "@libp2p/peer-record" "^5.0.0" + "@libp2p/pubsub" "^6.0.0" + "@libp2p/topology" "^4.0.0" + "@multiformats/multiaddr" "^12.0.0" + abortable-iterator "^4.0.2" + denque "^1.5.0" + it-length-prefixed "^8.0.2" + it-pipe "^2.0.4" + it-pushable "^3.1.0" + multiformats "^11.0.0" + protobufjs "^6.11.2" + uint8arraylist "^2.3.2" + uint8arrays "^4.0.2" + +"@chainsafe/libp2p-noise@^11.0.0": + version "11.0.4" + resolved "https://registry.yarnpkg.com/@chainsafe/libp2p-noise/-/libp2p-noise-11.0.4.tgz#b4806e7605e44fa279130c60a95faad13ed01d93" + integrity sha512-X7kA6a3/QPFxNFwgUJ8vubDu5qBDcDT0nhD+jL7g60IFKZu//HFH7oqsNCZa12yx0oR1fEYOR62iHDt2GHyWBQ== + dependencies: + "@libp2p/crypto" "^1.0.11" + "@libp2p/interface-connection-encrypter" "^3.0.5" + "@libp2p/interface-keys" "^1.0.6" + "@libp2p/interface-metrics" "^4.0.4" + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/logger" "^2.0.5" + "@libp2p/peer-id" "^2.0.0" + "@stablelib/chacha20poly1305" "^1.0.1" + "@stablelib/hkdf" "^1.0.1" + "@stablelib/sha256" "^1.0.1" + "@stablelib/x25519" "^1.0.3" + it-length-prefixed "^8.0.2" + it-pair "^2.0.2" + it-pb-stream "^3.2.0" + it-pipe "^2.0.3" + it-stream-types "^1.0.4" + protons-runtime "^5.0.0" + uint8arraylist "^2.3.2" + uint8arrays "^4.0.2" + +"@chainsafe/libp2p-yamux@3.0.7": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@chainsafe/libp2p-yamux/-/libp2p-yamux-3.0.7.tgz#345d620097c6ac07fcbeb5910da18b3ed974337c" + integrity sha512-fp59/7Xzws+4Nz4TUS+5Z/lkwk+9IW6GsU6wPJVaGInxf5tl4qQ5S8TLql23CEGbuvbToqMEdNLVAtE+M2Lvng== + dependencies: + "@libp2p/interface-connection" "^3.0.1" + "@libp2p/interface-stream-muxer" "^3.0.0" + "@libp2p/interfaces" "^3.2.0" + "@libp2p/logger" "^2.0.1" + abortable-iterator "^4.0.2" + any-signal "^3.0.1" + it-pipe "^2.0.4" + it-pushable "^3.1.0" + uint8arraylist "^2.3.2" + +"@chainsafe/netmask@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@chainsafe/netmask/-/netmask-2.0.0.tgz#0d4a75f47919f65011da4327a3845c9661f1038a" + integrity sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg== + dependencies: + "@chainsafe/is-ip" "^2.0.1" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.3.0", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.7.0", "@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.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@5.7.1", "@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.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.4.4": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.7.0", "@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.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.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.7.0", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0", "@ethersproject/web@^5.7.1": + 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.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + +"@graphql-tools/merge@8.3.1": + version "8.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.1.tgz#06121942ad28982a14635dbc87b5d488a041d722" + integrity sha512-BMm99mqdNZbEYeTPK3it9r9S6rsZsQKtlqJsSBknAclXq2pGEfOxjcIZi+kBSkHZKPKCRrYDd5vY0+rUmIHVLg== + dependencies: + "@graphql-tools/utils" "8.9.0" + tslib "^2.4.0" + +"@graphql-tools/merge@^8.4.1": + version "8.4.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.4.2.tgz#95778bbe26b635e8d2f60ce9856b388f11fe8288" + integrity sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw== + dependencies: + "@graphql-tools/utils" "^9.2.1" + tslib "^2.4.0" + +"@graphql-tools/mock@^8.1.2": + version "8.7.20" + resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-8.7.20.tgz#c83ae0f1940d194a3982120c9c85f3ac6b4f7f20" + integrity sha512-ljcHSJWjC/ZyzpXd5cfNhPI7YljRVvabKHPzKjEs5ElxWu2cdlLGvyNYepApXDsM/OJG/2xuhGM+9GWu5gEAPQ== + dependencies: + "@graphql-tools/schema" "^9.0.18" + "@graphql-tools/utils" "^9.2.1" + fast-json-stable-stringify "^2.1.0" + tslib "^2.4.0" + +"@graphql-tools/schema@^8.0.0": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.5.1.tgz#c2f2ff1448380919a330312399c9471db2580b58" + integrity sha512-0Esilsh0P/qYcB5DKQpiKeQs/jevzIadNTaT0jeWklPMwNbT7yMX4EqZany7mbeRRlSRwMzNzL5olyFdffHBZg== + dependencies: + "@graphql-tools/merge" "8.3.1" + "@graphql-tools/utils" "8.9.0" + tslib "^2.4.0" + value-or-promise "1.0.11" + +"@graphql-tools/schema@^9.0.10", "@graphql-tools/schema@^9.0.18": + version "9.0.19" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.19.tgz#c4ad373b5e1b8a0cf365163435b7d236ebdd06e7" + integrity sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w== + dependencies: + "@graphql-tools/merge" "^8.4.1" + "@graphql-tools/utils" "^9.2.1" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/utils@8.9.0": + version "8.9.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.9.0.tgz#c6aa5f651c9c99e1aca55510af21b56ec296cdb7" + integrity sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/utils@^9.1.1", "@graphql-tools/utils@^9.2.1": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-9.2.1.tgz#1b3df0ef166cfa3eae706e3518b17d5922721c57" + integrity sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + tslib "^2.4.0" + +"@graphql-typed-document-node/core@^3.1.1", "@graphql-typed-document-node/core@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" + integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@ipld/dag-cbor@^6.0.12", "@ipld/dag-cbor@^6.0.3": + version "6.0.15" + resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-6.0.15.tgz#aebe7a26c391cae98c32faedb681b1519e3d2372" + integrity sha512-Vm3VTSTwlmGV92a3C5aeY+r2A18zbH2amehNhsX8PBa3muXICaWrN8Uri85A5hLH7D7ElhE8PdjxD6kNqUmTZA== + dependencies: + cborg "^1.5.4" + multiformats "^9.5.4" + +"@ipld/dag-cbor@^7.0.0": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-7.0.3.tgz#aa31b28afb11a807c3d627828a344e5521ac4a1e" + integrity sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA== + dependencies: + cborg "^1.6.0" + multiformats "^9.5.4" + +"@ipld/dag-cbor@^8.0.0": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-8.0.1.tgz#3042c219dd85a71d66ca6946fb6c7b6f0d519369" + integrity sha512-mHRuzgGXNk0Y5W7nNQdN37qJiig1Kdgf92icBVFRUNtBc9Ezl5DIdWfiGWBucHBrhqPBncxoH3As9cHPIRozxA== + dependencies: + cborg "^1.6.0" + multiformats "^11.0.0" + +"@ipld/dag-json@^8.0.1": + version "8.0.11" + resolved "https://registry.yarnpkg.com/@ipld/dag-json/-/dag-json-8.0.11.tgz#8d30cc2dfacb0aef04d327465d3df91e79e8b6ce" + integrity sha512-Pea7JXeYHTWXRTIhBqBlhw7G53PJ7yta3G/sizGEZyzdeEwhZRr0od5IQ0r2ZxOt1Do+2czddjeEPp+YTxDwCA== + dependencies: + cborg "^1.5.4" + multiformats "^9.5.4" + +"@ipld/dag-pb@^2.1.3": + version "2.1.18" + resolved "https://registry.yarnpkg.com/@ipld/dag-pb/-/dag-pb-2.1.18.tgz#12d63e21580e87c75fd1a2c62e375a78e355c16f" + integrity sha512-ZBnf2fuX9y3KccADURG5vb9FaOeMjFkCrNysB0PtftME/4iCTjxfaLoNq/IAh5fTqUOMXvryN6Jyka4ZGuMLIg== + dependencies: + multiformats "^9.5.4" + +"@josephg/resolvable@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@josephg/resolvable/-/resolvable-1.0.1.tgz#69bc4db754d79e1a2f17a650d3466e038d94a5eb" + integrity sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg== + +"@jpwilliams/waitgroup@^2.1.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@jpwilliams/waitgroup/-/waitgroup-2.1.1.tgz#06e639add32d11d5909ca904233a8f77248f76c2" + integrity sha512-0CxRhNfkvFCTLZBKGvKxY2FYtYW1yWhO2McLqBL0X5UWvYjIf9suH8anKW/DNutl369A75Ewyoh2iJMwBZ2tRg== + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== + +"@libp2p/crypto@^1.0.0", "@libp2p/crypto@^1.0.11", "@libp2p/crypto@^1.0.3", "@libp2p/crypto@^1.0.4": + version "1.0.17" + resolved "https://registry.yarnpkg.com/@libp2p/crypto/-/crypto-1.0.17.tgz#e64043328c0c866bf7f4cc8560b4f483e9c745dc" + integrity sha512-Oeg0Eb/EvAho0gVkOgemXEgrVxWaT3x/DpFgkBdZ9qGxwq75w/E/oPc7souqBz+l1swfz37GWnwV7bIb4Xv5Ag== + dependencies: + "@libp2p/interface-keys" "^1.0.2" + "@libp2p/interfaces" "^3.2.0" + "@noble/ed25519" "^1.6.0" + "@noble/secp256k1" "^1.5.4" + multiformats "^11.0.0" + node-forge "^1.1.0" + protons-runtime "^5.0.0" + uint8arraylist "^2.4.3" + uint8arrays "^4.0.2" + +"@libp2p/floodsub@^6.0.0": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@libp2p/floodsub/-/floodsub-6.0.3.tgz#38a5440449ea87bb9be90933a4bca0dbdddfb69c" + integrity sha512-ajbgcX5lgtILRWgXLvjbO6TRB3Dxo/JTGvzSpqmFOfcZ4PGubNkbDkOwz1TXVqFqtD/CI0rYrKiwBxlXmH/6tg== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interface-pubsub" "^3.0.0" + "@libp2p/logger" "^2.0.0" + "@libp2p/pubsub" "^6.0.0" + protons-runtime "^5.0.0" + uint8arraylist "^2.1.1" + uint8arrays "^4.0.3" + +"@libp2p/interface-address-manager@^2.0.0": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@libp2p/interface-address-manager/-/interface-address-manager-2.0.5.tgz#913fceed38b7cfe12a1e546764e3428a1fbaffda" + integrity sha512-e2vLstKkYlAG2PZe6SEBpnnP2Y/ej6URue+zAiyjJPuXoOGNzHyLaqcv7MKye171OEf9dg5wv1gFphWcUJJbSA== + dependencies: + "@libp2p/interfaces" "^3.0.0" + "@multiformats/multiaddr" "^12.0.0" + +"@libp2p/interface-connection-encrypter@^3.0.1", "@libp2p/interface-connection-encrypter@^3.0.5": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@libp2p/interface-connection-encrypter/-/interface-connection-encrypter-3.0.6.tgz#1f7c7428d5905b390cfc5390e72bd02829213d31" + integrity sha512-LwyYBN/aSa3IPCe7gBxffx/vaC0rFxAXlCbx4QGaWGtg6qK80Ouj89LEDWb3HkMbecNVWaV4TEqJIM5WnAAx1Q== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + it-stream-types "^1.0.4" + uint8arraylist "^2.1.2" + +"@libp2p/interface-connection-manager@^1.1.1", "@libp2p/interface-connection-manager@^1.3.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@libp2p/interface-connection-manager/-/interface-connection-manager-1.5.0.tgz#959dedb26c3859677f0c889406d1814978e60386" + integrity sha512-luqYVMH3yip12JlSwVmBdo5/qG4YnXQXp2AV4lvxWK0sUhCnI2r3YL4e9ne8o3LAA5CkH3lPqTQ2HSRpmOruFg== + dependencies: + "@libp2p/interface-connection" "^4.0.0" + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interfaces" "^3.0.0" + "@multiformats/multiaddr" "^12.0.0" + +"@libp2p/interface-connection@^3.0.1", "@libp2p/interface-connection@^3.0.2": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@libp2p/interface-connection/-/interface-connection-3.1.1.tgz#f43180e64de118c29f311ee7111f8bbe50e252bf" + integrity sha512-+hxfYLv4jf+MruQEJiJeIyo/wI33/53wRL0XJTkxwQQPAkLHfZWCUY4kY9sXALd3+ASjXAENvJj9VvzZTlkRDQ== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interfaces" "^3.0.0" + "@multiformats/multiaddr" "^12.0.0" + it-stream-types "^1.0.4" + uint8arraylist "^2.1.2" + +"@libp2p/interface-connection@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@libp2p/interface-connection/-/interface-connection-4.0.0.tgz#fcc830ca891820fac89a4c6bd4fcc2df4874f49b" + integrity sha512-6xx/NmEc84HX7QmsjSC3hHredQYjHv4Dkf4G27adAPf+qN+vnPxmQ7gaTnk243a0++DOFTbZ2gKX/15G2B6SRg== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interfaces" "^3.0.0" + "@multiformats/multiaddr" "^12.0.0" + it-stream-types "^1.0.4" + uint8arraylist "^2.1.2" + +"@libp2p/interface-connection@^5.0.0", "@libp2p/interface-connection@^5.0.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@libp2p/interface-connection/-/interface-connection-5.1.1.tgz#da0572c76da43629d52b8bec6cd092143fae421d" + integrity sha512-ytknMbuuNW72LYMmTP7wFGP5ZTaUSGBCmV9f+uQ55XPcFHtKXLtKWVU/HE8IqPmwtyU8AO7veGoJ/qStMHNRVA== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interfaces" "^3.0.0" + "@multiformats/multiaddr" "^12.0.0" + it-stream-types "^2.0.1" + uint8arraylist "^2.4.3" + +"@libp2p/interface-content-routing@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@libp2p/interface-content-routing/-/interface-content-routing-2.1.1.tgz#7c56acad48f59feb9f0c6dd637e73d0e4eebd510" + integrity sha512-nRPOUWgq1K1fDr3FKW93Tip7aH8AFefCw3nJygL4crepxWTSGw95s1GyDpC7t0RJkWTRNHsqZvsFsJ9FkHExKw== + dependencies: + "@libp2p/interface-peer-info" "^1.0.0" + "@libp2p/interfaces" "^3.0.0" + multiformats "^11.0.0" + +"@libp2p/interface-dht@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@libp2p/interface-dht/-/interface-dht-2.0.3.tgz#da2c11998da9141c85eeaf8402c412174a0b4cbd" + integrity sha512-JAKbHvw3egaSeB7CHOf6PF/dLNim4kzAiXX+0IEz2lln8L32/Xf1T7KNOF/RSbSYqO9b7Xxc/b2fuSfyaMwwMQ== + dependencies: + "@libp2p/interface-peer-discovery" "^2.0.0" + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interface-peer-info" "^1.0.0" + "@libp2p/interfaces" "^3.0.0" + multiformats "^11.0.0" + +"@libp2p/interface-keychain@^2.0.0", "@libp2p/interface-keychain@^2.0.3", "@libp2p/interface-keychain@^2.0.4": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@libp2p/interface-keychain/-/interface-keychain-2.0.5.tgz#6ce104f38cf07ad72c9dfbe471a689f4ea4b4687" + integrity sha512-mb7QNgn9fIvC7CaJCi06GJ+a6DN6RVT9TmEi0NmedZGATeCArPeWWG7r7IfxNVXb9cVOOE1RzV1swK0ZxEJF9Q== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + multiformats "^11.0.0" + +"@libp2p/interface-keys@^1.0.2", "@libp2p/interface-keys@^1.0.3", "@libp2p/interface-keys@^1.0.6": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@libp2p/interface-keys/-/interface-keys-1.0.8.tgz#2c6b55136113ae7cf78133d3c459cdf0455b29ae" + integrity sha512-CJ1SlrwuoHMquhEEWS77E+4vv7hwB7XORkqzGQrPQmA9MRdIEZRS64bA4JqCLUDa4ltH0l+U1vp0oZHLT67NEA== + +"@libp2p/interface-libp2p@^1.0.0": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@libp2p/interface-libp2p/-/interface-libp2p-1.3.3.tgz#d3f8e2900f4605a8d60267fc436b95a882688cf1" + integrity sha512-7kEoIlAGTIiUNJ/4vIFWx+j+iN4aco7O2PqH6ES3dTvX6sgvYxYFi83p1G/RDj8tHKO7jLfG3UmiwJc/Ab0VyA== + dependencies: + "@libp2p/interface-connection" "^5.0.0" + "@libp2p/interface-content-routing" "^2.0.0" + "@libp2p/interface-dht" "^2.0.0" + "@libp2p/interface-keychain" "^2.0.0" + "@libp2p/interface-metrics" "^4.0.0" + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interface-peer-info" "^1.0.0" + "@libp2p/interface-peer-routing" "^1.0.0" + "@libp2p/interface-peer-store" "^1.0.0" + "@libp2p/interface-pubsub" "^4.0.0" + "@libp2p/interface-registrar" "^2.0.0" + "@libp2p/interfaces" "^3.0.0" + "@multiformats/multiaddr" "^12.0.0" + +"@libp2p/interface-metrics@^4.0.0", "@libp2p/interface-metrics@^4.0.2", "@libp2p/interface-metrics@^4.0.4": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@libp2p/interface-metrics/-/interface-metrics-4.0.8.tgz#06eb45588737d72f074c70df8d1ef067a2d7cf71" + integrity sha512-1b9HjYyJH0m35kvPHipuoz2EtYCxyq34NUhuV8VK1VNtrouMpA3uCKp5FI7yHCA6V6+ux1R3UriKgNFOSGbIXQ== + dependencies: + "@libp2p/interface-connection" "^5.0.0" + +"@libp2p/interface-peer-discovery@^1.0.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-discovery/-/interface-peer-discovery-1.1.1.tgz#5de48cbf30d1899de7138afbf4bb7491f91759e8" + integrity sha512-tjbt5DquTyP/JDskasPbIB3lk+zPVL8J9UPfrELZqlslJo9ufsMKyEXcTMMABclTvUsh6uSDgC0JUpUHTeCn8A== + dependencies: + "@libp2p/interface-peer-info" "^1.0.0" + "@libp2p/interfaces" "^3.0.0" + +"@libp2p/interface-peer-discovery@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-discovery/-/interface-peer-discovery-2.0.0.tgz#90f176cfd202f5a362912386199e64f8b1e0fc53" + integrity sha512-Mien5t3Tc+ntP5p50acKUYJN90ouMnq1lOTQDKQNvGcXoajG8A1AEYLocnzVia/MXiexuj6S/Q28WBBacoOlBg== + dependencies: + "@libp2p/interface-peer-info" "^1.0.0" + "@libp2p/interfaces" "^3.0.0" + +"@libp2p/interface-peer-id@^2.0.0", "@libp2p/interface-peer-id@^2.0.1", "@libp2p/interface-peer-id@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-id/-/interface-peer-id-2.0.2.tgz#6302e70b6fc17c451bc3daa11447d059357bcc32" + integrity sha512-9pZp9zhTDoVwzRmp0Wtxw0Yfa//Yc0GqBCJi3EznBDE6HGIAVvppR91wSh2knt/0eYg0AQj7Y35VSesUTzMCUg== + dependencies: + multiformats "^11.0.0" + +"@libp2p/interface-peer-info@^1.0.0", "@libp2p/interface-peer-info@^1.0.2", "@libp2p/interface-peer-info@^1.0.3": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-info/-/interface-peer-info-1.0.10.tgz#566026de95a0817b9e853c982b313541b7960c0b" + integrity sha512-HQlo8NwQjMyamCHJrnILEZz+YwEOXCB2sIIw3slIrhVUYeYlTaia1R6d9umaAeLHa255Zmdm4qGH8rJLRqhCcg== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + "@multiformats/multiaddr" "^12.0.0" + +"@libp2p/interface-peer-routing@^1.0.0", "@libp2p/interface-peer-routing@^1.0.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-routing/-/interface-peer-routing-1.1.1.tgz#b4d3f51d996ce0ea19773db45aff4684e247e6fb" + integrity sha512-/XEhwob9qXjdmI8PBcc+qFin32xmtyoC58nRpq8RliqHY5uOVWiHfZoNtdOXIsNvzVvq5FqlHOWt71ofxXTtlg== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interface-peer-info" "^1.0.0" + "@libp2p/interfaces" "^3.0.0" + +"@libp2p/interface-peer-store@^1.0.0", "@libp2p/interface-peer-store@^1.2.2": + version "1.2.9" + resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-store/-/interface-peer-store-1.2.9.tgz#85173892e52ac230abfd45798bfab03dce20ae84" + integrity sha512-jAAlbP1NXpEJOG6Dbr0QdP71TBYjHBc/65Ulwdn4J4f04PW1bI4JIMQeq6+/sLfaGVryvvUT/a52io8UUtB21Q== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interface-peer-info" "^1.0.0" + "@libp2p/interface-record" "^2.0.0" + "@libp2p/interfaces" "^3.0.0" + "@multiformats/multiaddr" "^12.0.0" + +"@libp2p/interface-peer-store@^2.0.0": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-store/-/interface-peer-store-2.0.4.tgz#5e9961b37094341216301285edf6fd73f3e796aa" + integrity sha512-jNvBK3O1JPJqSiDN2vkb+PV8bTPnYdP54nxsLtut1BWukNm610lwzwleV7CetFI4bJCn6g+BgBvvq8fdADy0tA== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + "@multiformats/multiaddr" "^12.0.0" + +"@libp2p/interface-pubsub@^3.0.0": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@libp2p/interface-pubsub/-/interface-pubsub-3.0.7.tgz#cc1c7c47c883daddd2b84d83d719b3826943be3b" + integrity sha512-+c74EVUBTfw2sx1GE/z/IjsYO6dhur+ukF0knAppeZsRQ1Kgg6K5R3eECtT28fC6dBWLjFpAvW/7QGfiDAL4RA== + dependencies: + "@libp2p/interface-connection" "^4.0.0" + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interfaces" "^3.0.0" + it-pushable "^3.0.0" + uint8arraylist "^2.1.2" + +"@libp2p/interface-pubsub@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@libp2p/interface-pubsub/-/interface-pubsub-4.0.1.tgz#27f85b43ced13cf3382629a38f309f7fc7b45bec" + integrity sha512-PIc5V/J98Yr1ZTHh8lQshP7GdVUh+pKNIqj6wGaDmXs8oQLB40qKCjcpHQNlAnv2e1Bh9mEH2GXv5sGZOA651A== + dependencies: + "@libp2p/interface-connection" "^5.0.0" + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interfaces" "^3.0.0" + it-pushable "^3.1.3" + uint8arraylist "^2.4.3" + +"@libp2p/interface-record@^2.0.0", "@libp2p/interface-record@^2.0.1": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@libp2p/interface-record/-/interface-record-2.0.7.tgz#d083776e465cfa66d10e1d3c8e015677a9fc7635" + integrity sha512-AFPytZWI+p8FJWP0xuK5zbSjalLAOIMzEed2lBKdRWvdGBQUHt9ENLTkfkI9G7p/Pp3hlhVzzBXdIErKd+0GxQ== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + uint8arraylist "^2.4.3" + +"@libp2p/interface-registrar@^2.0.0", "@libp2p/interface-registrar@^2.0.3": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@libp2p/interface-registrar/-/interface-registrar-2.0.12.tgz#a74b59df7b6c345d8bb45d310469b2d5f923e9bf" + integrity sha512-EyCi2bycC2rn3oPB4Swr7EqBsvcaWd6RcqR6zsImNIG9BKc4/R1gl6iaF861JaELYgYmzBMS31x1rQpVz5UekQ== + dependencies: + "@libp2p/interface-connection" "^5.0.0" + "@libp2p/interface-peer-id" "^2.0.0" + +"@libp2p/interface-stream-muxer@^3.0.0": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@libp2p/interface-stream-muxer/-/interface-stream-muxer-3.0.6.tgz#f84fae484290b667a1b4ffa51af7d6138765a698" + integrity sha512-wbLrH/bdF8qe0CpPd3BFMSmUs085vc3/8zx5uhXJySD672enAc8Jw9gmAYd1pIqELdqJqBDg9EI0y1XMRxvVkw== + dependencies: + "@libp2p/interface-connection" "^4.0.0" + "@libp2p/interfaces" "^3.0.0" + it-stream-types "^1.0.4" + +"@libp2p/interface-transport@^2.0.0", "@libp2p/interface-transport@^2.1.0": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@libp2p/interface-transport/-/interface-transport-2.1.3.tgz#3fbc8457013a1552d281a3d94ee7ae0725cc16e0" + integrity sha512-ez+0X+w2Wyw3nJY6mP0DHFgrRnln/miAH4TJLcRfUSJHjGXH5ZfpuK1TnRxXpEUiqOezSbwke06/znI27KpRiQ== + dependencies: + "@libp2p/interface-connection" "^4.0.0" + "@libp2p/interface-stream-muxer" "^3.0.0" + "@libp2p/interfaces" "^3.0.0" + "@multiformats/multiaddr" "^12.0.0" + it-stream-types "^1.0.4" + +"@libp2p/interface@^0.1.6": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@libp2p/interface/-/interface-0.1.6.tgz#1328cf6086f02c499183489ccb143fe9c159e871" + integrity sha512-Lzc5cS/hXuoXhuAbVIxJIHLCYmfPcbU0vVgrpMoiP1Qb2Q3ETU4A46GB8s8mWXgSU6tr9RcqerUqzFYD6+OAag== + dependencies: + "@multiformats/multiaddr" "^12.1.5" + abortable-iterator "^5.0.1" + it-pushable "^3.2.0" + it-stream-types "^2.0.1" + multiformats "^12.0.1" + p-defer "^4.0.0" + race-signal "^1.0.0" + uint8arraylist "^2.4.3" + +"@libp2p/interface@^1.0.0", "@libp2p/interface@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@libp2p/interface/-/interface-1.4.0.tgz#19066f29c21e6ad0d7237997f13f785e3a4fd056" + integrity sha512-XkbZ0NfLVnxvWgo1nVyMwCUYDQbFYFvYPA6KUPLV7/XgcxBapVZT5sJ9hgQ4kTsqSBbjQl6YDXDxCclAPZDNTQ== + dependencies: + "@multiformats/multiaddr" "^12.2.3" + it-pushable "^3.2.3" + it-stream-types "^2.0.1" + multiformats "^13.1.0" + progress-events "^1.0.0" + uint8arraylist "^2.4.8" + +"@libp2p/interfaces@^3.0.0", "@libp2p/interfaces@^3.0.2", "@libp2p/interfaces@^3.0.3", "@libp2p/interfaces@^3.2.0", "@libp2p/interfaces@^3.3.1": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@libp2p/interfaces/-/interfaces-3.3.2.tgz#5d8079be845b0960939b5b18880e785a4714465a" + integrity sha512-p/M7plbrxLzuQchvNwww1Was7ZeGE2NaOFulMaZBYIihU8z3fhaV+a033OqnC/0NTX/yhfdNOG7znhYq3XoR/g== + +"@libp2p/keychain@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@libp2p/keychain/-/keychain-1.0.1.tgz#f34d611ece45bd871f597bd14ce61e60459c6d5d" + integrity sha512-IvvBNcN6juPldpENiDrQFVx12573HP+jRoECGuyUBaMDy2uewFbEPWQbHFmF/kMD1IvEmAiihxrTLk7kEWllfg== + dependencies: + "@libp2p/crypto" "^1.0.11" + "@libp2p/interface-keychain" "^2.0.3" + "@libp2p/interface-peer-id" "^2.0.1" + "@libp2p/interfaces" "^3.3.1" + "@libp2p/logger" "^2.0.5" + "@libp2p/peer-id" "^2.0.1" + interface-datastore "^7.0.3" + merge-options "^3.0.4" + sanitize-filename "^1.6.3" + uint8arrays "^4.0.3" + +"@libp2p/logger@^2.0.0", "@libp2p/logger@^2.0.1", "@libp2p/logger@^2.0.2", "@libp2p/logger@^2.0.5": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@libp2p/logger/-/logger-2.1.1.tgz#e12e6c320ea64252af954bcec996895098d1cd36" + integrity sha512-2UbzDPctg3cPupF6jrv6abQnAUTrbLybNOj0rmmrdGm1cN2HJ1o/hBu0sXuq4KF9P1h/eVRn1HIRbVIEKnEJrA== + dependencies: + "@libp2p/interface-peer-id" "^2.0.2" + "@multiformats/multiaddr" "^12.1.3" + debug "^4.3.4" + interface-datastore "^8.2.0" + multiformats "^11.0.2" + +"@libp2p/logger@^3.0.2": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@libp2p/logger/-/logger-3.1.0.tgz#ac9adb08f344934e191d7049ce876ac0111449ce" + integrity sha512-qJbJBAhxHVsRBtQSOIkSLi0lskUSFjzE+zm0QvoyxzZKSz+mX41mZLbnofPIVOVauoDQ40dXpe7WDUOq8AbiQQ== + dependencies: + "@libp2p/interface" "^0.1.6" + "@multiformats/multiaddr" "^12.1.5" + debug "^4.3.4" + interface-datastore "^8.2.0" + multiformats "^12.0.1" + +"@libp2p/logger@^4.0.1": + version "4.0.13" + resolved "https://registry.yarnpkg.com/@libp2p/logger/-/logger-4.0.13.tgz#9a32d933c79be8854726a1d3c69d95ed69e1f677" + integrity sha512-z1i4Ksdr4cl96Y+VwJdhdNUkwP7189oTn0AQrAQc9WnLKqRUGXWwDf2OgdpJbPU71KteZT3UXLRQGWzXKCt2Wg== + dependencies: + "@libp2p/interface" "^1.4.0" + "@multiformats/multiaddr" "^12.2.3" + debug "^4.3.4" + interface-datastore "^8.2.11" + multiformats "^13.1.0" + +"@libp2p/mplex@^7.1.1": + version "7.1.7" + resolved "https://registry.yarnpkg.com/@libp2p/mplex/-/mplex-7.1.7.tgz#ee14192f5e82aa3710ae4a102875278aea0bb127" + integrity sha512-8eJ6HUL3bM8ck0rb/NJ04+phBUVBMocxH/kuc2Nypn8RX9ezihV7srGGhG5N7muaMwJrRbYkFhIV4GH+8WTZUg== + dependencies: + "@libp2p/interface-connection" "^4.0.0" + "@libp2p/interface-stream-muxer" "^3.0.0" + "@libp2p/interfaces" "^3.2.0" + "@libp2p/logger" "^2.0.0" + abortable-iterator "^4.0.2" + any-signal "^4.0.1" + benchmark "^2.1.4" + it-batched-bytes "^1.0.0" + it-pushable "^3.1.0" + it-stream-types "^1.0.4" + rate-limiter-flexible "^2.3.9" + uint8arraylist "^2.1.1" + uint8arrays "^4.0.2" + varint "^6.0.0" + +"@libp2p/multistream-select@^3.0.0": + version "3.1.9" + resolved "https://registry.yarnpkg.com/@libp2p/multistream-select/-/multistream-select-3.1.9.tgz#60b12503bab879a2ebb97d69f4670a10e67c35c8" + integrity sha512-iSNqr8jXvOrkNTyA43h/ARs4wd0Rd55/D6oFRndLcV4yQSUMmfjl7dUcbC5MAw+5/sgskfDx9TMawSwNq47Qwg== + dependencies: + "@libp2p/interfaces" "^3.2.0" + "@libp2p/logger" "^2.0.0" + abortable-iterator "^5.0.0" + it-first "^3.0.1" + it-handshake "^4.1.3" + it-length-prefixed "^9.0.0" + it-merge "^3.0.0" + it-pipe "^3.0.0" + it-pushable "^3.1.0" + it-reader "^6.0.1" + it-stream-types "^2.0.1" + uint8arraylist "^2.3.1" + uint8arrays "^4.0.2" + +"@libp2p/peer-collections@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@libp2p/peer-collections/-/peer-collections-3.0.2.tgz#a5441108fcf137e822be378e2e3abdd3f22c68d9" + integrity sha512-3vRVMWVRCF6dVs/1/CHbw4YSv83bcqjZuAt9ZQHW85vn6OfHNFQesOHWT1TbRBuL8TSb//IwJkOfTAVLd6Mymw== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/peer-id" "^2.0.0" + +"@libp2p/peer-id-factory@^2.0.0": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@libp2p/peer-id-factory/-/peer-id-factory-2.0.4.tgz#ccf74ece34d16a069602e7cae28b1cb739803e0c" + integrity sha512-+0D+oklFzHpjRI3v7uw3PMMx00P36DV7YvAgL0+gpos0VzR/BI9tRiM6dpObZTrQ1hxp78F03p+qR1Zy9Qnmuw== + dependencies: + "@libp2p/crypto" "^1.0.0" + "@libp2p/interface-keys" "^1.0.2" + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/peer-id" "^2.0.0" + multiformats "^11.0.0" + protons-runtime "^5.0.0" + uint8arraylist "^2.0.0" + uint8arrays "^4.0.2" + +"@libp2p/peer-id@^2.0.0", "@libp2p/peer-id@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@libp2p/peer-id/-/peer-id-2.0.4.tgz#d50d2ae4663ef79f6e31ce4eaf25e1f44e1667ab" + integrity sha512-gcOsN8Fbhj6izIK+ejiWsqiqKeJ2yWPapi/m55VjOvDa52/ptQzZszxQP8jUk93u36de92ATFXDfZR/Bi6eeUQ== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interfaces" "^3.2.0" + multiformats "^11.0.0" + uint8arrays "^4.0.2" + +"@libp2p/peer-id@^3.0.2": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@libp2p/peer-id/-/peer-id-3.0.6.tgz#93b3f240488c0af3d76f64716e2ee032cd2fd2da" + integrity sha512-iN1Ia5gH2U1V/GOVRmLHmVY6fblxzrOPUoZrMYjHl/K4s+AiI7ym/527WDeQvhQpD7j3TfDwcAYforD2dLGpLw== + dependencies: + "@libp2p/interface" "^0.1.6" + multiformats "^12.0.1" + uint8arrays "^4.0.6" + +"@libp2p/peer-record@^5.0.0": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@libp2p/peer-record/-/peer-record-5.0.4.tgz#b8f337a2864ffe2ffbb34596cb03d7c339ed18ae" + integrity sha512-e+AArf7pwMLqF24mehTe1OYjr1v0SOKshVrI1E9YH/Cb1F3ZZuK3smyGmnLaS4JlqsarRCMSe3V50tRkqMFY7g== + dependencies: + "@libp2p/crypto" "^1.0.11" + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interface-record" "^2.0.1" + "@libp2p/interfaces" "^3.2.0" + "@libp2p/peer-id" "^2.0.0" + "@libp2p/utils" "^3.0.0" + "@multiformats/multiaddr" "^12.0.0" + protons-runtime "^5.0.0" + uint8-varint "^1.0.2" + uint8arraylist "^2.1.0" + uint8arrays "^4.0.2" + +"@libp2p/peer-store@^6.0.0": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@libp2p/peer-store/-/peer-store-6.0.4.tgz#3ec42dc8f1863a06bd487ba0701719356a0da51f" + integrity sha512-yw7XbeJ5k880PpkDV/HcSZtj0vQ0ShPbnCzVHc1hW0JS/g1vhpSooAZOf3w65obUoFhUwccnSZ4HSLBSpQqOaA== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interface-peer-info" "^1.0.3" + "@libp2p/interface-peer-store" "^1.2.2" + "@libp2p/interface-record" "^2.0.1" + "@libp2p/interfaces" "^3.2.0" + "@libp2p/logger" "^2.0.0" + "@libp2p/peer-id" "^2.0.0" + "@libp2p/peer-record" "^5.0.0" + "@multiformats/multiaddr" "^11.0.0" + interface-datastore "^7.0.0" + it-all "^2.0.0" + it-filter "^2.0.0" + it-foreach "^1.0.0" + it-map "^2.0.0" + mortice "^3.0.0" + multiformats "^11.0.0" + protons-runtime "^5.0.0" + uint8arraylist "^2.1.1" + uint8arrays "^4.0.2" + +"@libp2p/pubsub-peer-discovery@^8.0.0": + version "8.0.6" + resolved "https://registry.yarnpkg.com/@libp2p/pubsub-peer-discovery/-/pubsub-peer-discovery-8.0.6.tgz#fb48a4c6e7c1d79f819997ee6076f15a6fe87f62" + integrity sha512-M1HoB+AohAaup0fP0Hm8reLctFgKvyRw+R/SlHnHj/jHinHKCtQhNZ9MSiV4vNnSomJZ+viFMw+3Yl2bgvbfgw== + dependencies: + "@libp2p/interface-peer-discovery" "^2.0.0" + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interface-peer-info" "^1.0.2" + "@libp2p/interface-pubsub" "^4.0.0" + "@libp2p/interfaces" "^3.0.3" + "@libp2p/logger" "^3.0.2" + "@libp2p/peer-id" "^3.0.2" + "@multiformats/multiaddr" "^12.0.0" + protons-runtime "^5.0.0" + uint8arraylist "^2.4.3" + +"@libp2p/pubsub@^6.0.0": + version "6.0.6" + resolved "https://registry.yarnpkg.com/@libp2p/pubsub/-/pubsub-6.0.6.tgz#7acf5a1de8fa5d982afc109ddd31e240111e7fe8" + integrity sha512-/JU4xvtZIYDxOyiHIk4MlpnAJuqfZsabDP+4f59QlXNsppOmiIujaDhN3eFBFIKG29XDSgHZBzKMLK+XsB8O5g== + dependencies: + "@libp2p/crypto" "^1.0.0" + "@libp2p/interface-connection" "^4.0.0" + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interface-pubsub" "^3.0.0" + "@libp2p/interface-registrar" "^2.0.0" + "@libp2p/interfaces" "^3.2.0" + "@libp2p/logger" "^2.0.0" + "@libp2p/peer-collections" "^3.0.0" + "@libp2p/peer-id" "^2.0.0" + "@libp2p/topology" "^4.0.0" + abortable-iterator "^4.0.2" + it-length-prefixed "^9.0.0" + it-pipe "^3.0.0" + it-pushable "^3.0.0" + multiformats "^11.0.0" + p-queue "^7.2.0" + uint8arraylist "^2.0.0" + uint8arrays "^4.0.2" + +"@libp2p/tcp@^6.0.0": + version "6.2.2" + resolved "https://registry.yarnpkg.com/@libp2p/tcp/-/tcp-6.2.2.tgz#9262e284037f0951aca22f0fb3d488e3515ff6fd" + integrity sha512-5pLQDSUI+6qtAvh7pYgjqXFuFqzZ/AGL3BSX4C2oa+vWGIbooTZK3Mizp+iO0yHomVJ1y3V8AXXH8ddWdFqDpQ== + dependencies: + "@libp2p/interface-connection" "^4.0.0" + "@libp2p/interface-metrics" "^4.0.0" + "@libp2p/interface-transport" "^2.0.0" + "@libp2p/interfaces" "^3.2.0" + "@libp2p/logger" "^2.0.0" + "@libp2p/utils" "^3.0.2" + "@multiformats/mafmt" "^12.0.0" + "@multiformats/multiaddr" "^12.0.0" + stream-to-it "^0.2.2" + +"@libp2p/topology@^4.0.0": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@libp2p/topology/-/topology-4.0.3.tgz#d86e013bd065b2a61ce82d416e1962c8556a46eb" + integrity sha512-uXd9ZYpmgb+onMTypsAPUlvKKeY20HMtxwsjAMEfDa29yqshK8DiEunHZNjLmtXaMIIO9CBl2w5ykjt5TtFsBQ== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interface-registrar" "^2.0.3" + +"@libp2p/tracked-map@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@libp2p/tracked-map/-/tracked-map-3.0.4.tgz#77bf9ca8fb85cb4593d02086671648cbb1f671d9" + integrity sha512-G5ElrjFoubP10TwQo3dnRVaxhshU9wtu86qq0cIXNv12XCFpvTvx12Vbf8sV1SU5imrWgd6XQgfRKsQtjmu3Ew== + dependencies: + "@libp2p/interface-metrics" "^4.0.0" + +"@libp2p/utils@^3.0.0", "@libp2p/utils@^3.0.2": + version "3.0.13" + resolved "https://registry.yarnpkg.com/@libp2p/utils/-/utils-3.0.13.tgz#a0bf648df4cc0bbb7542a9d88651cc92039a50c9" + integrity sha512-SNwIcQq/FvLpqVsjHHzbxSq7VgbbUK9EB7/865Re4NoLfqgE/6oTUpyPEDlrcJb4aTPFWbVPQzE85cA3raHIIw== + dependencies: + "@achingbrain/ip-address" "^8.1.0" + "@libp2p/interface-connection" "^5.0.1" + "@libp2p/interface-peer-store" "^2.0.0" + "@libp2p/interfaces" "^3.2.0" + "@libp2p/logger" "^2.0.0" + "@multiformats/multiaddr" "^12.0.0" + abortable-iterator "^5.0.0" + is-loopback-addr "^2.0.1" + it-stream-types "^2.0.1" + private-ip "^3.0.0" + uint8arraylist "^2.3.2" + +"@libp2p/webrtc-peer@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@libp2p/webrtc-peer/-/webrtc-peer-2.0.2.tgz#71c240e34905c6c97e20fdf703cec025c745c155" + integrity sha512-FozliUqHO1CIzrL8hPc5uT+5AGUWf5Dw3HncL9tte/CoDNVpj6O59ITIRWefssp3oIGEAIjpcebNu1d+mYfVug== + dependencies: + "@libp2p/interfaces" "^3.0.2" + "@libp2p/logger" "^2.0.0" + delay "^5.0.0" + err-code "^3.0.1" + iso-random-stream "^2.0.2" + it-pushable "^3.0.0" + it-stream-types "^1.0.4" + p-defer "^4.0.0" + p-event "^5.0.1" + uint8arrays "^4.0.2" + +"@libp2p/websockets@^5.0.5": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@libp2p/websockets/-/websockets-5.0.10.tgz#87689c083a7b7e0fa98ab30f0791094c2545f83c" + integrity sha512-q8aKm0rhDxZjc4TzDpB0quog4pViFnz+Ok+UbGEk3xXxHwT3QCxaDVPKMemMqN/1N3OahVvcodpcvFSuWmus+A== + dependencies: + "@libp2p/interface-connection" "^4.0.0" + "@libp2p/interface-transport" "^2.0.0" + "@libp2p/interfaces" "^3.0.3" + "@libp2p/logger" "^2.0.0" + "@libp2p/utils" "^3.0.2" + "@multiformats/mafmt" "^12.0.0" + "@multiformats/multiaddr" "^12.0.0" + "@multiformats/multiaddr-to-uri" "^9.0.2" + abortable-iterator "^4.0.2" + it-ws "^5.0.6" + p-defer "^4.0.0" + p-timeout "^6.0.0" + wherearewe "^2.0.1" + ws "^8.12.1" + +"@multiformats/dns@^1.0.3": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@multiformats/dns/-/dns-1.0.6.tgz#b8c7de11459a02a5f4e609d35d3cdb95cb6ad152" + integrity sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw== + dependencies: + "@types/dns-packet" "^5.6.5" + buffer "^6.0.3" + dns-packet "^5.6.1" + hashlru "^2.3.0" + p-queue "^8.0.1" + progress-events "^1.0.0" + uint8arrays "^5.0.2" + +"@multiformats/mafmt@^11.0.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@multiformats/mafmt/-/mafmt-11.1.2.tgz#c03ef4022c795b7f230b136f2f974fc263eac4f1" + integrity sha512-3n1o5eLU7WzTAPLuz3AodV7Iql6NWf7Ws8fqVaGT7o5nDDabUPYGBm2cZuh3OrqmwyCY61LrNUIsjzivU6UdpQ== + dependencies: + "@multiformats/multiaddr" "^12.0.0" + +"@multiformats/mafmt@^12.0.0": + version "12.1.6" + resolved "https://registry.yarnpkg.com/@multiformats/mafmt/-/mafmt-12.1.6.tgz#e7c1831c1e94c94932621826049afc89f3ad43b7" + integrity sha512-tlJRfL21X+AKn9b5i5VnaTD6bNttpSpcqwKVmDmSHLwxoz97fAHaepqFOk/l1fIu94nImIXneNbhsJx/RQNIww== + dependencies: + "@multiformats/multiaddr" "^12.0.0" + +"@multiformats/multiaddr-to-uri@^9.0.2": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-9.0.8.tgz#c0b1491b26a4d52273ddc16024c59ba47ef8583f" + integrity sha512-4eiN5iEiQfy2A98BxekUfW410L/ivg0sgjYSgSqmklnrBhK+QyMz4yqgfkub8xDTXOc7O5jp4+LVyM3ZqMeWNw== + dependencies: + "@multiformats/multiaddr" "^12.0.0" + +"@multiformats/multiaddr@^11.0.0", "@multiformats/multiaddr@^11.1.4": + version "11.6.1" + resolved "https://registry.yarnpkg.com/@multiformats/multiaddr/-/multiaddr-11.6.1.tgz#ec46984a298e715e27a398434c087856db5f3185" + integrity sha512-doST0+aB7/3dGK9+U5y3mtF3jq85KGbke1QiH0KE1F5mGQ9y56mFebTeu2D9FNOm+OT6UHb8Ss8vbSnpGjeLNw== + dependencies: + "@chainsafe/is-ip" "^2.0.1" + dns-over-http-resolver "^2.1.0" + err-code "^3.0.1" + multiformats "^11.0.0" + uint8arrays "^4.0.2" + varint "^6.0.0" + +"@multiformats/multiaddr@^12.0.0", "@multiformats/multiaddr@^12.1.3", "@multiformats/multiaddr@^12.1.5", "@multiformats/multiaddr@^12.2.3": + version "12.2.3" + resolved "https://registry.yarnpkg.com/@multiformats/multiaddr/-/multiaddr-12.2.3.tgz#b669bb39fa6999f9a35d03471c702630771a624e" + integrity sha512-qUP24ZgYXnyZs0lpYBvPg8Jyn3KFOJFH3a3tAcupulYIVQpR+3/fbaAZp4dYUJxBIDTOfEIpvPKm0DOFxbCDKw== + dependencies: + "@chainsafe/is-ip" "^2.0.1" + "@chainsafe/netmask" "^2.0.0" + "@libp2p/interface" "^1.0.0" + "@multiformats/dns" "^1.0.3" + multiformats "^13.0.0" + uint8-varint "^2.0.1" + uint8arrays "^5.0.0" + +"@noble/ed25519@^1.6.0": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.3.tgz#57e1677bf6885354b466c38e2b620c62f45a7123" + integrity sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ== + +"@noble/secp256k1@^1.5.4": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@openzeppelin/contracts@4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.6.0.tgz#c91cf64bc27f573836dba4122758b4743418c1b3" + integrity sha512-8vi4d50NNya/bQqCmaVzvHNmwHvS0OBKb7HNtuNwEE3scXWrP31fKQoGxNMT+KbzmrNZzatE3QK5p2gFONI/hg== + +"@openzeppelin/contracts@^4.7.3": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.6.tgz#2a880a24eb19b4f8b25adc2a5095f2aa27f39677" + integrity sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA== + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + +"@sqltools/formatter@^1.2.2": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.5.tgz#3abc203c79b8c3e90fd6c156a0c62d5403520e12" + integrity sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw== + +"@stablelib/aead@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/aead/-/aead-1.0.1.tgz#c4b1106df9c23d1b867eb9b276d8f42d5fc4c0c3" + integrity sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg== + +"@stablelib/binary@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/binary/-/binary-1.0.1.tgz#c5900b94368baf00f811da5bdb1610963dfddf7f" + integrity sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q== + dependencies: + "@stablelib/int" "^1.0.1" + +"@stablelib/bytes@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/bytes/-/bytes-1.0.1.tgz#0f4aa7b03df3080b878c7dea927d01f42d6a20d8" + integrity sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ== + +"@stablelib/chacha20poly1305@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz#de6b18e283a9cb9b7530d8767f99cde1fec4c2ee" + integrity sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA== + dependencies: + "@stablelib/aead" "^1.0.1" + "@stablelib/binary" "^1.0.1" + "@stablelib/chacha" "^1.0.1" + "@stablelib/constant-time" "^1.0.1" + "@stablelib/poly1305" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/chacha@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/chacha/-/chacha-1.0.1.tgz#deccfac95083e30600c3f92803a3a1a4fa761371" + integrity sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/constant-time@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/constant-time/-/constant-time-1.0.1.tgz#bde361465e1cf7b9753061b77e376b0ca4c77e35" + integrity sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg== + +"@stablelib/hash@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hash/-/hash-1.0.1.tgz#3c944403ff2239fad8ebb9015e33e98444058bc5" + integrity sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg== + +"@stablelib/hkdf@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hkdf/-/hkdf-1.0.1.tgz#b4efd47fd56fb43c6a13e8775a54b354f028d98d" + integrity sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g== + dependencies: + "@stablelib/hash" "^1.0.1" + "@stablelib/hmac" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/hmac@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hmac/-/hmac-1.0.1.tgz#3d4c1b8cf194cb05d28155f0eed8a299620a07ec" + integrity sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/int@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/int/-/int-1.0.1.tgz#75928cc25d59d73d75ae361f02128588c15fd008" + integrity sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w== + +"@stablelib/keyagreement@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz#4612efb0a30989deb437cd352cee637ca41fc50f" + integrity sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg== + dependencies: + "@stablelib/bytes" "^1.0.1" + +"@stablelib/poly1305@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/poly1305/-/poly1305-1.0.1.tgz#93bfb836c9384685d33d70080718deae4ddef1dc" + integrity sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/random@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@stablelib/random/-/random-1.0.2.tgz#2dece393636489bf7e19c51229dd7900eddf742c" + integrity sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/sha256@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/sha256/-/sha256-1.0.1.tgz#77b6675b67f9b0ea081d2e31bda4866297a3ae4f" + integrity sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/wipe@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" + integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== + +"@stablelib/x25519@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.3.tgz#13c8174f774ea9f3e5e42213cbf9fc68a3c7b7fd" + integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== + dependencies: + "@stablelib/keyagreement" "^1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/wipe" "^1.0.1" + +"@statechannels/exit-format@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@statechannels/exit-format/-/exit-format-0.2.0.tgz#b9362816c2a23d59e429b86b310021de1031a387" + integrity sha512-i+HIPy2P6ddwT/uP0O6AiTmBRTQ9+vLmLnfJtvXmtpTsB8OT1R9Jjj5iVKowGcWk+cg8koEtQuQDMxfrHq7LaQ== + dependencies: + "@openzeppelin/contracts" "4.6.0" + ethers "^5.1.4" + lodash "^4.17.21" + +"@statechannels/nitro-protocol@^2.0.1-alpha.6": + version "2.0.1-alpha.6" + resolved "https://registry.yarnpkg.com/@statechannels/nitro-protocol/-/nitro-protocol-2.0.1-alpha.6.tgz#1bb59365eb78489eef2dfa73733bc1cad9890685" + integrity sha512-VehCgq3AOVTGCvGGIoF23YyQX+x1IbLzByFWbqPovucsm9vW0udR7r8Okw9hC0ZHanHOjQH5KxJL6aKUnrXinw== + dependencies: + "@openzeppelin/contracts" "^4.7.3" + "@statechannels/exit-format" "^0.2.0" + "@typechain/ethers-v5" "^9.0.0" + +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@typechain/ethers-v5@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-9.0.0.tgz#6aa93bea7425c0463bd8a61eea3643540ef851bd" + integrity sha512-bAanuPl1L2itaUdMvor/QvwnIH+TM/CmG00q17Ilv3ZZMeJ2j8HcarhgJUZ9pBY1teBb85P8cC03dz3mSSx+tQ== + dependencies: + lodash "^4.17.15" + ts-essentials "^7.0.1" + +"@types/accepts@^1.3.5": + version "1.3.7" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.7.tgz#3b98b1889d2b2386604c2bbbe62e4fb51e95b265" + integrity sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ== + dependencies: + "@types/node" "*" + +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/body-parser@1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/cors@2.8.12": + version "2.8.12" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + +"@types/debug@^4.1.5": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/dns-packet@^5.6.5": + version "5.6.5" + resolved "https://registry.yarnpkg.com/@types/dns-packet/-/dns-packet-5.6.5.tgz#49fc29a40f5d30227ed028fa1ee82601d3745e15" + integrity sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q== + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@4.17.31": + version "4.17.31" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz#a1139efeab4e7323834bb0226e62ac019f474b2f" + integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express-serve-static-core@^4.17.18": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz#3ae8ab3767d98d0b682cda063c3339e1e86ccfaa" + integrity sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@4.17.14": + version "4.17.14" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c" + integrity sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + +"@types/http-proxy@^1.17.8": + version "1.17.14" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" + integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== + dependencies: + "@types/node" "*" + +"@types/json-bigint@^1.0.0": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/json-bigint/-/json-bigint-1.0.4.tgz#250d29e593375499d8ba6efaab22d094c3199ef3" + integrity sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag== + +"@types/json-diff@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@types/json-diff/-/json-diff-0.5.2.tgz#83689a504b3c7759f046d125d5521d6760ab9d0d" + integrity sha512-2oqXStJYYLDHCciNAClY277Ti3kXT+JLvPD7lLm/490i+B7g0GR6M4qiW+bd2V5vpB+yMKY8IelbsHMAYX1D0A== + +"@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/long@^4.0.0", "@types/long@^4.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/minimatch@^3.0.4": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/node@*", "@types/node@>=13.7.0": + version "20.12.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" + integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== + dependencies: + undici-types "~5.26.4" + +"@types/node@^10.1.0": + version "10.17.60" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" + integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== + +"@types/qs@*": + version "6.9.15" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" + integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/semver@^7.3.12": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.0": + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + dependencies: + "@types/yargs-parser" "*" + +"@types/zen-observable@0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3" + integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== + +"@typescript-eslint/eslint-plugin@^5.47.1": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.47.1": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@wry/caches@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@wry/caches/-/caches-1.0.1.tgz#8641fd3b6e09230b86ce8b93558d44cf1ece7e52" + integrity sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA== + dependencies: + tslib "^2.3.0" + +"@wry/context@^0.7.0": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.4.tgz#e32d750fa075955c4ab2cfb8c48095e1d42d5990" + integrity sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ== + dependencies: + tslib "^2.3.0" + +"@wry/equality@^0.5.6": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.7.tgz#72ec1a73760943d439d56b7b1e9985aec5d497bb" + integrity sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw== + dependencies: + tslib "^2.3.0" + +"@wry/trie@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.4.3.tgz#077d52c22365871bf3ffcbab8e95cb8bc5689af4" + integrity sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w== + dependencies: + tslib "^2.3.0" + +"@wry/trie@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.5.0.tgz#11e783f3a53f6e4cd1d42d2d1323f5bc3fa99c94" + integrity sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA== + dependencies: + tslib "^2.3.0" + +abortable-iterator@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/abortable-iterator/-/abortable-iterator-4.0.3.tgz#432570d8256dbad2cef4f129312b651c5ffcdd0f" + integrity sha512-GJ5fyS9O0hK/TMf+weR+WMEwSEBWVuStHqHmUYWbfHPULyVf7QdUnAvh41+1cUWtHVf0Z/qtQynidxz4ZFDPOg== + dependencies: + get-iterator "^2.0.0" + it-stream-types "^1.0.3" + +abortable-iterator@^5.0.0, abortable-iterator@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/abortable-iterator/-/abortable-iterator-5.0.1.tgz#5d93eba6fa8287a973a9ea090c64ca08b3777780" + integrity sha512-hlZ5Z8UwqrKsJcelVPEqDduZowJPBQJ9ZhBC2FXpja3lXy8X6MoI5uMzIgmrA8+3jcVnp8TF/tx+IBBqYJNUrg== + dependencies: + get-iterator "^2.0.0" + it-stream-types "^2.0.1" + +abstract-level@^1.0.2, abstract-level@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.4.tgz#3ad8d684c51cc9cbc9cf9612a7100b716c414b57" + integrity sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg== + dependencies: + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" + +abstract-leveldown@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#08d19d4e26fb5be426f7a57004851b39e1795a2e" + integrity sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ== + dependencies: + buffer "^6.0.3" + catering "^2.0.0" + is-buffer "^2.0.5" + level-concat-iterator "^3.0.0" + level-supports "^2.0.1" + queue-microtask "^1.2.3" + +accepts@^1.3.5, 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== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + +acorn@^8.4.1, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +any-signal@^3.0.0, any-signal@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-3.0.1.tgz#49cae34368187a3472e31de28fb5cb1430caa9a6" + integrity sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg== + +any-signal@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-4.1.1.tgz#928416c355c66899e6b2a91cad4488f0324bae03" + integrity sha512-iADenERppdC+A2YKbOXXB2WUeABLaM6qnpZ70kZbPZ1cZMMJ7eF+3CaYm+/PhBizgkzlvssC7QuHS30oOiQYWA== + +anymatch@~3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +apollo-datasource@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-3.3.2.tgz#5711f8b38d4b7b53fb788cb4dbd4a6a526ea74c8" + integrity sha512-L5TiS8E2Hn/Yz7SSnWIVbZw0ZfEIXZCa5VUiVxD9P53JvSrf4aStvsFDlGWPvpIdCR+aly2CfoB79B9/JjKFqg== + dependencies: + "@apollo/utils.keyvaluecache" "^1.0.1" + apollo-server-env "^4.2.1" + +apollo-reporting-protobuf@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.4.0.tgz#6edd31f09d4a3704d9e808d1db30eca2229ded26" + integrity sha512-h0u3EbC/9RpihWOmcSsvTW2O6RXVaD/mPEjfrPkxRPTEPWqncsgOoRJw+wih4OqfH3PvTJvoEIf4LwKrUaqWog== + dependencies: + "@apollo/protobufjs" "1.2.6" + +apollo-server-core@^3.11.1, apollo-server-core@^3.13.0: + version "3.13.0" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.13.0.tgz#ad6601fbb34cc97eedca27a9fb0b5738d11cd27d" + integrity sha512-v/g6DR6KuHn9DYSdtQijz8dLOkP78I5JSVJzPkARhDbhpH74QNwrQ2PP2URAPPEDJ2EeZNQDX8PvbYkAKqg+kg== + dependencies: + "@apollo/utils.keyvaluecache" "^1.0.1" + "@apollo/utils.logger" "^1.0.0" + "@apollo/utils.usagereporting" "^1.0.0" + "@apollographql/apollo-tools" "^0.5.3" + "@apollographql/graphql-playground-html" "1.6.29" + "@graphql-tools/mock" "^8.1.2" + "@graphql-tools/schema" "^8.0.0" + "@josephg/resolvable" "^1.0.0" + apollo-datasource "^3.3.2" + apollo-reporting-protobuf "^3.4.0" + apollo-server-env "^4.2.1" + apollo-server-errors "^3.3.1" + apollo-server-plugin-base "^3.7.2" + apollo-server-types "^3.8.0" + async-retry "^1.2.1" + fast-json-stable-stringify "^2.1.0" + graphql-tag "^2.11.0" + loglevel "^1.6.8" + lru-cache "^6.0.0" + node-abort-controller "^3.0.1" + sha.js "^2.4.11" + uuid "^9.0.0" + whatwg-mimetype "^3.0.0" + +apollo-server-env@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-4.2.1.tgz#ea5b1944accdbdba311f179e4dfaeca482c20185" + integrity sha512-vm/7c7ld+zFMxibzqZ7SSa5tBENc4B0uye9LTfjJwGoQFY5xsUPH5FpO5j0bMUDZ8YYNbrF9SNtzc5Cngcr90g== + dependencies: + node-fetch "^2.6.7" + +apollo-server-errors@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-3.3.1.tgz#ba5c00cdaa33d4cbd09779f8cb6f47475d1cd655" + integrity sha512-xnZJ5QWs6FixHICXHxUfm+ZWqqxrNuPlQ+kj5m6RtEgIpekOPssH/SD9gf2B4HuWV0QozorrygwZnux8POvyPA== + +apollo-server-express@^3.11.1: + version "3.13.0" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-3.13.0.tgz#0d8d9bbba3b8b8264912d215f63fd44e74d5f42a" + integrity sha512-iSxICNbDUyebOuM8EKb3xOrpIwOQgKxGbR2diSr4HP3IW8T3njKFOoMce50vr+moOCe1ev8BnLcw9SNbuUtf7g== + dependencies: + "@types/accepts" "^1.3.5" + "@types/body-parser" "1.19.2" + "@types/cors" "2.8.12" + "@types/express" "4.17.14" + "@types/express-serve-static-core" "4.17.31" + accepts "^1.3.5" + apollo-server-core "^3.13.0" + apollo-server-types "^3.8.0" + body-parser "^1.19.0" + cors "^2.8.5" + parseurl "^1.3.3" + +apollo-server-plugin-base@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-3.7.2.tgz#c19cd137bc4c993ba2490ba2b571b0f3ce60a0cd" + integrity sha512-wE8dwGDvBOGehSsPTRZ8P/33Jan6/PmL0y0aN/1Z5a5GcbFhDaaJCjK5cav6npbbGL2DPKK0r6MPXi3k3N45aw== + dependencies: + apollo-server-types "^3.8.0" + +apollo-server-plugin-response-cache@^3.8.1: + version "3.8.2" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-response-cache/-/apollo-server-plugin-response-cache-3.8.2.tgz#131ce372c3e83d5eaf8c826283c8432fa74b90dd" + integrity sha512-1k9iGgE7QIUvjC9B0A1elGrV5YcZZQFl5wEVOS7URUfEuTr3GsIHBZSFCLAEFNKTQewzS5Spqhv13AmFsOaFmg== + dependencies: + "@apollo/utils.keyvaluecache" "^1.0.1" + apollo-server-plugin-base "^3.7.2" + apollo-server-types "^3.8.0" + +apollo-server-types@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-3.8.0.tgz#d976b6967878681f715fe2b9e4dad9ba86b1346f" + integrity sha512-ZI/8rTE4ww8BHktsVpb91Sdq7Cb71rdSkXELSwdSR0eXu600/sY+1UXhTWdiJvk+Eq5ljqoHLwLbY2+Clq2b9A== + dependencies: + "@apollo/utils.keyvaluecache" "^1.0.1" + "@apollo/utils.logger" "^1.0.0" + apollo-reporting-protobuf "^3.4.0" + apollo-server-env "^4.2.1" + +apollo-type-bigint@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/apollo-type-bigint/-/apollo-type-bigint-0.1.3.tgz#9242115ca909b9467ba5c4bc6493a56a06984c0b" + integrity sha512-nyfwEWRZ+kon3Nnot20DufGm2EHZrkJoryYzw3soD+USdxhkcW434w1c/n+mjMLQDl86Z6EvlkvMX5Lordf2Wg== + +app-root-path@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.1.0.tgz#5971a2fc12ba170369a7a1ef018c71e6e47c2e86" + integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +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-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlastindex@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +assert@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd" + integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== + dependencies: + call-bind "^1.0.2" + is-nan "^1.3.2" + object-is "^1.1.5" + object.assign "^4.1.4" + util "^0.12.5" + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +async-mutex@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.1.tgz#bccf55b96f2baf8df90ed798cb5544a1f6ee4c2c" + integrity sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA== + dependencies: + tslib "^2.4.0" + +async-retry@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + +asyncify-wasm@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/asyncify-wasm/-/asyncify-wasm-1.2.1.tgz#a15c0480e858619a4f971e44e6fc05c49015d9e8" + integrity sha512-ZS7tZ8H8EVbUxAZnkKHvMt9UkYoALue2jwrVl7cnLByjq+1MRrbq7rL5TS+EHQduwkfXD/cNZNa+I0ZyLEBBRQ== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +benchmark@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629" + integrity sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ== + dependencies: + lodash "^4.17.4" + platform "^1.3.3" + +bignumber.js@^9.0.0: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +binaryen@101.0.0-nightly.20210723: + version "101.0.0-nightly.20210723" + resolved "https://registry.yarnpkg.com/binaryen/-/binaryen-101.0.0-nightly.20210723.tgz#b6bb7f3501341727681a03866c0856500eec3740" + integrity sha512-eioJNqhHlkguVSbblHOtLqlhtC882SOEPKmNFZaDuz1hzQjolxZ+eu3/kaS10n3sGPONsIZsO7R9fR00UyhEUA== + +bintrees@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.2.tgz#49f896d6e858a4a499df85c38fb399b9aff840f8" + integrity sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw== + +blob-to-it@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-1.0.4.tgz#f6caf7a4e90b7bb9215fa6a318ed6bd8ad9898cb" + integrity sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA== + dependencies: + browser-readablestream-to-it "^1.0.3" + +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.2.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.2, body-parser@^1.19.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" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" + +browser-readablestream-to-it@^1.0.0, browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" + integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw== + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +buffer@^6.0.1, buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bunyan@^1.8.15: + version "1.8.15" + resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.15.tgz#8ce34ca908a17d0776576ca1b2f6cbd916e93b46" + integrity sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig== + optionalDependencies: + dtrace-provider "~0.8" + moment "^2.19.3" + mv "~2" + safe-json-stringify "~1" + +byte-access@^1.0.0, byte-access@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/byte-access/-/byte-access-1.0.1.tgz#84badd99be3671c03f0dd6a039a9c963983724af" + integrity sha512-GKYa+lvxnzhgHWj9X+LCsQ4s2/C5uvib573eAOiQKywXMkzFFErY2+yQdzmdE5iWVpmqecsRx3bOtOY4/1eINw== + dependencies: + uint8arraylist "^2.0.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +canonical-json@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/canonical-json/-/canonical-json-0.0.4.tgz#6579c072c3db5c477ec41dc978fbf2b8f41074a3" + integrity sha512-2sW7x0m/P7dqEnO0O87U7RTVQAaa7MELcd+Jd9FA6CYgYtwJ1TlDWIYMD8nuMkH1KoThsJogqgLyklrt9d/Azw== + +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" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + +cborg@^1.5.4, cborg@^1.6.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.10.2.tgz#83cd581b55b3574c816f82696307c7512db759a1" + integrity sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug== + +chai@^4.3.4: + version "4.4.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" + integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.0.8" + +chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + +classic-level@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.4.1.tgz#169ecf9f9c6200ad42a98c8576af449c1badbaee" + integrity sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.0" + module-error "^1.0.1" + napi-macros "^2.2.2" + node-gyp-build "^4.3.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-color@~0.1.6: + version "0.1.7" + resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-0.1.7.tgz#adc3200fa471cc211b0da7f566b71e98b9d67347" + integrity sha512-xNaQxWYgI6DD4xIJLn8GY2zDZVbrN0vsU1fEbDNAHZRyceWhpj7A08mYcG1AY92q1Aw0geYkVfiAcEYIZtuTSg== + dependencies: + es5-ext "0.8.x" + +cli-highlight@^2.1.11: + version "2.1.11" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" + integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== + dependencies: + chalk "^4.0.0" + highlight.js "^10.7.1" + mz "^2.4.0" + parse5 "^5.1.1" + parse5-htmlparser2-tree-adapter "^6.0.0" + yargs "^16.0.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +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-type@~1.0.4, 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== + +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.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + +copyfiles@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5" + integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== + dependencies: + glob "^7.0.5" + minimatch "^3.0.3" + mkdirp "^1.0.4" + noms "0.0.0" + through2 "^2.0.1" + untildify "^4.0.0" + yargs "^16.1.0" + +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: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cron-parser@^4.0.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.9.0.tgz#0340694af3e46a0894978c6f52a6dbb5c0f11ad5" + integrity sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q== + dependencies: + luxon "^3.2.1" + +cross-fetch@^3.1.4, cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssfilter@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" + integrity sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw== + +dag-jose@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dag-jose/-/dag-jose-1.0.0.tgz#52e42d70cb5bee31ae4e8e3ab860615568d7ad73" + integrity sha512-U0b/YsIPBp6YZNTFrVjwLZAlY3qGRxZTIEcM/CcQmrVrCWq9MWQq9pheXVSPLIhF4SNwzp2SikPva4/BIrJY+g== + dependencies: + "@ipld/dag-cbor" "^6.0.3" + multiformats "^9.0.2" + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +datastore-core@^8.0.1: + version "8.0.4" + resolved "https://registry.yarnpkg.com/datastore-core/-/datastore-core-8.0.4.tgz#a5951c8e530f0ba11ca44f6bb3ce5d7070a3d44e" + integrity sha512-oBA6a024NFXJOTu+w9nLAimfy4wCYUhdE/5XQGtdKt1BmCVtPYW10GORvVT3pdZBcse6k/mVcBl+hjkXIlm65A== + dependencies: + "@libp2p/logger" "^2.0.0" + err-code "^3.0.1" + interface-datastore "^7.0.0" + it-all "^2.0.0" + it-drain "^2.0.0" + it-filter "^2.0.0" + it-map "^2.0.0" + it-merge "^2.0.0" + it-pipe "^2.0.3" + it-pushable "^3.0.0" + it-take "^2.0.0" + uint8arrays "^4.0.2" + +debug@2.6.9, debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +debug@^3.1.0, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +decimal.js@^10.3.1: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +deep-eql@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + dependencies: + type-detect "^4.0.0" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +default-gateway@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-7.2.2.tgz#85e6d88fde0f58703bab7744ed9d5330fa6b3f6c" + integrity sha512-AD7TrdNNPXRZIGw63dw+lnGmT4v7ggZC5NHNJgAYWm5njrwoze1q5JSAW9YuLy2tjnoLUG/r8FEB93MCh9QJPg== + dependencies: + execa "^7.1.1" + +deferred-leveldown@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-7.0.0.tgz#39802715fda6ec06d0159a8b28bd1c7e2b1cf0bf" + integrity sha512-QKN8NtuS3BC6m0B8vAnBls44tX1WXAFATUsJlruyAYbZpysWV3siH6o/i3g9DCHauzodksO60bdj5NazNbjCmg== + dependencies: + abstract-leveldown "^7.2.0" + inherits "^2.0.3" + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + +denque@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" + integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +difflib@~0.2.1: + version "0.2.4" + resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== + dependencies: + heap ">= 0.2.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-over-http-resolver@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz#194d5e140a42153f55bb79ac5a64dd2768c36af9" + integrity sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA== + dependencies: + debug "^4.3.1" + native-fetch "^3.0.0" + receptacle "^1.3.2" + +dns-over-http-resolver@^2.1.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-2.1.3.tgz#bb7f2e10cc18d960339a6e30e21b8c1d99be7b38" + integrity sha512-zjRYFhq+CsxPAouQWzOsxNMvEN+SHisjzhX8EMxd2Y0EG3thvn6wXQgMJLnTDImkhe4jhLbOQpXtL10nALBOSA== + dependencies: + debug "^4.3.1" + native-fetch "^4.0.2" + receptacle "^1.3.2" + undici "^5.12.0" + +dns-packet@^5.6.1: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +dotenv@^8.2.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + +dreamopt@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/dreamopt/-/dreamopt-0.6.0.tgz#d813ccdac8d39d8ad526775514a13dda664d6b4b" + integrity sha512-KRJa47iBEK0y6ZtgCgy2ykuvMT8c9gj3ua9Dv7vCkclFJJeH2FjhGY2xO5qBoWGahsjCGMlk4Cq9wJYeWxuYhQ== + dependencies: + wordwrap ">=0.0.2" + +dtrace-provider@~0.8: + version "0.8.8" + resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.8.tgz#2996d5490c37e1347be263b423ed7b297fb0d97e" + integrity sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg== + dependencies: + nan "^2.14.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-fetch@^1.7.2: + version "1.9.1" + resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.9.1.tgz#e28bfe78d467de3f2dec884b1d72b8b05322f30f" + integrity sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA== + dependencies: + encoding "^0.1.13" + +elliptic@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +elliptic@^6.5.4: + version "6.5.5" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" + integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encoding-down@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-7.1.0.tgz#8d55b5a20d50eb6f0edaf7233f6aee0ff562386a" + integrity sha512-ky47X5jP84ryk5EQmvedQzELwVJPjCgXDQZGeb9F6r4PdChByCGHTBrVcF3h8ynKVJ1wVbkxTsDC8zBROPypgQ== + dependencies: + abstract-leveldown "^7.2.0" + inherits "^2.0.3" + level-codec "^10.0.0" + level-errors "^3.0.0" + +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +err-code@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" + integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== + +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@0.8.x: + version "0.8.2" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.8.2.tgz#aba8d9e1943a895ac96837a62a39b3f55ecd94ab" + integrity sha512-H19ompyhnKiBdjHR1DPHvf5RHgHPmJaY9JNzFGbMbPgdsUkvnUCN1Ke8J4Y0IMyTwFM2M9l4h2GoHwzwpSmXbA== + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +eslint-config-semistandard@^15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-semistandard/-/eslint-config-semistandard-15.0.1.tgz#a868397af8fb26d1bb6b907aa9d575d385581099" + integrity sha512-sfV+qNBWKOmF0kZJll1VH5XqOAdTmLlhbOl9WKI11d2eMEe+Kicxnpm24PQWHOqAfk5pAWU2An0LjNCXKa4Usg== + +eslint-config-standard@^16.0.3: + version "16.0.3" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz#6c8761e544e96c531ff92642eeb87842b8488516" + integrity sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg== + +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-module-utils@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== + dependencies: + debug "^3.2.7" + +eslint-plugin-es@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" + integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-import@^2.27.5: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-node@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" + integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== + dependencies: + eslint-plugin-es "^3.0.0" + eslint-utils "^2.0.0" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + +eslint-plugin-promise@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz#a596acc32981627eb36d9d75f9666ac1a4564971" + integrity sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw== + +eslint-plugin-standard@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-5.0.0.tgz#c43f6925d669f177db46f095ea30be95476b1ee4" + integrity sha512-eSIXPc9wBM4BrniMzJRBm2uoVuXz2EPa+NXPk2+itrVt+r5SbKFERx/IgrK/HmfjddyKVz2f+j+7gBRvu19xLg== + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.35.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + 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== + +ethers@^5.1.4, ethers@^5.4.4, ethers@^5.7.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.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" + integrity sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" + integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + +express-end@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/express-end/-/express-end-0.0.8.tgz#0c8fd95428932158f2b4cf91f4045346bf2c5323" + integrity sha512-PPntzICAq006LBpXKBVJtmRUiCRqTMZ+OB8L2RFXgx+OmkMWU66IL4DTEPF/DOcxmsuC7Y0NdbT2R71lb+pBpg== + dependencies: + debug "^2.2.0" + +express-queue@^0.0.13: + version "0.0.13" + resolved "https://registry.yarnpkg.com/express-queue/-/express-queue-0.0.13.tgz#e9800d67749d4dfab7c34223f00595af933ce5df" + integrity sha512-C4OEDasGDqpXLrZICSUxbY47p5c0bKqf/3/3hwauSCmI+jVVxKBWU2w39BuKLP6nF65z87uDFBbJMPAn2ZrG3g== + dependencies: + debug "^4.3.4" + express-end "0.0.8" + mini-queue "0.0.14" + +express@^4.18.2: + version "4.19.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" + integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.2" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.6.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" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-fifo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +figlet@^1.1.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.7.0.tgz#46903a04603fd19c3e380358418bb2703587a72e" + integrity sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg== + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +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-up@5.0.0, find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +follow-redirects@^1.0.0: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +freeport-promise@^2.0.0: + version "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== + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.1: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-iterator@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" + integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== + +get-iterator@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-2.0.1.tgz#a904829f61bace789e0d64bd1a504c511a015c3f" + integrity sha512-7HuY/hebu4gryTDT7O/XY/fvY9wRByEGdK6QOa4of8npTcv0+NS6frFKABcf6S9EBAsveTuKTsZQQBFMMNILIg== + +get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +get-value@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + +glob-parent@^5.1.2, glob-parent@~5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.5, glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +graphql-request@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-6.1.0.tgz#f4eb2107967af3c7a5907eb3131c671eac89be4f" + integrity sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw== + dependencies: + "@graphql-typed-document-node/core" "^3.2.0" + cross-fetch "^3.1.5" + +graphql-subscriptions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-2.0.0.tgz#11ec181d475852d8aec879183e8e1eb94f2eb79a" + integrity sha512-s6k2b8mmt9gF9pEfkxsaO1lTxaySfKoEJzEfmwguBbQ//Oq23hIXCfR1hm4kdh5hnR20RdwB+s3BCb+0duHSZA== + dependencies: + iterall "^1.3.0" + +graphql-tag@^2.11.0, graphql-tag@^2.12.6: + version "2.12.6" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" + integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== + dependencies: + tslib "^2.1.0" + +graphql-ws@^5.11.2: + version "5.16.0" + resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.16.0.tgz#849efe02f384b4332109329be01d74c345842729" + integrity sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A== + +graphql@^15.5.0: + version "15.8.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" + integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + dependencies: + ansi-regex "^2.0.0" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hashlru@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/hashlru/-/hashlru-2.3.0.tgz#5dc15928b3f6961a2056416bb3a4910216fdfb51" + integrity sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A== + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +"heap@>= 0.2.0", heap@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + +highlight.js@^10.7.1: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy-middleware@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + +husky@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" + integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.1.1, ignore@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +interface-datastore@^6.0.2: + version "6.1.1" + resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-6.1.1.tgz#5150a00de2e7513eaadba58bcafd059cb50004c1" + integrity sha512-AmCS+9CT34pp2u0QQVXjKztkuq3y5T+BIciuiHDDtDZucZD8VudosnSdUyXJV6IsRkN5jc4RFDhCk1O6Q3Gxjg== + dependencies: + interface-store "^2.0.2" + nanoid "^3.0.2" + uint8arrays "^3.0.0" + +interface-datastore@^7.0.0, interface-datastore@^7.0.3: + version "7.0.4" + resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-7.0.4.tgz#f09ae4e2896f57f876d5d742a59e982fb3f42891" + integrity sha512-Q8LZS/jfFFHz6XyZazLTAc078SSCoa27ZPBOfobWdpDiFO7FqPA2yskitUJIhaCgxNK8C+/lMBUTBNfVIDvLiw== + dependencies: + interface-store "^3.0.0" + nanoid "^4.0.0" + uint8arrays "^4.0.2" + +interface-datastore@^8.2.0, interface-datastore@^8.2.11: + version "8.2.11" + resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-8.2.11.tgz#1d555ce6218ab6cba6291fc361debe9713590207" + integrity sha512-9E0iXehfp/j0UbZ2mvlYB4K9pP7uQBCppfuy8WHs1EHF6wLQrM9+zwyX+8Qt6HnH4GKZRyXX/CNXm6oD4+QYgA== + dependencies: + interface-store "^5.0.0" + uint8arrays "^5.0.2" + +interface-store@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-2.0.2.tgz#83175fd2b0c501585ed96db54bb8ba9d55fce34c" + integrity sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg== + +interface-store@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-3.0.4.tgz#670d95ef45f3b7061d154c3cbfaf39a538167ad7" + integrity sha512-OjHUuGXbH4eXSBx1TF1tTySvjLldPLzRSYYXJwrEQI+XfH5JWYZofr0gVMV4F8XTwC+4V7jomDYkvGRmDSRKqQ== + +interface-store@^5.0.0: + version "5.1.8" + resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-5.1.8.tgz#94bf867d165b5c904cccf09adeba215a5b0f459e" + integrity sha512-7na81Uxkl0vqk0CBPO5PvyTkdaJBaezwUJGsMOz7riPOq0rJt+7W31iaopaMICWea/iykUsvNlPx/Tc+MxC3/w== + +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + +ip-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-5.0.0.tgz#cd313b2ae9c80c07bd3851e12bf4fa4dc5480632" + integrity sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== + +ipfs-core-types@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/ipfs-core-types/-/ipfs-core-types-0.10.3.tgz#89ebe98199d4d829f2b20104bfa3299f808c80fe" + integrity sha512-GNid2lRBjR5qgScCglgk7w9Hk3TZAwPHQXxOLQx72wgyc0jF2U5NXRoKW0GRvX8NPbHmsrFszForIqxd23I1Gw== + dependencies: + "@ipld/dag-pb" "^2.1.3" + interface-datastore "^6.0.2" + ipfs-unixfs "^6.0.3" + multiaddr "^10.0.0" + multiformats "^9.5.1" + +ipfs-core-utils@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.14.3.tgz#d04c631c472507bdefc58d4e8d1d9109efbb411c" + integrity sha512-aBkewVhgAj3NWXPwu6imj0wADGiGVZmJzqKzODOJsibDjkx6FGdMv8kvvqtLnK8LS/dvSk9yk32IDtuDyYoV7Q== + dependencies: + any-signal "^3.0.0" + blob-to-it "^1.0.1" + browser-readablestream-to-it "^1.0.1" + debug "^4.1.1" + err-code "^3.0.1" + ipfs-core-types "^0.10.3" + ipfs-unixfs "^6.0.3" + ipfs-utils "^9.0.6" + it-all "^1.0.4" + it-map "^1.0.4" + it-peekable "^1.0.2" + it-to-stream "^1.0.0" + merge-options "^3.0.4" + multiaddr "^10.0.0" + multiaddr-to-uri "^8.0.0" + multiformats "^9.5.1" + nanoid "^3.1.23" + parse-duration "^1.0.0" + timeout-abort-controller "^3.0.0" + uint8arrays "^3.0.0" + +ipfs-http-client@^56.0.3: + version "56.0.3" + resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-56.0.3.tgz#45bbea55347ef13524769d5919cbed84d9d022d6" + integrity sha512-E3L5ylVl6BjyRUsNehvfuRBYp1hj8vQ8in4zskVPMNzXs6JiCFUbif5a6BtcAlSK4xPQyJCeLNNAWLUeFQTLNA== + dependencies: + "@ipld/dag-cbor" "^7.0.0" + "@ipld/dag-json" "^8.0.1" + "@ipld/dag-pb" "^2.1.3" + any-signal "^3.0.0" + dag-jose "^1.0.0" + debug "^4.1.1" + err-code "^3.0.1" + ipfs-core-types "^0.10.3" + ipfs-core-utils "^0.14.3" + ipfs-utils "^9.0.6" + it-first "^1.0.6" + it-last "^1.0.4" + merge-options "^3.0.4" + multiaddr "^10.0.0" + multiformats "^9.5.1" + parse-duration "^1.0.0" + stream-to-it "^0.2.2" + uint8arrays "^3.0.0" + +ipfs-unixfs@^6.0.3: + version "6.0.9" + resolved "https://registry.yarnpkg.com/ipfs-unixfs/-/ipfs-unixfs-6.0.9.tgz#f6613b8e081d83faa43ed96e016a694c615a9374" + integrity sha512-0DQ7p0/9dRB6XCb0mVCTli33GzIzSVx5udpJuVM47tGcD+W+Bl4LsnoLswd3ggNnNEakMv1FdoFITiEnchXDqQ== + dependencies: + err-code "^3.0.1" + protobufjs "^6.10.2" + +ipfs-utils@^9.0.6: + version "9.0.14" + resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-9.0.14.tgz#24f5fda1f4567685eb32bca2543d518f95fd8704" + integrity sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg== + dependencies: + any-signal "^3.0.0" + browser-readablestream-to-it "^1.0.0" + buffer "^6.0.1" + electron-fetch "^1.7.2" + err-code "^3.0.1" + is-electron "^2.2.0" + iso-url "^1.1.5" + it-all "^1.0.4" + it-glob "^1.0.1" + it-to-stream "^1.0.0" + merge-options "^3.0.4" + nanoid "^3.1.20" + native-fetch "^3.0.0" + node-fetch "^2.6.8" + react-native-fetch-api "^3.0.0" + stream-to-it "^0.2.2" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-electron@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9" + integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-fullwidth-code-point@^3.0.0: + version "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-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + +is-loopback-addr@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-loopback-addr/-/is-loopback-addr-2.0.2.tgz#70a6668fa3555d47caebdcee045745ab80adf5e4" + integrity sha512-26POf2KRCno/KTNL5Q0b/9TYnL00xEsSaLfiFRmjM7m7Lw7ZMmFybzzuX4CcsLAluZGd+niLUiMRxEooVE3aqg== + +is-nan@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13, is-typed-array@^1.1.3: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iso-random-stream@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/iso-random-stream/-/iso-random-stream-2.0.2.tgz#a24f77c34cfdad9d398707d522a6a0cc640ff27d" + integrity sha512-yJvs+Nnelic1L2vH2JzWvvPQFA4r7kSTnpST/+LkAQjSz0hos2oqLD+qIVi9Qk38Hoe7mNDt3j0S27R58MVjLQ== + dependencies: + events "^3.3.0" + readable-stream "^3.4.0" + +iso-url@^1.1.2, iso-url@^1.1.5: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.2.1.tgz#db96a49d8d9a64a1c889fc07cc525d093afb1811" + integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng== + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +it-all@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.6.tgz#852557355367606295c4c3b7eff0136f07749335" + integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A== + +it-all@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/it-all/-/it-all-2.0.1.tgz#45d530ecf6e13fb81d7ba583cdfd55ffdb376b05" + integrity sha512-9UuJcCRZsboz+HBQTNOau80Dw+ryGaHYFP/cPYzFBJBFcfDathMYnhHk4t52en9+fcyDGPTdLB+lFc1wzQIroA== + +it-batched-bytes@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/it-batched-bytes/-/it-batched-bytes-1.0.1.tgz#a3b12a10db24308c76a1126032af9184afc2dc63" + integrity sha512-ptBiZ0Mh3kJYySpG0pCS7JgvWhaAW1fGfKDVFtNIuNTA+bpSlXINvD5H3b14ZlJbnJFzFzRSCSZ10E1nH4z/WQ== + dependencies: + it-stream-types "^1.0.4" + p-defer "^4.0.0" + uint8arraylist "^2.4.1" + +it-drain@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/it-drain/-/it-drain-2.0.1.tgz#f50f6ce5cb8592a9d6337c9b5e780348877b152d" + integrity sha512-ESuHV6MLUNxuSy0vGZpKhSRjW0ixczN1FhbVy7eGJHjX6U2qiiXTyMvDc0z/w+nifOOwPyI5DT9Rc3o9IaGqEQ== + +it-filter@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/it-filter/-/it-filter-2.0.2.tgz#c849b3de4a12a2de3cc45be734ee55f69a0ed284" + integrity sha512-gocw1F3siqupegsOzZ78rAc9C+sYlQbI2af/TmzgdrR613MyEJHbvfwBf12XRekGG907kqXSOGKPlxzJa6XV1Q== + +it-first@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/it-first/-/it-first-1.0.7.tgz#a4bef40da8be21667f7d23e44dae652f5ccd7ab1" + integrity sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g== + +it-first@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/it-first/-/it-first-2.0.1.tgz#75d66b254c385ae3a1906def060a69006a437cef" + integrity sha512-noC1oEQcWZZMUwq7VWxHNLML43dM+5bviZpfmkxkXlvBe60z7AFRqpZSga9uQBo792jKv9otnn1IjA4zwgNARw== + +it-first@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/it-first/-/it-first-3.0.6.tgz#f532f0f36fe9bf0c291e0162b9d3375d59fe8f05" + integrity sha512-ExIewyK9kXKNAplg2GMeWfgjUcfC1FnUXz/RPfAvIXby+w7U4b3//5Lic0NV03gXT8O/isj5Nmp6KiY0d45pIQ== + +it-foreach@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/it-foreach/-/it-foreach-1.0.1.tgz#a4dab99c111457d1480bef6c4f9382076d9a6b81" + integrity sha512-eaVFhKxU+uwPs7+DKYxjuL6pj6c50/MBlAH+XPMgPWRRVIChVoyEIsdUQkkC0Ad6oTUmJbKRTnJxEY6o2aIs7A== + +it-glob@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-1.0.2.tgz#bab9b04d6aaac42884502f3a0bfee84c7a29e15e" + integrity sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q== + dependencies: + "@types/minimatch" "^3.0.4" + minimatch "^3.0.4" + +it-handshake@^4.1.2, it-handshake@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/it-handshake/-/it-handshake-4.1.3.tgz#4e6650f8eff5cb3686c6861958645289fb3dc32a" + integrity sha512-V6Lt9A9usox9iduOX+edU1Vo94E6v9Lt9dOvg3ubFaw1qf5NCxXLi93Ao4fyCHWDYd8Y+DUhadwNtWVyn7qqLg== + dependencies: + it-pushable "^3.1.0" + it-reader "^6.0.1" + it-stream-types "^2.0.1" + p-defer "^4.0.0" + uint8arraylist "^2.0.0" + +it-last@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-last/-/it-last-1.0.6.tgz#4106232e5905ec11e16de15a0e9f7037eaecfc45" + integrity sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q== + +it-length-prefixed@^8.0.2, it-length-prefixed@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/it-length-prefixed/-/it-length-prefixed-8.0.4.tgz#80bd356d93d77a8989a71200f8ca0860db040404" + integrity sha512-5OJ1lxH+IaqJB7lxe8IAIwt9UfSfsmjKJoAI/RO9djYoBDt1Jfy9PeVHUmOfqhqyu/4kJvWBFAJUaG1HhLQ12A== + dependencies: + err-code "^3.0.1" + it-stream-types "^1.0.4" + uint8-varint "^1.0.1" + uint8arraylist "^2.0.0" + uint8arrays "^4.0.2" + +it-length-prefixed@^9.0.0: + version "9.0.4" + resolved "https://registry.yarnpkg.com/it-length-prefixed/-/it-length-prefixed-9.0.4.tgz#8096c3270420fe8abaa920c7b4d5e5895144008e" + integrity sha512-lz28fykbG0jq7s5XtvlzGxO5BeSOw6ikymkRllxjL21V5VKLcvB4pHr9wPvEnsAJ2et1xpOk3BRTMq9XrhgKsg== + dependencies: + err-code "^3.0.1" + it-reader "^6.0.1" + it-stream-types "^2.0.1" + uint8-varint "^2.0.1" + uint8arraylist "^2.0.0" + uint8arrays "^5.0.1" + +it-map@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-map/-/it-map-1.0.6.tgz#6aa547e363eedcf8d4f69d8484b450bc13c9882c" + integrity sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ== + +it-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/it-map/-/it-map-2.0.1.tgz#d5251fd6b222d6ee39293d406a3f8fce54fb9220" + integrity sha512-a2GcYDHiAh/eSU628xlvB56LA98luXZnniH2GlD0IdBzf15shEq9rBeb0Rg3o1SWtNILUAwqmQxEXcewGCdvmQ== + +it-merge@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/it-merge/-/it-merge-2.0.1.tgz#6137c63f0dbdcb3b8b74ec67549f2b3351c84da8" + integrity sha512-ItoBy3dPlNKnhjHR8e7nfabfZzH4Jy2OMPvayYH3XHy4YNqSVKmWTIxhz7KX4UMBsLChlIJZ+5j6csJgrYGQtw== + dependencies: + it-pushable "^3.1.0" + +it-merge@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/it-merge/-/it-merge-3.0.5.tgz#2b0d1d07c825b9d20c4c2889aab8e07322fd803e" + integrity sha512-2l7+mPf85pyRF5pqi0dKcA54E5Jm/2FyY5GsOaN51Ta0ipC7YZ3szuAsH8wOoB6eKY4XsU4k2X+mzPmFBMayEA== + dependencies: + it-pushable "^3.2.3" + +it-pair@^2.0.2: + version "2.0.6" + resolved "https://registry.yarnpkg.com/it-pair/-/it-pair-2.0.6.tgz#072defa6b96f611af34e0b0c84573107ddb9f28f" + integrity sha512-5M0t5RAcYEQYNG5BV7d7cqbdwbCAp5yLdzvkxsZmkuZsLbTdZzah6MQySYfaAQjNDCq6PUnDt0hqBZ4NwMfW6g== + dependencies: + it-stream-types "^2.0.1" + p-defer "^4.0.0" + +it-pb-stream@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/it-pb-stream/-/it-pb-stream-3.2.1.tgz#58ad0b1268894d6eb05c17110e22326a33884a46" + integrity sha512-vKE04Zv5MUcwxPNE9bIEfYK3rd/Klj5ORGD1D8Bn5f0mbCLGfouSrqZP1Jntg2osqQg4BN5dKKS2BbfwyGUI3Q== + dependencies: + err-code "^3.0.1" + it-length-prefixed "^9.0.0" + it-pushable "^3.1.2" + it-stream-types "^1.0.4" + protons-runtime "^5.0.0" + uint8-varint "^1.0.6" + uint8arraylist "^2.0.0" + +it-peekable@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-1.0.3.tgz#8ebe933767d9c5aa0ae4ef8e9cb3a47389bced8c" + integrity sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ== + +it-pipe@^2.0.3, it-pipe@^2.0.4, it-pipe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/it-pipe/-/it-pipe-2.0.5.tgz#9caf7993dcbbc3824bc6ef64ee8b94574f65afa7" + integrity sha512-y85nW1N6zoiTnkidr2EAyC+ZVzc7Mwt2p+xt2a2ooG1ThFakSpNw1Kxm+7F13Aivru96brJhjQVRQNU+w0yozw== + dependencies: + it-merge "^2.0.0" + it-pushable "^3.1.0" + it-stream-types "^1.0.3" + +it-pipe@^3.0.0, it-pipe@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/it-pipe/-/it-pipe-3.0.1.tgz#b25720df82f4c558a8532602b5fbc37bbe4e7ba5" + integrity sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA== + dependencies: + it-merge "^3.0.0" + it-pushable "^3.1.2" + it-stream-types "^2.0.1" + +it-pushable@^3.0.0, it-pushable@^3.1.0, it-pushable@^3.1.2, it-pushable@^3.1.3, it-pushable@^3.2.0, it-pushable@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/it-pushable/-/it-pushable-3.2.3.tgz#e2b80aed90cfbcd54b620c0a0785e546d4e5f334" + integrity sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg== + dependencies: + p-defer "^4.0.0" + +it-reader@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/it-reader/-/it-reader-6.0.4.tgz#439cb88225dcd15116be0ffde9e846a928c3871a" + integrity sha512-XCWifEcNFFjjBHtor4Sfaj8rcpt+FkY0L6WdhD578SCDhV4VUm7fCkF3dv5a+fTcfQqvN9BsxBTvWbYO6iCjTg== + dependencies: + it-stream-types "^2.0.1" + uint8arraylist "^2.0.0" + +it-sort@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/it-sort/-/it-sort-2.0.1.tgz#37af025862f7adb30d7fc1f8520b3cd7ef219ef6" + integrity sha512-9f4jKOTHfxc/FJpg/wwuQ+j+88i+sfNGKsu2HukAKymm71/XDnBFtOAOzaimko3YIhmn/ERwnfEKrsYLykxw9A== + dependencies: + it-all "^2.0.0" + +it-stream-types@^1.0.2, it-stream-types@^1.0.3, it-stream-types@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/it-stream-types/-/it-stream-types-1.0.5.tgz#9c72e6adefdea9dac69d0a28fbea783deebd508d" + integrity sha512-I88Ka1nHgfX62e5mi5LLL+oueqz7Ltg0bUdtsUKDe9SoUqbQPf2Mp5kxDTe9pNhHQGs4pvYPAINwuZ1HAt42TA== + +it-stream-types@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/it-stream-types/-/it-stream-types-2.0.1.tgz#69cb4d7e79e707b8257a8997e02751ccb6c3af32" + integrity sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg== + +it-take@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/it-take/-/it-take-2.0.1.tgz#f9e5ddf0b73a18ba00e62fb532d9d3cde3fe4ce6" + integrity sha512-DL7kpZNjuoeSTnB9dMAJ0Z3m2T29LRRAU+HIgkiQM+1jH3m8l9e/1xpWs8JHTlbKivbqSFrQMTc8KVcaQNmsaA== + +it-to-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-1.0.0.tgz#6c47f91d5b5df28bda9334c52782ef8e97fe3a4a" + integrity sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA== + dependencies: + buffer "^6.0.3" + fast-fifo "^1.0.0" + get-iterator "^1.0.2" + p-defer "^3.0.0" + p-fifo "^1.0.0" + readable-stream "^3.6.0" + +it-ws@^5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/it-ws/-/it-ws-5.0.6.tgz#9b69ff2ef9d08fda18ef2db604acf972d0fedded" + integrity sha512-TEEJQaGtkxgP/nGVq8dq48nPT85Afu8kwwvtDFLj4rQLWRhZcb26RWdXLdn9qhXkWPiWbK5H7JWBW1Bebj/SuQ== + dependencies: + event-iterator "^2.0.0" + iso-url "^1.1.2" + it-stream-types "^1.0.2" + uint8arrays "^4.0.2" + ws "^8.4.0" + +iterall@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" + integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== + +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-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== + dependencies: + argparse "^2.0.1" + +js-yaml@^4.0.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-diff@^0.5.4: + version "0.5.5" + resolved "https://registry.yarnpkg.com/json-diff/-/json-diff-0.5.5.tgz#24658ad200dbdd64ae8a56baf4d87b2b33d7196e" + integrity sha512-B2RSfPv8Y5iqm6/9aKC3cOhXPzjYupKDpGuqT5py9NRulL8J0UoB/zKXUo70xBsuxPcIFgtsGgEdXLrNp0GL7w== + dependencies: + cli-color "~0.1.6" + difflib "~0.2.1" + dreamopt "~0.6.0" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +level-codec@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-10.0.0.tgz#f9e892770532c6cdcc83529546730791b0c62c12" + integrity sha512-QW3VteVNAp6c/LuV6nDjg7XDXx9XHK4abmQarxZmlRSDyXYk20UdaJTSX6yzVvQ4i0JyWSB7jert0DsyD/kk6g== + dependencies: + buffer "^6.0.3" + +level-concat-iterator@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz#5235b1f744bc34847ed65a50548aa88d22e881cf" + integrity sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ== + dependencies: + catering "^2.1.0" + +level-errors@^3.0.0, level-errors@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-3.0.1.tgz#4bed48a33108cd83b0e39fdf9bbd84e96fbbef9f" + integrity sha512-tqTL2DxzPDzpwl0iV5+rBCv65HWbHp6eutluHNcVIftKZlQN//b6GEnZDM2CvGZvzGYMwyPtYppYnydBQd2SMQ== + +level-iterator-stream@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-5.0.0.tgz#85b3438e1b4c54ce5aa8c0eb973cfb628117df9e" + integrity sha512-wnb1+o+CVFUDdiSMR/ZymE2prPs3cjVLlXuDeSq9Zb8o032XrabGEXcTCsBxprAtseO3qvFeGzh6406z9sOTRA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.4.0" + +level-js@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/level-js/-/level-js-6.1.0.tgz#982ee9e583fca801aa75689c041995d0e7aab4ef" + integrity sha512-i7mPtkZm68aewfv0FnIUWvFUFfoyzIvVKnUmuQGrelEkP72vSPTaA1SGneWWoCV5KZJG4wlzbJLp1WxVNGuc6A== + dependencies: + abstract-leveldown "^7.2.0" + buffer "^6.0.3" + inherits "^2.0.3" + ltgt "^2.1.2" + run-parallel-limit "^1.1.0" + +level-packager@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-6.0.1.tgz#46b521e63df7f9728543f6792c0a8fe967e679a0" + integrity sha512-8Ezr0XM6hmAwqX9uu8IGzGNkWz/9doyPA8Oo9/D7qcMI6meJC+XhIbNYHukJhIn8OGdlzQs/JPcL9B8lA2F6EQ== + dependencies: + encoding-down "^7.1.0" + levelup "^5.1.1" + +level-supports@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.1.0.tgz#9af908d853597ecd592293b2fad124375be79c5f" + integrity sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA== + +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== + +level-transcoder@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== + dependencies: + buffer "^6.0.3" + module-error "^1.0.1" + +level@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/level/-/level-7.0.1.tgz#05121748d95a4ff7355860d56eb5d0aa36faef2a" + integrity sha512-w3E64+ALx2eZf8RV5JL4kIcE0BFAvQscRYd1yU4YVqZN9RGTQxXSvH202xvK15yZwFFxRXe60f13LJjcJ//I4Q== + dependencies: + level-js "^6.1.0" + level-packager "^6.0.1" + leveldown "^6.1.0" + +level@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/level/-/level-8.0.1.tgz#737161db1bc317193aca4e7b6f436e7e1df64379" + integrity sha512-oPBGkheysuw7DmzFQYyFe8NAia5jFLAgEnkgWnK3OXAuJr8qFT+xBQIwokAZPME2bhPFzS8hlYcL16m8UZrtwQ== + dependencies: + abstract-level "^1.0.4" + browser-level "^1.0.1" + classic-level "^1.2.0" + +leveldown@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-6.1.1.tgz#0f0e480fa88fd807abf94c33cb7e40966ea4b5ce" + integrity sha512-88c+E+Eizn4CkQOBHwqlCJaTNEjGpaEIikn1S+cINc5E9HEvJ77bqY4JY/HxT5u0caWqsc3P3DcFIKBI1vHt+A== + dependencies: + abstract-leveldown "^7.2.0" + napi-macros "~2.0.0" + node-gyp-build "^4.3.0" + +levelup@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-5.1.1.tgz#9f99699f414ac084a3f8a28fc262a1f49cd7a52c" + integrity sha512-0mFCcHcEebOwsQuk00WJwjLI6oCjbBuEYdh/RaRqhjnyVlzqf41T1NnDtCedumZ56qyIh8euLFDqV1KfzTAVhg== + dependencies: + catering "^2.0.0" + deferred-leveldown "^7.0.0" + level-errors "^3.0.1" + level-iterator-stream "^5.0.0" + level-supports "^2.0.1" + queue-microtask "^1.2.3" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + +loglevel@^1.6.8: + version "1.9.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.1.tgz#d63976ac9bcd03c7c873116d41c2a85bafff1be7" + integrity sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +long@^5.0.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + +longbits@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/longbits/-/longbits-1.1.0.tgz#d6a7b2411dead1cf4b79ee4586816e65c7356ab9" + integrity sha512-22U2exkkYy7sr7nuQJYx2NEZ2kEMsC69+BxM5h8auLvkVIJa+LwAB5mFIExnuW2dFuYXFOWsFMKXjaWiq/htYQ== + dependencies: + byte-access "^1.0.1" + uint8arraylist "^2.0.0" + +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + +"lru-cache@7.10.1 - 7.13.1": + version "7.13.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.13.1.tgz#267a81fbd0881327c46a81c5922606a2cfe336c4" + integrity sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ== + +lru-cache@^10.0.0: + version "10.2.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +ltgt@^2.1.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== + +luxon@^3.2.1: + version "3.4.4" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.4.tgz#cf20dc27dc532ba41a169c43fdcc0063601577af" + integrity sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +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.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7" + integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== + dependencies: + is-plain-obj "^2.1.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.6.tgz#ab4e37c42726b9cd788181ba4a2a4fead8e394a3" + integrity sha512-Y4Ypn3oujJYxJcMacVgcs92wofTHxp9FzfDpQON4msDefoC0lb3ETvQLOdLcbhSwU1bz8HrL/1sygfBIHudrkQ== + dependencies: + braces "^3.0.3" + picomatch "^4.0.2" + +mime-db@1.52.0: + version "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.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== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mini-queue@0.0.14: + version "0.0.14" + resolved "https://registry.yarnpkg.com/mini-queue/-/mini-queue-0.0.14.tgz#83d2f3f908e3cac5390bd986d1e6fbbfa0d95b93" + integrity sha512-DNh9Wn8U1jrmn1yVfpviwClyER/Y4ltgGbG+LF/KIdKJ8BEo2Q9jDDPG7tEhz6F/DTZ/ohv5D7AAXFVSFyP05Q== + dependencies: + debug "^3.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +"minimatch@2 || 3", minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mocha@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" + integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.1" + debug "4.3.1" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "4.0.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.20" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.1.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +module-error@^1.0.1, module-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== + +mokka@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/mokka/-/mokka-1.4.2.tgz#b0d7117e216672ff2deda6ef2212bcfa0edb8114" + integrity sha512-Vgki/Fr9fqUMZzChGC1yH64AQg+qkMdZZe3xKrTwYBVGEuq8j2GdnDg8voYXwWl+MLfNzWBnNiejq2xZ8PmojA== + dependencies: + bn.js "^5.2.0" + elliptic "^6.5.4" + +moment@^2.19.3: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== + +mortice@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/mortice/-/mortice-3.0.4.tgz#34aadef768161e9dc49a7f73637b7858bcb7c6fa" + integrity sha512-MUHRCAztSl4v/dAmK8vbYi5u1n9NZtQu4H3FsqS7qgMFQIAFw9lTpHiErd9kJpapqmvEdD1L3dUmiikifAvLsQ== + dependencies: + observable-webworkers "^2.0.1" + p-queue "^8.0.1" + p-timeout "^6.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multiaddr-to-uri@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/multiaddr-to-uri/-/multiaddr-to-uri-8.0.0.tgz#65efe4b1f9de5f6b681aa42ff36a7c8db7625e58" + integrity sha512-dq4p/vsOOUdVEd1J1gl+R2GFrXJQH8yjLtz4hodqdVbieg39LvBOdMQRdQnfbg5LSM/q1BYNVf5CBbwZFFqBgA== + dependencies: + multiaddr "^10.0.0" + +multiaddr@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-10.0.1.tgz#0d15848871370860a4d266bb44d93b3dac5d90ef" + integrity sha512-G5upNcGzEGuTHkzxezPrrD6CaIHR9uo+7MwqhNVcXTs33IInon4y7nMiGxl2CY5hG7chvYQUQhz5V52/Qe3cbg== + dependencies: + dns-over-http-resolver "^1.2.3" + err-code "^3.0.1" + is-ip "^3.1.0" + multiformats "^9.4.5" + uint8arrays "^3.0.0" + varint "^6.0.0" + +multiformats@^11.0.0, multiformats@^11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-11.0.2.tgz#b14735efc42cd8581e73895e66bebb9752151b60" + integrity sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg== + +multiformats@^12.0.1: + version "12.1.3" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-12.1.3.tgz#cbf7a9861e11e74f8228b21376088cb43ba8754e" + integrity sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw== + +multiformats@^13.0.0, multiformats@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-13.1.0.tgz#5aa9d2175108a448fc3bdb54ba8a3d0b6cab3ac3" + integrity sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ== + +multiformats@^9.0.2, multiformats@^9.4.2, multiformats@^9.4.5, multiformats@^9.4.8, multiformats@^9.5.1, multiformats@^9.5.4: + version "9.9.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + +mv@~2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" + integrity sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg== + dependencies: + mkdirp "~0.5.1" + ncp "~2.0.0" + rimraf "~2.4.0" + +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nan@^2.14.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.19.0.tgz#bb58122ad55a6c5bc973303908d5b16cfdd5a8c0" + integrity sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw== + +nanoid@3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + +nanoid@^3.0.2, nanoid@^3.1.20, nanoid@^3.1.23: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +nanoid@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-4.0.2.tgz#140b3c5003959adbebf521c170f282c5e7f9fb9e" + integrity sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw== + +napi-macros@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" + integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== + +napi-macros@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + +native-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb" + integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw== + +native-fetch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-4.0.2.tgz#75c8a44c5f3bb021713e5e24f2846750883e49af" + integrity sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +ncp@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" + integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +netmask@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== + +node-abort-controller@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" + integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== + +node-fetch@^2.6.12, node-fetch@^2.6.7, node-fetch@^2.6.8: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-gyp-build@^4.3.0: + version "4.8.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" + integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== + +noms@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" + integrity sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow== + dependencies: + inherits "^2.0.1" + readable-stream "~1.0.31" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +observable-webworkers@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/observable-webworkers/-/observable-webworkers-2.0.1.tgz#7d9086ebc567bd318b46ba0506b10cedf3813878" + integrity sha512-JI1vB0u3pZjoQKOK1ROWzp0ygxSi7Yb0iR+7UNsw4/Zn4cQ0P3R7XL38zac/Dy2tEA7Lg88/wIJTjF8vYXZ0uw== + +omit-deep@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/omit-deep/-/omit-deep-0.3.0.tgz#21c8af3499bcadd29651a232cbcacbc52445ebec" + integrity sha512-Lbl/Ma59sss2b15DpnWnGmECBRL8cRl/PjPbPMVW+Y8zIQzRrwMaI65Oy6HvxyhYeILVKBJb2LWeG81bj5zbMg== + dependencies: + is-plain-object "^2.0.1" + unset-value "^0.1.1" + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +optimism@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.18.0.tgz#e7bb38b24715f3fdad8a9a7fc18e999144bbfa63" + integrity sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ== + dependencies: + "@wry/caches" "^1.0.0" + "@wry/context" "^0.7.0" + "@wry/trie" "^0.4.3" + tslib "^2.3.0" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +p-defer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" + integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== + +p-defer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-4.0.1.tgz#d12c6d41420785ed0d162dbd86b71ba490f7f99e" + integrity sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A== + +p-event@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-5.0.1.tgz#614624ec02ae7f4f13d09a721c90586184af5b0c" + integrity sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ== + dependencies: + p-timeout "^5.0.2" + +p-fifo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63" + integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A== + dependencies: + fast-fifo "^1.0.0" + p-defer "^3.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-queue@^7.2.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-7.4.1.tgz#7f86f853048beca8272abdbb7cec1ed2afc0f265" + integrity sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA== + dependencies: + eventemitter3 "^5.0.1" + p-timeout "^5.0.2" + +p-queue@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-8.0.1.tgz#718b7f83836922ef213ddec263ff4223ce70bef8" + integrity sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA== + dependencies: + eventemitter3 "^5.0.1" + p-timeout "^6.1.2" + +p-reflect@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-reflect/-/p-reflect-3.1.0.tgz#bba22747439b5fc50a7f626e8e909dc9b888218d" + integrity sha512-3sG3UlpisPSaX+o7u2q01hIQmrpkvdl5GSO1ZwL7pfc5kHB2bPF0eFNCfYTrW1/LTUdgmPwBAvmT0Zr8eSmaAQ== + +p-settle@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/p-settle/-/p-settle-5.1.1.tgz#9300778f896d5c01e4361b8ab45d003548574c3e" + integrity sha512-VLgSBpA71aMncPVP5Es4nhQYxcxN0lit8hGlobJke8YTAhtwdRDu/s4KePP5gCT5LFfZty3qosBFYMgD5rFpCg== + dependencies: + p-limit "^4.0.0" + p-reflect "^3.1.0" + +p-timeout@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-5.1.0.tgz#b3c691cf4415138ce2d9cfe071dba11f0fee085b" + integrity sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew== + +p-timeout@^6.0.0, p-timeout@^6.1.1, p-timeout@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.2.tgz#22b8d8a78abf5e103030211c5fc6dee1166a6aa5" + integrity sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parent-require@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parent-require/-/parent-require-1.0.0.tgz#746a167638083a860b0eef6732cb27ed46c32977" + integrity sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ== + +parse-duration@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.1.0.tgz#5192084c5d8f2a3fd676d04a451dbd2e05a1819c" + integrity sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ== + +parse5-htmlparser2-tree-adapter@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@^1.3.3, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: + version "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-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +pg-boss@^6.1.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/pg-boss/-/pg-boss-6.2.2.tgz#b33b6c99e53bcec201cc36bbaac69ebb6c09adf1" + integrity sha512-WA4cHCmN4RTOS7uCrGQ8n+Cc88tsgZXrp4U/iGUehgl2XcawSo2L5rm5bFvqX8YFcmrdsl8sh7ZDeKPWAAvOIQ== + dependencies: + cron-parser "^4.0.0" + delay "^5.0.0" + lodash.debounce "^4.0.8" + p-map "^4.0.0" + pg "^8.5.1" + uuid "^8.3.2" + +pg-cloudflare@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" + integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== + +pg-connection-string@^2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.4.tgz#f543862adfa49fa4e14bc8a8892d2a84d754246d" + integrity sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA== + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-pool@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.2.tgz#3a592370b8ae3f02a7c8130d245bc02fa2c5f3f2" + integrity sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg== + +pg-protocol@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.1.tgz#21333e6d83b01faaebfe7a33a7ad6bfd9ed38cb3" + integrity sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg== + +pg-types@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg@^8.5.1: + version "8.11.5" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.5.tgz#e722b0a5f1ed92931c31758ebec3ddf878dd4128" + integrity sha512-jqgNHSKL5cbDjFlHyYsCXmQDrfIX/3RsNwYqpd4N0Kt8niLuNoRNH+aazv6cOd43gPh9Y4DjQCtb+X0MH0Hvnw== + dependencies: + pg-connection-string "^2.6.4" + pg-pool "^3.6.2" + pg-protocol "^1.6.1" + pg-types "^2.1.0" + pgpass "1.x" + optionalDependencies: + pg-cloudflare "^1.1.1" + +pgpass@1.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== + dependencies: + split2 "^4.1.0" + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +platform@^1.3.3: + version "1.3.6" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" + integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +private-ip@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/private-ip/-/private-ip-3.0.2.tgz#1daf6052ee5cee53238616a377d6be180e9490ef" + integrity sha512-2pkOVPGYD/4QyAg95c6E/4bLYXPthT5Xw4ocXYzIIsMBhskOMn6IwkWXmg6ZiA6K58+O6VD/n02r1hDhk7vDPw== + dependencies: + "@chainsafe/is-ip" "^2.0.1" + ip-regex "^5.0.0" + ipaddr.js "^2.1.0" + netmask "^2.0.2" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress-events@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/progress-events/-/progress-events-1.0.0.tgz#34f5e8fdb5dae3561837b22672d1e02277bb2109" + integrity sha512-zIB6QDrSbPfRg+33FZalluFIowkbV5Xh1xSuetjG+rlC5he6u2dc6VQJ0TbMdlN3R1RHdpOqxEFMKTnQ+itUwA== + +prom-client@^14.0.1: + version "14.2.0" + resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-14.2.0.tgz#ca94504e64156f6506574c25fb1c34df7812cf11" + integrity sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA== + dependencies: + tdigest "^0.1.1" + +promjs@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/promjs/-/promjs-0.4.2.tgz#9c2b4a60e00c1a0ecb69a3c1c322d1cfb47a300d" + integrity sha512-qvHcTU9xwEieFOf2Qnf5JYPKkdJU2lRbJfJvJspw6XpnoH7VPmNfnJJnOLPfN8ODJMBLRt8wEPVjxyyn0Or6RQ== + +prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +protobufjs@^6.10.2, protobufjs@^6.11.2: + version "6.11.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" + integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + +protobufjs@^7.0.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.3.0.tgz#a32ec0422c039798c41a0700306a6e305b9cb32c" + integrity sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + +protons-runtime@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/protons-runtime/-/protons-runtime-4.0.2.tgz#a5670e703a5389dccb3700b583532e3316efcb94" + integrity sha512-R4N6qKHgz8T2Gl45CTcZfITzXPQY9ym8lbLb4VyFMS4ag1KusCRZwkQXTBRhxQ+93ck3K3aDhK1wIk98AMtNyw== + dependencies: + protobufjs "^7.0.0" + uint8arraylist "^2.4.3" + +protons-runtime@^5.0.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/protons-runtime/-/protons-runtime-5.4.0.tgz#2751ce22cae6c35eebba89acfd9d783419ae3726" + integrity sha512-XfA++W/WlQOSyjUyuF5lgYBfXZUEMP01Oh1C2dSwZAlF2e/ZrMRPfWonXj6BGM+o8Xciv7w0tsRMKYwYEuQvaw== + dependencies: + uint8-varint "^2.0.2" + uint8arraylist "^2.4.3" + uint8arrays "^5.0.1" + +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== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@6.11.0: + 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" + +queue-microtask@^1.2.2, queue-microtask@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +race-signal@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/race-signal/-/race-signal-1.0.2.tgz#e42379fba0cec4ee8dab7c9bbbd4aa6e0d14c25f" + integrity sha512-o3xNv0iTcIDQCXFlF6fPAMEBRjFxssgGoRqLbg06m+AdzEXXLUmoNOoUHTVz2NoBI8hHwKFKoC6IqyNtWr2bww== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +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== + +rate-limiter-flexible@^2.3.11, rate-limiter-flexible@^2.3.9: + version "2.4.2" + resolved "https://registry.yarnpkg.com/rate-limiter-flexible/-/rate-limiter-flexible-2.4.2.tgz#2a219cc473f015142fd8fb599371223d730decbd" + integrity sha512-rMATGGOdO1suFyf/mI5LYhts71g1sbdhmd6YvdiXO2gJnd42Tt6QS4JUKJKSWVVkMtBacm6l40FR7Trjo6Iruw== + +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" + +react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-native-fetch-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz#81e1bb6562c292521bc4eca52fe1097f4c1ebab5" + integrity sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA== + dependencies: + p-defer "^3.0.0" + +readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~1.0.31: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +receptacle@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2" + integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A== + dependencies: + ms "^2.1.1" + +reflect-metadata@^0.1.13: + version "0.1.14" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" + integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== + +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +regexpp@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +rehackt@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/rehackt/-/rehackt-0.1.0.tgz#a7c5e289c87345f70da8728a7eb878e5d03c696b" + integrity sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.10.1, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +response-iterator@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/response-iterator/-/response-iterator-0.2.6.tgz#249005fb14d2e4eeb478a3f735a28fd8b4c9f3da" + integrity sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw== + +retimer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/retimer/-/retimer-3.0.0.tgz#98b751b1feaf1af13eb0228f8ea68b8f9da530df" + integrity sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA== + +retry@0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@~2.4.0: + version "2.4.5" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" + integrity sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ== + dependencies: + glob "^6.0.1" + +run-parallel-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== + dependencies: + queue-microtask "^1.2.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-json-stringify@~1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd" + integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg== + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + +sax@>=0.6.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + +scrypt-js@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +semver@^6.1.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.7: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + +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-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + 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" + +set-delayed-interval@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-delayed-interval/-/set-delayed-interval-1.0.0.tgz#1f7c065780a365f10250f8a80e2be10175ea0388" + integrity sha512-29fhAwuZlLcuBnW/EwxvLcg2D3ELX+VBDNhnavs3YYkab72qmrcSeQNVdzl8EcPPahGQXhBM6MKdPLCQGMDakw== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.11: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +split2@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +sprintf-js@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stream-to-it@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.4.tgz#d2fd7bfbd4a899b4c0d6a7e6a533723af5749bd0" + integrity sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ== + dependencies: + get-iterator "^1.0.2" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-json-comments@3.1.1, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "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== + +symbol-observable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + +tdigest@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/tdigest/-/tdigest-0.1.2.tgz#96c64bac4ff10746b910b0e23b515794e12faced" + integrity sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA== + dependencies: + bintrees "1.0.2" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +through2@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +timeout-abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-3.0.0.tgz#dd57ffca041652c03769904f8d95afd93fb95595" + integrity sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA== + dependencies: + retimer "^3.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +toml@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ== + dependencies: + utf8-byte-length "^1.0.1" + +ts-essentials@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== + +ts-invariant@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.10.3.tgz#3e048ff96e91459ffca01304dbc7f61c1f642f6c" + integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== + dependencies: + tslib "^2.1.0" + +ts-node@^10.2.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@^4.0.0, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typeorm-naming-strategies@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/typeorm-naming-strategies/-/typeorm-naming-strategies-2.0.0.tgz#c7c10bc768ddce2592ef9ad4d2dca55fd5fa6ad6" + integrity sha512-nsJ5jDjhBBEG6olFmxojkO4yrW7hEv38sH7ZXWWx9wnDoo9uaoH/mo2mBYAh/VKgwoFHBLu+CYxGmzXz2GUMcA== + +typeorm@0.2.37: + version "0.2.37" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.37.tgz#1a5e59216077640694d27c04c99ed3f968d15dc8" + integrity sha512-7rkW0yCgFC24I5T0f3S/twmLSuccPh1SQmxET/oDWn2sSDVzbyWdnItSdKy27CdJGTlKHYtUVeOcMYw5LRsXVw== + dependencies: + "@sqltools/formatter" "^1.2.2" + app-root-path "^3.0.0" + buffer "^6.0.3" + chalk "^4.1.0" + cli-highlight "^2.1.11" + debug "^4.3.1" + dotenv "^8.2.0" + glob "^7.1.6" + js-yaml "^4.0.0" + mkdirp "^1.0.4" + reflect-metadata "^0.1.13" + sha.js "^2.4.11" + tslib "^2.1.0" + xml2js "^0.4.23" + yargonaut "^1.1.4" + yargs "^17.0.1" + zen-observable-ts "^1.0.0" + +typescript@^5.0.2: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + +uint8-varint@^1.0.1, uint8-varint@^1.0.2, uint8-varint@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/uint8-varint/-/uint8-varint-1.0.8.tgz#3f6c268e4c1a1ece232f660ec37729faca7cc7d0" + integrity sha512-QS03THS87Wlc0fBCC3xP5sqScDwfvVZLUrTCeMAQbQxQUWJosPC7C8uTNhpVUEgpTbV1Ut2Fer9Se3kI1KbnlQ== + dependencies: + byte-access "^1.0.0" + longbits "^1.1.0" + uint8arraylist "^2.0.0" + uint8arrays "^4.0.2" + +uint8-varint@^2.0.1, uint8-varint@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/uint8-varint/-/uint8-varint-2.0.4.tgz#85be52b3849eb30f2c3640a2df8a14364180affb" + integrity sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw== + dependencies: + uint8arraylist "^2.0.0" + uint8arrays "^5.0.0" + +uint8arraylist@^2.0.0, uint8arraylist@^2.1.0, uint8arraylist@^2.1.1, uint8arraylist@^2.1.2, uint8arraylist@^2.3.1, uint8arraylist@^2.3.2, uint8arraylist@^2.4.1, uint8arraylist@^2.4.3, uint8arraylist@^2.4.8: + version "2.4.8" + resolved "https://registry.yarnpkg.com/uint8arraylist/-/uint8arraylist-2.4.8.tgz#5a4d17f4defd77799cb38e93fd5db0f0dceddc12" + integrity sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ== + dependencies: + uint8arrays "^5.0.1" + +uint8arrays@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" + integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== + dependencies: + multiformats "^9.4.2" + +uint8arrays@^4.0.2, uint8arrays@^4.0.3, uint8arrays@^4.0.6: + version "4.0.10" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-4.0.10.tgz#3ec5cde3348903c140e87532fc53f46b8f2e921f" + integrity sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA== + dependencies: + multiformats "^12.0.1" + +uint8arrays@^5.0.0, uint8arrays@^5.0.1, uint8arrays@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-5.1.0.tgz#14047c9bdf825d025b7391299436e5e50e7270f1" + integrity sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww== + dependencies: + multiformats "^13.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" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici@^5.12.0: + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + dependencies: + "@fastify/busboy" "^2.0.0" + +unique-names-generator@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/unique-names-generator/-/unique-names-generator-4.7.1.tgz#966407b12ba97f618928f77322cfac8c80df5597" + integrity sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unset-value@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-0.1.2.tgz#506810b867f27c2a5a6e9b04833631f6de58d310" + integrity sha512-yhv5I4TsldLdE3UcVQn0hD2T5sNCPv4+qm/CTUpRKIpwthYRIipsAPdsrNpOI79hPQa0rTTeW22Fq6JWRcTgNg== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +utf8-byte-length@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz#f9f63910d15536ee2b2d5dd4665389715eac5c1e" + integrity sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA== + +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" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +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" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +value-or-promise@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.11.tgz#3e90299af31dd014fe843fe309cefa7c1d94b140" + integrity sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg== + +value-or-promise@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.12.tgz#0e5abfeec70148c78460a849f6b003ea7986f15c" + integrity sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q== + +varint@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" + integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +wherearewe@^2.0.0, wherearewe@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wherearewe/-/wherearewe-2.0.1.tgz#37c97a7bf112dca8db34bfefb2f6c997af312bb8" + integrity sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw== + dependencies: + is-electron "^2.2.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wordwrap@>=0.0.2: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +workerpool@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" + integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@^8.11.0, ws@^8.12.1, ws@^8.4.0: + version "8.17.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== + +xml2js@^0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xml2js@^0.6.0, xml2js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499" + integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xsalsa20@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/xsalsa20/-/xsalsa20-1.2.0.tgz#e5a05cb26f8cef723f94a559102ed50c1b44c25c" + integrity sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w== + +xss@^1.0.8: + version "1.0.15" + resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.15.tgz#96a0e13886f0661063028b410ed1b18670f4e59a" + integrity sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg== + dependencies: + commander "^2.20.3" + cssfilter "0.0.10" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargonaut@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.4.tgz#c64f56432c7465271221f53f5cc517890c3d6e0c" + integrity sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA== + dependencies: + chalk "^1.1.1" + figlet "^1.1.1" + parent-require "^1.0.0" + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0, yargs@^16.0.0, yargs@^16.1.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.0.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + +zen-observable-ts@^1.0.0, zen-observable-ts@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz#2d1aa9d79b87058e9b75698b92791c1838551f83" + integrity sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA== + dependencies: + "@types/zen-observable" "0.8.3" + zen-observable "0.8.15" + +zen-observable-ts@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz#6c6d9ea3d3a842812c6e9519209365a122ba8b58" + integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== + dependencies: + zen-observable "0.8.15" + +zen-observable@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==