diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7a3b69571..90fcaa6d2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,12 +1,14 @@ name: CI Pipeline for the Backend and Frontend on: - push: + pull_request: + types: [ opened, review_requested, synchronize ] env: NODE_VERSION: 16.15.0 jobs: backend: + if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')" strategy: matrix: flavor: ['dev', 'prod'] @@ -27,12 +29,12 @@ jobs: - name: Install if: ${{ matrix.flavor == 'dev'}} - run: npm install + run: npm ci working-directory: ${{ matrix.flavor }}/backend - name: Install (Prod dependencies only) if: ${{ matrix.flavor == 'prod'}} - run: npm install --prod + run: npm ci --prod --no-optional working-directory: ${{ matrix.flavor }}/backend - name: Lint @@ -48,6 +50,7 @@ jobs: working-directory: ${{ matrix.flavor }}/backend frontend: + if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')" strategy: matrix: flavor: ['dev', 'prod'] @@ -67,16 +70,17 @@ jobs: registry-url: 'https://registry.npmjs.org' - name: Install (Prod dependencies only) - run: npm install + run: npm ci --prod --no-optional if: ${{ matrix.flavor == 'prod'}} working-directory: ${{ matrix.flavor }}/frontend - name: Install if: ${{ matrix.flavor == 'dev'}} - run: npm install + run: npm ci working-directory: ${{ matrix.flavor }}/frontend - - name: Lint + - name: Lint + if: ${{ matrix.flavor == 'dev'}} run: npm run lint working-directory: ${{ matrix.flavor }}/frontend diff --git a/backend/.editorconfig b/backend/.editorconfig new file mode 100644 index 000000000..9787413cd --- /dev/null +++ b/backend/.editorconfig @@ -0,0 +1,17 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false + diff --git a/backend/.eslintrc b/backend/.eslintrc index 99ac365b1..d8f453c51 100644 --- a/backend/.eslintrc +++ b/backend/.eslintrc @@ -7,7 +7,8 @@ "extends": [ "eslint:recommended", "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended" + "plugin:@typescript-eslint/recommended", + "prettier" ], "rules": { "@typescript-eslint/ban-ts-comment": 1, diff --git a/backend/.prettierignore b/backend/.prettierignore new file mode 100644 index 000000000..d5f19d89b --- /dev/null +++ b/backend/.prettierignore @@ -0,0 +1,2 @@ +node_modules +package-lock.json diff --git a/backend/.prettierrc b/backend/.prettierrc new file mode 100644 index 000000000..b8039f843 --- /dev/null +++ b/backend/.prettierrc @@ -0,0 +1,6 @@ +{ + "endOfLine": "lf", + "printWidth": 80, + "tabWidth": 2, + "trailingComma": "es5" +} diff --git a/backend/package-lock.json b/backend/package-lock.json index ce3a8ff68..30e8b4290 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -23,12 +23,14 @@ }, "devDependencies": { "@types/compression": "^1.7.2", + "@types/crypto-js": "^4.1.1", "@types/express": "^4.17.13", "@types/ws": "~8.5.3", "@typescript-eslint/eslint-plugin": "^5.30.5", "@typescript-eslint/parser": "^5.30.5", "eslint": "^8.19.0", - "tslint": "^6.1.0" + "eslint-config-prettier": "^8.5.0", + "prettier": "^2.7.1" } }, "node_modules/@babel/code-frame": { @@ -232,6 +234,12 @@ "@types/node": "*" } }, + "node_modules/@types/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==", + "dev": true + }, "node_modules/@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -744,27 +752,6 @@ "node": ">=8" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -900,15 +887,6 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -938,20 +916,6 @@ "node": ">=6" } }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -961,21 +925,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -987,12 +936,6 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1109,15 +1052,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1160,15 +1094,6 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/eslint": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz", @@ -1221,6 +1146,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -1429,19 +1366,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esquery": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", @@ -1830,15 +1754,6 @@ "node": ">= 0.4.0" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -1951,18 +1866,6 @@ "node": ">= 0.10" } }, - "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2004,25 +1907,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2165,24 +2049,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -2344,12 +2210,6 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -2385,6 +2245,21 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -2492,19 +2367,6 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2595,15 +2457,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -2767,12 +2620,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "node_modules/sqlstring": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", @@ -2821,18 +2668,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -2865,49 +2700,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" - } - }, - "node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3078,32 +2870,6 @@ } }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, "@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -3246,6 +3012,12 @@ "@types/node": "*" } }, + "@types/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==", + "dev": true + }, "@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -3588,24 +3360,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -3725,12 +3479,6 @@ "safe-buffer": "^5.1.2" } }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -3751,17 +3499,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -3771,21 +3508,6 @@ "safe-buffer": "^5.0.1" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3794,12 +3516,6 @@ "delayed-stream": "~1.0.0" } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3891,12 +3607,6 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -3930,12 +3640,6 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, "eslint": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz", @@ -4082,6 +3786,13 @@ } } }, + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "requires": {} + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -4126,12 +3837,6 @@ "eslint-visitor-keys": "^3.3.0" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "esquery": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", @@ -4434,12 +4139,6 @@ "function-bind": "^1.1.1" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -4522,15 +4221,6 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4563,22 +4253,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4688,21 +4362,6 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -4835,12 +4494,6 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -4864,6 +4517,12 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -4930,16 +4589,6 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -4989,12 +4638,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, "send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -5122,12 +4765,6 @@ } } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "sqlstring": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", @@ -5161,15 +4798,6 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -5196,36 +4824,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/backend/package.json b/backend/package.json index c5cd4380c..67fc12f85 100644 --- a/backend/package.json +++ b/backend/package.json @@ -26,7 +26,8 @@ "start-production": "node --max-old-space-size=4096 dist/index.js", "test": "echo \"Error: no test specified\" && exit 1", "lint": "./node_modules/.bin/eslint . --ext .ts", - "lint:fix": "./node_modules/.bin/eslint . --ext .ts --fix" + "lint:fix": "./node_modules/.bin/eslint . --ext .ts --fix", + "prettier": "./node_modules/.bin/prettier --write \"src/**/*.{js,ts}\"" }, "dependencies": { "@mempool/electrum-client": "^1.1.7", @@ -43,11 +44,13 @@ }, "devDependencies": { "@types/compression": "^1.7.2", + "@types/crypto-js": "^4.1.1", "@types/express": "^4.17.13", "@types/ws": "~8.5.3", "@typescript-eslint/eslint-plugin": "^5.30.5", "@typescript-eslint/parser": "^5.30.5", "eslint": "^8.19.0", - "tslint": "^6.1.0" + "eslint-config-prettier": "^8.5.0", + "prettier": "^2.7.1" } } diff --git a/backend/src/api/bitcoin/electrum-api.ts b/backend/src/api/bitcoin/electrum-api.ts index 54d75d67b..73fc3f28f 100644 --- a/backend/src/api/bitcoin/electrum-api.ts +++ b/backend/src/api/bitcoin/electrum-api.ts @@ -5,8 +5,7 @@ import { IEsploraApi } from './esplora-api.interface'; import { IElectrumApi } from './electrum-api.interface'; import BitcoinApi from './bitcoin-api'; import logger from '../../logger'; -import * as sha256 from 'crypto-js/sha256'; -import * as hexEnc from 'crypto-js/enc-hex'; +import crypto from "crypto-js"; import loadingIndicators from '../loading-indicators'; import memoryCache from '../memory-cache'; @@ -144,8 +143,8 @@ class BitcoindElectrsApi extends BitcoinApi implements AbstractBitcoinApi { } private encodeScriptHash(scriptPubKey: string): string { - const addrScripthash = hexEnc.stringify(sha256(hexEnc.parse(scriptPubKey))); - return addrScripthash.match(/.{2}/g).reverse().join(''); + const addrScripthash = crypto.enc.Hex.stringify(crypto.SHA256(crypto.enc.Hex.parse(scriptPubKey))); + return addrScripthash!.match(/.{2}/g)!.reverse().join(''); } } diff --git a/backend/tslint.json b/backend/tslint.json deleted file mode 100644 index 945512322..000000000 --- a/backend/tslint.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "rules": { - "arrow-return-shorthand": true, - "callable-types": true, - "class-name": true, - "comment-format": [ - true, - "check-space" - ], - "curly": true, - "deprecation": { - "severity": "warn" - }, - "eofline": true, - "forin": false, - "import-blacklist": [ - true, - "rxjs", - "rxjs/Rx" - ], - "import-spacing": true, - "indent": [ - true, - "spaces" - ], - "interface-over-type-literal": true, - "label-position": true, - "max-line-length": [ - true, - 140 - ], - "member-access": false, - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-arg": true, - "no-bitwise": true, - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-construct": true, - "no-debugger": true, - "no-duplicate-super": true, - "no-empty": false, - "no-empty-interface": true, - "no-eval": true, - "no-inferrable-types": false, - "no-misused-new": true, - "no-non-null-assertion": true, - "no-shadowed-variable": true, - "no-string-literal": false, - "no-string-throw": true, - "no-switch-case-fall-through": true, - "no-trailing-whitespace": true, - "no-unnecessary-initializer": true, - "no-unused-expression": true, - "no-use-before-declare": true, - "no-var-keyword": true, - "object-literal-sort-keys": false, - "one-line": [ - true, - "check-open-brace", - "check-catch", - "check-else", - "check-whitespace" - ], - "prefer-const": true, - "quotemark": [ - true, - "single" - ], - "radix": true, - "semicolon": [ - true, - "always" - ], - "triple-equals": [ - true, - "allow-null-check" - ], - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "unified-signatures": true, - "variable-name": false, - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type" - ], - "directive-selector": [ - true, - "attribute", - "app", - "camelCase" - ], - "component-selector": [ - true, - "element", - "app", - "kebab-case" - ], - "no-output-on-prefix": true, - "use-input-property-decorator": true, - "use-output-property-decorator": true, - "use-host-property-decorator": true, - "no-input-rename": true, - "no-output-rename": true, - "use-life-cycle-interface": true, - "use-pipe-transform-interface": true, - "component-class-suffix": true, - "directive-class-suffix": true - } -} diff --git a/contributors/erikarvstedt.txt b/contributors/erikarvstedt.txt new file mode 100644 index 000000000..0f84df7c2 --- /dev/null +++ b/contributors/erikarvstedt.txt @@ -0,0 +1,3 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of July 6, 2022. + +Signed: erikarvstedt diff --git a/frontend/.editorconfig b/frontend/.editorconfig index e89330a61..9787413cd 100644 --- a/frontend/.editorconfig +++ b/frontend/.editorconfig @@ -8,6 +8,10 @@ indent_size = 2 insert_final_newline = true trim_trailing_whitespace = true +[*.ts] +quote_type = single + [*.md] max_line_length = off trim_trailing_whitespace = false + diff --git a/frontend/.prettierignore b/frontend/.prettierignore new file mode 100644 index 000000000..d5f19d89b --- /dev/null +++ b/frontend/.prettierignore @@ -0,0 +1,2 @@ +node_modules +package-lock.json diff --git a/frontend/.prettierrc b/frontend/.prettierrc new file mode 100644 index 000000000..b8039f843 --- /dev/null +++ b/frontend/.prettierrc @@ -0,0 +1,6 @@ +{ + "endOfLine": "lf", + "printWidth": 80, + "tabWidth": 2, + "trailingComma": "es5" +} diff --git a/frontend/cypress/e2e/mainnet/mining.spec.ts b/frontend/cypress/e2e/mainnet/mining.spec.ts new file mode 100644 index 000000000..5c60f3a8c --- /dev/null +++ b/frontend/cypress/e2e/mainnet/mining.spec.ts @@ -0,0 +1,171 @@ +const baseModule = Cypress.env("BASE_MODULE"); + +describe('Mainnet - Mining Features', () => { + beforeEach(() => { + //https://github.com/cypress-io/cypress/issues/14459 + if (Cypress.browser.family === 'chromium') { + Cypress.automation('remote:debugger:protocol', { + command: 'Network.enable', + params: {} + }); + Cypress.automation('remote:debugger:protocol', { + command: 'Network.setCacheDisabled', + params: { cacheDisabled: true } + }); + } + }); + + if (baseModule === 'mempool') { + + describe('Miner page', () => { + beforeEach(() => { + cy.intercept('/api/v1/mining/pool/**').as('pool'); + cy.intercept('/api/v1/mining/hashrate/pools/**').as('hashrate'); + cy.intercept('/api/tx/**').as('tx'); + cy.intercept('/api/v1/outpends/**').as('outspends'); + }); + it('loads the mining pool page from the dashboard', () => { + cy.visit('/mining'); + cy.waitForSkeletonGone(); + cy.get('[data-cy="bitcoin-block-0-pool"]').click().then(() => { + cy.waitForSkeletonGone(); + cy.wait('@pool'); + cy.url().should('match', /\/mining\/pool\/(\w+)/); + }); + }); + + it('loads the mining pool page from the blocks page', () => { + cy.visit('/mining'); + cy.waitForSkeletonGone(); + cy.get('[data-cy="bitcoin-block-0-height"]').click().then(() => { + cy.waitForSkeletonGone(); + cy.get('[data-cy="block-details-miner-badge"]').click().then(() => { + cy.waitForSkeletonGone(); + cy.wait('@pool'); + cy.url().should('match', /\/mining\/pool\/(\w+)/); + }); + }); + }); + }); + + describe('Mining Dashboard Landing page widgets', () => { + + beforeEach(() => { + cy.visit('/mining'); + cy.waitForSkeletonGone(); + }); + + it('shows the mempool blocks', () => { + cy.get('[data-cy="mempool-block-0-fees"]').invoke('text').should('match', /~(.*) sat\/vB/); + cy.get('[data-cy="mempool-block-0-fee-span"]').invoke('text').should('match', /(.*) - (.*) sat\/vB/); + cy.get('[data-cy="mempool-block-0-total-fees"]').invoke('text').should('match', /(.*) BTC/); + cy.get('[data-cy="mempool-block-0-transaction-count"]').invoke('text').should('match', /(.*) transactions/); + cy.get('[data-cy="mempool-block-0-time"]').invoke('text').should('match', /In ~(.*) minutes/); + }); + + it('shows the mined blocks', () => { + cy.get('[data-cy="bitcoin-block-0-height"]').invoke('text').should('match', /(\d)/); + cy.get('[data-cy="bitcoin-block-0-fees"]').invoke('text').should('match', /~(.*) sat\/vB/); + cy.get('[data-cy="bitcoin-block-0-fee-span"]').invoke('text').should('match', /(.*) - (.*) sat\/vB/); + cy.get('[data-cy="bitcoin-block-0-total-fees"]').invoke('text').should('match', /(.*) BTC/); + cy.get('[data-cy="bitcoin-block-0-transactions"]').invoke('text').should('match', /(.*) transactions/); + cy.get('[data-cy="bitcoin-block-0-time"]').invoke('text').should('match', /((.*) ago|Just now)/); + cy.get('[data-cy="bitcoin-block-0-pool"]').invoke('text').should('match', /(\w)/); + }); + + it('shows the reward stats for the last 144 blocks', () => { + cy.get('[data-cy="reward-stats"]'); + }); + + it('shows the difficulty adjustment stats', () => { + cy.get('[data-cy="difficulty-adjustment"]'); + }); + + it('shows the latest blocks', () => { + cy.get('[data-cy="latest-blocks"]'); + }); + + it('shows the pools pie chart', () => { + cy.get('[data-cy="pool-distribution"]'); + }); + + it('shows the hashrate graph', () => { + cy.get('[data-cy="hashrate-graph"]'); + }); + it('shows the latest blocks', () => { + cy.get('[data-cy="latest-blocks"]'); + }); + + it('shows the latest adjustments', () => { + cy.get('[data-cy="difficulty-adjustments-table"]'); + }); + }); + + describe.only('mining graphs', () => { + describe('pools ranking', () => { + it('loads the graph', () => { + cy.visit('/graphs/mining/pools'); + cy.waitForSkeletonGone(); + cy.waitForPageIdle(); + cy.get('.spinner-border').should('not.exist'); + }); + }); + + describe('pools dominance', () => { + it('loads the graph', () => { + cy.visit('/graphs/mining/pools-dominance'); + cy.waitForSkeletonGone(); + cy.waitForPageIdle(); + cy.get('.spinner-border').should('not.exist'); + }); + }); + + describe('hashrate & difficulty', () => { + it('loads the graph', () => { + cy.visit('/graphs/mining/hashrate-difficulty'); + cy.waitForSkeletonGone(); + cy.waitForPageIdle(); + cy.get('.spinner-border').should('not.exist'); + }); + }); + + describe('block fee rates', () => { + it('loads the graph', () => { + cy.visit('/graphs/mining/block-fee-rates'); + cy.waitForSkeletonGone(); + cy.waitForPageIdle(); + cy.get('.spinner-border').should('not.exist'); + }); + }); + + describe('block fees', () => { + it('loads the graph', () => { + cy.visit('/graphs/mining/block-fees'); + cy.waitForSkeletonGone(); + cy.waitForPageIdle(); + cy.get('.spinner-border').should('not.exist'); + }); + }); + + describe('block rewards', () => { + it('loads the graph', () => { + cy.visit('/graphs/mining/block-rewards'); + cy.waitForSkeletonGone(); + cy.waitForPageIdle(); + cy.get('.spinner-border').should('not.exist'); + }); + }); + + describe('block sizes and weights', () => { + it('loads the graph', () => { + cy.visit('/graphs/mining/block-sizes-weights'); + cy.waitForSkeletonGone(); + cy.waitForPageIdle(); + cy.get('.spinner-border').should('not.exist'); + }); + }); + }); + } else { + it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`); + } +}); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 9038b4ec4..1b3e98b8a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -56,14 +56,15 @@ "@typescript-eslint/parser": "^5.30.5", "eslint": "^8.19.0", "http-proxy-middleware": "~2.0.6", + "prettier": "^2.7.1", "ts-node": "~10.8.1", "typescript": "~4.6.4" }, "optionalDependencies": { "@cypress/schematic": "~2.0.0", - "cypress": "^10.0.2", - "cypress-fail-on-console-error": "~2.1.4", - "cypress-wait-until": "^1.7.1", + "cypress": "^10.3.0", + "cypress-fail-on-console-error": "~3.0.0", + "cypress-wait-until": "^1.7.2", "mock-socket": "~9.1.4", "start-server-and-test": "~1.14.0" } @@ -1366,9 +1367,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", + "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", "engines": { "node": ">=6.9.0" } @@ -7293,9 +7294,9 @@ "peer": true }, "node_modules/cypress": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.0.2.tgz", - "integrity": "sha512-7+C4KHYBcfZrawss+Gt5PlS35rfc6ySc59JcHDVsIMm1E/J35dqE41UEXpdtwIq3549umCerNWnFADzqib4kcA==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.3.0.tgz", + "integrity": "sha512-txkQWKzvBVnWdCuKs5Xc08gjpO89W2Dom2wpZgT9zWZT5jXxqPIxqP/NC1YArtkpmp3fN5HW8aDjYBizHLUFvg==", "hasInstallScript": true, "optional": true, "dependencies": { @@ -7350,9 +7351,9 @@ } }, "node_modules/cypress-fail-on-console-error": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cypress-fail-on-console-error/-/cypress-fail-on-console-error-2.1.4.tgz", - "integrity": "sha512-arjx2xfQN1FDM3s4HoKK0ZXszPgIZLAI61sbwaZfdo8HEIVJPdOwY+oBKM1XY9yso80rgtwlSY75KJOQTNOkdg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cypress-fail-on-console-error/-/cypress-fail-on-console-error-3.0.0.tgz", + "integrity": "sha512-DBu5DI3gMzwFkzuOTbJ/A1xbGtYKukFoe7o07unEJlqe0f50xwB5OnAm6Pxe7J9eNtg40ZUJB8fcATqDr0qwgw==", "optional": true, "dependencies": { "chai": "^4.3.4", @@ -7361,9 +7362,9 @@ } }, "node_modules/cypress-wait-until": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.1.tgz", - "integrity": "sha512-8DL5IsBTbAxBjfYgCzdbohPq/bY+IKc63fxtso1C8RWhLnQkZbVESyaclNr76jyxfId6uyzX8+Xnt0ZwaXNtkA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.2.tgz", + "integrity": "sha512-uZ+M8/MqRcpf+FII/UZrU7g1qYZ4aVlHcgyVopnladyoBrpoaMJ4PKZDrdOJ05H5RHbr7s9Tid635X3E+ZLU/Q==", "optional": true }, "node_modules/cypress/node_modules/@types/node": { @@ -10994,9 +10995,9 @@ } }, "node_modules/jest-worker": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.0.tgz", - "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -14340,6 +14341,21 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -18695,9 +18711,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", + "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==" }, "@babel/helper-remap-async-to-generator": { "version": "7.16.8", @@ -23197,9 +23213,9 @@ "peer": true }, "cypress": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.0.2.tgz", - "integrity": "sha512-7+C4KHYBcfZrawss+Gt5PlS35rfc6ySc59JcHDVsIMm1E/J35dqE41UEXpdtwIq3549umCerNWnFADzqib4kcA==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.3.0.tgz", + "integrity": "sha512-txkQWKzvBVnWdCuKs5Xc08gjpO89W2Dom2wpZgT9zWZT5jXxqPIxqP/NC1YArtkpmp3fN5HW8aDjYBizHLUFvg==", "optional": true, "requires": { "@cypress/request": "^2.88.10", @@ -23374,9 +23390,9 @@ } }, "cypress-fail-on-console-error": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cypress-fail-on-console-error/-/cypress-fail-on-console-error-2.1.4.tgz", - "integrity": "sha512-arjx2xfQN1FDM3s4HoKK0ZXszPgIZLAI61sbwaZfdo8HEIVJPdOwY+oBKM1XY9yso80rgtwlSY75KJOQTNOkdg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cypress-fail-on-console-error/-/cypress-fail-on-console-error-3.0.0.tgz", + "integrity": "sha512-DBu5DI3gMzwFkzuOTbJ/A1xbGtYKukFoe7o07unEJlqe0f50xwB5OnAm6Pxe7J9eNtg40ZUJB8fcATqDr0qwgw==", "optional": true, "requires": { "chai": "^4.3.4", @@ -23385,9 +23401,9 @@ } }, "cypress-wait-until": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.1.tgz", - "integrity": "sha512-8DL5IsBTbAxBjfYgCzdbohPq/bY+IKc63fxtso1C8RWhLnQkZbVESyaclNr76jyxfId6uyzX8+Xnt0ZwaXNtkA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.2.tgz", + "integrity": "sha512-uZ+M8/MqRcpf+FII/UZrU7g1qYZ4aVlHcgyVopnladyoBrpoaMJ4PKZDrdOJ05H5RHbr7s9Tid635X3E+ZLU/Q==", "optional": true }, "d": { @@ -26030,9 +26046,9 @@ } }, "jest-worker": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.0.tgz", - "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -28514,6 +28530,12 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true + }, "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 0f026b597..6c626f3c9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -44,6 +44,7 @@ "test": "npm run ng -- test", "lint": "./node_modules/.bin/eslint . --ext .ts", "lint:fix": "./node_modules/.bin/eslint . --ext .ts --fix", + "prettier": "prettier --write \"src/app/**/*.{js,json,css,scss,less,md,ts,html,component.html}\"", "e2e": "npm run generate-config && npm run ng -- e2e", "e2e:ci": "npm run cypress:run:ci", "config:defaults:mempool": "node update-config.js TESTNET_ENABLED=true SIGNET_ENABLED=true LIQUID_ENABLED=true LIQUID_TESTNET_ENABLED=true BISQ_ENABLED=true ITEMS_PER_PAGE=25 BASE_MODULE=mempool BLOCK_WEIGHT_UNITS=4000000 && npm run generate-config", @@ -109,14 +110,15 @@ "@typescript-eslint/parser": "^5.30.5", "eslint": "^8.19.0", "http-proxy-middleware": "~2.0.6", + "prettier": "^2.7.1", "ts-node": "~10.8.1", "typescript": "~4.6.4" }, "optionalDependencies": { "@cypress/schematic": "~2.0.0", - "cypress": "^10.0.2", - "cypress-fail-on-console-error": "~2.1.4", - "cypress-wait-until": "^1.7.1", + "cypress": "^10.3.0", + "cypress-fail-on-console-error": "~3.0.0", + "cypress-wait-until": "^1.7.2", "mock-socket": "~9.1.4", "start-server-and-test": "~1.14.0" }, diff --git a/frontend/src/app/components/block-predictions-graph/block-predictions-graph.component.html b/frontend/src/app/components/block-prediction-graph/block-prediction-graph.component.html similarity index 76% rename from frontend/src/app/components/block-predictions-graph/block-predictions-graph.component.html rename to frontend/src/app/components/block-prediction-graph/block-prediction-graph.component.html index 79806eb2b..64cd32fd1 100644 --- a/frontend/src/app/components/block-predictions-graph/block-predictions-graph.component.html +++ b/frontend/src/app/components/block-prediction-graph/block-prediction-graph.component.html @@ -2,41 +2,41 @@
- Block Predictions Accuracy + Block Prediction Accuracy
diff --git a/frontend/src/app/components/block-predictions-graph/block-predictions-graph.component.scss b/frontend/src/app/components/block-prediction-graph/block-prediction-graph.component.scss similarity index 100% rename from frontend/src/app/components/block-predictions-graph/block-predictions-graph.component.scss rename to frontend/src/app/components/block-prediction-graph/block-prediction-graph.component.scss diff --git a/frontend/src/app/components/block-predictions-graph/block-predictions-graph.component.ts b/frontend/src/app/components/block-prediction-graph/block-prediction-graph.component.ts similarity index 96% rename from frontend/src/app/components/block-predictions-graph/block-predictions-graph.component.ts rename to frontend/src/app/components/block-prediction-graph/block-prediction-graph.component.ts index b2ec7116c..fe5a9f40c 100644 --- a/frontend/src/app/components/block-predictions-graph/block-predictions-graph.component.ts +++ b/frontend/src/app/components/block-prediction-graph/block-prediction-graph.component.ts @@ -13,9 +13,9 @@ import { RelativeUrlPipe } from 'src/app/shared/pipes/relative-url/relative-url. import { StateService } from 'src/app/services/state.service'; @Component({ - selector: 'app-block-predictions-graph', - templateUrl: './block-predictions-graph.component.html', - styleUrls: ['./block-predictions-graph.component.scss'], + selector: 'app-block-prediction-graph', + templateUrl: './block-prediction-graph.component.html', + styleUrls: ['./block-prediction-graph.component.scss'], styles: [` .loadingGraphs { position: absolute; @@ -26,7 +26,7 @@ import { StateService } from 'src/app/services/state.service'; `], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class BlockPredictionsGraphComponent implements OnInit { +export class BlockPredictionGraphComponent implements OnInit { @Input() right: number | string = 45; @Input() left: number | string = 75; @@ -60,7 +60,7 @@ export class BlockPredictionsGraphComponent implements OnInit { } ngOnInit(): void { - this.seoService.setTitle($localize`Block predictions accuracy`); + this.seoService.setTitle($localize`:@@d7d5fcf50179ad70c938491c517efb82de2c8146:Block Prediction Accuracy`); this.miningWindowPreference = '24h';//this.miningService.getDefaultTimespan('24h'); this.radioGroupForm = this.formBuilder.group({ dateSpan: this.miningWindowPreference }); this.radioGroupForm.controls.dateSpan.setValue(this.miningWindowPreference); diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index 782a50b58..2a3d8f2fd 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -113,13 +113,13 @@ Miner - {{ block.extras.pool.name }} - {{ block.extras.pool.name }} diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html index d41d34b81..f1d2cca6d 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html @@ -1,31 +1,31 @@
-
- +   -
+
-
+
~{{ block?.extras?.medianFee | number:feeRounding }} sat/vB
-
+
{{ block?.extras?.feeRange[1] | number:feeRounding }} - {{ block?.extras?.feeRange[block?.extras?.feeRange.length - 1] | number:feeRounding }} sat/vB
-
+
-
-
+
+
{{ i }} transaction {{ i }} transactions
-
+
diff --git a/frontend/src/app/components/graphs/graphs.component.html b/frontend/src/app/components/graphs/graphs.component.html index aca62a4dd..59aa61aa1 100644 --- a/frontend/src/app/components/graphs/graphs.component.html +++ b/frontend/src/app/components/graphs/graphs.component.html @@ -19,7 +19,7 @@ Block Sizes and Weights Blocks Predictions Accuracy + [routerLink]="['/graphs/mining/block-prediction' | relativeUrl]" i18n="mining.block-prediction-accuracy">Block Prediction Accuracy
diff --git a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.html b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.html index 46be9e2d2..9e013a45c 100644 --- a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.html +++ b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.html @@ -28,22 +28,22 @@
diff --git a/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html b/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html index 51f6abafc..1d9e63716 100644 --- a/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html +++ b/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -10,19 +10,19 @@
diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html index ecb8163c1..77ca95b2f 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html @@ -2,26 +2,26 @@
-
+
 
-
+
~{{ projectedBlock.medianFee | number:feeRounding }} sat/vB
-
+
{{ projectedBlock.feeRange[0] | number:feeRounding }} - {{ projectedBlock.feeRange[projectedBlock.feeRange.length - 1] | number:feeRounding }} sat/vB
- +
-
+
{{ i }} transaction {{ i }} transactions
-
+
@@ -30,7 +30,7 @@
-
+
() {{ i }} blocks
diff --git a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html index 5549698df..36aec8906 100644 --- a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html +++ b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html @@ -7,7 +7,7 @@
- Reward stats  + Reward stats  (144 blocks)
@@ -22,15 +22,15 @@
Difficulty Adjustment
- +
@@ -39,7 +39,7 @@
@@ -54,7 +54,7 @@   - +
@@ -68,7 +68,7 @@   - +
diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.html b/frontend/src/app/components/pool-ranking/pool-ranking.component.html index a4027dfa2..b6a90a491 100644 --- a/frontend/src/app/components/pool-ranking/pool-ranking.component.html +++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.html @@ -40,34 +40,34 @@ *ngIf="!widget && (miningStatsObservable$ | async) as stats">
@@ -95,7 +95,7 @@ Empty blocks - + {{ pool.rank }} diff --git a/frontend/src/app/graphs/graphs.module.ts b/frontend/src/app/graphs/graphs.module.ts index 8cdc51608..39a493134 100644 --- a/frontend/src/app/graphs/graphs.module.ts +++ b/frontend/src/app/graphs/graphs.module.ts @@ -22,7 +22,7 @@ import { DashboardComponent } from '../dashboard/dashboard.component'; import { MiningDashboardComponent } from '../components/mining-dashboard/mining-dashboard.component'; import { HashrateChartComponent } from '../components/hashrate-chart/hashrate-chart.component'; import { HashrateChartPoolsComponent } from '../components/hashrates-chart-pools/hashrate-chart-pools.component'; -import { BlockPredictionsGraphComponent } from '../components/block-predictions-graph/block-predictions-graph.component'; +import { BlockPredictionGraphComponent } from '../components/block-prediction-graph/block-prediction-graph.component'; import { CommonModule } from '@angular/common'; @NgModule({ @@ -48,7 +48,7 @@ import { CommonModule } from '@angular/common'; LbtcPegsGraphComponent, HashrateChartComponent, HashrateChartPoolsComponent, - BlockPredictionsGraphComponent, + BlockPredictionGraphComponent, ], imports: [ CommonModule, diff --git a/frontend/src/app/graphs/graphs.routing.module.ts b/frontend/src/app/graphs/graphs.routing.module.ts index fd3efaba4..5c6daae7f 100644 --- a/frontend/src/app/graphs/graphs.routing.module.ts +++ b/frontend/src/app/graphs/graphs.routing.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { BlockPredictionsGraphComponent } from '../components/block-predictions-graph/block-predictions-graph.component'; +import { BlockPredictionGraphComponent } from '../components/block-prediction-graph/block-prediction-graph.component'; import { BlockFeeRatesGraphComponent } from '../components/block-fee-rates-graph/block-fee-rates-graph.component'; import { BlockFeesGraphComponent } from '../components/block-fees-graph/block-fees-graph.component'; import { BlockRewardsGraphComponent } from '../components/block-rewards-graph/block-rewards-graph.component'; @@ -94,8 +94,8 @@ const routes: Routes = [ redirectTo: 'mempool', }, { - path: 'mining/block-predictions', - component: BlockPredictionsGraphComponent, + path: 'mining/block-prediction', + component: BlockPredictionGraphComponent, }, ] }, diff --git a/frontend/src/locale/messages.xlf b/frontend/src/locale/messages.xlf index 409605a55..0648705b1 100644 --- a/frontend/src/locale/messages.xlf +++ b/frontend/src/locale/messages.xlf @@ -307,7 +307,7 @@ src/app/components/block/block.component.html - 190,191 + 310,311 src/app/components/blockchain-blocks/blockchain-blocks.component.html @@ -331,7 +331,7 @@ src/app/components/block/block.component.html - 191,192 + 311,312 src/app/components/blockchain-blocks/blockchain-blocks.component.html @@ -374,7 +374,7 @@ src/app/components/block/block.component.html - 51,52 + 52,53 block.hash @@ -394,11 +394,11 @@ src/app/components/block/block.component.html - 55,57 + 56,58 src/app/components/blocks-list/blocks-list.component.html - 14,15 + 15,16 src/app/components/pool/pool.component.html @@ -470,7 +470,7 @@ src/app/dashboard/dashboard.component.html - 112,113 + 87,88 Bisq block height header @@ -498,11 +498,11 @@ src/app/components/blocks-list/blocks-list.component.html - 19,20 + 22,23 src/app/components/mempool-block/mempool-block.component.html - 29,33 + 28,32 Bisq block transactions title @@ -530,7 +530,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 88,90 + 94,96 @@ -677,18 +677,6 @@ src/app/components/mining-dashboard/mining-dashboard.component.html 43 - - src/app/components/mining-dashboard/mining-dashboard.component.html - 54 - - - src/app/components/mining-dashboard/mining-dashboard.component.html - 65 - - - src/app/dashboard/dashboard.component.html - 139,144 - dashboard.view-more @@ -703,7 +691,7 @@ src/app/dashboard/dashboard.component.html - 181,183 + 146,148 src/app/docs/docs/docs.component.html @@ -720,7 +708,7 @@ src/app/dashboard/dashboard.component.html - 183,185 + 148,150 src/app/docs/docs/docs.component.html @@ -892,7 +880,7 @@ src/app/dashboard/dashboard.component.html - 150,151 + 124,125 @@ -951,7 +939,7 @@ src/app/components/block/block.component.html - 147,148 + 267,268 src/app/components/transaction/transaction.component.html @@ -970,8 +958,8 @@ 111,117 - src/app/components/mempool-block/mempool-block.component.html - 45,47 + src/app/components/block-overview-tooltip/block-overview-tooltip.component.html + 12 src/app/components/transaction/transaction.component.html @@ -1139,7 +1127,7 @@ src/app/dashboard/dashboard.component.html - 149,150 + 123,125 @@ -1482,7 +1470,7 @@ src/app/dashboard/dashboard.component.html - 157,158 + 131,132 shared.confidential @@ -1670,7 +1658,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 64,70 + 70,76 src/app/components/pool/pool.component.html @@ -1841,7 +1829,7 @@ src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts - 65 + 66 src/app/components/graphs/graphs.component.html @@ -1849,6 +1837,52 @@ mining.block-fee-rates + + At block: + + src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts + 188 + + + src/app/components/block-fees-graph/block-fees-graph.component.ts + 137 + + + src/app/components/block-prediction-graph/block-prediction-graph.component.ts + 128 + + + src/app/components/block-rewards-graph/block-rewards-graph.component.ts + 135 + + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 161 + + + + Around block: + + src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts + 190 + + + src/app/components/block-fees-graph/block-fees-graph.component.ts + 139 + + + src/app/components/block-prediction-graph/block-prediction-graph.component.ts + 130 + + + src/app/components/block-rewards-graph/block-rewards-graph.component.ts + 137 + + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 163 + + Block Fees @@ -1857,7 +1891,7 @@ src/app/components/block-fees-graph/block-fees-graph.component.ts - 58 + 60 src/app/components/graphs/graphs.component.html @@ -1869,11 +1903,11 @@ Fees src/app/components/block-fees-graph/block-fees-graph.component.ts - 160,158 + 175,173 src/app/components/blocks-list/blocks-list.component.html - 17,18 + 19,20 src/app/components/pool/pool.component.html @@ -1884,6 +1918,187 @@ 264,266 + + Value + + src/app/components/block-overview-tooltip/block-overview-tooltip.component.html + 18 + + Transaction value + transaction.value + + + Fee + + src/app/components/block-overview-tooltip/block-overview-tooltip.component.html + 22 + + + src/app/components/transaction/transaction.component.html + 386 + + Transaction fee + transaction.fee + + + sat + + src/app/components/block-overview-tooltip/block-overview-tooltip.component.html + 23 + + + src/app/components/transaction/transaction.component.html + 386,387 + + + src/app/components/transactions-list/transactions-list.component.html + 272,273 + + sat + shared.sat + + + Fee rate + + src/app/components/block-overview-tooltip/block-overview-tooltip.component.html + 26 + + + src/app/components/transaction/transaction.component.html + 154,158 + + + src/app/components/transaction/transaction.component.html + 389,391 + + Transaction fee rate + transaction.fee-rate + + + sat/vB + + src/app/components/block-overview-tooltip/block-overview-tooltip.component.html + 28 + + + src/app/components/block/block.component.html + 75 + + + src/app/components/block/block.component.html + 172 + + + src/app/components/blockchain-blocks/blockchain-blocks.component.html + 11,13 + + + src/app/components/blockchain-blocks/blockchain-blocks.component.html + 14,16 + + + src/app/components/fees-box/fees-box.component.html + 16 + + + src/app/components/fees-box/fees-box.component.html + 22 + + + src/app/components/fees-box/fees-box.component.html + 27 + + + src/app/components/fees-box/fees-box.component.html + 32 + + + src/app/components/mempool-block/mempool-block.component.html + 17 + + + src/app/components/mempool-block/mempool-block.component.html + 21,24 + + + src/app/components/mempool-blocks/mempool-blocks.component.html + 10,12 + + + src/app/components/mempool-blocks/mempool-blocks.component.html + 13,16 + + + src/app/components/transaction/transaction.component.html + 169,170 + + + src/app/components/transaction/transaction.component.html + 182,183 + + + src/app/components/transaction/transaction.component.html + 391,394 + + + src/app/components/transaction/transaction.component.html + 402,404 + + + src/app/components/transactions-list/transactions-list.component.html + 272 + + + src/app/dashboard/dashboard.component.html + 133,137 + + + src/app/dashboard/dashboard.component.html + 200,204 + + sat/vB + shared.sat-vbyte + + + Virtual size + + src/app/components/block-overview-tooltip/block-overview-tooltip.component.html + 32 + + + src/app/components/transaction/transaction.component.html + 153,155 + + + src/app/components/transaction/transaction.component.html + 216,219 + + Transaction Virtual Size + transaction.vsize + + + Block Prediction Accuracy + + src/app/components/block-prediction-graph/block-prediction-graph.component.html + 5,7 + + + src/app/components/block-prediction-graph/block-prediction-graph.component.ts + 63 + + + src/app/components/graphs/graphs.component.html + 22 + + mining.block-prediction-accuracy + + + Match rate + + src/app/components/block-prediction-graph/block-prediction-graph.component.ts + 176,174 + + Block Rewards @@ -1892,7 +2107,7 @@ src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 56 + 58 src/app/components/graphs/graphs.component.html @@ -1904,11 +2119,15 @@ Reward src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 160,158 + 175,173 src/app/components/blocks-list/blocks-list.component.html - 16,17 + 18,19 + + + src/app/components/blocks-list/blocks-list.component.html + 18,19 src/app/components/pool/pool.component.html @@ -1927,7 +2146,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 65 + 62 src/app/components/graphs/graphs.component.html @@ -1935,27 +2154,50 @@ mining.block-sizes-weights + + Indexing blocks + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 115,110 + + + src/app/components/hashrate-chart/hashrate-chart.component.ts + 171,166 + + + src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts + 167,162 + + + src/app/components/indexing-progress/indexing-progress.component.html + 1 + + + src/app/components/pool/pool.component.ts + 114,109 + + Size src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 181,180 + 180,179 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 227,225 + 226,224 src/app/components/block/block.component.html - 64,66 + 65,67 src/app/components/blocks-list/blocks-list.component.html - 20,22 + 23,25 src/app/components/mempool-block/mempool-block.component.html - 33,36 + 32,35 src/app/components/mempool-graph/mempool-graph.component.ts @@ -1975,22 +2217,22 @@ src/app/dashboard/dashboard.component.html - 116,119 + 91,94 Weight src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 189,188 + 188,187 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 258,255 + 257,254 src/app/components/block/block.component.html - 68,70 + 69,71 src/app/components/transaction/transaction.component.html @@ -2025,100 +2267,27 @@ Median fee src/app/components/block/block.component.html - 78,79 + 74,75 - - src/app/components/mempool-block/mempool-block.component.html - 17,18 - - block.median-fee - - - sat/vB src/app/components/block/block.component.html - 79 - - - src/app/components/blockchain-blocks/blockchain-blocks.component.html - 11,14 - - - src/app/components/blockchain-blocks/blockchain-blocks.component.html - 14,17 - - - src/app/components/fees-box/fees-box.component.html - 16 - - - src/app/components/fees-box/fees-box.component.html - 22 - - - src/app/components/fees-box/fees-box.component.html - 27 - - - src/app/components/fees-box/fees-box.component.html - 32 + 171,172 src/app/components/mempool-block/mempool-block.component.html - 18 + 16,17 - - src/app/components/mempool-block/mempool-block.component.html - 22,25 - - - src/app/components/mempool-block/mempool-block.component.html - 61,65 - - - src/app/components/mempool-blocks/mempool-blocks.component.html - 10,13 - - - src/app/components/mempool-blocks/mempool-blocks.component.html - 13,16 - - - src/app/components/transaction/transaction.component.html - 169,170 - - - src/app/components/transaction/transaction.component.html - 182,183 - - - src/app/components/transaction/transaction.component.html - 391,394 - - - src/app/components/transaction/transaction.component.html - 402,404 - - - src/app/components/transactions-list/transactions-list.component.html - 272 - - - src/app/dashboard/dashboard.component.html - 159,163 - - - src/app/dashboard/dashboard.component.html - 235,239 - - sat/vB - shared.sat-vbyte + block.median-fee Based on average native segwit transaction of 140 vBytes src/app/components/block/block.component.html - 79,81 + 75,77 + + + src/app/components/block/block.component.html + 172,174 src/app/components/fees-box/fees-box.component.html @@ -2138,7 +2307,7 @@ src/app/components/mempool-block/mempool-block.component.html - 18,21 + 17,20 Transaction fee tooltip @@ -2146,15 +2315,23 @@ Total fees src/app/components/block/block.component.html - 83,85 + 79,80 src/app/components/block/block.component.html - 109,111 + 105,107 + + + src/app/components/block/block.component.html + 176,178 + + + src/app/components/block/block.component.html + 202,205 src/app/components/mempool-block/mempool-block.component.html - 25,26 + 24,25 Total fees in a block block.total-fees @@ -2163,11 +2340,19 @@ Subsidy + fees: src/app/components/block/block.component.html - 98,100 + 94,96 src/app/components/block/block.component.html - 113,117 + 109,113 + + + src/app/components/block/block.component.html + 191,193 + + + src/app/components/block/block.component.html + 206,210 Total subsidy and fees in a block block.subsidy-and-fees @@ -2176,7 +2361,11 @@ Miner src/app/components/block/block.component.html - 118,120 + 114,116 + + + src/app/components/block/block.component.html + 211,213 block.miner @@ -2184,7 +2373,7 @@ Bits src/app/components/block/block.component.html - 151,153 + 271,273 block.bits @@ -2192,7 +2381,7 @@ Merkle root src/app/components/block/block.component.html - 155,157 + 275,277 block.merkle-root @@ -2200,7 +2389,7 @@ Difficulty src/app/components/block/block.component.html - 165,168 + 285,288 src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html @@ -2212,15 +2401,15 @@ src/app/components/hashrate-chart/hashrate-chart.component.html - 73,75 + 70,72 src/app/components/hashrate-chart/hashrate-chart.component.ts - 237,236 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 305,302 + 363,360 block.difficulty @@ -2228,7 +2417,7 @@ Nonce src/app/components/block/block.component.html - 169,171 + 289,291 block.nonce @@ -2236,7 +2425,7 @@ Block Header Hex src/app/components/block/block.component.html - 173,174 + 293,294 block.header @@ -2244,7 +2433,7 @@ Details src/app/components/block/block.component.html - 184,188 + 304,308 src/app/components/transaction/transaction.component.html @@ -2257,11 +2446,11 @@ Error loading data. src/app/components/block/block.component.html - 203,205 + 323,325 src/app/components/block/block.component.html - 285,290 + 359,363 error.general-loading-data @@ -2269,22 +2458,26 @@ Block : src/app/components/block/block.component.ts - 147 + 175 Pool src/app/components/blocks-list/blocks-list.component.html - 13,14 + 14 + + + src/app/components/blocks-list/blocks-list.component.html + 14,15 src/app/components/pool-ranking/pool-ranking.component.html - 86,87 + 92,93 src/app/dashboard/dashboard.component.html - 114,115 + 89,90 mining.pool-name @@ -2292,7 +2485,7 @@ Mined src/app/components/blocks-list/blocks-list.component.html - 15,16 + 16,17 src/app/components/pool/pool.component.html @@ -2304,7 +2497,7 @@ src/app/dashboard/dashboard.component.html - 113,114 + 88,89 latest-blocks.mined @@ -2312,7 +2505,11 @@ TXs src/app/components/blocks-list/blocks-list.component.html - 19 + 21,22 + + + src/app/components/blocks-list/blocks-list.component.html + 22 src/app/components/pool/pool.component.html @@ -2324,11 +2521,11 @@ src/app/dashboard/dashboard.component.html - 116,117 + 91,93 src/app/dashboard/dashboard.component.html - 241,245 + 206,210 dashboard.txs @@ -2477,8 +2674,8 @@ fees-box.no-priority - - Places your transaction in between the second and third mempool blocks + + Usually places your transaction in between the second and third mempool blocks src/app/components/fees-box/fees-box.component.html 8,9 @@ -2497,8 +2694,8 @@ fees-box.low-priority - - Places your transaction in between the first and second mempool blocks + + Usually places your transaction in between the first and second mempool blocks src/app/components/fees-box/fees-box.component.html 9,10 @@ -2545,7 +2742,7 @@ src/app/dashboard/dashboard.component.html - 268,269 + 233,234 dashboard.incoming-transactions @@ -2557,7 +2754,7 @@ src/app/dashboard/dashboard.component.html - 271,274 + 236,239 dashboard.backend-is-synchronizing @@ -2569,7 +2766,7 @@ src/app/dashboard/dashboard.component.html - 276,281 + 241,246 vB/s shared.vbytes-per-second @@ -2582,7 +2779,7 @@ src/app/dashboard/dashboard.component.html - 239,240 + 204,205 Unconfirmed count dashboard.unconfirmed @@ -2612,7 +2809,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 29,31 + 35,37 mining.pools @@ -2640,7 +2837,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 67 + 73 mining.hashrate-difficulty @@ -2652,34 +2849,38 @@ src/app/components/hashrate-chart/hashrate-chart.component.html - 67,69 + 64,66 src/app/components/hashrate-chart/hashrate-chart.component.ts - 226,225 + 269,268 src/app/components/hashrate-chart/hashrate-chart.component.ts - 293,291 + 351,349 src/app/components/pool-ranking/pool-ranking.component.html - 87,89 + 93,95 mining.hashrate + + Hashrate (MA) + + src/app/components/hashrate-chart/hashrate-chart.component.ts + 288,287 + + + src/app/components/hashrate-chart/hashrate-chart.component.ts + 374,372 + + Pools Historical Dominance src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts - 63 - - - - Indexing blocks - - src/app/components/indexing-progress/indexing-progress.component.html - 1 + 64 @@ -2752,83 +2953,10 @@ Fee span src/app/components/mempool-block/mempool-block.component.html - 21,22 + 20,21 mempool-block.fee-span - - Value - - src/app/components/mempool-block/mempool-block.component.html - 51,54 - - Transaction value - transaction.value - - - Fee - - src/app/components/mempool-block/mempool-block.component.html - 56 - - - src/app/components/transaction/transaction.component.html - 386 - - Transaction fee - transaction.fee - - - sat - - src/app/components/mempool-block/mempool-block.component.html - 56,57 - - - src/app/components/transaction/transaction.component.html - 386,387 - - - src/app/components/transactions-list/transactions-list.component.html - 272,273 - - sat - shared.sat - - - Fee rate - - src/app/components/mempool-block/mempool-block.component.html - 59,61 - - - src/app/components/transaction/transaction.component.html - 154,158 - - - src/app/components/transaction/transaction.component.html - 389,391 - - Transaction fee rate - transaction.fee-rate - - - Virtual size - - src/app/components/mempool-block/mempool-block.component.html - 65,68 - - - src/app/components/transaction/transaction.component.html - 153,155 - - - src/app/components/transaction/transaction.component.html - 216,219 - - Transaction Virtual Size - transaction.vsize - Stack of mempool blocks @@ -2877,11 +3005,11 @@ Latest blocks src/app/components/mining-dashboard/mining-dashboard.component.html - 52 + 53 src/app/dashboard/dashboard.component.html - 109,112 + 81,83 dashboard.latest-blocks @@ -2889,51 +3017,87 @@ Adjustments src/app/components/mining-dashboard/mining-dashboard.component.html - 63 + 67 dashboard.adjustments - - Pools Luck (1w) + + Pools luck (1 week) src/app/components/pool-ranking/pool-ranking.component.html - 8,12 + 9 + mining.miners-luck-1w + + + Pools luck src/app/components/pool-ranking/pool-ranking.component.html - 124,126 + 9,11 mining.miners-luck + + The overall luck of all mining pools over the past week. A luck bigger than 100% means the average block time for the current epoch is less than 10 minutes. + + src/app/components/pool-ranking/pool-ranking.component.html + 11,15 + + mining.pools-luck-desc + + + Pools count (1w) + + src/app/components/pool-ranking/pool-ranking.component.html + 17 + + mining.miners-count-1w + + + Pools count + + src/app/components/pool-ranking/pool-ranking.component.html + 17,19 + + mining.miners-count + + + How many unique pools found at least one block over the past week. + + src/app/components/pool-ranking/pool-ranking.component.html + 19,23 + + mining.pools-count-desc + Blocks (1w) src/app/components/pool-ranking/pool-ranking.component.html - 14,18 + 25 src/app/components/pool-ranking/pool-ranking.component.html - 130,132 - - master-page.blocks - - - Pools Count (1w) - - src/app/components/pool-ranking/pool-ranking.component.html - 20,24 + 25,27 src/app/components/pool-ranking/pool-ranking.component.html 136,138 - mining.miners-count + master-page.blocks + + + The number of blocks found over the past week. + + src/app/components/pool-ranking/pool-ranking.component.html + 27,31 + + mining.blocks-count-desc Rank src/app/components/pool-ranking/pool-ranking.component.html - 84,86 + 90,92 mining.rank @@ -2941,7 +3105,7 @@ Empty blocks src/app/components/pool-ranking/pool-ranking.component.html - 89,92 + 95,98 mining.empty-blocks @@ -2949,26 +3113,42 @@ All miners src/app/components/pool-ranking/pool-ranking.component.html - 107,108 + 113,114 mining.all-miners + + Pools Luck (1w) + + src/app/components/pool-ranking/pool-ranking.component.html + 130,132 + + mining.miners-luck + + + Pools Count (1w) + + src/app/components/pool-ranking/pool-ranking.component.html + 142,144 + + mining.miners-count + Mining Pools src/app/components/pool-ranking/pool-ranking.component.ts - 55 + 56 blocks src/app/components/pool-ranking/pool-ranking.component.ts - 153,151 + 162,160 src/app/components/pool-ranking/pool-ranking.component.ts - 156,155 + 165,164 @@ -3167,7 +3347,7 @@ src/app/dashboard/dashboard.component.html - 185,192 + 150,157 Broadcast Transaction shared.broadcast-transaction @@ -3188,7 +3368,11 @@ Miners Reward src/app/components/reward-stats/reward-stats.component.html - 4,6 + 5 + + + src/app/components/reward-stats/reward-stats.component.html + 5,6 src/app/components/reward-stats/reward-stats.component.html @@ -3208,7 +3392,11 @@ Reward Per Tx src/app/components/reward-stats/reward-stats.component.html - 16,18 + 17 + + + src/app/components/reward-stats/reward-stats.component.html + 17,18 src/app/components/reward-stats/reward-stats.component.html @@ -3245,7 +3433,11 @@ Average Fee src/app/components/reward-stats/reward-stats.component.html - 29,31 + 30 + + + src/app/components/reward-stats/reward-stats.component.html + 30,31 mining.average-fee @@ -3899,17 +4091,13 @@ src/app/dashboard/dashboard.component.html 6,9 - - src/app/dashboard/dashboard.component.html - 34,37 - fees-box.transaction-fees Latest transactions src/app/dashboard/dashboard.component.html - 146,149 + 120,123 dashboard.latest-transactions @@ -3917,7 +4105,7 @@ USD src/app/dashboard/dashboard.component.html - 152,153 + 126,127 dashboard.latest-transactions.USD @@ -3925,31 +4113,15 @@ Fee src/app/dashboard/dashboard.component.html - 153,155 + 127,129 dashboard.latest-transactions.fee - - Expand - - src/app/dashboard/dashboard.component.html - 173,174 - - dashboard.expand - - - Collapse - - src/app/dashboard/dashboard.component.html - 174,180 - - dashboard.collapse - Minimum fee src/app/dashboard/dashboard.component.html - 232,233 + 197,198 Minimum mempool fee dashboard.minimum-fee @@ -3958,7 +4130,7 @@ Purging src/app/dashboard/dashboard.component.html - 233,234 + 198,199 Purgin below fee dashboard.purging @@ -3967,7 +4139,7 @@ Memory usage src/app/dashboard/dashboard.component.html - 245,246 + 210,211 Memory usage dashboard.memory-usage @@ -3976,15 +4148,15 @@ L-BTC in circulation src/app/dashboard/dashboard.component.html - 259,261 + 224,226 dashboard.lbtc-pegs-in-circulation - - API service + + REST API service src/app/docs/api-docs/api-docs.component.html - 37,39 + 34,35 api-docs.title @@ -3992,11 +4164,11 @@ Endpoint src/app/docs/api-docs/api-docs.component.html - 45,46 + 43,44 src/app/docs/api-docs/api-docs.component.html - 97,100 + 95,98 Api docs endpoint @@ -4004,18 +4176,18 @@ Description src/app/docs/api-docs/api-docs.component.html - 62,63 + 60,61 src/app/docs/api-docs/api-docs.component.html - 101,102 + 99,100 Default push: action: 'want', data: ['blocks', ...] to express what you want pushed. Available: blocks, mempool-blocks, live-2h-chart, and stats.Push transactions related to address: 'track-address': '3PbJ...bF9B' to receive all new transactions containing that address as input or output. Returns an array of transactions. address-transactions for new mempool transactions, and block-transactions for new block confirmed transactions. src/app/docs/api-docs/api-docs.component.html - 102,103 + 100,101 api-docs.websocket.websocket diff --git a/production/linux/bitcoin-signet.service b/production/linux/bitcoin-signet.service index 403f97c5b..1023e0f5b 100644 --- a/production/linux/bitcoin-signet.service +++ b/production/linux/bitcoin-signet.service @@ -3,7 +3,7 @@ Description=Bitcoind-signet After=network.target [Service] -ExecStart=/usr/local/bin/bitcoind -conf=bitcoin-signet.conf -daemon -signet -printtoconsole -pid=/bitcoin/bitcoind-signet.pid +ExecStart=/usr/local/bin/bitcoind -conf=bitcoin.conf -daemon -signet -printtoconsole -pid=/bitcoin/bitcoind-signet.pid ExecStop=/usr/local/bin/bitcoin-cli -signet stop Type=forking diff --git a/production/linux/bitcoin-testnet.service b/production/linux/bitcoin-testnet.service index f7107397f..affafa45b 100644 --- a/production/linux/bitcoin-testnet.service +++ b/production/linux/bitcoin-testnet.service @@ -3,7 +3,7 @@ Description=Bitcoind-testnet After=network.target [Service] -ExecStart=/usr/local/bin/bitcoind -conf=bitcoin-testnet.conf -daemon -testnet -printtoconsole -pid=/bitcoin/bitcoind-testnet.pid +ExecStart=/usr/local/bin/bitcoind -conf=bitcoin.conf -daemon -testnet -printtoconsole -pid=/bitcoin/bitcoind-testnet.pid ExecStop=/usr/local/bin/bitcoin-cli -testnet stop Type=forking diff --git a/production/linux/elements-testnet.service b/production/linux/elements-testnet.service new file mode 100644 index 000000000..ff57c247b --- /dev/null +++ b/production/linux/elements-testnet.service @@ -0,0 +1,22 @@ +[Unit] +Description=Elementsd +After=network.target + +[Service] +ExecStart=/usr/local/bin/elementsd -daemon -printtoconsole -chain=liquidtestnet -pid=/elements/elements-testnet.pid +ExecStop=/usr/local/bin/elements-cli stop + +Type=forking +PIDFile=/elements/elements-testnet.pid +Restart=on-failure + +User=elements +Group=elements + +PrivateTmp=true +ProtectSystem=full +NoNewPrivileges=true +PrivateDevices=true + +[Install] +WantedBy=multi-user.target diff --git a/production/linux/liquid.service b/production/linux/elements.service similarity index 55% rename from production/linux/liquid.service rename to production/linux/elements.service index 9b9dee002..84f79abaa 100644 --- a/production/linux/liquid.service +++ b/production/linux/elements.service @@ -1,17 +1,17 @@ [Unit] -Description=Liquid +Description=Elementsd After=network.target [Service] -ExecStart=/usr/local/bin/elementsd -daemon -printtoconsole -pid=/liquid/liquid.pid +ExecStart=/usr/local/bin/elementsd -daemon -printtoconsole -chain=liquidv1 -pid=/elements/elements.pid ExecStop=/usr/local/bin/elements-cli stop Type=forking -PIDFile=/liquid/liquid.pid +PIDFile=/elements/elements.pid Restart=on-failure -User=liquid -Group=liquid +User=elements +Group=elements PrivateTmp=true ProtectSystem=full