├── .env.example ├── .github └── workflows │ ├── lints.yml │ └── tests.yml ├── .gitignore ├── .gitmodules ├── .prettierignore ├── .solhint.json ├── LICENSE ├── README.md ├── assets └── readme.jpeg ├── foundry.toml ├── package-lock.json ├── package.json ├── remappings.txt ├── scripts ├── deploy-to-rinkeby.sh └── verify-on-rinkeby.sh └── src ├── MyERC20.sol └── test ├── MyERC20.t.sol └── utils ├── Utils.sol └── test.sol /.env.example: -------------------------------------------------------------------------------- 1 | INFURA_API_KEY= 2 | PRIVATE_KEY= 3 | ETHERSCAN_API_KEY= -------------------------------------------------------------------------------- /.github/workflows/lints.yml: -------------------------------------------------------------------------------- 1 | name: Lints 2 | 3 | on: [push] 4 | 5 | jobs: 6 | check: 7 | name: Foundry project 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v2 11 | with: 12 | submodules: recursive 13 | 14 | - name: Install Foundry 15 | uses: onbjerg/foundry-toolchain@v1 16 | with: 17 | version: nightly 18 | 19 | - name: Install Dependencies 20 | run: npm ci 21 | 22 | - name: Run lints 23 | run: npx prettier --write src/**/*.sol && npx prettier --write src/*.sol 24 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | 3 | on: [push] 4 | 5 | jobs: 6 | check: 7 | name: Foundry project 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v2 11 | with: 12 | submodules: recursive 13 | 14 | - name: Install Foundry 15 | uses: onbjerg/foundry-toolchain@v1 16 | with: 17 | version: nightly 18 | 19 | - name: Run tests 20 | run: forge test -vvv 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | cache/ 2 | out/ 3 | node_modules/ 4 | .env -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lib/forge-std"] 2 | path = lib/forge-std 3 | url = https://github.com/brockelmore/forge-std 4 | [submodule "lib/openzeppelin-contracts"] 5 | path = lib/openzeppelin-contracts 6 | url = https://github.com/openzeppelin/openzeppelin-contracts 7 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | build 2 | coverage 3 | out 4 | lib 5 | assets 6 | node_modules 7 | .next -------------------------------------------------------------------------------- /.solhint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "solhint:recommended", 3 | "plugins": ["prettier"], 4 | "rules": { 5 | "compiler-version": ["error", ">=0.8.0"], 6 | "avoid-low-level-calls": "off", 7 | "prettier/prettier": "error" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 SolidityLabs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # forge-erc20 • [![tests](https://github.com/soliditylabs/forge-erc20-template/actions/workflows/tests.yml/badge.svg)](https://github.com/soliditylabs/forge-erc20-template/actions/workflows/tests.yml) [![lints](https://github.com/soliditylabs/forge-erc20-template/actions/workflows/lints.yml/badge.svg)](https://github.com/soliditylabs/forge-erc20-template/actions/workflows/lints.yml) ![GitHub](https://img.shields.io/github/license/soliditylabs/forge-erc20-template) ![GitHub package.json version](https://img.shields.io/github/package-json/v/soliditylabs/forge-erc20-template) 4 | 5 | Template for Forge based on [femplate](https://github.com/abigger87/femplate) and [forge-template](https://github.com/FrankieIsLost/forge-template) with ERC-20 example tests. 6 | 7 | ## Getting Started 8 | 9 | Click `use this template` on [Github](https://github.com/soliditylabs/forge-erc20-template) to create a new repository with this repo as the initial state. 10 | 11 | Or run (also works for existing projects): 12 | 13 | ```bash 14 | forge init --template https://github.com/soliditylabs/forge-erc20-template 15 | git submodule update --init --recursive 16 | forge install 17 | ``` 18 | 19 | ## Blueprint 20 | 21 | ```ml 22 | lib 23 | ├─ ds-test — https://github.com/dapphub/ds-test 24 | ├─ forge-std — https://github.com/brockelmore/forge-std 25 | ├─ openzeppelin-contracts — https://github.com/OpenZeppelin/openzeppelin-contracts 26 | src 27 | ├─ tests 28 | │ └─ MyERC20.t — "ERC-20 Transfer Tests" 29 | └─ MyERC20 — "A Minimal ERC-20 Contract" 30 | ``` 31 | 32 | ## Development 33 | 34 | **Building** 35 | 36 | ```bash 37 | forge build 38 | ``` 39 | 40 | **Testing** 41 | 42 | ```bash 43 | forge test -vvvvv 44 | ``` 45 | 46 | **Deployment & Verification** 47 | 48 | Copy the .env.example file to .env and update the values. 49 | 50 | To deploy the ERC-20 to Rinkeby: 51 | 52 | ```bash 53 | ./scripts/deploy-to-rinkeby.sh 54 | ``` 55 | 56 | To verify the ERC-20 on Rinkeby: 57 | 58 | ```bash 59 | ./scripts/deploy-to-rinkeby.sh 60 | ``` 61 | 62 | ### First time with Forge/Foundry? 63 | 64 | See the official Foundry installation [instructions](https://github.com/gakonst/foundry/blob/master/README.md#installation). 65 | 66 | Then, install the [foundry](https://github.com/gakonst/foundry) toolchain installer (`foundryup`) with: 67 | 68 | ```bash 69 | curl -L https://foundry.paradigm.xyz | bash 70 | ``` 71 | 72 | Now that you've installed the `foundryup` binary, 73 | anytime you need to get the latest `forge` or `cast` binaries, 74 | you can run `foundryup`. 75 | 76 | So, simply execute: 77 | 78 | ```bash 79 | foundryup 80 | ``` 81 | 82 | 🎉 Foundry is installed! 🎉 83 | 84 | ### Writing Tests with Foundry 85 | 86 | With [Foundry](https://gakonst.xyz), tests are written in Solidity! 🥳 87 | 88 | Create a test file for your contract in the `src/tests/` directory. 89 | 90 | For example, [`src/MyERC20.sol`](./src/MyERC20.sol) has its test file defined in [`./src/tests/MyERC20.t.sol`](./src/tests/MyERC20.t.sol). 91 | 92 | ### Configure Foundry 93 | 94 | Using [foundry.toml](./foundry.toml), Foundry is easily configurable. 95 | 96 | For a full list of configuration options, see the Foundry [configuration documentation](https://github.com/gakonst/foundry/blob/master/config/README.md#all-options). 97 | 98 | ## License 99 | 100 | [MIT](https://github.com/soliditylabs/forge-erc20-template/blob/master/LICENSE) 101 | 102 | ## Acknowledgements 103 | 104 | - [femplate](https://github.com/abigger87/femplate) as main reference 105 | - [foundry](https://github.com/gakonst/foundry) 106 | - [Openzeppelin](https://github.com/Openzeppelin/openzeppelin-contracts) 107 | - [forge-std](https://github.com/brockelmore/forge-std) 108 | - [forge-template](https://github.com/FrankieIsLost/forge-template) by [FrankieIsLost](https://github.com/FrankieIsLost). 109 | - [Georgios Konstantopoulos](https://github.com/gakonst) for [forge-template](https://github.com/gakonst/forge-template) resource. 110 | 111 | ## Disclaimer 112 | 113 | _These smart contracts are being provided as is. No guarantee, representation or warranty is being made, express or implied, as to the safety or correctness of the user interface or the smart contracts. They have not been audited and as such there can be no assurance they will work as intended, and users may experience delays, failures, errors, omissions, loss of transmitted information or loss of funds. The creators are not liable for any of the foregoing. Users should proceed with caution and use at their own risk._ 114 | -------------------------------------------------------------------------------- /assets/readme.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soliditylabs/forge-erc20-template/d9753d0a094a8c38fe057eb5e755a903df481193/assets/readme.jpeg -------------------------------------------------------------------------------- /foundry.toml: -------------------------------------------------------------------------------- 1 | # Additional configuration and default values at https://github.com/gakonst/foundry/tree/master/config 2 | [default] 3 | 4 | # Sets the concrete solc version to use 5 | # This overrides the `auto_detect_solc` value 6 | # solc_version = '0.8.13' 7 | 8 | remappings = [ 9 | "ds/=lib/ds-test/src/", 10 | "@std=lib/forge-std/src/", 11 | "@openzeppelin=lib/openzeppelin-contracts/contracts/", 12 | ] 13 | 14 | [ci] 15 | fuzz_runs = 2_000 16 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "forge-erc20-template", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "forge-erc20-template", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "prettier": "^2.6.2", 13 | "prettier-plugin-solidity": "^1.0.0-beta.19", 14 | "solhint": "^3.3.7", 15 | "solhint-plugin-prettier": "^0.0.5" 16 | } 17 | }, 18 | "node_modules/@babel/code-frame": { 19 | "version": "7.16.7", 20 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", 21 | "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", 22 | "dev": true, 23 | "dependencies": { 24 | "@babel/highlight": "^7.16.7" 25 | }, 26 | "engines": { 27 | "node": ">=6.9.0" 28 | } 29 | }, 30 | "node_modules/@babel/helper-validator-identifier": { 31 | "version": "7.16.7", 32 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", 33 | "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", 34 | "dev": true, 35 | "engines": { 36 | "node": ">=6.9.0" 37 | } 38 | }, 39 | "node_modules/@babel/highlight": { 40 | "version": "7.17.9", 41 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", 42 | "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", 43 | "dev": true, 44 | "dependencies": { 45 | "@babel/helper-validator-identifier": "^7.16.7", 46 | "chalk": "^2.0.0", 47 | "js-tokens": "^4.0.0" 48 | }, 49 | "engines": { 50 | "node": ">=6.9.0" 51 | } 52 | }, 53 | "node_modules/@solidity-parser/parser": { 54 | "version": "0.14.1", 55 | "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.1.tgz", 56 | "integrity": "sha512-eLjj2L6AuQjBB6s/ibwCAc0DwrR5Ge+ys+wgWo+bviU7fV2nTMQhU63CGaDKXg9iTmMxwhkyoggdIR7ZGRfMgw==", 57 | "dev": true, 58 | "dependencies": { 59 | "antlr4ts": "^0.5.0-alpha.4" 60 | } 61 | }, 62 | "node_modules/acorn": { 63 | "version": "6.4.2", 64 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", 65 | "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", 66 | "dev": true, 67 | "bin": { 68 | "acorn": "bin/acorn" 69 | }, 70 | "engines": { 71 | "node": ">=0.4.0" 72 | } 73 | }, 74 | "node_modules/acorn-jsx": { 75 | "version": "5.3.2", 76 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 77 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 78 | "dev": true, 79 | "peerDependencies": { 80 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 81 | } 82 | }, 83 | "node_modules/ajv": { 84 | "version": "6.12.6", 85 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 86 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 87 | "dev": true, 88 | "dependencies": { 89 | "fast-deep-equal": "^3.1.1", 90 | "fast-json-stable-stringify": "^2.0.0", 91 | "json-schema-traverse": "^0.4.1", 92 | "uri-js": "^4.2.2" 93 | }, 94 | "funding": { 95 | "type": "github", 96 | "url": "https://github.com/sponsors/epoberezkin" 97 | } 98 | }, 99 | "node_modules/ansi-escapes": { 100 | "version": "3.2.0", 101 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 102 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 103 | "dev": true, 104 | "engines": { 105 | "node": ">=4" 106 | } 107 | }, 108 | "node_modules/ansi-regex": { 109 | "version": "3.0.1", 110 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", 111 | "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", 112 | "dev": true, 113 | "engines": { 114 | "node": ">=4" 115 | } 116 | }, 117 | "node_modules/ansi-styles": { 118 | "version": "3.2.1", 119 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 120 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 121 | "dev": true, 122 | "dependencies": { 123 | "color-convert": "^1.9.0" 124 | }, 125 | "engines": { 126 | "node": ">=4" 127 | } 128 | }, 129 | "node_modules/antlr4": { 130 | "version": "4.7.1", 131 | "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz", 132 | "integrity": "sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==", 133 | "dev": true 134 | }, 135 | "node_modules/antlr4ts": { 136 | "version": "0.5.0-alpha.4", 137 | "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", 138 | "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", 139 | "dev": true 140 | }, 141 | "node_modules/argparse": { 142 | "version": "1.0.10", 143 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 144 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 145 | "dev": true, 146 | "dependencies": { 147 | "sprintf-js": "~1.0.2" 148 | } 149 | }, 150 | "node_modules/ast-parents": { 151 | "version": "0.0.1", 152 | "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", 153 | "integrity": "sha1-UI/Q8F0MSHddnszaLhdEIyYejdM=", 154 | "dev": true 155 | }, 156 | "node_modules/astral-regex": { 157 | "version": "1.0.0", 158 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 159 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 160 | "dev": true, 161 | "engines": { 162 | "node": ">=4" 163 | } 164 | }, 165 | "node_modules/balanced-match": { 166 | "version": "1.0.2", 167 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 168 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 169 | "dev": true 170 | }, 171 | "node_modules/brace-expansion": { 172 | "version": "1.1.11", 173 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 174 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 175 | "dev": true, 176 | "dependencies": { 177 | "balanced-match": "^1.0.0", 178 | "concat-map": "0.0.1" 179 | } 180 | }, 181 | "node_modules/caller-callsite": { 182 | "version": "2.0.0", 183 | "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", 184 | "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", 185 | "dev": true, 186 | "dependencies": { 187 | "callsites": "^2.0.0" 188 | }, 189 | "engines": { 190 | "node": ">=4" 191 | } 192 | }, 193 | "node_modules/caller-path": { 194 | "version": "2.0.0", 195 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", 196 | "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", 197 | "dev": true, 198 | "dependencies": { 199 | "caller-callsite": "^2.0.0" 200 | }, 201 | "engines": { 202 | "node": ">=4" 203 | } 204 | }, 205 | "node_modules/callsites": { 206 | "version": "2.0.0", 207 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", 208 | "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", 209 | "dev": true, 210 | "engines": { 211 | "node": ">=4" 212 | } 213 | }, 214 | "node_modules/chalk": { 215 | "version": "2.4.2", 216 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 217 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 218 | "dev": true, 219 | "dependencies": { 220 | "ansi-styles": "^3.2.1", 221 | "escape-string-regexp": "^1.0.5", 222 | "supports-color": "^5.3.0" 223 | }, 224 | "engines": { 225 | "node": ">=4" 226 | } 227 | }, 228 | "node_modules/chalk/node_modules/escape-string-regexp": { 229 | "version": "1.0.5", 230 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 231 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 232 | "dev": true, 233 | "engines": { 234 | "node": ">=0.8.0" 235 | } 236 | }, 237 | "node_modules/chardet": { 238 | "version": "0.7.0", 239 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 240 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 241 | "dev": true 242 | }, 243 | "node_modules/cli-cursor": { 244 | "version": "2.1.0", 245 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 246 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 247 | "dev": true, 248 | "dependencies": { 249 | "restore-cursor": "^2.0.0" 250 | }, 251 | "engines": { 252 | "node": ">=4" 253 | } 254 | }, 255 | "node_modules/cli-width": { 256 | "version": "2.2.1", 257 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 258 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", 259 | "dev": true 260 | }, 261 | "node_modules/color-convert": { 262 | "version": "1.9.3", 263 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 264 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 265 | "dev": true, 266 | "dependencies": { 267 | "color-name": "1.1.3" 268 | } 269 | }, 270 | "node_modules/color-name": { 271 | "version": "1.1.3", 272 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 273 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 274 | "dev": true 275 | }, 276 | "node_modules/commander": { 277 | "version": "2.18.0", 278 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", 279 | "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", 280 | "dev": true 281 | }, 282 | "node_modules/concat-map": { 283 | "version": "0.0.1", 284 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 285 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 286 | "dev": true 287 | }, 288 | "node_modules/cosmiconfig": { 289 | "version": "5.2.1", 290 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", 291 | "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", 292 | "dev": true, 293 | "dependencies": { 294 | "import-fresh": "^2.0.0", 295 | "is-directory": "^0.3.1", 296 | "js-yaml": "^3.13.1", 297 | "parse-json": "^4.0.0" 298 | }, 299 | "engines": { 300 | "node": ">=4" 301 | } 302 | }, 303 | "node_modules/cross-spawn": { 304 | "version": "6.0.5", 305 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 306 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 307 | "dev": true, 308 | "dependencies": { 309 | "nice-try": "^1.0.4", 310 | "path-key": "^2.0.1", 311 | "semver": "^5.5.0", 312 | "shebang-command": "^1.2.0", 313 | "which": "^1.2.9" 314 | }, 315 | "engines": { 316 | "node": ">=4.8" 317 | } 318 | }, 319 | "node_modules/cross-spawn/node_modules/semver": { 320 | "version": "5.7.1", 321 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 322 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 323 | "dev": true, 324 | "bin": { 325 | "semver": "bin/semver" 326 | } 327 | }, 328 | "node_modules/debug": { 329 | "version": "4.3.4", 330 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 331 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 332 | "dev": true, 333 | "dependencies": { 334 | "ms": "2.1.2" 335 | }, 336 | "engines": { 337 | "node": ">=6.0" 338 | }, 339 | "peerDependenciesMeta": { 340 | "supports-color": { 341 | "optional": true 342 | } 343 | } 344 | }, 345 | "node_modules/deep-is": { 346 | "version": "0.1.4", 347 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 348 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 349 | "dev": true 350 | }, 351 | "node_modules/doctrine": { 352 | "version": "3.0.0", 353 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 354 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 355 | "dev": true, 356 | "dependencies": { 357 | "esutils": "^2.0.2" 358 | }, 359 | "engines": { 360 | "node": ">=6.0.0" 361 | } 362 | }, 363 | "node_modules/emoji-regex": { 364 | "version": "10.1.0", 365 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.1.0.tgz", 366 | "integrity": "sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==", 367 | "dev": true 368 | }, 369 | "node_modules/error-ex": { 370 | "version": "1.3.2", 371 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 372 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 373 | "dev": true, 374 | "dependencies": { 375 | "is-arrayish": "^0.2.1" 376 | } 377 | }, 378 | "node_modules/escape-string-regexp": { 379 | "version": "4.0.0", 380 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 381 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 382 | "dev": true, 383 | "engines": { 384 | "node": ">=10" 385 | }, 386 | "funding": { 387 | "url": "https://github.com/sponsors/sindresorhus" 388 | } 389 | }, 390 | "node_modules/eslint": { 391 | "version": "5.16.0", 392 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", 393 | "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", 394 | "dev": true, 395 | "dependencies": { 396 | "@babel/code-frame": "^7.0.0", 397 | "ajv": "^6.9.1", 398 | "chalk": "^2.1.0", 399 | "cross-spawn": "^6.0.5", 400 | "debug": "^4.0.1", 401 | "doctrine": "^3.0.0", 402 | "eslint-scope": "^4.0.3", 403 | "eslint-utils": "^1.3.1", 404 | "eslint-visitor-keys": "^1.0.0", 405 | "espree": "^5.0.1", 406 | "esquery": "^1.0.1", 407 | "esutils": "^2.0.2", 408 | "file-entry-cache": "^5.0.1", 409 | "functional-red-black-tree": "^1.0.1", 410 | "glob": "^7.1.2", 411 | "globals": "^11.7.0", 412 | "ignore": "^4.0.6", 413 | "import-fresh": "^3.0.0", 414 | "imurmurhash": "^0.1.4", 415 | "inquirer": "^6.2.2", 416 | "js-yaml": "^3.13.0", 417 | "json-stable-stringify-without-jsonify": "^1.0.1", 418 | "levn": "^0.3.0", 419 | "lodash": "^4.17.11", 420 | "minimatch": "^3.0.4", 421 | "mkdirp": "^0.5.1", 422 | "natural-compare": "^1.4.0", 423 | "optionator": "^0.8.2", 424 | "path-is-inside": "^1.0.2", 425 | "progress": "^2.0.0", 426 | "regexpp": "^2.0.1", 427 | "semver": "^5.5.1", 428 | "strip-ansi": "^4.0.0", 429 | "strip-json-comments": "^2.0.1", 430 | "table": "^5.2.3", 431 | "text-table": "^0.2.0" 432 | }, 433 | "bin": { 434 | "eslint": "bin/eslint.js" 435 | }, 436 | "engines": { 437 | "node": "^6.14.0 || ^8.10.0 || >=9.10.0" 438 | } 439 | }, 440 | "node_modules/eslint-scope": { 441 | "version": "4.0.3", 442 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", 443 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", 444 | "dev": true, 445 | "dependencies": { 446 | "esrecurse": "^4.1.0", 447 | "estraverse": "^4.1.1" 448 | }, 449 | "engines": { 450 | "node": ">=4.0.0" 451 | } 452 | }, 453 | "node_modules/eslint-utils": { 454 | "version": "1.4.3", 455 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 456 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 457 | "dev": true, 458 | "dependencies": { 459 | "eslint-visitor-keys": "^1.1.0" 460 | }, 461 | "engines": { 462 | "node": ">=6" 463 | } 464 | }, 465 | "node_modules/eslint-visitor-keys": { 466 | "version": "1.3.0", 467 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 468 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 469 | "dev": true, 470 | "engines": { 471 | "node": ">=4" 472 | } 473 | }, 474 | "node_modules/eslint/node_modules/import-fresh": { 475 | "version": "3.3.0", 476 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 477 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 478 | "dev": true, 479 | "dependencies": { 480 | "parent-module": "^1.0.0", 481 | "resolve-from": "^4.0.0" 482 | }, 483 | "engines": { 484 | "node": ">=6" 485 | }, 486 | "funding": { 487 | "url": "https://github.com/sponsors/sindresorhus" 488 | } 489 | }, 490 | "node_modules/eslint/node_modules/resolve-from": { 491 | "version": "4.0.0", 492 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 493 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 494 | "dev": true, 495 | "engines": { 496 | "node": ">=4" 497 | } 498 | }, 499 | "node_modules/eslint/node_modules/semver": { 500 | "version": "5.7.1", 501 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 502 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 503 | "dev": true, 504 | "bin": { 505 | "semver": "bin/semver" 506 | } 507 | }, 508 | "node_modules/espree": { 509 | "version": "5.0.1", 510 | "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", 511 | "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", 512 | "dev": true, 513 | "dependencies": { 514 | "acorn": "^6.0.7", 515 | "acorn-jsx": "^5.0.0", 516 | "eslint-visitor-keys": "^1.0.0" 517 | }, 518 | "engines": { 519 | "node": ">=6.0.0" 520 | } 521 | }, 522 | "node_modules/esprima": { 523 | "version": "4.0.1", 524 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 525 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 526 | "dev": true, 527 | "bin": { 528 | "esparse": "bin/esparse.js", 529 | "esvalidate": "bin/esvalidate.js" 530 | }, 531 | "engines": { 532 | "node": ">=4" 533 | } 534 | }, 535 | "node_modules/esquery": { 536 | "version": "1.4.0", 537 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 538 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 539 | "dev": true, 540 | "dependencies": { 541 | "estraverse": "^5.1.0" 542 | }, 543 | "engines": { 544 | "node": ">=0.10" 545 | } 546 | }, 547 | "node_modules/esquery/node_modules/estraverse": { 548 | "version": "5.3.0", 549 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 550 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 551 | "dev": true, 552 | "engines": { 553 | "node": ">=4.0" 554 | } 555 | }, 556 | "node_modules/esrecurse": { 557 | "version": "4.3.0", 558 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 559 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 560 | "dev": true, 561 | "dependencies": { 562 | "estraverse": "^5.2.0" 563 | }, 564 | "engines": { 565 | "node": ">=4.0" 566 | } 567 | }, 568 | "node_modules/esrecurse/node_modules/estraverse": { 569 | "version": "5.3.0", 570 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 571 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 572 | "dev": true, 573 | "engines": { 574 | "node": ">=4.0" 575 | } 576 | }, 577 | "node_modules/estraverse": { 578 | "version": "4.3.0", 579 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 580 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 581 | "dev": true, 582 | "engines": { 583 | "node": ">=4.0" 584 | } 585 | }, 586 | "node_modules/esutils": { 587 | "version": "2.0.3", 588 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 589 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 590 | "dev": true, 591 | "engines": { 592 | "node": ">=0.10.0" 593 | } 594 | }, 595 | "node_modules/external-editor": { 596 | "version": "3.1.0", 597 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 598 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 599 | "dev": true, 600 | "dependencies": { 601 | "chardet": "^0.7.0", 602 | "iconv-lite": "^0.4.24", 603 | "tmp": "^0.0.33" 604 | }, 605 | "engines": { 606 | "node": ">=4" 607 | } 608 | }, 609 | "node_modules/fast-deep-equal": { 610 | "version": "3.1.3", 611 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 612 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 613 | "dev": true 614 | }, 615 | "node_modules/fast-diff": { 616 | "version": "1.2.0", 617 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", 618 | "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", 619 | "dev": true 620 | }, 621 | "node_modules/fast-json-stable-stringify": { 622 | "version": "2.1.0", 623 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 624 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 625 | "dev": true 626 | }, 627 | "node_modules/fast-levenshtein": { 628 | "version": "2.0.6", 629 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 630 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 631 | "dev": true 632 | }, 633 | "node_modules/figures": { 634 | "version": "2.0.0", 635 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 636 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 637 | "dev": true, 638 | "dependencies": { 639 | "escape-string-regexp": "^1.0.5" 640 | }, 641 | "engines": { 642 | "node": ">=4" 643 | } 644 | }, 645 | "node_modules/figures/node_modules/escape-string-regexp": { 646 | "version": "1.0.5", 647 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 648 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 649 | "dev": true, 650 | "engines": { 651 | "node": ">=0.8.0" 652 | } 653 | }, 654 | "node_modules/file-entry-cache": { 655 | "version": "5.0.1", 656 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 657 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 658 | "dev": true, 659 | "dependencies": { 660 | "flat-cache": "^2.0.1" 661 | }, 662 | "engines": { 663 | "node": ">=4" 664 | } 665 | }, 666 | "node_modules/flat-cache": { 667 | "version": "2.0.1", 668 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 669 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 670 | "dev": true, 671 | "dependencies": { 672 | "flatted": "^2.0.0", 673 | "rimraf": "2.6.3", 674 | "write": "1.0.3" 675 | }, 676 | "engines": { 677 | "node": ">=4" 678 | } 679 | }, 680 | "node_modules/flatted": { 681 | "version": "2.0.2", 682 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 683 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 684 | "dev": true 685 | }, 686 | "node_modules/fs.realpath": { 687 | "version": "1.0.0", 688 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 689 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 690 | "dev": true 691 | }, 692 | "node_modules/functional-red-black-tree": { 693 | "version": "1.0.1", 694 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 695 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 696 | "dev": true 697 | }, 698 | "node_modules/glob": { 699 | "version": "7.2.0", 700 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 701 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 702 | "dev": true, 703 | "dependencies": { 704 | "fs.realpath": "^1.0.0", 705 | "inflight": "^1.0.4", 706 | "inherits": "2", 707 | "minimatch": "^3.0.4", 708 | "once": "^1.3.0", 709 | "path-is-absolute": "^1.0.0" 710 | }, 711 | "engines": { 712 | "node": "*" 713 | }, 714 | "funding": { 715 | "url": "https://github.com/sponsors/isaacs" 716 | } 717 | }, 718 | "node_modules/globals": { 719 | "version": "11.12.0", 720 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 721 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 722 | "dev": true, 723 | "engines": { 724 | "node": ">=4" 725 | } 726 | }, 727 | "node_modules/has-flag": { 728 | "version": "3.0.0", 729 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 730 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 731 | "dev": true, 732 | "engines": { 733 | "node": ">=4" 734 | } 735 | }, 736 | "node_modules/iconv-lite": { 737 | "version": "0.4.24", 738 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 739 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 740 | "dev": true, 741 | "dependencies": { 742 | "safer-buffer": ">= 2.1.2 < 3" 743 | }, 744 | "engines": { 745 | "node": ">=0.10.0" 746 | } 747 | }, 748 | "node_modules/ignore": { 749 | "version": "4.0.6", 750 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 751 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 752 | "dev": true, 753 | "engines": { 754 | "node": ">= 4" 755 | } 756 | }, 757 | "node_modules/import-fresh": { 758 | "version": "2.0.0", 759 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", 760 | "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", 761 | "dev": true, 762 | "dependencies": { 763 | "caller-path": "^2.0.0", 764 | "resolve-from": "^3.0.0" 765 | }, 766 | "engines": { 767 | "node": ">=4" 768 | } 769 | }, 770 | "node_modules/imurmurhash": { 771 | "version": "0.1.4", 772 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 773 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 774 | "dev": true, 775 | "engines": { 776 | "node": ">=0.8.19" 777 | } 778 | }, 779 | "node_modules/inflight": { 780 | "version": "1.0.6", 781 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 782 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 783 | "dev": true, 784 | "dependencies": { 785 | "once": "^1.3.0", 786 | "wrappy": "1" 787 | } 788 | }, 789 | "node_modules/inherits": { 790 | "version": "2.0.4", 791 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 792 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 793 | "dev": true 794 | }, 795 | "node_modules/inquirer": { 796 | "version": "6.5.2", 797 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", 798 | "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", 799 | "dev": true, 800 | "dependencies": { 801 | "ansi-escapes": "^3.2.0", 802 | "chalk": "^2.4.2", 803 | "cli-cursor": "^2.1.0", 804 | "cli-width": "^2.0.0", 805 | "external-editor": "^3.0.3", 806 | "figures": "^2.0.0", 807 | "lodash": "^4.17.12", 808 | "mute-stream": "0.0.7", 809 | "run-async": "^2.2.0", 810 | "rxjs": "^6.4.0", 811 | "string-width": "^2.1.0", 812 | "strip-ansi": "^5.1.0", 813 | "through": "^2.3.6" 814 | }, 815 | "engines": { 816 | "node": ">=6.0.0" 817 | } 818 | }, 819 | "node_modules/inquirer/node_modules/is-fullwidth-code-point": { 820 | "version": "2.0.0", 821 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 822 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 823 | "dev": true, 824 | "engines": { 825 | "node": ">=4" 826 | } 827 | }, 828 | "node_modules/inquirer/node_modules/string-width": { 829 | "version": "2.1.1", 830 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 831 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 832 | "dev": true, 833 | "dependencies": { 834 | "is-fullwidth-code-point": "^2.0.0", 835 | "strip-ansi": "^4.0.0" 836 | }, 837 | "engines": { 838 | "node": ">=4" 839 | } 840 | }, 841 | "node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { 842 | "version": "4.0.0", 843 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 844 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 845 | "dev": true, 846 | "dependencies": { 847 | "ansi-regex": "^3.0.0" 848 | }, 849 | "engines": { 850 | "node": ">=4" 851 | } 852 | }, 853 | "node_modules/inquirer/node_modules/strip-ansi": { 854 | "version": "5.2.0", 855 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 856 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 857 | "dev": true, 858 | "dependencies": { 859 | "ansi-regex": "^4.1.0" 860 | }, 861 | "engines": { 862 | "node": ">=6" 863 | } 864 | }, 865 | "node_modules/inquirer/node_modules/strip-ansi/node_modules/ansi-regex": { 866 | "version": "4.1.1", 867 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 868 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 869 | "dev": true, 870 | "engines": { 871 | "node": ">=6" 872 | } 873 | }, 874 | "node_modules/is-arrayish": { 875 | "version": "0.2.1", 876 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 877 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 878 | "dev": true 879 | }, 880 | "node_modules/is-directory": { 881 | "version": "0.3.1", 882 | "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", 883 | "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", 884 | "dev": true, 885 | "engines": { 886 | "node": ">=0.10.0" 887 | } 888 | }, 889 | "node_modules/is-fullwidth-code-point": { 890 | "version": "3.0.0", 891 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 892 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 893 | "dev": true, 894 | "engines": { 895 | "node": ">=8" 896 | } 897 | }, 898 | "node_modules/isexe": { 899 | "version": "2.0.0", 900 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 901 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 902 | "dev": true 903 | }, 904 | "node_modules/js-tokens": { 905 | "version": "4.0.0", 906 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 907 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 908 | "dev": true 909 | }, 910 | "node_modules/js-yaml": { 911 | "version": "3.14.1", 912 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 913 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 914 | "dev": true, 915 | "dependencies": { 916 | "argparse": "^1.0.7", 917 | "esprima": "^4.0.0" 918 | }, 919 | "bin": { 920 | "js-yaml": "bin/js-yaml.js" 921 | } 922 | }, 923 | "node_modules/json-parse-better-errors": { 924 | "version": "1.0.2", 925 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 926 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 927 | "dev": true 928 | }, 929 | "node_modules/json-schema-traverse": { 930 | "version": "0.4.1", 931 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 932 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 933 | "dev": true 934 | }, 935 | "node_modules/json-stable-stringify-without-jsonify": { 936 | "version": "1.0.1", 937 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 938 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 939 | "dev": true 940 | }, 941 | "node_modules/levn": { 942 | "version": "0.3.0", 943 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 944 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 945 | "dev": true, 946 | "dependencies": { 947 | "prelude-ls": "~1.1.2", 948 | "type-check": "~0.3.2" 949 | }, 950 | "engines": { 951 | "node": ">= 0.8.0" 952 | } 953 | }, 954 | "node_modules/lodash": { 955 | "version": "4.17.21", 956 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 957 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 958 | "dev": true 959 | }, 960 | "node_modules/lru-cache": { 961 | "version": "7.8.1", 962 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.1.tgz", 963 | "integrity": "sha512-E1v547OCgJvbvevfjgK9sNKIVXO96NnsTsFPBlg4ZxjhsJSODoH9lk8Bm0OxvHNm6Vm5Yqkl/1fErDxhYL8Skg==", 964 | "dev": true, 965 | "engines": { 966 | "node": ">=12" 967 | } 968 | }, 969 | "node_modules/mimic-fn": { 970 | "version": "1.2.0", 971 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 972 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 973 | "dev": true, 974 | "engines": { 975 | "node": ">=4" 976 | } 977 | }, 978 | "node_modules/minimatch": { 979 | "version": "3.1.2", 980 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 981 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 982 | "dev": true, 983 | "dependencies": { 984 | "brace-expansion": "^1.1.7" 985 | }, 986 | "engines": { 987 | "node": "*" 988 | } 989 | }, 990 | "node_modules/minimist": { 991 | "version": "1.2.6", 992 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 993 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 994 | "dev": true 995 | }, 996 | "node_modules/mkdirp": { 997 | "version": "0.5.6", 998 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 999 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1000 | "dev": true, 1001 | "dependencies": { 1002 | "minimist": "^1.2.6" 1003 | }, 1004 | "bin": { 1005 | "mkdirp": "bin/cmd.js" 1006 | } 1007 | }, 1008 | "node_modules/ms": { 1009 | "version": "2.1.2", 1010 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1011 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1012 | "dev": true 1013 | }, 1014 | "node_modules/mute-stream": { 1015 | "version": "0.0.7", 1016 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1017 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1018 | "dev": true 1019 | }, 1020 | "node_modules/natural-compare": { 1021 | "version": "1.4.0", 1022 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1023 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1024 | "dev": true 1025 | }, 1026 | "node_modules/nice-try": { 1027 | "version": "1.0.5", 1028 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1029 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1030 | "dev": true 1031 | }, 1032 | "node_modules/once": { 1033 | "version": "1.4.0", 1034 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1035 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1036 | "dev": true, 1037 | "dependencies": { 1038 | "wrappy": "1" 1039 | } 1040 | }, 1041 | "node_modules/onetime": { 1042 | "version": "2.0.1", 1043 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1044 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1045 | "dev": true, 1046 | "dependencies": { 1047 | "mimic-fn": "^1.0.0" 1048 | }, 1049 | "engines": { 1050 | "node": ">=4" 1051 | } 1052 | }, 1053 | "node_modules/optionator": { 1054 | "version": "0.8.3", 1055 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1056 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1057 | "dev": true, 1058 | "dependencies": { 1059 | "deep-is": "~0.1.3", 1060 | "fast-levenshtein": "~2.0.6", 1061 | "levn": "~0.3.0", 1062 | "prelude-ls": "~1.1.2", 1063 | "type-check": "~0.3.2", 1064 | "word-wrap": "~1.2.3" 1065 | }, 1066 | "engines": { 1067 | "node": ">= 0.8.0" 1068 | } 1069 | }, 1070 | "node_modules/os-tmpdir": { 1071 | "version": "1.0.2", 1072 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1073 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1074 | "dev": true, 1075 | "engines": { 1076 | "node": ">=0.10.0" 1077 | } 1078 | }, 1079 | "node_modules/parent-module": { 1080 | "version": "1.0.1", 1081 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1082 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1083 | "dev": true, 1084 | "dependencies": { 1085 | "callsites": "^3.0.0" 1086 | }, 1087 | "engines": { 1088 | "node": ">=6" 1089 | } 1090 | }, 1091 | "node_modules/parent-module/node_modules/callsites": { 1092 | "version": "3.1.0", 1093 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1094 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1095 | "dev": true, 1096 | "engines": { 1097 | "node": ">=6" 1098 | } 1099 | }, 1100 | "node_modules/parse-json": { 1101 | "version": "4.0.0", 1102 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 1103 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 1104 | "dev": true, 1105 | "dependencies": { 1106 | "error-ex": "^1.3.1", 1107 | "json-parse-better-errors": "^1.0.1" 1108 | }, 1109 | "engines": { 1110 | "node": ">=4" 1111 | } 1112 | }, 1113 | "node_modules/path-is-absolute": { 1114 | "version": "1.0.1", 1115 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1116 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1117 | "dev": true, 1118 | "engines": { 1119 | "node": ">=0.10.0" 1120 | } 1121 | }, 1122 | "node_modules/path-is-inside": { 1123 | "version": "1.0.2", 1124 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1125 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1126 | "dev": true 1127 | }, 1128 | "node_modules/path-key": { 1129 | "version": "2.0.1", 1130 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1131 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1132 | "dev": true, 1133 | "engines": { 1134 | "node": ">=4" 1135 | } 1136 | }, 1137 | "node_modules/prelude-ls": { 1138 | "version": "1.1.2", 1139 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1140 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1141 | "dev": true, 1142 | "engines": { 1143 | "node": ">= 0.8.0" 1144 | } 1145 | }, 1146 | "node_modules/prettier": { 1147 | "version": "2.6.2", 1148 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", 1149 | "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", 1150 | "dev": true, 1151 | "bin": { 1152 | "prettier": "bin-prettier.js" 1153 | }, 1154 | "engines": { 1155 | "node": ">=10.13.0" 1156 | }, 1157 | "funding": { 1158 | "url": "https://github.com/prettier/prettier?sponsor=1" 1159 | } 1160 | }, 1161 | "node_modules/prettier-linter-helpers": { 1162 | "version": "1.0.0", 1163 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 1164 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 1165 | "dev": true, 1166 | "dependencies": { 1167 | "fast-diff": "^1.1.2" 1168 | }, 1169 | "engines": { 1170 | "node": ">=6.0.0" 1171 | } 1172 | }, 1173 | "node_modules/prettier-plugin-solidity": { 1174 | "version": "1.0.0-beta.19", 1175 | "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.19.tgz", 1176 | "integrity": "sha512-xxRQ5ZiiZyUoMFLE9h7HnUDXI/daf1tnmL1msEdcKmyh7ZGQ4YklkYLC71bfBpYU2WruTb5/SFLUaEb3RApg5g==", 1177 | "dev": true, 1178 | "dependencies": { 1179 | "@solidity-parser/parser": "^0.14.1", 1180 | "emoji-regex": "^10.0.0", 1181 | "escape-string-regexp": "^4.0.0", 1182 | "semver": "^7.3.5", 1183 | "solidity-comments-extractor": "^0.0.7", 1184 | "string-width": "^4.2.3" 1185 | }, 1186 | "engines": { 1187 | "node": ">=12" 1188 | }, 1189 | "peerDependencies": { 1190 | "prettier": "^2.3.0" 1191 | } 1192 | }, 1193 | "node_modules/progress": { 1194 | "version": "2.0.3", 1195 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1196 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1197 | "dev": true, 1198 | "engines": { 1199 | "node": ">=0.4.0" 1200 | } 1201 | }, 1202 | "node_modules/punycode": { 1203 | "version": "2.1.1", 1204 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1205 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1206 | "dev": true, 1207 | "engines": { 1208 | "node": ">=6" 1209 | } 1210 | }, 1211 | "node_modules/regexpp": { 1212 | "version": "2.0.1", 1213 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1214 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1215 | "dev": true, 1216 | "engines": { 1217 | "node": ">=6.5.0" 1218 | } 1219 | }, 1220 | "node_modules/resolve-from": { 1221 | "version": "3.0.0", 1222 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", 1223 | "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", 1224 | "dev": true, 1225 | "engines": { 1226 | "node": ">=4" 1227 | } 1228 | }, 1229 | "node_modules/restore-cursor": { 1230 | "version": "2.0.0", 1231 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1232 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1233 | "dev": true, 1234 | "dependencies": { 1235 | "onetime": "^2.0.0", 1236 | "signal-exit": "^3.0.2" 1237 | }, 1238 | "engines": { 1239 | "node": ">=4" 1240 | } 1241 | }, 1242 | "node_modules/rimraf": { 1243 | "version": "2.6.3", 1244 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1245 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1246 | "dev": true, 1247 | "dependencies": { 1248 | "glob": "^7.1.3" 1249 | }, 1250 | "bin": { 1251 | "rimraf": "bin.js" 1252 | } 1253 | }, 1254 | "node_modules/run-async": { 1255 | "version": "2.4.1", 1256 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 1257 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 1258 | "dev": true, 1259 | "engines": { 1260 | "node": ">=0.12.0" 1261 | } 1262 | }, 1263 | "node_modules/rxjs": { 1264 | "version": "6.6.7", 1265 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 1266 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 1267 | "dev": true, 1268 | "dependencies": { 1269 | "tslib": "^1.9.0" 1270 | }, 1271 | "engines": { 1272 | "npm": ">=2.0.0" 1273 | } 1274 | }, 1275 | "node_modules/safer-buffer": { 1276 | "version": "2.1.2", 1277 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1278 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1279 | "dev": true 1280 | }, 1281 | "node_modules/semver": { 1282 | "version": "7.3.6", 1283 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", 1284 | "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", 1285 | "dev": true, 1286 | "dependencies": { 1287 | "lru-cache": "^7.4.0" 1288 | }, 1289 | "bin": { 1290 | "semver": "bin/semver.js" 1291 | }, 1292 | "engines": { 1293 | "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" 1294 | } 1295 | }, 1296 | "node_modules/shebang-command": { 1297 | "version": "1.2.0", 1298 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1299 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1300 | "dev": true, 1301 | "dependencies": { 1302 | "shebang-regex": "^1.0.0" 1303 | }, 1304 | "engines": { 1305 | "node": ">=0.10.0" 1306 | } 1307 | }, 1308 | "node_modules/shebang-regex": { 1309 | "version": "1.0.0", 1310 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1311 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1312 | "dev": true, 1313 | "engines": { 1314 | "node": ">=0.10.0" 1315 | } 1316 | }, 1317 | "node_modules/signal-exit": { 1318 | "version": "3.0.7", 1319 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1320 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1321 | "dev": true 1322 | }, 1323 | "node_modules/slice-ansi": { 1324 | "version": "2.1.0", 1325 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1326 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1327 | "dev": true, 1328 | "dependencies": { 1329 | "ansi-styles": "^3.2.0", 1330 | "astral-regex": "^1.0.0", 1331 | "is-fullwidth-code-point": "^2.0.0" 1332 | }, 1333 | "engines": { 1334 | "node": ">=6" 1335 | } 1336 | }, 1337 | "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { 1338 | "version": "2.0.0", 1339 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1340 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1341 | "dev": true, 1342 | "engines": { 1343 | "node": ">=4" 1344 | } 1345 | }, 1346 | "node_modules/solhint": { 1347 | "version": "3.3.7", 1348 | "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.3.7.tgz", 1349 | "integrity": "sha512-NjjjVmXI3ehKkb3aNtRJWw55SUVJ8HMKKodwe0HnejA+k0d2kmhw7jvpa+MCTbcEgt8IWSwx0Hu6aCo/iYOZzQ==", 1350 | "dev": true, 1351 | "dependencies": { 1352 | "@solidity-parser/parser": "^0.14.1", 1353 | "ajv": "^6.6.1", 1354 | "antlr4": "4.7.1", 1355 | "ast-parents": "0.0.1", 1356 | "chalk": "^2.4.2", 1357 | "commander": "2.18.0", 1358 | "cosmiconfig": "^5.0.7", 1359 | "eslint": "^5.6.0", 1360 | "fast-diff": "^1.1.2", 1361 | "glob": "^7.1.3", 1362 | "ignore": "^4.0.6", 1363 | "js-yaml": "^3.12.0", 1364 | "lodash": "^4.17.11", 1365 | "semver": "^6.3.0" 1366 | }, 1367 | "bin": { 1368 | "solhint": "solhint.js" 1369 | }, 1370 | "optionalDependencies": { 1371 | "prettier": "^1.14.3" 1372 | } 1373 | }, 1374 | "node_modules/solhint-plugin-prettier": { 1375 | "version": "0.0.5", 1376 | "resolved": "https://registry.npmjs.org/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.5.tgz", 1377 | "integrity": "sha512-7jmWcnVshIrO2FFinIvDQmhQpfpS2rRRn3RejiYgnjIE68xO2bvrYvjqVNfrio4xH9ghOqn83tKuTzLjEbmGIA==", 1378 | "dev": true, 1379 | "dependencies": { 1380 | "prettier-linter-helpers": "^1.0.0" 1381 | }, 1382 | "peerDependencies": { 1383 | "prettier": "^1.15.0 || ^2.0.0", 1384 | "prettier-plugin-solidity": "^1.0.0-alpha.14" 1385 | } 1386 | }, 1387 | "node_modules/solhint/node_modules/prettier": { 1388 | "version": "1.19.1", 1389 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", 1390 | "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", 1391 | "dev": true, 1392 | "optional": true, 1393 | "bin": { 1394 | "prettier": "bin-prettier.js" 1395 | }, 1396 | "engines": { 1397 | "node": ">=4" 1398 | } 1399 | }, 1400 | "node_modules/solhint/node_modules/semver": { 1401 | "version": "6.3.0", 1402 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1403 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1404 | "dev": true, 1405 | "bin": { 1406 | "semver": "bin/semver.js" 1407 | } 1408 | }, 1409 | "node_modules/solidity-comments-extractor": { 1410 | "version": "0.0.7", 1411 | "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", 1412 | "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", 1413 | "dev": true 1414 | }, 1415 | "node_modules/sprintf-js": { 1416 | "version": "1.0.3", 1417 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1418 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1419 | "dev": true 1420 | }, 1421 | "node_modules/string-width": { 1422 | "version": "4.2.3", 1423 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1424 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1425 | "dev": true, 1426 | "dependencies": { 1427 | "emoji-regex": "^8.0.0", 1428 | "is-fullwidth-code-point": "^3.0.0", 1429 | "strip-ansi": "^6.0.1" 1430 | }, 1431 | "engines": { 1432 | "node": ">=8" 1433 | } 1434 | }, 1435 | "node_modules/string-width/node_modules/ansi-regex": { 1436 | "version": "5.0.1", 1437 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1438 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1439 | "dev": true, 1440 | "engines": { 1441 | "node": ">=8" 1442 | } 1443 | }, 1444 | "node_modules/string-width/node_modules/emoji-regex": { 1445 | "version": "8.0.0", 1446 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1447 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1448 | "dev": true 1449 | }, 1450 | "node_modules/string-width/node_modules/strip-ansi": { 1451 | "version": "6.0.1", 1452 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1453 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1454 | "dev": true, 1455 | "dependencies": { 1456 | "ansi-regex": "^5.0.1" 1457 | }, 1458 | "engines": { 1459 | "node": ">=8" 1460 | } 1461 | }, 1462 | "node_modules/strip-ansi": { 1463 | "version": "4.0.0", 1464 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1465 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1466 | "dev": true, 1467 | "dependencies": { 1468 | "ansi-regex": "^3.0.0" 1469 | }, 1470 | "engines": { 1471 | "node": ">=4" 1472 | } 1473 | }, 1474 | "node_modules/strip-json-comments": { 1475 | "version": "2.0.1", 1476 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1477 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1478 | "dev": true, 1479 | "engines": { 1480 | "node": ">=0.10.0" 1481 | } 1482 | }, 1483 | "node_modules/supports-color": { 1484 | "version": "5.5.0", 1485 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1486 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1487 | "dev": true, 1488 | "dependencies": { 1489 | "has-flag": "^3.0.0" 1490 | }, 1491 | "engines": { 1492 | "node": ">=4" 1493 | } 1494 | }, 1495 | "node_modules/table": { 1496 | "version": "5.4.6", 1497 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1498 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1499 | "dev": true, 1500 | "dependencies": { 1501 | "ajv": "^6.10.2", 1502 | "lodash": "^4.17.14", 1503 | "slice-ansi": "^2.1.0", 1504 | "string-width": "^3.0.0" 1505 | }, 1506 | "engines": { 1507 | "node": ">=6.0.0" 1508 | } 1509 | }, 1510 | "node_modules/table/node_modules/ansi-regex": { 1511 | "version": "4.1.1", 1512 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 1513 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 1514 | "dev": true, 1515 | "engines": { 1516 | "node": ">=6" 1517 | } 1518 | }, 1519 | "node_modules/table/node_modules/emoji-regex": { 1520 | "version": "7.0.3", 1521 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 1522 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 1523 | "dev": true 1524 | }, 1525 | "node_modules/table/node_modules/is-fullwidth-code-point": { 1526 | "version": "2.0.0", 1527 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1528 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1529 | "dev": true, 1530 | "engines": { 1531 | "node": ">=4" 1532 | } 1533 | }, 1534 | "node_modules/table/node_modules/string-width": { 1535 | "version": "3.1.0", 1536 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1537 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1538 | "dev": true, 1539 | "dependencies": { 1540 | "emoji-regex": "^7.0.1", 1541 | "is-fullwidth-code-point": "^2.0.0", 1542 | "strip-ansi": "^5.1.0" 1543 | }, 1544 | "engines": { 1545 | "node": ">=6" 1546 | } 1547 | }, 1548 | "node_modules/table/node_modules/strip-ansi": { 1549 | "version": "5.2.0", 1550 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1551 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1552 | "dev": true, 1553 | "dependencies": { 1554 | "ansi-regex": "^4.1.0" 1555 | }, 1556 | "engines": { 1557 | "node": ">=6" 1558 | } 1559 | }, 1560 | "node_modules/text-table": { 1561 | "version": "0.2.0", 1562 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1563 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1564 | "dev": true 1565 | }, 1566 | "node_modules/through": { 1567 | "version": "2.3.8", 1568 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1569 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1570 | "dev": true 1571 | }, 1572 | "node_modules/tmp": { 1573 | "version": "0.0.33", 1574 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1575 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1576 | "dev": true, 1577 | "dependencies": { 1578 | "os-tmpdir": "~1.0.2" 1579 | }, 1580 | "engines": { 1581 | "node": ">=0.6.0" 1582 | } 1583 | }, 1584 | "node_modules/tslib": { 1585 | "version": "1.14.1", 1586 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1587 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 1588 | "dev": true 1589 | }, 1590 | "node_modules/type-check": { 1591 | "version": "0.3.2", 1592 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1593 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1594 | "dev": true, 1595 | "dependencies": { 1596 | "prelude-ls": "~1.1.2" 1597 | }, 1598 | "engines": { 1599 | "node": ">= 0.8.0" 1600 | } 1601 | }, 1602 | "node_modules/uri-js": { 1603 | "version": "4.4.1", 1604 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1605 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1606 | "dev": true, 1607 | "dependencies": { 1608 | "punycode": "^2.1.0" 1609 | } 1610 | }, 1611 | "node_modules/which": { 1612 | "version": "1.3.1", 1613 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1614 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1615 | "dev": true, 1616 | "dependencies": { 1617 | "isexe": "^2.0.0" 1618 | }, 1619 | "bin": { 1620 | "which": "bin/which" 1621 | } 1622 | }, 1623 | "node_modules/word-wrap": { 1624 | "version": "1.2.3", 1625 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1626 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1627 | "dev": true, 1628 | "engines": { 1629 | "node": ">=0.10.0" 1630 | } 1631 | }, 1632 | "node_modules/wrappy": { 1633 | "version": "1.0.2", 1634 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1635 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1636 | "dev": true 1637 | }, 1638 | "node_modules/write": { 1639 | "version": "1.0.3", 1640 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1641 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1642 | "dev": true, 1643 | "dependencies": { 1644 | "mkdirp": "^0.5.1" 1645 | }, 1646 | "engines": { 1647 | "node": ">=4" 1648 | } 1649 | } 1650 | }, 1651 | "dependencies": { 1652 | "@babel/code-frame": { 1653 | "version": "7.16.7", 1654 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", 1655 | "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", 1656 | "dev": true, 1657 | "requires": { 1658 | "@babel/highlight": "^7.16.7" 1659 | } 1660 | }, 1661 | "@babel/helper-validator-identifier": { 1662 | "version": "7.16.7", 1663 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", 1664 | "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", 1665 | "dev": true 1666 | }, 1667 | "@babel/highlight": { 1668 | "version": "7.17.9", 1669 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", 1670 | "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", 1671 | "dev": true, 1672 | "requires": { 1673 | "@babel/helper-validator-identifier": "^7.16.7", 1674 | "chalk": "^2.0.0", 1675 | "js-tokens": "^4.0.0" 1676 | } 1677 | }, 1678 | "@solidity-parser/parser": { 1679 | "version": "0.14.1", 1680 | "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.1.tgz", 1681 | "integrity": "sha512-eLjj2L6AuQjBB6s/ibwCAc0DwrR5Ge+ys+wgWo+bviU7fV2nTMQhU63CGaDKXg9iTmMxwhkyoggdIR7ZGRfMgw==", 1682 | "dev": true, 1683 | "requires": { 1684 | "antlr4ts": "^0.5.0-alpha.4" 1685 | } 1686 | }, 1687 | "acorn": { 1688 | "version": "6.4.2", 1689 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", 1690 | "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", 1691 | "dev": true 1692 | }, 1693 | "acorn-jsx": { 1694 | "version": "5.3.2", 1695 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1696 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1697 | "dev": true, 1698 | "requires": {} 1699 | }, 1700 | "ajv": { 1701 | "version": "6.12.6", 1702 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1703 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1704 | "dev": true, 1705 | "requires": { 1706 | "fast-deep-equal": "^3.1.1", 1707 | "fast-json-stable-stringify": "^2.0.0", 1708 | "json-schema-traverse": "^0.4.1", 1709 | "uri-js": "^4.2.2" 1710 | } 1711 | }, 1712 | "ansi-escapes": { 1713 | "version": "3.2.0", 1714 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 1715 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 1716 | "dev": true 1717 | }, 1718 | "ansi-regex": { 1719 | "version": "3.0.1", 1720 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", 1721 | "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", 1722 | "dev": true 1723 | }, 1724 | "ansi-styles": { 1725 | "version": "3.2.1", 1726 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1727 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1728 | "dev": true, 1729 | "requires": { 1730 | "color-convert": "^1.9.0" 1731 | } 1732 | }, 1733 | "antlr4": { 1734 | "version": "4.7.1", 1735 | "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz", 1736 | "integrity": "sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==", 1737 | "dev": true 1738 | }, 1739 | "antlr4ts": { 1740 | "version": "0.5.0-alpha.4", 1741 | "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", 1742 | "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", 1743 | "dev": true 1744 | }, 1745 | "argparse": { 1746 | "version": "1.0.10", 1747 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 1748 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 1749 | "dev": true, 1750 | "requires": { 1751 | "sprintf-js": "~1.0.2" 1752 | } 1753 | }, 1754 | "ast-parents": { 1755 | "version": "0.0.1", 1756 | "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", 1757 | "integrity": "sha1-UI/Q8F0MSHddnszaLhdEIyYejdM=", 1758 | "dev": true 1759 | }, 1760 | "astral-regex": { 1761 | "version": "1.0.0", 1762 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 1763 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 1764 | "dev": true 1765 | }, 1766 | "balanced-match": { 1767 | "version": "1.0.2", 1768 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1769 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1770 | "dev": true 1771 | }, 1772 | "brace-expansion": { 1773 | "version": "1.1.11", 1774 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1775 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1776 | "dev": true, 1777 | "requires": { 1778 | "balanced-match": "^1.0.0", 1779 | "concat-map": "0.0.1" 1780 | } 1781 | }, 1782 | "caller-callsite": { 1783 | "version": "2.0.0", 1784 | "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", 1785 | "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", 1786 | "dev": true, 1787 | "requires": { 1788 | "callsites": "^2.0.0" 1789 | } 1790 | }, 1791 | "caller-path": { 1792 | "version": "2.0.0", 1793 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", 1794 | "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", 1795 | "dev": true, 1796 | "requires": { 1797 | "caller-callsite": "^2.0.0" 1798 | } 1799 | }, 1800 | "callsites": { 1801 | "version": "2.0.0", 1802 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", 1803 | "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", 1804 | "dev": true 1805 | }, 1806 | "chalk": { 1807 | "version": "2.4.2", 1808 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1809 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1810 | "dev": true, 1811 | "requires": { 1812 | "ansi-styles": "^3.2.1", 1813 | "escape-string-regexp": "^1.0.5", 1814 | "supports-color": "^5.3.0" 1815 | }, 1816 | "dependencies": { 1817 | "escape-string-regexp": { 1818 | "version": "1.0.5", 1819 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1820 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1821 | "dev": true 1822 | } 1823 | } 1824 | }, 1825 | "chardet": { 1826 | "version": "0.7.0", 1827 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 1828 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 1829 | "dev": true 1830 | }, 1831 | "cli-cursor": { 1832 | "version": "2.1.0", 1833 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 1834 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 1835 | "dev": true, 1836 | "requires": { 1837 | "restore-cursor": "^2.0.0" 1838 | } 1839 | }, 1840 | "cli-width": { 1841 | "version": "2.2.1", 1842 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 1843 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", 1844 | "dev": true 1845 | }, 1846 | "color-convert": { 1847 | "version": "1.9.3", 1848 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1849 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1850 | "dev": true, 1851 | "requires": { 1852 | "color-name": "1.1.3" 1853 | } 1854 | }, 1855 | "color-name": { 1856 | "version": "1.1.3", 1857 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1858 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1859 | "dev": true 1860 | }, 1861 | "commander": { 1862 | "version": "2.18.0", 1863 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", 1864 | "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", 1865 | "dev": true 1866 | }, 1867 | "concat-map": { 1868 | "version": "0.0.1", 1869 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1870 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 1871 | "dev": true 1872 | }, 1873 | "cosmiconfig": { 1874 | "version": "5.2.1", 1875 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", 1876 | "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", 1877 | "dev": true, 1878 | "requires": { 1879 | "import-fresh": "^2.0.0", 1880 | "is-directory": "^0.3.1", 1881 | "js-yaml": "^3.13.1", 1882 | "parse-json": "^4.0.0" 1883 | } 1884 | }, 1885 | "cross-spawn": { 1886 | "version": "6.0.5", 1887 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 1888 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 1889 | "dev": true, 1890 | "requires": { 1891 | "nice-try": "^1.0.4", 1892 | "path-key": "^2.0.1", 1893 | "semver": "^5.5.0", 1894 | "shebang-command": "^1.2.0", 1895 | "which": "^1.2.9" 1896 | }, 1897 | "dependencies": { 1898 | "semver": { 1899 | "version": "5.7.1", 1900 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1901 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1902 | "dev": true 1903 | } 1904 | } 1905 | }, 1906 | "debug": { 1907 | "version": "4.3.4", 1908 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1909 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1910 | "dev": true, 1911 | "requires": { 1912 | "ms": "2.1.2" 1913 | } 1914 | }, 1915 | "deep-is": { 1916 | "version": "0.1.4", 1917 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1918 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1919 | "dev": true 1920 | }, 1921 | "doctrine": { 1922 | "version": "3.0.0", 1923 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1924 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1925 | "dev": true, 1926 | "requires": { 1927 | "esutils": "^2.0.2" 1928 | } 1929 | }, 1930 | "emoji-regex": { 1931 | "version": "10.1.0", 1932 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.1.0.tgz", 1933 | "integrity": "sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==", 1934 | "dev": true 1935 | }, 1936 | "error-ex": { 1937 | "version": "1.3.2", 1938 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 1939 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 1940 | "dev": true, 1941 | "requires": { 1942 | "is-arrayish": "^0.2.1" 1943 | } 1944 | }, 1945 | "escape-string-regexp": { 1946 | "version": "4.0.0", 1947 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1948 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1949 | "dev": true 1950 | }, 1951 | "eslint": { 1952 | "version": "5.16.0", 1953 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", 1954 | "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", 1955 | "dev": true, 1956 | "requires": { 1957 | "@babel/code-frame": "^7.0.0", 1958 | "ajv": "^6.9.1", 1959 | "chalk": "^2.1.0", 1960 | "cross-spawn": "^6.0.5", 1961 | "debug": "^4.0.1", 1962 | "doctrine": "^3.0.0", 1963 | "eslint-scope": "^4.0.3", 1964 | "eslint-utils": "^1.3.1", 1965 | "eslint-visitor-keys": "^1.0.0", 1966 | "espree": "^5.0.1", 1967 | "esquery": "^1.0.1", 1968 | "esutils": "^2.0.2", 1969 | "file-entry-cache": "^5.0.1", 1970 | "functional-red-black-tree": "^1.0.1", 1971 | "glob": "^7.1.2", 1972 | "globals": "^11.7.0", 1973 | "ignore": "^4.0.6", 1974 | "import-fresh": "^3.0.0", 1975 | "imurmurhash": "^0.1.4", 1976 | "inquirer": "^6.2.2", 1977 | "js-yaml": "^3.13.0", 1978 | "json-stable-stringify-without-jsonify": "^1.0.1", 1979 | "levn": "^0.3.0", 1980 | "lodash": "^4.17.11", 1981 | "minimatch": "^3.0.4", 1982 | "mkdirp": "^0.5.1", 1983 | "natural-compare": "^1.4.0", 1984 | "optionator": "^0.8.2", 1985 | "path-is-inside": "^1.0.2", 1986 | "progress": "^2.0.0", 1987 | "regexpp": "^2.0.1", 1988 | "semver": "^5.5.1", 1989 | "strip-ansi": "^4.0.0", 1990 | "strip-json-comments": "^2.0.1", 1991 | "table": "^5.2.3", 1992 | "text-table": "^0.2.0" 1993 | }, 1994 | "dependencies": { 1995 | "import-fresh": { 1996 | "version": "3.3.0", 1997 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1998 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1999 | "dev": true, 2000 | "requires": { 2001 | "parent-module": "^1.0.0", 2002 | "resolve-from": "^4.0.0" 2003 | } 2004 | }, 2005 | "resolve-from": { 2006 | "version": "4.0.0", 2007 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2008 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2009 | "dev": true 2010 | }, 2011 | "semver": { 2012 | "version": "5.7.1", 2013 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2014 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 2015 | "dev": true 2016 | } 2017 | } 2018 | }, 2019 | "eslint-scope": { 2020 | "version": "4.0.3", 2021 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", 2022 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", 2023 | "dev": true, 2024 | "requires": { 2025 | "esrecurse": "^4.1.0", 2026 | "estraverse": "^4.1.1" 2027 | } 2028 | }, 2029 | "eslint-utils": { 2030 | "version": "1.4.3", 2031 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 2032 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 2033 | "dev": true, 2034 | "requires": { 2035 | "eslint-visitor-keys": "^1.1.0" 2036 | } 2037 | }, 2038 | "eslint-visitor-keys": { 2039 | "version": "1.3.0", 2040 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 2041 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 2042 | "dev": true 2043 | }, 2044 | "espree": { 2045 | "version": "5.0.1", 2046 | "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", 2047 | "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", 2048 | "dev": true, 2049 | "requires": { 2050 | "acorn": "^6.0.7", 2051 | "acorn-jsx": "^5.0.0", 2052 | "eslint-visitor-keys": "^1.0.0" 2053 | } 2054 | }, 2055 | "esprima": { 2056 | "version": "4.0.1", 2057 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 2058 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 2059 | "dev": true 2060 | }, 2061 | "esquery": { 2062 | "version": "1.4.0", 2063 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 2064 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 2065 | "dev": true, 2066 | "requires": { 2067 | "estraverse": "^5.1.0" 2068 | }, 2069 | "dependencies": { 2070 | "estraverse": { 2071 | "version": "5.3.0", 2072 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 2073 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2074 | "dev": true 2075 | } 2076 | } 2077 | }, 2078 | "esrecurse": { 2079 | "version": "4.3.0", 2080 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 2081 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 2082 | "dev": true, 2083 | "requires": { 2084 | "estraverse": "^5.2.0" 2085 | }, 2086 | "dependencies": { 2087 | "estraverse": { 2088 | "version": "5.3.0", 2089 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 2090 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2091 | "dev": true 2092 | } 2093 | } 2094 | }, 2095 | "estraverse": { 2096 | "version": "4.3.0", 2097 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 2098 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 2099 | "dev": true 2100 | }, 2101 | "esutils": { 2102 | "version": "2.0.3", 2103 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 2104 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 2105 | "dev": true 2106 | }, 2107 | "external-editor": { 2108 | "version": "3.1.0", 2109 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 2110 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 2111 | "dev": true, 2112 | "requires": { 2113 | "chardet": "^0.7.0", 2114 | "iconv-lite": "^0.4.24", 2115 | "tmp": "^0.0.33" 2116 | } 2117 | }, 2118 | "fast-deep-equal": { 2119 | "version": "3.1.3", 2120 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2121 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 2122 | "dev": true 2123 | }, 2124 | "fast-diff": { 2125 | "version": "1.2.0", 2126 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", 2127 | "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", 2128 | "dev": true 2129 | }, 2130 | "fast-json-stable-stringify": { 2131 | "version": "2.1.0", 2132 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2133 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 2134 | "dev": true 2135 | }, 2136 | "fast-levenshtein": { 2137 | "version": "2.0.6", 2138 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 2139 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 2140 | "dev": true 2141 | }, 2142 | "figures": { 2143 | "version": "2.0.0", 2144 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 2145 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 2146 | "dev": true, 2147 | "requires": { 2148 | "escape-string-regexp": "^1.0.5" 2149 | }, 2150 | "dependencies": { 2151 | "escape-string-regexp": { 2152 | "version": "1.0.5", 2153 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 2154 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 2155 | "dev": true 2156 | } 2157 | } 2158 | }, 2159 | "file-entry-cache": { 2160 | "version": "5.0.1", 2161 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 2162 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 2163 | "dev": true, 2164 | "requires": { 2165 | "flat-cache": "^2.0.1" 2166 | } 2167 | }, 2168 | "flat-cache": { 2169 | "version": "2.0.1", 2170 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 2171 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 2172 | "dev": true, 2173 | "requires": { 2174 | "flatted": "^2.0.0", 2175 | "rimraf": "2.6.3", 2176 | "write": "1.0.3" 2177 | } 2178 | }, 2179 | "flatted": { 2180 | "version": "2.0.2", 2181 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 2182 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 2183 | "dev": true 2184 | }, 2185 | "fs.realpath": { 2186 | "version": "1.0.0", 2187 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2188 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 2189 | "dev": true 2190 | }, 2191 | "functional-red-black-tree": { 2192 | "version": "1.0.1", 2193 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 2194 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 2195 | "dev": true 2196 | }, 2197 | "glob": { 2198 | "version": "7.2.0", 2199 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 2200 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 2201 | "dev": true, 2202 | "requires": { 2203 | "fs.realpath": "^1.0.0", 2204 | "inflight": "^1.0.4", 2205 | "inherits": "2", 2206 | "minimatch": "^3.0.4", 2207 | "once": "^1.3.0", 2208 | "path-is-absolute": "^1.0.0" 2209 | } 2210 | }, 2211 | "globals": { 2212 | "version": "11.12.0", 2213 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 2214 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 2215 | "dev": true 2216 | }, 2217 | "has-flag": { 2218 | "version": "3.0.0", 2219 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2220 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 2221 | "dev": true 2222 | }, 2223 | "iconv-lite": { 2224 | "version": "0.4.24", 2225 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 2226 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 2227 | "dev": true, 2228 | "requires": { 2229 | "safer-buffer": ">= 2.1.2 < 3" 2230 | } 2231 | }, 2232 | "ignore": { 2233 | "version": "4.0.6", 2234 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 2235 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 2236 | "dev": true 2237 | }, 2238 | "import-fresh": { 2239 | "version": "2.0.0", 2240 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", 2241 | "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", 2242 | "dev": true, 2243 | "requires": { 2244 | "caller-path": "^2.0.0", 2245 | "resolve-from": "^3.0.0" 2246 | } 2247 | }, 2248 | "imurmurhash": { 2249 | "version": "0.1.4", 2250 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2251 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 2252 | "dev": true 2253 | }, 2254 | "inflight": { 2255 | "version": "1.0.6", 2256 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2257 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 2258 | "dev": true, 2259 | "requires": { 2260 | "once": "^1.3.0", 2261 | "wrappy": "1" 2262 | } 2263 | }, 2264 | "inherits": { 2265 | "version": "2.0.4", 2266 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2267 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2268 | "dev": true 2269 | }, 2270 | "inquirer": { 2271 | "version": "6.5.2", 2272 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", 2273 | "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", 2274 | "dev": true, 2275 | "requires": { 2276 | "ansi-escapes": "^3.2.0", 2277 | "chalk": "^2.4.2", 2278 | "cli-cursor": "^2.1.0", 2279 | "cli-width": "^2.0.0", 2280 | "external-editor": "^3.0.3", 2281 | "figures": "^2.0.0", 2282 | "lodash": "^4.17.12", 2283 | "mute-stream": "0.0.7", 2284 | "run-async": "^2.2.0", 2285 | "rxjs": "^6.4.0", 2286 | "string-width": "^2.1.0", 2287 | "strip-ansi": "^5.1.0", 2288 | "through": "^2.3.6" 2289 | }, 2290 | "dependencies": { 2291 | "is-fullwidth-code-point": { 2292 | "version": "2.0.0", 2293 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2294 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2295 | "dev": true 2296 | }, 2297 | "string-width": { 2298 | "version": "2.1.1", 2299 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2300 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2301 | "dev": true, 2302 | "requires": { 2303 | "is-fullwidth-code-point": "^2.0.0", 2304 | "strip-ansi": "^4.0.0" 2305 | }, 2306 | "dependencies": { 2307 | "strip-ansi": { 2308 | "version": "4.0.0", 2309 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2310 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2311 | "dev": true, 2312 | "requires": { 2313 | "ansi-regex": "^3.0.0" 2314 | } 2315 | } 2316 | } 2317 | }, 2318 | "strip-ansi": { 2319 | "version": "5.2.0", 2320 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 2321 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 2322 | "dev": true, 2323 | "requires": { 2324 | "ansi-regex": "^4.1.0" 2325 | }, 2326 | "dependencies": { 2327 | "ansi-regex": { 2328 | "version": "4.1.1", 2329 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 2330 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 2331 | "dev": true 2332 | } 2333 | } 2334 | } 2335 | } 2336 | }, 2337 | "is-arrayish": { 2338 | "version": "0.2.1", 2339 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 2340 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 2341 | "dev": true 2342 | }, 2343 | "is-directory": { 2344 | "version": "0.3.1", 2345 | "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", 2346 | "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", 2347 | "dev": true 2348 | }, 2349 | "is-fullwidth-code-point": { 2350 | "version": "3.0.0", 2351 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2352 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2353 | "dev": true 2354 | }, 2355 | "isexe": { 2356 | "version": "2.0.0", 2357 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2358 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 2359 | "dev": true 2360 | }, 2361 | "js-tokens": { 2362 | "version": "4.0.0", 2363 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2364 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2365 | "dev": true 2366 | }, 2367 | "js-yaml": { 2368 | "version": "3.14.1", 2369 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 2370 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 2371 | "dev": true, 2372 | "requires": { 2373 | "argparse": "^1.0.7", 2374 | "esprima": "^4.0.0" 2375 | } 2376 | }, 2377 | "json-parse-better-errors": { 2378 | "version": "1.0.2", 2379 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 2380 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 2381 | "dev": true 2382 | }, 2383 | "json-schema-traverse": { 2384 | "version": "0.4.1", 2385 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2386 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2387 | "dev": true 2388 | }, 2389 | "json-stable-stringify-without-jsonify": { 2390 | "version": "1.0.1", 2391 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2392 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 2393 | "dev": true 2394 | }, 2395 | "levn": { 2396 | "version": "0.3.0", 2397 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 2398 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 2399 | "dev": true, 2400 | "requires": { 2401 | "prelude-ls": "~1.1.2", 2402 | "type-check": "~0.3.2" 2403 | } 2404 | }, 2405 | "lodash": { 2406 | "version": "4.17.21", 2407 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2408 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2409 | "dev": true 2410 | }, 2411 | "lru-cache": { 2412 | "version": "7.8.1", 2413 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.1.tgz", 2414 | "integrity": "sha512-E1v547OCgJvbvevfjgK9sNKIVXO96NnsTsFPBlg4ZxjhsJSODoH9lk8Bm0OxvHNm6Vm5Yqkl/1fErDxhYL8Skg==", 2415 | "dev": true 2416 | }, 2417 | "mimic-fn": { 2418 | "version": "1.2.0", 2419 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 2420 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 2421 | "dev": true 2422 | }, 2423 | "minimatch": { 2424 | "version": "3.1.2", 2425 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2426 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2427 | "dev": true, 2428 | "requires": { 2429 | "brace-expansion": "^1.1.7" 2430 | } 2431 | }, 2432 | "minimist": { 2433 | "version": "1.2.6", 2434 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 2435 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 2436 | "dev": true 2437 | }, 2438 | "mkdirp": { 2439 | "version": "0.5.6", 2440 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 2441 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 2442 | "dev": true, 2443 | "requires": { 2444 | "minimist": "^1.2.6" 2445 | } 2446 | }, 2447 | "ms": { 2448 | "version": "2.1.2", 2449 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2450 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2451 | "dev": true 2452 | }, 2453 | "mute-stream": { 2454 | "version": "0.0.7", 2455 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 2456 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 2457 | "dev": true 2458 | }, 2459 | "natural-compare": { 2460 | "version": "1.4.0", 2461 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2462 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 2463 | "dev": true 2464 | }, 2465 | "nice-try": { 2466 | "version": "1.0.5", 2467 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 2468 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 2469 | "dev": true 2470 | }, 2471 | "once": { 2472 | "version": "1.4.0", 2473 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2474 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2475 | "dev": true, 2476 | "requires": { 2477 | "wrappy": "1" 2478 | } 2479 | }, 2480 | "onetime": { 2481 | "version": "2.0.1", 2482 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 2483 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 2484 | "dev": true, 2485 | "requires": { 2486 | "mimic-fn": "^1.0.0" 2487 | } 2488 | }, 2489 | "optionator": { 2490 | "version": "0.8.3", 2491 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 2492 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 2493 | "dev": true, 2494 | "requires": { 2495 | "deep-is": "~0.1.3", 2496 | "fast-levenshtein": "~2.0.6", 2497 | "levn": "~0.3.0", 2498 | "prelude-ls": "~1.1.2", 2499 | "type-check": "~0.3.2", 2500 | "word-wrap": "~1.2.3" 2501 | } 2502 | }, 2503 | "os-tmpdir": { 2504 | "version": "1.0.2", 2505 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 2506 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 2507 | "dev": true 2508 | }, 2509 | "parent-module": { 2510 | "version": "1.0.1", 2511 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2512 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2513 | "dev": true, 2514 | "requires": { 2515 | "callsites": "^3.0.0" 2516 | }, 2517 | "dependencies": { 2518 | "callsites": { 2519 | "version": "3.1.0", 2520 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 2521 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 2522 | "dev": true 2523 | } 2524 | } 2525 | }, 2526 | "parse-json": { 2527 | "version": "4.0.0", 2528 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 2529 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 2530 | "dev": true, 2531 | "requires": { 2532 | "error-ex": "^1.3.1", 2533 | "json-parse-better-errors": "^1.0.1" 2534 | } 2535 | }, 2536 | "path-is-absolute": { 2537 | "version": "1.0.1", 2538 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2539 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2540 | "dev": true 2541 | }, 2542 | "path-is-inside": { 2543 | "version": "1.0.2", 2544 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 2545 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 2546 | "dev": true 2547 | }, 2548 | "path-key": { 2549 | "version": "2.0.1", 2550 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 2551 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 2552 | "dev": true 2553 | }, 2554 | "prelude-ls": { 2555 | "version": "1.1.2", 2556 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 2557 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 2558 | "dev": true 2559 | }, 2560 | "prettier": { 2561 | "version": "2.6.2", 2562 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", 2563 | "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", 2564 | "dev": true 2565 | }, 2566 | "prettier-linter-helpers": { 2567 | "version": "1.0.0", 2568 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 2569 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 2570 | "dev": true, 2571 | "requires": { 2572 | "fast-diff": "^1.1.2" 2573 | } 2574 | }, 2575 | "prettier-plugin-solidity": { 2576 | "version": "1.0.0-beta.19", 2577 | "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.19.tgz", 2578 | "integrity": "sha512-xxRQ5ZiiZyUoMFLE9h7HnUDXI/daf1tnmL1msEdcKmyh7ZGQ4YklkYLC71bfBpYU2WruTb5/SFLUaEb3RApg5g==", 2579 | "dev": true, 2580 | "requires": { 2581 | "@solidity-parser/parser": "^0.14.1", 2582 | "emoji-regex": "^10.0.0", 2583 | "escape-string-regexp": "^4.0.0", 2584 | "semver": "^7.3.5", 2585 | "solidity-comments-extractor": "^0.0.7", 2586 | "string-width": "^4.2.3" 2587 | } 2588 | }, 2589 | "progress": { 2590 | "version": "2.0.3", 2591 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 2592 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 2593 | "dev": true 2594 | }, 2595 | "punycode": { 2596 | "version": "2.1.1", 2597 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2598 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2599 | "dev": true 2600 | }, 2601 | "regexpp": { 2602 | "version": "2.0.1", 2603 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 2604 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 2605 | "dev": true 2606 | }, 2607 | "resolve-from": { 2608 | "version": "3.0.0", 2609 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", 2610 | "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", 2611 | "dev": true 2612 | }, 2613 | "restore-cursor": { 2614 | "version": "2.0.0", 2615 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 2616 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 2617 | "dev": true, 2618 | "requires": { 2619 | "onetime": "^2.0.0", 2620 | "signal-exit": "^3.0.2" 2621 | } 2622 | }, 2623 | "rimraf": { 2624 | "version": "2.6.3", 2625 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 2626 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 2627 | "dev": true, 2628 | "requires": { 2629 | "glob": "^7.1.3" 2630 | } 2631 | }, 2632 | "run-async": { 2633 | "version": "2.4.1", 2634 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 2635 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 2636 | "dev": true 2637 | }, 2638 | "rxjs": { 2639 | "version": "6.6.7", 2640 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 2641 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 2642 | "dev": true, 2643 | "requires": { 2644 | "tslib": "^1.9.0" 2645 | } 2646 | }, 2647 | "safer-buffer": { 2648 | "version": "2.1.2", 2649 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2650 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2651 | "dev": true 2652 | }, 2653 | "semver": { 2654 | "version": "7.3.6", 2655 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", 2656 | "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", 2657 | "dev": true, 2658 | "requires": { 2659 | "lru-cache": "^7.4.0" 2660 | } 2661 | }, 2662 | "shebang-command": { 2663 | "version": "1.2.0", 2664 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2665 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2666 | "dev": true, 2667 | "requires": { 2668 | "shebang-regex": "^1.0.0" 2669 | } 2670 | }, 2671 | "shebang-regex": { 2672 | "version": "1.0.0", 2673 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2674 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 2675 | "dev": true 2676 | }, 2677 | "signal-exit": { 2678 | "version": "3.0.7", 2679 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2680 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 2681 | "dev": true 2682 | }, 2683 | "slice-ansi": { 2684 | "version": "2.1.0", 2685 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 2686 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 2687 | "dev": true, 2688 | "requires": { 2689 | "ansi-styles": "^3.2.0", 2690 | "astral-regex": "^1.0.0", 2691 | "is-fullwidth-code-point": "^2.0.0" 2692 | }, 2693 | "dependencies": { 2694 | "is-fullwidth-code-point": { 2695 | "version": "2.0.0", 2696 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2697 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2698 | "dev": true 2699 | } 2700 | } 2701 | }, 2702 | "solhint": { 2703 | "version": "3.3.7", 2704 | "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.3.7.tgz", 2705 | "integrity": "sha512-NjjjVmXI3ehKkb3aNtRJWw55SUVJ8HMKKodwe0HnejA+k0d2kmhw7jvpa+MCTbcEgt8IWSwx0Hu6aCo/iYOZzQ==", 2706 | "dev": true, 2707 | "requires": { 2708 | "@solidity-parser/parser": "^0.14.1", 2709 | "ajv": "^6.6.1", 2710 | "antlr4": "4.7.1", 2711 | "ast-parents": "0.0.1", 2712 | "chalk": "^2.4.2", 2713 | "commander": "2.18.0", 2714 | "cosmiconfig": "^5.0.7", 2715 | "eslint": "^5.6.0", 2716 | "fast-diff": "^1.1.2", 2717 | "glob": "^7.1.3", 2718 | "ignore": "^4.0.6", 2719 | "js-yaml": "^3.12.0", 2720 | "lodash": "^4.17.11", 2721 | "prettier": "^1.14.3", 2722 | "semver": "^6.3.0" 2723 | }, 2724 | "dependencies": { 2725 | "prettier": { 2726 | "version": "1.19.1", 2727 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", 2728 | "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", 2729 | "dev": true, 2730 | "optional": true 2731 | }, 2732 | "semver": { 2733 | "version": "6.3.0", 2734 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 2735 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 2736 | "dev": true 2737 | } 2738 | } 2739 | }, 2740 | "solhint-plugin-prettier": { 2741 | "version": "0.0.5", 2742 | "resolved": "https://registry.npmjs.org/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.5.tgz", 2743 | "integrity": "sha512-7jmWcnVshIrO2FFinIvDQmhQpfpS2rRRn3RejiYgnjIE68xO2bvrYvjqVNfrio4xH9ghOqn83tKuTzLjEbmGIA==", 2744 | "dev": true, 2745 | "requires": { 2746 | "prettier-linter-helpers": "^1.0.0" 2747 | } 2748 | }, 2749 | "solidity-comments-extractor": { 2750 | "version": "0.0.7", 2751 | "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", 2752 | "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", 2753 | "dev": true 2754 | }, 2755 | "sprintf-js": { 2756 | "version": "1.0.3", 2757 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2758 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2759 | "dev": true 2760 | }, 2761 | "string-width": { 2762 | "version": "4.2.3", 2763 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2764 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2765 | "dev": true, 2766 | "requires": { 2767 | "emoji-regex": "^8.0.0", 2768 | "is-fullwidth-code-point": "^3.0.0", 2769 | "strip-ansi": "^6.0.1" 2770 | }, 2771 | "dependencies": { 2772 | "ansi-regex": { 2773 | "version": "5.0.1", 2774 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2775 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2776 | "dev": true 2777 | }, 2778 | "emoji-regex": { 2779 | "version": "8.0.0", 2780 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2781 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2782 | "dev": true 2783 | }, 2784 | "strip-ansi": { 2785 | "version": "6.0.1", 2786 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2787 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2788 | "dev": true, 2789 | "requires": { 2790 | "ansi-regex": "^5.0.1" 2791 | } 2792 | } 2793 | } 2794 | }, 2795 | "strip-ansi": { 2796 | "version": "4.0.0", 2797 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2798 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2799 | "dev": true, 2800 | "requires": { 2801 | "ansi-regex": "^3.0.0" 2802 | } 2803 | }, 2804 | "strip-json-comments": { 2805 | "version": "2.0.1", 2806 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2807 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 2808 | "dev": true 2809 | }, 2810 | "supports-color": { 2811 | "version": "5.5.0", 2812 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2813 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2814 | "dev": true, 2815 | "requires": { 2816 | "has-flag": "^3.0.0" 2817 | } 2818 | }, 2819 | "table": { 2820 | "version": "5.4.6", 2821 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 2822 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 2823 | "dev": true, 2824 | "requires": { 2825 | "ajv": "^6.10.2", 2826 | "lodash": "^4.17.14", 2827 | "slice-ansi": "^2.1.0", 2828 | "string-width": "^3.0.0" 2829 | }, 2830 | "dependencies": { 2831 | "ansi-regex": { 2832 | "version": "4.1.1", 2833 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 2834 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 2835 | "dev": true 2836 | }, 2837 | "emoji-regex": { 2838 | "version": "7.0.3", 2839 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 2840 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 2841 | "dev": true 2842 | }, 2843 | "is-fullwidth-code-point": { 2844 | "version": "2.0.0", 2845 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2846 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2847 | "dev": true 2848 | }, 2849 | "string-width": { 2850 | "version": "3.1.0", 2851 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 2852 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 2853 | "dev": true, 2854 | "requires": { 2855 | "emoji-regex": "^7.0.1", 2856 | "is-fullwidth-code-point": "^2.0.0", 2857 | "strip-ansi": "^5.1.0" 2858 | } 2859 | }, 2860 | "strip-ansi": { 2861 | "version": "5.2.0", 2862 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 2863 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 2864 | "dev": true, 2865 | "requires": { 2866 | "ansi-regex": "^4.1.0" 2867 | } 2868 | } 2869 | } 2870 | }, 2871 | "text-table": { 2872 | "version": "0.2.0", 2873 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2874 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2875 | "dev": true 2876 | }, 2877 | "through": { 2878 | "version": "2.3.8", 2879 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2880 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2881 | "dev": true 2882 | }, 2883 | "tmp": { 2884 | "version": "0.0.33", 2885 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 2886 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 2887 | "dev": true, 2888 | "requires": { 2889 | "os-tmpdir": "~1.0.2" 2890 | } 2891 | }, 2892 | "tslib": { 2893 | "version": "1.14.1", 2894 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 2895 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 2896 | "dev": true 2897 | }, 2898 | "type-check": { 2899 | "version": "0.3.2", 2900 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2901 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2902 | "dev": true, 2903 | "requires": { 2904 | "prelude-ls": "~1.1.2" 2905 | } 2906 | }, 2907 | "uri-js": { 2908 | "version": "4.4.1", 2909 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2910 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2911 | "dev": true, 2912 | "requires": { 2913 | "punycode": "^2.1.0" 2914 | } 2915 | }, 2916 | "which": { 2917 | "version": "1.3.1", 2918 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2919 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2920 | "dev": true, 2921 | "requires": { 2922 | "isexe": "^2.0.0" 2923 | } 2924 | }, 2925 | "word-wrap": { 2926 | "version": "1.2.3", 2927 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2928 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2929 | "dev": true 2930 | }, 2931 | "wrappy": { 2932 | "version": "1.0.2", 2933 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2934 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2935 | "dev": true 2936 | }, 2937 | "write": { 2938 | "version": "1.0.3", 2939 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 2940 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 2941 | "dev": true, 2942 | "requires": { 2943 | "mkdirp": "^0.5.1" 2944 | } 2945 | } 2946 | } 2947 | } 2948 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "forge-erc20-template", 3 | "version": "1.0.0", 4 | "description": "Forge Template for ERC-20 using Openzeppelin Contracts", 5 | "directories": { 6 | "lib": "lib" 7 | }, 8 | "scripts": { 9 | "setup": "make clean && make build", 10 | "sync": "make update", 11 | "test": "make test", 12 | "snapshot": "make snapshot", 13 | "lint": "make lint" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "git+https://github.com/soliditylabs/forge-erc20-template.git" 18 | }, 19 | "keywords": [ 20 | "forge", 21 | "template", 22 | "erc20", 23 | "openzeppelin", 24 | "Solidity" 25 | ], 26 | "author": "Markus Waas (mail@markuswaas.com)", 27 | "license": "MIT", 28 | "bugs": { 29 | "url": "https://github.com/soliditylabs/forge-erc20-template/issues" 30 | }, 31 | "homepage": "https://github.com/soliditylabs/forge-erc20-template#readme", 32 | "devDependencies": { 33 | "prettier": "^2.6.2", 34 | "prettier-plugin-solidity": "^1.0.0-beta.19", 35 | "solhint": "^3.3.7", 36 | "solhint-plugin-prettier": "^0.0.5" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /remappings.txt: -------------------------------------------------------------------------------- 1 | forge-std/=lib/forge-std/src/ 2 | openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/ 3 | -------------------------------------------------------------------------------- /scripts/deploy-to-rinkeby.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | if [ -f .env ] 4 | then 5 | export $(cat .env | xargs) 6 | else 7 | echo "Please set your .env file" 8 | exit 1 9 | fi 10 | 11 | forge create ./src/MyERC20.sol:MyERC20 -i --rpc-url 'https://rinkeby.infura.io/v3/'${INFURA_API_KEY} --private-key ${PRIVATE_KEY} -------------------------------------------------------------------------------- /scripts/verify-on-rinkeby.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | if [ -f .env ] 4 | then 5 | export $(cat .env | xargs) 6 | else 7 | echo "Please set your .env file" 8 | exit 1 9 | fi 10 | 11 | echo "Which contract do you want to verify?" 12 | read contract 13 | echo "Submitting verification request for $contract..." 14 | 15 | forge verify-contract --compiler-version v0.8.13+commit.abaa5c0e $contract --num-of-optimizations 200 ./src/MyERC20.sol:MyERC20 ${ETHERSCAN_API_KEY} --chain-id 4 -------------------------------------------------------------------------------- /src/MyERC20.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity 0.8.13; 3 | 4 | import {ERC20} from "openzeppelin-contracts/token/ERC20/ERC20.sol"; 5 | 6 | contract MyERC20 is ERC20 { 7 | constructor() ERC20("Name", "SYM") { 8 | this; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/test/MyERC20.t.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity 0.8.13; 3 | 4 | import {console} from "forge-std/console.sol"; 5 | import {stdStorage, StdStorage, Test} from "forge-std/Test.sol"; 6 | 7 | import {Utils} from "./utils/Utils.sol"; 8 | import {MyERC20} from "../MyERC20.sol"; 9 | 10 | contract BaseSetup is MyERC20, Test { 11 | Utils internal utils; 12 | address payable[] internal users; 13 | 14 | address internal alice; 15 | address internal bob; 16 | 17 | function setUp() public virtual { 18 | utils = new Utils(); 19 | users = utils.createUsers(2); 20 | 21 | alice = users[0]; 22 | vm.label(alice, "Alice"); 23 | bob = users[1]; 24 | vm.label(bob, "Bob"); 25 | } 26 | } 27 | 28 | contract WhenTransferringTokens is BaseSetup { 29 | uint256 internal maxTransferAmount = 12e18; 30 | 31 | function setUp() public virtual override { 32 | BaseSetup.setUp(); 33 | console.log("When transferring tokens"); 34 | } 35 | 36 | function transferToken( 37 | address from, 38 | address to, 39 | uint256 transferAmount 40 | ) public returns (bool) { 41 | vm.prank(from); 42 | return this.transfer(to, transferAmount); 43 | } 44 | } 45 | 46 | contract WhenAliceHasSufficientFunds is WhenTransferringTokens { 47 | using stdStorage for StdStorage; 48 | uint256 internal mintAmount = maxTransferAmount; 49 | 50 | function setUp() public override { 51 | WhenTransferringTokens.setUp(); 52 | console.log("When Alice has sufficient funds"); 53 | _mint(alice, mintAmount); 54 | } 55 | 56 | function itTransfersAmountCorrectly( 57 | address from, 58 | address to, 59 | uint256 transferAmount 60 | ) public { 61 | uint256 fromBalanceBefore = balanceOf(from); 62 | bool success = transferToken(from, to, transferAmount); 63 | 64 | assertTrue(success); 65 | assertEqDecimal( 66 | balanceOf(from), 67 | fromBalanceBefore - transferAmount, 68 | decimals() 69 | ); 70 | assertEqDecimal(balanceOf(to), transferAmount, decimals()); 71 | } 72 | 73 | function testTransferAllTokens() public { 74 | itTransfersAmountCorrectly(alice, bob, maxTransferAmount); 75 | } 76 | 77 | function testTransferHalfTokens() public { 78 | itTransfersAmountCorrectly(alice, bob, maxTransferAmount / 2); 79 | } 80 | 81 | function testTransferOneToken() public { 82 | itTransfersAmountCorrectly(alice, bob, 1); 83 | } 84 | 85 | function testTransferWithFuzzing(uint64 transferAmount) public { 86 | vm.assume(transferAmount != 0); 87 | itTransfersAmountCorrectly( 88 | alice, 89 | bob, 90 | transferAmount % maxTransferAmount 91 | ); 92 | } 93 | 94 | function testTransferWithMockedCall() public { 95 | vm.prank(alice); 96 | vm.mockCall( 97 | address(this), 98 | abi.encodeWithSelector( 99 | this.transfer.selector, 100 | bob, 101 | maxTransferAmount 102 | ), 103 | abi.encode(false) 104 | ); 105 | bool success = this.transfer(bob, maxTransferAmount); 106 | assertTrue(!success); 107 | vm.clearMockedCalls(); 108 | } 109 | 110 | // example how to use https://github.com/foundry-rs/forge-std stdStorage 111 | function testFindMapping() public { 112 | uint256 slot = stdstore 113 | .target(address(this)) 114 | .sig(this.balanceOf.selector) 115 | .with_key(alice) 116 | .find(); 117 | bytes32 data = vm.load(address(this), bytes32(slot)); 118 | assertEqDecimal(uint256(data), mintAmount, decimals()); 119 | } 120 | } 121 | 122 | contract WhenAliceHasInsufficientFunds is WhenTransferringTokens { 123 | uint256 internal mintAmount = maxTransferAmount - 1e18; 124 | 125 | function setUp() public override { 126 | WhenTransferringTokens.setUp(); 127 | console.log("When Alice has insufficient funds"); 128 | _mint(alice, mintAmount); 129 | } 130 | 131 | function itRevertsTransfer( 132 | address from, 133 | address to, 134 | uint256 transferAmount, 135 | string memory expectedRevertMessage 136 | ) public { 137 | vm.expectRevert(abi.encodePacked(expectedRevertMessage)); 138 | transferToken(from, to, transferAmount); 139 | } 140 | 141 | function testCannotTransferMoreThanAvailable() public { 142 | itRevertsTransfer({ 143 | from: alice, 144 | to: bob, 145 | transferAmount: maxTransferAmount, 146 | expectedRevertMessage: "ERC20: transfer amount exceeds balance" 147 | }); 148 | } 149 | 150 | function testCannotTransferToZero() public { 151 | itRevertsTransfer({ 152 | from: alice, 153 | to: address(0), 154 | transferAmount: mintAmount, 155 | expectedRevertMessage: "ERC20: transfer to the zero address" 156 | }); 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /src/test/utils/Utils.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: Unlicense 2 | pragma solidity >=0.8.0; 3 | 4 | import {Test} from "forge-std/Test.sol"; 5 | 6 | contract Utils is Test { 7 | bytes32 internal nextUser = keccak256(abi.encodePacked("user address")); 8 | 9 | function getNextUserAddress() external returns (address payable) { 10 | address payable user = payable(address(uint160(uint256(nextUser)))); 11 | nextUser = keccak256(abi.encodePacked(nextUser)); 12 | return user; 13 | } 14 | 15 | // create users with 100 ETH balance each 16 | function createUsers(uint256 userNum) 17 | external 18 | returns (address payable[] memory) 19 | { 20 | address payable[] memory users = new address payable[](userNum); 21 | for (uint256 i = 0; i < userNum; i++) { 22 | address payable user = this.getNextUserAddress(); 23 | vm.deal(user, 100 ether); 24 | users[i] = user; 25 | } 26 | 27 | return users; 28 | } 29 | 30 | // move block.number forward by a given number of blocks 31 | function mineBlocks(uint256 numBlocks) external { 32 | uint256 targetBlock = block.number + numBlocks; 33 | vm.roll(targetBlock); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/test/utils/test.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | // This program is free software: you can redistribute it and/or modify 4 | // it under the terms of the GNU General Public License as published by 5 | // the Free Software Foundation, either version 3 of the License, or 6 | // (at your option) any later version. 7 | 8 | // This program is distributed in the hope that it will be useful, 9 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | // GNU General Public License for more details. 12 | 13 | // You should have received a copy of the GNU General Public License 14 | // along with this program. If not, see . 15 | 16 | // solhint-disable event-name-camelcase 17 | // solhint-disable var-name-mixedcase 18 | 19 | pragma solidity >=0.8.0; 20 | 21 | contract DSTest { 22 | event log(string); 23 | event logs(bytes); 24 | 25 | event log_address(address); 26 | event log_bytes32(bytes32); 27 | event log_int(int256); 28 | event log_uint(uint256); 29 | event log_bytes(bytes); 30 | event log_string(string); 31 | 32 | event log_named_address(string key, address val); 33 | event log_named_bytes32(string key, bytes32 val); 34 | event log_named_decimal_int(string key, int256 val, uint256 decimals); 35 | event log_named_decimal_uint(string key, uint256 val, uint256 decimals); 36 | event log_named_int(string key, int256 val); 37 | event log_named_uint(string key, uint256 val); 38 | event log_named_bytes(string key, bytes val); 39 | event log_named_string(string key, string val); 40 | 41 | bool public IS_TEST = true; 42 | bool public failed; 43 | 44 | address public constant HEVM_ADDRESS = 45 | address(bytes20(uint160(uint256(keccak256("hevm cheat code"))))); 46 | 47 | modifier mayRevert() { 48 | _; 49 | } 50 | modifier testopts(string memory) { 51 | _; 52 | } 53 | 54 | function fail() public { 55 | failed = true; 56 | } 57 | 58 | modifier logs_gas() { 59 | uint256 startGas = gasleft(); 60 | _; 61 | uint256 endGas = gasleft(); 62 | emit log_named_uint("gas", startGas - endGas); 63 | } 64 | 65 | function assertTrue(bool condition) public { 66 | if (!condition) { 67 | emit log("Error: Assertion Failed"); 68 | fail(); 69 | } 70 | } 71 | 72 | function assertTrue(bool condition, string memory err) public { 73 | if (!condition) { 74 | emit log_named_string("Error", err); 75 | assertTrue(condition); 76 | } 77 | } 78 | 79 | function assertEq(address a, address b) public { 80 | if (a != b) { 81 | emit log("Error: a == b not satisfied [address]"); 82 | emit log_named_address(" Expected", b); 83 | emit log_named_address(" Actual", a); 84 | fail(); 85 | } 86 | } 87 | 88 | function assertEq( 89 | address a, 90 | address b, 91 | string memory err 92 | ) public { 93 | if (a != b) { 94 | emit log_named_string("Error", err); 95 | assertEq(a, b); 96 | } 97 | } 98 | 99 | function assertEq(bytes32 a, bytes32 b) public { 100 | if (a != b) { 101 | emit log("Error: a == b not satisfied [bytes32]"); 102 | emit log_named_bytes32(" Expected", b); 103 | emit log_named_bytes32(" Actual", a); 104 | fail(); 105 | } 106 | } 107 | 108 | function assertEq( 109 | bytes32 a, 110 | bytes32 b, 111 | string memory err 112 | ) public { 113 | if (a != b) { 114 | emit log_named_string("Error", err); 115 | assertEq(a, b); 116 | } 117 | } 118 | 119 | function assertEq32(bytes32 a, bytes32 b) public { 120 | assertEq(a, b); 121 | } 122 | 123 | function assertEq32( 124 | bytes32 a, 125 | bytes32 b, 126 | string memory err 127 | ) public { 128 | assertEq(a, b, err); 129 | } 130 | 131 | function assertEq(int256 a, int256 b) public { 132 | if (a != b) { 133 | emit log("Error: a == b not satisfied [int]"); 134 | emit log_named_int(" Expected", b); 135 | emit log_named_int(" Actual", a); 136 | fail(); 137 | } 138 | } 139 | 140 | function assertEq( 141 | int256 a, 142 | int256 b, 143 | string memory err 144 | ) public { 145 | if (a != b) { 146 | emit log_named_string("Error", err); 147 | assertEq(a, b); 148 | } 149 | } 150 | 151 | function assertEq(uint256 a, uint256 b) public { 152 | if (a != b) { 153 | emit log("Error: a == b not satisfied [uint]"); 154 | emit log_named_uint(" Expected", b); 155 | emit log_named_uint(" Actual", a); 156 | fail(); 157 | } 158 | } 159 | 160 | function assertEq( 161 | uint256 a, 162 | uint256 b, 163 | string memory err 164 | ) public { 165 | if (a != b) { 166 | emit log_named_string("Error", err); 167 | assertEq(a, b); 168 | } 169 | } 170 | 171 | function assertEqDecimal( 172 | int256 a, 173 | int256 b, 174 | uint256 decimals 175 | ) public { 176 | if (a != b) { 177 | emit log("Error: a == b not satisfied [decimal int]"); 178 | emit log_named_decimal_int(" Expected", b, decimals); 179 | emit log_named_decimal_int(" Actual", a, decimals); 180 | fail(); 181 | } 182 | } 183 | 184 | function assertEqDecimal( 185 | int256 a, 186 | int256 b, 187 | uint256 decimals, 188 | string memory err 189 | ) public { 190 | if (a != b) { 191 | emit log_named_string("Error", err); 192 | assertEqDecimal(a, b, decimals); 193 | } 194 | } 195 | 196 | function assertEqDecimal( 197 | uint256 a, 198 | uint256 b, 199 | uint256 decimals 200 | ) public { 201 | if (a != b) { 202 | emit log("Error: a == b not satisfied [decimal uint]"); 203 | emit log_named_decimal_uint(" Expected", b, decimals); 204 | emit log_named_decimal_uint(" Actual", a, decimals); 205 | fail(); 206 | } 207 | } 208 | 209 | function assertEqDecimal( 210 | uint256 a, 211 | uint256 b, 212 | uint256 decimals, 213 | string memory err 214 | ) public { 215 | if (a != b) { 216 | emit log_named_string("Error", err); 217 | assertEqDecimal(a, b, decimals); 218 | } 219 | } 220 | 221 | function assertGt(uint256 a, uint256 b) public { 222 | if (a <= b) { 223 | emit log("Error: a > b not satisfied [uint]"); 224 | emit log_named_uint(" Value a", a); 225 | emit log_named_uint(" Value b", b); 226 | fail(); 227 | } 228 | } 229 | 230 | function assertGt( 231 | uint256 a, 232 | uint256 b, 233 | string memory err 234 | ) public { 235 | if (a <= b) { 236 | emit log_named_string("Error", err); 237 | assertGt(a, b); 238 | } 239 | } 240 | 241 | function assertGt(int256 a, int256 b) public { 242 | if (a <= b) { 243 | emit log("Error: a > b not satisfied [int]"); 244 | emit log_named_int(" Value a", a); 245 | emit log_named_int(" Value b", b); 246 | fail(); 247 | } 248 | } 249 | 250 | function assertGt( 251 | int256 a, 252 | int256 b, 253 | string memory err 254 | ) public { 255 | if (a <= b) { 256 | emit log_named_string("Error", err); 257 | assertGt(a, b); 258 | } 259 | } 260 | 261 | function assertGtDecimal( 262 | int256 a, 263 | int256 b, 264 | uint256 decimals 265 | ) public { 266 | if (a <= b) { 267 | emit log("Error: a > b not satisfied [decimal int]"); 268 | emit log_named_decimal_int(" Value a", a, decimals); 269 | emit log_named_decimal_int(" Value b", b, decimals); 270 | fail(); 271 | } 272 | } 273 | 274 | function assertGtDecimal( 275 | int256 a, 276 | int256 b, 277 | uint256 decimals, 278 | string memory err 279 | ) public { 280 | if (a <= b) { 281 | emit log_named_string("Error", err); 282 | assertGtDecimal(a, b, decimals); 283 | } 284 | } 285 | 286 | function assertGtDecimal( 287 | uint256 a, 288 | uint256 b, 289 | uint256 decimals 290 | ) public { 291 | if (a <= b) { 292 | emit log("Error: a > b not satisfied [decimal uint]"); 293 | emit log_named_decimal_uint(" Value a", a, decimals); 294 | emit log_named_decimal_uint(" Value b", b, decimals); 295 | fail(); 296 | } 297 | } 298 | 299 | function assertGtDecimal( 300 | uint256 a, 301 | uint256 b, 302 | uint256 decimals, 303 | string memory err 304 | ) public { 305 | if (a <= b) { 306 | emit log_named_string("Error", err); 307 | assertGtDecimal(a, b, decimals); 308 | } 309 | } 310 | 311 | function assertGe(uint256 a, uint256 b) public { 312 | if (a < b) { 313 | emit log("Error: a >= b not satisfied [uint]"); 314 | emit log_named_uint(" Value a", a); 315 | emit log_named_uint(" Value b", b); 316 | fail(); 317 | } 318 | } 319 | 320 | function assertGe( 321 | uint256 a, 322 | uint256 b, 323 | string memory err 324 | ) public { 325 | if (a < b) { 326 | emit log_named_string("Error", err); 327 | assertGe(a, b); 328 | } 329 | } 330 | 331 | function assertGe(int256 a, int256 b) public { 332 | if (a < b) { 333 | emit log("Error: a >= b not satisfied [int]"); 334 | emit log_named_int(" Value a", a); 335 | emit log_named_int(" Value b", b); 336 | fail(); 337 | } 338 | } 339 | 340 | function assertGe( 341 | int256 a, 342 | int256 b, 343 | string memory err 344 | ) public { 345 | if (a < b) { 346 | emit log_named_string("Error", err); 347 | assertGe(a, b); 348 | } 349 | } 350 | 351 | function assertGeDecimal( 352 | int256 a, 353 | int256 b, 354 | uint256 decimals 355 | ) public { 356 | if (a < b) { 357 | emit log("Error: a >= b not satisfied [decimal int]"); 358 | emit log_named_decimal_int(" Value a", a, decimals); 359 | emit log_named_decimal_int(" Value b", b, decimals); 360 | fail(); 361 | } 362 | } 363 | 364 | function assertGeDecimal( 365 | int256 a, 366 | int256 b, 367 | uint256 decimals, 368 | string memory err 369 | ) public { 370 | if (a < b) { 371 | emit log_named_string("Error", err); 372 | assertGeDecimal(a, b, decimals); 373 | } 374 | } 375 | 376 | function assertGeDecimal( 377 | uint256 a, 378 | uint256 b, 379 | uint256 decimals 380 | ) public { 381 | if (a < b) { 382 | emit log("Error: a >= b not satisfied [decimal uint]"); 383 | emit log_named_decimal_uint(" Value a", a, decimals); 384 | emit log_named_decimal_uint(" Value b", b, decimals); 385 | fail(); 386 | } 387 | } 388 | 389 | function assertGeDecimal( 390 | uint256 a, 391 | uint256 b, 392 | uint256 decimals, 393 | string memory err 394 | ) public { 395 | if (a < b) { 396 | emit log_named_string("Error", err); 397 | assertGeDecimal(a, b, decimals); 398 | } 399 | } 400 | 401 | function assertLt(uint256 a, uint256 b) public { 402 | if (a >= b) { 403 | emit log("Error: a < b not satisfied [uint]"); 404 | emit log_named_uint(" Value a", a); 405 | emit log_named_uint(" Value b", b); 406 | fail(); 407 | } 408 | } 409 | 410 | function assertLt( 411 | uint256 a, 412 | uint256 b, 413 | string memory err 414 | ) public { 415 | if (a >= b) { 416 | emit log_named_string("Error", err); 417 | assertLt(a, b); 418 | } 419 | } 420 | 421 | function assertLt(int256 a, int256 b) public { 422 | if (a >= b) { 423 | emit log("Error: a < b not satisfied [int]"); 424 | emit log_named_int(" Value a", a); 425 | emit log_named_int(" Value b", b); 426 | fail(); 427 | } 428 | } 429 | 430 | function assertLt( 431 | int256 a, 432 | int256 b, 433 | string memory err 434 | ) public { 435 | if (a >= b) { 436 | emit log_named_string("Error", err); 437 | assertLt(a, b); 438 | } 439 | } 440 | 441 | function assertLtDecimal( 442 | int256 a, 443 | int256 b, 444 | uint256 decimals 445 | ) public { 446 | if (a >= b) { 447 | emit log("Error: a < b not satisfied [decimal int]"); 448 | emit log_named_decimal_int(" Value a", a, decimals); 449 | emit log_named_decimal_int(" Value b", b, decimals); 450 | fail(); 451 | } 452 | } 453 | 454 | function assertLtDecimal( 455 | int256 a, 456 | int256 b, 457 | uint256 decimals, 458 | string memory err 459 | ) public { 460 | if (a >= b) { 461 | emit log_named_string("Error", err); 462 | assertLtDecimal(a, b, decimals); 463 | } 464 | } 465 | 466 | function assertLtDecimal( 467 | uint256 a, 468 | uint256 b, 469 | uint256 decimals 470 | ) public { 471 | if (a >= b) { 472 | emit log("Error: a < b not satisfied [decimal uint]"); 473 | emit log_named_decimal_uint(" Value a", a, decimals); 474 | emit log_named_decimal_uint(" Value b", b, decimals); 475 | fail(); 476 | } 477 | } 478 | 479 | function assertLtDecimal( 480 | uint256 a, 481 | uint256 b, 482 | uint256 decimals, 483 | string memory err 484 | ) public { 485 | if (a >= b) { 486 | emit log_named_string("Error", err); 487 | assertLtDecimal(a, b, decimals); 488 | } 489 | } 490 | 491 | function assertLe(uint256 a, uint256 b) public { 492 | if (a > b) { 493 | emit log("Error: a <= b not satisfied [uint]"); 494 | emit log_named_uint(" Value a", a); 495 | emit log_named_uint(" Value b", b); 496 | fail(); 497 | } 498 | } 499 | 500 | function assertLe( 501 | uint256 a, 502 | uint256 b, 503 | string memory err 504 | ) public { 505 | if (a > b) { 506 | emit log_named_string("Error", err); 507 | assertLe(a, b); 508 | } 509 | } 510 | 511 | function assertLe(int256 a, int256 b) public { 512 | if (a > b) { 513 | emit log("Error: a <= b not satisfied [int]"); 514 | emit log_named_int(" Value a", a); 515 | emit log_named_int(" Value b", b); 516 | fail(); 517 | } 518 | } 519 | 520 | function assertLe( 521 | int256 a, 522 | int256 b, 523 | string memory err 524 | ) public { 525 | if (a > b) { 526 | emit log_named_string("Error", err); 527 | assertLe(a, b); 528 | } 529 | } 530 | 531 | function assertLeDecimal( 532 | int256 a, 533 | int256 b, 534 | uint256 decimals 535 | ) public { 536 | if (a > b) { 537 | emit log("Error: a <= b not satisfied [decimal int]"); 538 | emit log_named_decimal_int(" Value a", a, decimals); 539 | emit log_named_decimal_int(" Value b", b, decimals); 540 | fail(); 541 | } 542 | } 543 | 544 | function assertLeDecimal( 545 | int256 a, 546 | int256 b, 547 | uint256 decimals, 548 | string memory err 549 | ) public { 550 | if (a > b) { 551 | emit log_named_string("Error", err); 552 | assertLeDecimal(a, b, decimals); 553 | } 554 | } 555 | 556 | function assertLeDecimal( 557 | uint256 a, 558 | uint256 b, 559 | uint256 decimals 560 | ) public { 561 | if (a > b) { 562 | emit log("Error: a <= b not satisfied [decimal uint]"); 563 | emit log_named_decimal_uint(" Value a", a, decimals); 564 | emit log_named_decimal_uint(" Value b", b, decimals); 565 | fail(); 566 | } 567 | } 568 | 569 | function assertLeDecimal( 570 | uint256 a, 571 | uint256 b, 572 | uint256 decimals, 573 | string memory err 574 | ) public { 575 | if (a > b) { 576 | emit log_named_string("Error", err); 577 | assertGeDecimal(a, b, decimals); 578 | } 579 | } 580 | 581 | function assertEq(string memory a, string memory b) public { 582 | if (keccak256(abi.encodePacked(a)) != keccak256(abi.encodePacked(b))) { 583 | emit log("Error: a == b not satisfied [string]"); 584 | emit log_named_string(" Value a", a); 585 | emit log_named_string(" Value b", b); 586 | fail(); 587 | } 588 | } 589 | 590 | function assertEq( 591 | string memory a, 592 | string memory b, 593 | string memory err 594 | ) public { 595 | if (keccak256(abi.encodePacked(a)) != keccak256(abi.encodePacked(b))) { 596 | emit log_named_string("Error", err); 597 | assertEq(a, b); 598 | } 599 | } 600 | 601 | function checkEq0(bytes memory a, bytes memory b) 602 | public 603 | pure 604 | returns (bool ok) 605 | { 606 | ok = true; 607 | if (a.length == b.length) { 608 | for (uint256 i = 0; i < a.length; i++) { 609 | if (a[i] != b[i]) { 610 | ok = false; 611 | } 612 | } 613 | } else { 614 | ok = false; 615 | } 616 | } 617 | 618 | function assertEq0(bytes memory a, bytes memory b) public { 619 | if (!checkEq0(a, b)) { 620 | emit log("Error: a == b not satisfied [bytes]"); 621 | emit log_named_bytes(" Expected", a); 622 | emit log_named_bytes(" Actual", b); 623 | fail(); 624 | } 625 | } 626 | 627 | function assertEq0( 628 | bytes memory a, 629 | bytes memory b, 630 | string memory err 631 | ) public { 632 | if (!checkEq0(a, b)) { 633 | emit log_named_string("Error", err); 634 | assertEq0(a, b); 635 | } 636 | } 637 | } 638 | --------------------------------------------------------------------------------