├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .webpackrc.js ├── LICENSE ├── README.md ├── package.json ├── src ├── components │ ├── Common │ │ ├── BPList │ │ │ ├── index.css │ │ │ └── index.jsx │ │ ├── Button │ │ │ ├── index.css │ │ │ └── index.jsx │ │ ├── Checkbox │ │ │ ├── index.css │ │ │ └── index.jsx │ │ ├── Modal │ │ │ ├── Alert │ │ │ │ ├── index.css │ │ │ │ └── index.jsx │ │ │ └── Modal.jsx │ │ └── Toast │ │ │ ├── index.css │ │ │ └── index.jsx │ ├── Detail │ │ ├── index.css │ │ └── index.jsx │ ├── Home │ │ ├── Filter │ │ │ ├── index.css │ │ │ └── index.jsx │ │ ├── Header │ │ │ ├── index.css │ │ │ └── index.jsx │ │ ├── index.css │ │ └── index.jsx │ ├── Profile │ │ ├── Header │ │ │ ├── index.css │ │ │ └── index.jsx │ │ ├── Item │ │ │ ├── index.css │ │ │ └── index.jsx │ │ ├── List │ │ │ ├── index.css │ │ │ └── index.jsx │ │ ├── UnstakeSelected │ │ │ ├── index.css │ │ │ └── index.jsx │ │ ├── index.css │ │ └── index.jsx │ ├── Search │ │ ├── Input │ │ │ ├── index.css │ │ │ └── index.jsx │ │ ├── index.css │ │ └── index.jsx │ └── Vote │ │ ├── Header │ │ ├── index.css │ │ └── index.jsx │ │ ├── Input │ │ ├── index.css │ │ └── index.jsx │ │ ├── index.css │ │ └── index.jsx ├── i18n │ ├── en-US.js │ ├── index.js │ └── zh-CN.js ├── icon │ ├── backWhite.png │ ├── backWhite@2x.png │ ├── backWhite@3x.png │ ├── checked.svg │ ├── partner-ch@3x.png │ ├── partner-en@3x.png │ ├── search.svg │ ├── uncheck.svg │ ├── vote-box.svg │ └── wallet-eos.svg ├── index.css ├── index.ejs ├── index.js ├── initApp.js ├── model.js ├── router.js └── utils │ ├── calcVoteWeight.js │ ├── checkVersion.js │ ├── debug.js │ ├── eosAmountToStake.js │ ├── eosHelper.js │ ├── eosMarketInfo.js │ ├── rpc.js │ ├── tracker.js │ ├── updateAccountInfoAndBalance.js │ └── updateGlobalState.js └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | charset = utf-8 10 | trim_trailing_whitespace = true 11 | insert_final_newline = true 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "parser": "babel-eslint", 3 | "extends": "standard", 4 | "plugins": [ 5 | "standard", 6 | "react" 7 | ], 8 | "rules": { 9 | "comma-dangle": [0], 10 | "space-before-function-paren": [0], 11 | "react/jsx-uses-react": [2], 12 | "react/jsx-uses-vars": [2], 13 | "react/react-in-jsx-scope": [2], 14 | "react/sort-comp": [0], 15 | "react/no-multi-comp": [0], 16 | }, 17 | "env": { 18 | "browser": true, 19 | }, 20 | }; 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | -------------------------------------------------------------------------------- /.webpackrc.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | 3 | export default { 4 | hash: true, 5 | publicPath: '/', 6 | html: { 7 | 'template': 'src/index.ejs' 8 | }, 9 | alias: { 10 | icon: path.join(__dirname, 'src/icon'), 11 | utils: path.join(__dirname, 'src/utils'), 12 | i18n: path.join(__dirname, 'src/i18n'), 13 | assets: path.join(__dirname, 'src/assets'), 14 | components: path.join(__dirname, 'src/components') 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. 374 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Stake Vote 2 | 3 | EOS stake vote DApp. 4 | 5 | ## Development 6 | 7 | Dependencies 8 | 9 | * Node LTS/Carbon 10 | * yarn 11 | 12 | ```shell 13 | yarn 14 | yarn start 15 | ``` 16 | 17 | ## Deployment 18 | 19 | This DApp depends on imToken DApp browser. 20 | 21 | ## For Block Producer 22 | 23 | If you're a EOS block producer, and you don't find your bp info, please submit more information to [eos-bp-profile](https://github.com/consenlabs/eos-bp-profile). 24 | 25 | copyright© imToken PTE. LTD. 26 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "stake-vote", 3 | "version": "1.0.0", 4 | "description": "EOS stake vote DApp", 5 | "main": "index.js", 6 | "repository": "git@github.com:consenlabs/eos-stake-vote-dapp.git", 7 | "author": "xwartz ", 8 | "license": "MIT", 9 | "private": true, 10 | "scripts": { 11 | "start": "export HARD_SOURCE=none &&roadhog server", 12 | "build": "roadhog build", 13 | "lint": "eslint --ext .js src test", 14 | "precommit": "yarn lint", 15 | "deploy_gd_api": "yarn build && rsync -va dist/*.* deploy@token-api:/home/deploy/stake-vote/dist", 16 | "deploy_staging": "yarn build && rsync -va dist/*.* deploy@token-staging:/home/deploy/stake-vote/dist" 17 | }, 18 | "devDependencies": { 19 | "eslint": "^6.2.0", 20 | "eslint-config-standard": "^14.0.0", 21 | "eslint-plugin-import": "^2.18.0", 22 | "eslint-plugin-node": "^9.0.1", 23 | "eslint-plugin-promise": "^4.2.0", 24 | "eslint-plugin-react": "^7.14.3", 25 | "eslint-plugin-standard": "^4.0.0" 26 | }, 27 | "dependencies": { 28 | "bignumber.js": "^7.2.1", 29 | "classnames": "^2.2.5", 30 | "debounce": "^1.1.0", 31 | "dva": "^2.6.0-beta.12", 32 | "eosjs": "^14.1.0", 33 | "prop-types": "^15.6.1", 34 | "rc-slider": "^8.6.1", 35 | "react": "^16.3.2", 36 | "react-dom": "^16.3.3", 37 | "react-loading": "^2.0.2", 38 | "react-modal": "^3.4.4", 39 | "rmc-list-view": "^0.11.5", 40 | "rmc-notification": "^1.0.0" 41 | } 42 | } -------------------------------------------------------------------------------- /src/components/Common/BPList/index.css: -------------------------------------------------------------------------------- 1 | .listWrap { 2 | display: flex; 3 | flex:1; 4 | overflow: auto; 5 | } 6 | 7 | .row { 8 | display: flex; 9 | justify-content: space-between; 10 | align-items: center; 11 | padding: 0 15px; 12 | background-color: #fafbfc; 13 | } 14 | .odd { 15 | background-color: #fff; 16 | } 17 | .bp { 18 | flex: 1; 19 | min-height: 64px; 20 | display: flex; 21 | flex-direction: column; 22 | justify-content: center; 23 | } 24 | .title { 25 | margin-bottom: 3px; 26 | color: #11293b; 27 | font-size: 14px; 28 | font-weight: bold; 29 | } 30 | .content { 31 | display: flex; 32 | flex-direction: row; 33 | align-items: center; 34 | flex-wrap: nowrap; 35 | } 36 | .votes { 37 | display: inline-block; 38 | min-width: 22px; 39 | text-align: center; 40 | padding: 2px 2px 1px 2px; 41 | line-height: 0.9; 42 | color: #949ea6; 43 | font-size: 12px; 44 | border: 1px solid #949ea6; 45 | border-radius: 1px; 46 | margin-right: 8px; 47 | } 48 | .desc { 49 | max-width: 150px; 50 | overflow: hidden; 51 | white-space: nowrap; 52 | text-overflow: ellipsis; 53 | color: #949ea6; 54 | font-size: 13px; 55 | margin-right: 4px; 56 | } 57 | .recommend { 58 | display: inline-block; 59 | min-width: 22px; 60 | line-height: 0.9; 61 | padding: 2px 2px 1px 2px; 62 | text-align: center; 63 | color: #44b097; 64 | font-size: 12px; 65 | border: 1px solid #44b097; 66 | border-radius: 1px; 67 | margin-right: 8px; 68 | } 69 | 70 | .partner { 71 | height: 17px; 72 | margin-left: 5px; 73 | vertical-align: middle; 74 | object-fit: contain; 75 | } 76 | -------------------------------------------------------------------------------- /src/components/Common/BPList/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import classNames from 'classnames' 4 | import { Link } from 'react-router-dom' 5 | import ListView from 'rmc-list-view' 6 | import styles from './index.css' 7 | import Checkbox from 'components/Common/Checkbox' 8 | import i18n from 'i18n' 9 | import enPartnerIcon from 'icon/partner-en@3x.png' 10 | import zhPartnerIcon from 'icon/partner-ch@3x.png' 11 | 12 | export default class List extends React.Component { 13 | static propTypes = { 14 | appState: PropTypes.object.isRequired, 15 | onSelected: PropTypes.func.isRequired, 16 | onlyShowSelected: PropTypes.bool, 17 | disabled: PropTypes.bool, 18 | } 19 | 20 | static defaultProps = { 21 | appState: { 22 | producers: [], 23 | selectedProducers: [], 24 | }, 25 | votes: 0, 26 | onlyShowSelected: false, 27 | disabled: false, 28 | onSelected: () => { } 29 | } 30 | 31 | constructor(props) { 32 | super(props) 33 | this.dataSource = new ListView.DataSource({ 34 | rowHasChanged: (row1, row2) => row1 !== row2, 35 | }) 36 | 37 | this.state = { 38 | selected: props.appState.selectedProducers, 39 | } 40 | } 41 | 42 | render() { 43 | const { appState, onlyShowSelected } = this.props 44 | const listData = onlyShowSelected ? appState.selectedProducers : appState.producers 45 | 46 | /* TODO: soft and filter */ 47 | const sortType = appState.sortType 48 | let sortProducers = listData.slice(0) 49 | switch (sortType) { 50 | case 1: 51 | sortProducers = sortProducers.sort((a, b) => { 52 | return a.votesOrder < b.votesOrder ? -1 : 1 53 | }) 54 | break 55 | case 2: 56 | sortProducers = sortProducers.sort((a, b) => { 57 | if (!a.locationName) return 1 58 | if (!b.locationName) return -1 59 | return a.locationName < b.locationName ? -1 : 1 60 | }) 61 | break 62 | default: 63 | } 64 | 65 | const dataSource = this.dataSource.cloneWithRows(sortProducers) 66 | return ( 67 |
68 | this.renderRow(rowData, sectionID, rowID)} 73 | initialListSize={sortProducers.length} 74 | /> 75 |
76 | ) 77 | } 78 | 79 | renderRow(rowData, sectionID, rowID) { 80 | const { disabled, appState } = this.props 81 | const { sortType } = appState 82 | const showOrder = sortType === 1 83 | 84 | const rowClass = classNames({ 85 | [styles.row]: true, 86 | [styles.odd]: rowID % 2 === 1 87 | }) 88 | const checked = !!this.props.appState.selectedProducers.find(x => x.id === rowData.id) 89 | const isPartner = rowData.partner 90 | const isRecommend = rowData.ad 91 | const partnerIcon = i18n.partner === 'partner_zh' ? zhPartnerIcon : enPartnerIcon 92 | 93 | return ( 94 |
95 | { 96 | disabled ? 97 |
98 |
{rowData.title} 99 | {!!isPartner && } 100 |
101 |
102 | {showOrder &&
{rowData.votesOrder}
} 103 | {!!isRecommend &&
{i18n.recommend}
} 104 | {rowData.locationName &&
{rowData.locationName + ' | '}
} 105 |
{rowData.intro || rowData.meta.url}
106 |
107 |
108 | : 109 | 110 |
{rowData.title} 111 | {!!isPartner && } 112 |
113 |
114 | {showOrder &&
{rowData.votesOrder}
} 115 | {!!isRecommend &&
{i18n.recommend}
} 116 | {rowData.locationName &&
{rowData.locationName + ' | '}
} 117 |
{rowData.intro || rowData.meta.url}
118 |
119 | 120 | } 121 | {!disabled && 122 | this.handleCheck(rowData, e)} /> 123 | } 124 |
125 | ) 126 | } 127 | 128 | handleCheck = (bp, e) => { 129 | const checked = e.target.checked 130 | const selected = this.state.selected 131 | if (checked) { 132 | selected.push(bp) 133 | } else { 134 | const index = selected.findIndex(s => s.id === bp.id) 135 | selected.splice(index, 1) 136 | } 137 | this.setState({ selected }) 138 | this.props.onSelected(bp, selected, checked) 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /src/components/Common/Button/index.css: -------------------------------------------------------------------------------- 1 | .button { 2 | color: #fff; 3 | background-image: none; 4 | font-size: 16px; 5 | cursor: pointer; 6 | display: inline-block; 7 | min-height: 1em; 8 | line-height: 1em; 9 | outline: 0; 10 | border: none; 11 | /* padding: .78571429em 1.5em .78571429em; */ 12 | text-transform: none; 13 | text-shadow: none; 14 | font-style: normal; 15 | text-align: center; 16 | text-decoration: none; 17 | /* box-shadow: 0 0 0 1px transparent inset, 0 0 0 0 rgba(34,36,38,.15) inset; */ 18 | user-select: none; 19 | transition: opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease; 20 | will-change: ''; 21 | -webkit-tap-highlight-color: transparent; 22 | 23 | width: 100%; 24 | height: 48px; 25 | border-radius: 0; 26 | background-color: #1e9584; 27 | margin: 0; 28 | display: block; 29 | } 30 | 31 | .none { 32 | background-color: #fff; 33 | } 34 | 35 | .grey { 36 | background-color: #949ea6; 37 | } 38 | .ghost { 39 | border: 1px solid #949ea6; 40 | background-color: transparent; 41 | color: #63727d; 42 | } 43 | .second { 44 | background-color: #249cb3; 45 | } 46 | .disabled { 47 | background-color: #c2c8cc; 48 | } 49 | -------------------------------------------------------------------------------- /src/components/Common/Button/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import classNames from 'classnames' 4 | import styles from './index.css' 5 | 6 | class Button extends React.Component { 7 | render() { 8 | const { type, title, onClick, disabled = false, style } = this.props 9 | const btnClass = classNames({ 10 | [styles.button]: true, 11 | [styles.ghost]: type === 'ghost', 12 | [styles.grey]: type === 'grey', 13 | [styles.primary]: type === 'primary', 14 | [styles.second]: type === 'second', 15 | [styles.disabled]: disabled, 16 | [style]: style, 17 | }) 18 | 19 | return ( 20 | 27 | ) 28 | } 29 | } 30 | 31 | Button.propTypes = { 32 | title: PropTypes.string.isRequired, 33 | onClick: PropTypes.func.isRequired, 34 | disabled: PropTypes.bool, 35 | type: PropTypes.string, 36 | style: PropTypes.string 37 | } 38 | 39 | export default Button 40 | -------------------------------------------------------------------------------- /src/components/Common/Checkbox/index.css: -------------------------------------------------------------------------------- 1 | .checkbox { 2 | display: block; 3 | } 4 | 5 | .icon { 6 | width: 24px; 7 | height: 24px; 8 | } 9 | -------------------------------------------------------------------------------- /src/components/Common/Checkbox/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import classNames from 'classnames' 4 | import styles from './index.css' 5 | import checked from 'icon/checked.svg' 6 | import uncheck from 'icon/uncheck.svg' 7 | 8 | const checkboxIcons = { 9 | normal: uncheck, 10 | checked: checked, 11 | normal_disable: uncheck, 12 | checked_disable: checked, 13 | } 14 | 15 | export default class Checkbox extends React.Component { 16 | static propTypes = { 17 | style: PropTypes.string, 18 | icons: PropTypes.object, 19 | checked: PropTypes.bool, 20 | disabled: PropTypes.bool, 21 | iconScale: PropTypes.number, 22 | onChange: PropTypes.func, 23 | } 24 | 25 | static defaultProps = { 26 | style: '', 27 | icons: checkboxIcons, 28 | checked: false, 29 | disabled: false, 30 | iconScale: 1, 31 | onChange() { }, 32 | } 33 | 34 | constructor(props) { 35 | super(props) 36 | 37 | this.state = { 38 | checked: props.checked, 39 | } 40 | } 41 | 42 | render() { 43 | const { disabled, style, icons, children, iconScale } = this.props 44 | const checked = this.state.checked 45 | 46 | const checkboxStyle = classNames({ 47 | [styles.checkbox]: true, 48 | [style]: style, 49 | }) 50 | 51 | let icon 52 | if (checked) { 53 | if (disabled) { 54 | icon = icons.checked_disable 55 | } else { 56 | icon = icons.checked 57 | } 58 | } else { 59 | if (disabled) { 60 | icon = icons.normal_disable 61 | } else { 62 | icon = icons.normal 63 | } 64 | } 65 | 66 | return ( 67 | 68 | 69 | {children} 70 | 71 | ) 72 | } 73 | 74 | handleClick = (e) => { 75 | if (this.props.disabled) return 76 | 77 | const checked = !this.state.checked 78 | this.setState({ checked }) 79 | this.props.onChange({ 80 | target: { checked }, 81 | stopPropagation() { 82 | e.stopPropagation() 83 | }, 84 | preventDefault() { 85 | e.preventDefault() 86 | }, 87 | nativeEvent: e.nativeEvent, 88 | }) 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /src/components/Common/Modal/Alert/index.css: -------------------------------------------------------------------------------- 1 | .content { 2 | text-align: center; 3 | margin: 0 0 80px; 4 | } 5 | .title { 6 | color: #344857; 7 | font-size: 16px; 8 | font-weight: 500; 9 | margin: 0; 10 | margin-bottom: 20px; 11 | } 12 | .desc { 13 | font-size: 13px; 14 | color: #63727d; 15 | margin: 0; 16 | text-align: left; 17 | } 18 | .buttons { 19 | display: flex; 20 | justify-content: space-between; 21 | } 22 | .cancel { 23 | min-width: 110px; 24 | width: auto; 25 | height: 38px; 26 | border-radius: 25.5px; 27 | border: solid 1px #949ea6; 28 | } 29 | .confirm { 30 | width: auto; 31 | min-width: 110px; 32 | height: 38px; 33 | border-radius: 25.5px; 34 | border: solid 1px #249cb3; 35 | color: #249cb3; 36 | } 37 | -------------------------------------------------------------------------------- /src/components/Common/Modal/Alert/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Modal from '../Modal' 3 | import Button from '../../Button' 4 | import styles from './index.css' 5 | 6 | export default function Alert(props) { 7 | const { visible, title, desc, cancelText, confirmText, onCancel, onConfirm } = props 8 | return ( 9 | 10 |
11 |
12 |

{title}

13 |

{desc}

14 |
15 | 16 |
17 |
30 |
31 |
32 | ) 33 | } 34 | -------------------------------------------------------------------------------- /src/components/Common/Modal/Modal.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactModal from 'react-modal' 3 | 4 | export default class Modal extends React.Component { 5 | render() { 6 | const { visible, style } = this.props 7 | return ( 8 | 34 | {this.props.children} 35 | 36 | ) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/components/Common/Toast/index.css: -------------------------------------------------------------------------------- 1 | :global .am-toast { 2 | position: fixed; 3 | width: 100%; 4 | z-index: 111; 5 | font-size: 13px; 6 | text-align: center; 7 | } 8 | 9 | :global .am-toast > span { 10 | max-width: 50%; 11 | } 12 | 13 | :global .am-toast-mask { 14 | height: 100%; 15 | display: flex; 16 | justify-content: center; 17 | align-items: center; 18 | left: 0; 19 | top: 0; 20 | } 21 | 22 | :global .am-toast-nomask { 23 | position: fixed; 24 | max-width: 50%; 25 | width: auto; 26 | left: 50%; 27 | top: 50%; 28 | } 29 | 30 | :global .am-toast-notice { 31 | /* transform: translateX(-50%) translateY(-50%); */ 32 | } 33 | 34 | :global .am-toast-text { 35 | min-width: 90px; 36 | border-radius: 6px; 37 | color: #fff; 38 | background-color: rgba(0, 0, 0, 0.7); 39 | padding: 10px; 40 | } 41 | 42 | :global .am-toast.am-toast-text-icon { 43 | border-radius: 6px; 44 | padding: 10px; 45 | } 46 | 47 | :global .am-toast-text-info { 48 | margin-top: 10px; 49 | } 50 | -------------------------------------------------------------------------------- /src/components/Common/Toast/index.jsx: -------------------------------------------------------------------------------- 1 | import classnames from 'classnames' 2 | import React from 'react' 3 | import Notification from 'rmc-notification' 4 | 5 | let messageInstance 6 | const prefixCls = 'am-toast' 7 | 8 | function getMessageInstance( 9 | mask, 10 | callback, 11 | ) { 12 | if (messageInstance) { 13 | messageInstance.destroy() 14 | messageInstance = null 15 | } 16 | Notification.newInstance( 17 | { 18 | prefixCls, 19 | style: { 20 | height: '100%', 21 | display: 'flex', 22 | justifyContent: 'center', 23 | alignItems: 'center', 24 | left: 0, 25 | top: 0, 26 | }, 27 | transitionName: 'am-fade', 28 | className: classnames({ 29 | [`${prefixCls}-mask`]: mask, 30 | [`${prefixCls}-nomask`]: !mask, 31 | }), 32 | }, 33 | notification => callback && callback(notification), 34 | ) 35 | } 36 | 37 | function notice( 38 | content, 39 | type, 40 | duration = 3, 41 | onClose, 42 | mask = true, 43 | ) { 44 | const iconTypes = { 45 | info: '', 46 | success: 'success', 47 | fail: 'fail', 48 | offline: 'dislike', 49 | loading: 'loading', 50 | } 51 | const iconType = iconTypes[type] 52 | 53 | getMessageInstance(mask, notification => { 54 | messageInstance = notification 55 | 56 | notification.notice({ 57 | duration, 58 | style: {}, 59 | content: !!iconType ? ( 60 |
65 |
{content}
66 |
67 | ) : ( 68 |
69 |
{content}
70 |
71 | ), 72 | closable: true, 73 | onClose() { 74 | if (onClose) { 75 | onClose() 76 | } 77 | notification.destroy() 78 | notification = null 79 | messageInstance = null 80 | }, 81 | }) 82 | }) 83 | } 84 | export default { 85 | SHORT: 3, 86 | LONG: 8, 87 | show(content, duration, mask) { 88 | return notice(content, 'info', duration, () => { }, mask) 89 | }, 90 | info( 91 | content, 92 | duration, 93 | onClose, 94 | mask, 95 | ) { 96 | return notice(content, 'info', duration, onClose, mask) 97 | }, 98 | success( 99 | content, 100 | duration, 101 | onClose, 102 | mask, 103 | ) { 104 | return notice(content, 'success', duration, onClose, mask) 105 | }, 106 | fail( 107 | content, 108 | duration, 109 | onClose, 110 | mask, 111 | ) { 112 | return notice(content, 'fail', duration, onClose, mask) 113 | }, 114 | offline( 115 | content, 116 | duration, 117 | onClose, 118 | mask, 119 | ) { 120 | return notice(content, 'offline', duration, onClose, mask) 121 | }, 122 | loading( 123 | content, 124 | duration, 125 | onClose, 126 | mask, 127 | ) { 128 | return notice(content, 'loading', duration, onClose, mask) 129 | }, 130 | hide() { 131 | if (messageInstance) { 132 | messageInstance.destroy() 133 | messageInstance = null 134 | } 135 | }, 136 | } 137 | -------------------------------------------------------------------------------- /src/components/Detail/index.css: -------------------------------------------------------------------------------- 1 | .wrap { 2 | background: #f2f4f5; 3 | } 4 | 5 | .header { 6 | display: flex; 7 | flex-direction: column; 8 | justify-content: center; 9 | align-items: center; 10 | background: #fff; 11 | padding-bottom: 20px; 12 | } 13 | 14 | .banner { 15 | width: 100vw; 16 | height: 140px; 17 | overflow: hidden; 18 | background: no-repeat center center; 19 | background-size: cover ; 20 | background-color: #000; 21 | } 22 | 23 | .logo { 24 | width: 60px; 25 | height: 60px; 26 | margin-top: -30px; 27 | background: no-repeat center center; 28 | border: 1px solid #fff; 29 | background-size: cover; 30 | border-radius: 100%; 31 | background-color: #000; 32 | } 33 | 34 | .title { 35 | margin-top: 10px; 36 | font-size: 18px; 37 | font-weight: 600; 38 | color: #11293b; 39 | } 40 | 41 | .accountName { 42 | font-weight: normal; 43 | font-size: 14px; 44 | margin: 10px 0; 45 | color: #949ea6; 46 | } 47 | 48 | .intro { 49 | margin-top: 5px; 50 | padding: 0 20px; 51 | font-size: 13px; 52 | color: #949ea6; 53 | } 54 | 55 | 56 | .buttons { 57 | margin-top: 15px; 58 | display: flex; 59 | justify-content: center; 60 | width: 100%; 61 | } 62 | .button { 63 | width: auto; 64 | height: 36px; 65 | background: #fff; 66 | color: #11293b; 67 | font-weight: 600; 68 | border: 1px solid #e9e9ea; 69 | border-radius: 18px; 70 | font-size: 14px; 71 | padding: 0 14px; 72 | margin: 0 7px; 73 | } 74 | 75 | .detail { 76 | padding: 10px 15px 20px 15px; 77 | margin-top: 10px; 78 | background: #fff; 79 | } 80 | 81 | .row { 82 | margin-top: 20px; 83 | } 84 | 85 | .rowName { 86 | margin-bottom: 7px; 87 | font-size: 15px; 88 | font-weight: 600; 89 | color: #344857; 90 | } 91 | 92 | .rowValue { 93 | font-size: 13px; 94 | color: #344857; 95 | line-height: 1.54; 96 | overflow : hidden; 97 | text-overflow: ellipsis; 98 | display: -webkit-box; 99 | -webkit-line-clamp: 3; 100 | -webkit-box-orient: vertical; 101 | } 102 | 103 | .socialRow { 104 | display: flex; 105 | justify-content: space-between; 106 | font-size: 13px; 107 | color: #344857; 108 | line-height: 1.54; 109 | } 110 | -------------------------------------------------------------------------------- /src/components/Detail/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Button from 'components/Common/Button' 3 | import Toast from 'components/Common/Toast' 4 | import styles from './index.css' 5 | import initApp from '../../initApp' 6 | import { reportPV, getProducers } from '../../utils/rpc' 7 | import { calculateVoteWeight } from '../../utils/calcVoteWeight' 8 | import { updateGlobalState } from '../../utils/updateGlobalState' 9 | import { connect } from 'dva' 10 | import i18n from 'i18n' 11 | 12 | class Detail extends React.Component { 13 | static defaultProps = { 14 | appState: { 15 | producers: [] 16 | } 17 | } 18 | 19 | constructor(props) { 20 | super(props) 21 | initApp(props) 22 | 23 | const id = props.match.params.id 24 | 25 | this.state = { 26 | producer: props.appState.producers.find(p => p.id === id), 27 | } 28 | } 29 | 30 | componentDidMount() { 31 | const id = this.props.match.params.id 32 | reportPV(id) 33 | 34 | getProducers().then(producers => { 35 | this.props.dispatch({ type: 'appState/update', payload: { producers } }) 36 | }) 37 | 38 | setTimeout(() => { 39 | if (window.eos) { 40 | updateGlobalState(this.props.dispatch).catch(e => { }) 41 | } 42 | }, 1000) 43 | } 44 | 45 | UNSAFE_componentWillReceiveProps(nextProps) { 46 | const id = this.props.match.params.id 47 | this.setState({ 48 | producer: nextProps.appState.producers.find(p => p.id === id), 49 | }) 50 | } 51 | 52 | render() { 53 | const { producer } = this.state 54 | if (!producer) return null 55 | 56 | return ( 57 |
58 | {this.renderHeader(producer)} 59 | {this.renderDetail(producer)} 60 | {this.renderContacts(producer)} 61 |
62 | ) 63 | } 64 | 65 | renderHeader(producer) { 66 | 67 | return ( 68 |
69 |
70 |
71 |

{producer.title}

72 |

@{producer.id}

73 |

{producer.intro}

74 | {this.renderButtons(producer)} 75 |
76 | ) 77 | } 78 | 79 | renderDetail(producer) { 80 | const { appState } = this.props 81 | const rate = producer.meta.totalVotes / appState.totalProducerVoteWeight 82 | const percent = parseFloat(rate * 100).toFixed(2) 83 | const votes = (producer.meta.totalVotes / calculateVoteWeight() / 10000).toFixed(0) 84 | 85 | return ( 86 |
87 |
88 |
{i18n.votes_weight}
89 |
{votes} ({percent}%)
90 |
91 | 92 |
93 |
{i18n.location}
94 |
{producer.locationName}
95 |
96 | 97 | {producer.nodes && producer.nodes.length ? 98 |
99 |
{i18n.node_location}
100 |
{producer.nodes.join('、')}
101 |
: null 102 | } 103 | 104 |
105 |
{i18n.website}
106 |
{producer.meta.url}
107 |
108 | 109 |
110 |
{i18n.team_introduce}
111 |
{producer.detail}
112 |
113 |
114 | ) 115 | } 116 | 117 | getSocialPrefix(key) { 118 | switch (key) { 119 | case 'Email': 120 | return 'mailto:' 121 | case 'Facebook': 122 | return 'https://facebook.com/' 123 | case 'Twitter': 124 | return 'https://twitter.com/' 125 | default: 126 | return '' 127 | } 128 | } 129 | 130 | renderContacts(producer) { 131 | if (!producer.social) return null 132 | const socials = [] 133 | for (let key in producer.social) { 134 | socials.push([key, producer.social[key]]) 135 | } 136 | return ( 137 |
138 |
139 |
{i18n.contact}
140 | {socials.map(s => { 141 | const link = this.getSocialPrefix(s[0]) + s[1] 142 | return
143 | {s[0]} 144 | {s[1]} 145 |
146 | })} 147 |
148 |
149 | ) 150 | } 151 | 152 | renderButtons(producer) { 153 | const { appState } = this.props 154 | const isSelected = !!appState.selectedProducers.find(p => p.id === producer.id) 155 | return ( 156 |
157 |
160 | ) 161 | } 162 | 163 | handleVote = () => { 164 | const { producer } = this.state 165 | this.props.dispatch({ 166 | type: 'appState/update', 167 | payload: { 168 | selectedProducers: [producer], 169 | } 170 | }) 171 | this.props.history.push('/vote') 172 | } 173 | 174 | handleAdd = (isSelected) => { 175 | const { producer } = this.state 176 | const { appState } = this.props 177 | const selectedProducers = appState.selectedProducers.slice(0) 178 | 179 | if (isSelected) { 180 | const index = selectedProducers.findIndex(p => p.id === producer.id) 181 | selectedProducers.splice(index, 1) 182 | } else { 183 | selectedProducers.push(producer) 184 | } 185 | 186 | this.props.dispatch({ 187 | type: 'appState/update', 188 | payload: { 189 | selectedProducers: selectedProducers, 190 | } 191 | }) 192 | Toast.show(isSelected ? i18n.canceled : i18n.added) 193 | } 194 | } 195 | 196 | export default connect(({ appState }) => ({ appState }))(Detail) 197 | -------------------------------------------------------------------------------- /src/components/Home/Filter/index.css: -------------------------------------------------------------------------------- 1 | .wrap { 2 | display: flex; 3 | min-height: 38px; 4 | flex-direction: row; 5 | justify-content: space-between; 6 | margin: 8px 0; 7 | } 8 | .types { 9 | display: flex; 10 | flex-direction: row; 11 | align-items: center; 12 | padding-left: 15px; 13 | } 14 | .type { 15 | display: block; 16 | min-width: 44px; 17 | padding: 4.5px 10px; 18 | border-radius: 4px; 19 | background-color: #fafbfc; 20 | border: solid 0.5px #d5dce0; 21 | margin-right: 8px; 22 | font-size: 12px; 23 | color: #344857; 24 | } 25 | .selected { 26 | background-color: #353535; 27 | color: #fff; 28 | } 29 | .search { 30 | width: 42px; 31 | height: 35px; 32 | background-color: #fff; 33 | display: flex; 34 | align-items: center; 35 | justify-content: center; 36 | } 37 | .searchIcon { 38 | width: 16px; 39 | height: 16px; 40 | } 41 | .searchWrap { 42 | display: flex; 43 | flex-direction: row; 44 | } 45 | .shadow { 46 | width: 3px; 47 | height: 36px; 48 | opacity: 0.5; 49 | background-color: #e6e8eb; 50 | border-top-left-radius: 4px; 51 | border-bottom-left-radius: 4px; 52 | } 53 | -------------------------------------------------------------------------------- /src/components/Home/Filter/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import { Link } from 'react-router-dom' 4 | import classNames from 'classnames' 5 | import styles from './index.css' 6 | import search from 'icon/search.svg' 7 | import i18n from 'i18n' 8 | 9 | export default class Filter extends React.Component { 10 | static propTypes = { 11 | types: PropTypes.array.isRequired, 12 | onSelected: PropTypes.func.isRequired, 13 | sortType: PropTypes.number.isRequired, 14 | } 15 | 16 | static defaultProps = { 17 | types: [ 18 | { name: i18n.sort_type_default, id: 0 }, 19 | { name: i18n.sort_type_ranking, id: 1 }, 20 | { name: i18n.sort_type_location, id: 2 }], 21 | onSelected: () => { }, 22 | selected: 0, 23 | } 24 | 25 | constructor(props) { 26 | super(props) 27 | this.state = { 28 | selected: props.sortType, 29 | } 30 | } 31 | 32 | render() { 33 | return ( 34 |
35 | {this.renderTypes()} 36 | {this.renderSearch()} 37 |
38 | ) 39 | } 40 | 41 | renderTypes() { 42 | const { types } = this.props 43 | const { selected } = this.state 44 | return ( 45 |
46 | {types.map((type, index) => { 47 | const typeClass = classNames({ 48 | [styles.type]: true, 49 | [styles.selected]: type.id === selected 50 | }) 51 | return ( 52 | this.handleSelected(type)}>{type.name} 53 | ) 54 | })} 55 |
56 | ) 57 | } 58 | 59 | renderSearch() { 60 | return ( 61 |
62 |
63 | 64 | search 65 | 66 |
67 | ) 68 | } 69 | 70 | handleSelected = (type) => { 71 | this.props.onSelected(type) 72 | this.setState({ selected: type.id }) 73 | } 74 | 75 | toSearch = () => { 76 | console.log('to search') 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/components/Home/Header/index.css: -------------------------------------------------------------------------------- 1 | .header { 2 | background: #000; 3 | } 4 | 5 | .homeTop { 6 | padding-top: 20px; 7 | padding-right: 15px; 8 | display: flex; 9 | justify-content: flex-end; 10 | } 11 | 12 | .avatar { 13 | width: 24px; 14 | height: 24px; 15 | vertical-align: middle; 16 | } 17 | 18 | .progress { 19 | padding: 0 15px; 20 | padding-top: 14px; 21 | } 22 | .progressOuter { 23 | position: relative; 24 | width: 100%; 25 | height: 4px; 26 | border-radius: 7px; 27 | background-color: rgba(255, 255, 255, 0.23); 28 | } 29 | .progressBar { 30 | position: relative; 31 | height: 4px; 32 | border-radius: 7px; 33 | background-color: #76c8d9; 34 | } 35 | .progressBar::after { 36 | content: ''; 37 | position: absolute; 38 | width: 1px; 39 | height: 10px; 40 | background-color: #76c8d9; 41 | right: 0; 42 | top: -3px; 43 | } 44 | 45 | .profileIcon { 46 | position: relative; 47 | } 48 | 49 | .profileIcon::after { 50 | content: ''; 51 | position: absolute; 52 | top: 10px; 53 | right: -10px; 54 | border-width: 3px 4px 3px 4px; 55 | border-color: transparent transparent transparent #fff; 56 | border-style: solid; 57 | } 58 | 59 | .progressTip { 60 | font-size: 12px; 61 | color: #e6e8eb; 62 | text-align: center; 63 | margin-bottom: 9px; 64 | } 65 | .statusInfo { 66 | display: flex; 67 | flex-direction: row; 68 | justify-content: space-between; 69 | padding: 20px 15px 16px; 70 | align-items: center; 71 | } 72 | .statusItem { 73 | display: flex; 74 | flex-direction: row; 75 | align-items: center; 76 | } 77 | .divider { 78 | width: 2px; 79 | height: 26px; 80 | background-color: #949ea6; 81 | margin-right: 3px; 82 | } 83 | .value { 84 | color: #fafbfc; 85 | font-size: 12px; 86 | } 87 | .desc { 88 | color: #949ea6; 89 | font-size: 12px; 90 | line-height: 12px; 91 | margin-top: 2px; 92 | } 93 | .rule { 94 | display: flex; 95 | align-items: center; 96 | justify-content: center; 97 | min-width: 56px; 98 | height: 24px; 99 | padding: 0 8px; 100 | font-size: 12px; 101 | color: #e6e8eb; 102 | text-align: center; 103 | border: solid 1px #e6e8eb; 104 | } 105 | -------------------------------------------------------------------------------- /src/components/Home/Header/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Link } from 'react-router-dom' 3 | import PropTypes from 'prop-types' 4 | import styles from './index.css' 5 | import avatar from 'icon/wallet-eos.svg' 6 | import i18n from 'i18n' 7 | 8 | export default class Header extends React.Component { 9 | static propTypes = { 10 | appState: PropTypes.object.isRequired, 11 | headBlockNum: PropTypes.number 12 | } 13 | 14 | static defaultProps = { 15 | appState: {} 16 | } 17 | 18 | render() { 19 | return ( 20 |
21 | {this.renderNavbar()} 22 | {this.renderProgress()} 23 |
24 | ) 25 | } 26 | 27 | renderNavbar() { 28 | return ( 29 |
30 | avatar 31 |
32 | ) 33 | } 34 | 35 | renderProgress() { 36 | const { appState, headBlockNum } = this.props 37 | const totalVotes = appState.totalActivatedStake ? parseInt(appState.totalActivatedStake / 10000, 10) : 0 38 | const percentage = (totalVotes / appState.maxSupply * 100).toFixed(2) 39 | 40 | return ( 41 |
42 |
43 |
44 | {`${i18n.progress}:${percentage}% | ${i18n.voted}: ${totalVotes}`} 45 |
46 |
47 |
48 |
49 |
50 | 51 |
52 |
53 |
54 |
55 |
{appState.eosPrice} USDT
56 |
{i18n.eos_price}
57 |
58 |
59 |
60 |
61 |
62 |
{headBlockNum || `...`}
63 |
{`Block Height`}
64 |
65 |
66 | {i18n.rules} 67 |
68 |
69 | ) 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/components/Home/index.css: -------------------------------------------------------------------------------- 1 | .bodyInner { 2 | display: flex; 3 | height: 100%; 4 | flex-direction: column; 5 | } 6 | 7 | .buttonWrap { 8 | position: fixed; 9 | bottom: 20px; 10 | display: flex; 11 | align-self: center; 12 | flex-direction: row; 13 | justify-content: space-between; 14 | align-items: center; 15 | } 16 | 17 | .button { 18 | display: flex; 19 | flex-direction: row; 20 | justify-content: space-between; 21 | align-items: center; 22 | height: 42px; 23 | border-radius: 24px; 24 | padding: 11px 8px; 25 | background-color: #249cb3; 26 | box-shadow: 0 2px 8px 0 #b0c8d9; 27 | margin: 11px auto; 28 | } 29 | .text { 30 | font-size: 14px; 31 | color: #fff; 32 | margin-left: 12px; 33 | margin-right: 6px; 34 | } 35 | .selected { 36 | width: 26px; 37 | height: 26px; 38 | line-height: 26px; 39 | border-radius: 50%; 40 | background-color: #fff; 41 | font-size: 14px; 42 | text-align: center; 43 | color: #249cb3; 44 | } 45 | 46 | .bpLoading { 47 | text-align: center; 48 | padding: 100px 0; 49 | } 50 | 51 | .buttons { 52 | display: flex; 53 | justify-content: center; 54 | } 55 | 56 | .confirm { 57 | margin-top: 20px; 58 | width: auto; 59 | min-width: 110px; 60 | height: 38px; 61 | border-radius: 25.5px; 62 | border: solid 1px #249cb3; 63 | color: #249cb3; 64 | } 65 | -------------------------------------------------------------------------------- /src/components/Home/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import Modal from 'components/Common/Modal/Alert' 4 | import PureModal from 'components/Common/Modal/Modal' 5 | import BPList from 'components/Common/BPList' 6 | import Toast from 'components/Common/Toast' 7 | import Button from 'components/Common/Button' 8 | import Header from './Header' 9 | import Filter from './Filter' 10 | import styles from './index.css' 11 | 12 | import * as eosHelper from '../../utils/eosHelper' 13 | import tracker from '../../utils/tracker' 14 | import initApp from '../../initApp' 15 | import { connect } from 'dva' 16 | import i18n from 'i18n' 17 | import { updateGlobalState } from '../../utils/updateGlobalState' 18 | 19 | class Home extends React.Component { 20 | static propTypes = { 21 | appState: PropTypes.object.isRequired, 22 | } 23 | 24 | static defaultProps = { 25 | appState: {}, 26 | } 27 | 28 | constructor(props) { 29 | super(props) 30 | 31 | initApp(props) 32 | 33 | const { appState } = props 34 | this.state = { 35 | selected: appState.selectedProducers, 36 | headBlockNum: 0, 37 | visible: false, 38 | eventTip: true, 39 | } 40 | } 41 | 42 | UNSAFE_componentWillReceiveProps(nextProps) { 43 | const { appState } = nextProps 44 | this.setState({ 45 | selected: appState.selectedProducers, 46 | }) 47 | } 48 | 49 | componentDidMount() { 50 | const { dispatch } = this.props 51 | 52 | setTimeout(() => { 53 | window.eos && this.updateChainInfo() 54 | tracker.track('eos_dapp_landing') 55 | }, 1000) 56 | 57 | this.globalInterval = setInterval(() => { 58 | if (window.eos && window.imToken) { 59 | updateGlobalState(dispatch).catch(e => { }) 60 | this.updateChainInfo() 61 | } 62 | }, 5000) 63 | } 64 | 65 | updateChainInfo = () => { 66 | eosHelper.getChainInfo().then(res => { 67 | if (!this._unmounted) { 68 | this.setState({ 69 | headBlockNum: res.head_block_num 70 | }) 71 | } 72 | }).catch(e => { }) 73 | } 74 | 75 | componentWillUnmount() { 76 | this.globalInterval && clearInterval(this.globalInterval) 77 | this._unmounted = true 78 | } 79 | 80 | render() { 81 | const { appState } = this.props 82 | const { headBlockNum } = this.state 83 | const { sortType } = appState 84 | 85 | return ( 86 |
87 |
88 | 89 | {this.renderLoading()} 90 | 94 | {this.renderVoteButton()} 95 | {this.renderModal()} 96 | {/* {this.renderNotWorkModal()} */} 97 |
98 | ) 99 | } 100 | 101 | renderLoading() { 102 | const { appState } = this.props 103 | const { producers } = appState 104 | if (!producers.length) { 105 | return ( 106 |
{i18n.bp_loading}
107 | ) 108 | } else { 109 | return null 110 | } 111 | } 112 | 113 | renderVoteButton() { 114 | const { selected } = this.state 115 | return ( 116 |
117 | 118 |
{i18n.to_vote}
119 |
{selected.length}
120 |
121 |
122 | ) 123 | } 124 | 125 | renderModal() { 126 | return ( 127 | this.setState({ visible: false })} 134 | onConfirm={this.handleConfirm} 135 | /> 136 | ) 137 | } 138 | 139 | renderNotWorkModal() { 140 | return ( 141 | 146 |
147 |
{i18n.event_title}
148 |

{i18n.event_p1}

149 |

{i18n.event_p2}

150 |
151 |
152 |
161 |
162 | ) 163 | } 164 | 165 | selectSortType = (type) => { 166 | this.props.dispatch({ 167 | type: 'appState/update', payload: { 168 | sortType: type.id 169 | } 170 | }) 171 | } 172 | 173 | handleCheck = (bp, selected) => { 174 | if (selected.length > 30) { 175 | Toast.show(i18n.producers_num_limit) 176 | return 177 | } 178 | this.setState({ selected }) 179 | this.props.dispatch({ 180 | type: 'appState/update', payload: { 181 | selectedProducers: selected 182 | } 183 | }) 184 | } 185 | 186 | handleVote = () => { 187 | const selected = this.state.selected 188 | const { isVotedBefore } = this.props.appState 189 | if (!selected.length) { 190 | return Toast.show(i18n.no_producer_selected) 191 | } 192 | if (isVotedBefore) { 193 | this.setState({ visible: isVotedBefore }) 194 | } else { 195 | this.handleConfirm() 196 | } 197 | } 198 | 199 | handleConfirm = () => { 200 | this.props.history.push('/vote') 201 | } 202 | } 203 | 204 | export default connect(({ appState }) => ({ appState }))(Home) 205 | -------------------------------------------------------------------------------- /src/components/Profile/Header/index.css: -------------------------------------------------------------------------------- 1 | .header { 2 | display: flex; 3 | align-items: center; 4 | padding: 20px 15px; 5 | background: #000; 6 | color: #fff; 7 | } 8 | .walletIcon { 9 | display: block; 10 | margin-right: 15px; 11 | width: 36px; 12 | height: 36px; 13 | } 14 | .name { 15 | color: #fff; 16 | font-size: 17px; 17 | line-height: 17px; 18 | margin-bottom: 4px; 19 | } 20 | .info { 21 | display: flex; 22 | color: #c2c8cc; 23 | font-size: 11px; 24 | } 25 | .balance { 26 | margin-right: 11px; 27 | } 28 | -------------------------------------------------------------------------------- /src/components/Profile/Header/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | // import PropTypes from 'prop-types' 3 | import wallet from 'icon/wallet-eos.svg' 4 | import styles from './index.css' 5 | import i18n from 'i18n' 6 | 7 | export default class Header extends React.Component { 8 | render() { 9 | const { appState } = this.props 10 | return ( 11 |
12 | wallet 13 |
14 |
{appState.accountName}
15 |
16 |
{`${i18n.balance}: ${appState.balance} EOS`}
17 |
{`${i18n.staked}: ${appState.staked} EOS`}
18 |
19 |
20 |
21 | ) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/components/Profile/Item/index.css: -------------------------------------------------------------------------------- 1 | .item { 2 | display: flex; 3 | justify-content: space-between; 4 | align-items: center; 5 | padding: 10px 16px; 6 | background: #fafbfc; 7 | } 8 | .odd { 9 | background: #fff; 10 | } 11 | .top { 12 | display: flex; 13 | align-items: center; 14 | margin-bottom: 4px; 15 | } 16 | .votes { 17 | font-size: 14px; 18 | padding-right: 10px; 19 | line-height: 14px; 20 | } 21 | .status { 22 | color: #949ea6; 23 | border: solid 1px #c2c8cc; 24 | font-size: 10px; 25 | text-align: center; 26 | padding: 2px 4px; 27 | } 28 | 29 | .success { 30 | color: #249cb3; 31 | border-color: #249cb3; 32 | } 33 | 34 | .bp { 35 | font-size: 10px; 36 | color: #63727d; 37 | margin-bottom: 4px; 38 | } 39 | .time { 40 | font-size: 10px; 41 | color: #949ea6; 42 | } 43 | .refund { 44 | display: flex; 45 | align-items: center; 46 | justify-content: center; 47 | white-space: nowrap; 48 | padding: 5px 10px; 49 | border-radius: 13px; 50 | background-color: #ffffff; 51 | border: solid 1px #d5dce0; 52 | margin-left: 20px; 53 | font-size: 11px; 54 | color: #63727d; 55 | } 56 | -------------------------------------------------------------------------------- /src/components/Profile/Item/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import classNames from 'classnames' 4 | import Modal from 'components/Common/Modal/Alert' 5 | import styles from './index.css' 6 | import i18n from 'i18n' 7 | 8 | export default class Item extends React.Component { 9 | static propTypes = { 10 | data: PropTypes.object.isRequired, 11 | index: PropTypes.number.isRequired, 12 | handleUnstake: PropTypes.func.isRequired, 13 | } 14 | 15 | static defaultProps = { 16 | data: { 17 | producerNames: [], 18 | staked: '0', 19 | time: 0, 20 | isUnstaking: false, 21 | }, 22 | index: 0, 23 | } 24 | 25 | state = { 26 | visible: false, 27 | } 28 | 29 | render() { 30 | const { index, data } = this.props 31 | const itemClass = classNames({ 32 | [styles.item]: true, 33 | [styles.odd]: index % 2 === 1 34 | }) 35 | 36 | const labelClass = classNames({ 37 | [styles.status]: true, 38 | [styles.success]: !data.isUnstaking, 39 | }) 40 | 41 | const time = new Date(data.time).toLocaleString() 42 | 43 | return ( 44 |
45 |
46 |
47 |
{`${data.staked} EOS`}
48 | {!data.isUnstaking && !data.producerNames.length ? null : 49 |
{data.isUnstaking ? `${i18n.unstaking}` : `${i18n.successful}`}
50 | } 51 |
52 | {!!data.producerNames.length && 53 |
{`${i18n.vote_for}:${data.producerNames.join('、')}`}
54 | } 55 | {time && 56 |
{time}
57 | } 58 |
59 | {!data.isUnstaking && 60 | {i18n.unstake} 61 | } 62 | this.setState({ visible: false })} 69 | onConfirm={this.handleUnstake} 70 | /> 71 |
72 | ) 73 | } 74 | 75 | handleClick = () => { 76 | this.setState({ visible: true }) 77 | } 78 | 79 | handleUnstake = () => { 80 | this.setState({ visible: false }) 81 | this.props.handleUnstake() 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/components/Profile/List/index.css: -------------------------------------------------------------------------------- 1 | .title { 2 | margin: 12px 16px; 3 | padding-left: 4px; 4 | border-left: 3px solid #249cb3; 5 | font-size: 12px; 6 | line-height: 12px; 7 | } 8 | -------------------------------------------------------------------------------- /src/components/Profile/List/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import styles from './index.css' 4 | import Item from '../Item' 5 | 6 | export default class List extends React.Component { 7 | static propTypes = { 8 | data: PropTypes.array.isRequired, 9 | title: PropTypes.string.isRequired, 10 | handleUnstake: PropTypes.func.isRequired 11 | } 12 | 13 | static defaultProps = { 14 | data: [], 15 | handleUnstake: () => { } 16 | } 17 | 18 | render() { 19 | const { data } = this.props 20 | 21 | return ( 22 |
23 |
{this.props.title}
24 | {data.map((d, i) => { 25 | return this.renderRow(d, i) 26 | })} 27 |
28 | ) 29 | } 30 | 31 | renderRow(data, index) { 32 | return ( 33 | 34 | ) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/components/Profile/UnstakeSelected/index.css: -------------------------------------------------------------------------------- 1 | .content { 2 | text-align: center; 3 | width: 240px; 4 | padding: 0 20px; 5 | margin: 0 0 80px; 6 | } 7 | .title { 8 | color: #344857; 9 | font-size: 16px; 10 | font-weight: 500; 11 | margin: 0; 12 | margin-bottom: 20px; 13 | } 14 | 15 | .buttons { 16 | display: flex; 17 | justify-content: center; 18 | } 19 | .cancel { 20 | min-width: 110px; 21 | width: auto; 22 | height: 38px; 23 | border-radius: 25.5px; 24 | border: solid 1px #949ea6; 25 | } 26 | .confirm { 27 | width: auto; 28 | min-width: 110px; 29 | height: 38px; 30 | border-radius: 25.5px; 31 | border: solid 1px #249cb3; 32 | color: #249cb3; 33 | } 34 | 35 | .item { 36 | margin-top: 40px; 37 | } 38 | 39 | .label { 40 | margin-right: 7px; 41 | } 42 | -------------------------------------------------------------------------------- /src/components/Profile/UnstakeSelected/index.jsx: -------------------------------------------------------------------------------- 1 | import 'rc-slider/assets/index.css' 2 | import React from 'react' 3 | import Modal from 'components/Common/Modal/Modal' 4 | import Button from 'components/Common/Button' 5 | import Slider from 'rc-slider' 6 | import styles from './index.css' 7 | 8 | 9 | export default class Vote extends React.Component { 10 | constructor(props) { 11 | super(props) 12 | console.log(props) 13 | this.state = { 14 | value: props.defaultValue, 15 | } 16 | } 17 | 18 | // const createSliderWithTooltip = Slider.createSliderWithTooltip 19 | // const Range = createSliderWithTooltip(Slider) 20 | render() { 21 | 22 | const { visible, title, cancelText, confirmText, onCancel, onConfirm, defaultValue, } = this.props 23 | const { value } = this.state 24 | console.log(value, defaultValue) 25 | 26 | return ( 27 | 28 |
29 |
30 |

{title}

31 |
32 |
{value} EOS
33 | { this.setState({ value: v }) }} 42 | /> 43 |
44 |
45 | 46 |
47 |
56 |
57 |
58 | ) 59 | } 60 | } 61 | 62 | 63 | -------------------------------------------------------------------------------- /src/components/Profile/index.css: -------------------------------------------------------------------------------- 1 | .noVotes { 2 | padding-top: 100px; 3 | text-align: center; 4 | } 5 | -------------------------------------------------------------------------------- /src/components/Profile/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import styles from './index.css' 3 | import List from './List' 4 | import Header from './Header' 5 | import { connect } from 'dva' 6 | import initApp from '../../initApp' 7 | import * as eosHelper from '../../utils/eosHelper' 8 | import { updateAccountInfoAndBalance } from '../../utils/updateAccountInfoAndBalance' 9 | import { amountToStake } from '../../utils/eosAmountToStake' 10 | import SliderModal from './UnstakeSelected' 11 | import Toast from 'components/Common/Toast' 12 | import debounce from 'debounce' 13 | import i18n from 'i18n' 14 | import tracker from '../../utils/tracker' 15 | import { BigNumber } from 'bignumber.js' 16 | 17 | class Profile extends React.Component { 18 | constructor(props) { 19 | super(props) 20 | this.state = { 21 | visible: false, 22 | maxCpu: 0, 23 | maxNet: 0, 24 | defaultUnstakeValue: 0, 25 | } 26 | initApp(props) 27 | this.debounceUnstake = debounce(this.handleUnstake, 1000, true) 28 | } 29 | render() { 30 | const { appState } = this.props 31 | return ( 32 |
33 |
34 | {this.renderOngoing()} 35 | {this.renderRefunds()} 36 | {this.renderNone()} 37 | {this.renderModal()} 38 |
39 | ) 40 | } 41 | 42 | renderNone() { 43 | const { appState } = this.props 44 | const producerNames = appState.lastVotedProducerNames || [] 45 | if (!appState.staked && !producerNames.length && !appState.refunds.length) { 46 | return ( 47 |
48 |
{i18n.no_votes}
49 |
50 | ) 51 | } else { 52 | return null 53 | } 54 | } 55 | 56 | renderOngoing() { 57 | const { appState } = this.props 58 | const producerNames = appState.lastVotedProducerNames || [] 59 | if (!appState.staked && !producerNames.length) return null 60 | const data = [{ 61 | staked: appState.staked, 62 | time: appState.lastedVoteTime * 1, 63 | producerNames: producerNames, 64 | isUnstaking: false 65 | }] 66 | const title = !!producerNames.length ? i18n.ongoing : i18n.staked 67 | return ( 68 | 69 | ) 70 | } 71 | 72 | renderRefunds() { 73 | const { appState } = this.props 74 | if (!appState.refunds.length) return null 75 | 76 | const data = appState.refunds.map(d => { 77 | const staked = BigNumber(parseFloat(d.net_amount)).plus(parseFloat(d.cpu_amount)).toNumber() 78 | return { 79 | staked: staked, 80 | time: d.request_time, 81 | producerNames: [], 82 | isUnstaking: true 83 | } 84 | }) 85 | return ( 86 | 87 | ) 88 | } 89 | 90 | renderModal() { 91 | if (!this.state.visible) return null 92 | return 100 | } 101 | 102 | getMaxUnStakeValue = () => { 103 | const { appState } = this.props 104 | const stakedCpu = appState.delegatedStakeDetail.stake_cpu_quantity 105 | const stakedNet = appState.delegatedStakeDetail.stake_net_quantity 106 | const netLimit = appState.netLimit 107 | const cpuLimit = appState.cpuLimit 108 | const oneUsCpu = BigNumber(stakedCpu).dividedBy(cpuLimit.max) 109 | const oneKbNet = BigNumber(stakedNet).dividedBy(netLimit.max) 110 | 111 | const usedCpu = oneUsCpu.times(cpuLimit.used) 112 | const usedNet = oneKbNet.times(netLimit.used) 113 | const minCpu = oneUsCpu.times(15 * 1000) // 10ms 114 | const minNet = oneKbNet.times(15 * 1000) // 10kb 115 | 116 | return { 117 | cpu: BigNumber(stakedCpu).minus(usedCpu).minus(minCpu).toFixed(4) * 1, 118 | net: BigNumber(stakedNet).minus(usedNet).minus(minNet).toFixed(4) * 1 119 | } 120 | } 121 | 122 | 123 | preUnstake = () => { 124 | let { cpu, net } = this.getMaxUnStakeValue() 125 | 126 | this.setState({ 127 | maxCpu: cpu, 128 | maxNet: net, 129 | defaultUnstakeValue: BigNumber(cpu).plus(net).toFixed(4) * 1, 130 | visible: true, 131 | }) 132 | return false 133 | } 134 | 135 | handleSelectedConfirm = (value) => { 136 | this.setState({ 137 | visible: false, 138 | }) 139 | this.debounceUnstake(value) 140 | } 141 | 142 | handleUnstake = (value) => { 143 | const { appState, dispatch } = this.props 144 | const { defaultUnstakeValue, maxCpu, maxNet } = this.state 145 | let toReduceValue = BigNumber(defaultUnstakeValue).minus(value) 146 | 147 | let cpu = BigNumber(maxCpu) 148 | let net = BigNumber(maxNet) 149 | 150 | 151 | console.log(cpu, net) 152 | while (toReduceValue.isGreaterThan(0)) { 153 | 154 | 155 | console.log(toReduceValue) 156 | let harfReducer = BigNumber(toReduceValue.dividedBy(2).toFixed(4)) 157 | if (toReduceValue.isEqualTo(0.0001)) { 158 | harfReducer = toReduceValue 159 | } 160 | 161 | const toCpu = cpu.minus(harfReducer) 162 | if (toReduceValue.isGreaterThan(0) && cpu.isGreaterThan(0) && toCpu.isPositive()) { 163 | cpu = toCpu 164 | toReduceValue = toReduceValue.minus(harfReducer) 165 | } 166 | 167 | const toNet = net.minus(harfReducer) 168 | if (toReduceValue.isGreaterThan(0) && net.isGreaterThan(0) && toNet.isPositive(0)) { 169 | net = toNet 170 | toReduceValue = toReduceValue.minus(harfReducer) 171 | } 172 | } 173 | 174 | cpu = cpu.toFixed(4) * 1 175 | net = net.toFixed(4) * 1 176 | console.log(cpu, net) 177 | 178 | if (cpu < 0 || net < 0) { 179 | if (cpu < 0) { 180 | return Toast.show(i18n.cpu_not_enough) 181 | } 182 | 183 | if (net < 0) { 184 | return Toast.show(i18n.net_not_enough) 185 | } 186 | } 187 | 188 | this.handleUnstakeTracker('undelegatebw') 189 | 190 | eosHelper.undelegatebw( 191 | appState.accountName, 192 | net > 0 ? net.toFixed(4) : 0, 193 | cpu > 0 ? cpu.toFixed(4) : 0, 194 | (err, result) => { 195 | if (err) { 196 | if (err.code != 1001) { 197 | Toast.show(err.message) 198 | this.handleUnstakeTracker('undelegatebw_falied') 199 | } else { 200 | this.handleUnstakeTracker('undelegatebw_canceled') 201 | } 202 | } else { 203 | this.handleUnstakeTracker('undelegatebw_successful') 204 | Toast.show(i18n.unstake_successful) 205 | updateAccountInfoAndBalance(appState.accountName, dispatch) 206 | } 207 | } 208 | ) 209 | } 210 | 211 | handleUnstakeTracker = (event) => { 212 | const { appState } = this.props 213 | 214 | tracker.track(event, { 215 | votes: appState.delegatedStakeDetail.stake_net_quantity, 216 | accountName: appState.accountName, 217 | producers: appState.lastVotedProducerNames, 218 | }) 219 | } 220 | } 221 | 222 | export default connect(({ appState }) => ({ appState }))(Profile) 223 | -------------------------------------------------------------------------------- /src/components/Search/Input/index.css: -------------------------------------------------------------------------------- 1 | .search { 2 | display: flex; 3 | flex-direction: row; 4 | justify-content: space-between; 5 | align-items: center; 6 | padding: 10px 10px 6px; 7 | background: #000; 8 | } 9 | .inputWarp { 10 | position: relative; 11 | width: 100%; 12 | } 13 | .searchInput { 14 | width: 100%; 15 | height: 28px; 16 | border-radius: 3px; 17 | background-color: #fafbfc; 18 | box-shadow: 0 1px 1px 0 #1f957a; 19 | padding-left: 33px; 20 | color: #11293b; 21 | } 22 | .iconSearch { 23 | position: absolute; 24 | left: 10px; 25 | top: 7px; 26 | } 27 | .cancel { 28 | padding-left: 10px; 29 | font-size: 15px; 30 | line-height: 1.6; 31 | text-align: center; 32 | color: #ffffff; 33 | white-space: nowrap; 34 | } 35 | -------------------------------------------------------------------------------- /src/components/Search/Input/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import styles from './index.css' 4 | import search from 'icon/search.svg' 5 | import i18n from 'i18n' 6 | 7 | export default class SearchInput extends React.Component { 8 | static propTypes = { 9 | onChange: PropTypes.func.isRequired, 10 | onCancel: PropTypes.func.isRequired, 11 | } 12 | 13 | static defaultProps = { 14 | onChange: () => { }, 15 | onCancel: () => { }, 16 | } 17 | 18 | focusTextInput() { 19 | this.textInput.focus() 20 | } 21 | 22 | render() { 23 | const { onChange, onCancel, ...others } = this.props 24 | 25 | return ( 26 |
27 |
28 | { this.textInput = input }} 30 | type="text" 31 | placeholder={i18n.search} 32 | className={styles.searchInput} 33 | onChange={(e) => onChange(e.target.value)} 34 | {...others} 35 | /> 36 | search 41 |
42 | {i18n.cancel} 43 |
44 | ) 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/components/Search/index.css: -------------------------------------------------------------------------------- 1 | .wrap { 2 | background: #fafbfc; 3 | height: 100%; 4 | } 5 | .loading { 6 | display: flex; 7 | justify-content: center; 8 | } 9 | .empty { 10 | text-align: center; 11 | margin-top: 100px; 12 | } 13 | .emptyText { 14 | color: #63727d; 15 | font-size: 14px; 16 | } 17 | -------------------------------------------------------------------------------- /src/components/Search/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import Loading from 'react-loading' 4 | import styles from './index.css' 5 | import BPList from 'components/Common/BPList' 6 | import Toast from 'components/Common/Toast' 7 | import Input from './Input' 8 | import i18n from 'i18n' 9 | import { connect } from 'dva' 10 | import initApp from '../../initApp' 11 | 12 | class Search extends React.Component { 13 | static propTypes = { 14 | appState: PropTypes.object.isRequired, 15 | } 16 | 17 | static defaultProps = { 18 | appState: {}, 19 | } 20 | 21 | constructor(props) { 22 | super(props) 23 | initApp(props) 24 | 25 | const hash = props.location.hash || '' 26 | this.state = { 27 | searching: false, 28 | searchedData: [], 29 | keyword: hash.replace('#', ''), 30 | } 31 | } 32 | 33 | componentDidMount() { 34 | const { keyword } = this.state 35 | if (keyword) { 36 | this.handleSearch(keyword) 37 | } else { 38 | this.searchInput.focusTextInput() 39 | } 40 | } 41 | 42 | render() { 43 | return ( 44 |
45 | { this.searchInput = input }} 47 | value={this.state.keyword} 48 | onChange={this.handleSearch} 49 | onCancel={() => window.history.back()} 50 | /> 51 | {this.renderLoading()} 52 | {this.renderList()} 53 |
54 | ) 55 | } 56 | 57 | renderLoading() { 58 | return this.state.searching && ( 59 |
60 | ) 61 | } 62 | 63 | renderList() { 64 | const { searchedData, keyword, searching } = this.state 65 | if (!searchedData.length && keyword && !searching) { 66 | return this.renderListEmpty() 67 | } 68 | 69 | const data = { 70 | producers: searchedData, 71 | selectedProducers: this.props.appState.selectedProducers, 72 | } 73 | 74 | return 78 | } 79 | 80 | renderListEmpty() { 81 | return ( 82 |
83 |

{i18n.no_search_data}

84 |
85 | ) 86 | } 87 | 88 | handleCheck = (bp, selected, add) => { 89 | if (selected.length > 30) { 90 | Toast.show(i18n.producers_num_limit) 91 | return 92 | } 93 | this.props.dispatch({ 94 | type: 'appState/update', 95 | payload: { 96 | selectedProducers: selected 97 | } 98 | }) 99 | Toast.show(add ? i18n.added : i18n.canceled) 100 | } 101 | 102 | handleSearch = (keyword) => { 103 | const { appState } = this.props 104 | this.setState({ searching: true, searchedData: [], keyword }, () => { 105 | this.searchDelay && clearTimeout(this.searchDelay) 106 | this.searchDelay = setTimeout(() => { 107 | const searchedData = [] 108 | const key = keyword.trim() 109 | appState.producers.forEach(producer => { 110 | const reg = new RegExp(key, 'i') 111 | if (producer.title.match(reg) || producer.meta.owner.match(reg)) { 112 | searchedData.push(producer) 113 | } 114 | }) 115 | this.setState({ searching: false, searchedData: key ? searchedData : [] }) 116 | this.props.history.replace(`/search/#${keyword}`) 117 | }, !keyword ? 0 : 500) 118 | }) 119 | } 120 | } 121 | 122 | export default connect(({ appState }) => ({ appState }))(Search) 123 | -------------------------------------------------------------------------------- /src/components/Vote/Header/index.css: -------------------------------------------------------------------------------- 1 | .rule { 2 | color: #fff; 3 | font-size: 15px; 4 | } 5 | .content { 6 | padding: 12px 10px 25px 10px; 7 | text-align: center; 8 | background: #fff; 9 | } 10 | .ul { 11 | text-align: left; 12 | } 13 | .li { 14 | font-size: 12px; 15 | color: #11293b; 16 | line-height: 20px; 17 | display: flex; 18 | flex-direction: row; 19 | align-items: center; 20 | } 21 | .dot { 22 | width: 3px; 23 | height: 3px; 24 | background: #000; 25 | border-radius: 50%; 26 | margin: 0 10px; 27 | } 28 | 29 | .info { 30 | padding: 10px; 31 | background: #fff; 32 | } 33 | .voted { 34 | background-color: #fafbfc; 35 | box-shadow: 0 1px 4px 0 #c2c8cc; 36 | } 37 | .title { 38 | height: 23px; 39 | line-height: 23px; 40 | text-align: center; 41 | background-color: #1d1d1d; 42 | font-size: 12px; 43 | color: #fff; 44 | } 45 | .item { 46 | display: flex; 47 | justify-content: space-between; 48 | align-items: center; 49 | padding: 10px 16px; 50 | background: #fafbfc; 51 | } 52 | .odd { 53 | background: #fff; 54 | } 55 | .top { 56 | display: flex; 57 | align-items: center; 58 | margin-bottom: 4px; 59 | } 60 | .votes { 61 | font-size: 14px; 62 | padding-right: 10px; 63 | line-height: 14px; 64 | } 65 | .bp { 66 | font-size: 11px; 67 | color: #63727d; 68 | margin-bottom: 4px; 69 | } 70 | -------------------------------------------------------------------------------- /src/components/Vote/Header/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import classNames from 'classnames' 4 | import styles from './index.css' 5 | import voteBox from 'icon/vote-box.svg' 6 | import i18n from 'i18n' 7 | 8 | const getNotices = (modify) => { 9 | return modify ? [i18n.allow_increase_votes, i18n.reselected_bp_will_overwrite_the_previously_selected] : [i18n.will_use_the_currently_locked_amount, i18n.if_failed_please_vote_again] 10 | } 11 | 12 | export default class Header extends React.Component { 13 | static propTypes = { 14 | appState: PropTypes.object.isRequired, 15 | } 16 | 17 | static defaultProps = { 18 | appState: { 19 | lastVotedProducerNames: [], 20 | staked: 0, 21 | } 22 | } 23 | 24 | render() { 25 | return ( 26 |
27 | {this.renderModifyInfo()} 28 | {this.renderNotices()} 29 |
30 | ) 31 | } 32 | 33 | renderNotices() { 34 | const { modify } = this.props 35 | const notices = getNotices(modify) 36 | return ( 37 |
38 | {!modify && vote box} 39 |
    40 | {notices.map((desc, index) => { 41 | return ( 42 |
  • 43 |
    44 |
    {desc}
    45 |
  • 46 | ) 47 | })} 48 |
49 |
50 | ) 51 | } 52 | 53 | renderModifyInfo() { 54 | const { modify, appState } = this.props 55 | 56 | // if (!modify) return null 57 | 58 | return ( 59 |
60 |
61 |
{modify ? i18n.voted_info : i18n.staked}
62 | {this.renderItem(appState, 0)} 63 |
64 |
65 | ) 66 | } 67 | 68 | renderItem(data, index) { 69 | const { modify } = this.props 70 | 71 | const itemClass = classNames({ 72 | [styles.item]: true, 73 | [styles.odd]: index % 2 === 1 74 | }) 75 | return ( 76 |
77 |
78 |
79 |
{`${data.staked} EOS`}
80 |
81 | {modify && 82 |
83 | {`${i18n.vote_for}:${data.lastVotedProducerNames.join('、')}`} 84 |
85 | } 86 |
87 |
88 | ) 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /src/components/Vote/Input/index.css: -------------------------------------------------------------------------------- 1 | .wrap { 2 | margin: 10px 0; 3 | padding: 10px 18px; 4 | background: #fff; 5 | } 6 | .info { 7 | display: flex; 8 | flex-direction: row; 9 | justify-content: space-between; 10 | align-items: center; 11 | padding: 6px 0 4px; 12 | } 13 | .name { 14 | font-size: 14px; 15 | color: #11293b; 16 | } 17 | .balance { 18 | font-size: 12px; 19 | text-align: center; 20 | color: #249cb3; 21 | } 22 | .input { 23 | width: 100%; 24 | height: 22px; 25 | line-height: 22px; 26 | font-size: 22px; 27 | color: #11293b; 28 | } 29 | .inputWrap { 30 | display: flex; 31 | align-items: center; 32 | } 33 | .votes { 34 | color: #11293b; 35 | font-size: 22px; 36 | padding-right: 4px; 37 | } 38 | 39 | .form { 40 | margin-top: 10px; 41 | padding-top: 5px; 42 | border-top: 1px solid #F2F4F5; 43 | } 44 | 45 | .addNew { 46 | } 47 | 48 | .checkbox { 49 | display: flex; 50 | flex-direction: row; 51 | align-items: center; 52 | } 53 | 54 | .addNewText { 55 | font-size: 14px; 56 | margin-left: 2px; 57 | } 58 | -------------------------------------------------------------------------------- /src/components/Vote/Input/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import styles from './index.css' 4 | import Checkbox from 'components/Common/Checkbox' 5 | import i18n from 'i18n' 6 | 7 | export default class Input extends React.Component { 8 | static propTypes = { 9 | balance: PropTypes.number.isRequired, 10 | onChange: PropTypes.func.isRequired, 11 | votes: PropTypes.number.isRequired, 12 | modify: PropTypes.bool.isRequired, 13 | } 14 | 15 | static defaultProps = { 16 | balance: 0, 17 | onChange: () => { }, 18 | votes: 0, 19 | modify: false, 20 | } 21 | 22 | state = { 23 | checked: false 24 | } 25 | 26 | render() { 27 | const { checked } = this.state 28 | const { balance, votes, modify } = this.props 29 | return ( 30 |
31 |
32 | 33 |
{i18n.add_stake}
34 |
35 |
36 | {checked && 37 |
38 |
39 |
{'EOS'}
40 |
{`${i18n.stakeable_balance}: ${balance}`}
41 |
42 |
43 | {/* {modify &&
{votes}+
} */} 44 | 45 |
46 |
47 | } 48 |
49 | ) 50 | } 51 | 52 | handleAddStake = (e) => { 53 | const checked = e.target.checked 54 | this.setState({ checked }) 55 | if (!checked) { 56 | this.props.onChange(0) 57 | } 58 | } 59 | 60 | handleChange = (e) => { 61 | this.props.onChange(e.target.value) 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/components/Vote/index.css: -------------------------------------------------------------------------------- 1 | .bodyInner { 2 | display: flex; 3 | height: 100%; 4 | flex-direction: column; 5 | background-color: #f2f4f5; 6 | } 7 | 8 | .button { 9 | width: 100%; 10 | display: block; 11 | text-align: center; 12 | height: 48px; 13 | line-height: 48px; 14 | background-color: #249cb3; 15 | } 16 | .text { 17 | font-size: 16px; 18 | color: #fff; 19 | } 20 | -------------------------------------------------------------------------------- /src/components/Vote/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import Header from './Header' 4 | import Input from './Input' 5 | import Toast from 'components/Common/Toast' 6 | import BPList from 'components/Common/BPList' 7 | import styles from './index.css' 8 | 9 | import * as eosHelper from '../../utils/eosHelper' 10 | import tracker from '../../utils/tracker' 11 | import { amountToStake } from '../../utils/eosAmountToStake' 12 | import { updateAccountInfoAndBalance } from '../../utils/updateAccountInfoAndBalance' 13 | import initApp from '../../initApp' 14 | import { connect } from 'dva' 15 | import { isOldVersion } from '../../utils/checkVersion' 16 | import i18n from 'i18n' 17 | import debounce from 'debounce' 18 | import { BigNumber } from 'bignumber.js'; 19 | 20 | class Vote extends React.Component { 21 | static propTypes = { 22 | appState: PropTypes.object.isRequired, 23 | } 24 | 25 | static defaultProps = { 26 | appState: {}, 27 | } 28 | 29 | constructor(props) { 30 | super(props) 31 | initApp(props) 32 | this.state = { 33 | votes: 0, 34 | } 35 | this.debounceVote = debounce(this.handleVote, 1000, true) 36 | } 37 | 38 | getStakeAbleBalance() { 39 | const { appState } = this.props 40 | const refunds = appState.refunds 41 | let refundBalance = BigNumber(0) 42 | if (refunds && refunds.length) { 43 | const refund = refunds[0] 44 | refundBalance = BigNumber(parseFloat(refund.net_amount)).plus(parseFloat(refund.cpu_amount)) 45 | } 46 | const balance = refundBalance.plus(appState.balance) 47 | return balance.toFixed(4) * 1 48 | } 49 | 50 | render() { 51 | const { appState } = this.props 52 | const modify = !!appState.isVotedBefore 53 | const votes = appState.staked || 0 54 | const balance = this.getStakeAbleBalance() 55 | 56 | return ( 57 |
58 |
59 | 60 | 66 | {this.renderVoteButton()} 67 |
68 | ) 69 | } 70 | 71 | renderVoteButton() { 72 | const { staked, isVotedBefore } = this.props.appState 73 | const { votes } = this.state 74 | const totalVotes = BigNumber(Number(votes) || 0).plus(Number(staked) || 0).toNumber() 75 | return ( 76 | 77 |
{`${isVotedBefore ? i18n.modify_voting : i18n.vote} (${totalVotes} EOS)`}
78 |
79 | ) 80 | } 81 | 82 | handleInput = (votes) => { 83 | this.setState({ votes }) 84 | } 85 | 86 | handleVoteTacker = (event) => { 87 | const { votes } = this.state 88 | const { appState } = this.props 89 | const { staked } = appState 90 | const totalVotes = BigNumber(Number(votes) || 0).plus(Number(staked) || 0).toNumber() 91 | 92 | tracker.track(event, { 93 | totalVotes: totalVotes, 94 | votes: votes, 95 | accountName: appState.accountName, 96 | producers: appState.selectedProducers.map(pd => pd.meta.owner), 97 | }) 98 | } 99 | 100 | handleVote = () => { 101 | const { appState, dispatch } = this.props 102 | const { votes } = this.state 103 | const balance = this.getStakeAbleBalance() 104 | 105 | if (votes != 0 && isNaN(Number(votes))) { 106 | Toast.show(i18n.invalid_amount) 107 | return false 108 | } 109 | 110 | if (+votes > +balance) { 111 | Toast.show(i18n.balance_not_enough) 112 | return false 113 | } 114 | 115 | if (votes < 0) { 116 | Toast.show(i18n.amount_less_than_zero) 117 | return false 118 | } 119 | 120 | if (isOldVersion() && +votes == 0) { 121 | Toast.show(i18n.amount_must_than_zero) 122 | return false 123 | } 124 | 125 | if (!appState.staked && +votes == 0) { 126 | Toast.show(i18n.must_staked_first) 127 | return false 128 | } 129 | 130 | if (!appState.selectedProducers.length) { 131 | Toast.show(i18n.no_producer_selected) 132 | return false 133 | } 134 | 135 | const stakedObject = amountToStake(Number(votes)) 136 | const onlyVoteProducer = Number(votes) == 0 137 | 138 | this.handleVoteTacker('delegatebw_and_vote') 139 | 140 | eosHelper.delegatebwAndVote( 141 | appState.accountName, 142 | appState.selectedProducers.map(pd => pd.meta.owner), 143 | stakedObject.stake_net_quantity, 144 | stakedObject.stake_cpu_quantity, 145 | onlyVoteProducer, 146 | (err, result) => { 147 | if (err) { 148 | if (err.code != 1001) { 149 | Toast.show(`${i18n.vote_failed}: ${err.message}`) 150 | this.handleVoteTacker('delegatebw_and_vote_failed') 151 | } else { 152 | this.handleVoteTacker('delegatebw_and_vote_canceled') 153 | } 154 | } else { 155 | this.handleVoteTacker('delegatebw_and_vote_successful') 156 | Toast.show(i18n.vote_successful) 157 | localStorage.setItem('lastedVoteTime', Date.now()) 158 | updateAccountInfoAndBalance(appState.accountName, dispatch) 159 | this.props.history.push('/profile') 160 | } 161 | } 162 | ) 163 | } 164 | } 165 | 166 | export default connect(({ appState }) => ({ appState }))(Vote) 167 | -------------------------------------------------------------------------------- /src/i18n/en-US.js: -------------------------------------------------------------------------------- 1 | export default { 2 | lang: 'en-US', 3 | lang_name: 'English', 4 | tip: 'Tips', 5 | vote: 'vote', 6 | to_vote: 'Vote now', 7 | the_account_has_already_voted: 'The current account has already voted, you may modify the vote or execute redemption to revote. ', 8 | cancel: 'Cancel', 9 | confirm: 'Confirm', 10 | modify_voting: 'Modify Vote', 11 | producers_num_limit: 'Please choose only up to 30 Block Producer candidates', 12 | sort_type_default: 'Default', 13 | sort_type_ranking: 'Ranking', 14 | sort_type_location: 'Location', 15 | eos_vote: 'EOS Voting', 16 | progress: 'Progress', 17 | voted: 'Voted', 18 | staked: 'Staked', 19 | eos_price: 'EOS Price', 20 | rules: 'View Rules', 21 | votes: 'Votes', 22 | invalid_amount: 'Invalid Amount', 23 | amount_less_than_zero: 'Amount cannot less than 0', 24 | amount_must_than_zero: 'Your App version is old, must select "Add stake", and amount > 0', 25 | no_producer_selected: 'Please select Block Producer candidate', 26 | vote_failed: 'Voting Failed', 27 | vote_successful: 'Voting Succeeded', 28 | my_wallet: 'My Wallet', 29 | ongoing: 'Current Votes', 30 | unstaking: 'Refunding', 31 | unstake_successful: 'Refund success', 32 | balance: 'Balance', 33 | stakeable_balance: 'maximum stake able', 34 | successful: 'Success', 35 | vote_for: 'Vote for', 36 | unstake: 'Refund', 37 | unstake_to_your_account: 'Cancel vote to refund full amount of EOS, the EOS will be received after 72 hours. will keep about 0.5 EOS in staked for the resource consumption of the refund action.', 38 | no_search_data: 'No Data', 39 | added: 'Added', 40 | canceled: 'Cancelled', 41 | search: 'Search', 42 | detail: 'Details', 43 | votes_weight: 'Votes', 44 | basic_information: 'Basic Information', 45 | website: 'Website', 46 | vote_now: 'Vote Now', 47 | unadd: 'Added', 48 | add: 'Add', 49 | please_input_locked_amount: 'Please input amount', 50 | allow_increase_votes: 'Increase voting amount allowed', 51 | reselected_bp_will_overwrite_the_previously_selected: 'Reselect Block Producer candidate will overwrite previously selected candidates', 52 | will_use_the_currently_locked_amount: 'Current staked amount will be used for voting', 53 | if_failed_please_vote_again: 'Please revote if the voting has failed, the balance in the wallet will not be deducted', 54 | voted_info: 'Voted', 55 | location: 'Location', 56 | node_location: 'Node Location', 57 | team_introduce: 'Team Introduce', 58 | contact: 'Contact', 59 | recommend: 'AD', 60 | partner: 'partner_en', 61 | total_stake_not_enough: `total stake amount is not enough (15%), can't unstake now.`, 62 | switch_wallet: 'is invalid, please switch to EOS wallet first.', 63 | no_votes: `You havn't voted yet.`, 64 | bp_loading: 'loading...', 65 | add_stake: 'Add stake', 66 | balance_not_enough: 'balance not enough', 67 | must_staked_first: 'you must stake some EOS first', 68 | net_not_enough: 'staked net not enough, can\'t refund.', 69 | cpu_not_enough: 'staked cpu not enough, can\'t refund.', 70 | select_cpu_and_net: 'drag to choose unstake amount', 71 | understood: 'understood', 72 | event_title: 'EOS Mainnet failure caused block production suspended and wallet related functions not works', 73 | event_p1: `According to EOS community news, block production has been suspended since 09: 56 ( UTC ) on June 16. due to the problem introduced by the newly released version 1.0.4, EOS's current super node has held a meeting to locate and find solutions. it is estimated that it will take 3 - 6 hours to repair the problem.`, 74 | event_p2: 'Therefore, at present, the EOS wallet transfer and voting functions of imToken 2.0 RC International edition are temporarily unavailable. it is necessary to wait for the community to repair the related problems. the users will be informed of the EOS follow-up situation in a timely manner.', 75 | } 76 | -------------------------------------------------------------------------------- /src/i18n/index.js: -------------------------------------------------------------------------------- 1 | import queryString from 'query-string' 2 | import zh from './zh-CN' 3 | import en from './en-US' 4 | 5 | export function getCurrentLanguage() { 6 | const queryLocale = queryString.parse(window.location.search).locale 7 | if (queryLocale) { 8 | localStorage.setItem('locale', queryLocale) 9 | } 10 | 11 | const localeLanguage = queryLocale || localStorage.getItem('locale') 12 | const currentLanguage = localeLanguage || window.navigator.language.split('-')[0] || 'en' 13 | return /zh/.test(currentLanguage) ? 'zh' : 'en' 14 | } 15 | 16 | export default getCurrentLanguage() === 'zh' ? zh : en 17 | -------------------------------------------------------------------------------- /src/i18n/zh-CN.js: -------------------------------------------------------------------------------- 1 | export default { 2 | lang: 'zh-CN', 3 | lang_name: '中文', 4 | tip: '提示', 5 | vote: '投票', 6 | to_vote: '去投票', 7 | the_account_has_already_voted: '检测到当前账户已投过票,你可以选择修改投票方案,或者进入账户详情里赎回投票后重投。', 8 | cancel: '取消', 9 | confirm: '确定', 10 | modify_voting: '修改投票', 11 | producers_num_limit: '最多添加 30 个节点', 12 | sort_type_default: '默认', 13 | sort_type_ranking: '排名', 14 | sort_type_location: '区域', 15 | eos_vote: 'EOS 投票', 16 | progress: '进度', 17 | voted: '已投', 18 | staked: '已抵押', 19 | eos_price: 'EOS Price', 20 | rules: '查看规则', 21 | votes: '票', 22 | invalid_amount: '输入金额不合法', 23 | amount_less_than_zero: '请输入一个大于等于 0 的金额', 24 | amount_must_than_zero: '你的版本较低,必须 "新增抵押" 大于 0 的金额', 25 | no_producer_selected: '请先选择要投的节点', 26 | vote_failed: '投票失败', 27 | vote_successful: '投票成功', 28 | my_wallet: '我的钱包', 29 | ongoing: '当前投票', 30 | unstaking: '赎回中', 31 | unstake_successful: '赎回成功', 32 | balance: '余额', 33 | stakeable_balance: '最大可抵押', 34 | successful: '成功', 35 | vote_for: '投给', 36 | unstake: '赎回', 37 | unstake_to_your_account: '撤消投票后并赎回所有 EOS,这些 EOS将在 72 小时候后回到你当前账户。将会保留大约 0.5 EOS 在抵押中,作为之后赎回操作的资源消耗。', 38 | no_search_data: '没找到相关候选节点', 39 | added: '已添加', 40 | canceled: '已取消', 41 | search: '搜索', 42 | detail: '详情', 43 | votes_weight: '票数', 44 | basic_information: '基本信息', 45 | website: '官网', 46 | vote_now: '直接投票', 47 | unadd: '已添加', 48 | add: '添加', 49 | please_input_locked_amount: '请输入抵押金额', 50 | allow_increase_votes: '修改投票允许增加投票金额', 51 | reselected_bp_will_overwrite_the_previously_selected: '重新选择的节点将覆盖之前选择的节点', 52 | will_use_the_currently_locked_amount: '每次投票将使用当前抵押的金额', 53 | if_failed_please_vote_again: '若投票失败,请重新投票,钱包内金额不会被扣除', 54 | voted_info: '已有投票', 55 | location: '位置', 56 | node_location: '节点位置', 57 | team_introduce: '团队介绍', 58 | contact: '联系方式', 59 | recommend: '推广', 60 | partner: 'partner_zh', 61 | total_stake_not_enough: '投票总进度未达到 15%, 暂时不能赎回', 62 | switch_wallet: '不正确,请先切换到 EOS 钱包', 63 | no_votes: '你还没有进行投票', 64 | bp_loading: '加载中...', 65 | add_stake: '新增抵押', 66 | balance_not_enough: '余额不够', 67 | must_staked_first: '必须先抵押一些 EOS 才可以投票', 68 | net_not_enough: '抵押的 net 资源不足,无法赎回', 69 | cpu_not_enough: '抵押的 cpu 资源不足,无法赎回', 70 | select_cpu_and_net: ' 拖动选择赎回的数量', 71 | understood: '知道了', 72 | event_title: 'EOS 主网故障导致出块暂停,钱包相关功能暂停使用', 73 | event_p1: '据 EOS 社区消息,6月16日 09:56 (UTC)起出现出块暂停现象,故障由于新发布的 1.0.4 版本引入的问题,EOS 目前的超级节点已开会定位及研究解决方案,预计需要3-6小时修复该问题。', 74 | event_p2: '因此目前 imToken 2.0 RC 国际版的 EOS 钱包转账、投票等功能暂无法使用,需要等待社区修复相关问题,EOS 后续情况会及时告知用户。', 75 | } 76 | -------------------------------------------------------------------------------- /src/icon/backWhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consenlabs/eos-stake-vote-dapp/ce7639d9f0c0000099214658bf4419ed2fbe2dd4/src/icon/backWhite.png -------------------------------------------------------------------------------- /src/icon/backWhite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consenlabs/eos-stake-vote-dapp/ce7639d9f0c0000099214658bf4419ed2fbe2dd4/src/icon/backWhite@2x.png -------------------------------------------------------------------------------- /src/icon/backWhite@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consenlabs/eos-stake-vote-dapp/ce7639d9f0c0000099214658bf4419ed2fbe2dd4/src/icon/backWhite@3x.png -------------------------------------------------------------------------------- /src/icon/checked.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/icon/partner-ch@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consenlabs/eos-stake-vote-dapp/ce7639d9f0c0000099214658bf4419ed2fbe2dd4/src/icon/partner-ch@3x.png -------------------------------------------------------------------------------- /src/icon/partner-en@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consenlabs/eos-stake-vote-dapp/ce7639d9f0c0000099214658bf4419ed2fbe2dd4/src/icon/partner-en@3x.png -------------------------------------------------------------------------------- /src/icon/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icon/uncheck.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icon/vote-box.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/icon/wallet-eos.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | html, body, :global(#root) { 2 | height: 100%; 3 | margin: 0; 4 | padding: 0; 5 | font-family: sans-serif; 6 | position: relative; 7 | overflow-x: hidden; 8 | -webkit-overflow-scrolling: touch; 9 | } 10 | 11 | body { 12 | box-sizing: border-box; 13 | font-weight: 300; 14 | user-select: initial; 15 | background-color: #fff; 16 | color: #11293b; 17 | } 18 | 19 | ul, ol { 20 | padding: 0; 21 | margin: 0; 22 | } 23 | 24 | li { 25 | list-style-type: none; 26 | } 27 | 28 | h2, 29 | h3 { 30 | font-weight: normal; 31 | color: #11293b; 32 | letter-spacing: normal; 33 | margin: 0; 34 | } 35 | 36 | p { 37 | font-size: 14px; 38 | color: #7e8890; 39 | word-wrap: break-word; 40 | word-break: normal; 41 | } 42 | 43 | a { 44 | color: #249cb3; 45 | text-decoration: none; 46 | } 47 | 48 | strong, 49 | b { 50 | color: #11293b; 51 | } 52 | 53 | * { 54 | box-sizing: border-box; 55 | } 56 | 57 | input { 58 | padding: 0; 59 | border: 0; 60 | border: none; 61 | box-shadow: none; 62 | outline: none; 63 | -webkit-appearance: none; 64 | } 65 | 66 | div.rmc-list-view-scrollview-content { 67 | position: static !important; 68 | } 69 | 70 | 71 | ::placeholder { 72 | color: #d5dce0; 73 | } 74 | 75 | 76 | -------------------------------------------------------------------------------- /src/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | StakeVote 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import dva from 'dva' 2 | import createHistory from 'history/createBrowserHistory' 3 | import './components/Common/Toast/index.css' 4 | import './index.css' 5 | import model from './model' 6 | 7 | // 1. Initialize 8 | const app = dva({ 9 | history: createHistory(), 10 | }) 11 | 12 | // 2. Plugins 13 | // app.use({}) 14 | 15 | // 3. Model 16 | // app.model(require('./models/example').default) 17 | app.model(model) 18 | 19 | // 4. Router 20 | app.router(require('./router').default) 21 | 22 | // 5. Start 23 | app.start('#root') 24 | 25 | -------------------------------------------------------------------------------- /src/initApp.js: -------------------------------------------------------------------------------- 1 | import * as eosHelper from './utils/eosHelper' 2 | import { getEosMarketInfo } from './utils/eosMarketInfo' 3 | import { getProducers } from './utils/rpc' 4 | import { updateAccountInfoAndBalance } from './utils/updateAccountInfoAndBalance' 5 | import { updateGlobalState } from './utils/updateGlobalState' 6 | import Toast from 'components/Common/Toast' 7 | import i18n from 'i18n' 8 | import { __debug } from './utils/debug' 9 | 10 | const UPDATE_EVNET = 'appState/update' 11 | 12 | export default (props) => { 13 | //---------- for debug --------// 14 | __debug() 15 | //---------- for debug end --------// 16 | 17 | if (window.imToken) { 18 | // boot your application 19 | initApp(props) 20 | } else { 21 | window.addEventListener('sdkReady', () => { 22 | initApp(props) 23 | }) 24 | } 25 | } 26 | 27 | let inited = false 28 | 29 | function initApp(props) { 30 | if (inited) return false 31 | inited = true 32 | 33 | const { dispatch } = props 34 | const provider = window.imToken.eosProvider 35 | const accountName = window.imToken.eosAccountName 36 | const chainId = window.imToken.eosChainId || 'a60111025a4a7a3655c8deb0b5d8354d7198a918370610ccfea444c6d1edeef0' 37 | 38 | if (!accountName) { 39 | return Toast.show(`account name ${i18n.switch_wallet}`, 20) 40 | } 41 | 42 | dispatch({ 43 | type: UPDATE_EVNET, payload: { 44 | accountName: accountName 45 | } 46 | }) 47 | 48 | eosHelper.setProvider(provider, chainId) 49 | 50 | getProducers().then(producers => { 51 | dispatch({ type: UPDATE_EVNET, payload: { producers } }) 52 | }).catch(e => { 53 | Toast.show(`getProducers: ${e.message}`) 54 | }) 55 | 56 | getEosMarketInfo().then(info => { 57 | dispatch({ type: UPDATE_EVNET, payload: { eosPrice: Number(info.quotes.USDT.price).toFixed(2) } }) 58 | }).catch(e => { 59 | Toast.show(`getEosMarketInfo: ${e.message}`) 60 | }) 61 | 62 | updateAccountInfoAndBalance(accountName, dispatch).catch(e => { 63 | Toast.show(`getAccount: ${e.message}`) 64 | }) 65 | 66 | updateGlobalState(dispatch).catch(e => { 67 | Toast.show(`getGlobalState: ${e.message}`) 68 | }) 69 | } 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /src/model.js: -------------------------------------------------------------------------------- 1 | export default { 2 | namespace: 'appState', 3 | state: { 4 | accountName: '', 5 | totalActivatedStake: 0, 6 | totalProducerVoteWeight: 0, 7 | totalSupply: 900000000, 8 | maxSupply: 1000000000, 9 | eosPrice: 11.83, 10 | 11 | // producer sort 12 | sortType: 0, 13 | producers: [], 14 | selectedProducers: [], 15 | 16 | isVotedBefore: false, 17 | // Staked token amount 18 | staked: 0, 19 | // Token balance 20 | balance: 0, 21 | // Previous voted producers 22 | lastVotedProducerNames: [], 23 | // Previous vote time 24 | lastedVoteTime: 0, 25 | // Previous unstake timestamp 26 | lastUnstakeTime: 0, 27 | // Pending unstake amount 28 | unstaking: 0, 29 | // Current delegated resource 30 | delegatedStakeDetail: { 31 | stake_net_quantity: '0 EOS', 32 | stake_cpu_quantity: '0 EOS' 33 | }, 34 | cpu_limit: { 35 | available: 1, 36 | max: 1, 37 | used: 0, 38 | }, 39 | net_limit: { 40 | available: 1, 41 | max: 1, 42 | used: 0, 43 | }, 44 | refunds: [], 45 | }, 46 | reducers: { 47 | update(state, action) { 48 | return { ...state, ...action.payload } 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/router.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Router, Route, Switch } from 'dva/router' 3 | import Home from './components/Home' 4 | import Vote from './components/Vote' 5 | import Search from './components/Search' 6 | import Detail from './components/Detail' 7 | import Profile from './components/Profile' 8 | 9 | function RouterConfig({ history }) { 10 | return ( 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | ) 21 | } 22 | 23 | export default RouterConfig 24 | -------------------------------------------------------------------------------- /src/utils/calcVoteWeight.js: -------------------------------------------------------------------------------- 1 | export function calculateVoteWeight() { 2 | let timestamp_epoch = 946684800000 3 | let dates = (Date.now() / 1000) - (timestamp_epoch / 1000) 4 | let weight = (dates / (86400 * 7)) / 52 //86400 = seconds per day 24*3600 5 | return Math.pow(2, weight) 6 | } 7 | -------------------------------------------------------------------------------- /src/utils/checkVersion.js: -------------------------------------------------------------------------------- 1 | export function isOldVersion() { 2 | const agent = window.imToken && window.imToken.agent 3 | if (agent) { 4 | const matchs = agent.match(/(android|ios):((\d+)\.(\d+)\.(\d+)\.(\d+)):(\d+)/); 5 | if (matchs) { 6 | const os = matchs[1] 7 | const mainV = +matchs[3] 8 | const secondV = +matchs[4] 9 | const thirdV = +matchs[5] 10 | const buildV = +matchs[6] 11 | const codePushV = +matchs[7] 12 | 13 | // check version <= 2.0.1.179:1 14 | if (mainV === 2 && secondV === 0) { 15 | if (thirdV < 1) return true 16 | if (thirdV === 1) { 17 | if (buildV <= 179) { 18 | if (codePushV <= 1) return true 19 | } 20 | } 21 | } 22 | } 23 | } 24 | return false 25 | } 26 | -------------------------------------------------------------------------------- /src/utils/debug.js: -------------------------------------------------------------------------------- 1 | export function __debug() { 2 | if (/__debug/.test(window.location.search)) { 3 | window.imToken = {} 4 | window.imToken.eosAccountName = 'ge2tsmzzgene' 5 | window.imToken.eosProvider = 'https://api1-imtoken.eosasia.one' 6 | window.imToken.callAPI = (apiName, params, cb) => { 7 | // cb(null, true) 8 | cb && cb({ message: "It's a vote message" }, true) 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/utils/eosAmountToStake.js: -------------------------------------------------------------------------------- 1 | import { BigNumber } from 'bignumber.js' 2 | 3 | export function amountToStake(amount) { 4 | const pow = 10000 5 | const powAmount = amount * pow 6 | const half = Math.floor(powAmount / 2) 7 | const net = BigNumber(half).dividedBy(pow).toNumber() 8 | const cpu = BigNumber(half + (powAmount % 2)).dividedBy(pow).toNumber() 9 | return { 10 | stake_net_quantity: net.toFixed(4), 11 | stake_cpu_quantity: cpu.toFixed(4), 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/utils/eosHelper.js: -------------------------------------------------------------------------------- 1 | import Eos from 'eosjs' 2 | import { isOldVersion } from 'utils/checkVersion' 3 | 4 | /** 5 | * 6 | * @param {string} provider 7 | */ 8 | export function setProvider(provider, chainId) { 9 | const eos = Eos({ 10 | httpEndpoint: provider, 11 | broadcast: false, 12 | sign: false, 13 | expireInSeconds: 180, 14 | chainId: chainId, 15 | }) 16 | window.eos = eos 17 | return eos 18 | } 19 | 20 | /** 21 | * Fetch account balance 22 | * https://github.com/EOSIO/eosjs-api/blob/master/src/api/v1/chain.json#L2 23 | * @param {string} accountName 24 | */ 25 | export function getBalance(accountName) { 26 | return window.eos.getCurrencyBalance('eosio.token', accountName, 'EOS').then(res => { 27 | if (res.length > 0) { 28 | return parseFloat(res[0]) 29 | } else { 30 | return 0 31 | } 32 | }) 33 | } 34 | 35 | /** 36 | * Fetch eos global info 37 | * https://github.com/EOSIO/eosjs-api/blob/master/src/api/v1/chain.json#L43 38 | * 39 | *{ 40 | "server_version" : "string", 41 | "head_block_num" : "uint32", 42 | "last_irreversible_block_num" : "uint32", 43 | "last_irreversible_block_id" : "block_id", 44 | "head_block_id" : "block_id", 45 | "head_block_time" : "time_point_sec", 46 | "head_block_producer" : "account_name", 47 | "virtual_block_cpu_limit" : "uint64", 48 | "virtual_block_net_limit" : "uint64", 49 | "block_cpu_limit" : "uint64", 50 | "block_net_limit" : "uint64" 51 | } 52 | * } 53 | */ 54 | export function getChainInfo() { 55 | return window.eos.getInfo({}).then(result => { 56 | return result 57 | }) 58 | } 59 | 60 | /** 61 | * Stake token and vote 62 | * @param {string} accountName 63 | * @param {Array} producers 64 | * @param {number} stake_net_quantity 65 | * @param {number} stake_cpu_quantity 66 | * @param {function} cb 67 | */ 68 | export function delegatebwAndVote(accountName, producers, stake_net_quantity, stake_cpu_quantity, onlyVoteProducer, cb) { 69 | if (isOldVersion()) { 70 | return __old_delegatebwAndVote(accountName, producers, stake_net_quantity, stake_cpu_quantity, cb) 71 | } 72 | 73 | const payload = { 74 | // pay info for preview display 75 | payinfo: { 76 | from: accountName, 77 | to: accountName, 78 | amount: onlyVoteProducer ? 0 : Number(stake_net_quantity) + Number(stake_cpu_quantity), 79 | orderInfo: 'EOS Vote' 80 | } 81 | } 82 | 83 | // vote 84 | 85 | // sort by character's Unicode code point value 86 | const sortedProducers = producers.sort() 87 | payload.actions = [ 88 | { 89 | name: 'voteproducer', 90 | params: [accountName, '', sortedProducers] 91 | } 92 | ] 93 | 94 | // add delegatebw 95 | if (!onlyVoteProducer) { 96 | payload.actions.unshift({ 97 | name: 'delegatebw', 98 | params: [{ 99 | from: accountName, 100 | receiver: accountName, 101 | stake_net_quantity: `${stake_net_quantity} EOS`, 102 | stake_cpu_quantity: `${stake_cpu_quantity} EOS`, 103 | transfer: 0, 104 | memo: 'vote by imToken', 105 | }] 106 | }) 107 | } 108 | 109 | window.imToken.callAPI('eos.transactions', payload, cb) 110 | } 111 | 112 | /** 113 | * Unstake tokens from CPU and bandwidth 114 | * @param {*} accountName 115 | * @param {*} stake_net_quantity 116 | * @param {*} stake_cpu_quantity 117 | * @param {*} cb 118 | */ 119 | export function undelegatebw(accountName, stake_net_quantity, stake_cpu_quantity, cb) { 120 | 121 | if (isOldVersion()) { 122 | return __old_undelegatebw(accountName, stake_net_quantity, stake_cpu_quantity, cb) 123 | } 124 | 125 | const payload = { 126 | // pay info for preview display 127 | payinfo: { 128 | from: accountName, 129 | to: accountName, 130 | amount: '0', 131 | orderInfo: 'EOS Unstake' 132 | }, 133 | // undelegatebw action 134 | actions: [ 135 | { 136 | name: 'undelegatebw', 137 | params: [{ 138 | from: accountName, 139 | receiver: accountName, 140 | unstake_net_quantity: `${stake_net_quantity} EOS`, 141 | unstake_cpu_quantity: `${stake_cpu_quantity} EOS`, 142 | }] 143 | } 144 | ] 145 | } 146 | 147 | window.imToken.callAPI('eos.transactions', payload, cb) 148 | } 149 | 150 | /** 151 | * https://github.com/EOSIO/eosjs-api/blob/master/src/api/v1/chain.json#L72 152 | * 153 | * @param {string} accountName 154 | * 155 | * { 156 | "account_name": "name", 157 | "privileged": "bool", 158 | "last_code_update": "time_point", 159 | "created": "time_point", 160 | "ram_quota": "int64", 161 | "net_weight": "6000020000", 162 | "cpu_weight": 10000, 163 | "net_limit": "int64", 164 | "cpu_limit": {used: 109949, available: 6829567, max: 6939516}, 165 | "ram_usage": "int64", 166 | "permissions": "vector", 167 | "total_resources": "variant", 168 | "delegated_bandwidth": { 169 | from: 'account_name', 170 | to: 'account_name', 171 | net_weight: '1200000000 SYS', 172 | cpu_weight: '0 SYS', 173 | 174 | }, 175 | "voter_info": { // https://github.com/EOSIO/eos/blob/8d111c45a47c4f528946d87f09ae9e18ae0f9a4d/contracts/eosio.system/eosio.system.hpp#L94 176 | owner: 'account_name', 177 | producers: ['aaaaaa', 'eosio'], 178 | staked: '1200000000', // 抵押中的 EOS, 没有 unit 179 | last_vote_weight: 'double', // 上次投票的 weight 180 | deferred_trx_id: 'uint32_t', // 赎回的 txid 181 | last_unstake_time: 'time', // 赎回时间 182 | unstaking: '0.0000 SYS' // 赎回中, 183 | } 184 | } 185 | * 186 | */ 187 | export function getAccountInfo(accountName) { 188 | return window.eos.getAccount(accountName) 189 | } 190 | 191 | /** 192 | * https://github.com/EOSIO/eosjs-api/blob/master/src/api/v1/chain.json#L21 193 | { 194 | last_claim_time : 0 195 | last_produced_block_time : 1161254627 196 | location : 0 197 | owner : "eoslaomao" 198 | producer_key : "EOS7ptfJfcHJQSU7vRbXBp96iANqtERMJznCeL7ZuKS9ThTvUNFHj" 199 | time_became_active : 1160639139 200 | total_votes : "587152805648837760.00000000000000000" 201 | unpaid_blocks : 64740 202 | url : "eoslaomao.com" 203 | } 204 | */ 205 | export function getProducers() { 206 | return window.eos.getProducers({ 207 | json: true, 208 | }).then(res => { 209 | return res.rows 210 | }).catch(e => { 211 | document.title = e.toString() 212 | }) 213 | } 214 | 215 | /** 216 | * Fetch refund list 217 | * @param {string} accountName 218 | */ 219 | export function getRefund(accountName) { 220 | return window.eos.getTableRows({ 221 | json: true, 222 | code: 'eosio', 223 | scope: accountName, 224 | table: 'refunds' 225 | }) 226 | } 227 | 228 | /** 229 | * 230 | * { 231 | "rows": [ 232 | { 233 | "max_block_net_usage": 1048576, 234 | "target_block_net_usage_pct": 1000, 235 | "max_transaction_net_usage": 524288, 236 | "base_per_transaction_net_usage": 12, 237 | "net_usage_leeway": 500, 238 | "context_free_discount_net_usage_num": 20, 239 | "context_free_discount_net_usage_den": 100, 240 | "max_block_cpu_usage": 200000, 241 | "target_block_cpu_usage_pct": 1000, 242 | "max_transaction_cpu_usage": 150000, 243 | "min_transaction_cpu_usage": 100, 244 | "max_transaction_lifetime": 3600, 245 | "deferred_trx_expiration_window": 600, 246 | "max_transaction_delay": 3888000, 247 | "max_inline_action_size": 4096, 248 | "max_inline_action_depth": 4, 249 | "max_authority_depth": 6, 250 | "max_ram_size": "68719476736", 251 | "total_ram_bytes_reserved": 1394748772, 252 | "total_ram_stake": 207197548, 253 | "last_producer_schedule_update": "2000-01-01T00:00:00.000", 254 | "last_pervote_bucket_fill": 0, 255 | "pervote_bucket": 0, 256 | "perblock_bucket": 0, 257 | "total_unpaid_blocks": 0, 258 | "total_activated_stake": "360514493788", 259 | "thresh_activated_stake_time": 0, 260 | "last_producer_schedule_size": 0, 261 | "total_producer_vote_weight": "1053189458552399104.00000000000000000", 262 | "last_name_close": "2000-01-01T00:00:00.000" 263 | } 264 | ], 265 | "more": false 266 | } 267 | */ 268 | export function getGlobal() { 269 | return window.eos.getTableRows(true, 'eosio', 'eosio', 'global').then(res => { 270 | return res && res.rows && res.rows[0] 271 | }) 272 | } 273 | 274 | // ----------------------------- for old code --------------------------------- 275 | 276 | /** 277 | * Stake tokens for bandwidth and/or CPU and optionally transfer 278 | * @param {string} accountName 279 | * @param {Array} producers 280 | * @param {number} stake_net_quantity 281 | * @param {number} stake_cpu_quantity 282 | * @param {function} cb 283 | */ 284 | export function __old_delegatebwAndVote(accountName, producers, stake_net_quantity, stake_cpu_quantity, cb) { 285 | // sort by character's Unicode code point value 286 | const sortedProducers = producers.sort() 287 | 288 | const payload = [ 289 | { 290 | name: 'delegatebw', 291 | params: [{ 292 | from: accountName, 293 | receiver: accountName, 294 | stake_net_quantity: `${stake_net_quantity} EOS`, 295 | stake_cpu_quantity: `${stake_cpu_quantity} EOS`, 296 | transfer: 0, 297 | memo: 'vote from imToken', 298 | }] 299 | }, { 300 | name: 'voteproducer', 301 | params: [accountName, '', sortedProducers] 302 | } 303 | ] 304 | 305 | window.imToken.callAPI('eos.delegatebwAndVote', payload, cb) 306 | } 307 | 308 | /** 309 | * Unstake tokens from CPU and bandwidth 310 | * @param {*} accountName 311 | * @param {*} stake_net_quantity 312 | * @param {*} stake_cpu_quantity 313 | * @param {*} cb 314 | */ 315 | export function __old_undelegatebw(accountName, stake_net_quantity, stake_cpu_quantity, cb) { 316 | const payload = [ 317 | { 318 | name: 'undelegatebw', 319 | params: [{ 320 | from: accountName, 321 | receiver: accountName, 322 | unstake_net_quantity: `${stake_net_quantity} EOS`, 323 | unstake_cpu_quantity: `${stake_cpu_quantity} EOS`, 324 | }] 325 | } 326 | ] 327 | 328 | window.imToken.callAPI('eos.undelegatebw', payload, cb) 329 | } 330 | 331 | 332 | 333 | -------------------------------------------------------------------------------- /src/utils/eosMarketInfo.js: -------------------------------------------------------------------------------- 1 | /** 2 | * { 3 | "id": 1765, 4 | "name": "EOS", 5 | "symbol": "EOS", 6 | "website_slug": "eos", 7 | "rank": 5, 8 | "circulating_supply": 878817071.0, 9 | "total_supply": 900000000.0, 10 | "max_supply": 1000000000.0, 11 | "quotes": { 12 | "USDT": { 13 | "price": 11.835041336, 14 | "volume_24h": 2086027279.727989, 15 | "market_cap": 10402386309.0, 16 | "percent_change_1h": -2.62, 17 | "percent_change_24h": 8.39, 18 | "percent_change_7d": -6.24 19 | }, 20 | "USD": { 21 | "price": 12.124, 22 | "volume_24h": 2189740000.0, 23 | "market_cap": 10654778167.0, 24 | "percent_change_1h": 0.14, 25 | "percent_change_24h": 11.93, 26 | "percent_change_7d": -3.96 27 | } 28 | }, 29 | "last_updated": 1527239652 30 | }, 31 | */ 32 | 33 | export function getEosMarketInfo() { 34 | const url = 'https://api.coinmarketcap.com/v2/ticker/1765/?convert=USDT' 35 | return fetch(url).then(res => res.json()).then(result => { 36 | return result.data 37 | }) 38 | } 39 | -------------------------------------------------------------------------------- /src/utils/rpc.js: -------------------------------------------------------------------------------- 1 | import i18n from 'i18n' 2 | 3 | async function _getProducers(rpcUrl) { 4 | const locale = i18n.lang 5 | 6 | return fetch(rpcUrl, { 7 | body: JSON.stringify({ 8 | jsonrpc: "2.0", 9 | method: "blockProducers.getList", 10 | params: [] 11 | }), 12 | headers: { 13 | 'X-LOCALE': locale, 14 | }, 15 | method: 'POST', 16 | }).then(res => res.json()) 17 | .then(res => res.result) 18 | } 19 | 20 | function getRpcURL() { 21 | return window.imToken.eosBpListUrl 22 | } 23 | 24 | export async function getProducers() { 25 | const rpcUrl = getRpcURL() 26 | 27 | return _getProducers(rpcUrl).then(res => { 28 | 29 | const sortByVoteRows = res.slice(0).sort((a, b) => { 30 | return parseFloat(a.meta.totalVotes) - parseFloat(b.meta.totalVotes) > 0 ? -1 : 1 31 | }) 32 | 33 | return res.map(item => { 34 | item.id = item.meta.owner 35 | const index = sortByVoteRows.findIndex((el) => { 36 | return el.meta.owner === item.meta.owner 37 | }) 38 | item.votesOrder = index >= 0 ? index + 1 : 'None' 39 | return item 40 | }) 41 | }) 42 | } 43 | 44 | export async function reportPV(accountName) { 45 | const rpcUrl = getRpcURL() 46 | 47 | const locale = i18n.lang 48 | 49 | return fetch(rpcUrl, { 50 | body: JSON.stringify({ 51 | jsonrpc: "2.0", 52 | method: "blockProducers.statisticPageView", 53 | params: [{ account_name: accountName }] 54 | }), 55 | headers: { 56 | 'X-LOCALE': locale, 57 | }, 58 | method: 'POST', 59 | }).then(res => res.json()) 60 | .then(res => res.result) 61 | } 62 | 63 | -------------------------------------------------------------------------------- /src/utils/tracker.js: -------------------------------------------------------------------------------- 1 | const tracker = { 2 | track: (event, options) => { 3 | console.log(event, options) 4 | }, 5 | } 6 | 7 | export default tracker 8 | -------------------------------------------------------------------------------- /src/utils/updateAccountInfoAndBalance.js: -------------------------------------------------------------------------------- 1 | import * as eosHelper from './eosHelper' 2 | import { BigNumber } from 'bignumber.js'; 3 | const UPDATE_EVNET = 'appState/update' 4 | 5 | export function updateAccountInfoAndBalance(accountName, dispatch) { 6 | const req1 = eosHelper.getBalance(accountName).then(balance => { 7 | dispatch({ type: UPDATE_EVNET, payload: { balance } }) 8 | }) 9 | 10 | const req2 = eosHelper.getAccountInfo(accountName).then(account => { 11 | const voteInfo = account.voter_info || {} 12 | // document.body.innerHTML = JSON.stringify(account.voter_info) 13 | 14 | let stakeObject = { 15 | stake_net_quantity: 0, 16 | stake_cpu_quantity: 0, 17 | } 18 | 19 | if (account.self_delegated_bandwidth) { 20 | stakeObject = { 21 | stake_net_quantity: parseFloat(account.self_delegated_bandwidth.net_weight || 0), 22 | stake_cpu_quantity: parseFloat(account.self_delegated_bandwidth.cpu_weight || 0), 23 | } 24 | } 25 | 26 | const staked = BigNumber(stakeObject.stake_net_quantity).plus(stakeObject.stake_cpu_quantity).toNumber() 27 | 28 | dispatch({ 29 | type: UPDATE_EVNET, payload: { 30 | // isVotedBefore: voteInfo.producers && voteInfo.producers.length > 0, 31 | // Treat refund as not vote before 32 | cpuLimit: account.cpu_limit, 33 | netLimit: account.net_limit, 34 | isVotedBefore: voteInfo.producers && voteInfo.producers.length, 35 | lastedVoteTime: localStorage.getItem('lastedVoteTime') || 0, 36 | staked: staked, 37 | lastVotedProducerNames: voteInfo.producers || [], 38 | lastUnstakeTime: voteInfo.last_unstake_time, 39 | unstaking: voteInfo.unstaking, 40 | delegatedStakeDetail: stakeObject, 41 | } 42 | }) 43 | }) 44 | 45 | const req3 = eosHelper.getRefund(accountName).then(res => { 46 | if (res && res.rows && res.rows.length) { 47 | dispatch({ 48 | type: UPDATE_EVNET, 49 | payload: { 50 | refunds: res.rows, 51 | } 52 | }) 53 | } 54 | }) 55 | 56 | return Promise.all([req1, req2, req3]) 57 | } 58 | -------------------------------------------------------------------------------- /src/utils/updateGlobalState.js: -------------------------------------------------------------------------------- 1 | import * as eosHelper from './eosHelper' 2 | const UPDATE_EVNET = 'appState/update' 3 | 4 | export function updateGlobalState(dispatch) { 5 | return eosHelper.getGlobal().then(result => { 6 | dispatch({ 7 | type: UPDATE_EVNET, payload: { 8 | totalActivatedStake: result.total_activated_stake, 9 | totalProducerVoteWeight: result.total_producer_vote_weight 10 | } 11 | }) 12 | }) 13 | } 14 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.5.5" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" 8 | integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== 9 | dependencies: 10 | "@babel/highlight" "^7.0.0" 11 | 12 | "@babel/highlight@^7.0.0": 13 | version "7.5.0" 14 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" 15 | integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== 16 | dependencies: 17 | chalk "^2.0.0" 18 | esutils "^2.0.2" 19 | js-tokens "^4.0.0" 20 | 21 | "@babel/runtime@^7.0.0", "@babel/runtime@^7.4.5": 22 | version "7.5.5" 23 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" 24 | integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== 25 | dependencies: 26 | regenerator-runtime "^0.13.2" 27 | 28 | "@types/history@*": 29 | version "4.6.2" 30 | resolved "https://registry.npmjs.org/@types/history/-/history-4.6.2.tgz#12cfaba693ba20f114ed5765467ff25fdf67ddb0" 31 | 32 | "@types/hoist-non-react-statics@^3.3.0": 33 | version "3.3.1" 34 | resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" 35 | integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== 36 | dependencies: 37 | "@types/react" "*" 38 | hoist-non-react-statics "^3.3.0" 39 | 40 | "@types/isomorphic-fetch@^0.0.35": 41 | version "0.0.35" 42 | resolved "https://registry.yarnpkg.com/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.35.tgz#c1c0d402daac324582b6186b91f8905340ea3361" 43 | integrity sha512-DaZNUvLDCAnCTjgwxgiL1eQdxIKEpNLOlTNtAgnZc50bG2copGhRrFN9/PxPBuJe+tZVLCbQ7ls0xveXVRPkvw== 44 | 45 | "@types/react-redux@^7.1.0": 46 | version "7.1.2" 47 | resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.2.tgz#02303b77d87e54f327c09507cf80ee3ca3063898" 48 | integrity sha512-Iim6UCtD0mZX9U3jBuT6ZObBZ8UlakoOgefiRgi5wakfbNnXd3TUwwUMgi3Ijc0fxsPLZ5ULoz0oDy15YIaLmQ== 49 | dependencies: 50 | "@types/hoist-non-react-statics" "^3.3.0" 51 | "@types/react" "*" 52 | hoist-non-react-statics "^3.3.0" 53 | redux "^4.0.0" 54 | 55 | "@types/react-router-dom@^4.3.1": 56 | version "4.3.4" 57 | resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.3.4.tgz#63a7a8558129d2f4ff76e4bdd099bf4b98e25a0d" 58 | integrity sha512-xrwaWHpnxKk/TTRe7pmoGy3E4SyF/ojFqNfFJacw7OLdfLXRvGfk4r/XePVaZNVfeJzL8fcnNilPN7xOdJ/vGw== 59 | dependencies: 60 | "@types/history" "*" 61 | "@types/react" "*" 62 | "@types/react-router" "*" 63 | 64 | "@types/react-router@*": 65 | version "4.0.25" 66 | resolved "https://registry.npmjs.org/@types/react-router/-/react-router-4.0.25.tgz#1e25490780b80e0d8f96bf649379cca8638c1e5a" 67 | dependencies: 68 | "@types/history" "*" 69 | "@types/react" "*" 70 | 71 | "@types/react@*": 72 | version "16.3.14" 73 | resolved "https://registry.npmjs.org/@types/react/-/react-16.3.14.tgz#f90ac6834de172e13ecca430dcb6814744225d36" 74 | dependencies: 75 | csstype "^2.2.0" 76 | 77 | acorn-jsx@^5.0.0: 78 | version "5.0.1" 79 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" 80 | integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== 81 | 82 | acorn@^7.0.0: 83 | version "7.0.0" 84 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.0.0.tgz#26b8d1cd9a9b700350b71c0905546f64d1284e7a" 85 | integrity sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ== 86 | 87 | add-dom-event-listener@1.x: 88 | version "1.0.2" 89 | resolved "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz#8faed2c41008721cf111da1d30d995b85be42bed" 90 | dependencies: 91 | object-assign "4.x" 92 | 93 | ajv@^6.10.0, ajv@^6.10.2: 94 | version "6.10.2" 95 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" 96 | integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== 97 | dependencies: 98 | fast-deep-equal "^2.0.1" 99 | fast-json-stable-stringify "^2.0.0" 100 | json-schema-traverse "^0.4.1" 101 | uri-js "^4.2.2" 102 | 103 | ansi-escapes@^4.2.1: 104 | version "4.2.1" 105 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" 106 | integrity sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q== 107 | dependencies: 108 | type-fest "^0.5.2" 109 | 110 | ansi-regex@^4.1.0: 111 | version "4.1.0" 112 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 113 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 114 | 115 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 116 | version "3.2.1" 117 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 118 | dependencies: 119 | color-convert "^1.9.0" 120 | 121 | argparse@^1.0.7: 122 | version "1.0.10" 123 | resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 124 | dependencies: 125 | sprintf-js "~1.0.2" 126 | 127 | array-includes@^3.0.3: 128 | version "3.0.3" 129 | resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" 130 | dependencies: 131 | define-properties "^1.1.2" 132 | es-abstract "^1.7.0" 133 | 134 | asap@~2.0.3: 135 | version "2.0.6" 136 | resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 137 | 138 | astral-regex@^1.0.0: 139 | version "1.0.0" 140 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" 141 | integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== 142 | 143 | babel-polyfill@^6.26.0: 144 | version "6.26.0" 145 | resolved "http://registry.npm.taobao.org/babel-polyfill/download/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" 146 | dependencies: 147 | babel-runtime "^6.26.0" 148 | core-js "^2.5.0" 149 | regenerator-runtime "^0.10.5" 150 | 151 | babel-runtime@6.x, babel-runtime@^6.26.0: 152 | version "6.26.0" 153 | resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" 154 | dependencies: 155 | core-js "^2.4.0" 156 | regenerator-runtime "^0.11.0" 157 | 158 | balanced-match@^1.0.0: 159 | version "1.0.0" 160 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 161 | 162 | base-x@^3.0.2: 163 | version "3.0.4" 164 | resolved "http://registry.npm.taobao.org/base-x/download/base-x-3.0.4.tgz#94c1788736da065edb1d68808869e357c977fa77" 165 | dependencies: 166 | safe-buffer "^5.0.1" 167 | 168 | bigi@^1.1.0, bigi@^1.4.2: 169 | version "1.4.2" 170 | resolved "http://registry.npm.taobao.org/bigi/download/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825" 171 | 172 | bignumber.js@^7.2.1: 173 | version "7.2.1" 174 | resolved "http://registry.npm.taobao.org/bignumber.js/download/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" 175 | 176 | binaryen@^37.0.0: 177 | version "37.0.0" 178 | resolved "http://registry.npm.taobao.org/binaryen/download/binaryen-37.0.0.tgz#c392bc784b6d46da8fc918b1a4ed8257a0cd8b08" 179 | 180 | bn.js@^4.11.8: 181 | version "4.11.8" 182 | resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" 183 | 184 | brace-expansion@^1.1.7: 185 | version "1.1.11" 186 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 187 | dependencies: 188 | balanced-match "^1.0.0" 189 | concat-map "0.0.1" 190 | 191 | browserify-aes@^1.0.6: 192 | version "1.2.0" 193 | resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" 194 | dependencies: 195 | buffer-xor "^1.0.3" 196 | cipher-base "^1.0.0" 197 | create-hash "^1.1.0" 198 | evp_bytestokey "^1.0.3" 199 | inherits "^2.0.1" 200 | safe-buffer "^5.0.1" 201 | 202 | bs58@^4.0.1: 203 | version "4.0.1" 204 | resolved "http://registry.npm.taobao.org/bs58/download/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" 205 | dependencies: 206 | base-x "^3.0.2" 207 | 208 | buffer-xor@^1.0.3: 209 | version "1.0.3" 210 | resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" 211 | 212 | builtin-modules@^1.0.0: 213 | version "1.1.1" 214 | resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 215 | 216 | bytebuffer@^5.0.1: 217 | version "5.0.1" 218 | resolved "http://registry.npm.taobao.org/bytebuffer/download/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd" 219 | dependencies: 220 | long "~3" 221 | 222 | callsites@^3.0.0: 223 | version "3.1.0" 224 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 225 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 226 | 227 | camel-case@^3.0.0: 228 | version "3.0.0" 229 | resolved "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" 230 | dependencies: 231 | no-case "^2.2.0" 232 | upper-case "^1.1.1" 233 | 234 | chalk@^2.0.0, chalk@^2.1.0: 235 | version "2.4.1" 236 | resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 237 | dependencies: 238 | ansi-styles "^3.2.1" 239 | escape-string-regexp "^1.0.5" 240 | supports-color "^5.3.0" 241 | 242 | chalk@^2.4.2: 243 | version "2.4.2" 244 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 245 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 246 | dependencies: 247 | ansi-styles "^3.2.1" 248 | escape-string-regexp "^1.0.5" 249 | supports-color "^5.3.0" 250 | 251 | chardet@^0.7.0: 252 | version "0.7.0" 253 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 254 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 255 | 256 | cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: 257 | version "1.0.4" 258 | resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" 259 | dependencies: 260 | inherits "^2.0.1" 261 | safe-buffer "^5.0.1" 262 | 263 | classnames@2.x, classnames@^2.2.5: 264 | version "2.2.5" 265 | resolved "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" 266 | 267 | classnames@^2.2.6: 268 | version "2.2.6" 269 | resolved "http://registry.npm.taobao.org/classnames/download/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" 270 | 271 | cli-cursor@^3.1.0: 272 | version "3.1.0" 273 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 274 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 275 | dependencies: 276 | restore-cursor "^3.1.0" 277 | 278 | cli-width@^2.0.0: 279 | version "2.2.0" 280 | resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 281 | 282 | color-convert@^1.9.0: 283 | version "1.9.1" 284 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" 285 | dependencies: 286 | color-name "^1.1.1" 287 | 288 | color-name@^1.1.1: 289 | version "1.1.3" 290 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 291 | 292 | component-classes@^1.2.5: 293 | version "1.2.6" 294 | resolved "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz#c642394c3618a4d8b0b8919efccbbd930e5cd691" 295 | dependencies: 296 | component-indexof "0.0.3" 297 | 298 | component-indexof@0.0.3: 299 | version "0.0.3" 300 | resolved "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz#11d091312239eb8f32c8f25ae9cb002ffe8d3c24" 301 | 302 | concat-map@0.0.1: 303 | version "0.0.1" 304 | resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 305 | 306 | connected-react-router@^6.3.2: 307 | version "6.5.2" 308 | resolved "https://registry.yarnpkg.com/connected-react-router/-/connected-react-router-6.5.2.tgz#422af70f86cb276681e20ab4295cf27dd9b6c7e3" 309 | integrity sha512-qzsLPZCofSI80fwy+HgxtEgSGS4ndYUUZAWaw1dqaOGPLKX/FVwIOEb7q+hjHdnZ4v5pKZcNv5GG4urjujIoyA== 310 | dependencies: 311 | immutable "^3.8.1" 312 | prop-types "^15.7.2" 313 | seamless-immutable "^7.1.3" 314 | 315 | contains-path@^0.1.0: 316 | version "0.1.0" 317 | resolved "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 318 | 319 | core-js@^1.0.0: 320 | version "1.2.7" 321 | resolved "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" 322 | 323 | core-js@^2.4.0, core-js@^2.5.0: 324 | version "2.5.6" 325 | resolved "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz#0fe6d45bf3cac3ac364a9d72de7576f4eb221b9d" 326 | 327 | create-hash@^1.1.0, create-hash@^1.1.3: 328 | version "1.2.0" 329 | resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" 330 | dependencies: 331 | cipher-base "^1.0.1" 332 | inherits "^2.0.1" 333 | md5.js "^1.3.4" 334 | ripemd160 "^2.0.1" 335 | sha.js "^2.4.0" 336 | 337 | create-hmac@^1.1.6: 338 | version "1.1.7" 339 | resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" 340 | dependencies: 341 | cipher-base "^1.0.3" 342 | create-hash "^1.1.0" 343 | inherits "^2.0.1" 344 | ripemd160 "^2.0.0" 345 | safe-buffer "^5.0.1" 346 | sha.js "^2.4.8" 347 | 348 | cross-spawn@^6.0.5: 349 | version "6.0.5" 350 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 351 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 352 | dependencies: 353 | nice-try "^1.0.4" 354 | path-key "^2.0.1" 355 | semver "^5.5.0" 356 | shebang-command "^1.2.0" 357 | which "^1.2.9" 358 | 359 | css-animation@^1.3.2: 360 | version "1.4.1" 361 | resolved "https://registry.npmjs.org/css-animation/-/css-animation-1.4.1.tgz#5b8813125de0fbbbb0bbe1b472ae84221469b7a8" 362 | dependencies: 363 | babel-runtime "6.x" 364 | component-classes "^1.2.5" 365 | 366 | csstype@^2.2.0: 367 | version "2.5.2" 368 | resolved "https://registry.npmjs.org/csstype/-/csstype-2.5.2.tgz#4534308476ceede8fbe148b9b99f9baf1c80fa06" 369 | 370 | debounce@^1.1.0: 371 | version "1.1.0" 372 | resolved "http://registry.npm.taobao.org/debounce/download/debounce-1.1.0.tgz#6a1a4ee2a9dc4b7c24bb012558dbcdb05b37f408" 373 | 374 | debug@^2.6.8, debug@^2.6.9: 375 | version "2.6.9" 376 | resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 377 | dependencies: 378 | ms "2.0.0" 379 | 380 | debug@^4.0.1: 381 | version "4.1.1" 382 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 383 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 384 | dependencies: 385 | ms "^2.1.1" 386 | 387 | deep-is@~0.1.3: 388 | version "0.1.3" 389 | resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 390 | 391 | define-properties@^1.1.2: 392 | version "1.1.2" 393 | resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" 394 | dependencies: 395 | foreach "^2.0.5" 396 | object-keys "^1.0.8" 397 | 398 | define-properties@^1.1.3: 399 | version "1.1.3" 400 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 401 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 402 | dependencies: 403 | object-keys "^1.0.12" 404 | 405 | doctrine@1.5.0: 406 | version "1.5.0" 407 | resolved "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 408 | dependencies: 409 | esutils "^2.0.2" 410 | isarray "^1.0.0" 411 | 412 | doctrine@^2.1.0: 413 | version "2.1.0" 414 | resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 415 | dependencies: 416 | esutils "^2.0.2" 417 | 418 | doctrine@^3.0.0: 419 | version "3.0.0" 420 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 421 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 422 | dependencies: 423 | esutils "^2.0.2" 424 | 425 | dom-align@^1.7.0: 426 | version "1.7.0" 427 | resolved "http://registry.npm.taobao.org/dom-align/download/dom-align-1.7.0.tgz#95a8f91a8c6aaaef5908366c1c2c6271461bf2c3" 428 | 429 | dom-walk@^0.1.0: 430 | version "0.1.1" 431 | resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" 432 | 433 | dva-core@1.6.0-beta.6: 434 | version "1.6.0-beta.6" 435 | resolved "https://registry.yarnpkg.com/dva-core/-/dva-core-1.6.0-beta.6.tgz#4875fced90ef1a1f2f7e410df9061956219d09c6" 436 | integrity sha512-1+95rZE+4s5SxmzAxQyy06UhQ8DdpmGM+GmC0x0K4Ikh7HnuRReZUaqfB/UBSSlF+2orjwRwfYpOyouzJA76Qw== 437 | dependencies: 438 | "@babel/runtime" "^7.0.0" 439 | flatten "^1.0.2" 440 | global "^4.3.2" 441 | invariant "^2.2.1" 442 | is-plain-object "^2.0.3" 443 | redux-saga "^0.16.0" 444 | warning "^3.0.0" 445 | 446 | dva@^2.6.0-beta.12: 447 | version "2.6.0-beta.12" 448 | resolved "https://registry.yarnpkg.com/dva/-/dva-2.6.0-beta.12.tgz#a64b11781fa7b096e41dcf002dd06629a3910218" 449 | integrity sha512-O+XMeQWjhFxOIYyL4EGFUQ0zC3hBzACWN5y/U2ZAUxT0E5X8Zx+LZ23/cqgVGhFzZUfjjhYlOA2gPOaPvzeJlg== 450 | dependencies: 451 | "@babel/runtime" "^7.0.0" 452 | "@types/isomorphic-fetch" "^0.0.35" 453 | "@types/react-redux" "^7.1.0" 454 | "@types/react-router-dom" "^4.3.1" 455 | connected-react-router "^6.3.2" 456 | dva-core "1.6.0-beta.6" 457 | global "^4.3.2" 458 | history "^4.7.2" 459 | invariant "^2.2.4" 460 | isomorphic-fetch "^2.2.1" 461 | react-redux "^7.1.0" 462 | react-router-dom "^4.3.1" 463 | redux "^4.0.1" 464 | 465 | ecurve@^1.0.5: 466 | version "1.0.6" 467 | resolved "http://registry.npm.taobao.org/ecurve/download/ecurve-1.0.6.tgz#dfdabbb7149f8d8b78816be5a7d5b83fcf6de797" 468 | dependencies: 469 | bigi "^1.1.0" 470 | safe-buffer "^5.0.1" 471 | 472 | emoji-regex@^7.0.1: 473 | version "7.0.3" 474 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 475 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 476 | 477 | emoji-regex@^8.0.0: 478 | version "8.0.0" 479 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 480 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 481 | 482 | encoding@^0.1.11: 483 | version "0.1.12" 484 | resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 485 | dependencies: 486 | iconv-lite "~0.4.13" 487 | 488 | eosjs-api@6.1.3: 489 | version "6.1.3" 490 | resolved "http://registry.npm.taobao.org/eosjs-api/download/eosjs-api-6.1.3.tgz#a5f7d16ab688373729660b0cb72e107898fc02b6" 491 | dependencies: 492 | camel-case "^3.0.0" 493 | isomorphic-fetch "^2.2.1" 494 | 495 | eosjs-ecc@4.0.1: 496 | version "4.0.1" 497 | resolved "http://registry.npm.taobao.org/eosjs-ecc/download/eosjs-ecc-4.0.1.tgz#0a118000d3a78b9eab1432dd758f705810461adf" 498 | dependencies: 499 | bigi "^1.4.2" 500 | browserify-aes "^1.0.6" 501 | bs58 "^4.0.1" 502 | bytebuffer "^5.0.1" 503 | create-hash "^1.1.3" 504 | create-hmac "^1.1.6" 505 | ecurve "^1.0.5" 506 | randombytes "^2.0.5" 507 | 508 | eosjs@^14.1.0: 509 | version "14.1.0" 510 | resolved "http://registry.npm.taobao.org/eosjs/download/eosjs-14.1.0.tgz#b33db40ce8aca2b51a01b27938ecd53e2b926bfb" 511 | dependencies: 512 | babel-polyfill "^6.26.0" 513 | binaryen "^37.0.0" 514 | create-hash "^1.1.3" 515 | eosjs-api "6.1.3" 516 | eosjs-ecc "4.0.1" 517 | fcbuffer "2.2.0" 518 | 519 | error-ex@^1.2.0: 520 | version "1.3.1" 521 | resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 522 | dependencies: 523 | is-arrayish "^0.2.1" 524 | 525 | es-abstract@^1.11.0, es-abstract@^1.12.0: 526 | version "1.13.0" 527 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" 528 | integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== 529 | dependencies: 530 | es-to-primitive "^1.2.0" 531 | function-bind "^1.1.1" 532 | has "^1.0.3" 533 | is-callable "^1.1.4" 534 | is-regex "^1.0.4" 535 | object-keys "^1.0.12" 536 | 537 | es-abstract@^1.7.0: 538 | version "1.11.0" 539 | resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681" 540 | dependencies: 541 | es-to-primitive "^1.1.1" 542 | function-bind "^1.1.1" 543 | has "^1.0.1" 544 | is-callable "^1.1.3" 545 | is-regex "^1.0.4" 546 | 547 | es-to-primitive@^1.1.1: 548 | version "1.1.1" 549 | resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 550 | dependencies: 551 | is-callable "^1.1.1" 552 | is-date-object "^1.0.1" 553 | is-symbol "^1.0.1" 554 | 555 | es-to-primitive@^1.2.0: 556 | version "1.2.0" 557 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" 558 | integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== 559 | dependencies: 560 | is-callable "^1.1.4" 561 | is-date-object "^1.0.1" 562 | is-symbol "^1.0.2" 563 | 564 | escape-string-regexp@^1.0.5: 565 | version "1.0.5" 566 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 567 | 568 | eslint-config-standard@^14.0.0: 569 | version "14.0.0" 570 | resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.0.0.tgz#1de7bf5af37542dc6eef879ab7eb5e5e0f830747" 571 | integrity sha512-bV6e2LFvJEetrLjVAy4KWPOUsIhPWr040c649MigTPR6yUtaGuOt6CEAyNeez2lRiC+2+vjGWa02byjs25EB3A== 572 | 573 | eslint-import-resolver-node@^0.3.2: 574 | version "0.3.2" 575 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" 576 | integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== 577 | dependencies: 578 | debug "^2.6.9" 579 | resolve "^1.5.0" 580 | 581 | eslint-module-utils@^2.4.0: 582 | version "2.4.1" 583 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz#7b4675875bf96b0dbf1b21977456e5bb1f5e018c" 584 | integrity sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw== 585 | dependencies: 586 | debug "^2.6.8" 587 | pkg-dir "^2.0.0" 588 | 589 | eslint-plugin-es@^1.4.0: 590 | version "1.4.0" 591 | resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz#475f65bb20c993fc10e8c8fe77d1d60068072da6" 592 | integrity sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw== 593 | dependencies: 594 | eslint-utils "^1.3.0" 595 | regexpp "^2.0.1" 596 | 597 | eslint-plugin-import@^2.18.0: 598 | version "2.18.2" 599 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6" 600 | integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== 601 | dependencies: 602 | array-includes "^3.0.3" 603 | contains-path "^0.1.0" 604 | debug "^2.6.9" 605 | doctrine "1.5.0" 606 | eslint-import-resolver-node "^0.3.2" 607 | eslint-module-utils "^2.4.0" 608 | has "^1.0.3" 609 | minimatch "^3.0.4" 610 | object.values "^1.1.0" 611 | read-pkg-up "^2.0.0" 612 | resolve "^1.11.0" 613 | 614 | eslint-plugin-node@^9.0.1: 615 | version "9.1.0" 616 | resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.1.0.tgz#f2fd88509a31ec69db6e9606d76dabc5adc1b91a" 617 | integrity sha512-ZwQYGm6EoV2cfLpE1wxJWsfnKUIXfM/KM09/TlorkukgCAwmkgajEJnPCmyzoFPQQkmvo5DrW/nyKutNIw36Mw== 618 | dependencies: 619 | eslint-plugin-es "^1.4.0" 620 | eslint-utils "^1.3.1" 621 | ignore "^5.1.1" 622 | minimatch "^3.0.4" 623 | resolve "^1.10.1" 624 | semver "^6.1.0" 625 | 626 | eslint-plugin-promise@^4.2.0: 627 | version "4.2.1" 628 | resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" 629 | integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== 630 | 631 | eslint-plugin-react@^7.14.3: 632 | version "7.14.3" 633 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz#911030dd7e98ba49e1b2208599571846a66bdf13" 634 | integrity sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA== 635 | dependencies: 636 | array-includes "^3.0.3" 637 | doctrine "^2.1.0" 638 | has "^1.0.3" 639 | jsx-ast-utils "^2.1.0" 640 | object.entries "^1.1.0" 641 | object.fromentries "^2.0.0" 642 | object.values "^1.1.0" 643 | prop-types "^15.7.2" 644 | resolve "^1.10.1" 645 | 646 | eslint-plugin-standard@^4.0.0: 647 | version "4.0.1" 648 | resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4" 649 | integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ== 650 | 651 | eslint-scope@^5.0.0: 652 | version "5.0.0" 653 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" 654 | integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== 655 | dependencies: 656 | esrecurse "^4.1.0" 657 | estraverse "^4.1.1" 658 | 659 | eslint-utils@^1.3.0, eslint-utils@^1.3.1, eslint-utils@^1.4.0: 660 | version "1.4.0" 661 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.0.tgz#e2c3c8dba768425f897cf0f9e51fe2e241485d4c" 662 | integrity sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ== 663 | dependencies: 664 | eslint-visitor-keys "^1.0.0" 665 | 666 | eslint-visitor-keys@^1.0.0: 667 | version "1.0.0" 668 | resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 669 | 670 | eslint-visitor-keys@^1.1.0: 671 | version "1.1.0" 672 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" 673 | integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== 674 | 675 | eslint@^6.2.0: 676 | version "6.2.0" 677 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.2.0.tgz#4c42c20e3fc03f28db25f34ccba621a9a47e8b56" 678 | integrity sha512-sS0SZwm5UAoI83F+cgdomz0cBNPs+AnRvEboNYeWvrZ8UcDHCu/5muocwoDL2TkHq9skkP0GvZjmwI8HG7S3sw== 679 | dependencies: 680 | "@babel/code-frame" "^7.0.0" 681 | ajv "^6.10.0" 682 | chalk "^2.1.0" 683 | cross-spawn "^6.0.5" 684 | debug "^4.0.1" 685 | doctrine "^3.0.0" 686 | eslint-scope "^5.0.0" 687 | eslint-utils "^1.4.0" 688 | eslint-visitor-keys "^1.1.0" 689 | espree "^6.1.0" 690 | esquery "^1.0.1" 691 | esutils "^2.0.2" 692 | file-entry-cache "^5.0.1" 693 | functional-red-black-tree "^1.0.1" 694 | glob-parent "^5.0.0" 695 | globals "^11.7.0" 696 | ignore "^4.0.6" 697 | import-fresh "^3.0.0" 698 | imurmurhash "^0.1.4" 699 | inquirer "^6.4.1" 700 | is-glob "^4.0.0" 701 | js-yaml "^3.13.1" 702 | json-stable-stringify-without-jsonify "^1.0.1" 703 | levn "^0.3.0" 704 | lodash "^4.17.14" 705 | minimatch "^3.0.4" 706 | mkdirp "^0.5.1" 707 | natural-compare "^1.4.0" 708 | optionator "^0.8.2" 709 | progress "^2.0.0" 710 | regexpp "^2.0.1" 711 | semver "^6.1.2" 712 | strip-ansi "^5.2.0" 713 | strip-json-comments "^3.0.1" 714 | table "^5.2.3" 715 | text-table "^0.2.0" 716 | v8-compile-cache "^2.0.3" 717 | 718 | espree@^6.1.0: 719 | version "6.1.0" 720 | resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.0.tgz#a1e8aa65bf29a331d70351ed814a80e7534e0884" 721 | integrity sha512-boA7CHRLlVWUSg3iL5Kmlt/xT3Q+sXnKoRYYzj1YeM10A76TEJBbotV5pKbnK42hEUIr121zTv+QLRM5LsCPXQ== 722 | dependencies: 723 | acorn "^7.0.0" 724 | acorn-jsx "^5.0.0" 725 | eslint-visitor-keys "^1.1.0" 726 | 727 | esprima@^4.0.0: 728 | version "4.0.0" 729 | resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 730 | 731 | esquery@^1.0.1: 732 | version "1.0.1" 733 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 734 | integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== 735 | dependencies: 736 | estraverse "^4.0.0" 737 | 738 | esrecurse@^4.1.0: 739 | version "4.2.1" 740 | resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 741 | dependencies: 742 | estraverse "^4.1.0" 743 | 744 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: 745 | version "4.2.0" 746 | resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 747 | 748 | esutils@^2.0.2: 749 | version "2.0.2" 750 | resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 751 | 752 | evp_bytestokey@^1.0.3: 753 | version "1.0.3" 754 | resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" 755 | dependencies: 756 | md5.js "^1.3.4" 757 | safe-buffer "^5.1.1" 758 | 759 | exenv@^1.2.0: 760 | version "1.2.2" 761 | resolved "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" 762 | 763 | external-editor@^3.0.3: 764 | version "3.1.0" 765 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" 766 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 767 | dependencies: 768 | chardet "^0.7.0" 769 | iconv-lite "^0.4.24" 770 | tmp "^0.0.33" 771 | 772 | fast-deep-equal@^2.0.1: 773 | version "2.0.1" 774 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 775 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 776 | 777 | fast-json-stable-stringify@^2.0.0: 778 | version "2.0.0" 779 | resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 780 | 781 | fast-levenshtein@~2.0.4: 782 | version "2.0.6" 783 | resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 784 | 785 | fbjs@^0.8.16, fbjs@^0.8.3: 786 | version "0.8.16" 787 | resolved "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" 788 | dependencies: 789 | core-js "^1.0.0" 790 | isomorphic-fetch "^2.1.1" 791 | loose-envify "^1.0.0" 792 | object-assign "^4.1.0" 793 | promise "^7.1.1" 794 | setimmediate "^1.0.5" 795 | ua-parser-js "^0.7.9" 796 | 797 | fcbuffer@2.2.0: 798 | version "2.2.0" 799 | resolved "http://registry.npm.taobao.org/fcbuffer/download/fcbuffer-2.2.0.tgz#c85d01485f74bb917d87689a55890dba70fc1de3" 800 | dependencies: 801 | bn.js "^4.11.8" 802 | bytebuffer "^5.0.1" 803 | ieee-float "^0.6.0" 804 | 805 | figures@^3.0.0: 806 | version "3.0.0" 807 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9" 808 | integrity sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g== 809 | dependencies: 810 | escape-string-regexp "^1.0.5" 811 | 812 | file-entry-cache@^5.0.1: 813 | version "5.0.1" 814 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" 815 | integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== 816 | dependencies: 817 | flat-cache "^2.0.1" 818 | 819 | find-up@^2.0.0, find-up@^2.1.0: 820 | version "2.1.0" 821 | resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 822 | dependencies: 823 | locate-path "^2.0.0" 824 | 825 | flat-cache@^2.0.1: 826 | version "2.0.1" 827 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" 828 | integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== 829 | dependencies: 830 | flatted "^2.0.0" 831 | rimraf "2.6.3" 832 | write "1.0.3" 833 | 834 | flatted@^2.0.0: 835 | version "2.0.1" 836 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" 837 | integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== 838 | 839 | flatten@^1.0.2: 840 | version "1.0.2" 841 | resolved "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" 842 | 843 | foreach@^2.0.5: 844 | version "2.0.5" 845 | resolved "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 846 | 847 | fs.realpath@^1.0.0: 848 | version "1.0.0" 849 | resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 850 | 851 | function-bind@^1.0.2, function-bind@^1.1.1: 852 | version "1.1.1" 853 | resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 854 | 855 | functional-red-black-tree@^1.0.1: 856 | version "1.0.1" 857 | resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 858 | 859 | glob-parent@^5.0.0: 860 | version "5.0.0" 861 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954" 862 | integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg== 863 | dependencies: 864 | is-glob "^4.0.1" 865 | 866 | glob@^7.1.3: 867 | version "7.1.4" 868 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 869 | integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== 870 | dependencies: 871 | fs.realpath "^1.0.0" 872 | inflight "^1.0.4" 873 | inherits "2" 874 | minimatch "^3.0.4" 875 | once "^1.3.0" 876 | path-is-absolute "^1.0.0" 877 | 878 | global@^4.3.2: 879 | version "4.3.2" 880 | resolved "https://registry.npmjs.org/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" 881 | dependencies: 882 | min-document "^2.19.0" 883 | process "~0.5.1" 884 | 885 | globals@^11.7.0: 886 | version "11.12.0" 887 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 888 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 889 | 890 | graceful-fs@^4.1.2: 891 | version "4.1.11" 892 | resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 893 | 894 | has-flag@^3.0.0: 895 | version "3.0.0" 896 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 897 | 898 | has-symbols@^1.0.0: 899 | version "1.0.0" 900 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" 901 | integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= 902 | 903 | has@^1.0.1: 904 | version "1.0.1" 905 | resolved "https://registry.npmjs.org/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 906 | dependencies: 907 | function-bind "^1.0.2" 908 | 909 | has@^1.0.3: 910 | version "1.0.3" 911 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 912 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 913 | dependencies: 914 | function-bind "^1.1.1" 915 | 916 | hash-base@^3.0.0: 917 | version "3.0.4" 918 | resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" 919 | dependencies: 920 | inherits "^2.0.1" 921 | safe-buffer "^5.0.1" 922 | 923 | history@^4.7.2: 924 | version "4.7.2" 925 | resolved "https://registry.npmjs.org/history/-/history-4.7.2.tgz#22b5c7f31633c5b8021c7f4a8a954ac139ee8d5b" 926 | dependencies: 927 | invariant "^2.2.1" 928 | loose-envify "^1.2.0" 929 | resolve-pathname "^2.2.0" 930 | value-equal "^0.4.0" 931 | warning "^3.0.0" 932 | 933 | hoist-non-react-statics@^2.5.0: 934 | version "2.5.0" 935 | resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.0.tgz#d2ca2dfc19c5a91c5a6615ce8e564ef0347e2a40" 936 | 937 | hoist-non-react-statics@^3.3.0: 938 | version "3.3.0" 939 | resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" 940 | integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== 941 | dependencies: 942 | react-is "^16.7.0" 943 | 944 | hosted-git-info@^2.1.4: 945 | version "2.6.0" 946 | resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" 947 | 948 | iconv-lite@^0.4.24: 949 | version "0.4.24" 950 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 951 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 952 | dependencies: 953 | safer-buffer ">= 2.1.2 < 3" 954 | 955 | iconv-lite@~0.4.13: 956 | version "0.4.23" 957 | resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 958 | dependencies: 959 | safer-buffer ">= 2.1.2 < 3" 960 | 961 | ieee-float@^0.6.0: 962 | version "0.6.0" 963 | resolved "http://registry.npm.taobao.org/ieee-float/download/ieee-float-0.6.0.tgz#a68a856ba1ef511e7fa0e7e7e155c3a63642a55d" 964 | 965 | ignore@^4.0.6: 966 | version "4.0.6" 967 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 968 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 969 | 970 | ignore@^5.1.1: 971 | version "5.1.4" 972 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" 973 | integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== 974 | 975 | immutable@^3.8.1: 976 | version "3.8.2" 977 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" 978 | integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= 979 | 980 | import-fresh@^3.0.0: 981 | version "3.1.0" 982 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" 983 | integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== 984 | dependencies: 985 | parent-module "^1.0.0" 986 | resolve-from "^4.0.0" 987 | 988 | imurmurhash@^0.1.4: 989 | version "0.1.4" 990 | resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 991 | 992 | inflight@^1.0.4: 993 | version "1.0.6" 994 | resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 995 | dependencies: 996 | once "^1.3.0" 997 | wrappy "1" 998 | 999 | inherits@2, inherits@^2.0.1: 1000 | version "2.0.3" 1001 | resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1002 | 1003 | inquirer@^6.4.1: 1004 | version "6.5.1" 1005 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.1.tgz#8bfb7a5ac02dac6ff641ac4c5ff17da112fcdb42" 1006 | integrity sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw== 1007 | dependencies: 1008 | ansi-escapes "^4.2.1" 1009 | chalk "^2.4.2" 1010 | cli-cursor "^3.1.0" 1011 | cli-width "^2.0.0" 1012 | external-editor "^3.0.3" 1013 | figures "^3.0.0" 1014 | lodash "^4.17.15" 1015 | mute-stream "0.0.8" 1016 | run-async "^2.2.0" 1017 | rxjs "^6.4.0" 1018 | string-width "^4.1.0" 1019 | strip-ansi "^5.1.0" 1020 | through "^2.3.6" 1021 | 1022 | invariant@^2.2.1, invariant@^2.2.4: 1023 | version "2.2.4" 1024 | resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" 1025 | dependencies: 1026 | loose-envify "^1.0.0" 1027 | 1028 | is-arrayish@^0.2.1: 1029 | version "0.2.1" 1030 | resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1031 | 1032 | is-builtin-module@^1.0.0: 1033 | version "1.0.0" 1034 | resolved "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 1035 | dependencies: 1036 | builtin-modules "^1.0.0" 1037 | 1038 | is-callable@^1.1.1, is-callable@^1.1.3: 1039 | version "1.1.3" 1040 | resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" 1041 | 1042 | is-callable@^1.1.4: 1043 | version "1.1.4" 1044 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" 1045 | integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== 1046 | 1047 | is-date-object@^1.0.1: 1048 | version "1.0.1" 1049 | resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 1050 | 1051 | is-extglob@^2.1.1: 1052 | version "2.1.1" 1053 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1054 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1055 | 1056 | is-fullwidth-code-point@^2.0.0: 1057 | version "2.0.0" 1058 | resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1059 | 1060 | is-fullwidth-code-point@^3.0.0: 1061 | version "3.0.0" 1062 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1063 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1064 | 1065 | is-glob@^4.0.0, is-glob@^4.0.1: 1066 | version "4.0.1" 1067 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1068 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1069 | dependencies: 1070 | is-extglob "^2.1.1" 1071 | 1072 | is-plain-object@^2.0.3: 1073 | version "2.0.4" 1074 | resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 1075 | dependencies: 1076 | isobject "^3.0.1" 1077 | 1078 | is-promise@^2.1.0: 1079 | version "2.1.0" 1080 | resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 1081 | 1082 | is-regex@^1.0.4: 1083 | version "1.0.4" 1084 | resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 1085 | dependencies: 1086 | has "^1.0.1" 1087 | 1088 | is-stream@^1.0.1: 1089 | version "1.1.0" 1090 | resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1091 | 1092 | is-symbol@^1.0.1: 1093 | version "1.0.1" 1094 | resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 1095 | 1096 | is-symbol@^1.0.2: 1097 | version "1.0.2" 1098 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" 1099 | integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== 1100 | dependencies: 1101 | has-symbols "^1.0.0" 1102 | 1103 | isarray@0.0.1: 1104 | version "0.0.1" 1105 | resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 1106 | 1107 | isarray@^1.0.0: 1108 | version "1.0.0" 1109 | resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1110 | 1111 | isexe@^2.0.0: 1112 | version "2.0.0" 1113 | resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1114 | 1115 | isobject@^3.0.1: 1116 | version "3.0.1" 1117 | resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 1118 | 1119 | isomorphic-fetch@^2.1.1, isomorphic-fetch@^2.2.1: 1120 | version "2.2.1" 1121 | resolved "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" 1122 | dependencies: 1123 | node-fetch "^1.0.1" 1124 | whatwg-fetch ">=0.10.0" 1125 | 1126 | js-tokens@^3.0.0: 1127 | version "3.0.2" 1128 | resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 1129 | 1130 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 1131 | version "4.0.0" 1132 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1133 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1134 | 1135 | js-yaml@^3.13.1: 1136 | version "3.13.1" 1137 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 1138 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 1139 | dependencies: 1140 | argparse "^1.0.7" 1141 | esprima "^4.0.0" 1142 | 1143 | json-schema-traverse@^0.4.1: 1144 | version "0.4.1" 1145 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1146 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1147 | 1148 | json-stable-stringify-without-jsonify@^1.0.1: 1149 | version "1.0.1" 1150 | resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1151 | 1152 | jsx-ast-utils@^2.1.0: 1153 | version "2.2.1" 1154 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz#4d4973ebf8b9d2837ee91a8208cc66f3a2776cfb" 1155 | integrity sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ== 1156 | dependencies: 1157 | array-includes "^3.0.3" 1158 | object.assign "^4.1.0" 1159 | 1160 | levn@^0.3.0, levn@~0.3.0: 1161 | version "0.3.0" 1162 | resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1163 | dependencies: 1164 | prelude-ls "~1.1.2" 1165 | type-check "~0.3.2" 1166 | 1167 | load-json-file@^2.0.0: 1168 | version "2.0.0" 1169 | resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 1170 | dependencies: 1171 | graceful-fs "^4.1.2" 1172 | parse-json "^2.2.0" 1173 | pify "^2.0.0" 1174 | strip-bom "^3.0.0" 1175 | 1176 | locate-path@^2.0.0: 1177 | version "2.0.0" 1178 | resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 1179 | dependencies: 1180 | p-locate "^2.0.0" 1181 | path-exists "^3.0.0" 1182 | 1183 | lodash._getnative@^3.0.0: 1184 | version "3.9.1" 1185 | resolved "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 1186 | 1187 | lodash.isarguments@^3.0.0: 1188 | version "3.1.0" 1189 | resolved "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 1190 | 1191 | lodash.isarray@^3.0.0: 1192 | version "3.0.4" 1193 | resolved "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 1194 | 1195 | lodash.keys@^3.1.2: 1196 | version "3.1.2" 1197 | resolved "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 1198 | dependencies: 1199 | lodash._getnative "^3.0.0" 1200 | lodash.isarguments "^3.0.0" 1201 | lodash.isarray "^3.0.0" 1202 | 1203 | lodash@^4.17.14, lodash@^4.17.15: 1204 | version "4.17.15" 1205 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 1206 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 1207 | 1208 | long@~3: 1209 | version "3.2.0" 1210 | resolved "http://registry.npm.taobao.org/long/download/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" 1211 | 1212 | loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1: 1213 | version "1.3.1" 1214 | resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 1215 | dependencies: 1216 | js-tokens "^3.0.0" 1217 | 1218 | loose-envify@^1.4.0: 1219 | version "1.4.0" 1220 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 1221 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 1222 | dependencies: 1223 | js-tokens "^3.0.0 || ^4.0.0" 1224 | 1225 | lower-case@^1.1.1: 1226 | version "1.1.4" 1227 | resolved "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" 1228 | 1229 | md5.js@^1.3.4: 1230 | version "1.3.4" 1231 | resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" 1232 | dependencies: 1233 | hash-base "^3.0.0" 1234 | inherits "^2.0.1" 1235 | 1236 | mimic-fn@^2.1.0: 1237 | version "2.1.0" 1238 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1239 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1240 | 1241 | min-document@^2.19.0: 1242 | version "2.19.0" 1243 | resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" 1244 | dependencies: 1245 | dom-walk "^0.1.0" 1246 | 1247 | minimatch@^3.0.4: 1248 | version "3.0.4" 1249 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1250 | dependencies: 1251 | brace-expansion "^1.1.7" 1252 | 1253 | minimist@0.0.8: 1254 | version "0.0.8" 1255 | resolved "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1256 | 1257 | mkdirp@^0.5.1: 1258 | version "0.5.1" 1259 | resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1260 | dependencies: 1261 | minimist "0.0.8" 1262 | 1263 | ms@2.0.0: 1264 | version "2.0.0" 1265 | resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1266 | 1267 | ms@^2.1.1: 1268 | version "2.1.2" 1269 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1270 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1271 | 1272 | mute-stream@0.0.8: 1273 | version "0.0.8" 1274 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 1275 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 1276 | 1277 | natural-compare@^1.4.0: 1278 | version "1.4.0" 1279 | resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1280 | 1281 | nice-try@^1.0.4: 1282 | version "1.0.5" 1283 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1284 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 1285 | 1286 | no-case@^2.2.0: 1287 | version "2.3.2" 1288 | resolved "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" 1289 | dependencies: 1290 | lower-case "^1.1.1" 1291 | 1292 | node-fetch@^1.0.1: 1293 | version "1.7.3" 1294 | resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" 1295 | dependencies: 1296 | encoding "^0.1.11" 1297 | is-stream "^1.0.1" 1298 | 1299 | normalize-package-data@^2.3.2: 1300 | version "2.4.0" 1301 | resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 1302 | dependencies: 1303 | hosted-git-info "^2.1.4" 1304 | is-builtin-module "^1.0.0" 1305 | semver "2 || 3 || 4 || 5" 1306 | validate-npm-package-license "^3.0.1" 1307 | 1308 | object-assign@4.x, object-assign@^4.1.0, object-assign@^4.1.1: 1309 | version "4.1.1" 1310 | resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1311 | 1312 | object-keys@^1.0.11, object-keys@^1.0.12: 1313 | version "1.1.1" 1314 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1315 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1316 | 1317 | object-keys@^1.0.8: 1318 | version "1.0.11" 1319 | resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" 1320 | 1321 | object.assign@^4.1.0: 1322 | version "4.1.0" 1323 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1324 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 1325 | dependencies: 1326 | define-properties "^1.1.2" 1327 | function-bind "^1.1.1" 1328 | has-symbols "^1.0.0" 1329 | object-keys "^1.0.11" 1330 | 1331 | object.entries@^1.1.0: 1332 | version "1.1.0" 1333 | resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" 1334 | integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== 1335 | dependencies: 1336 | define-properties "^1.1.3" 1337 | es-abstract "^1.12.0" 1338 | function-bind "^1.1.1" 1339 | has "^1.0.3" 1340 | 1341 | object.fromentries@^2.0.0: 1342 | version "2.0.0" 1343 | resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab" 1344 | integrity sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA== 1345 | dependencies: 1346 | define-properties "^1.1.2" 1347 | es-abstract "^1.11.0" 1348 | function-bind "^1.1.1" 1349 | has "^1.0.1" 1350 | 1351 | object.values@^1.1.0: 1352 | version "1.1.0" 1353 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" 1354 | integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== 1355 | dependencies: 1356 | define-properties "^1.1.3" 1357 | es-abstract "^1.12.0" 1358 | function-bind "^1.1.1" 1359 | has "^1.0.3" 1360 | 1361 | once@^1.3.0: 1362 | version "1.4.0" 1363 | resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1364 | dependencies: 1365 | wrappy "1" 1366 | 1367 | onetime@^5.1.0: 1368 | version "5.1.0" 1369 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" 1370 | integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== 1371 | dependencies: 1372 | mimic-fn "^2.1.0" 1373 | 1374 | optionator@^0.8.2: 1375 | version "0.8.2" 1376 | resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1377 | dependencies: 1378 | deep-is "~0.1.3" 1379 | fast-levenshtein "~2.0.4" 1380 | levn "~0.3.0" 1381 | prelude-ls "~1.1.2" 1382 | type-check "~0.3.2" 1383 | wordwrap "~1.0.0" 1384 | 1385 | os-tmpdir@~1.0.2: 1386 | version "1.0.2" 1387 | resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1388 | 1389 | p-limit@^1.1.0: 1390 | version "1.2.0" 1391 | resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" 1392 | dependencies: 1393 | p-try "^1.0.0" 1394 | 1395 | p-locate@^2.0.0: 1396 | version "2.0.0" 1397 | resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 1398 | dependencies: 1399 | p-limit "^1.1.0" 1400 | 1401 | p-try@^1.0.0: 1402 | version "1.0.0" 1403 | resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 1404 | 1405 | parent-module@^1.0.0: 1406 | version "1.0.1" 1407 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1408 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1409 | dependencies: 1410 | callsites "^3.0.0" 1411 | 1412 | parse-json@^2.2.0: 1413 | version "2.2.0" 1414 | resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1415 | dependencies: 1416 | error-ex "^1.2.0" 1417 | 1418 | path-exists@^3.0.0: 1419 | version "3.0.0" 1420 | resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1421 | 1422 | path-is-absolute@^1.0.0: 1423 | version "1.0.1" 1424 | resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1425 | 1426 | path-key@^2.0.1: 1427 | version "2.0.1" 1428 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1429 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1430 | 1431 | path-parse@^1.0.5: 1432 | version "1.0.5" 1433 | resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 1434 | 1435 | path-parse@^1.0.6: 1436 | version "1.0.6" 1437 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1438 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1439 | 1440 | path-to-regexp@^1.7.0: 1441 | version "1.7.0" 1442 | resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" 1443 | dependencies: 1444 | isarray "0.0.1" 1445 | 1446 | path-type@^2.0.0: 1447 | version "2.0.0" 1448 | resolved "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 1449 | dependencies: 1450 | pify "^2.0.0" 1451 | 1452 | pify@^2.0.0: 1453 | version "2.3.0" 1454 | resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1455 | 1456 | pkg-dir@^2.0.0: 1457 | version "2.0.0" 1458 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" 1459 | integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= 1460 | dependencies: 1461 | find-up "^2.1.0" 1462 | 1463 | prelude-ls@~1.1.2: 1464 | version "1.1.2" 1465 | resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1466 | 1467 | process@~0.5.1: 1468 | version "0.5.2" 1469 | resolved "https://registry.npmjs.org/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" 1470 | 1471 | progress@^2.0.0: 1472 | version "2.0.0" 1473 | resolved "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 1474 | 1475 | promise@^7.1.1: 1476 | version "7.3.1" 1477 | resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" 1478 | dependencies: 1479 | asap "~2.0.3" 1480 | 1481 | prop-types@15.x, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1: 1482 | version "15.6.1" 1483 | resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" 1484 | dependencies: 1485 | fbjs "^0.8.16" 1486 | loose-envify "^1.3.1" 1487 | object-assign "^4.1.1" 1488 | 1489 | prop-types@^15.6.2, prop-types@^15.7.2: 1490 | version "15.7.2" 1491 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" 1492 | integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== 1493 | dependencies: 1494 | loose-envify "^1.4.0" 1495 | object-assign "^4.1.1" 1496 | react-is "^16.8.1" 1497 | 1498 | punycode@^2.1.0: 1499 | version "2.1.1" 1500 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1501 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1502 | 1503 | randombytes@^2.0.5: 1504 | version "2.0.6" 1505 | resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" 1506 | dependencies: 1507 | safe-buffer "^5.1.0" 1508 | 1509 | rc-align@^2.4.0: 1510 | version "2.4.1" 1511 | resolved "http://registry.npm.taobao.org/rc-align/download/rc-align-2.4.1.tgz#604c71e76063606aa076868efaf23213b188034b" 1512 | dependencies: 1513 | babel-runtime "^6.26.0" 1514 | dom-align "^1.7.0" 1515 | prop-types "^15.5.8" 1516 | rc-util "^4.0.4" 1517 | shallowequal "^1.0.2" 1518 | 1519 | rc-animate@2.x: 1520 | version "2.4.4" 1521 | resolved "https://registry.npmjs.org/rc-animate/-/rc-animate-2.4.4.tgz#a05a784c747beef140d99ff52b6117711bef4b1e" 1522 | dependencies: 1523 | babel-runtime "6.x" 1524 | css-animation "^1.3.2" 1525 | prop-types "15.x" 1526 | 1527 | rc-slider@^8.6.1: 1528 | version "8.6.1" 1529 | resolved "http://registry.npm.taobao.org/rc-slider/download/rc-slider-8.6.1.tgz#ee5e0380dbdf4b5de6955a265b0d4ff6196405d1" 1530 | dependencies: 1531 | babel-runtime "6.x" 1532 | classnames "^2.2.5" 1533 | prop-types "^15.5.4" 1534 | rc-tooltip "^3.7.0" 1535 | rc-util "^4.0.4" 1536 | shallowequal "^1.0.1" 1537 | warning "^3.0.0" 1538 | 1539 | rc-tooltip@^3.7.0: 1540 | version "3.7.2" 1541 | resolved "http://registry.npm.taobao.org/rc-tooltip/download/rc-tooltip-3.7.2.tgz#3698656d4bacd51b72d9e327bed15d1d5a9f1b27" 1542 | dependencies: 1543 | babel-runtime "6.x" 1544 | prop-types "^15.5.8" 1545 | rc-trigger "^2.2.2" 1546 | 1547 | rc-trigger@^2.2.2: 1548 | version "2.5.3" 1549 | resolved "http://registry.npm.taobao.org/rc-trigger/download/rc-trigger-2.5.3.tgz#aa3d9a9b20c51d05f6f35d36fa41074f70f6cd64" 1550 | dependencies: 1551 | babel-runtime "6.x" 1552 | classnames "^2.2.6" 1553 | prop-types "15.x" 1554 | rc-align "^2.4.0" 1555 | rc-animate "2.x" 1556 | rc-util "^4.4.0" 1557 | 1558 | rc-util@^4.0.4: 1559 | version "4.5.0" 1560 | resolved "https://registry.npmjs.org/rc-util/-/rc-util-4.5.0.tgz#3183e6ec806f382efb2d3e85770d95875fa6180f" 1561 | dependencies: 1562 | add-dom-event-listener "1.x" 1563 | babel-runtime "6.x" 1564 | prop-types "^15.5.10" 1565 | shallowequal "^0.2.2" 1566 | 1567 | rc-util@^4.4.0: 1568 | version "4.5.1" 1569 | resolved "http://registry.npm.taobao.org/rc-util/download/rc-util-4.5.1.tgz#0e435057174c024901c7600ba8903dd03da3ab39" 1570 | dependencies: 1571 | add-dom-event-listener "1.x" 1572 | babel-runtime "6.x" 1573 | prop-types "^15.5.10" 1574 | shallowequal "^0.2.2" 1575 | 1576 | react-dom@^16.3.3: 1577 | version "16.9.0" 1578 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.9.0.tgz#5e65527a5e26f22ae3701131bcccaee9fb0d3962" 1579 | integrity sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ== 1580 | dependencies: 1581 | loose-envify "^1.1.0" 1582 | object-assign "^4.1.1" 1583 | prop-types "^15.6.2" 1584 | scheduler "^0.15.0" 1585 | 1586 | react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6: 1587 | version "16.9.0" 1588 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb" 1589 | integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw== 1590 | 1591 | react-lifecycles-compat@^3.0.0: 1592 | version "3.0.4" 1593 | resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" 1594 | 1595 | react-loading@^2.0.2: 1596 | version "2.0.2" 1597 | resolved "https://registry.npmjs.org/react-loading/-/react-loading-2.0.2.tgz#bc6d908fa316e1ccd677b7567792049a9bb4be0d" 1598 | 1599 | react-modal@^3.4.4: 1600 | version "3.4.4" 1601 | resolved "https://registry.npmjs.org/react-modal/-/react-modal-3.4.4.tgz#e9dde25e9e85a59c76831f2a2b468712a546aded" 1602 | dependencies: 1603 | exenv "^1.2.0" 1604 | prop-types "^15.5.10" 1605 | react-lifecycles-compat "^3.0.0" 1606 | warning "^3.0.0" 1607 | 1608 | react-redux@^7.1.0: 1609 | version "7.1.0" 1610 | resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.1.0.tgz#72af7cf490a74acdc516ea9c1dd80e25af9ea0b2" 1611 | integrity sha512-hyu/PoFK3vZgdLTg9ozbt7WF3GgX5+Yn3pZm5/96/o4UueXA+zj08aiSC9Mfj2WtD1bvpIb3C5yvskzZySzzaw== 1612 | dependencies: 1613 | "@babel/runtime" "^7.4.5" 1614 | hoist-non-react-statics "^3.3.0" 1615 | invariant "^2.2.4" 1616 | loose-envify "^1.4.0" 1617 | prop-types "^15.7.2" 1618 | react-is "^16.8.6" 1619 | 1620 | react-router-dom@^4.3.1: 1621 | version "4.3.1" 1622 | resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.3.1.tgz#4c2619fc24c4fa87c9fd18f4fb4a43fe63fbd5c6" 1623 | integrity sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA== 1624 | dependencies: 1625 | history "^4.7.2" 1626 | invariant "^2.2.4" 1627 | loose-envify "^1.3.1" 1628 | prop-types "^15.6.1" 1629 | react-router "^4.3.1" 1630 | warning "^4.0.1" 1631 | 1632 | react-router@^4.3.1: 1633 | version "4.3.1" 1634 | resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e" 1635 | integrity sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg== 1636 | dependencies: 1637 | history "^4.7.2" 1638 | hoist-non-react-statics "^2.5.0" 1639 | invariant "^2.2.4" 1640 | loose-envify "^1.3.1" 1641 | path-to-regexp "^1.7.0" 1642 | prop-types "^15.6.1" 1643 | warning "^4.0.1" 1644 | 1645 | react@^16.3.2: 1646 | version "16.3.2" 1647 | resolved "https://registry.npmjs.org/react/-/react-16.3.2.tgz#fdc8420398533a1e58872f59091b272ce2f91ea9" 1648 | dependencies: 1649 | fbjs "^0.8.16" 1650 | loose-envify "^1.1.0" 1651 | object-assign "^4.1.1" 1652 | prop-types "^15.6.0" 1653 | 1654 | read-pkg-up@^2.0.0: 1655 | version "2.0.0" 1656 | resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 1657 | dependencies: 1658 | find-up "^2.0.0" 1659 | read-pkg "^2.0.0" 1660 | 1661 | read-pkg@^2.0.0: 1662 | version "2.0.0" 1663 | resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 1664 | dependencies: 1665 | load-json-file "^2.0.0" 1666 | normalize-package-data "^2.3.2" 1667 | path-type "^2.0.0" 1668 | 1669 | redux-saga@^0.16.0: 1670 | version "0.16.0" 1671 | resolved "https://registry.npmjs.org/redux-saga/-/redux-saga-0.16.0.tgz#0a231db0a1489301dd980f6f2f88d8ced418f724" 1672 | 1673 | redux@^4.0.0, redux@^4.0.1: 1674 | version "4.0.4" 1675 | resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.4.tgz#4ee1aeb164b63d6a1bcc57ae4aa0b6e6fa7a3796" 1676 | integrity sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q== 1677 | dependencies: 1678 | loose-envify "^1.4.0" 1679 | symbol-observable "^1.2.0" 1680 | 1681 | regenerator-runtime@^0.10.5: 1682 | version "0.10.5" 1683 | resolved "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" 1684 | 1685 | regenerator-runtime@^0.11.0: 1686 | version "0.11.1" 1687 | resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" 1688 | 1689 | regenerator-runtime@^0.13.2: 1690 | version "0.13.3" 1691 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" 1692 | integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== 1693 | 1694 | regexpp@^2.0.1: 1695 | version "2.0.1" 1696 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" 1697 | integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== 1698 | 1699 | resolve-from@^4.0.0: 1700 | version "4.0.0" 1701 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1702 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1703 | 1704 | resolve-pathname@^2.2.0: 1705 | version "2.2.0" 1706 | resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" 1707 | 1708 | resolve@^1.10.1, resolve@^1.11.0: 1709 | version "1.12.0" 1710 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" 1711 | integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== 1712 | dependencies: 1713 | path-parse "^1.0.6" 1714 | 1715 | resolve@^1.5.0: 1716 | version "1.7.1" 1717 | resolved "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" 1718 | dependencies: 1719 | path-parse "^1.0.5" 1720 | 1721 | restore-cursor@^3.1.0: 1722 | version "3.1.0" 1723 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 1724 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 1725 | dependencies: 1726 | onetime "^5.1.0" 1727 | signal-exit "^3.0.2" 1728 | 1729 | rimraf@2.6.3: 1730 | version "2.6.3" 1731 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 1732 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 1733 | dependencies: 1734 | glob "^7.1.3" 1735 | 1736 | ripemd160@^2.0.0, ripemd160@^2.0.1: 1737 | version "2.0.2" 1738 | resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" 1739 | dependencies: 1740 | hash-base "^3.0.0" 1741 | inherits "^2.0.1" 1742 | 1743 | rmc-list-view@^0.11.5: 1744 | version "0.11.5" 1745 | resolved "https://registry.npmjs.org/rmc-list-view/-/rmc-list-view-0.11.5.tgz#8e152a5dbec6aec45a8ccd1f33cb8ef140b93a1e" 1746 | dependencies: 1747 | babel-runtime "6.x" 1748 | classnames "^2.2.5" 1749 | fbjs "^0.8.3" 1750 | prop-types "^15.5.8" 1751 | warning "^3.0.0" 1752 | zscroller "~0.4.0" 1753 | 1754 | rmc-notification@^1.0.0: 1755 | version "1.0.0" 1756 | resolved "https://registry.npmjs.org/rmc-notification/-/rmc-notification-1.0.0.tgz#1fcee98f99b9733f7ce63a91d7663a578743d075" 1757 | dependencies: 1758 | babel-runtime "6.x" 1759 | classnames "2.x" 1760 | prop-types "^15.5.8" 1761 | rc-animate "2.x" 1762 | rc-util "^4.0.4" 1763 | 1764 | run-async@^2.2.0: 1765 | version "2.3.0" 1766 | resolved "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 1767 | dependencies: 1768 | is-promise "^2.1.0" 1769 | 1770 | rxjs@^6.4.0: 1771 | version "6.5.2" 1772 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" 1773 | integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== 1774 | dependencies: 1775 | tslib "^1.9.0" 1776 | 1777 | safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1: 1778 | version "5.1.2" 1779 | resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1780 | 1781 | "safer-buffer@>= 2.1.2 < 3": 1782 | version "2.1.2" 1783 | resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1784 | 1785 | scheduler@^0.15.0: 1786 | version "0.15.0" 1787 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.15.0.tgz#6bfcf80ff850b280fed4aeecc6513bc0b4f17f8e" 1788 | integrity sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg== 1789 | dependencies: 1790 | loose-envify "^1.1.0" 1791 | object-assign "^4.1.1" 1792 | 1793 | seamless-immutable@^7.1.3: 1794 | version "7.1.4" 1795 | resolved "https://registry.yarnpkg.com/seamless-immutable/-/seamless-immutable-7.1.4.tgz#6e9536def083ddc4dea0207d722e0e80d0f372f8" 1796 | integrity sha512-XiUO1QP4ki4E2PHegiGAlu6r82o5A+6tRh7IkGGTVg/h+UoeX4nFBeCGPOhb4CYjvkqsfm/TUtvOMYC1xmV30A== 1797 | 1798 | "semver@2 || 3 || 4 || 5": 1799 | version "5.5.0" 1800 | resolved "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 1801 | 1802 | semver@^5.5.0: 1803 | version "5.7.1" 1804 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1805 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1806 | 1807 | semver@^6.1.0, semver@^6.1.2: 1808 | version "6.3.0" 1809 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1810 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1811 | 1812 | setimmediate@^1.0.5: 1813 | version "1.0.5" 1814 | resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1815 | 1816 | sha.js@^2.4.0, sha.js@^2.4.8: 1817 | version "2.4.11" 1818 | resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" 1819 | dependencies: 1820 | inherits "^2.0.1" 1821 | safe-buffer "^5.0.1" 1822 | 1823 | shallowequal@^0.2.2: 1824 | version "0.2.2" 1825 | resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz#1e32fd5bcab6ad688a4812cb0cc04efc75c7014e" 1826 | dependencies: 1827 | lodash.keys "^3.1.2" 1828 | 1829 | shallowequal@^1.0.1, shallowequal@^1.0.2: 1830 | version "1.0.2" 1831 | resolved "http://registry.npm.taobao.org/shallowequal/download/shallowequal-1.0.2.tgz#1561dbdefb8c01408100319085764da3fcf83f8f" 1832 | 1833 | shebang-command@^1.2.0: 1834 | version "1.2.0" 1835 | resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1836 | dependencies: 1837 | shebang-regex "^1.0.0" 1838 | 1839 | shebang-regex@^1.0.0: 1840 | version "1.0.0" 1841 | resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1842 | 1843 | signal-exit@^3.0.2: 1844 | version "3.0.2" 1845 | resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1846 | 1847 | slice-ansi@^2.1.0: 1848 | version "2.1.0" 1849 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" 1850 | integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== 1851 | dependencies: 1852 | ansi-styles "^3.2.0" 1853 | astral-regex "^1.0.0" 1854 | is-fullwidth-code-point "^2.0.0" 1855 | 1856 | spdx-correct@^3.0.0: 1857 | version "3.0.0" 1858 | resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" 1859 | dependencies: 1860 | spdx-expression-parse "^3.0.0" 1861 | spdx-license-ids "^3.0.0" 1862 | 1863 | spdx-exceptions@^2.1.0: 1864 | version "2.1.0" 1865 | resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" 1866 | 1867 | spdx-expression-parse@^3.0.0: 1868 | version "3.0.0" 1869 | resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 1870 | dependencies: 1871 | spdx-exceptions "^2.1.0" 1872 | spdx-license-ids "^3.0.0" 1873 | 1874 | spdx-license-ids@^3.0.0: 1875 | version "3.0.0" 1876 | resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" 1877 | 1878 | sprintf-js@~1.0.2: 1879 | version "1.0.3" 1880 | resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1881 | 1882 | string-width@^3.0.0: 1883 | version "3.1.0" 1884 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1885 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1886 | dependencies: 1887 | emoji-regex "^7.0.1" 1888 | is-fullwidth-code-point "^2.0.0" 1889 | strip-ansi "^5.1.0" 1890 | 1891 | string-width@^4.1.0: 1892 | version "4.1.0" 1893 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" 1894 | integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== 1895 | dependencies: 1896 | emoji-regex "^8.0.0" 1897 | is-fullwidth-code-point "^3.0.0" 1898 | strip-ansi "^5.2.0" 1899 | 1900 | strip-ansi@^5.1.0, strip-ansi@^5.2.0: 1901 | version "5.2.0" 1902 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1903 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1904 | dependencies: 1905 | ansi-regex "^4.1.0" 1906 | 1907 | strip-bom@^3.0.0: 1908 | version "3.0.0" 1909 | resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1910 | 1911 | strip-json-comments@^3.0.1: 1912 | version "3.0.1" 1913 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" 1914 | integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== 1915 | 1916 | supports-color@^5.3.0: 1917 | version "5.4.0" 1918 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 1919 | dependencies: 1920 | has-flag "^3.0.0" 1921 | 1922 | symbol-observable@^1.2.0: 1923 | version "1.2.0" 1924 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" 1925 | integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== 1926 | 1927 | table@^5.2.3: 1928 | version "5.4.6" 1929 | resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" 1930 | integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== 1931 | dependencies: 1932 | ajv "^6.10.2" 1933 | lodash "^4.17.14" 1934 | slice-ansi "^2.1.0" 1935 | string-width "^3.0.0" 1936 | 1937 | text-table@^0.2.0: 1938 | version "0.2.0" 1939 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1940 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1941 | 1942 | through@^2.3.6: 1943 | version "2.3.8" 1944 | resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1945 | 1946 | tmp@^0.0.33: 1947 | version "0.0.33" 1948 | resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1949 | dependencies: 1950 | os-tmpdir "~1.0.2" 1951 | 1952 | tslib@^1.9.0: 1953 | version "1.10.0" 1954 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" 1955 | integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== 1956 | 1957 | type-check@~0.3.2: 1958 | version "0.3.2" 1959 | resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1960 | dependencies: 1961 | prelude-ls "~1.1.2" 1962 | 1963 | type-fest@^0.5.2: 1964 | version "0.5.2" 1965 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" 1966 | integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== 1967 | 1968 | ua-parser-js@^0.7.9: 1969 | version "0.7.18" 1970 | resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" 1971 | 1972 | upper-case@^1.1.1: 1973 | version "1.1.3" 1974 | resolved "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" 1975 | 1976 | uri-js@^4.2.2: 1977 | version "4.2.2" 1978 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1979 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 1980 | dependencies: 1981 | punycode "^2.1.0" 1982 | 1983 | v8-compile-cache@^2.0.3: 1984 | version "2.1.0" 1985 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" 1986 | integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== 1987 | 1988 | validate-npm-package-license@^3.0.1: 1989 | version "3.0.3" 1990 | resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" 1991 | dependencies: 1992 | spdx-correct "^3.0.0" 1993 | spdx-expression-parse "^3.0.0" 1994 | 1995 | value-equal@^0.4.0: 1996 | version "0.4.0" 1997 | resolved "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" 1998 | 1999 | warning@^3.0.0: 2000 | version "3.0.0" 2001 | resolved "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" 2002 | dependencies: 2003 | loose-envify "^1.0.0" 2004 | 2005 | warning@^4.0.1: 2006 | version "4.0.3" 2007 | resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" 2008 | integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== 2009 | dependencies: 2010 | loose-envify "^1.0.0" 2011 | 2012 | whatwg-fetch@>=0.10.0: 2013 | version "2.0.4" 2014 | resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" 2015 | 2016 | which@^1.2.9: 2017 | version "1.3.0" 2018 | resolved "https://registry.npmjs.org/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 2019 | dependencies: 2020 | isexe "^2.0.0" 2021 | 2022 | wordwrap@~1.0.0: 2023 | version "1.0.0" 2024 | resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 2025 | 2026 | wrappy@1: 2027 | version "1.0.2" 2028 | resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2029 | 2030 | write@1.0.3: 2031 | version "1.0.3" 2032 | resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" 2033 | integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== 2034 | dependencies: 2035 | mkdirp "^0.5.1" 2036 | 2037 | zscroller@~0.4.0: 2038 | version "0.4.7" 2039 | resolved "https://registry.npmjs.org/zscroller/-/zscroller-0.4.7.tgz#3956e6e7dfb5175058df0da9abae6e4834088f8a" 2040 | dependencies: 2041 | babel-runtime "6.x" 2042 | --------------------------------------------------------------------------------