├── .eslintignore ├── .eslintrc ├── .github ├── CODEOWNERS └── workflows │ └── ci.yml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .yarn └── releases │ └── yarn-3.2.0.cjs ├── .yarnrc.yml ├── LICENSE ├── README.md ├── ci.sh ├── config ├── chains.ts ├── multisig_ism.ts ├── start_blocks.ts └── warp_tokens.ts ├── package.json ├── scripts ├── deploy-hyperlane.ts ├── deploy-warp-routes.ts ├── run.ts ├── seed-phrase-to-pk.ts ├── test-messages.ts └── test-warp-transfer.ts ├── src ├── config.ts ├── core │ ├── HyperlanePermissionlessDeployer.ts │ └── TestRecipientDeployer.ts ├── json.ts ├── logger.ts └── warp │ ├── WarpRouteDeployer.ts │ ├── config.ts │ └── types.ts ├── tsconfig.json └── yarn.lock /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | coverage -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true, 4 | "browser": true, 5 | "es2021": true 6 | }, 7 | "root": true, 8 | "parser": "@typescript-eslint/parser", 9 | "parserOptions": { 10 | "ecmaVersion": 12, 11 | "sourceType": "module", 12 | "project": "./tsconfig.json" 13 | }, 14 | "plugins": ["@typescript-eslint"], 15 | "extends": [ 16 | "eslint:recommended", 17 | "plugin:@typescript-eslint/recommended", 18 | "prettier" 19 | ], 20 | "rules": { 21 | "no-console": ["error"], 22 | "no-eval": ["error"], 23 | "no-extra-boolean-cast": ["error"], 24 | "no-ex-assign": ["error"], 25 | "no-constant-condition": ["off"], 26 | "@typescript-eslint/ban-ts-comment": ["off"], 27 | "@typescript-eslint/explicit-module-boundary-types": ["off"], 28 | "@typescript-eslint/no-explicit-any": ["off"], 29 | "@typescript-eslint/no-floating-promises": ["error"], 30 | "@typescript-eslint/no-non-null-assertion": ["off"], 31 | "@typescript-eslint/no-require-imports": ["warn"] 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @asaj @yorhodes 2 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | branches: [main] 8 | 9 | # Allows you to run this workflow manually from the Actions tab 10 | workflow_dispatch: 11 | 12 | jobs: 13 | yarn-install: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v3 17 | 18 | - name: yarn-cache 19 | uses: actions/cache@v3 20 | with: 21 | path: | 22 | **/node_modules 23 | .yarn/cache 24 | key: ${{ runner.os }}-yarn-cache-${{ hashFiles('./yarn.lock') }} 25 | 26 | - name: yarn-install 27 | # Check out the lockfile from main, reinstall, and then 28 | # verify the lockfile matches what was committed. 29 | run: | 30 | yarn install 31 | CHANGES=$(git status -s --ignore-submodules) 32 | if [[ ! -z $CHANGES ]]; then 33 | echo "Changes found: $CHANGES" 34 | git diff 35 | exit 1 36 | fi 37 | 38 | build: 39 | needs: [yarn-install] 40 | runs-on: ubuntu-latest 41 | steps: 42 | - uses: actions/checkout@v3 43 | 44 | - name: yarn-cache 45 | uses: actions/cache@v3 46 | with: 47 | path: | 48 | **/node_modules 49 | .yarn/cache 50 | key: ${{ runner.os }}-yarn-cache-${{ hashFiles('./yarn.lock') }} 51 | 52 | - name: build 53 | run: yarn run build 54 | 55 | deploy: 56 | needs: [build] 57 | runs-on: ubuntu-latest 58 | steps: 59 | - uses: actions/checkout@v3 60 | 61 | - name: yarn-cache 62 | uses: actions/cache@v3 63 | with: 64 | path: | 65 | **/node_modules 66 | .yarn/cache 67 | key: ${{ runner.os }}-yarn-cache-${{ hashFiles('./yarn.lock') }} 68 | 69 | - name: Install Foundry 70 | uses: onbjerg/foundry-toolchain@v1 71 | with: 72 | version: nightly 73 | 74 | - name: deploy 75 | run: ./ci.sh 76 | 77 | lint: 78 | needs: [yarn-install] 79 | runs-on: ubuntu-latest 80 | steps: 81 | - uses: actions/checkout@v3 82 | 83 | - name: yarn-cache 84 | uses: actions/cache@v3 85 | with: 86 | path: | 87 | **/node_modules 88 | .yarn/cache 89 | key: ${{ runner.os }}-yarn-cache-${{ hashFiles('./yarn.lock') }} 90 | 91 | - name: eslint 92 | run: yarn lint 93 | 94 | - name: prettier 95 | run: | 96 | yarn prettier 97 | CHANGES=$(git status -s) 98 | if [[ ! -z $CHANGES ]]; then 99 | echo "Changes found: $CHANGES" 100 | exit 1 101 | fi 102 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | artifacts/ 4 | 5 | # Yarn files 6 | .yarn/install-state.gz 7 | .yarn/cache 8 | yarn-error.log 9 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | lib/forge-std 2 | dist -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "singleQuote": true, 4 | "trailingComma": "all", 5 | "overrides": [ 6 | { 7 | "files": "*.sol", 8 | "options": { 9 | "printWidth": 80, 10 | "tabWidth": 4, 11 | "useTabs": false, 12 | "singleQuote": false, 13 | "bracketSpacing": false, 14 | "explicitTypes": "always" 15 | } 16 | } 17 | ], 18 | "importOrder": ["^@hyperlane-xyz/(.*)$", "^../(.*)$", "^./(.*)$"], 19 | "importOrderSeparation": true, 20 | "importOrderSortSpecifiers": true 21 | } 22 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: node-modules 2 | 3 | yarnPath: .yarn/releases/yarn-3.2.0.cjs -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DEPRECATED 2 | 3 | **The tooling in this repository is deprecated and won't work with Hyperlane V3 or later** 4 | 5 | **The [Hyperlane CLI](https://www.npmjs.com/package/@hyperlane-xyz/cli) is the recommend tool for new deployments** 6 | 7 | # Hyperlane Deploy 8 | 9 | This repository contains scripts and tools to deploy Hyperlane and its popular extensions to any EVM-compatible chain. 10 | 11 | ## Hyperlane overview 12 | 13 | Hyperlane is an interchain messaging protocol that allows applications to communicate between blockchains. 14 | 15 | Developers can use Hyperlane to share state between blockchains, allowing them to build interchain applications that live natively across multiple chains. 16 | 17 | To read more about interchain applications, how the protocol works, and how to integrate with Hyperlane, please see the [documentation](https://docs.hyperlane.xyz). 18 | 19 | ## Setup 20 | 21 | ```bash 22 | yarn install 23 | ``` 24 | 25 | ## Deploying Hyperlane 26 | 27 | See below for instructions on using the scripts in this repo to deploy a Hyperlane core instance. For more details see the [deploy documentation](https://docs.hyperlane.xyz/docs/deploy/deploy-hyperlane). 28 | 29 | ### Deploying core contracts 30 | 31 | If you're deploying to a new chain, ensure there is a corresponding entry `config/chains.ts`, `config/multisig_ism.ts`, and `config/start_blocks.ts`. 32 | 33 | This script is used to deploy the following core Hyperlane contracts to a new chain. The Hyperlane protocol expects exactly one instance of these contracts on every supported chain. 34 | 35 | - `Mailbox`: for sending and receiving messages 36 | - `ValidatorAnnounce`: for registering validators 37 | 38 | This script also deploys the following contracts to all chains, new and existing. The Hyperlane protocol supports many instances of these contracts on every supported chains. 39 | 40 | - `ISM (e.g. MultisigISM)`: for verifying inbound messages from remote chains 41 | - `InterchainGasPaymaster`: for paying relayers for message delivery 42 | - `TestRecipient`: used to test that interchain messages can be delivered 43 | 44 | ```bash 45 | yarn ts-node scripts/deploy-hyperlane.ts --local anvil \ 46 | --remotes goerli sepolia \ 47 | --key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 48 | ``` 49 | 50 | ### Sending test messages 51 | 52 | This script is used to verify that Hyperlane messages can be sent between specified chains. 53 | 54 | Users should have first deployed `TestRecipient` contracts to each of the specified chains. 55 | 56 | ```sh 57 | yarn ts-node scripts/test-messages.ts \ 58 | --chains anvil goerli sepolia \ 59 | --key 0x6f0311f4a0722954c46050bb9f088c4890999e16b64ad02784d24b5fd6d09061 60 | ``` 61 | 62 | ## Deploying Warp Routes 63 | 64 | Warp Routes are Hyperlane's unique take on the concept of token bridging, allowing you to permissionlessly bridge any ERC20 or ERC721 asset to any chain. You can combine Warp Routes with a Hyperlane deployment to create economic trade routes between any chains already connected through Hyperlane. 65 | 66 | See below for instructions on using the scripts in this repo to deploy Hyperlane Warp Routes. For more details see the [warp route documentation](https://docs.hyperlane.xyz/docs/deploy/deploy-warp-route). 67 | 68 | ### Deploying Warp contracts 69 | 70 | Establishing a warp route requires deployment of `HypERC20` contracts to the desired chains. Ensure there is an entry for all chains in `config/chains.ts`. 71 | 72 | The deployment also require details about the existing (collateral) token and the new synthetics that will be created. Ensure there are entries for them in `config/warp_tokens.ts`. 73 | 74 | ```sh 75 | yarn ts-node scripts/deploy-warp-routes.ts \ 76 | --key 0x6f0311f4a0722954c46050bb9f088c4890999e16b64ad02784d24b5fd6d09061 77 | ``` 78 | 79 | ### Sending a test transfer 80 | 81 | ```sh 82 | yarn ts-node scripts/test-warp-transfer.ts \ 83 | --origin goerli --destination alfajores --wei 100000000000000 \ 84 | --key 0x6f0311f4a0722954c46050bb9f088c4890999e16b64ad02784d24b5fd6d09061 85 | ``` 86 | 87 | ### Deploying a Warp UI 88 | 89 | If you'd like to create a web-based user interface for your warp routes, see the [Warp UI documentation](https://docs.hyperlane.xyz/docs/deploy/deploy-warp-route/deploy-the-ui-for-your-warp-route) 90 | -------------------------------------------------------------------------------- /ci.sh: -------------------------------------------------------------------------------- 1 | for CHAIN in anvil1 anvil2 2 | do 3 | mkdir /tmp/$CHAIN \ 4 | /tmp/$CHAIN/state \ 5 | /tmp/$CHAIN/validator \ 6 | /tmp/$CHAIN/relayer && \ 7 | chmod 777 /tmp/$CHAIN -R 8 | done 9 | 10 | anvil --chain-id 31337 -p 8545 --state /tmp/anvil1/state > /dev/null & 11 | ANVIL_1_PID=$! 12 | 13 | anvil --chain-id 31338 -p 8555 --state /tmp/anvil2/state > /dev/null & 14 | ANVIL_2_PID=$! 15 | 16 | sleep 1 17 | 18 | set -e 19 | 20 | for i in "anvil1 anvil2 --no-write-agent-config" "anvil2 anvil1 --write-agent-config" 21 | do 22 | set -- $i 23 | echo "Deploying contracts to $1" 24 | yarn ts-node scripts/deploy-hyperlane.ts --local $1 --remotes $2 \ 25 | --key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 $3 26 | done 27 | 28 | echo "Deploying warp routes" 29 | yarn ts-node scripts/deploy-warp-routes.ts \ 30 | --key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 31 | 32 | kill $ANVIL_1_PID 33 | kill $ANVIL_2_PID 34 | 35 | anvil --chain-id 31337 -p 8545 --block-time 1 --state /tmp/anvil1/state > /dev/null & 36 | ANVIL_1_PID=$! 37 | 38 | anvil --chain-id 31338 -p 8555 --block-time 1 --state /tmp/anvil2/state > /dev/null & 39 | ANVIL_2_PID=$! 40 | 41 | for i in "anvil1 8545 ANVIL1" "anvil2 8555 ANVIL2" 42 | do 43 | set -- $i 44 | echo "Running validator on $1" 45 | # Won't work on anything but linux due to -net=host 46 | docker run --mount type=bind,source="$(pwd)/artifacts",target=/config \ 47 | --mount type=bind,source="/tmp",target=/data --net=host \ 48 | -e CONFIG_FILES=/config/agent_config.json -e HYP_VALIDATOR_ORIGINCHAINNAME=$1 \ 49 | -e HYP_VALIDATOR_REORGPERIOD=0 -e HYP_VALIDATOR_INTERVAL=1 \ 50 | -e HYP_BASE_CHAINS_${3}_CONNECTION_URL=http://127.0.0.1:${2} \ 51 | -e HYP_VALIDATOR_VALIDATOR_TYPE=hexKey \ 52 | -e HYP_VALIDATOR_VALIDATOR_KEY=0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6 \ 53 | -e HYP_VALIDATOR_CHECKPOINTSYNCER_TYPE=localStorage \ 54 | -e HYP_VALIDATOR_CHECKPOINTSYNCER_PATH=/data/${1}/validator \ 55 | -e HYP_BASE_TRACING_LEVEL=info -e HYP_BASE_TRACING_FMT=pretty \ 56 | gcr.io/abacus-labs-dev/hyperlane-agent:40cc4a6-20230420-080111 ./validator & 57 | done 58 | 59 | sleep 10 60 | 61 | for i in "anvil1 8545" "anvil2 8555" 62 | do 63 | set -- $i 64 | echo "Announcing validator on $1" 65 | VALIDATOR_ANNOUNCE_ADDRESS=$(cat ./artifacts/addresses.json | jq -r ".$1.validatorAnnounce") 66 | VALIDATOR=$(cat /tmp/$1/validator/announcement.json | jq -r '.value.validator') 67 | STORAGE_LOCATION=$(cat /tmp/$1/validator/announcement.json | jq -r '.value.storage_location') 68 | SIGNATURE=$(cat /tmp/$1/validator/announcement.json | jq -r '.serialized_signature') 69 | cast send $VALIDATOR_ANNOUNCE_ADDRESS \ 70 | "announce(address, string calldata, bytes calldata)(bool)" \ 71 | $VALIDATOR $STORAGE_LOCATION $SIGNATURE --rpc-url http://127.0.0.1:$2 \ 72 | --private-key 0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba 73 | done 74 | 75 | 76 | for i in "anvil1 anvil2 ANVIL2" "anvil2 anvil1 ANVIL1" 77 | do 78 | set -- $i 79 | echo "Running relayer on $1" 80 | docker run --mount type=bind,source="$(pwd)/artifacts",target=/config \ 81 | --mount type=bind,source="/tmp",target=/data --net=host \ 82 | -e CONFIG_FILES=/config/agent_config.json \ 83 | -e HYP_BASE_CHAINS_ANVIL1_CONNECTION_URL=http://127.0.0.1:8545 \ 84 | -e HYP_BASE_CHAINS_ANVIL2_CONNECTION_URL=http://127.0.0.1:8555 \ 85 | -e HYP_BASE_TRACING_LEVEL=info -e HYP_BASE_TRACING_FMT=pretty \ 86 | -e HYP_RELAYER_ORIGINCHAINNAME=$1 -e HYP_RELAYER_DESTINATIONCHAINNAMES=$2 \ 87 | -e HYP_RELAYER_ALLOWLOCALCHECKPOINTSYNCERS=true -e HYP_RELAYER_DB=/data/$1/relayer \ 88 | -e HYP_RELAYER_GASPAYMENTENFORCEMENT='[{"type":"none"}]' \ 89 | -e HYP_BASE_CHAINS_${3}_SIGNER_TYPE=hexKey \ 90 | -e HYP_BASE_CHAINS_${3}_SIGNER_KEY=0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97 \ 91 | gcr.io/abacus-labs-dev/hyperlane-agent:40cc4a6-20230420-080111 ./relayer & 92 | done 93 | 94 | echo "Testing message sending" 95 | yarn ts-node scripts/test-messages.ts --chains anvil1 anvil2 \ 96 | --key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --timeout 60 97 | 98 | echo "Sending a test warp transfer" 99 | yarn ts-node scripts/test-warp-transfer.ts \ 100 | --origin anvil1 --destination anvil2 --wei 1 --recipient 0xac0974bec39a17e36ba4a6b4d238ff944bacb4a5 \ 101 | --key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --timeout 60 102 | 103 | docker ps -aq | xargs docker stop | xargs docker rm 104 | kill $ANVIL_1_PID 105 | kill $ANVIL_2_PID 106 | -------------------------------------------------------------------------------- /config/chains.ts: -------------------------------------------------------------------------------- 1 | import { ChainMap, ChainMetadata, ProtocolType } from '@hyperlane-xyz/sdk'; 2 | 3 | // import { chainMetadata } from '@hyperlane-xyz/sdk'; 4 | // A map of chain names to ChainMetadata 5 | export const chains: ChainMap = { 6 | // ----------- Add your chains here ----------------- 7 | anvil1: { 8 | name: 'anvil1', 9 | protocol: ProtocolType.Ethereum, 10 | // anvil default chain id 11 | chainId: 31337, 12 | // Used to configure a Warp Route to bridge anvil1 ETH 13 | // to anvil2 in CI tests. 14 | nativeToken: { 15 | name: 'ether', 16 | symbol: 'ETH', 17 | decimals: 18, 18 | }, 19 | rpcUrls: [ 20 | { 21 | http: 'http://127.0.0.1:8545', 22 | }, 23 | ], 24 | // You can set overrides for transaction fields here 25 | // transactionOverrides: { 26 | // gasLimit: 1000000 27 | // }, 28 | }, 29 | anvil2: { 30 | name: 'anvil2', 31 | protocol: ProtocolType.Ethereum, 32 | chainId: 31338, 33 | rpcUrls: [ 34 | { 35 | http: 'http://127.0.0.1:8555', 36 | }, 37 | ], 38 | }, 39 | // -------------------------------------------------- 40 | // You can also override the default chain metadata (completely) 41 | // ethereum: { 42 | // ...chainMetadata.ethereum, 43 | // publicRpcUrls: [ 44 | // { 45 | // http: 'my.custom.rpc.url', 46 | // } 47 | // ], 48 | // } 49 | }; 50 | -------------------------------------------------------------------------------- /config/multisig_ism.ts: -------------------------------------------------------------------------------- 1 | import { ChainMap, ModuleType, MultisigIsmConfig } from '@hyperlane-xyz/sdk'; 2 | 3 | export const multisigIsmConfig: ChainMap = { 4 | // ----------- Your chains here ----------------- 5 | anvil1: { 6 | type: ModuleType.LEGACY_MULTISIG, 7 | threshold: 1, 8 | validators: [ 9 | // Last anvil address 10 | '0xa0ee7a142d267c1f36714e4a8f75612f20a79720', 11 | ], 12 | }, 13 | anvil2: { 14 | type: ModuleType.LEGACY_MULTISIG, 15 | threshold: 1, 16 | validators: [ 17 | // Last anvil address 18 | '0xa0ee7a142d267c1f36714e4a8f75612f20a79720', 19 | ], 20 | }, 21 | }; 22 | -------------------------------------------------------------------------------- /config/start_blocks.ts: -------------------------------------------------------------------------------- 1 | import { ChainMap } from '@hyperlane-xyz/sdk'; 2 | 3 | // TODO move to SDK 4 | export const startBlocks: ChainMap = { 5 | // --------------- Mainnets --------------------- 6 | celo: 16884144, 7 | ethereum: 16271503, 8 | avalanche: 24145479, 9 | polygon: 37313389, 10 | bsc: 25063295, 11 | arbitrum: 49073182, 12 | optimism: 55698988, 13 | moonbeam: 2595747, 14 | gnosis: 25900000, 15 | // --------------- Testnets --------------------- 16 | alfajores: 14863532, 17 | fuji: 16330615, 18 | mumbai: 29390033, 19 | bsctestnet: 25001629, 20 | goerli: 8039005, 21 | sepolia: 3082913, 22 | moonbasealpha: 3310405, 23 | optimismgoerli: 3055263, 24 | arbitrumgoerli: 1941997, 25 | }; 26 | -------------------------------------------------------------------------------- /config/warp_tokens.ts: -------------------------------------------------------------------------------- 1 | import { TokenType } from '@hyperlane-xyz/hyperlane-token'; 2 | 3 | import type { WarpRouteConfig } from '../src/warp/config'; 4 | 5 | // A config for deploying Warp Routes to a set of chains 6 | // Not required for Hyperlane core deployments 7 | export const warpRouteConfig: WarpRouteConfig = { 8 | base: { 9 | // Chain name must be in the Hyperlane SDK or in the chains.ts config 10 | chainName: 'anvil1', 11 | type: TokenType.native, // TokenType.native or TokenType.collateral 12 | // If type is collateral, a token address is required: 13 | // address: '0x123...' 14 | // If the token is an NFT (ERC721), set to true: 15 | // isNft: boolean 16 | 17 | // Optionally, specify owner, mailbox, and interchainGasPaymaster addresses 18 | // If not specified, the Permissionless Deployment artifacts or the SDK's defaults will be used 19 | }, 20 | synthetics: [ 21 | { 22 | chainName: 'anvil2', 23 | 24 | // Optionally specify a name, symbol, and totalSupply 25 | // If not specified, the base token's properties will be used 26 | 27 | // Optionally, specify owner, mailbox, and interchainGasPaymaster addresses 28 | // If not specified, the Permissionless Deployment artifacts or the SDK's defaults will be used 29 | }, 30 | ], 31 | }; 32 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@hyperlane-xyz/deploy", 3 | "version": "1.0.0", 4 | "description": "Utilities for deploying Hyperlane", 5 | "dependencies": { 6 | "@hyperlane-xyz/hyperlane-token": "1.4.2", 7 | "@hyperlane-xyz/sdk": "1.4.2", 8 | "ethers": "^5.7.2", 9 | "yargs": "^17.7.1", 10 | "zod": "^3.21.4" 11 | }, 12 | "devDependencies": { 13 | "@trivago/prettier-plugin-sort-imports": "^4.1.1", 14 | "@types/node": "^18.14.5", 15 | "@types/yargs": "^17.0.22", 16 | "@typescript-eslint/eslint-plugin": "^5.57.1", 17 | "@typescript-eslint/parser": "^5.57.1", 18 | "eslint": "^8.37.0", 19 | "eslint-config-prettier": "^8.8.0", 20 | "prettier": "^2.8.2", 21 | "ts-node": "^10.9.1", 22 | "typescript": "^4.9.5" 23 | }, 24 | "scripts": { 25 | "build": "tsc", 26 | "clean": "rm -rf ./dist", 27 | "lint": "eslint . --ext .ts", 28 | "prettier": "prettier --write ./config ./scripts ./src" 29 | }, 30 | "repository": "https://github.com/hyperlane-xyz/hyperlane-deploy", 31 | "author": "asa@hyperlane.xyz", 32 | "license": "Apache 2.0", 33 | "homepage": "https://www.hyperlane.xyz", 34 | "keywords": [ 35 | "Hyperlane", 36 | "Permissionless", 37 | "Deployment", 38 | "Typescript" 39 | ], 40 | "packageManager": "yarn@3.2.0" 41 | } 42 | -------------------------------------------------------------------------------- /scripts/deploy-hyperlane.ts: -------------------------------------------------------------------------------- 1 | import { HyperlanePermissionlessDeployer } from '../src/core/HyperlanePermissionlessDeployer'; 2 | import { logger } from '../src/logger'; 3 | 4 | import { run } from './run'; 5 | 6 | run('Hyperlane deployment', async () => { 7 | logger('Preparing Hyperlane deployer'); 8 | const deployer = await HyperlanePermissionlessDeployer.fromArgs(); 9 | logger('Beginning Hyperlane deployment'); 10 | await deployer.deploy(); 11 | }); 12 | -------------------------------------------------------------------------------- /scripts/deploy-warp-routes.ts: -------------------------------------------------------------------------------- 1 | import { logger } from '../src/logger'; 2 | import { WarpRouteDeployer } from '../src/warp/WarpRouteDeployer'; 3 | 4 | import { run } from './run'; 5 | 6 | run('Warp route deployment', async () => { 7 | logger('Preparing Warp Route deployer'); 8 | const deployer = await WarpRouteDeployer.fromArgs(); 9 | logger('Beginning warp route deployment'); 10 | await deployer.deploy(); 11 | }); 12 | -------------------------------------------------------------------------------- /scripts/run.ts: -------------------------------------------------------------------------------- 1 | import { error, logger } from '../src/logger'; 2 | 3 | export function run(name: string, fn: () => Promise) { 4 | logger(`Beginning ${name} script`); 5 | fn() 6 | .then(() => logger(`${name} completed successfully`)) 7 | .catch((e: any) => { 8 | error(`Error running ${name}`, e); 9 | process.exit(1); 10 | }); 11 | } 12 | -------------------------------------------------------------------------------- /scripts/seed-phrase-to-pk.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from 'ethers'; 2 | import yargs from 'yargs'; 3 | 4 | import { logger } from '../src/logger'; 5 | 6 | import { run } from './run'; 7 | 8 | run('Seed phrase to private key', async () => { 9 | const { seed } = await yargs(process.argv.slice(2)) 10 | .describe('seed', 'seed phrase to derive key from') 11 | .string('seed') 12 | .demandOption('seed').argv; 13 | 14 | const wallet = ethers.Wallet.fromMnemonic(seed); 15 | logger('Wallet private key:\n============'); 16 | logger(wallet.privateKey); 17 | }); 18 | -------------------------------------------------------------------------------- /scripts/test-messages.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from 'ethers'; 2 | import yargs from 'yargs'; 3 | 4 | import { 5 | DispatchedMessage, 6 | HyperlaneCore, 7 | HyperlaneIgp, 8 | MultiProvider, 9 | objMerge, 10 | } from '@hyperlane-xyz/sdk'; 11 | import { utils } from '@hyperlane-xyz/utils'; 12 | import { sleep } from '@hyperlane-xyz/utils/dist/src/utils'; 13 | 14 | import { 15 | artifactsAddressesMap, 16 | assertBalances, 17 | assertBytes32, 18 | assertUnique, 19 | getMultiProvider, 20 | sdkContractAddressesMap, 21 | } from '../src/config'; 22 | import { createLogger } from '../src/logger'; 23 | 24 | import { run } from './run'; 25 | 26 | const logger = createLogger('MessageDeliveryTest'); 27 | const error = createLogger('MessageDeliveryTest', true); 28 | const mergedContractAddresses = objMerge( 29 | sdkContractAddressesMap, 30 | artifactsAddressesMap(), 31 | ); 32 | 33 | function getArgs(multiProvider: MultiProvider) { 34 | // Only accept chains for which we have both a connection and contract addresses 35 | const { intersection } = multiProvider.intersect( 36 | Object.keys(mergedContractAddresses), 37 | ); 38 | return yargs(process.argv.slice(2)) 39 | .describe('chains', 'chain to send message from') 40 | .choices('chains', intersection) 41 | .demandOption('chains') 42 | .array('chains') 43 | .middleware(assertUnique((argv) => argv.chains)) 44 | .describe('key', 'hexadecimal private key for transaction signing') 45 | .string('key') 46 | .coerce('key', assertBytes32) 47 | .demandOption('key') 48 | .describe('timeout', 'timeout in seconds') 49 | .number('timeout') 50 | .default('timeout', 10 * 60) 51 | .middleware(assertBalances(multiProvider, (argv) => argv.chains)).argv; 52 | } 53 | 54 | run('Message delivery test', async () => { 55 | let timedOut = false; 56 | const multiProvider = getMultiProvider(); 57 | const { chains, key, timeout } = await getArgs(multiProvider); 58 | const timeoutId = setTimeout(() => { 59 | timedOut = true; 60 | }, timeout * 1000); 61 | const signer = new ethers.Wallet(key); 62 | multiProvider.setSharedSigner(signer); 63 | const core = HyperlaneCore.fromAddressesMap( 64 | mergedContractAddresses, 65 | multiProvider, 66 | ); 67 | const igp = HyperlaneIgp.fromAddressesMap( 68 | mergedContractAddresses, 69 | multiProvider, 70 | ); 71 | const messages: Set = new Set(); 72 | for (const origin of chains) { 73 | const mailbox = core.getContracts(origin).mailbox; 74 | const defaultIgp = 75 | igp.getContracts(origin).defaultIsmInterchainGasPaymaster; 76 | for (const destination of chains) { 77 | const destinationDomain = multiProvider.getDomainId(destination); 78 | if (origin === destination) continue; 79 | try { 80 | const recipient = mergedContractAddresses[destination] 81 | .testRecipient as string; 82 | if (!recipient) { 83 | throw new Error(`Unable to find TestRecipient for ${destination}`); 84 | } 85 | const messageTx = await mailbox.dispatch( 86 | destinationDomain, 87 | utils.addressToBytes32(recipient), 88 | '0xdeadbeef', 89 | ); 90 | const messageReceipt = await multiProvider.handleTx(origin, messageTx); 91 | const dispatchedMessages = core.getDispatchedMessages(messageReceipt); 92 | if (dispatchedMessages.length !== 1) continue; 93 | const dispatchedMessage = dispatchedMessages[0]; 94 | logger( 95 | `Sent message from ${origin} to ${recipient} on ${destination} with message ID ${dispatchedMessage.id}`, 96 | ); 97 | // Make gas payment... 98 | const gasAmount = 100_000; 99 | const value = await defaultIgp.quoteGasPayment( 100 | destinationDomain, 101 | gasAmount, 102 | ); 103 | const paymentTx = await defaultIgp.payForGas( 104 | dispatchedMessage.id, 105 | destinationDomain, 106 | gasAmount, 107 | await multiProvider.getSignerAddress(origin), 108 | { value }, 109 | ); 110 | await paymentTx.wait(); 111 | messages.add(dispatchedMessage); 112 | } catch (e) { 113 | error( 114 | `Encountered error sending message from ${origin} to ${destination}`, 115 | ); 116 | error(e); 117 | } 118 | } 119 | } 120 | while (messages.size > 0 && !timedOut) { 121 | for (const message of messages.values()) { 122 | const origin = multiProvider.getChainName(message.parsed.origin); 123 | const destination = multiProvider.getChainName( 124 | message.parsed.destination, 125 | ); 126 | const mailbox = core.getContracts(destination).mailbox; 127 | const delivered = await mailbox.delivered(message.id); 128 | if (delivered) { 129 | messages.delete(message); 130 | logger( 131 | `Message from ${origin} to ${destination} with ID ${ 132 | message!.id 133 | } was delivered`, 134 | ); 135 | } else { 136 | logger( 137 | `Message from ${origin} to ${destination} with ID ${ 138 | message!.id 139 | } has not yet been delivered`, 140 | ); 141 | } 142 | await sleep(5000); 143 | } 144 | } 145 | clearTimeout(timeoutId); 146 | if (timedOut) { 147 | error('Timed out waiting for messages to be delivered'); 148 | process.exit(1); 149 | } 150 | }); 151 | -------------------------------------------------------------------------------- /scripts/test-warp-transfer.ts: -------------------------------------------------------------------------------- 1 | import assert from 'assert'; 2 | import { BigNumber, ContractReceipt, ethers } from 'ethers'; 3 | import yargs from 'yargs'; 4 | 5 | import { 6 | ERC20__factory, 7 | HypERC20, 8 | HypERC20App, 9 | HypERC20Collateral, 10 | HypERC20Collateral__factory, 11 | HypERC20__factory, 12 | HypNative, 13 | HypNative__factory, 14 | TokenType, 15 | } from '@hyperlane-xyz/hyperlane-token'; 16 | import { 17 | ChainMap, 18 | HyperlaneCore, 19 | MultiProvider, 20 | objMap, 21 | objMerge, 22 | } from '@hyperlane-xyz/sdk'; 23 | import { utils } from '@hyperlane-xyz/utils'; 24 | 25 | import { 26 | artifactsAddressesMap, 27 | assertBalances, 28 | assertBytes20, 29 | assertBytes32, 30 | getMultiProvider, 31 | sdkContractAddressesMap, 32 | } from '../src/config'; 33 | import { readJSONAtPath } from '../src/json'; 34 | import { createLogger } from '../src/logger'; 35 | import { WarpRouteArtifacts } from '../src/warp/WarpRouteDeployer'; 36 | 37 | import { run } from './run'; 38 | 39 | const logger = createLogger('WarpTransferTest'); 40 | const error = createLogger('WarpTransferTest', true); 41 | 42 | const mergedContractAddresses = objMerge( 43 | sdkContractAddressesMap, 44 | artifactsAddressesMap(), 45 | ); 46 | 47 | function getArgs(multiProvider: MultiProvider) { 48 | // Only accept chains for which we have both a connection and contract addresses 49 | const { intersection } = multiProvider.intersect( 50 | Object.keys(mergedContractAddresses), 51 | ); 52 | return yargs(process.argv.slice(2)) 53 | .describe('origin', 'chain to send tokens from') 54 | .choices('origin', intersection) 55 | .demandOption('origin') 56 | .string('origin') 57 | .describe('destination', 'chain to send tokens to') 58 | .choices('destination', intersection) 59 | .demandOption('destination') 60 | .string('destination') 61 | .describe('wei', 'amount in wei to send') 62 | .demandOption('wei') 63 | .number('wei') 64 | .describe('key', 'hexadecimal private key for transaction signing') 65 | .string('key') 66 | .coerce('key', assertBytes32) 67 | .demandOption('key') 68 | .describe('recipient', 'token recipient address') 69 | .string('recipient') 70 | .coerce('recipient', assertBytes20) 71 | .demandOption('recipient') 72 | .describe('timeout', 'timeout in seconds') 73 | .number('timeout') 74 | .default('timeout', 10 * 60) 75 | .middleware(assertBalances(multiProvider, (argv) => [argv.origin])).argv; 76 | } 77 | 78 | function hypErc20FromAddressesMap( 79 | artifactsMap: ChainMap, 80 | multiProvider: MultiProvider, 81 | ): HypERC20App { 82 | const contractsMap = objMap(artifactsMap, (chain, artifacts) => { 83 | const signer = multiProvider.getSigner(chain); 84 | switch (artifacts.tokenType) { 85 | case TokenType.collateral: { 86 | const router = HypERC20Collateral__factory.connect( 87 | artifacts.router, 88 | signer, 89 | ); 90 | return { router }; 91 | } 92 | case TokenType.native: { 93 | const router = HypNative__factory.connect(artifacts.router, signer); 94 | return { router }; 95 | } 96 | case TokenType.synthetic: { 97 | const router = HypERC20__factory.connect(artifacts.router, signer); 98 | return { router }; 99 | } 100 | default: { 101 | throw new Error('Unsupported token type'); 102 | } 103 | } 104 | }); 105 | return new HypERC20App(contractsMap, multiProvider); 106 | } 107 | 108 | run('Warp transfer test', async () => { 109 | let timedOut = false; 110 | const multiProvider = getMultiProvider(); 111 | const { recipient, origin, destination, wei, key, timeout } = await getArgs( 112 | multiProvider, 113 | ); 114 | const timeoutId = setTimeout(() => { 115 | timedOut = true; 116 | }, timeout * 1000); 117 | const signer = new ethers.Wallet(key); 118 | multiProvider.setSharedSigner(signer); 119 | const artifacts: ChainMap = readJSONAtPath( 120 | './artifacts/warp-token-addresses.json', 121 | ); 122 | const app = hypErc20FromAddressesMap(artifacts, multiProvider); 123 | 124 | const getDestinationBalance = async (): Promise => { 125 | switch (artifacts[destination].tokenType) { 126 | case TokenType.collateral: { 127 | const router = app.getContracts(destination) 128 | .router as HypERC20Collateral; 129 | const tokenAddress = await router.wrappedToken(); 130 | const token = ERC20__factory.connect(tokenAddress, signer); 131 | return token.balanceOf(recipient); 132 | } 133 | case TokenType.native: { 134 | return multiProvider.getProvider(destination).getBalance(recipient); 135 | } 136 | case TokenType.synthetic: { 137 | const router = app.getContracts(destination).router as HypERC20; 138 | return router.balanceOf(recipient); 139 | } 140 | default: { 141 | throw new Error('Unsupported collateral type'); 142 | } 143 | } 144 | }; 145 | const balanceBefore = await getDestinationBalance(); 146 | 147 | const core = HyperlaneCore.fromAddressesMap( 148 | mergedContractAddresses, 149 | multiProvider, 150 | ); 151 | 152 | let receipt: ContractReceipt; 153 | switch (artifacts[origin].tokenType) { 154 | case TokenType.collateral: { 155 | const router = app.getContracts(origin).router as HypERC20Collateral; 156 | const tokenAddress = await router.wrappedToken(); 157 | const token = ERC20__factory.connect( 158 | tokenAddress, 159 | multiProvider.getSigner(origin), 160 | ); 161 | const approval = await token.allowance( 162 | await signer.getAddress(), 163 | router.address, 164 | ); 165 | if (approval.lt(wei)) { 166 | await token.approve(router.address, wei); 167 | } 168 | receipt = await app.transfer( 169 | origin, 170 | destination, 171 | utils.addressToBytes32(recipient), 172 | wei, 173 | ); 174 | break; 175 | } 176 | case TokenType.native: { 177 | const destinationDomain = multiProvider.getDomainId(destination); 178 | const router = app.getContracts(origin).router as HypNative; 179 | const gasPayment = await router.quoteGasPayment(destinationDomain); 180 | const value = gasPayment.add(wei); 181 | const tx = await router.transferRemote( 182 | destinationDomain, 183 | utils.addressToBytes32(recipient), 184 | wei, 185 | { value }, 186 | ); 187 | receipt = await tx.wait(); 188 | break; 189 | } 190 | case TokenType.synthetic: { 191 | receipt = await app.transfer( 192 | origin, 193 | destination, 194 | utils.addressToBytes32(recipient), 195 | wei, 196 | ); 197 | break; 198 | } 199 | default: { 200 | throw new Error('Unsupported token type'); 201 | } 202 | } 203 | 204 | const messages = await core.getDispatchedMessages(receipt); 205 | const message = messages[0]; 206 | const msgDestination = multiProvider.getChainName(message.parsed.destination); 207 | assert(destination === msgDestination); 208 | 209 | while ( 210 | !(await core.getContracts(destination).mailbox.delivered(message.id)) && 211 | !timedOut 212 | ) { 213 | logger(`Waiting for message delivery on destination chain`); 214 | await utils.sleep(1000); 215 | } 216 | 217 | if (!timedOut) { 218 | logger(`Message delivered on destination chain!`); 219 | const balanceAfter = await getDestinationBalance(); 220 | if (!balanceAfter.gt(balanceBefore)) { 221 | throw new Error('Destination chain balance did not increase'); 222 | } 223 | logger(`Confirmed balance increase`); 224 | } 225 | 226 | clearTimeout(timeoutId); 227 | if (timedOut) { 228 | error('Timed out waiting for messages to be delivered'); 229 | process.exit(1); 230 | } 231 | }); 232 | -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from 'ethers'; 2 | 3 | import { Mailbox__factory, OverheadIgp__factory } from '@hyperlane-xyz/core'; 4 | import { 5 | ChainMap, 6 | ChainName, 7 | CoreConfig, 8 | GasOracleContractType, 9 | HyperlaneAddresses, 10 | HyperlaneAddressesMap, 11 | HyperlaneContractsMap, 12 | HyperlaneDeploymentArtifacts, 13 | ModuleType, 14 | MultiProvider, 15 | MultisigIsmConfig, 16 | OverheadIgpConfig, 17 | RouterConfig, 18 | RoutingIsmConfig, 19 | buildAgentConfigDeprecated, 20 | chainMetadata, 21 | defaultMultisigIsmConfigs, 22 | filterAddressesMap, 23 | multisigIsmVerificationCost, 24 | objFilter, 25 | objMerge, 26 | } from '@hyperlane-xyz/sdk'; 27 | import { hyperlaneEnvironments } from '@hyperlane-xyz/sdk/dist/consts/environments'; 28 | import { types, utils } from '@hyperlane-xyz/utils'; 29 | 30 | import { chains } from '../config/chains'; 31 | import { multisigIsmConfig } from '../config/multisig_ism'; 32 | 33 | import { TestRecipientConfig } from './core/TestRecipientDeployer'; 34 | import { tryReadJSON } from './json'; 35 | 36 | let multiProvider: MultiProvider; 37 | 38 | export function getMultiProvider() { 39 | if (!multiProvider) { 40 | const chainConfigs = { ...chainMetadata, ...chains }; 41 | multiProvider = new MultiProvider(chainConfigs); 42 | } 43 | return multiProvider; 44 | } 45 | export function assertBytesN(value: string, length: number): string { 46 | const valueWithPrefix = utils.ensure0x(value); 47 | if ( 48 | ethers.utils.isHexString(valueWithPrefix) && 49 | ethers.utils.hexDataLength(valueWithPrefix) == length 50 | ) { 51 | return valueWithPrefix; 52 | } 53 | throw new Error( 54 | `Invalid value ${value}, must be a ${length} byte hex string`, 55 | ); 56 | } 57 | 58 | export function assertBytes32(value: string): string { 59 | return assertBytesN(value, 32); 60 | } 61 | 62 | export function assertBytes20(value: string): string { 63 | return assertBytesN(value, 20); 64 | } 65 | 66 | export function assertUnique( 67 | values: (argv: any) => string[], 68 | ): (argv: any) => void { 69 | return (argv: any) => { 70 | const _values = values(argv); 71 | const hasDuplicates = new Set(_values).size !== _values.length; 72 | if (hasDuplicates) { 73 | throw new Error(`Must provide unique values, got ${_values}`); 74 | } 75 | }; 76 | } 77 | 78 | export function assertBalances( 79 | multiProvider: MultiProvider, 80 | chainsFunc: (argv: any) => ChainName[], 81 | ): (argv: any) => Promise { 82 | return async (argv: any) => { 83 | const chains = chainsFunc(argv); 84 | const signer = new ethers.Wallet(argv.key); 85 | const address = await signer.getAddress(); 86 | await Promise.all( 87 | chains.map(async (chain: ChainName) => { 88 | const balance = await multiProvider 89 | .getProvider(chain) 90 | .getBalance(address); 91 | if (balance.isZero()) 92 | throw new Error(`${address} has no balance on ${chain}`); 93 | }), 94 | ); 95 | }; 96 | } 97 | 98 | export function coerceAddressToBytes32(value: string): string { 99 | if (ethers.utils.isHexString(value)) { 100 | const length = ethers.utils.hexDataLength(value); 101 | if (length == 32) { 102 | return value; 103 | } else if (length == 20) { 104 | return utils.addressToBytes32(value); 105 | } 106 | } 107 | throw new Error(`Invalid value ${value}, must be a 20 or 32 byte hex string`); 108 | } 109 | 110 | export function buildIsmConfig( 111 | owner: types.Address, 112 | remotes: ChainName[], 113 | ): RoutingIsmConfig { 114 | const mergedMultisigIsmConfig: ChainMap = objMerge( 115 | defaultMultisigIsmConfigs, 116 | multisigIsmConfig, 117 | ); 118 | return { 119 | owner, 120 | type: ModuleType.ROUTING, 121 | domains: Object.fromEntries( 122 | remotes.map((remote) => [remote, mergedMultisigIsmConfig[remote]]), 123 | ), 124 | }; 125 | } 126 | 127 | export function buildIsmConfigMap( 128 | owner: types.Address, 129 | chains: ChainName[], 130 | remotes: ChainName[], 131 | ): ChainMap { 132 | return Object.fromEntries( 133 | chains.map((chain) => { 134 | const ismConfig = buildIsmConfig( 135 | owner, 136 | remotes.filter((r) => r !== chain), 137 | ); 138 | return [chain, ismConfig]; 139 | }), 140 | ); 141 | } 142 | 143 | export function buildCoreConfigMap( 144 | owner: types.Address, 145 | local: ChainName, 146 | remotes: ChainName[], 147 | ): ChainMap { 148 | const configMap: ChainMap = {}; 149 | configMap[local] = { 150 | owner, 151 | defaultIsm: buildIsmConfig(owner, remotes), 152 | }; 153 | return configMap; 154 | } 155 | 156 | export function buildRouterConfigMap( 157 | owner: types.Address, 158 | chains: ChainName[], 159 | addressesMap: HyperlaneAddressesMap, 160 | ): ChainMap { 161 | const routerConfigFactories = { 162 | mailbox: new Mailbox__factory(), 163 | defaultIsmInterchainGasPaymaster: new OverheadIgp__factory(), 164 | }; 165 | const filteredAddressesMap = filterAddressesMap( 166 | addressesMap, 167 | routerConfigFactories, 168 | ); 169 | return Object.fromEntries( 170 | chains.map((chain) => { 171 | const routerConfig: RouterConfig = { 172 | owner, 173 | mailbox: filteredAddressesMap[chain].mailbox, 174 | interchainGasPaymaster: 175 | filteredAddressesMap[chain].defaultIsmInterchainGasPaymaster, 176 | }; 177 | return [chain, routerConfig]; 178 | }), 179 | ); 180 | } 181 | 182 | export function buildTestRecipientConfigMap( 183 | chains: ChainName[], 184 | addressesMap: HyperlaneAddressesMap, 185 | ): ChainMap { 186 | return Object.fromEntries( 187 | chains.map((chain) => { 188 | const interchainSecurityModule = 189 | addressesMap[chain].interchainSecurityModule ?? 190 | ethers.constants.AddressZero; 191 | return [chain, { interchainSecurityModule }]; 192 | }), 193 | ); 194 | } 195 | 196 | export function buildIgpConfigMap( 197 | owner: types.Address, 198 | deployChains: ChainName[], 199 | allChains: ChainName[], 200 | ): ChainMap { 201 | const mergedMultisigIsmConfig: ChainMap = objMerge( 202 | defaultMultisigIsmConfigs, 203 | multisigIsmConfig, 204 | ); 205 | const configMap: ChainMap = {}; 206 | for (const local of deployChains) { 207 | const overhead: ChainMap = {}; 208 | const gasOracleType: ChainMap = {}; 209 | for (const remote of allChains) { 210 | if (local === remote) continue; 211 | overhead[remote] = multisigIsmVerificationCost( 212 | mergedMultisigIsmConfig[remote].threshold, 213 | mergedMultisigIsmConfig[remote].validators.length, 214 | ); 215 | gasOracleType[remote] = GasOracleContractType.StorageGasOracle; 216 | } 217 | configMap[local] = { 218 | owner, 219 | beneficiary: owner, 220 | gasOracleType, 221 | overhead, 222 | }; 223 | } 224 | return configMap; 225 | } 226 | 227 | export const sdkContractAddressesMap = { 228 | ...hyperlaneEnvironments.testnet, 229 | ...hyperlaneEnvironments.mainnet, 230 | }; 231 | 232 | export function artifactsAddressesMap(): HyperlaneContractsMap { 233 | return ( 234 | tryReadJSON>('./artifacts', 'addresses.json') || 235 | {} 236 | ); 237 | } 238 | 239 | export function buildOverriddenAgentConfig( 240 | chains: ChainName[], 241 | multiProvider: MultiProvider, 242 | startBlocks: ChainMap, 243 | ) { 244 | const mergedAddressesMap: HyperlaneAddressesMap = objMerge( 245 | sdkContractAddressesMap, 246 | artifactsAddressesMap(), 247 | ); 248 | const filteredAddressesMap = objFilter( 249 | mergedAddressesMap, 250 | (chain, v): v is HyperlaneAddresses => 251 | chains.includes(chain) && 252 | !!v.mailbox && 253 | !!v.interchainGasPaymaster && 254 | !!v.validatorAnnounce, 255 | ) as unknown as ChainMap; 256 | 257 | return buildAgentConfigDeprecated( 258 | chains, 259 | multiProvider, 260 | filteredAddressesMap, 261 | startBlocks, 262 | ); 263 | } 264 | -------------------------------------------------------------------------------- /src/core/HyperlanePermissionlessDeployer.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from 'ethers'; 2 | import yargs from 'yargs'; 3 | 4 | import { 5 | ChainMap, 6 | ChainName, 7 | HyperlaneAddresses, 8 | HyperlaneAddressesMap, 9 | HyperlaneContractsMap, 10 | HyperlaneCoreDeployer, 11 | HyperlaneIgpDeployer, 12 | HyperlaneIsmFactory, 13 | HyperlaneIsmFactoryDeployer, 14 | MultiProvider, 15 | ProtocolType, 16 | defaultMultisigIsmConfigs, 17 | objFilter, 18 | objMap, 19 | objMerge, 20 | serializeContractsMap, 21 | } from '@hyperlane-xyz/sdk'; 22 | import type { DeployedIsm } from '@hyperlane-xyz/sdk/dist/ism/types'; 23 | 24 | import { multisigIsmConfig } from '../../config/multisig_ism'; 25 | import { startBlocks } from '../../config/start_blocks'; 26 | import { 27 | artifactsAddressesMap, 28 | assertBalances, 29 | assertBytes32, 30 | assertUnique, 31 | buildCoreConfigMap, 32 | buildIgpConfigMap, 33 | buildIsmConfigMap, 34 | buildOverriddenAgentConfig, 35 | buildTestRecipientConfigMap, 36 | getMultiProvider, 37 | sdkContractAddressesMap, 38 | } from '../config'; 39 | import { mergeJSON, writeJSON } from '../json'; 40 | import { createLogger } from '../logger'; 41 | 42 | import { HyperlaneTestRecipientDeployer } from './TestRecipientDeployer'; 43 | 44 | export function getArgs(multiProvider: MultiProvider) { 45 | // For each chain, we need: 46 | // - ChainMetadata for the MultiProvider 47 | // - A MultisigIsmConfig 48 | const { intersection } = multiProvider.intersect( 49 | Object.keys(objMerge(defaultMultisigIsmConfigs, multisigIsmConfig)), 50 | ); 51 | 52 | return yargs(process.argv.slice(2)) 53 | .describe('local', 'The chain to deploy to') 54 | .choices('local', intersection) 55 | .demandOption('local') 56 | .array('remotes') 57 | .describe( 58 | 'remotes', 59 | "The chains with which 'local' will be able to send and receive messages", 60 | ) 61 | .choices('remotes', intersection) 62 | .demandOption('remotes') 63 | .middleware(assertUnique((argv) => argv.remotes.concat(argv.local))) 64 | .describe('key', 'A hexadecimal private key for transaction signing') 65 | .string('key') 66 | .coerce('key', assertBytes32) 67 | .demandOption('key') 68 | .middleware( 69 | assertBalances(multiProvider, (argv) => 70 | argv.remotes 71 | .concat(argv.local) 72 | .filter( 73 | (chain: string) => 74 | multiProvider.getChainMetadata(chain).protocol === 75 | ProtocolType.Ethereum, 76 | ), 77 | ), 78 | ) 79 | .describe('write-agent-config', 'Whether or not to write agent config') 80 | .default('write-agent-config', true) 81 | .boolean('write-agent-config').argv; 82 | } 83 | 84 | export class HyperlanePermissionlessDeployer { 85 | constructor( 86 | public readonly multiProvider: MultiProvider, 87 | public readonly signer: ethers.Signer, 88 | public readonly local: ChainName, 89 | public readonly remotes: ChainName[], 90 | public readonly writeAgentConfig?: boolean, 91 | protected readonly logger = createLogger('HyperlanePermissionlessDeployer'), 92 | ) {} 93 | 94 | static async fromArgs(): Promise { 95 | const multiProvider = getMultiProvider(); 96 | const { local, remotes, key, writeAgentConfig } = await getArgs( 97 | multiProvider, 98 | ); 99 | if (remotes.includes(local)) 100 | throw new Error('Local and remotes must be distinct'); 101 | const signer = new ethers.Wallet(key); 102 | multiProvider.setSharedSigner(signer); 103 | 104 | return new HyperlanePermissionlessDeployer( 105 | multiProvider, 106 | signer, 107 | local, 108 | remotes as unknown as string[], 109 | writeAgentConfig, 110 | ); 111 | } 112 | 113 | skipLocalDeploy(): boolean { 114 | return !this.isDeployableChain(this.local); 115 | } 116 | 117 | remoteDeployableChains(): ChainName[] { 118 | return this.remotes.filter((chain) => this.isDeployableChain(chain)); 119 | } 120 | 121 | deployableChains(): ChainName[] { 122 | return this.remotes 123 | .concat([this.local]) 124 | .filter((chain) => this.isDeployableChain(chain)); 125 | } 126 | 127 | allChains(): ChainName[] { 128 | return this.remotes.concat([this.local]); 129 | } 130 | 131 | async deploy(): Promise { 132 | let addressesMap = artifactsAddressesMap(); 133 | const owner = await this.signer.getAddress(); 134 | 135 | const deployableChains = this.deployableChains(); 136 | const remoteDeployableChains = this.remoteDeployableChains(); 137 | const allChains = this.allChains(); 138 | const skipLocalDeploy = this.skipLocalDeploy(); 139 | 140 | // 1. Deploy ISM factories to all deployable chains that don't have them. 141 | this.logger('Deploying ISM factory contracts'); 142 | const ismDeployer = new HyperlaneIsmFactoryDeployer(this.multiProvider); 143 | ismDeployer.cacheAddressesMap( 144 | objMerge(sdkContractAddressesMap, addressesMap), 145 | ); 146 | const ismFactoryContracts = await ismDeployer.deploy(deployableChains); 147 | addressesMap = this.writeMergedAddresses(addressesMap, ismFactoryContracts); 148 | this.logger(`ISM factory deployment complete`); 149 | 150 | // 2. Deploy IGPs to all deployable chains. 151 | this.logger(`Deploying IGP contracts`); 152 | const igpConfig = buildIgpConfigMap(owner, deployableChains, allChains); 153 | const igpDeployer = new HyperlaneIgpDeployer(this.multiProvider); 154 | igpDeployer.cacheAddressesMap(addressesMap); 155 | const igpContracts = await igpDeployer.deploy(igpConfig); 156 | addressesMap = this.writeMergedAddresses(addressesMap, igpContracts); 157 | this.logger(`IGP deployment complete`); 158 | 159 | // Build an IsmFactory that covers all chains so that we can 160 | // use it later to deploy ISMs to remote chains. 161 | const ismFactory = HyperlaneIsmFactory.fromAddressesMap( 162 | objMerge(sdkContractAddressesMap, addressesMap), 163 | this.multiProvider, 164 | ); 165 | 166 | // 3. Deploy core contracts to local chain 167 | if (!skipLocalDeploy) { 168 | this.logger(`Deploying core contracts to ${this.local}`); 169 | const coreDeployer = new HyperlaneCoreDeployer( 170 | this.multiProvider, 171 | ismFactory, 172 | ); 173 | coreDeployer.cacheAddressesMap(addressesMap); 174 | const coreConfig = buildCoreConfigMap(owner, this.local, this.remotes); 175 | const coreContracts = await coreDeployer.deploy(coreConfig); 176 | addressesMap = this.writeMergedAddresses(addressesMap, coreContracts); 177 | this.logger(`Core deployment complete`); 178 | } else { 179 | this.logger(`Skipping core deployment to local ${this.local}`); 180 | } 181 | 182 | // 4. Deploy ISM contracts to remote deployable chains 183 | this.logger(`Deploying ISMs to ${remoteDeployableChains}`); 184 | const ismConfigs = buildIsmConfigMap( 185 | owner, 186 | remoteDeployableChains, 187 | allChains, 188 | ); 189 | const ismContracts: ChainMap<{ interchainSecurityModule: DeployedIsm }> = 190 | {}; 191 | for (const [ismChain, ismConfig] of Object.entries(ismConfigs)) { 192 | this.logger(`Deploying ISM to ${ismChain}`); 193 | ismContracts[ismChain] = { 194 | interchainSecurityModule: await ismFactory.deploy(ismChain, ismConfig), 195 | }; 196 | } 197 | addressesMap = this.writeMergedAddresses(addressesMap, ismContracts); 198 | this.logger(`ISM deployment complete`); 199 | 200 | // 5. Deploy TestRecipients to all deployable chains 201 | this.logger(`Deploying test recipient contracts`); 202 | const testRecipientConfig = buildTestRecipientConfigMap( 203 | deployableChains, 204 | addressesMap, 205 | ); 206 | const testRecipientDeployer = new HyperlaneTestRecipientDeployer( 207 | this.multiProvider, 208 | ); 209 | testRecipientDeployer.cacheAddressesMap(addressesMap); 210 | const testRecipients = await testRecipientDeployer.deploy( 211 | testRecipientConfig, 212 | ); 213 | addressesMap = this.writeMergedAddresses(addressesMap, testRecipients); 214 | this.logger(`Test recipient deployment complete`); 215 | 216 | if (!skipLocalDeploy) { 217 | startBlocks[this.local] = await this.multiProvider 218 | .getProvider(this.local) 219 | .getBlockNumber(); 220 | } 221 | 222 | if (this.writeAgentConfig) { 223 | const agentConfig = buildOverriddenAgentConfig( 224 | deployableChains, 225 | this.multiProvider, 226 | startBlocks, 227 | ); 228 | 229 | this.logger(`Writing agent config to artifacts/agent_config.json`); 230 | writeJSON('./artifacts/', 'agent_config.json', agentConfig); 231 | } 232 | } 233 | 234 | protected writeMergedAddresses( 235 | aAddresses: HyperlaneAddressesMap, 236 | bContracts: HyperlaneContractsMap, 237 | ): HyperlaneAddressesMap { 238 | // Only write addresses that aren't present in the SDK 239 | const bAddresses = serializeContractsMap(bContracts); 240 | const mergedAddresses = objMerge(aAddresses, bAddresses); 241 | const filteredAddresses = objMap( 242 | mergedAddresses, 243 | (chain: string, addresses) => 244 | objFilter(addresses, (contract, address): address is string => { 245 | // @ts-ignore 246 | const chainAddresses = sdkContractAddressesMap[chain]; 247 | return !chainAddresses || chainAddresses[contract] !== address; 248 | }), 249 | ); 250 | this.logger(`Writing contract addresses to artifacts/addresses.json`); 251 | mergeJSON( 252 | './artifacts/', 253 | 'addresses.json', 254 | objFilter( 255 | filteredAddresses, 256 | (_, value): value is HyperlaneAddresses => !!value, 257 | ), 258 | ); 259 | return mergedAddresses; 260 | } 261 | 262 | isDeployableChain(chain: ChainName): boolean { 263 | return ( 264 | this.multiProvider.getChainMetadata(chain).protocol === 265 | ProtocolType.Ethereum 266 | ); 267 | } 268 | } 269 | -------------------------------------------------------------------------------- /src/core/TestRecipientDeployer.ts: -------------------------------------------------------------------------------- 1 | import debug from 'debug'; 2 | 3 | import { TestRecipient, TestRecipient__factory } from '@hyperlane-xyz/core'; 4 | import { 5 | ChainName, 6 | HyperlaneDeployer, 7 | MultiProvider, 8 | } from '@hyperlane-xyz/sdk'; 9 | import { types, utils } from '@hyperlane-xyz/utils'; 10 | 11 | // Maps chain name to ISM address 12 | export type TestRecipientConfig = { 13 | interchainSecurityModule: types.Address; 14 | }; 15 | 16 | export type TestRecipientContracts = { 17 | testRecipient: TestRecipient; 18 | }; 19 | 20 | export type TestRecipientAddresses = { 21 | testRecipient: types.Address; 22 | }; 23 | 24 | export const testRecipientFactories = { 25 | testRecipient: new TestRecipient__factory(), 26 | }; 27 | 28 | export class HyperlaneTestRecipientDeployer extends HyperlaneDeployer< 29 | TestRecipientConfig, 30 | typeof testRecipientFactories 31 | > { 32 | constructor(multiProvider: MultiProvider) { 33 | super(multiProvider, testRecipientFactories, { 34 | logger: debug('hyperlane:TestRecipientDeployer'), 35 | }); 36 | } 37 | 38 | async deployContracts( 39 | chain: ChainName, 40 | config: TestRecipientConfig, 41 | ): Promise { 42 | const testRecipient = await this.deployContract(chain, 'testRecipient', []); 43 | const ism = await testRecipient.interchainSecurityModule(); 44 | if (!utils.eqAddress(ism, config.interchainSecurityModule)) { 45 | const tx = testRecipient.setInterchainSecurityModule( 46 | config.interchainSecurityModule, 47 | ); 48 | await this.multiProvider.handleTx(chain, tx); 49 | } 50 | return { 51 | testRecipient, 52 | }; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/json.ts: -------------------------------------------------------------------------------- 1 | // TODO move these to @hyperlane-xyz/utils 2 | import fs from 'fs'; 3 | import path from 'path'; 4 | 5 | import { objMerge } from '@hyperlane-xyz/sdk'; 6 | 7 | export function readFileAtPath(filepath: string) { 8 | if (!fs.existsSync(filepath)) { 9 | throw Error(`file doesn't exist at ${filepath}`); 10 | } 11 | return fs.readFileSync(filepath, 'utf8'); 12 | } 13 | 14 | export function readJSONAtPath(filepath: string): T { 15 | return JSON.parse(readFileAtPath(filepath)) as T; 16 | } 17 | 18 | export function readJSON(directory: string, filename: string): T { 19 | return readJSONAtPath(path.join(directory, filename)); 20 | } 21 | 22 | export function tryReadJSON(directory: string, filename: string): T | null { 23 | try { 24 | return readJSONAtPath(path.join(directory, filename)) as T; 25 | } catch (error) { 26 | return null; 27 | } 28 | } 29 | 30 | export function writeFileAtPath( 31 | directory: string, 32 | filename: string, 33 | value: string, 34 | ) { 35 | if (!fs.existsSync(directory)) { 36 | fs.mkdirSync(directory, { recursive: true }); 37 | } 38 | fs.writeFileSync(path.join(directory, filename), value); 39 | } 40 | 41 | export function writeJSON(directory: string, filename: string, obj: any) { 42 | writeFileAtPath(directory, filename, JSON.stringify(obj, null, 2) + '\n'); 43 | } 44 | 45 | export function mergeJSON>( 46 | directory: string, 47 | filename: string, 48 | obj: T, 49 | ) { 50 | if (fs.existsSync(path.join(directory, filename))) { 51 | const previous = readJSON(directory, filename); 52 | writeJSON(directory, filename, objMerge(previous, obj)); 53 | } else { 54 | writeJSON(directory, filename, obj); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/logger.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | import debug from 'debug'; 3 | 4 | const HYPERLANE_NS = 'hyperlane'; 5 | 6 | // Default root logger for use in utils/scripts 7 | export const logger = debug(HYPERLANE_NS); 8 | export const error = debug(`${HYPERLANE_NS}:ERROR`); 9 | 10 | export function createLogger(namespace: string, isError = false) { 11 | return isError ? error.extend(namespace) : logger.extend(namespace); 12 | } 13 | 14 | // Ensure hyperlane logging is enabled 15 | const activeNamespaces = debug.disable(); 16 | const otherNamespaces = activeNamespaces 17 | .split(',') 18 | .filter((ns) => ns.includes(HYPERLANE_NS)); 19 | const hypNamespaces = `${HYPERLANE_NS},${HYPERLANE_NS}:*`; 20 | debug.enable( 21 | otherNamespaces ? `${otherNamespaces},${hypNamespaces}` : `${hypNamespaces}`, 22 | ); 23 | -------------------------------------------------------------------------------- /src/warp/WarpRouteDeployer.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from 'ethers'; 2 | import yargs from 'yargs'; 3 | 4 | import { 5 | ERC20__factory, 6 | ERC721__factory, 7 | HypERC20Deployer, 8 | HypERC721Deployer, 9 | TokenConfig, 10 | TokenType, 11 | } from '@hyperlane-xyz/hyperlane-token'; 12 | import type { TokenFactories } from '@hyperlane-xyz/hyperlane-token/dist/contracts'; 13 | import { 14 | ChainMap, 15 | HyperlaneContractsMap, 16 | MultiProvider, 17 | RouterConfig, 18 | chainMetadata, 19 | objMap, 20 | objMerge, 21 | } from '@hyperlane-xyz/sdk'; 22 | import { types } from '@hyperlane-xyz/utils'; 23 | 24 | import { warpRouteConfig } from '../../config/warp_tokens'; 25 | import { 26 | artifactsAddressesMap, 27 | assertBalances, 28 | assertBytes32, 29 | getMultiProvider, 30 | sdkContractAddressesMap, 31 | } from '../config'; 32 | import { mergeJSON, tryReadJSON, writeFileAtPath, writeJSON } from '../json'; 33 | import { createLogger } from '../logger'; 34 | 35 | import { 36 | WarpBaseTokenConfig, 37 | getWarpConfigChains, 38 | validateWarpTokenConfig, 39 | } from './config'; 40 | import { MinimalTokenMetadata, WarpUITokenConfig } from './types'; 41 | 42 | export async function getArgs(multiProvider: MultiProvider) { 43 | const args = await yargs(process.argv.slice(2)) 44 | .describe('key', 'A hexadecimal private key for transaction signing') 45 | .string('key') 46 | .coerce('key', assertBytes32) 47 | .demandOption('key') 48 | .middleware( 49 | assertBalances(multiProvider, () => getWarpConfigChains(warpRouteConfig)), 50 | ); 51 | return args.argv; 52 | } 53 | 54 | export type WarpRouteArtifacts = { 55 | router: types.Address; 56 | tokenType: TokenType; 57 | }; 58 | 59 | export class WarpRouteDeployer { 60 | constructor( 61 | public readonly multiProvider: MultiProvider, 62 | public readonly signer: ethers.Signer, 63 | protected readonly logger = createLogger('WarpRouteDeployer'), 64 | ) {} 65 | 66 | static async fromArgs(): Promise { 67 | const multiProvider = getMultiProvider(); 68 | const { key } = await getArgs(multiProvider); 69 | const signer = new ethers.Wallet(key); 70 | multiProvider.setSharedSigner(signer); 71 | return new WarpRouteDeployer(multiProvider, signer); 72 | } 73 | 74 | async deploy(): Promise { 75 | const { configMap, baseToken } = await this.buildHypTokenConfig(); 76 | 77 | this.logger('Initiating hyp token deployments'); 78 | const deployer = baseToken.isNft 79 | ? new HypERC721Deployer(this.multiProvider) 80 | : new HypERC20Deployer(this.multiProvider); 81 | 82 | await deployer.deploy(configMap); 83 | this.logger('Hyp token deployments complete'); 84 | 85 | this.writeDeploymentResult( 86 | deployer.deployedContracts, 87 | configMap, 88 | baseToken, 89 | ); 90 | } 91 | 92 | async buildHypTokenConfig() { 93 | validateWarpTokenConfig(warpRouteConfig); 94 | const { base, synthetics } = warpRouteConfig; 95 | const { type: baseType, chainName: baseChainName } = base; 96 | 97 | const isCollateral = baseType === TokenType.collateral; 98 | const baseTokenAddr = isCollateral 99 | ? base.address 100 | : ethers.constants.AddressZero; 101 | const isNft = !!(isCollateral && base.isNft); 102 | 103 | const owner = await this.signer.getAddress(); 104 | 105 | const mergedContractAddresses = objMerge( 106 | sdkContractAddressesMap, 107 | artifactsAddressesMap(), 108 | ); 109 | 110 | const configMap: ChainMap = { 111 | [baseChainName]: { 112 | type: baseType, 113 | token: baseTokenAddr, 114 | owner, 115 | mailbox: base.mailbox || mergedContractAddresses[baseChainName].mailbox, 116 | interchainSecurityModule: 117 | base.interchainSecurityModule || 118 | mergedContractAddresses[baseChainName].interchainSecurityModule || 119 | mergedContractAddresses[baseChainName].multisigIsm, 120 | interchainGasPaymaster: 121 | base.interchainGasPaymaster || 122 | mergedContractAddresses[baseChainName] 123 | .defaultIsmInterchainGasPaymaster, 124 | foreignDeployment: base.foreignDeployment, 125 | name: base.name, 126 | symbol: base.symbol, 127 | decimals: base.decimals, 128 | }, 129 | }; 130 | this.logger( 131 | `Hyp token config on base chain ${baseChainName}:`, 132 | JSON.stringify(configMap[baseChainName]), 133 | ); 134 | 135 | const baseTokenMetadata = await this.getBaseTokenMetadata(base); 136 | this.logger( 137 | `Using base token metadata: Name: ${baseTokenMetadata.name}, Symbol: ${baseTokenMetadata.symbol}, Decimals: ${baseTokenMetadata.decimals} `, 138 | ); 139 | 140 | for (const synthetic of synthetics) { 141 | const sChainName = synthetic.chainName; 142 | configMap[sChainName] = { 143 | type: TokenType.synthetic, 144 | name: synthetic.name || baseTokenMetadata.name, 145 | symbol: synthetic.symbol || baseTokenMetadata.symbol, 146 | totalSupply: synthetic.totalSupply || 0, 147 | owner, 148 | mailbox: 149 | synthetic.mailbox || mergedContractAddresses[sChainName].mailbox, 150 | interchainSecurityModule: 151 | synthetic.interchainSecurityModule || 152 | mergedContractAddresses[sChainName].interchainSecurityModule || 153 | mergedContractAddresses[sChainName].multisigIsm, 154 | interchainGasPaymaster: 155 | synthetic.interchainGasPaymaster || 156 | mergedContractAddresses[sChainName].defaultIsmInterchainGasPaymaster, 157 | foreignDeployment: synthetic.foreignDeployment, 158 | }; 159 | this.logger( 160 | `Hyp token config on synthetic chain ${sChainName}:`, 161 | JSON.stringify(configMap[sChainName]), 162 | ); 163 | } 164 | return { 165 | configMap, 166 | baseToken: { 167 | type: baseType, 168 | chainName: baseChainName, 169 | address: baseTokenAddr, 170 | metadata: baseTokenMetadata, 171 | isNft, 172 | }, 173 | }; 174 | } 175 | 176 | async getBaseTokenMetadata( 177 | base: WarpBaseTokenConfig, 178 | ): Promise { 179 | // Skip fetching metadata if it's already provided in the config 180 | if (base.name && base.symbol && base.decimals) { 181 | return { 182 | name: base.name, 183 | symbol: base.symbol, 184 | decimals: base.decimals, 185 | }; 186 | } 187 | 188 | if (base.type === TokenType.native) { 189 | return ( 190 | this.multiProvider.getChainMetadata(base.chainName).nativeToken || 191 | chainMetadata.ethereum.nativeToken! 192 | ); 193 | } else if (base.type === TokenType.collateral) { 194 | this.logger( 195 | `Fetching token metadata for ${base.address} on ${base.chainName}}`, 196 | ); 197 | const provider = this.multiProvider.getProvider(base.chainName); 198 | if (base.isNft) { 199 | const erc721Contract = ERC721__factory.connect(base.address, provider); 200 | const [name, symbol] = await Promise.all([ 201 | erc721Contract.name(), 202 | erc721Contract.symbol(), 203 | ]); 204 | return { name, symbol, decimals: 0 }; 205 | } else { 206 | const erc20Contract = ERC20__factory.connect(base.address, provider); 207 | const [name, symbol, decimals] = await Promise.all([ 208 | erc20Contract.name(), 209 | erc20Contract.symbol(), 210 | erc20Contract.decimals(), 211 | ]); 212 | return { name, symbol, decimals }; 213 | } 214 | } else { 215 | throw new Error(`Unsupported token type: ${base}`); 216 | } 217 | } 218 | 219 | writeDeploymentResult( 220 | contracts: HyperlaneContractsMap, 221 | configMap: ChainMap, 222 | baseToken: Awaited< 223 | ReturnType 224 | >['baseToken'], 225 | ) { 226 | this.writeTokenDeploymentArtifacts(contracts, configMap); 227 | this.writeWarpUiTokenList(contracts, baseToken, configMap); 228 | } 229 | 230 | writeTokenDeploymentArtifacts( 231 | contracts: HyperlaneContractsMap, 232 | configMap: ChainMap, 233 | ) { 234 | this.logger( 235 | 'Writing token deployment addresses to artifacts/warp-token-addresses.json', 236 | ); 237 | const artifacts: ChainMap = objMap( 238 | contracts, 239 | (chain, contract) => { 240 | return { 241 | router: contract.router.address, 242 | tokenType: configMap[chain].type, 243 | }; 244 | }, 245 | ); 246 | mergeJSON('./artifacts/', 'warp-token-addresses.json', artifacts); 247 | } 248 | 249 | writeWarpUiTokenList( 250 | contracts: HyperlaneContractsMap, 251 | baseToken: Awaited< 252 | ReturnType 253 | >['baseToken'], 254 | configMap: ChainMap, 255 | ) { 256 | this.logger( 257 | 'Writing warp ui token list to artifacts/warp-ui-token-list.json and artifacts/warp-ui-token-list.ts', 258 | ); 259 | const currentTokenList: WarpUITokenConfig[] = 260 | tryReadJSON('./artifacts/', 'warp-ui-token-list.json') || []; 261 | 262 | const { type, address, chainName, metadata, isNft } = baseToken; 263 | const { name, symbol, decimals } = metadata; 264 | const hypTokenAddr = 265 | contracts[chainName]?.router?.address || 266 | configMap[chainName]?.foreignDeployment; 267 | if (!hypTokenAddr) { 268 | throw Error( 269 | 'No base Hyperlane token address deployed and no foreign deployment specified', 270 | ); 271 | } 272 | const commonFields = { 273 | chainId: this.multiProvider.getChainId(chainName), 274 | name, 275 | symbol, 276 | decimals, 277 | }; 278 | let newToken: WarpUITokenConfig; 279 | if (type === TokenType.collateral) { 280 | newToken = { 281 | ...commonFields, 282 | type: TokenType.collateral, 283 | address, 284 | hypCollateralAddress: hypTokenAddr, 285 | isNft, 286 | }; 287 | } else if (type === TokenType.native) { 288 | newToken = { 289 | ...commonFields, 290 | type: TokenType.native, 291 | hypNativeAddress: hypTokenAddr, 292 | }; 293 | } else { 294 | throw new Error(`Unsupported token type: ${type}`); 295 | } 296 | 297 | currentTokenList.push(newToken); 298 | // Write list as JSON 299 | writeJSON('./artifacts/', 'warp-ui-token-list.json', currentTokenList); 300 | // Also write list as TS 301 | const serializedTokens = currentTokenList 302 | .map((t) => JSON.stringify(t)) 303 | .join(',\n'); 304 | writeFileAtPath( 305 | './artifacts/', 306 | 'warp-ui-token-list.ts', 307 | `export const tokenList = [\n${serializedTokens}\n];`, 308 | ); 309 | } 310 | } 311 | -------------------------------------------------------------------------------- /src/warp/config.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | import { TokenType } from '@hyperlane-xyz/hyperlane-token'; 4 | import { RouterConfig } from '@hyperlane-xyz/sdk/dist/router/types'; 5 | 6 | import { MinimalTokenMetadata } from './types'; 7 | 8 | type WarpBaseToken = { 9 | type: TokenType.native | TokenType.collateral; 10 | chainName: string; 11 | } & Partial & 12 | Partial; 13 | 14 | export interface WarpNativeTokenConfig extends WarpBaseToken { 15 | type: TokenType.native; 16 | } 17 | 18 | export interface WarpCollateralTokenConfig extends WarpBaseToken { 19 | type: TokenType.collateral; 20 | address: string; 21 | isNft?: boolean; 22 | } 23 | 24 | export type WarpSyntheticTokenConfig = { 25 | chainName: string; 26 | totalSupply?: number; 27 | } & Partial & 28 | Partial; 29 | 30 | export type WarpBaseTokenConfig = 31 | | WarpNativeTokenConfig 32 | | WarpCollateralTokenConfig; 33 | 34 | export interface WarpRouteConfig { 35 | base: WarpBaseTokenConfig; 36 | synthetics: WarpSyntheticTokenConfig[]; 37 | } 38 | 39 | // Zod schema for Warp Route config validation validation 40 | const ConnectionConfigSchema = { 41 | mailbox: z.string().optional(), 42 | interchainGasPaymaster: z.string().optional(), 43 | interchainSecurityModule: z.string().optional(), 44 | }; 45 | 46 | export const WarpTokenConfigSchema = z.object({ 47 | base: z.object({ 48 | type: z.literal(TokenType.native).or(z.literal(TokenType.collateral)), 49 | chainName: z.string(), 50 | address: z.string().optional(), 51 | isNft: z.boolean().optional(), 52 | ...ConnectionConfigSchema, 53 | }), 54 | synthetics: z 55 | .array( 56 | z.object({ 57 | chainName: z.string(), 58 | name: z.string().optional(), 59 | symbol: z.string().optional(), 60 | totalSupply: z.number().optional(), 61 | ...ConnectionConfigSchema, 62 | }), 63 | ) 64 | .nonempty(), 65 | }); 66 | 67 | export function validateWarpTokenConfig(data: WarpRouteConfig) { 68 | const result = WarpTokenConfigSchema.safeParse(data); 69 | if (!result.success) { 70 | const firstIssue = result.error.issues[0]; 71 | throw new Error( 72 | `Invalid warp config: ${firstIssue.path} => ${firstIssue.message}`, 73 | ); 74 | } 75 | } 76 | 77 | export function getWarpConfigChains(config: WarpRouteConfig) { 78 | const { base, synthetics } = config; 79 | return [base, ...synthetics] 80 | .filter((c) => !c.foreignDeployment) 81 | .map((token) => token.chainName); 82 | } 83 | -------------------------------------------------------------------------------- /src/warp/types.ts: -------------------------------------------------------------------------------- 1 | import type { TokenType } from '@hyperlane-xyz/hyperlane-token'; 2 | // TODO get properly exported from hyp-token 3 | import { ERC20Metadata } from '@hyperlane-xyz/hyperlane-token/dist/config'; 4 | import type { types } from '@hyperlane-xyz/utils'; 5 | 6 | export type MinimalTokenMetadata = Omit; 7 | 8 | // Types below must match the Warp UI token config schema 9 | // It is used to generate the configs for the Warp UI 10 | // https://github.com/hyperlane-xyz/hyperlane-warp-ui-template/blob/main/src/features/tokens/types.ts 11 | interface BaseWarpUITokenConfig extends MinimalTokenMetadata { 12 | type: TokenType.collateral | TokenType.native; 13 | chainId: number; 14 | logoURI?: string; 15 | isNft?: boolean; 16 | } 17 | 18 | interface CollateralTokenConfig extends BaseWarpUITokenConfig { 19 | type: TokenType.collateral; 20 | address: types.Address; 21 | hypCollateralAddress: types.Address; 22 | } 23 | 24 | interface NativeTokenConfig extends BaseWarpUITokenConfig { 25 | type: TokenType.native; 26 | hypNativeAddress: types.Address; 27 | } 28 | 29 | export type WarpUITokenConfig = CollateralTokenConfig | NativeTokenConfig; 30 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist/", 4 | "rootDir": "./", 5 | "declaration": true, 6 | "declarationMap": true, 7 | "esModuleInterop": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "incremental": false, 10 | "lib": ["es2015", "es5", "dom", "es2021"], 11 | "module": "commonjs", 12 | "moduleResolution": "node", 13 | "noEmitOnError": true, 14 | "noFallthroughCasesInSwitch": true, 15 | "noImplicitAny": true, 16 | "noImplicitReturns": true, 17 | "noUnusedLocals": true, 18 | "preserveSymlinks": true, 19 | "preserveWatchOutput": true, 20 | "pretty": false, 21 | "resolveJsonModule": true, 22 | "sourceMap": true, 23 | "target": "es6", 24 | "strict": true 25 | }, 26 | "exclude": ["./node_modules/", "./dist/"], 27 | "include": ["./src/**/*.ts", "./config/**/*.ts", "./scripts/*.ts"] 28 | } 29 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # This file is generated by running "yarn install" inside your project. 2 | # Manual changes might be lost - proceed with caution! 3 | 4 | __metadata: 5 | version: 6 6 | cacheKey: 8 7 | 8 | "@babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.18.6": 9 | version: 7.21.4 10 | resolution: "@babel/code-frame@npm:7.21.4" 11 | dependencies: 12 | "@babel/highlight": ^7.18.6 13 | checksum: e5390e6ec1ac58dcef01d4f18eaf1fd2f1325528661ff6d4a5de8979588b9f5a8e852a54a91b923846f7a5c681b217f0a45c2524eb9560553160cd963b7d592c 14 | languageName: node 15 | linkType: hard 16 | 17 | "@babel/generator@npm:7.17.7": 18 | version: 7.17.7 19 | resolution: "@babel/generator@npm:7.17.7" 20 | dependencies: 21 | "@babel/types": ^7.17.0 22 | jsesc: ^2.5.1 23 | source-map: ^0.5.0 24 | checksum: e7344b9b4559115f2754ecc2ae9508412ea6a8f617544cd3d3f17cabc727bd30630765f96c8a4ebc8901ded1492a3a6c23d695a4f1e8f3042f860b30c891985c 25 | languageName: node 26 | linkType: hard 27 | 28 | "@babel/generator@npm:^7.17.3": 29 | version: 7.21.4 30 | resolution: "@babel/generator@npm:7.21.4" 31 | dependencies: 32 | "@babel/types": ^7.21.4 33 | "@jridgewell/gen-mapping": ^0.3.2 34 | "@jridgewell/trace-mapping": ^0.3.17 35 | jsesc: ^2.5.1 36 | checksum: 9ffbb526a53bb8469b5402f7b5feac93809b09b2a9f82fcbfcdc5916268a65dae746a1f2479e03ba4fb0776facd7c892191f63baa61ab69b2cfdb24f7b92424d 37 | languageName: node 38 | linkType: hard 39 | 40 | "@babel/helper-environment-visitor@npm:^7.16.7": 41 | version: 7.18.9 42 | resolution: "@babel/helper-environment-visitor@npm:7.18.9" 43 | checksum: b25101f6162ddca2d12da73942c08ad203d7668e06663df685634a8fde54a98bc015f6f62938e8554457a592a024108d45b8f3e651fd6dcdb877275b73cc4420 44 | languageName: node 45 | linkType: hard 46 | 47 | "@babel/helper-function-name@npm:^7.16.7": 48 | version: 7.21.0 49 | resolution: "@babel/helper-function-name@npm:7.21.0" 50 | dependencies: 51 | "@babel/template": ^7.20.7 52 | "@babel/types": ^7.21.0 53 | checksum: d63e63c3e0e3e8b3138fa47b0cd321148a300ef12b8ee951196994dcd2a492cc708aeda94c2c53759a5c9177fffaac0fd8778791286746f72a000976968daf4e 54 | languageName: node 55 | linkType: hard 56 | 57 | "@babel/helper-hoist-variables@npm:^7.16.7": 58 | version: 7.18.6 59 | resolution: "@babel/helper-hoist-variables@npm:7.18.6" 60 | dependencies: 61 | "@babel/types": ^7.18.6 62 | checksum: fd9c35bb435fda802bf9ff7b6f2df06308a21277c6dec2120a35b09f9de68f68a33972e2c15505c1a1a04b36ec64c9ace97d4a9e26d6097b76b4396b7c5fa20f 63 | languageName: node 64 | linkType: hard 65 | 66 | "@babel/helper-split-export-declaration@npm:^7.16.7": 67 | version: 7.18.6 68 | resolution: "@babel/helper-split-export-declaration@npm:7.18.6" 69 | dependencies: 70 | "@babel/types": ^7.18.6 71 | checksum: c6d3dede53878f6be1d869e03e9ffbbb36f4897c7cc1527dc96c56d127d834ffe4520a6f7e467f5b6f3c2843ea0e81a7819d66ae02f707f6ac057f3d57943a2b 72 | languageName: node 73 | linkType: hard 74 | 75 | "@babel/helper-string-parser@npm:^7.19.4": 76 | version: 7.19.4 77 | resolution: "@babel/helper-string-parser@npm:7.19.4" 78 | checksum: b2f8a3920b30dfac81ec282ac4ad9598ea170648f8254b10f475abe6d944808fb006aab325d3eb5a8ad3bea8dfa888cfa6ef471050dae5748497c110ec060943 79 | languageName: node 80 | linkType: hard 81 | 82 | "@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": 83 | version: 7.19.1 84 | resolution: "@babel/helper-validator-identifier@npm:7.19.1" 85 | checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a 86 | languageName: node 87 | linkType: hard 88 | 89 | "@babel/highlight@npm:^7.18.6": 90 | version: 7.18.6 91 | resolution: "@babel/highlight@npm:7.18.6" 92 | dependencies: 93 | "@babel/helper-validator-identifier": ^7.18.6 94 | chalk: ^2.0.0 95 | js-tokens: ^4.0.0 96 | checksum: 92d8ee61549de5ff5120e945e774728e5ccd57fd3b2ed6eace020ec744823d4a98e242be1453d21764a30a14769ecd62170fba28539b211799bbaf232bbb2789 97 | languageName: node 98 | linkType: hard 99 | 100 | "@babel/parser@npm:^7.17.3, @babel/parser@npm:^7.20.5, @babel/parser@npm:^7.20.7": 101 | version: 7.21.4 102 | resolution: "@babel/parser@npm:7.21.4" 103 | bin: 104 | parser: ./bin/babel-parser.js 105 | checksum: de610ecd1bff331766d0c058023ca11a4f242bfafefc42caf926becccfb6756637d167c001987ca830dd4b34b93c629a4cef63f8c8c864a8564cdfde1989ac77 106 | languageName: node 107 | linkType: hard 108 | 109 | "@babel/template@npm:^7.20.7": 110 | version: 7.20.7 111 | resolution: "@babel/template@npm:7.20.7" 112 | dependencies: 113 | "@babel/code-frame": ^7.18.6 114 | "@babel/parser": ^7.20.7 115 | "@babel/types": ^7.20.7 116 | checksum: 2eb1a0ab8d415078776bceb3473d07ab746e6bb4c2f6ca46ee70efb284d75c4a32bb0cd6f4f4946dec9711f9c0780e8e5d64b743208deac6f8e9858afadc349e 117 | languageName: node 118 | linkType: hard 119 | 120 | "@babel/traverse@npm:7.17.3": 121 | version: 7.17.3 122 | resolution: "@babel/traverse@npm:7.17.3" 123 | dependencies: 124 | "@babel/code-frame": ^7.16.7 125 | "@babel/generator": ^7.17.3 126 | "@babel/helper-environment-visitor": ^7.16.7 127 | "@babel/helper-function-name": ^7.16.7 128 | "@babel/helper-hoist-variables": ^7.16.7 129 | "@babel/helper-split-export-declaration": ^7.16.7 130 | "@babel/parser": ^7.17.3 131 | "@babel/types": ^7.17.0 132 | debug: ^4.1.0 133 | globals: ^11.1.0 134 | checksum: 780d7ecf711758174989794891af08d378f81febdb8932056c0d9979524bf0298e28f8e7708a872d7781151506c28f56c85c63ea3f1f654662c2fcb8a3eb9fdc 135 | languageName: node 136 | linkType: hard 137 | 138 | "@babel/types@npm:7.17.0": 139 | version: 7.17.0 140 | resolution: "@babel/types@npm:7.17.0" 141 | dependencies: 142 | "@babel/helper-validator-identifier": ^7.16.7 143 | to-fast-properties: ^2.0.0 144 | checksum: 12e5a287986fe557188e87b2c5202223f1dc83d9239a196ab936fdb9f8c1eb0be717ff19f934b5fad4e29a75586d5798f74bed209bccea1c20376b9952056f0e 145 | languageName: node 146 | linkType: hard 147 | 148 | "@babel/types@npm:^7.17.0, @babel/types@npm:^7.18.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.4, @babel/types@npm:^7.8.3": 149 | version: 7.21.4 150 | resolution: "@babel/types@npm:7.21.4" 151 | dependencies: 152 | "@babel/helper-string-parser": ^7.19.4 153 | "@babel/helper-validator-identifier": ^7.19.1 154 | to-fast-properties: ^2.0.0 155 | checksum: 587bc55a91ce003b0f8aa10d70070f8006560d7dc0360dc0406d306a2cb2a10154e2f9080b9c37abec76907a90b330a536406cb75e6bdc905484f37b75c73219 156 | languageName: node 157 | linkType: hard 158 | 159 | "@cspotcode/source-map-support@npm:^0.8.0": 160 | version: 0.8.1 161 | resolution: "@cspotcode/source-map-support@npm:0.8.1" 162 | dependencies: 163 | "@jridgewell/trace-mapping": 0.3.9 164 | checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa 165 | languageName: node 166 | linkType: hard 167 | 168 | "@eslint-community/eslint-utils@npm:^4.2.0": 169 | version: 4.4.0 170 | resolution: "@eslint-community/eslint-utils@npm:4.4.0" 171 | dependencies: 172 | eslint-visitor-keys: ^3.3.0 173 | peerDependencies: 174 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 175 | checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 176 | languageName: node 177 | linkType: hard 178 | 179 | "@eslint-community/regexpp@npm:^4.4.0": 180 | version: 4.5.0 181 | resolution: "@eslint-community/regexpp@npm:4.5.0" 182 | checksum: 99c01335947dbd7f2129e954413067e217ccaa4e219fe0917b7d2bd96135789384b8fedbfb8eb09584d5130b27a7b876a7150ab7376f51b3a0c377d5ce026a10 183 | languageName: node 184 | linkType: hard 185 | 186 | "@eslint/eslintrc@npm:^2.0.2": 187 | version: 2.0.2 188 | resolution: "@eslint/eslintrc@npm:2.0.2" 189 | dependencies: 190 | ajv: ^6.12.4 191 | debug: ^4.3.2 192 | espree: ^9.5.1 193 | globals: ^13.19.0 194 | ignore: ^5.2.0 195 | import-fresh: ^3.2.1 196 | js-yaml: ^4.1.0 197 | minimatch: ^3.1.2 198 | strip-json-comments: ^3.1.1 199 | checksum: cfcf5e12c7b2c4476482e7f12434e76eae16fcd163ee627309adb10b761e5caa4a4e52ed7be464423320ff3d11eca5b50de5bf8be3e25834222470835dd5c801 200 | languageName: node 201 | linkType: hard 202 | 203 | "@eslint/js@npm:8.37.0": 204 | version: 8.37.0 205 | resolution: "@eslint/js@npm:8.37.0" 206 | checksum: 7a07fb085c94ce1538949012c292fd3a6cd734f149bc03af6157dfbd8a7477678899ef57b4a27e15b36470a997389ad79a0533d5880c71e67720ae1a7de7c62d 207 | languageName: node 208 | linkType: hard 209 | 210 | "@ethersproject/abi@npm:5.7.0, @ethersproject/abi@npm:^5.7.0": 211 | version: 5.7.0 212 | resolution: "@ethersproject/abi@npm:5.7.0" 213 | dependencies: 214 | "@ethersproject/address": ^5.7.0 215 | "@ethersproject/bignumber": ^5.7.0 216 | "@ethersproject/bytes": ^5.7.0 217 | "@ethersproject/constants": ^5.7.0 218 | "@ethersproject/hash": ^5.7.0 219 | "@ethersproject/keccak256": ^5.7.0 220 | "@ethersproject/logger": ^5.7.0 221 | "@ethersproject/properties": ^5.7.0 222 | "@ethersproject/strings": ^5.7.0 223 | checksum: bc6962bb6cb854e4d2a4d65b2c49c716477675b131b1363312234bdbb7e19badb7d9ce66f4ca2a70ae2ea84f7123dbc4e300a1bfe5d58864a7eafabc1466627e 224 | languageName: node 225 | linkType: hard 226 | 227 | "@ethersproject/abstract-provider@npm:5.7.0, @ethersproject/abstract-provider@npm:^5.7.0": 228 | version: 5.7.0 229 | resolution: "@ethersproject/abstract-provider@npm:5.7.0" 230 | dependencies: 231 | "@ethersproject/bignumber": ^5.7.0 232 | "@ethersproject/bytes": ^5.7.0 233 | "@ethersproject/logger": ^5.7.0 234 | "@ethersproject/networks": ^5.7.0 235 | "@ethersproject/properties": ^5.7.0 236 | "@ethersproject/transactions": ^5.7.0 237 | "@ethersproject/web": ^5.7.0 238 | checksum: 74cf4696245cf03bb7cc5b6cbf7b4b89dd9a79a1c4688126d214153a938126d4972d42c93182198653ce1de35f2a2cad68be40337d4774b3698a39b28f0228a8 239 | languageName: node 240 | linkType: hard 241 | 242 | "@ethersproject/abstract-signer@npm:5.7.0, @ethersproject/abstract-signer@npm:^5.7.0": 243 | version: 5.7.0 244 | resolution: "@ethersproject/abstract-signer@npm:5.7.0" 245 | dependencies: 246 | "@ethersproject/abstract-provider": ^5.7.0 247 | "@ethersproject/bignumber": ^5.7.0 248 | "@ethersproject/bytes": ^5.7.0 249 | "@ethersproject/logger": ^5.7.0 250 | "@ethersproject/properties": ^5.7.0 251 | checksum: a823dac9cfb761e009851050ebebd5b229d1b1cc4a75b125c2da130ff37e8218208f7f9d1386f77407705b889b23d4a230ad67185f8872f083143e0073cbfbe3 252 | languageName: node 253 | linkType: hard 254 | 255 | "@ethersproject/address@npm:5.7.0, @ethersproject/address@npm:^5.7.0": 256 | version: 5.7.0 257 | resolution: "@ethersproject/address@npm:5.7.0" 258 | dependencies: 259 | "@ethersproject/bignumber": ^5.7.0 260 | "@ethersproject/bytes": ^5.7.0 261 | "@ethersproject/keccak256": ^5.7.0 262 | "@ethersproject/logger": ^5.7.0 263 | "@ethersproject/rlp": ^5.7.0 264 | checksum: 64ea5ebea9cc0e845c413e6cb1e54e157dd9fc0dffb98e239d3a3efc8177f2ff798cd4e3206cf3660ee8faeb7bef1a47dc0ebef0d7b132c32e61e550c7d4c843 265 | languageName: node 266 | linkType: hard 267 | 268 | "@ethersproject/base64@npm:5.7.0, @ethersproject/base64@npm:^5.7.0": 269 | version: 5.7.0 270 | resolution: "@ethersproject/base64@npm:5.7.0" 271 | dependencies: 272 | "@ethersproject/bytes": ^5.7.0 273 | checksum: 7dd5d734d623582f08f665434f53685041a3d3b334a0e96c0c8afa8bbcaab934d50e5b6b980e826a8fde8d353e0b18f11e61faf17468177274b8e7c69cd9742b 274 | languageName: node 275 | linkType: hard 276 | 277 | "@ethersproject/basex@npm:5.7.0, @ethersproject/basex@npm:^5.7.0": 278 | version: 5.7.0 279 | resolution: "@ethersproject/basex@npm:5.7.0" 280 | dependencies: 281 | "@ethersproject/bytes": ^5.7.0 282 | "@ethersproject/properties": ^5.7.0 283 | checksum: 326087b7e1f3787b5fe6cd1cf2b4b5abfafbc355a45e88e22e5e9d6c845b613ffc5301d629b28d5c4d5e2bfe9ec424e6782c804956dff79be05f0098cb5817de 284 | languageName: node 285 | linkType: hard 286 | 287 | "@ethersproject/bignumber@npm:5.7.0, @ethersproject/bignumber@npm:^5.7.0": 288 | version: 5.7.0 289 | resolution: "@ethersproject/bignumber@npm:5.7.0" 290 | dependencies: 291 | "@ethersproject/bytes": ^5.7.0 292 | "@ethersproject/logger": ^5.7.0 293 | bn.js: ^5.2.1 294 | checksum: 8c9a134b76f3feb4ec26a5a27379efb4e156b8fb2de0678a67788a91c7f4e30abe9d948638458e4b20f2e42380da0adacc7c9389d05fce070692edc6ae9b4904 295 | languageName: node 296 | linkType: hard 297 | 298 | "@ethersproject/bytes@npm:5.7.0, @ethersproject/bytes@npm:^5.7.0": 299 | version: 5.7.0 300 | resolution: "@ethersproject/bytes@npm:5.7.0" 301 | dependencies: 302 | "@ethersproject/logger": ^5.7.0 303 | checksum: 66ad365ceaab5da1b23b72225c71dce472cf37737af5118181fa8ab7447d696bea15ca22e3a0e8836fdd8cfac161afe321a7c67d0dde96f9f645ddd759676621 304 | languageName: node 305 | linkType: hard 306 | 307 | "@ethersproject/constants@npm:5.7.0, @ethersproject/constants@npm:^5.7.0": 308 | version: 5.7.0 309 | resolution: "@ethersproject/constants@npm:5.7.0" 310 | dependencies: 311 | "@ethersproject/bignumber": ^5.7.0 312 | checksum: 6d4b1355747cce837b3e76ec3bde70e4732736f23b04f196f706ebfa5d4d9c2be50904a390d4d40ce77803b98d03d16a9b6898418e04ba63491933ce08c4ba8a 313 | languageName: node 314 | linkType: hard 315 | 316 | "@ethersproject/contracts@npm:5.7.0": 317 | version: 5.7.0 318 | resolution: "@ethersproject/contracts@npm:5.7.0" 319 | dependencies: 320 | "@ethersproject/abi": ^5.7.0 321 | "@ethersproject/abstract-provider": ^5.7.0 322 | "@ethersproject/abstract-signer": ^5.7.0 323 | "@ethersproject/address": ^5.7.0 324 | "@ethersproject/bignumber": ^5.7.0 325 | "@ethersproject/bytes": ^5.7.0 326 | "@ethersproject/constants": ^5.7.0 327 | "@ethersproject/logger": ^5.7.0 328 | "@ethersproject/properties": ^5.7.0 329 | "@ethersproject/transactions": ^5.7.0 330 | checksum: 6ccf1121cba01b31e02f8c507cb971ab6bfed85706484a9ec09878ef1594a62215f43c4fdef8f4a4875b99c4a800bc95e3be69b1803f8ce479e07634b5a740c0 331 | languageName: node 332 | linkType: hard 333 | 334 | "@ethersproject/hash@npm:5.7.0, @ethersproject/hash@npm:^5.7.0": 335 | version: 5.7.0 336 | resolution: "@ethersproject/hash@npm:5.7.0" 337 | dependencies: 338 | "@ethersproject/abstract-signer": ^5.7.0 339 | "@ethersproject/address": ^5.7.0 340 | "@ethersproject/base64": ^5.7.0 341 | "@ethersproject/bignumber": ^5.7.0 342 | "@ethersproject/bytes": ^5.7.0 343 | "@ethersproject/keccak256": ^5.7.0 344 | "@ethersproject/logger": ^5.7.0 345 | "@ethersproject/properties": ^5.7.0 346 | "@ethersproject/strings": ^5.7.0 347 | checksum: 6e9fa8d14eb08171cd32f17f98cc108ec2aeca74a427655f0d689c550fee0b22a83b3b400fad7fb3f41cf14d4111f87f170aa7905bcbcd1173a55f21b06262ef 348 | languageName: node 349 | linkType: hard 350 | 351 | "@ethersproject/hdnode@npm:5.7.0, @ethersproject/hdnode@npm:^5.7.0": 352 | version: 5.7.0 353 | resolution: "@ethersproject/hdnode@npm:5.7.0" 354 | dependencies: 355 | "@ethersproject/abstract-signer": ^5.7.0 356 | "@ethersproject/basex": ^5.7.0 357 | "@ethersproject/bignumber": ^5.7.0 358 | "@ethersproject/bytes": ^5.7.0 359 | "@ethersproject/logger": ^5.7.0 360 | "@ethersproject/pbkdf2": ^5.7.0 361 | "@ethersproject/properties": ^5.7.0 362 | "@ethersproject/sha2": ^5.7.0 363 | "@ethersproject/signing-key": ^5.7.0 364 | "@ethersproject/strings": ^5.7.0 365 | "@ethersproject/transactions": ^5.7.0 366 | "@ethersproject/wordlists": ^5.7.0 367 | checksum: bfe5ca2d89a42de73655f853170ef4766b933c5f481cddad709b3aca18823275b096e572f92d1602a052f80b426edde44ad6b9d028799775a7dad4a5bbed2133 368 | languageName: node 369 | linkType: hard 370 | 371 | "@ethersproject/json-wallets@npm:5.7.0, @ethersproject/json-wallets@npm:^5.7.0": 372 | version: 5.7.0 373 | resolution: "@ethersproject/json-wallets@npm:5.7.0" 374 | dependencies: 375 | "@ethersproject/abstract-signer": ^5.7.0 376 | "@ethersproject/address": ^5.7.0 377 | "@ethersproject/bytes": ^5.7.0 378 | "@ethersproject/hdnode": ^5.7.0 379 | "@ethersproject/keccak256": ^5.7.0 380 | "@ethersproject/logger": ^5.7.0 381 | "@ethersproject/pbkdf2": ^5.7.0 382 | "@ethersproject/properties": ^5.7.0 383 | "@ethersproject/random": ^5.7.0 384 | "@ethersproject/strings": ^5.7.0 385 | "@ethersproject/transactions": ^5.7.0 386 | aes-js: 3.0.0 387 | scrypt-js: 3.0.1 388 | checksum: f583458d22db62efaaf94d38dd243482776a45bf90f9f3882fbad5aa0b8fd288b41eb7c1ff8ec0b99c9b751088e43d6173530db64dd33c59f9d8daa8d7ad5aa2 389 | languageName: node 390 | linkType: hard 391 | 392 | "@ethersproject/keccak256@npm:5.7.0, @ethersproject/keccak256@npm:^5.7.0": 393 | version: 5.7.0 394 | resolution: "@ethersproject/keccak256@npm:5.7.0" 395 | dependencies: 396 | "@ethersproject/bytes": ^5.7.0 397 | js-sha3: 0.8.0 398 | checksum: ff70950d82203aab29ccda2553422cbac2e7a0c15c986bd20a69b13606ed8bb6e4fdd7b67b8d3b27d4f841e8222cbaccd33ed34be29f866fec7308f96ed244c6 399 | languageName: node 400 | linkType: hard 401 | 402 | "@ethersproject/logger@npm:5.7.0, @ethersproject/logger@npm:^5.7.0": 403 | version: 5.7.0 404 | resolution: "@ethersproject/logger@npm:5.7.0" 405 | checksum: 075ab2f605f1fd0813f2e39c3308f77b44a67732b36e712d9bc085f22a84aac4da4f71b39bee50fe78da3e1c812673fadc41180c9970fe5e486e91ea17befe0d 406 | languageName: node 407 | linkType: hard 408 | 409 | "@ethersproject/networks@npm:5.7.1, @ethersproject/networks@npm:^5.7.0": 410 | version: 5.7.1 411 | resolution: "@ethersproject/networks@npm:5.7.1" 412 | dependencies: 413 | "@ethersproject/logger": ^5.7.0 414 | checksum: 0339f312304c17d9a0adce550edb825d4d2c8c9468c1634c44172c67a9ed256f594da62c4cda5c3837a0f28b7fabc03aca9b492f68ff1fdad337ee861b27bd5d 415 | languageName: node 416 | linkType: hard 417 | 418 | "@ethersproject/pbkdf2@npm:5.7.0, @ethersproject/pbkdf2@npm:^5.7.0": 419 | version: 5.7.0 420 | resolution: "@ethersproject/pbkdf2@npm:5.7.0" 421 | dependencies: 422 | "@ethersproject/bytes": ^5.7.0 423 | "@ethersproject/sha2": ^5.7.0 424 | checksum: b895adb9e35a8a127e794f7aadc31a2424ef355a70e51cde10d457e3e888bb8102373199a540cf61f2d6b9a32e47358f9c65b47d559f42bf8e596b5fd67901e9 425 | languageName: node 426 | linkType: hard 427 | 428 | "@ethersproject/properties@npm:5.7.0, @ethersproject/properties@npm:^5.7.0": 429 | version: 5.7.0 430 | resolution: "@ethersproject/properties@npm:5.7.0" 431 | dependencies: 432 | "@ethersproject/logger": ^5.7.0 433 | checksum: 6ab0ccf0c3aadc9221e0cdc5306ce6cd0df7f89f77d77bccdd1277182c9ead0202cd7521329ba3acde130820bf8af299e17cf567d0d497c736ee918207bbf59f 434 | languageName: node 435 | linkType: hard 436 | 437 | "@ethersproject/providers@npm:5.7.2": 438 | version: 5.7.2 439 | resolution: "@ethersproject/providers@npm:5.7.2" 440 | dependencies: 441 | "@ethersproject/abstract-provider": ^5.7.0 442 | "@ethersproject/abstract-signer": ^5.7.0 443 | "@ethersproject/address": ^5.7.0 444 | "@ethersproject/base64": ^5.7.0 445 | "@ethersproject/basex": ^5.7.0 446 | "@ethersproject/bignumber": ^5.7.0 447 | "@ethersproject/bytes": ^5.7.0 448 | "@ethersproject/constants": ^5.7.0 449 | "@ethersproject/hash": ^5.7.0 450 | "@ethersproject/logger": ^5.7.0 451 | "@ethersproject/networks": ^5.7.0 452 | "@ethersproject/properties": ^5.7.0 453 | "@ethersproject/random": ^5.7.0 454 | "@ethersproject/rlp": ^5.7.0 455 | "@ethersproject/sha2": ^5.7.0 456 | "@ethersproject/strings": ^5.7.0 457 | "@ethersproject/transactions": ^5.7.0 458 | "@ethersproject/web": ^5.7.0 459 | bech32: 1.1.4 460 | ws: 7.4.6 461 | checksum: 1754c731a5ca6782ae9677f4a9cd8b6246c4ef21a966c9a01b133750f3c578431ec43ec254e699969c4a0f87e84463ded50f96b415600aabd37d2056aee58c19 462 | languageName: node 463 | linkType: hard 464 | 465 | "@ethersproject/random@npm:5.7.0, @ethersproject/random@npm:^5.7.0": 466 | version: 5.7.0 467 | resolution: "@ethersproject/random@npm:5.7.0" 468 | dependencies: 469 | "@ethersproject/bytes": ^5.7.0 470 | "@ethersproject/logger": ^5.7.0 471 | checksum: 017829c91cff6c76470852855108115b0b52c611b6be817ed1948d56ba42d6677803ec2012aa5ae298a7660024156a64c11fcf544e235e239ab3f89f0fff7345 472 | languageName: node 473 | linkType: hard 474 | 475 | "@ethersproject/rlp@npm:5.7.0, @ethersproject/rlp@npm:^5.7.0": 476 | version: 5.7.0 477 | resolution: "@ethersproject/rlp@npm:5.7.0" 478 | dependencies: 479 | "@ethersproject/bytes": ^5.7.0 480 | "@ethersproject/logger": ^5.7.0 481 | checksum: bce165b0f7e68e4d091c9d3cf47b247cac33252df77a095ca4281d32d5eeaaa3695d9bc06b2b057c5015353a68df89f13a4a54a72e888e4beeabbe56b15dda6e 482 | languageName: node 483 | linkType: hard 484 | 485 | "@ethersproject/sha2@npm:5.7.0, @ethersproject/sha2@npm:^5.7.0": 486 | version: 5.7.0 487 | resolution: "@ethersproject/sha2@npm:5.7.0" 488 | dependencies: 489 | "@ethersproject/bytes": ^5.7.0 490 | "@ethersproject/logger": ^5.7.0 491 | hash.js: 1.1.7 492 | checksum: 09321057c022effbff4cc2d9b9558228690b5dd916329d75c4b1ffe32ba3d24b480a367a7cc92d0f0c0b1c896814d03351ae4630e2f1f7160be2bcfbde435dbc 493 | languageName: node 494 | linkType: hard 495 | 496 | "@ethersproject/signing-key@npm:5.7.0, @ethersproject/signing-key@npm:^5.7.0": 497 | version: 5.7.0 498 | resolution: "@ethersproject/signing-key@npm:5.7.0" 499 | dependencies: 500 | "@ethersproject/bytes": ^5.7.0 501 | "@ethersproject/logger": ^5.7.0 502 | "@ethersproject/properties": ^5.7.0 503 | bn.js: ^5.2.1 504 | elliptic: 6.5.4 505 | hash.js: 1.1.7 506 | checksum: 8f8de09b0aac709683bbb49339bc0a4cd2f95598f3546436c65d6f3c3a847ffa98e06d35e9ed2b17d8030bd2f02db9b7bd2e11c5cf8a71aad4537487ab4cf03a 507 | languageName: node 508 | linkType: hard 509 | 510 | "@ethersproject/solidity@npm:5.7.0": 511 | version: 5.7.0 512 | resolution: "@ethersproject/solidity@npm:5.7.0" 513 | dependencies: 514 | "@ethersproject/bignumber": ^5.7.0 515 | "@ethersproject/bytes": ^5.7.0 516 | "@ethersproject/keccak256": ^5.7.0 517 | "@ethersproject/logger": ^5.7.0 518 | "@ethersproject/sha2": ^5.7.0 519 | "@ethersproject/strings": ^5.7.0 520 | checksum: 9a02f37f801c96068c3e7721f83719d060175bc4e80439fe060e92bd7acfcb6ac1330c7e71c49f4c2535ca1308f2acdcb01e00133129aac00581724c2d6293f3 521 | languageName: node 522 | linkType: hard 523 | 524 | "@ethersproject/strings@npm:5.7.0, @ethersproject/strings@npm:^5.7.0": 525 | version: 5.7.0 526 | resolution: "@ethersproject/strings@npm:5.7.0" 527 | dependencies: 528 | "@ethersproject/bytes": ^5.7.0 529 | "@ethersproject/constants": ^5.7.0 530 | "@ethersproject/logger": ^5.7.0 531 | checksum: 5ff78693ae3fdf3cf23e1f6dc047a61e44c8197d2408c42719fef8cb7b7b3613a4eec88ac0ed1f9f5558c74fe0de7ae3195a29ca91a239c74b9f444d8e8b50df 532 | languageName: node 533 | linkType: hard 534 | 535 | "@ethersproject/transactions@npm:5.7.0, @ethersproject/transactions@npm:^5.7.0": 536 | version: 5.7.0 537 | resolution: "@ethersproject/transactions@npm:5.7.0" 538 | dependencies: 539 | "@ethersproject/address": ^5.7.0 540 | "@ethersproject/bignumber": ^5.7.0 541 | "@ethersproject/bytes": ^5.7.0 542 | "@ethersproject/constants": ^5.7.0 543 | "@ethersproject/keccak256": ^5.7.0 544 | "@ethersproject/logger": ^5.7.0 545 | "@ethersproject/properties": ^5.7.0 546 | "@ethersproject/rlp": ^5.7.0 547 | "@ethersproject/signing-key": ^5.7.0 548 | checksum: a31b71996d2b283f68486241bff0d3ea3f1ba0e8f1322a8fffc239ccc4f4a7eb2ea9994b8fd2f093283fd75f87bae68171e01b6265261f821369aca319884a79 549 | languageName: node 550 | linkType: hard 551 | 552 | "@ethersproject/units@npm:5.7.0": 553 | version: 5.7.0 554 | resolution: "@ethersproject/units@npm:5.7.0" 555 | dependencies: 556 | "@ethersproject/bignumber": ^5.7.0 557 | "@ethersproject/constants": ^5.7.0 558 | "@ethersproject/logger": ^5.7.0 559 | checksum: 304714f848cd32e57df31bf545f7ad35c2a72adae957198b28cbc62166daa929322a07bff6e9c9ac4577ab6aa0de0546b065ed1b2d20b19e25748b7d475cb0fc 560 | languageName: node 561 | linkType: hard 562 | 563 | "@ethersproject/wallet@npm:5.7.0": 564 | version: 5.7.0 565 | resolution: "@ethersproject/wallet@npm:5.7.0" 566 | dependencies: 567 | "@ethersproject/abstract-provider": ^5.7.0 568 | "@ethersproject/abstract-signer": ^5.7.0 569 | "@ethersproject/address": ^5.7.0 570 | "@ethersproject/bignumber": ^5.7.0 571 | "@ethersproject/bytes": ^5.7.0 572 | "@ethersproject/hash": ^5.7.0 573 | "@ethersproject/hdnode": ^5.7.0 574 | "@ethersproject/json-wallets": ^5.7.0 575 | "@ethersproject/keccak256": ^5.7.0 576 | "@ethersproject/logger": ^5.7.0 577 | "@ethersproject/properties": ^5.7.0 578 | "@ethersproject/random": ^5.7.0 579 | "@ethersproject/signing-key": ^5.7.0 580 | "@ethersproject/transactions": ^5.7.0 581 | "@ethersproject/wordlists": ^5.7.0 582 | checksum: a4009bf7331eddab38e3015b5e9101ef92de7f705b00a6196b997db0e5635b6d83561674d46c90c6f77b87c0500fe4a6b0183ba13749efc22db59c99deb82fbd 583 | languageName: node 584 | linkType: hard 585 | 586 | "@ethersproject/web@npm:5.7.1, @ethersproject/web@npm:^5.7.0": 587 | version: 5.7.1 588 | resolution: "@ethersproject/web@npm:5.7.1" 589 | dependencies: 590 | "@ethersproject/base64": ^5.7.0 591 | "@ethersproject/bytes": ^5.7.0 592 | "@ethersproject/logger": ^5.7.0 593 | "@ethersproject/properties": ^5.7.0 594 | "@ethersproject/strings": ^5.7.0 595 | checksum: 7028c47103f82fd2e2c197ce0eecfacaa9180ffeec7de7845b1f4f9b19d84081b7a48227aaddde05a4aaa526af574a9a0ce01cc0fc75e3e371f84b38b5b16b2b 596 | languageName: node 597 | linkType: hard 598 | 599 | "@ethersproject/wordlists@npm:5.7.0, @ethersproject/wordlists@npm:^5.7.0": 600 | version: 5.7.0 601 | resolution: "@ethersproject/wordlists@npm:5.7.0" 602 | dependencies: 603 | "@ethersproject/bytes": ^5.7.0 604 | "@ethersproject/hash": ^5.7.0 605 | "@ethersproject/logger": ^5.7.0 606 | "@ethersproject/properties": ^5.7.0 607 | "@ethersproject/strings": ^5.7.0 608 | checksum: 30eb6eb0731f9ef5faa44bf9c0c6e950bcaaef61e4d2d9ce0ae6d341f4e2d6d1f4ab4f8880bfce03b7aac4b862fb740e1421170cfbf8e2aafc359277d49e6e97 609 | languageName: node 610 | linkType: hard 611 | 612 | "@humanwhocodes/config-array@npm:^0.11.8": 613 | version: 0.11.8 614 | resolution: "@humanwhocodes/config-array@npm:0.11.8" 615 | dependencies: 616 | "@humanwhocodes/object-schema": ^1.2.1 617 | debug: ^4.1.1 618 | minimatch: ^3.0.5 619 | checksum: 0fd6b3c54f1674ce0a224df09b9c2f9846d20b9e54fabae1281ecfc04f2e6ad69bf19e1d6af6a28f88e8aa3990168b6cb9e1ef755868c3256a630605ec2cb1d3 620 | languageName: node 621 | linkType: hard 622 | 623 | "@humanwhocodes/module-importer@npm:^1.0.1": 624 | version: 1.0.1 625 | resolution: "@humanwhocodes/module-importer@npm:1.0.1" 626 | checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 627 | languageName: node 628 | linkType: hard 629 | 630 | "@humanwhocodes/object-schema@npm:^1.2.1": 631 | version: 1.2.1 632 | resolution: "@humanwhocodes/object-schema@npm:1.2.1" 633 | checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 634 | languageName: node 635 | linkType: hard 636 | 637 | "@hyperlane-xyz/core@npm:1.4.2": 638 | version: 1.4.2 639 | resolution: "@hyperlane-xyz/core@npm:1.4.2" 640 | dependencies: 641 | "@hyperlane-xyz/utils": 1.4.2 642 | "@openzeppelin/contracts": ^4.8.0 643 | "@openzeppelin/contracts-upgradeable": ^4.8.0 644 | checksum: 2c85c752cdaae1603a7f5a6879dbd9477aee6c7a480f91d1649056fa13d14e4a6830dcc488ee398b8c0575cd752f7d6d6701805cd4d978e22425b282eac03431 645 | languageName: node 646 | linkType: hard 647 | 648 | "@hyperlane-xyz/deploy@workspace:.": 649 | version: 0.0.0-use.local 650 | resolution: "@hyperlane-xyz/deploy@workspace:." 651 | dependencies: 652 | "@hyperlane-xyz/hyperlane-token": 1.4.2 653 | "@hyperlane-xyz/sdk": 1.4.2 654 | "@trivago/prettier-plugin-sort-imports": ^4.1.1 655 | "@types/node": ^18.14.5 656 | "@types/yargs": ^17.0.22 657 | "@typescript-eslint/eslint-plugin": ^5.57.1 658 | "@typescript-eslint/parser": ^5.57.1 659 | eslint: ^8.37.0 660 | eslint-config-prettier: ^8.8.0 661 | ethers: ^5.7.2 662 | prettier: ^2.8.2 663 | ts-node: ^10.9.1 664 | typescript: ^4.9.5 665 | yargs: ^17.7.1 666 | zod: ^3.21.4 667 | languageName: unknown 668 | linkType: soft 669 | 670 | "@hyperlane-xyz/hyperlane-token@npm:1.4.2": 671 | version: 1.4.2 672 | resolution: "@hyperlane-xyz/hyperlane-token@npm:1.4.2" 673 | dependencies: 674 | "@hyperlane-xyz/core": 1.4.2 675 | "@hyperlane-xyz/sdk": 1.4.2 676 | "@hyperlane-xyz/utils": 1.4.2 677 | "@openzeppelin/contracts-upgradeable": ^4.8.0 678 | ethers: ^5.7.2 679 | checksum: dffdf248090fac08b1d5a34915d32fb57307a7e61a29bce440be700cf585a98dc8d02389141af28bf1e321e6367dc85736a7530a6e7ad1a305d4fdf0af916b29 680 | languageName: node 681 | linkType: hard 682 | 683 | "@hyperlane-xyz/sdk@npm:1.4.2": 684 | version: 1.4.2 685 | resolution: "@hyperlane-xyz/sdk@npm:1.4.2" 686 | dependencies: 687 | "@hyperlane-xyz/core": 1.4.2 688 | "@hyperlane-xyz/utils": 1.4.2 689 | "@types/coingecko-api": ^1.0.10 690 | "@types/debug": ^4.1.7 691 | "@wagmi/chains": ^0.2.6 692 | coingecko-api: ^1.0.10 693 | cross-fetch: ^3.1.5 694 | debug: ^4.3.4 695 | ethers: ^5.7.2 696 | zod: ^3.21.2 697 | checksum: 1ba8d77d17da78bcde8a2e3c85d7a4024d5ab812c8c0caf25ab0316d27a34c32712944e94babf81ac3a2d0b1bf06eb200902919a0e5e456cc0ab3f3ceea42dd3 698 | languageName: node 699 | linkType: hard 700 | 701 | "@hyperlane-xyz/utils@npm:1.4.2": 702 | version: 1.4.2 703 | resolution: "@hyperlane-xyz/utils@npm:1.4.2" 704 | dependencies: 705 | ethers: ^5.7.2 706 | checksum: e91d2684856d803824beba912d4d65e21009f6e402571adcc7dd0f0b8f43b11eaa8448f1b11958ffa76178f48794017d4d466bdf909dd9d3698b9eee45df9116 707 | languageName: node 708 | linkType: hard 709 | 710 | "@jridgewell/gen-mapping@npm:^0.3.2": 711 | version: 0.3.2 712 | resolution: "@jridgewell/gen-mapping@npm:0.3.2" 713 | dependencies: 714 | "@jridgewell/set-array": ^1.0.1 715 | "@jridgewell/sourcemap-codec": ^1.4.10 716 | "@jridgewell/trace-mapping": ^0.3.9 717 | checksum: 1832707a1c476afebe4d0fbbd4b9434fdb51a4c3e009ab1e9938648e21b7a97049fa6009393bdf05cab7504108413441df26d8a3c12193996e65493a4efb6882 718 | languageName: node 719 | linkType: hard 720 | 721 | "@jridgewell/resolve-uri@npm:3.1.0, @jridgewell/resolve-uri@npm:^3.0.3": 722 | version: 3.1.0 723 | resolution: "@jridgewell/resolve-uri@npm:3.1.0" 724 | checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 725 | languageName: node 726 | linkType: hard 727 | 728 | "@jridgewell/set-array@npm:^1.0.1": 729 | version: 1.1.2 730 | resolution: "@jridgewell/set-array@npm:1.1.2" 731 | checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e 732 | languageName: node 733 | linkType: hard 734 | 735 | "@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": 736 | version: 1.4.14 737 | resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" 738 | checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 739 | languageName: node 740 | linkType: hard 741 | 742 | "@jridgewell/trace-mapping@npm:0.3.9": 743 | version: 0.3.9 744 | resolution: "@jridgewell/trace-mapping@npm:0.3.9" 745 | dependencies: 746 | "@jridgewell/resolve-uri": ^3.0.3 747 | "@jridgewell/sourcemap-codec": ^1.4.10 748 | checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef 749 | languageName: node 750 | linkType: hard 751 | 752 | "@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": 753 | version: 0.3.17 754 | resolution: "@jridgewell/trace-mapping@npm:0.3.17" 755 | dependencies: 756 | "@jridgewell/resolve-uri": 3.1.0 757 | "@jridgewell/sourcemap-codec": 1.4.14 758 | checksum: 9d703b859cff5cd83b7308fd457a431387db5db96bd781a63bf48e183418dd9d3d44e76b9e4ae13237f6abeeb25d739ec9215c1d5bfdd08f66f750a50074a339 759 | languageName: node 760 | linkType: hard 761 | 762 | "@nodelib/fs.scandir@npm:2.1.5": 763 | version: 2.1.5 764 | resolution: "@nodelib/fs.scandir@npm:2.1.5" 765 | dependencies: 766 | "@nodelib/fs.stat": 2.0.5 767 | run-parallel: ^1.1.9 768 | checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 769 | languageName: node 770 | linkType: hard 771 | 772 | "@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": 773 | version: 2.0.5 774 | resolution: "@nodelib/fs.stat@npm:2.0.5" 775 | checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 776 | languageName: node 777 | linkType: hard 778 | 779 | "@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": 780 | version: 1.2.8 781 | resolution: "@nodelib/fs.walk@npm:1.2.8" 782 | dependencies: 783 | "@nodelib/fs.scandir": 2.1.5 784 | fastq: ^1.6.0 785 | checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 786 | languageName: node 787 | linkType: hard 788 | 789 | "@openzeppelin/contracts-upgradeable@npm:^4.8.0": 790 | version: 4.8.0 791 | resolution: "@openzeppelin/contracts-upgradeable@npm:4.8.0" 792 | checksum: c39f3a719830c068d0ae413a8beee4072fa19f777b55bf6155fe21023414eab0633a641318845ac50929837b71848de1efbd00d4c181ddd6d8b735ceb0a82070 793 | languageName: node 794 | linkType: hard 795 | 796 | "@openzeppelin/contracts@npm:^4.8.0": 797 | version: 4.8.0 798 | resolution: "@openzeppelin/contracts@npm:4.8.0" 799 | checksum: dfab51a7f91735cfb1e94dd5074736b0dac0207e4ebf26eb46b32defd3b67adce5a36b248daa7b841c21be74863c1e37cf92ed194a9c36d3f8c5326d1a24242a 800 | languageName: node 801 | linkType: hard 802 | 803 | "@trivago/prettier-plugin-sort-imports@npm:^4.1.1": 804 | version: 4.1.1 805 | resolution: "@trivago/prettier-plugin-sort-imports@npm:4.1.1" 806 | dependencies: 807 | "@babel/generator": 7.17.7 808 | "@babel/parser": ^7.20.5 809 | "@babel/traverse": 7.17.3 810 | "@babel/types": 7.17.0 811 | javascript-natural-sort: 0.7.1 812 | lodash: ^4.17.21 813 | peerDependencies: 814 | "@vue/compiler-sfc": 3.x 815 | prettier: 2.x 816 | peerDependenciesMeta: 817 | "@vue/compiler-sfc": 818 | optional: true 819 | checksum: 09b4c3c3f4a9e7883737acf92ae7f2a59eb3f7a6f104621a883bdb2a962dcf98398891489267a6fdbba1227a3484676f8d7470e1b3bc6422b4f457382fd030ce 820 | languageName: node 821 | linkType: hard 822 | 823 | "@tsconfig/node10@npm:^1.0.7": 824 | version: 1.0.9 825 | resolution: "@tsconfig/node10@npm:1.0.9" 826 | checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df 827 | languageName: node 828 | linkType: hard 829 | 830 | "@tsconfig/node12@npm:^1.0.7": 831 | version: 1.0.11 832 | resolution: "@tsconfig/node12@npm:1.0.11" 833 | checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a 834 | languageName: node 835 | linkType: hard 836 | 837 | "@tsconfig/node14@npm:^1.0.0": 838 | version: 1.0.3 839 | resolution: "@tsconfig/node14@npm:1.0.3" 840 | checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d 841 | languageName: node 842 | linkType: hard 843 | 844 | "@tsconfig/node16@npm:^1.0.2": 845 | version: 1.0.3 846 | resolution: "@tsconfig/node16@npm:1.0.3" 847 | checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f 848 | languageName: node 849 | linkType: hard 850 | 851 | "@types/coingecko-api@npm:^1.0.10": 852 | version: 1.0.10 853 | resolution: "@types/coingecko-api@npm:1.0.10" 854 | checksum: e9683f9ea9ce2f855f6565089981dd3fceb6c4674365438f3fc3877d089a2fb82cdea011b59d59c7baa1635dc610860cd29a10a4b7a650ff96521ead46f22a50 855 | languageName: node 856 | linkType: hard 857 | 858 | "@types/debug@npm:^4.1.7": 859 | version: 4.1.7 860 | resolution: "@types/debug@npm:4.1.7" 861 | dependencies: 862 | "@types/ms": "*" 863 | checksum: 0a7b89d8ed72526858f0b61c6fd81f477853e8c4415bb97f48b1b5545248d2ae389931680b94b393b993a7cfe893537a200647d93defe6d87159b96812305adc 864 | languageName: node 865 | linkType: hard 866 | 867 | "@types/json-schema@npm:^7.0.9": 868 | version: 7.0.11 869 | resolution: "@types/json-schema@npm:7.0.11" 870 | checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d 871 | languageName: node 872 | linkType: hard 873 | 874 | "@types/ms@npm:*": 875 | version: 0.7.31 876 | resolution: "@types/ms@npm:0.7.31" 877 | checksum: daadd354aedde024cce6f5aa873fefe7b71b22cd0e28632a69e8b677aeb48ae8caa1c60e5919bb781df040d116b01cb4316335167a3fc0ef6a63fa3614c0f6da 878 | languageName: node 879 | linkType: hard 880 | 881 | "@types/node@npm:^18.14.5": 882 | version: 18.15.11 883 | resolution: "@types/node@npm:18.15.11" 884 | checksum: 977b4ad04708897ff0eb049ecf82246d210939c82461922d20f7d2dcfd81bbc661582ba3af28869210f7e8b1934529dcd46bff7d448551400f9d48b9d3bddec3 885 | languageName: node 886 | linkType: hard 887 | 888 | "@types/semver@npm:^7.3.12": 889 | version: 7.3.13 890 | resolution: "@types/semver@npm:7.3.13" 891 | checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 892 | languageName: node 893 | linkType: hard 894 | 895 | "@types/yargs-parser@npm:*": 896 | version: 21.0.0 897 | resolution: "@types/yargs-parser@npm:21.0.0" 898 | checksum: b2f4c8d12ac18a567440379909127cf2cec393daffb73f246d0a25df36ea983b93b7e9e824251f959e9f928cbc7c1aab6728d0a0ff15d6145f66cec2be67d9a2 899 | languageName: node 900 | linkType: hard 901 | 902 | "@types/yargs@npm:^17.0.22": 903 | version: 17.0.24 904 | resolution: "@types/yargs@npm:17.0.24" 905 | dependencies: 906 | "@types/yargs-parser": "*" 907 | checksum: 5f3ac4dc4f6e211c1627340160fbe2fd247ceba002190da6cf9155af1798450501d628c9165a183f30a224fc68fa5e700490d740ff4c73e2cdef95bc4e8ba7bf 908 | languageName: node 909 | linkType: hard 910 | 911 | "@typescript-eslint/eslint-plugin@npm:^5.57.1": 912 | version: 5.57.1 913 | resolution: "@typescript-eslint/eslint-plugin@npm:5.57.1" 914 | dependencies: 915 | "@eslint-community/regexpp": ^4.4.0 916 | "@typescript-eslint/scope-manager": 5.57.1 917 | "@typescript-eslint/type-utils": 5.57.1 918 | "@typescript-eslint/utils": 5.57.1 919 | debug: ^4.3.4 920 | grapheme-splitter: ^1.0.4 921 | ignore: ^5.2.0 922 | natural-compare-lite: ^1.4.0 923 | semver: ^7.3.7 924 | tsutils: ^3.21.0 925 | peerDependencies: 926 | "@typescript-eslint/parser": ^5.0.0 927 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 928 | peerDependenciesMeta: 929 | typescript: 930 | optional: true 931 | checksum: 3ea842ef9615e298e28c6687c4dc285577ea0995944410553b3ca514ce9d437534b6e89114e9398c1a370324afe7a4a251c8c49540bb3bf13dcadde9ada3ecc2 932 | languageName: node 933 | linkType: hard 934 | 935 | "@typescript-eslint/parser@npm:^5.57.1": 936 | version: 5.57.1 937 | resolution: "@typescript-eslint/parser@npm:5.57.1" 938 | dependencies: 939 | "@typescript-eslint/scope-manager": 5.57.1 940 | "@typescript-eslint/types": 5.57.1 941 | "@typescript-eslint/typescript-estree": 5.57.1 942 | debug: ^4.3.4 943 | peerDependencies: 944 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 945 | peerDependenciesMeta: 946 | typescript: 947 | optional: true 948 | checksum: db61a12a67bc45d814297e7f089768c0849f18162b330279aa15121223ec3b18d80df4c327f4ca0a40a7bddb9150ba1a9379fce00bc0e4a10cc189d04e36f0e3 949 | languageName: node 950 | linkType: hard 951 | 952 | "@typescript-eslint/scope-manager@npm:5.57.1": 953 | version: 5.57.1 954 | resolution: "@typescript-eslint/scope-manager@npm:5.57.1" 955 | dependencies: 956 | "@typescript-eslint/types": 5.57.1 957 | "@typescript-eslint/visitor-keys": 5.57.1 958 | checksum: 4f03d54372f0591fbc5f6e0267a6f1b73e3012e8a319c1893829e0b8e71f882e17a696995dc8b11e700162daf74444fd2d8f55dba314e1a95221a9d3eabcfb2b 959 | languageName: node 960 | linkType: hard 961 | 962 | "@typescript-eslint/type-utils@npm:5.57.1": 963 | version: 5.57.1 964 | resolution: "@typescript-eslint/type-utils@npm:5.57.1" 965 | dependencies: 966 | "@typescript-eslint/typescript-estree": 5.57.1 967 | "@typescript-eslint/utils": 5.57.1 968 | debug: ^4.3.4 969 | tsutils: ^3.21.0 970 | peerDependencies: 971 | eslint: "*" 972 | peerDependenciesMeta: 973 | typescript: 974 | optional: true 975 | checksum: 06fab95315fc1ffdaaa011e6ec1ae538826ef3d9b422e2c926dbe9b83e55d9e8bdaa07c43317a4c0a59b40a24c5c48a7c8284e6a18780475a65894b1b949fc23 976 | languageName: node 977 | linkType: hard 978 | 979 | "@typescript-eslint/types@npm:5.57.1": 980 | version: 5.57.1 981 | resolution: "@typescript-eslint/types@npm:5.57.1" 982 | checksum: 21789eb697904bbb44a18df961d5918e7c5bd90c79df3a8b8b835da81d0c0f42c7eeb2d05f77cafe49a7367ae7f549a0c8281656ea44b6dc56ae1bf19a3a1eae 983 | languageName: node 984 | linkType: hard 985 | 986 | "@typescript-eslint/typescript-estree@npm:5.57.1": 987 | version: 5.57.1 988 | resolution: "@typescript-eslint/typescript-estree@npm:5.57.1" 989 | dependencies: 990 | "@typescript-eslint/types": 5.57.1 991 | "@typescript-eslint/visitor-keys": 5.57.1 992 | debug: ^4.3.4 993 | globby: ^11.1.0 994 | is-glob: ^4.0.3 995 | semver: ^7.3.7 996 | tsutils: ^3.21.0 997 | peerDependenciesMeta: 998 | typescript: 999 | optional: true 1000 | checksum: bf96520f6de562838a40c3f009fc61fbee5369621071cd0d1dba4470b2b2f746cf79afe4ffa3fbccb8913295a2fbb3d89681d5178529e8da4987c46ed4e5cbed 1001 | languageName: node 1002 | linkType: hard 1003 | 1004 | "@typescript-eslint/utils@npm:5.57.1": 1005 | version: 5.57.1 1006 | resolution: "@typescript-eslint/utils@npm:5.57.1" 1007 | dependencies: 1008 | "@eslint-community/eslint-utils": ^4.2.0 1009 | "@types/json-schema": ^7.0.9 1010 | "@types/semver": ^7.3.12 1011 | "@typescript-eslint/scope-manager": 5.57.1 1012 | "@typescript-eslint/types": 5.57.1 1013 | "@typescript-eslint/typescript-estree": 5.57.1 1014 | eslint-scope: ^5.1.1 1015 | semver: ^7.3.7 1016 | peerDependencies: 1017 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 1018 | checksum: 12e55144c8087f4e8f0f22e5693f3901b81bb7899dec42c7bfe540ac672a802028b688884bb43bd67bcf3cd3546a7205d207afcd948c731c19f551ea61267205 1019 | languageName: node 1020 | linkType: hard 1021 | 1022 | "@typescript-eslint/visitor-keys@npm:5.57.1": 1023 | version: 5.57.1 1024 | resolution: "@typescript-eslint/visitor-keys@npm:5.57.1" 1025 | dependencies: 1026 | "@typescript-eslint/types": 5.57.1 1027 | eslint-visitor-keys: ^3.3.0 1028 | checksum: d187dfac044b7c0f24264a9ba5eebcf6651412d840b4aaba8eacabff7e771babcd67c738525b1f7c9eb8c94b7edfe7658f6de99f5fdc9745e409c538c1374674 1029 | languageName: node 1030 | linkType: hard 1031 | 1032 | "@wagmi/chains@npm:^0.2.6": 1033 | version: 0.2.15 1034 | resolution: "@wagmi/chains@npm:0.2.15" 1035 | peerDependencies: 1036 | typescript: ">=4.9.4" 1037 | peerDependenciesMeta: 1038 | typescript: 1039 | optional: true 1040 | checksum: 33f5ce56f1b5b4e678421e6c61d705340b97b5d99a75ce7dc2f11922f40642ce69c4632e432742956f46ed994b7dff125241c17de259e82454e12a8a0d654a2d 1041 | languageName: node 1042 | linkType: hard 1043 | 1044 | "acorn-jsx@npm:^5.3.2": 1045 | version: 5.3.2 1046 | resolution: "acorn-jsx@npm:5.3.2" 1047 | peerDependencies: 1048 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 1049 | checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 1050 | languageName: node 1051 | linkType: hard 1052 | 1053 | "acorn-walk@npm:^8.1.1": 1054 | version: 8.2.0 1055 | resolution: "acorn-walk@npm:8.2.0" 1056 | checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 1057 | languageName: node 1058 | linkType: hard 1059 | 1060 | "acorn@npm:^8.4.1, acorn@npm:^8.8.0": 1061 | version: 8.8.2 1062 | resolution: "acorn@npm:8.8.2" 1063 | bin: 1064 | acorn: bin/acorn 1065 | checksum: f790b99a1bf63ef160c967e23c46feea7787e531292bb827126334612c234ed489a0dc2c7ba33156416f0ffa8d25bf2b0fdb7f35c2ba60eb3e960572bece4001 1066 | languageName: node 1067 | linkType: hard 1068 | 1069 | "aes-js@npm:3.0.0": 1070 | version: 3.0.0 1071 | resolution: "aes-js@npm:3.0.0" 1072 | checksum: 251e26d533cd1a915b44896b17d5ed68c24a02484cfdd2e74ec700a309267db96651ea4eb657bf20aac32a3baa61f6e34edf8e2fec2de440a655da9942d334b8 1073 | languageName: node 1074 | linkType: hard 1075 | 1076 | "ajv@npm:^6.10.0, ajv@npm:^6.12.4": 1077 | version: 6.12.6 1078 | resolution: "ajv@npm:6.12.6" 1079 | dependencies: 1080 | fast-deep-equal: ^3.1.1 1081 | fast-json-stable-stringify: ^2.0.0 1082 | json-schema-traverse: ^0.4.1 1083 | uri-js: ^4.2.2 1084 | checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 1085 | languageName: node 1086 | linkType: hard 1087 | 1088 | "ansi-regex@npm:^5.0.1": 1089 | version: 5.0.1 1090 | resolution: "ansi-regex@npm:5.0.1" 1091 | checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b 1092 | languageName: node 1093 | linkType: hard 1094 | 1095 | "ansi-styles@npm:^3.2.1": 1096 | version: 3.2.1 1097 | resolution: "ansi-styles@npm:3.2.1" 1098 | dependencies: 1099 | color-convert: ^1.9.0 1100 | checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 1101 | languageName: node 1102 | linkType: hard 1103 | 1104 | "ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": 1105 | version: 4.3.0 1106 | resolution: "ansi-styles@npm:4.3.0" 1107 | dependencies: 1108 | color-convert: ^2.0.1 1109 | checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 1110 | languageName: node 1111 | linkType: hard 1112 | 1113 | "arg@npm:^4.1.0": 1114 | version: 4.1.3 1115 | resolution: "arg@npm:4.1.3" 1116 | checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 1117 | languageName: node 1118 | linkType: hard 1119 | 1120 | "argparse@npm:^2.0.1": 1121 | version: 2.0.1 1122 | resolution: "argparse@npm:2.0.1" 1123 | checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced 1124 | languageName: node 1125 | linkType: hard 1126 | 1127 | "array-union@npm:^2.1.0": 1128 | version: 2.1.0 1129 | resolution: "array-union@npm:2.1.0" 1130 | checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d 1131 | languageName: node 1132 | linkType: hard 1133 | 1134 | "balanced-match@npm:^1.0.0": 1135 | version: 1.0.2 1136 | resolution: "balanced-match@npm:1.0.2" 1137 | checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 1138 | languageName: node 1139 | linkType: hard 1140 | 1141 | "bech32@npm:1.1.4": 1142 | version: 1.1.4 1143 | resolution: "bech32@npm:1.1.4" 1144 | checksum: 0e98db619191548390d6f09ff68b0253ba7ae6a55db93dfdbb070ba234c1fd3308c0606fbcc95fad50437227b10011e2698b89f0181f6e7f845c499bd14d0f4b 1145 | languageName: node 1146 | linkType: hard 1147 | 1148 | "bn.js@npm:^4.11.9": 1149 | version: 4.12.0 1150 | resolution: "bn.js@npm:4.12.0" 1151 | checksum: 39afb4f15f4ea537b55eaf1446c896af28ac948fdcf47171961475724d1bb65118cca49fa6e3d67706e4790955ec0e74de584e45c8f1ef89f46c812bee5b5a12 1152 | languageName: node 1153 | linkType: hard 1154 | 1155 | "bn.js@npm:^5.2.1": 1156 | version: 5.2.1 1157 | resolution: "bn.js@npm:5.2.1" 1158 | checksum: 3dd8c8d38055fedfa95c1d5fc3c99f8dd547b36287b37768db0abab3c239711f88ff58d18d155dd8ad902b0b0cee973747b7ae20ea12a09473272b0201c9edd3 1159 | languageName: node 1160 | linkType: hard 1161 | 1162 | "brace-expansion@npm:^1.1.7": 1163 | version: 1.1.11 1164 | resolution: "brace-expansion@npm:1.1.11" 1165 | dependencies: 1166 | balanced-match: ^1.0.0 1167 | concat-map: 0.0.1 1168 | checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 1169 | languageName: node 1170 | linkType: hard 1171 | 1172 | "braces@npm:^3.0.2": 1173 | version: 3.0.2 1174 | resolution: "braces@npm:3.0.2" 1175 | dependencies: 1176 | fill-range: ^7.0.1 1177 | checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 1178 | languageName: node 1179 | linkType: hard 1180 | 1181 | "brorand@npm:^1.1.0": 1182 | version: 1.1.0 1183 | resolution: "brorand@npm:1.1.0" 1184 | checksum: 8a05c9f3c4b46572dec6ef71012b1946db6cae8c7bb60ccd4b7dd5a84655db49fe043ecc6272e7ef1f69dc53d6730b9e2a3a03a8310509a3d797a618cbee52be 1185 | languageName: node 1186 | linkType: hard 1187 | 1188 | "callsites@npm:^3.0.0": 1189 | version: 3.1.0 1190 | resolution: "callsites@npm:3.1.0" 1191 | checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 1192 | languageName: node 1193 | linkType: hard 1194 | 1195 | "chalk@npm:^2.0.0": 1196 | version: 2.4.2 1197 | resolution: "chalk@npm:2.4.2" 1198 | dependencies: 1199 | ansi-styles: ^3.2.1 1200 | escape-string-regexp: ^1.0.5 1201 | supports-color: ^5.3.0 1202 | checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 1203 | languageName: node 1204 | linkType: hard 1205 | 1206 | "chalk@npm:^4.0.0": 1207 | version: 4.1.2 1208 | resolution: "chalk@npm:4.1.2" 1209 | dependencies: 1210 | ansi-styles: ^4.1.0 1211 | supports-color: ^7.1.0 1212 | checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc 1213 | languageName: node 1214 | linkType: hard 1215 | 1216 | "cliui@npm:^8.0.1": 1217 | version: 8.0.1 1218 | resolution: "cliui@npm:8.0.1" 1219 | dependencies: 1220 | string-width: ^4.2.0 1221 | strip-ansi: ^6.0.1 1222 | wrap-ansi: ^7.0.0 1223 | checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 1224 | languageName: node 1225 | linkType: hard 1226 | 1227 | "coingecko-api@npm:^1.0.10": 1228 | version: 1.0.10 1229 | resolution: "coingecko-api@npm:1.0.10" 1230 | checksum: c900f5f7261dbfa2ecf3f6a2b018eb9de445db17bf9ef331e2751904f24c4e361144e9aa8ab1501fb4e741fa900dd61007e330a6b95a778d35b48d2ca5b61148 1231 | languageName: node 1232 | linkType: hard 1233 | 1234 | "color-convert@npm:^1.9.0": 1235 | version: 1.9.3 1236 | resolution: "color-convert@npm:1.9.3" 1237 | dependencies: 1238 | color-name: 1.1.3 1239 | checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 1240 | languageName: node 1241 | linkType: hard 1242 | 1243 | "color-convert@npm:^2.0.1": 1244 | version: 2.0.1 1245 | resolution: "color-convert@npm:2.0.1" 1246 | dependencies: 1247 | color-name: ~1.1.4 1248 | checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 1249 | languageName: node 1250 | linkType: hard 1251 | 1252 | "color-name@npm:1.1.3": 1253 | version: 1.1.3 1254 | resolution: "color-name@npm:1.1.3" 1255 | checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d 1256 | languageName: node 1257 | linkType: hard 1258 | 1259 | "color-name@npm:~1.1.4": 1260 | version: 1.1.4 1261 | resolution: "color-name@npm:1.1.4" 1262 | checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 1263 | languageName: node 1264 | linkType: hard 1265 | 1266 | "concat-map@npm:0.0.1": 1267 | version: 0.0.1 1268 | resolution: "concat-map@npm:0.0.1" 1269 | checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af 1270 | languageName: node 1271 | linkType: hard 1272 | 1273 | "create-require@npm:^1.1.0": 1274 | version: 1.1.1 1275 | resolution: "create-require@npm:1.1.1" 1276 | checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff 1277 | languageName: node 1278 | linkType: hard 1279 | 1280 | "cross-fetch@npm:^3.1.5": 1281 | version: 3.1.5 1282 | resolution: "cross-fetch@npm:3.1.5" 1283 | dependencies: 1284 | node-fetch: 2.6.7 1285 | checksum: f6b8c6ee3ef993ace6277fd789c71b6acf1b504fd5f5c7128df4ef2f125a429e29cd62dc8c127523f04a5f2fa4771ed80e3f3d9695617f441425045f505cf3bb 1286 | languageName: node 1287 | linkType: hard 1288 | 1289 | "cross-spawn@npm:^7.0.2": 1290 | version: 7.0.3 1291 | resolution: "cross-spawn@npm:7.0.3" 1292 | dependencies: 1293 | path-key: ^3.1.0 1294 | shebang-command: ^2.0.0 1295 | which: ^2.0.1 1296 | checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 1297 | languageName: node 1298 | linkType: hard 1299 | 1300 | "debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.4": 1301 | version: 4.3.4 1302 | resolution: "debug@npm:4.3.4" 1303 | dependencies: 1304 | ms: 2.1.2 1305 | peerDependenciesMeta: 1306 | supports-color: 1307 | optional: true 1308 | checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 1309 | languageName: node 1310 | linkType: hard 1311 | 1312 | "deep-is@npm:^0.1.3": 1313 | version: 0.1.4 1314 | resolution: "deep-is@npm:0.1.4" 1315 | checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 1316 | languageName: node 1317 | linkType: hard 1318 | 1319 | "diff@npm:^4.0.1": 1320 | version: 4.0.2 1321 | resolution: "diff@npm:4.0.2" 1322 | checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d 1323 | languageName: node 1324 | linkType: hard 1325 | 1326 | "dir-glob@npm:^3.0.1": 1327 | version: 3.0.1 1328 | resolution: "dir-glob@npm:3.0.1" 1329 | dependencies: 1330 | path-type: ^4.0.0 1331 | checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 1332 | languageName: node 1333 | linkType: hard 1334 | 1335 | "doctrine@npm:^3.0.0": 1336 | version: 3.0.0 1337 | resolution: "doctrine@npm:3.0.0" 1338 | dependencies: 1339 | esutils: ^2.0.2 1340 | checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce 1341 | languageName: node 1342 | linkType: hard 1343 | 1344 | "elliptic@npm:6.5.4": 1345 | version: 6.5.4 1346 | resolution: "elliptic@npm:6.5.4" 1347 | dependencies: 1348 | bn.js: ^4.11.9 1349 | brorand: ^1.1.0 1350 | hash.js: ^1.0.0 1351 | hmac-drbg: ^1.0.1 1352 | inherits: ^2.0.4 1353 | minimalistic-assert: ^1.0.1 1354 | minimalistic-crypto-utils: ^1.0.1 1355 | checksum: d56d21fd04e97869f7ffcc92e18903b9f67f2d4637a23c860492fbbff5a3155fd9ca0184ce0c865dd6eb2487d234ce9551335c021c376cd2d3b7cb749c7d10f4 1356 | languageName: node 1357 | linkType: hard 1358 | 1359 | "emoji-regex@npm:^8.0.0": 1360 | version: 8.0.0 1361 | resolution: "emoji-regex@npm:8.0.0" 1362 | checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 1363 | languageName: node 1364 | linkType: hard 1365 | 1366 | "escalade@npm:^3.1.1": 1367 | version: 3.1.1 1368 | resolution: "escalade@npm:3.1.1" 1369 | checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 1370 | languageName: node 1371 | linkType: hard 1372 | 1373 | "escape-string-regexp@npm:^1.0.5": 1374 | version: 1.0.5 1375 | resolution: "escape-string-regexp@npm:1.0.5" 1376 | checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 1377 | languageName: node 1378 | linkType: hard 1379 | 1380 | "escape-string-regexp@npm:^4.0.0": 1381 | version: 4.0.0 1382 | resolution: "escape-string-regexp@npm:4.0.0" 1383 | checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 1384 | languageName: node 1385 | linkType: hard 1386 | 1387 | "eslint-config-prettier@npm:^8.8.0": 1388 | version: 8.8.0 1389 | resolution: "eslint-config-prettier@npm:8.8.0" 1390 | peerDependencies: 1391 | eslint: ">=7.0.0" 1392 | bin: 1393 | eslint-config-prettier: bin/cli.js 1394 | checksum: 1e94c3882c4d5e41e1dcfa2c368dbccbfe3134f6ac7d40101644d3bfbe3eb2f2ffac757f3145910b5eacf20c0e85e02b91293d3126d770cbf3dc390b3564681c 1395 | languageName: node 1396 | linkType: hard 1397 | 1398 | "eslint-scope@npm:^5.1.1": 1399 | version: 5.1.1 1400 | resolution: "eslint-scope@npm:5.1.1" 1401 | dependencies: 1402 | esrecurse: ^4.3.0 1403 | estraverse: ^4.1.1 1404 | checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb 1405 | languageName: node 1406 | linkType: hard 1407 | 1408 | "eslint-scope@npm:^7.1.1": 1409 | version: 7.1.1 1410 | resolution: "eslint-scope@npm:7.1.1" 1411 | dependencies: 1412 | esrecurse: ^4.3.0 1413 | estraverse: ^5.2.0 1414 | checksum: 9f6e974ab2db641ca8ab13508c405b7b859e72afe9f254e8131ff154d2f40c99ad4545ce326fd9fde3212ff29707102562a4834f1c48617b35d98c71a97fbf3e 1415 | languageName: node 1416 | linkType: hard 1417 | 1418 | "eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.0": 1419 | version: 3.4.0 1420 | resolution: "eslint-visitor-keys@npm:3.4.0" 1421 | checksum: 33159169462d3989321a1ec1e9aaaf6a24cc403d5d347e9886d1b5bfe18ffa1be73bdc6203143a28a606b142b1af49787f33cff0d6d0813eb5f2e8d2e1a6043c 1422 | languageName: node 1423 | linkType: hard 1424 | 1425 | "eslint@npm:^8.37.0": 1426 | version: 8.37.0 1427 | resolution: "eslint@npm:8.37.0" 1428 | dependencies: 1429 | "@eslint-community/eslint-utils": ^4.2.0 1430 | "@eslint-community/regexpp": ^4.4.0 1431 | "@eslint/eslintrc": ^2.0.2 1432 | "@eslint/js": 8.37.0 1433 | "@humanwhocodes/config-array": ^0.11.8 1434 | "@humanwhocodes/module-importer": ^1.0.1 1435 | "@nodelib/fs.walk": ^1.2.8 1436 | ajv: ^6.10.0 1437 | chalk: ^4.0.0 1438 | cross-spawn: ^7.0.2 1439 | debug: ^4.3.2 1440 | doctrine: ^3.0.0 1441 | escape-string-regexp: ^4.0.0 1442 | eslint-scope: ^7.1.1 1443 | eslint-visitor-keys: ^3.4.0 1444 | espree: ^9.5.1 1445 | esquery: ^1.4.2 1446 | esutils: ^2.0.2 1447 | fast-deep-equal: ^3.1.3 1448 | file-entry-cache: ^6.0.1 1449 | find-up: ^5.0.0 1450 | glob-parent: ^6.0.2 1451 | globals: ^13.19.0 1452 | grapheme-splitter: ^1.0.4 1453 | ignore: ^5.2.0 1454 | import-fresh: ^3.0.0 1455 | imurmurhash: ^0.1.4 1456 | is-glob: ^4.0.0 1457 | is-path-inside: ^3.0.3 1458 | js-sdsl: ^4.1.4 1459 | js-yaml: ^4.1.0 1460 | json-stable-stringify-without-jsonify: ^1.0.1 1461 | levn: ^0.4.1 1462 | lodash.merge: ^4.6.2 1463 | minimatch: ^3.1.2 1464 | natural-compare: ^1.4.0 1465 | optionator: ^0.9.1 1466 | strip-ansi: ^6.0.1 1467 | strip-json-comments: ^3.1.0 1468 | text-table: ^0.2.0 1469 | bin: 1470 | eslint: bin/eslint.js 1471 | checksum: 80f3d5cdce2d671f4794e392d234a78d039c347673defb0596268bd481e8f30a53d93c01ff4f66a546c87d97ab4122c0e9cafe1371f87cb03cee6b7d5aa97595 1472 | languageName: node 1473 | linkType: hard 1474 | 1475 | "espree@npm:^9.5.1": 1476 | version: 9.5.1 1477 | resolution: "espree@npm:9.5.1" 1478 | dependencies: 1479 | acorn: ^8.8.0 1480 | acorn-jsx: ^5.3.2 1481 | eslint-visitor-keys: ^3.4.0 1482 | checksum: cdf6e43540433d917c4f2ee087c6e987b2063baa85a1d9cdaf51533d78275ebd5910c42154e7baf8e3e89804b386da0a2f7fad2264d8f04420e7506bf87b3b88 1483 | languageName: node 1484 | linkType: hard 1485 | 1486 | "esquery@npm:^1.4.2": 1487 | version: 1.5.0 1488 | resolution: "esquery@npm:1.5.0" 1489 | dependencies: 1490 | estraverse: ^5.1.0 1491 | checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 1492 | languageName: node 1493 | linkType: hard 1494 | 1495 | "esrecurse@npm:^4.3.0": 1496 | version: 4.3.0 1497 | resolution: "esrecurse@npm:4.3.0" 1498 | dependencies: 1499 | estraverse: ^5.2.0 1500 | checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 1501 | languageName: node 1502 | linkType: hard 1503 | 1504 | "estraverse@npm:^4.1.1": 1505 | version: 4.3.0 1506 | resolution: "estraverse@npm:4.3.0" 1507 | checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 1508 | languageName: node 1509 | linkType: hard 1510 | 1511 | "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": 1512 | version: 5.3.0 1513 | resolution: "estraverse@npm:5.3.0" 1514 | checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b 1515 | languageName: node 1516 | linkType: hard 1517 | 1518 | "esutils@npm:^2.0.2": 1519 | version: 2.0.3 1520 | resolution: "esutils@npm:2.0.3" 1521 | checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 1522 | languageName: node 1523 | linkType: hard 1524 | 1525 | "ethers@npm:^5.7.2": 1526 | version: 5.7.2 1527 | resolution: "ethers@npm:5.7.2" 1528 | dependencies: 1529 | "@ethersproject/abi": 5.7.0 1530 | "@ethersproject/abstract-provider": 5.7.0 1531 | "@ethersproject/abstract-signer": 5.7.0 1532 | "@ethersproject/address": 5.7.0 1533 | "@ethersproject/base64": 5.7.0 1534 | "@ethersproject/basex": 5.7.0 1535 | "@ethersproject/bignumber": 5.7.0 1536 | "@ethersproject/bytes": 5.7.0 1537 | "@ethersproject/constants": 5.7.0 1538 | "@ethersproject/contracts": 5.7.0 1539 | "@ethersproject/hash": 5.7.0 1540 | "@ethersproject/hdnode": 5.7.0 1541 | "@ethersproject/json-wallets": 5.7.0 1542 | "@ethersproject/keccak256": 5.7.0 1543 | "@ethersproject/logger": 5.7.0 1544 | "@ethersproject/networks": 5.7.1 1545 | "@ethersproject/pbkdf2": 5.7.0 1546 | "@ethersproject/properties": 5.7.0 1547 | "@ethersproject/providers": 5.7.2 1548 | "@ethersproject/random": 5.7.0 1549 | "@ethersproject/rlp": 5.7.0 1550 | "@ethersproject/sha2": 5.7.0 1551 | "@ethersproject/signing-key": 5.7.0 1552 | "@ethersproject/solidity": 5.7.0 1553 | "@ethersproject/strings": 5.7.0 1554 | "@ethersproject/transactions": 5.7.0 1555 | "@ethersproject/units": 5.7.0 1556 | "@ethersproject/wallet": 5.7.0 1557 | "@ethersproject/web": 5.7.1 1558 | "@ethersproject/wordlists": 5.7.0 1559 | checksum: b7c08cf3e257185a7946117dbbf764433b7ba0e77c27298dec6088b3bc871aff711462b0621930c56880ff0a7ceb8b1d3a361ffa259f93377b48e34107f62553 1560 | languageName: node 1561 | linkType: hard 1562 | 1563 | "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": 1564 | version: 3.1.3 1565 | resolution: "fast-deep-equal@npm:3.1.3" 1566 | checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d 1567 | languageName: node 1568 | linkType: hard 1569 | 1570 | "fast-glob@npm:^3.2.9": 1571 | version: 3.2.12 1572 | resolution: "fast-glob@npm:3.2.12" 1573 | dependencies: 1574 | "@nodelib/fs.stat": ^2.0.2 1575 | "@nodelib/fs.walk": ^1.2.3 1576 | glob-parent: ^5.1.2 1577 | merge2: ^1.3.0 1578 | micromatch: ^4.0.4 1579 | checksum: 0b1990f6ce831c7e28c4d505edcdaad8e27e88ab9fa65eedadb730438cfc7cde4910d6c975d6b7b8dc8a73da4773702ebcfcd6e3518e73938bb1383badfe01c2 1580 | languageName: node 1581 | linkType: hard 1582 | 1583 | "fast-json-stable-stringify@npm:^2.0.0": 1584 | version: 2.1.0 1585 | resolution: "fast-json-stable-stringify@npm:2.1.0" 1586 | checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb 1587 | languageName: node 1588 | linkType: hard 1589 | 1590 | "fast-levenshtein@npm:^2.0.6": 1591 | version: 2.0.6 1592 | resolution: "fast-levenshtein@npm:2.0.6" 1593 | checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c 1594 | languageName: node 1595 | linkType: hard 1596 | 1597 | "fastq@npm:^1.6.0": 1598 | version: 1.15.0 1599 | resolution: "fastq@npm:1.15.0" 1600 | dependencies: 1601 | reusify: ^1.0.4 1602 | checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a 1603 | languageName: node 1604 | linkType: hard 1605 | 1606 | "file-entry-cache@npm:^6.0.1": 1607 | version: 6.0.1 1608 | resolution: "file-entry-cache@npm:6.0.1" 1609 | dependencies: 1610 | flat-cache: ^3.0.4 1611 | checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 1612 | languageName: node 1613 | linkType: hard 1614 | 1615 | "fill-range@npm:^7.0.1": 1616 | version: 7.0.1 1617 | resolution: "fill-range@npm:7.0.1" 1618 | dependencies: 1619 | to-regex-range: ^5.0.1 1620 | checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 1621 | languageName: node 1622 | linkType: hard 1623 | 1624 | "find-up@npm:^5.0.0": 1625 | version: 5.0.0 1626 | resolution: "find-up@npm:5.0.0" 1627 | dependencies: 1628 | locate-path: ^6.0.0 1629 | path-exists: ^4.0.0 1630 | checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 1631 | languageName: node 1632 | linkType: hard 1633 | 1634 | "flat-cache@npm:^3.0.4": 1635 | version: 3.0.4 1636 | resolution: "flat-cache@npm:3.0.4" 1637 | dependencies: 1638 | flatted: ^3.1.0 1639 | rimraf: ^3.0.2 1640 | checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 1641 | languageName: node 1642 | linkType: hard 1643 | 1644 | "flatted@npm:^3.1.0": 1645 | version: 3.2.7 1646 | resolution: "flatted@npm:3.2.7" 1647 | checksum: 427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 1648 | languageName: node 1649 | linkType: hard 1650 | 1651 | "fs.realpath@npm:^1.0.0": 1652 | version: 1.0.0 1653 | resolution: "fs.realpath@npm:1.0.0" 1654 | checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 1655 | languageName: node 1656 | linkType: hard 1657 | 1658 | "get-caller-file@npm:^2.0.5": 1659 | version: 2.0.5 1660 | resolution: "get-caller-file@npm:2.0.5" 1661 | checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 1662 | languageName: node 1663 | linkType: hard 1664 | 1665 | "glob-parent@npm:^5.1.2": 1666 | version: 5.1.2 1667 | resolution: "glob-parent@npm:5.1.2" 1668 | dependencies: 1669 | is-glob: ^4.0.1 1670 | checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e 1671 | languageName: node 1672 | linkType: hard 1673 | 1674 | "glob-parent@npm:^6.0.2": 1675 | version: 6.0.2 1676 | resolution: "glob-parent@npm:6.0.2" 1677 | dependencies: 1678 | is-glob: ^4.0.3 1679 | checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 1680 | languageName: node 1681 | linkType: hard 1682 | 1683 | "glob@npm:^7.1.3": 1684 | version: 7.2.3 1685 | resolution: "glob@npm:7.2.3" 1686 | dependencies: 1687 | fs.realpath: ^1.0.0 1688 | inflight: ^1.0.4 1689 | inherits: 2 1690 | minimatch: ^3.1.1 1691 | once: ^1.3.0 1692 | path-is-absolute: ^1.0.0 1693 | checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 1694 | languageName: node 1695 | linkType: hard 1696 | 1697 | "globals@npm:^11.1.0": 1698 | version: 11.12.0 1699 | resolution: "globals@npm:11.12.0" 1700 | checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e 1701 | languageName: node 1702 | linkType: hard 1703 | 1704 | "globals@npm:^13.19.0": 1705 | version: 13.20.0 1706 | resolution: "globals@npm:13.20.0" 1707 | dependencies: 1708 | type-fest: ^0.20.2 1709 | checksum: ad1ecf914bd051325faad281d02ea2c0b1df5d01bd94d368dcc5513340eac41d14b3c61af325768e3c7f8d44576e72780ec0b6f2d366121f8eec6e03c3a3b97a 1710 | languageName: node 1711 | linkType: hard 1712 | 1713 | "globby@npm:^11.1.0": 1714 | version: 11.1.0 1715 | resolution: "globby@npm:11.1.0" 1716 | dependencies: 1717 | array-union: ^2.1.0 1718 | dir-glob: ^3.0.1 1719 | fast-glob: ^3.2.9 1720 | ignore: ^5.2.0 1721 | merge2: ^1.4.1 1722 | slash: ^3.0.0 1723 | checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 1724 | languageName: node 1725 | linkType: hard 1726 | 1727 | "grapheme-splitter@npm:^1.0.4": 1728 | version: 1.0.4 1729 | resolution: "grapheme-splitter@npm:1.0.4" 1730 | checksum: 0c22ec54dee1b05cd480f78cf14f732cb5b108edc073572c4ec205df4cd63f30f8db8025afc5debc8835a8ddeacf648a1c7992fe3dcd6ad38f9a476d84906620 1731 | languageName: node 1732 | linkType: hard 1733 | 1734 | "has-flag@npm:^3.0.0": 1735 | version: 3.0.0 1736 | resolution: "has-flag@npm:3.0.0" 1737 | checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b 1738 | languageName: node 1739 | linkType: hard 1740 | 1741 | "has-flag@npm:^4.0.0": 1742 | version: 4.0.0 1743 | resolution: "has-flag@npm:4.0.0" 1744 | checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad 1745 | languageName: node 1746 | linkType: hard 1747 | 1748 | "hash.js@npm:1.1.7, hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": 1749 | version: 1.1.7 1750 | resolution: "hash.js@npm:1.1.7" 1751 | dependencies: 1752 | inherits: ^2.0.3 1753 | minimalistic-assert: ^1.0.1 1754 | checksum: e350096e659c62422b85fa508e4b3669017311aa4c49b74f19f8e1bc7f3a54a584fdfd45326d4964d6011f2b2d882e38bea775a96046f2a61b7779a979629d8f 1755 | languageName: node 1756 | linkType: hard 1757 | 1758 | "hmac-drbg@npm:^1.0.1": 1759 | version: 1.0.1 1760 | resolution: "hmac-drbg@npm:1.0.1" 1761 | dependencies: 1762 | hash.js: ^1.0.3 1763 | minimalistic-assert: ^1.0.0 1764 | minimalistic-crypto-utils: ^1.0.1 1765 | checksum: bd30b6a68d7f22d63f10e1888aee497d7c2c5c0bb469e66bbdac99f143904d1dfe95f8131f95b3e86c86dd239963c9d972fcbe147e7cffa00e55d18585c43fe0 1766 | languageName: node 1767 | linkType: hard 1768 | 1769 | "ignore@npm:^5.2.0": 1770 | version: 5.2.4 1771 | resolution: "ignore@npm:5.2.4" 1772 | checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef 1773 | languageName: node 1774 | linkType: hard 1775 | 1776 | "import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": 1777 | version: 3.3.0 1778 | resolution: "import-fresh@npm:3.3.0" 1779 | dependencies: 1780 | parent-module: ^1.0.0 1781 | resolve-from: ^4.0.0 1782 | checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa 1783 | languageName: node 1784 | linkType: hard 1785 | 1786 | "imurmurhash@npm:^0.1.4": 1787 | version: 0.1.4 1788 | resolution: "imurmurhash@npm:0.1.4" 1789 | checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 1790 | languageName: node 1791 | linkType: hard 1792 | 1793 | "inflight@npm:^1.0.4": 1794 | version: 1.0.6 1795 | resolution: "inflight@npm:1.0.6" 1796 | dependencies: 1797 | once: ^1.3.0 1798 | wrappy: 1 1799 | checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd 1800 | languageName: node 1801 | linkType: hard 1802 | 1803 | "inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4": 1804 | version: 2.0.4 1805 | resolution: "inherits@npm:2.0.4" 1806 | checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 1807 | languageName: node 1808 | linkType: hard 1809 | 1810 | "is-extglob@npm:^2.1.1": 1811 | version: 2.1.1 1812 | resolution: "is-extglob@npm:2.1.1" 1813 | checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 1814 | languageName: node 1815 | linkType: hard 1816 | 1817 | "is-fullwidth-code-point@npm:^3.0.0": 1818 | version: 3.0.0 1819 | resolution: "is-fullwidth-code-point@npm:3.0.0" 1820 | checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 1821 | languageName: node 1822 | linkType: hard 1823 | 1824 | "is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": 1825 | version: 4.0.3 1826 | resolution: "is-glob@npm:4.0.3" 1827 | dependencies: 1828 | is-extglob: ^2.1.1 1829 | checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 1830 | languageName: node 1831 | linkType: hard 1832 | 1833 | "is-number@npm:^7.0.0": 1834 | version: 7.0.0 1835 | resolution: "is-number@npm:7.0.0" 1836 | checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a 1837 | languageName: node 1838 | linkType: hard 1839 | 1840 | "is-path-inside@npm:^3.0.3": 1841 | version: 3.0.3 1842 | resolution: "is-path-inside@npm:3.0.3" 1843 | checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 1844 | languageName: node 1845 | linkType: hard 1846 | 1847 | "isexe@npm:^2.0.0": 1848 | version: 2.0.0 1849 | resolution: "isexe@npm:2.0.0" 1850 | checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 1851 | languageName: node 1852 | linkType: hard 1853 | 1854 | "javascript-natural-sort@npm:0.7.1": 1855 | version: 0.7.1 1856 | resolution: "javascript-natural-sort@npm:0.7.1" 1857 | checksum: 161e2c512cc7884bc055a582c6645d9032cab88497a76123d73cb23bfb03d97a04cf7772ecdb8bd3366fc07192c2f996366f479f725c23ef073fffe03d6a586a 1858 | languageName: node 1859 | linkType: hard 1860 | 1861 | "js-sdsl@npm:^4.1.4": 1862 | version: 4.4.0 1863 | resolution: "js-sdsl@npm:4.4.0" 1864 | checksum: 7bb08a2d746ab7ff742720339aa006c631afe05e77d11eda988c1c35fae8e03e492e4e347e883e786e3ce6170685d4780c125619111f0730c11fdb41b04059c7 1865 | languageName: node 1866 | linkType: hard 1867 | 1868 | "js-sha3@npm:0.8.0": 1869 | version: 0.8.0 1870 | resolution: "js-sha3@npm:0.8.0" 1871 | checksum: 75df77c1fc266973f06cce8309ce010e9e9f07ec35ab12022ed29b7f0d9c8757f5a73e1b35aa24840dced0dea7059085aa143d817aea9e188e2a80d569d9adce 1872 | languageName: node 1873 | linkType: hard 1874 | 1875 | "js-tokens@npm:^4.0.0": 1876 | version: 4.0.0 1877 | resolution: "js-tokens@npm:4.0.0" 1878 | checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 1879 | languageName: node 1880 | linkType: hard 1881 | 1882 | "js-yaml@npm:^4.1.0": 1883 | version: 4.1.0 1884 | resolution: "js-yaml@npm:4.1.0" 1885 | dependencies: 1886 | argparse: ^2.0.1 1887 | bin: 1888 | js-yaml: bin/js-yaml.js 1889 | checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a 1890 | languageName: node 1891 | linkType: hard 1892 | 1893 | "jsesc@npm:^2.5.1": 1894 | version: 2.5.2 1895 | resolution: "jsesc@npm:2.5.2" 1896 | bin: 1897 | jsesc: bin/jsesc 1898 | checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d 1899 | languageName: node 1900 | linkType: hard 1901 | 1902 | "json-schema-traverse@npm:^0.4.1": 1903 | version: 0.4.1 1904 | resolution: "json-schema-traverse@npm:0.4.1" 1905 | checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b 1906 | languageName: node 1907 | linkType: hard 1908 | 1909 | "json-stable-stringify-without-jsonify@npm:^1.0.1": 1910 | version: 1.0.1 1911 | resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" 1912 | checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 1913 | languageName: node 1914 | linkType: hard 1915 | 1916 | "levn@npm:^0.4.1": 1917 | version: 0.4.1 1918 | resolution: "levn@npm:0.4.1" 1919 | dependencies: 1920 | prelude-ls: ^1.2.1 1921 | type-check: ~0.4.0 1922 | checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 1923 | languageName: node 1924 | linkType: hard 1925 | 1926 | "locate-path@npm:^6.0.0": 1927 | version: 6.0.0 1928 | resolution: "locate-path@npm:6.0.0" 1929 | dependencies: 1930 | p-locate: ^5.0.0 1931 | checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a 1932 | languageName: node 1933 | linkType: hard 1934 | 1935 | "lodash.merge@npm:^4.6.2": 1936 | version: 4.6.2 1937 | resolution: "lodash.merge@npm:4.6.2" 1938 | checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 1939 | languageName: node 1940 | linkType: hard 1941 | 1942 | "lodash@npm:^4.17.21": 1943 | version: 4.17.21 1944 | resolution: "lodash@npm:4.17.21" 1945 | checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 1946 | languageName: node 1947 | linkType: hard 1948 | 1949 | "lru-cache@npm:^6.0.0": 1950 | version: 6.0.0 1951 | resolution: "lru-cache@npm:6.0.0" 1952 | dependencies: 1953 | yallist: ^4.0.0 1954 | checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 1955 | languageName: node 1956 | linkType: hard 1957 | 1958 | "make-error@npm:^1.1.1": 1959 | version: 1.3.6 1960 | resolution: "make-error@npm:1.3.6" 1961 | checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 1962 | languageName: node 1963 | linkType: hard 1964 | 1965 | "merge2@npm:^1.3.0, merge2@npm:^1.4.1": 1966 | version: 1.4.1 1967 | resolution: "merge2@npm:1.4.1" 1968 | checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 1969 | languageName: node 1970 | linkType: hard 1971 | 1972 | "micromatch@npm:^4.0.4": 1973 | version: 4.0.5 1974 | resolution: "micromatch@npm:4.0.5" 1975 | dependencies: 1976 | braces: ^3.0.2 1977 | picomatch: ^2.3.1 1978 | checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc 1979 | languageName: node 1980 | linkType: hard 1981 | 1982 | "minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": 1983 | version: 1.0.1 1984 | resolution: "minimalistic-assert@npm:1.0.1" 1985 | checksum: cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 1986 | languageName: node 1987 | linkType: hard 1988 | 1989 | "minimalistic-crypto-utils@npm:^1.0.1": 1990 | version: 1.0.1 1991 | resolution: "minimalistic-crypto-utils@npm:1.0.1" 1992 | checksum: 6e8a0422b30039406efd4c440829ea8f988845db02a3299f372fceba56ffa94994a9c0f2fd70c17f9969eedfbd72f34b5070ead9656a34d3f71c0bd72583a0ed 1993 | languageName: node 1994 | linkType: hard 1995 | 1996 | "minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": 1997 | version: 3.1.2 1998 | resolution: "minimatch@npm:3.1.2" 1999 | dependencies: 2000 | brace-expansion: ^1.1.7 2001 | checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a 2002 | languageName: node 2003 | linkType: hard 2004 | 2005 | "ms@npm:2.1.2": 2006 | version: 2.1.2 2007 | resolution: "ms@npm:2.1.2" 2008 | checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f 2009 | languageName: node 2010 | linkType: hard 2011 | 2012 | "natural-compare-lite@npm:^1.4.0": 2013 | version: 1.4.0 2014 | resolution: "natural-compare-lite@npm:1.4.0" 2015 | checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 2016 | languageName: node 2017 | linkType: hard 2018 | 2019 | "natural-compare@npm:^1.4.0": 2020 | version: 1.4.0 2021 | resolution: "natural-compare@npm:1.4.0" 2022 | checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d 2023 | languageName: node 2024 | linkType: hard 2025 | 2026 | "node-fetch@npm:2.6.7": 2027 | version: 2.6.7 2028 | resolution: "node-fetch@npm:2.6.7" 2029 | dependencies: 2030 | whatwg-url: ^5.0.0 2031 | peerDependencies: 2032 | encoding: ^0.1.0 2033 | peerDependenciesMeta: 2034 | encoding: 2035 | optional: true 2036 | checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b 2037 | languageName: node 2038 | linkType: hard 2039 | 2040 | "once@npm:^1.3.0": 2041 | version: 1.4.0 2042 | resolution: "once@npm:1.4.0" 2043 | dependencies: 2044 | wrappy: 1 2045 | checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 2046 | languageName: node 2047 | linkType: hard 2048 | 2049 | "optionator@npm:^0.9.1": 2050 | version: 0.9.1 2051 | resolution: "optionator@npm:0.9.1" 2052 | dependencies: 2053 | deep-is: ^0.1.3 2054 | fast-levenshtein: ^2.0.6 2055 | levn: ^0.4.1 2056 | prelude-ls: ^1.2.1 2057 | type-check: ^0.4.0 2058 | word-wrap: ^1.2.3 2059 | checksum: dbc6fa065604b24ea57d734261914e697bd73b69eff7f18e967e8912aa2a40a19a9f599a507fa805be6c13c24c4eae8c71306c239d517d42d4c041c942f508a0 2060 | languageName: node 2061 | linkType: hard 2062 | 2063 | "p-limit@npm:^3.0.2": 2064 | version: 3.1.0 2065 | resolution: "p-limit@npm:3.1.0" 2066 | dependencies: 2067 | yocto-queue: ^0.1.0 2068 | checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 2069 | languageName: node 2070 | linkType: hard 2071 | 2072 | "p-locate@npm:^5.0.0": 2073 | version: 5.0.0 2074 | resolution: "p-locate@npm:5.0.0" 2075 | dependencies: 2076 | p-limit: ^3.0.2 2077 | checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 2078 | languageName: node 2079 | linkType: hard 2080 | 2081 | "parent-module@npm:^1.0.0": 2082 | version: 1.0.1 2083 | resolution: "parent-module@npm:1.0.1" 2084 | dependencies: 2085 | callsites: ^3.0.0 2086 | checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff 2087 | languageName: node 2088 | linkType: hard 2089 | 2090 | "path-exists@npm:^4.0.0": 2091 | version: 4.0.0 2092 | resolution: "path-exists@npm:4.0.0" 2093 | checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 2094 | languageName: node 2095 | linkType: hard 2096 | 2097 | "path-is-absolute@npm:^1.0.0": 2098 | version: 1.0.1 2099 | resolution: "path-is-absolute@npm:1.0.1" 2100 | checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 2101 | languageName: node 2102 | linkType: hard 2103 | 2104 | "path-key@npm:^3.1.0": 2105 | version: 3.1.1 2106 | resolution: "path-key@npm:3.1.1" 2107 | checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 2108 | languageName: node 2109 | linkType: hard 2110 | 2111 | "path-type@npm:^4.0.0": 2112 | version: 4.0.0 2113 | resolution: "path-type@npm:4.0.0" 2114 | checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 2115 | languageName: node 2116 | linkType: hard 2117 | 2118 | "picomatch@npm:^2.3.1": 2119 | version: 2.3.1 2120 | resolution: "picomatch@npm:2.3.1" 2121 | checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf 2122 | languageName: node 2123 | linkType: hard 2124 | 2125 | "prelude-ls@npm:^1.2.1": 2126 | version: 1.2.1 2127 | resolution: "prelude-ls@npm:1.2.1" 2128 | checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a 2129 | languageName: node 2130 | linkType: hard 2131 | 2132 | "prettier@npm:^2.8.2": 2133 | version: 2.8.2 2134 | resolution: "prettier@npm:2.8.2" 2135 | bin: 2136 | prettier: bin-prettier.js 2137 | checksum: 740c56c2128d587d656ea1dde9bc9c3503dfc94db4f3ac387259215eeb2e216680bdad9d18a0c9feecc6b42cfa188d6fa777df4c36c1d00cedd4199074fbfbd2 2138 | languageName: node 2139 | linkType: hard 2140 | 2141 | "punycode@npm:^2.1.0": 2142 | version: 2.3.0 2143 | resolution: "punycode@npm:2.3.0" 2144 | checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 2145 | languageName: node 2146 | linkType: hard 2147 | 2148 | "queue-microtask@npm:^1.2.2": 2149 | version: 1.2.3 2150 | resolution: "queue-microtask@npm:1.2.3" 2151 | checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 2152 | languageName: node 2153 | linkType: hard 2154 | 2155 | "require-directory@npm:^2.1.1": 2156 | version: 2.1.1 2157 | resolution: "require-directory@npm:2.1.1" 2158 | checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 2159 | languageName: node 2160 | linkType: hard 2161 | 2162 | "resolve-from@npm:^4.0.0": 2163 | version: 4.0.0 2164 | resolution: "resolve-from@npm:4.0.0" 2165 | checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f 2166 | languageName: node 2167 | linkType: hard 2168 | 2169 | "reusify@npm:^1.0.4": 2170 | version: 1.0.4 2171 | resolution: "reusify@npm:1.0.4" 2172 | checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc 2173 | languageName: node 2174 | linkType: hard 2175 | 2176 | "rimraf@npm:^3.0.2": 2177 | version: 3.0.2 2178 | resolution: "rimraf@npm:3.0.2" 2179 | dependencies: 2180 | glob: ^7.1.3 2181 | bin: 2182 | rimraf: bin.js 2183 | checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 2184 | languageName: node 2185 | linkType: hard 2186 | 2187 | "run-parallel@npm:^1.1.9": 2188 | version: 1.2.0 2189 | resolution: "run-parallel@npm:1.2.0" 2190 | dependencies: 2191 | queue-microtask: ^1.2.2 2192 | checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d 2193 | languageName: node 2194 | linkType: hard 2195 | 2196 | "scrypt-js@npm:3.0.1": 2197 | version: 3.0.1 2198 | resolution: "scrypt-js@npm:3.0.1" 2199 | checksum: b7c7d1a68d6ca946f2fbb0778e0c4ec63c65501b54023b2af7d7e9f48fdb6c6580d6f7675cd53bda5944c5ebc057560d5a6365079752546865defb3b79dea454 2200 | languageName: node 2201 | linkType: hard 2202 | 2203 | "semver@npm:^7.3.7": 2204 | version: 7.3.8 2205 | resolution: "semver@npm:7.3.8" 2206 | dependencies: 2207 | lru-cache: ^6.0.0 2208 | bin: 2209 | semver: bin/semver.js 2210 | checksum: ba9c7cbbf2b7884696523450a61fee1a09930d888b7a8d7579025ad93d459b2d1949ee5bbfeb188b2be5f4ac163544c5e98491ad6152df34154feebc2cc337c1 2211 | languageName: node 2212 | linkType: hard 2213 | 2214 | "shebang-command@npm:^2.0.0": 2215 | version: 2.0.0 2216 | resolution: "shebang-command@npm:2.0.0" 2217 | dependencies: 2218 | shebang-regex: ^3.0.0 2219 | checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa 2220 | languageName: node 2221 | linkType: hard 2222 | 2223 | "shebang-regex@npm:^3.0.0": 2224 | version: 3.0.0 2225 | resolution: "shebang-regex@npm:3.0.0" 2226 | checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 2227 | languageName: node 2228 | linkType: hard 2229 | 2230 | "slash@npm:^3.0.0": 2231 | version: 3.0.0 2232 | resolution: "slash@npm:3.0.0" 2233 | checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c 2234 | languageName: node 2235 | linkType: hard 2236 | 2237 | "source-map@npm:^0.5.0": 2238 | version: 0.5.7 2239 | resolution: "source-map@npm:0.5.7" 2240 | checksum: 5dc2043b93d2f194142c7f38f74a24670cd7a0063acdaf4bf01d2964b402257ae843c2a8fa822ad5b71013b5fcafa55af7421383da919752f22ff488bc553f4d 2241 | languageName: node 2242 | linkType: hard 2243 | 2244 | "string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": 2245 | version: 4.2.3 2246 | resolution: "string-width@npm:4.2.3" 2247 | dependencies: 2248 | emoji-regex: ^8.0.0 2249 | is-fullwidth-code-point: ^3.0.0 2250 | strip-ansi: ^6.0.1 2251 | checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb 2252 | languageName: node 2253 | linkType: hard 2254 | 2255 | "strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": 2256 | version: 6.0.1 2257 | resolution: "strip-ansi@npm:6.0.1" 2258 | dependencies: 2259 | ansi-regex: ^5.0.1 2260 | checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c 2261 | languageName: node 2262 | linkType: hard 2263 | 2264 | "strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": 2265 | version: 3.1.1 2266 | resolution: "strip-json-comments@npm:3.1.1" 2267 | checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 2268 | languageName: node 2269 | linkType: hard 2270 | 2271 | "supports-color@npm:^5.3.0": 2272 | version: 5.5.0 2273 | resolution: "supports-color@npm:5.5.0" 2274 | dependencies: 2275 | has-flag: ^3.0.0 2276 | checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac 2277 | languageName: node 2278 | linkType: hard 2279 | 2280 | "supports-color@npm:^7.1.0": 2281 | version: 7.2.0 2282 | resolution: "supports-color@npm:7.2.0" 2283 | dependencies: 2284 | has-flag: ^4.0.0 2285 | checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a 2286 | languageName: node 2287 | linkType: hard 2288 | 2289 | "text-table@npm:^0.2.0": 2290 | version: 0.2.0 2291 | resolution: "text-table@npm:0.2.0" 2292 | checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a 2293 | languageName: node 2294 | linkType: hard 2295 | 2296 | "to-fast-properties@npm:^2.0.0": 2297 | version: 2.0.0 2298 | resolution: "to-fast-properties@npm:2.0.0" 2299 | checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 2300 | languageName: node 2301 | linkType: hard 2302 | 2303 | "to-regex-range@npm:^5.0.1": 2304 | version: 5.0.1 2305 | resolution: "to-regex-range@npm:5.0.1" 2306 | dependencies: 2307 | is-number: ^7.0.0 2308 | checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed 2309 | languageName: node 2310 | linkType: hard 2311 | 2312 | "tr46@npm:~0.0.3": 2313 | version: 0.0.3 2314 | resolution: "tr46@npm:0.0.3" 2315 | checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 2316 | languageName: node 2317 | linkType: hard 2318 | 2319 | "ts-node@npm:^10.9.1": 2320 | version: 10.9.1 2321 | resolution: "ts-node@npm:10.9.1" 2322 | dependencies: 2323 | "@cspotcode/source-map-support": ^0.8.0 2324 | "@tsconfig/node10": ^1.0.7 2325 | "@tsconfig/node12": ^1.0.7 2326 | "@tsconfig/node14": ^1.0.0 2327 | "@tsconfig/node16": ^1.0.2 2328 | acorn: ^8.4.1 2329 | acorn-walk: ^8.1.1 2330 | arg: ^4.1.0 2331 | create-require: ^1.1.0 2332 | diff: ^4.0.1 2333 | make-error: ^1.1.1 2334 | v8-compile-cache-lib: ^3.0.1 2335 | yn: 3.1.1 2336 | peerDependencies: 2337 | "@swc/core": ">=1.2.50" 2338 | "@swc/wasm": ">=1.2.50" 2339 | "@types/node": "*" 2340 | typescript: ">=2.7" 2341 | peerDependenciesMeta: 2342 | "@swc/core": 2343 | optional: true 2344 | "@swc/wasm": 2345 | optional: true 2346 | bin: 2347 | ts-node: dist/bin.js 2348 | ts-node-cwd: dist/bin-cwd.js 2349 | ts-node-esm: dist/bin-esm.js 2350 | ts-node-script: dist/bin-script.js 2351 | ts-node-transpile-only: dist/bin-transpile.js 2352 | ts-script: dist/bin-script-deprecated.js 2353 | checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 2354 | languageName: node 2355 | linkType: hard 2356 | 2357 | "tslib@npm:^1.8.1": 2358 | version: 1.14.1 2359 | resolution: "tslib@npm:1.14.1" 2360 | checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd 2361 | languageName: node 2362 | linkType: hard 2363 | 2364 | "tsutils@npm:^3.21.0": 2365 | version: 3.21.0 2366 | resolution: "tsutils@npm:3.21.0" 2367 | dependencies: 2368 | tslib: ^1.8.1 2369 | peerDependencies: 2370 | typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" 2371 | checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 2372 | languageName: node 2373 | linkType: hard 2374 | 2375 | "type-check@npm:^0.4.0, type-check@npm:~0.4.0": 2376 | version: 0.4.0 2377 | resolution: "type-check@npm:0.4.0" 2378 | dependencies: 2379 | prelude-ls: ^1.2.1 2380 | checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a 2381 | languageName: node 2382 | linkType: hard 2383 | 2384 | "type-fest@npm:^0.20.2": 2385 | version: 0.20.2 2386 | resolution: "type-fest@npm:0.20.2" 2387 | checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 2388 | languageName: node 2389 | linkType: hard 2390 | 2391 | "typescript@npm:^4.9.5": 2392 | version: 4.9.5 2393 | resolution: "typescript@npm:4.9.5" 2394 | bin: 2395 | tsc: bin/tsc 2396 | tsserver: bin/tsserver 2397 | checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db 2398 | languageName: node 2399 | linkType: hard 2400 | 2401 | "typescript@patch:typescript@^4.9.5#~builtin": 2402 | version: 4.9.5 2403 | resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=bda367" 2404 | bin: 2405 | tsc: bin/tsc 2406 | tsserver: bin/tsserver 2407 | checksum: 2eee5c37cad4390385db5db5a8e81470e42e8f1401b0358d7390095d6f681b410f2c4a0c496c6ff9ebd775423c7785cdace7bcdad76c7bee283df3d9718c0f20 2408 | languageName: node 2409 | linkType: hard 2410 | 2411 | "uri-js@npm:^4.2.2": 2412 | version: 4.4.1 2413 | resolution: "uri-js@npm:4.4.1" 2414 | dependencies: 2415 | punycode: ^2.1.0 2416 | checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 2417 | languageName: node 2418 | linkType: hard 2419 | 2420 | "v8-compile-cache-lib@npm:^3.0.1": 2421 | version: 3.0.1 2422 | resolution: "v8-compile-cache-lib@npm:3.0.1" 2423 | checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 2424 | languageName: node 2425 | linkType: hard 2426 | 2427 | "webidl-conversions@npm:^3.0.0": 2428 | version: 3.0.1 2429 | resolution: "webidl-conversions@npm:3.0.1" 2430 | checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c 2431 | languageName: node 2432 | linkType: hard 2433 | 2434 | "whatwg-url@npm:^5.0.0": 2435 | version: 5.0.0 2436 | resolution: "whatwg-url@npm:5.0.0" 2437 | dependencies: 2438 | tr46: ~0.0.3 2439 | webidl-conversions: ^3.0.0 2440 | checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c 2441 | languageName: node 2442 | linkType: hard 2443 | 2444 | "which@npm:^2.0.1": 2445 | version: 2.0.2 2446 | resolution: "which@npm:2.0.2" 2447 | dependencies: 2448 | isexe: ^2.0.0 2449 | bin: 2450 | node-which: ./bin/node-which 2451 | checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 2452 | languageName: node 2453 | linkType: hard 2454 | 2455 | "word-wrap@npm:^1.2.3": 2456 | version: 1.2.3 2457 | resolution: "word-wrap@npm:1.2.3" 2458 | checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f 2459 | languageName: node 2460 | linkType: hard 2461 | 2462 | "wrap-ansi@npm:^7.0.0": 2463 | version: 7.0.0 2464 | resolution: "wrap-ansi@npm:7.0.0" 2465 | dependencies: 2466 | ansi-styles: ^4.0.0 2467 | string-width: ^4.1.0 2468 | strip-ansi: ^6.0.0 2469 | checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b 2470 | languageName: node 2471 | linkType: hard 2472 | 2473 | "wrappy@npm:1": 2474 | version: 1.0.2 2475 | resolution: "wrappy@npm:1.0.2" 2476 | checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 2477 | languageName: node 2478 | linkType: hard 2479 | 2480 | "ws@npm:7.4.6": 2481 | version: 7.4.6 2482 | resolution: "ws@npm:7.4.6" 2483 | peerDependencies: 2484 | bufferutil: ^4.0.1 2485 | utf-8-validate: ^5.0.2 2486 | peerDependenciesMeta: 2487 | bufferutil: 2488 | optional: true 2489 | utf-8-validate: 2490 | optional: true 2491 | checksum: 3a990b32ed08c72070d5e8913e14dfcd831919205be52a3ff0b4cdd998c8d554f167c9df3841605cde8b11d607768cacab3e823c58c96a5c08c987e093eb767a 2492 | languageName: node 2493 | linkType: hard 2494 | 2495 | "y18n@npm:^5.0.5": 2496 | version: 5.0.8 2497 | resolution: "y18n@npm:5.0.8" 2498 | checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 2499 | languageName: node 2500 | linkType: hard 2501 | 2502 | "yallist@npm:^4.0.0": 2503 | version: 4.0.0 2504 | resolution: "yallist@npm:4.0.0" 2505 | checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 2506 | languageName: node 2507 | linkType: hard 2508 | 2509 | "yargs-parser@npm:^21.1.1": 2510 | version: 21.1.1 2511 | resolution: "yargs-parser@npm:21.1.1" 2512 | checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c 2513 | languageName: node 2514 | linkType: hard 2515 | 2516 | "yargs@npm:^17.7.1": 2517 | version: 17.7.1 2518 | resolution: "yargs@npm:17.7.1" 2519 | dependencies: 2520 | cliui: ^8.0.1 2521 | escalade: ^3.1.1 2522 | get-caller-file: ^2.0.5 2523 | require-directory: ^2.1.1 2524 | string-width: ^4.2.3 2525 | y18n: ^5.0.5 2526 | yargs-parser: ^21.1.1 2527 | checksum: 3d8a43c336a4942bc68080768664aca85c7bd406f018bad362fd255c41c8f4e650277f42fd65d543fce99e084124ddafee7bbfc1a5c6a8fda4cec78609dcf8d4 2528 | languageName: node 2529 | linkType: hard 2530 | 2531 | "yn@npm:3.1.1": 2532 | version: 3.1.1 2533 | resolution: "yn@npm:3.1.1" 2534 | checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 2535 | languageName: node 2536 | linkType: hard 2537 | 2538 | "yocto-queue@npm:^0.1.0": 2539 | version: 0.1.0 2540 | resolution: "yocto-queue@npm:0.1.0" 2541 | checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 2542 | languageName: node 2543 | linkType: hard 2544 | 2545 | "zod@npm:^3.21.2, zod@npm:^3.21.4": 2546 | version: 3.21.4 2547 | resolution: "zod@npm:3.21.4" 2548 | checksum: f185ba87342ff16f7a06686767c2b2a7af41110c7edf7c1974095d8db7a73792696bcb4a00853de0d2edeb34a5b2ea6a55871bc864227dace682a0a28de33e1f 2549 | languageName: node 2550 | linkType: hard 2551 | --------------------------------------------------------------------------------