├── .browserslistrc ├── .eslintrc.js ├── .github └── workflows │ ├── ci.yml │ └── greetings.yml ├── .gitignore ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── README.md ├── babel.config.js ├── cfg ├── app.json ├── defaultConfig.json ├── example │ └── rippledExample.cfg ├── schema.json └── system │ └── nginx.conf ├── commits.config.js ├── cypress.json ├── cypress ├── integration │ ├── footer_spec.js │ ├── header_spec.js │ ├── step1_spec.js │ ├── step2_spec.js │ ├── step3_spec.js │ ├── step4_spec.js │ └── step5_spec.js ├── plugins │ └── index.js └── support │ ├── commands.js │ └── index.js ├── global.d.ts ├── jest.config.js ├── lib ├── deploy.sh └── version.js ├── package.json ├── postcss.config.js ├── public ├── README.md ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── browserconfig.xml ├── content │ ├── html │ │ ├── advisoryDeletion_en.html │ │ ├── advisoryDeletion_es.html │ │ ├── allPurposeServer_en.html │ │ ├── allPurposeServer_es.html │ │ ├── apiServer_en.html │ │ ├── apiServer_es.html │ │ ├── automaticPurge_en.html │ │ ├── automaticPurge_es.html │ │ ├── bookKeepingDatabases_en.html │ │ ├── bookKeepingDatabases_es.html │ │ ├── connections_en.html │ │ ├── connections_es.html │ │ ├── databaseTypes_en.html │ │ ├── databaseTypes_es.html │ │ ├── developmentServer_en.html │ │ ├── developmentServer_es.html │ │ ├── devnet_en.html │ │ ├── devnet_es.html │ │ ├── fullHistoryServer_en.html │ │ ├── fullHistoryServer_es.html │ │ ├── hubServer_en.html │ │ ├── hubServer_es.html │ │ ├── ledgerHistoryFull_en.html │ │ ├── ledgerHistoryFull_es.html │ │ ├── ledgerHistoryNone_en.html │ │ ├── ledgerHistoryNone_es.html │ │ ├── ledgerHistorySome_en.html │ │ ├── ledgerHistorySome_es.html │ │ ├── ledgerHistory_en.html │ │ ├── ledgerHistory_es.html │ │ ├── log_en.html │ │ ├── log_es.html │ │ ├── mainnet_en.html │ │ ├── mainnet_es.html │ │ ├── manualPurge_en.html │ │ ├── manualPurge_es.html │ │ ├── networkAndValidators_en.html │ │ ├── networkAndValidators_es.html │ │ ├── network_en.html │ │ ├── network_es.html │ │ ├── nodeSizes_en.html │ │ ├── nodeSizes_es.html │ │ ├── nudb_en.html │ │ ├── nudb_es.html │ │ ├── peerPrivate_en.html │ │ ├── peerPrivate_es.html │ │ ├── purge_en.html │ │ ├── purge_es.html │ │ ├── rocksdb_en.html │ │ ├── rocksdb_es.html │ │ ├── serverProtocolsGrpc_en.html │ │ ├── serverProtocolsGrpc_es.html │ │ ├── serverProtocolsPeer_en.html │ │ ├── serverProtocolsPeer_es.html │ │ ├── serverProtocolsRpc_en.html │ │ ├── serverProtocolsRpc_es.html │ │ ├── serverProtocolsWsAdmin_en.html │ │ ├── serverProtocolsWsAdmin_es.html │ │ ├── serverProtocolsWsPublic_en.html │ │ ├── serverProtocolsWsPublic_es.html │ │ ├── serverProtocols_en.html │ │ ├── serverProtocols_es.html │ │ ├── serverTypes_en.html │ │ ├── serverTypes_es.html │ │ ├── signingSupport_en.html │ │ ├── signingSupport_es.html │ │ ├── ssd_en.html │ │ ├── ssd_es.html │ │ ├── sslClient_en.html │ │ ├── sslClient_es.html │ │ ├── sslServer_en.html │ │ ├── sslServer_es.html │ │ ├── standalone_en.html │ │ ├── standalone_es.html │ │ ├── step1_en.html │ │ ├── step1_es.html │ │ ├── step2_en.html │ │ ├── step2_es.html │ │ ├── step3_en.html │ │ ├── step3_es.html │ │ ├── step4_en.html │ │ ├── step4_es.html │ │ ├── step5_en.html │ │ ├── step5_es.html │ │ ├── step6_en.html │ │ ├── step6_es.html │ │ ├── testnet_en.html │ │ ├── testnet_es.html │ │ ├── validatorServer_en.html │ │ └── validatorServer_es.html │ ├── ledgerHistorySome_en.html │ ├── serverTypes_en.html │ ├── signingSupport_en.html │ ├── standalone_en.html │ └── txt │ │ ├── install_en.txt │ │ ├── install_es.txt │ │ ├── validator_en.txt │ │ └── validator_es.txt ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── img │ ├── xrp_symbol_black.svg │ └── xrp_symbol_white.svg ├── index.html ├── mstile-150x150.png ├── safari-pinned-tab.svg └── site.webmanifest ├── src ├── .env.ts ├── App.vue ├── assets │ ├── css │ │ └── popper.css │ ├── fonts │ │ ├── bebasneue.css │ │ ├── bebasneuebold.ttf │ │ ├── bebasneuebold.woff │ │ ├── bebasneuebold.woff2 │ │ ├── bebasneuebook.ttf │ │ ├── bebasneuebook.woff │ │ ├── bebasneuebook.woff2 │ │ ├── bebasneuelight.ttf │ │ ├── bebasneuelight.woff │ │ ├── bebasneuelight.woff2 │ │ ├── bebasneueregular.ttf │ │ ├── bebasneueregular.woff │ │ ├── bebasneueregular.woff2 │ │ ├── bebasneuethin.ttf │ │ ├── bebasneuethin.woff │ │ └── bebasneuethin.woff2 │ └── logo.png ├── components │ ├── custom │ │ ├── UiAlertIcon.vue │ │ ├── UiBox.vue │ │ ├── UiCheckbox.vue │ │ ├── UiDialog.vue │ │ ├── UiDropdown.vue │ │ ├── UiErrorBox.vue │ │ ├── UiErrorPopup.vue │ │ ├── UiHelpBox.vue │ │ ├── UiMultiSelect.vue │ │ ├── UiRadio.vue │ │ ├── UiRecommendations.vue │ │ ├── UiStepSection.vue │ │ ├── UiSteps.vue │ │ ├── UiSuccessPopup.vue │ │ ├── UiValidations.vue │ │ └── progress-loaders │ │ │ ├── UiLinearLoading.vue │ │ │ ├── UiPulseLoading.vue │ │ │ └── UiSpinnerWave.vue │ └── layout │ │ ├── AppContent.vue │ │ ├── AppFooter.vue │ │ └── AppHeader.vue ├── config │ ├── datetime.ts │ └── index.ts ├── directives │ ├── debounce.ts │ ├── index.ts │ └── numericOnly.ts ├── enums │ └── index.ts ├── i18n │ ├── index.ts │ └── locales │ │ ├── en.json │ │ ├── es.json │ │ └── zh-CN.json ├── layout │ ├── App.vue │ ├── Default.vue │ └── Result.vue ├── main.ts ├── models │ └── CfgModel.ts ├── output │ └── RippledCfg.vue ├── pages │ ├── NotFound.vue │ ├── Step1.vue │ ├── Step2.vue │ ├── Step3.vue │ ├── Step4.vue │ ├── Step5.vue │ └── Step6.vue ├── plugins │ ├── globalEventBus.ts │ └── index.ts ├── router │ ├── index.ts │ ├── middlewares.ts │ ├── routes.ts │ └── util.ts ├── scss │ ├── _defaults.scss │ ├── _fonts.scss │ ├── _global.scss │ ├── _helpers.scss │ ├── _medias.scss │ ├── _mixins.scss │ ├── _reset.scss │ ├── _util.scss │ ├── _variables.scss │ └── style.scss ├── services │ ├── __tests__ │ │ ├── fixtures │ │ │ ├── badJsonSchema.json │ │ │ ├── nudbServer.json │ │ │ ├── productionServerWithTinySize.json │ │ │ ├── validatorBroadcastAddress.json │ │ │ ├── validatorWithALotOfLedgers.json │ │ │ └── validatorWithRocksDB.json │ │ ├── instructions.test.ts │ │ ├── recommend.test.ts │ │ ├── rippled.test.ts │ │ └── validate.test.ts │ ├── instructions.ts │ ├── recommend.ts │ ├── rippled.ts │ └── validate.ts ├── shims-tsx.d.ts ├── shims-vue.d.ts ├── shims-vuex.d.ts ├── store │ └── index.ts ├── types │ ├── Config.ts │ ├── ConfigSection.ts │ ├── ProtocolConfig.ts │ ├── ProtocolProperties.ts │ ├── SelectOption.ts │ ├── ServerConfig.ts │ ├── SettingsConfig.ts │ ├── SslConfig.ts │ ├── State.ts │ └── StorageConfig.ts └── util │ ├── formUtils.ts │ └── navUtils.ts ├── tsconfig.json ├── vue-loader.conf.ts ├── vue.config.js ├── webpack.config.js └── yarn.lock /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not ie <= 8 4 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // https://eslint.org/docs/user-guide/configuring 2 | module.exports = { 3 | root: true, 4 | 5 | env: { 6 | node: true 7 | }, 8 | 9 | rules: { 10 | // allow paren-less arrow functions 11 | 'arrow-parens': 0, 12 | // allow async-await 13 | 'generator-star-spacing': 0, 14 | // allow variables like >> user_id 15 | camelcase: 0, 16 | 'no-trailing-spaces': [ 17 | 'error', { skipBlankLines: true } 18 | ], 19 | 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 20 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' 21 | }, 22 | 23 | parserOptions: { 24 | parser: '@typescript-eslint/parser' 25 | }, 26 | 27 | extends: [ 28 | 'plugin:vue/essential', 29 | '@vue/standard', 30 | '@vue/typescript' 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | # This is a basic workflow to help you get started with Actions 2 | 3 | name: CI 4 | 5 | # Controls when the action will run. 6 | on: 7 | # Triggers the workflow on push or pull request events but only for the main branch 8 | push: 9 | branches: [ main ] 10 | pull_request: 11 | branches: [ main ] 12 | 13 | # Allows you to run this workflow manually from the Actions tab 14 | workflow_dispatch: 15 | 16 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 17 | jobs: 18 | # This workflow contains a single job called "build" 19 | build: 20 | # The type of runner that the job will run on 21 | runs-on: ubuntu-latest 22 | 23 | # Steps represent a sequence of tasks that will be executed as part of the job 24 | steps: 25 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 26 | - uses: actions/checkout@v2 27 | 28 | - name: Set Node.js 18.x 29 | uses: actions/setup-node@v3 30 | with: 31 | node-version: 18.x 32 | 33 | - name: Run install 34 | uses: borales/actions-yarn@v4 35 | with: 36 | cmd: install 37 | 38 | # Runs e2e test scripts 39 | - name: Run e2e test scripts 40 | run: yarn test:e2e 41 | 42 | -------------------------------------------------------------------------------- /.github/workflows/greetings.yml: -------------------------------------------------------------------------------- 1 | name: Greetings 2 | 3 | on: [pull_request, issues] 4 | 5 | jobs: 6 | greeting: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/first-interaction@v1 10 | with: 11 | repo-token: ${{ secrets.GITHUB_TOKEN }} 12 | issue-message: 'Thanks for creating your first issue :-)' 13 | pr-message: 'Thanks for creating your first pull request :-)' 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | 4 | # local env files 5 | .env.local 6 | .env.*.local 7 | 8 | # Cypress 9 | screenshots 10 | videos 11 | out.js 12 | examples/*/cypress/logs 13 | examples/*/cypress/downloads 14 | snapshots.js 15 | .nyc_output 16 | coverage 17 | dist 18 | test-data.json 19 | 20 | # Log files 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | 25 | # Editor directories and files 26 | .idea 27 | .vscode 28 | *.suo 29 | *.ntvs* 30 | *.njsproj 31 | *.sln 32 | *.sw* 33 | 34 | # tmp 35 | _tmp/ 36 | tmp/ 37 | .tmp/ 38 | tmp_files/ 39 | 40 | # cypress 41 | cypress/videos 42 | cypress/screenshots 43 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [Unreleased] 9 | 10 | - WIP 11 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Thanks for considering a contribution to [xrpl-node-configurator](https://github.com/XRPLF/xrpl-node-configurator)! 4 | 5 | We're thrilled you're interested and your help is greatly appreciated. Contributing is a great way to learn about the [XRP Ledger](https://xrpl.org). We are happy to review your pull requests. To make the process as smooth as possible, please read this document and follow the stated guidelines. 6 | 7 | ## About This Project 8 | 9 | This project is built with [Vue.Js](https://vuejs.org/) and [Tailwindcss](https://tailwindcss.com), so you will need some knowledge on those frameworks. 10 | 11 | ## Requirements for a Successful Pull Request 12 | 13 | Before being considered for review or merging, each pull request must: 14 | 15 | - Follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) 16 | - Pass continuous e2e and unit tests. 17 | - Update documentation for any new features. 18 | - Be [marked as drafts](https://github.blog/2019-02-14-introducing-draft-pull-requests/) until they are ready for review. 19 | - Adhere to the [code of conduct](CODE_OF_CONDUCT.md) for this repository. 20 | 21 | ## Building 22 | 23 | The first thing you will have to do is to install all dependencies: 24 | 25 | ``` bash 26 | # clone repo 27 | git clone https://github.com/XRPLF/xrpl-node-configurator.git 28 | 29 | # install dependencies 30 | yarn install 31 | ``` 32 | 33 | If you want to test your changes locally you can execute: 34 | 35 | ``` bash 36 | # serve with hot reload at localhost:8080 37 | yarn dev 38 | ``` 39 | 40 | If you want to generate a build in the `dist` folder, just execute: 41 | 42 | ``` bash 43 | # build for production with minification 44 | yarn build 45 | ``` 46 | 47 | Tests: 48 | 49 | ``` bash 50 | # Unit tests 51 | yarn test:unit 52 | 53 | # End to end tests 54 | yarn test:e2e 55 | 56 | # Execute all (unit and e2e) tests 57 | yarn test:all 58 | ``` 59 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:latest as build-stage 2 | 3 | WORKDIR /app 4 | 5 | COPY package*.json ./ 6 | 7 | RUN yarn install 8 | 9 | COPY ./ . 10 | 11 | RUN yarn build 12 | 13 | FROM nginx as production-stage 14 | 15 | RUN mkdir /app 16 | 17 | COPY --from=build-stage /app/dist /app 18 | 19 | COPY ./cfg/system/nginx.conf /etc/nginx/nginx.conf 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 XRP Ledger Foundation (Official) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # XRPL Node Configurator 2 | 3 | Configuration tool that will produce a zip file with the following: 4 | 5 | - `config/rippled.cfg` file ready to be used with your `rippled` daemon. 6 | - `config/validators.txt` with information about Validators to be used. 7 | - `instructions.txt` with instructions on how to use the contents of the zip file. 8 | - `cfg.json` with the JSON configuration. 9 | 10 | ## Build Setup 11 | 12 | ``` bash 13 | # clone repo 14 | git clone https://github.com/XRPLF/xrpl-node-configurator.git 15 | 16 | # install dependencies 17 | yarn install 18 | 19 | # serve with hot reload at localhost:8080 20 | yarn dev 21 | 22 | # build for production with minification 23 | yarn build 24 | ``` 25 | 26 | ## Tests 27 | 28 | ### Unit Tests 29 | 30 | ```bash 31 | yarn test:unit 32 | ``` 33 | 34 | ### e2e Tests 35 | 36 | ```bash 37 | yarn test:e2e 38 | ``` 39 | 40 | ### All Tests 41 | 42 | ```bash 43 | yarn test:all 44 | ``` 45 | 46 | ## Deploying to Github Pages 47 | 48 | After building, this command will push the files inside the `dist` folder to Github so the content is displayed in Github Pages: 49 | 50 | ```bash 51 | yarn deploy:ghp 52 | ``` 53 | 54 | ## Github Pages site 55 | 56 | [xrplf.github.io/xrpl-node-configurator](https://xrplf.github.io/xrpl-node-configurator) 57 | 58 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /cfg/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "support": { 3 | "min": "1.7.0", 4 | "max": "1.7.0" 5 | }, 6 | "validatorKeysList": { 7 | "vl.devnet.rippletest.net": "EDDF2F53DFEC79358F7BE76BC884AC31048CFF6E2A00C628EAE06DB7750A247B12", 8 | "vl.altnet.rippletest.net": "ED264807102805220DA0F312E71FC2C69E1552C9C5790F6C25E3729DEB573D5860", 9 | "vl.ripple.com": "ED2677ABFFD1B33AC6FBC3062B71F1E8397C1505E1C42C64D11AD1B28FF73F4734", 10 | "vl.coil.com": "ED307A760EE34F2D0CAA103377B1969117C38B8AA0AA1E2A24DAC1F32FC97087ED", 11 | "vl.xrplf.org": "ED45D1840EE724BE327ABE9146503D5848EFD5F38B6D5FEDE71E80ACCE5E6E738B" 12 | }, 13 | "sites": { 14 | "devnet": [ 15 | "vl.devnet.rippletest.net" 16 | ], 17 | "testnet": [ 18 | "vl.altnet.rippletest.net" 19 | ], 20 | "mainnet": [ 21 | "vl.ripple.com", 22 | "vl.coil.com", 23 | "vl.xrplf.org" 24 | ] 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /cfg/defaultConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.9", 3 | "server": { 4 | "runAs": "allPurposeServer", 5 | "protocols": { 6 | "peer": { 7 | "enabled": true, 8 | "secure": false, 9 | "ip": "0.0.0.0", 10 | "port": 2459 11 | }, 12 | "wsPublic": { 13 | "enabled": false, 14 | "secure": false, 15 | "admin": "127.0.0.1", 16 | "ip": "0.0.0.0", 17 | "port": 6005 18 | }, 19 | "wsAdmin": { 20 | "enabled": false, 21 | "secure": false, 22 | "admin": "127.0.0.1", 23 | "ip": "0.0.0.0", 24 | "port": 6006 25 | }, 26 | "jsonRpc": { 27 | "enabled": false, 28 | "secure": false, 29 | "admin": "127.0.0.1", 30 | "ip": "0.0.0.0", 31 | "port": 5005 32 | }, 33 | "grpc": { 34 | "enabled": true, 35 | "ip": "0.0.0.0", 36 | "port": 50051 37 | } 38 | } 39 | }, 40 | "protocol": { 41 | "nodeSize": "tiny", 42 | "history": { 43 | "type": "some", 44 | "ledgers": 256 45 | }, 46 | "validators": { 47 | "type": "knownsites", 48 | "list": ["vl.ripple.com"] 49 | }, 50 | "network": "mainnet" 51 | }, 52 | "storage": { 53 | "ssd": false, 54 | "purge": { 55 | "online": { 56 | "enabled": true, 57 | "ledgers": 512 58 | }, 59 | "none": false, 60 | "advisory": true 61 | }, 62 | "database": { 63 | "type": "nudb", 64 | "path": "/var/lib/rippled/db", 65 | "bookKeepingPath": "/var/lib/rippled/db" 66 | } 67 | }, 68 | "ssl": { 69 | "client": { 70 | "verify": false, 71 | "filePath": null, 72 | "fileOrDirPath": null 73 | }, 74 | "server": { 75 | "enabled": false, 76 | "certPath": null, 77 | "keyPath": null 78 | } 79 | }, 80 | "settings": { 81 | "peer": { 82 | "private": false 83 | }, 84 | "connections": { 85 | "incoming": 500, 86 | "outgoing": 500 87 | }, 88 | "signing": { 89 | "support": false 90 | }, 91 | "log": { 92 | "level": "warning", 93 | "logFilePath": "/var/log/rippled/debug.log" 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /cfg/system/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes 1; 3 | error_log /var/log/nginx/error.log warn; 4 | pid /var/run/nginx.pid; 5 | events { 6 | worker_connections 1024; 7 | } 8 | http { 9 | include /etc/nginx/mime.types; 10 | default_type application/octet-stream; 11 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 12 | '$status $body_bytes_sent "$http_referer" ' 13 | '"$http_user_agent" "$http_x_forwarded_for"'; 14 | access_log /var/log/nginx/access.log main; 15 | sendfile on; 16 | keepalive_timeout 65; 17 | server { 18 | listen 3001; 19 | server_name localhost; 20 | location / { 21 | root /app; 22 | index index.html; 23 | try_files $uri $uri/ /index.html; 24 | } 25 | error_page 500 502 503 504 /50x.html; 26 | location = /50x.html { 27 | root /usr/share/nginx/html; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /commits.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | options: { 3 | preset: { 4 | name: 'conventionalcommits', 5 | types: [ 6 | { 7 | type: 'feat', 8 | section: 'Features' 9 | }, 10 | { 11 | type: 'fix', 12 | section: 'Bug Fixes' 13 | }, 14 | { 15 | type: 'perf', 16 | section: 'Performance Improvements' 17 | }, 18 | { 19 | type: 'revert', 20 | section: 'Reverts' 21 | }, 22 | { 23 | type: 'docs', 24 | section: 'Documentation' 25 | }, 26 | { 27 | type: 'style', 28 | section: 'Styles' 29 | }, 30 | { 31 | type: 'chore', 32 | section: 'Miscellaneous Chores' 33 | }, 34 | { 35 | type: 'refactor', 36 | section: 'Code Refactoring' 37 | }, 38 | { 39 | type: 'test', 40 | section: 'Tests' 41 | }, 42 | { 43 | type: 'build', 44 | section: 'Build System' 45 | }, 46 | { 47 | type: 'ci', 48 | section: 'Continuous Integration' 49 | } 50 | ] 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /cypress.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "host": "http://localhost:3001" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /cypress/integration/footer_spec.js: -------------------------------------------------------------------------------- 1 | describe('Footer', () => { 2 | const host = Cypress.env('host') 3 | it('It should change the JSON config when signing support is checked', () => { 4 | cy.visit(`${host}/#/settings`) 5 | cy.get('#signingSupport').check() 6 | cy.get('#exploreBtn').click() 7 | cy.get('#jsonCfg_textarea').invoke('val').then(value => { 8 | const json = JSON.parse(value) 9 | return json.settings.signing.support === true 10 | }) 11 | }) 12 | it('It should change the JSON config when signing support is unchecked', () => { 13 | cy.visit(`${host}/#/settings`) 14 | cy.get('#signingSupport').check() 15 | cy.get('#exploreBtn').click() 16 | cy.get('#jsonCfg_textarea').invoke('val').then(value => { 17 | const json = JSON.parse(value) 18 | return json.settings.signing.support === false 19 | }) 20 | }) 21 | it('It should change the JSON config when broadcast address is checked', () => { 22 | cy.visit(`${host}/#/settings`) 23 | cy.get('#peerPrivate').check() 24 | cy.get('#exploreBtn').click() 25 | cy.get('#jsonCfg_textarea').invoke('val').then(value => { 26 | const json = JSON.parse(value) 27 | return json.settings.peer.private === true 28 | }) 29 | }) 30 | it('It should change the JSON config when broadcast address is unchecked', () => { 31 | cy.visit(`${host}/#/settings`) 32 | cy.get('#peerPrivate').check() 33 | cy.get('#exploreBtn').click() 34 | cy.get('#jsonCfg_textarea').invoke('val').then(value => { 35 | const json = JSON.parse(value) 36 | return json.settings.peer.private === false 37 | }) 38 | }) 39 | }) 40 | -------------------------------------------------------------------------------- /cypress/integration/header_spec.js: -------------------------------------------------------------------------------- 1 | 2 | const version = require('../../lib/version') 3 | 4 | describe('Header', () => { 5 | const host = Cypress.env('host') 6 | it('Version should match with lib/version.js', () => { 7 | cy.visit(host) 8 | cy.get('#appVersion').invoke('text').then(value => { 9 | const v = value.replace('\n', '').trim() 10 | return v === version 11 | }) 12 | }) 13 | }) 14 | -------------------------------------------------------------------------------- /cypress/integration/step2_spec.js: -------------------------------------------------------------------------------- 1 | describe('Step 2', () => { 2 | const host = Cypress.env('host') 3 | it('It should load the 4 node sizes', () => { 4 | cy.visit(`${host}/#/protocol`) 5 | cy.get('#nodeSize option').should('have.length', 4) 6 | }) 7 | it('It should display a recommendation if ServerType=Validator & Size=small', () => { 8 | cy.visit(`${host}`) 9 | cy.get('#serverType').select('validatorServer') 10 | cy.visit(`${host}/#/protocol`) 11 | cy.get('#nodeSize').select('small') 12 | cy.get('#recommendations_rec0003').should('exist') 13 | }) 14 | it('It should display a recommendation if ServerType=Validator & Size=tiny', () => { 15 | cy.visit(`${host}`) 16 | cy.get('#serverType').select('validatorServer') 17 | cy.visit(`${host}/#/protocol`) 18 | cy.get('#nodeSize').select('tiny') 19 | cy.get('#recommendations_rec0003').should('exist') 20 | }) 21 | it('It should display a recommendation if ServerType=Validator & Size=medium', () => { 22 | cy.visit(`${host}`) 23 | cy.get('#serverType').select('validatorServer') 24 | cy.visit(`${host}/#/protocol`) 25 | cy.get('#nodeSize').select('medium') 26 | cy.get('#recommendations_rec0003').should('exist') 27 | }) 28 | it('It should not display a recommendation if ServerType!=Validator & Size!=huge', () => { 29 | cy.visit(`${host}`) 30 | cy.get('#serverType').select('apiServer') 31 | cy.visit(`${host}/#/protocol`) 32 | cy.get('#nodeSize').select('huge') 33 | cy.get('#recommendations_rec0003').should('not.exist') 34 | }) 35 | it('It should not display a recommendation if ServerType=Validator & Size=huge', () => { 36 | cy.visit(`${host}`) 37 | cy.get('#serverType').select('validatorServer') 38 | cy.visit(`${host}/#/protocol`) 39 | cy.get('#nodeSize').select('huge') 40 | cy.get('#recommendations_rec0003').should('not.exist') 41 | }) 42 | it('It should load the devnet site list if Network=DEV', () => { 43 | cy.visit(`${host}/#/protocol`) 44 | cy.get('#network').select('devnet') 45 | cy.get('#validatorSitesOptions option').should('have.length', 1) 46 | }) 47 | it('It should load the devnet site list if Network=TEST', () => { 48 | cy.visit(`${host}/#/protocol`) 49 | cy.get('#network').select('testnet') 50 | cy.get('#validatorSitesOptions option').should('have.length', 1) 51 | }) 52 | it('It should load the mainnet site list if Network=MAIN', () => { 53 | cy.visit(`${host}/#/protocol`) 54 | cy.get('#network').select('mainnet') 55 | cy.get('#validatorSitesOptions option').should('have.length', 3) 56 | }) 57 | }) 58 | -------------------------------------------------------------------------------- /cypress/integration/step3_spec.js: -------------------------------------------------------------------------------- 1 | describe('Step 3', () => { 2 | const host = Cypress.env('host') 3 | it('It should load the 2 database types', () => { 4 | cy.visit(`${host}/#/storage`) 5 | cy.get('#databaseType option').should('have.length', 2) 6 | }) 7 | it('It should display a recommendation if ServerType=Validator & Database!=RocksDB', () => { 8 | cy.visit(`${host}`) 9 | cy.get('#serverType').select('validatorServer') 10 | cy.visit(`${host}/#/storage`) 11 | cy.get('#databaseType').select('nudb') 12 | cy.get('#recommendations_rec0001').should('exist') 13 | }) 14 | it('It should not display a recommendation if ServerType=Validator & Database=RocksDB', () => { 15 | cy.visit(`${host}`) 16 | cy.get('#serverType').select('validatorServer') 17 | cy.visit(`${host}/#/storage`) 18 | cy.get('#databaseType').select('rocksdb') 19 | cy.get('#recommendations_rec0001').should('not.exist') 20 | }) 21 | it('It should not display a recommendation if ServerType!=Validator & Database=NuDB', () => { 22 | cy.visit(`${host}`) 23 | cy.get('#serverType').select('apiServer') 24 | cy.visit(`${host}/#/storage`) 25 | cy.get('#databaseType').select('nudb') 26 | cy.get('#recommendations_rec0001').should('not.exist') 27 | }) 28 | it('It should display a recommendation if Database=NuDB and SSD is not checked', () => { 29 | cy.visit(`${host}/#/storage`) 30 | cy.get('#databaseType').select('nudb') 31 | cy.get('#recommendations_rec0005').should('exist') 32 | }) 33 | it('It should not display a recommendation if Database=RocksDB and SSD is not checked', () => { 34 | cy.visit(`${host}/#/storage`) 35 | cy.get('#databaseType').select('rocksdb') 36 | cy.get('#recommendations_rec0005').should('not.exist') 37 | }) 38 | }) 39 | -------------------------------------------------------------------------------- /cypress/integration/step4_spec.js: -------------------------------------------------------------------------------- 1 | describe('Step 4', () => { 2 | const host = Cypress.env('host') 3 | it('It should display file and dir inputs if client verifications are checked', () => { 4 | cy.visit(`${host}/#/ssl`) 5 | cy.get('#sslClientVerify').check() 6 | cy.get('#sslVerifyDir').should('exist') 7 | cy.get('#sslVerifyFile').should('exist') 8 | }) 9 | it('It should not display file and dir inputs if client verifications are not checked', () => { 10 | cy.visit(`${host}/#/ssl`) 11 | cy.get('#sslClientVerify').uncheck() 12 | cy.get('#sslVerifyDir').should('not.exist') 13 | cy.get('#sslVerifyFile').should('not.exist') 14 | }) 15 | it('It should display certificate and key inputs if server tls is checked', () => { 16 | cy.visit(`${host}/#/ssl`) 17 | cy.get('#sslServer').check() 18 | cy.get('#sslServerCert').should('exist') 19 | cy.get('#sslServerKey').should('exist') 20 | }) 21 | it('It should not display certificate and key inputs if server tls is not checked', () => { 22 | cy.visit(`${host}/#/ssl`) 23 | cy.get('#sslServer').uncheck() 24 | cy.get('#sslServerCert').should('not.exist') 25 | cy.get('#sslServerKey').should('not.exist') 26 | }) 27 | }) 28 | -------------------------------------------------------------------------------- /cypress/integration/step5_spec.js: -------------------------------------------------------------------------------- 1 | describe('Step 5', () => { 2 | const host = Cypress.env('host') 3 | it('It should load the 5 log level types', () => { 4 | cy.visit(`${host}/#/settings`) 5 | cy.get('#logLevel option').should('have.length', 5) 6 | }) 7 | it('It should display a recommendation if ServerType=Validator & Broadcast Address=true', () => { 8 | cy.visit(`${host}`) 9 | cy.get('#serverType').select('validatorServer') 10 | cy.visit(`${host}/#/settings`) 11 | cy.get('#peerPrivate').check() 12 | cy.get('#recommendations_rec0004').should('exist') 13 | }) 14 | it('It should not display a recommendation if ServerType!=Validator & Broadcast Address=true', () => { 15 | cy.visit(`${host}`) 16 | cy.get('#serverType').select('apiServer') 17 | cy.visit(`${host}/#/settings`) 18 | cy.get('#peerPrivate').check() 19 | cy.get('#recommendations_rec0004').should('not.exist') 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /cypress/plugins/index.js: -------------------------------------------------------------------------------- 1 | /// 2 | // *********************************************************** 3 | // This example plugins/index.js can be used to load plugins 4 | // 5 | // You can change the location of this file or turn off loading 6 | // the plugins file with the 'pluginsFile' configuration option. 7 | // 8 | // You can read more here: 9 | // https://on.cypress.io/plugins-guide 10 | // *********************************************************** 11 | 12 | // This function is called when a project is opened or re-opened (e.g. due to 13 | // the project's config changing) 14 | 15 | /** 16 | * @type {Cypress.PluginConfig} 17 | */ 18 | module.exports = (on, config) => { 19 | // `on` is used to hook into various events Cypress emits 20 | // `config` is the resolved Cypress config 21 | } 22 | -------------------------------------------------------------------------------- /cypress/support/commands.js: -------------------------------------------------------------------------------- 1 | // *********************************************** 2 | // This example commands.js shows you how to 3 | // create various custom commands and overwrite 4 | // existing commands. 5 | // 6 | // For more comprehensive examples of custom 7 | // commands please read more here: 8 | // https://on.cypress.io/custom-commands 9 | // *********************************************** 10 | // 11 | // 12 | // -- This is a parent command -- 13 | // Cypress.Commands.add("login", (email, password) => { ... }) 14 | // 15 | // 16 | // -- This is a child command -- 17 | // Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) 18 | // 19 | // 20 | // -- This is a dual command -- 21 | // Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) 22 | // 23 | // 24 | // -- This will overwrite an existing command -- 25 | // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) 26 | -------------------------------------------------------------------------------- /cypress/support/index.js: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/index.js is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // Import commands.js using ES2015 syntax: 17 | import './commands' 18 | 19 | // Alternatively you can use CommonJS syntax: 20 | // require('./commands') 21 | -------------------------------------------------------------------------------- /global.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'raw-loader!*' 2 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: 'ts-jest', 3 | testEnvironment: 'node', 4 | moduleFileExtensions: ['ts', 'json', 'vue', 'js'], 5 | transform: { 6 | '^.+\\.vue$': 'vue-jest', 7 | '^.+\\.(js|jsx)?$': 'babel-jest' 8 | }, 9 | moduleNameMapper: { 10 | '^@/(.*)$': '/src/$1' 11 | }, 12 | transformIgnorePatterns: ['/node_modules/'] 13 | } 14 | -------------------------------------------------------------------------------- /lib/version.js: -------------------------------------------------------------------------------- 1 | // generated by genversion 2 | module.exports = '0.0.14' 3 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /public/README.md: -------------------------------------------------------------------------------- 1 | # XRPL Node Configurator UI 2 | 3 | Configuration tool that will produce the required config files ready to be used with your server. 4 | 5 | ## Github pages version 6 | 7 | [xrplf.github.io/xrpl-node-configurator](http://xrplf.github.io/xrpl-node-configurator) 8 | -------------------------------------------------------------------------------- /public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #2b5797 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/content/html/advisoryDeletion_en.html: -------------------------------------------------------------------------------- 1 |

Advisory Deletion

2 |
3 |

4 | If the config file does not specify an online_delete interval, online deletion does not occur. If config file enables the advisory_delete setting, online deletion only happens when an administrator triggers it using the can_delete method. 5 |

6 |

7 | You can use advisory deletion with a scheduled job to trigger automatic deletion based on clock time instead of the number of ledger versions closed. If your server is heavily used, the extra load from online deletion can cause your server to fall behind and temporarily de-sync from the consensus network. If this is the case, you can use advisory deletion and schedule online deletion to happen only during off-peak times. 8 |

9 |

10 | You can use advisory deletion for other reasons. For example, you may want to manually confirm that transaction data is backed up to a separate server before deleting it. Alternatively, you may want to manually confirm that a separate task has finished processing transaction data before you delete that data. 11 |

12 |
13 | -------------------------------------------------------------------------------- /public/content/html/advisoryDeletion_es.html: -------------------------------------------------------------------------------- 1 |

Advisory Deletion

2 |
3 |

4 | If the config file does not specify an online_delete interval, online deletion does not occur. If config file enables the advisory_delete setting, online deletion only happens when an administrator triggers it using the can_delete method. 5 |

6 |

7 | You can use advisory deletion with a scheduled job to trigger automatic deletion based on clock time instead of the number of ledger versions closed. If your server is heavily used, the extra load from online deletion can cause your server to fall behind and temporarily de-sync from the consensus network. If this is the case, you can use advisory deletion and schedule online deletion to happen only during off-peak times. 8 |

9 |

10 | You can use advisory deletion for other reasons. For example, you may want to manually confirm that transaction data is backed up to a separate server before deleting it. Alternatively, you may want to manually confirm that a separate task has finished processing transaction data before you delete that data. 11 |

12 |
13 | -------------------------------------------------------------------------------- /public/content/html/allPurposeServer_en.html: -------------------------------------------------------------------------------- 1 |

All-purpose Server

2 |
3 | 12 |
13 | -------------------------------------------------------------------------------- /public/content/html/allPurposeServer_es.html: -------------------------------------------------------------------------------- 1 |

Servidor multifunción

2 |
3 | 17 |
18 | -------------------------------------------------------------------------------- /public/content/html/apiServer_en.html: -------------------------------------------------------------------------------- 1 |

API Server

2 |
3 |

An API Server runs a public API, it is not a validator. 4 |

5 | 14 |
15 | -------------------------------------------------------------------------------- /public/content/html/apiServer_es.html: -------------------------------------------------------------------------------- 1 |

Servidor de API dedicado

2 |
3 |

Un servidor de API expone una API pública, no es un validador. 4 |

5 | 23 |
24 | -------------------------------------------------------------------------------- /public/content/html/automaticPurge_en.html: -------------------------------------------------------------------------------- 1 |

Automatic Purge

2 |
3 |

4 | The online deletion feature lets the rippled server delete the server's local copy of old ledger versions to keep disk usage from rapidly growing over time. The default config file sets online deletion to run automatically, but online deletion can also be configured to run only when prompted. New in: rippled 0.27.0 5 |

6 |

7 | The server always keeps the complete current state of the ledger, with all the balances and settings it contains. The deleted data includes older transactions and versions of the ledger state that are older than the stored history. 8 |

9 | 18 |
19 | 20 | -------------------------------------------------------------------------------- /public/content/html/automaticPurge_es.html: -------------------------------------------------------------------------------- 1 |

Automatic Purge

2 |
3 |

4 | The online deletion feature lets the rippled server delete the server's local copy of old ledger versions to keep disk usage from rapidly growing over time. The default config file sets online deletion to run automatically, but online deletion can also be configured to run only when prompted. New in: rippled 0.27.0 5 |

6 |

7 | The server always keeps the complete current state of the ledger, with all the balances and settings it contains. The deleted data includes older transactions and versions of the ledger state that are older than the stored history. 8 |

9 | 18 |
19 | 20 | -------------------------------------------------------------------------------- /public/content/html/bookKeepingDatabases_en.html: -------------------------------------------------------------------------------- 1 |

Bookkeeping Databases

2 |
3 |

rippled creates 4 SQLite database to hold bookkeeping information 4 | about transactions, local credentials, and various other things. 5 |

6 |

It also creates the NodeDB, which holds all the objects that 7 | make up the current and historical ledgers. 8 |

9 |

The size of the NodeDB 10 | grows in proportion to the amount of new data and the amount of 11 | historical data (a configurable setting). 12 |

13 |
14 | -------------------------------------------------------------------------------- /public/content/html/bookKeepingDatabases_es.html: -------------------------------------------------------------------------------- 1 |

Bookkeeping Databases

2 |
3 |

rippled creates 4 SQLite database to hold bookkeeping information 4 | about transactions, local credentials, and various other things. 5 |

6 |

It also creates the NodeDB, which holds all the objects that 7 | make up the current and historical ledgers. 8 |

9 |

The size of the NodeDB 10 | grows in proportion to the amount of new data and the amount of 11 | historical data (a configurable setting). 12 |

13 |
14 | -------------------------------------------------------------------------------- /public/content/html/connections_en.html: -------------------------------------------------------------------------------- 1 |

Incoming and Outgoing Connections

2 |
3 |

You can set the limit for the outbound/inbound connections for your XRP Ledger node.

4 |

For outgoing connections the minumum is 10 and the maximum is 1,000.

5 |

For incoming connections the minumum is 0 and the maximum is 1,000.

6 |
7 | -------------------------------------------------------------------------------- /public/content/html/connections_es.html: -------------------------------------------------------------------------------- 1 |

Conexiones entrantes y salientes

2 |
3 |

Puedes configurar el límite de conexiones entrantes y salientes en tu nodo de XRP Ledger.

4 |

Para salientes el mínimo es 10 y el máximo 1,000.

5 |

Para entrantes el mínimo es 0 y el máximo 1,000.

6 |
7 | -------------------------------------------------------------------------------- /public/content/html/databaseTypes_en.html: -------------------------------------------------------------------------------- 1 |

Database Types

2 |
3 |

rippled creates 4 SQLite databases to hold bookkeeping information 4 | about transactions, local credentials, and various other things. 5 |

6 |

It also creates the NodeDB, which holds all the objects that 7 | make up the current and historical ledgers. 8 |

9 |

10 | The size of the NodeDB grows in proportion to the amount of new data and the 11 | amount of historical data (a configurable setting) so the performance of the 12 | underlying storage media where the NodeDB is placed can significantly affect 13 | the performance of the server.

14 |
15 | -------------------------------------------------------------------------------- /public/content/html/databaseTypes_es.html: -------------------------------------------------------------------------------- 1 |

Database Types

2 |
3 |

rippled creates 4 SQLite databases to hold bookkeeping information 4 | about transactions, local credentials, and various other things. 5 |

6 |

It also creates the NodeDB, which holds all the objects that 7 | make up the current and historical ledgers. 8 |

9 |

10 | The size of the NodeDB grows in proportion to the amount of new data and the 11 | amount of historical data (a configurable setting) so the performance of the 12 | underlying storage media where the NodeDB is placed can significantly affect 13 | the performance of the server.

14 |
15 | -------------------------------------------------------------------------------- /public/content/html/developmentServer_en.html: -------------------------------------------------------------------------------- 1 |

Development Server

2 |
3 | 12 |
13 | -------------------------------------------------------------------------------- /public/content/html/developmentServer_es.html: -------------------------------------------------------------------------------- 1 |

Servidor para Desarrollo

2 |
3 | 22 |
23 | -------------------------------------------------------------------------------- /public/content/html/devnet_en.html: -------------------------------------------------------------------------------- 1 |

DevNet

2 |
3 |

A preview of coming attractions, where unstable changes to the core XRP Ledger software may be tested out. Developers can use this altnet to interact with and learn about planned new XRP Ledger features and amendments that are not yet enabled on the Mainnet.

4 |

Testnet and Devnet each have their own separate supply of test XRP, which Ripple gives away for free to parties interested in experimenting with the XRP Ledger and developing applications and integrations. Test XRP does not have real-world value and is lost when the network is reset.

5 |

6 | TestNet Faucet 7 |

8 |
9 | -------------------------------------------------------------------------------- /public/content/html/devnet_es.html: -------------------------------------------------------------------------------- 1 |

DevNet

2 |
3 |

A preview of coming attractions, where unstable changes to the core XRP Ledger software may be tested out. Developers can use this altnet to interact with and learn about planned new XRP Ledger features and amendments that are not yet enabled on the Mainnet.

4 |

Testnet and Devnet each have their own separate supply of test XRP, which Ripple gives away for free to parties interested in experimenting with the XRP Ledger and developing applications and integrations. Test XRP does not have real-world value and is lost when the network is reset.

5 |

6 | TestNet Faucet 7 |

8 |
9 | -------------------------------------------------------------------------------- /public/content/html/fullHistoryServer_en.html: -------------------------------------------------------------------------------- 1 |

Full History Server

2 |
3 |

This server has special hardware specs that make it capable of storing the entire history of the XRP Ledger. That means it’s not cheap and replacements cannot be easily brought online because full history is too large to quickly acquire/copy into a new instance. 4 |

5 |
6 | -------------------------------------------------------------------------------- /public/content/html/fullHistoryServer_es.html: -------------------------------------------------------------------------------- 1 |

Servidor con historia completa

2 |
3 |

Este servidor tiene requisitos de hardware speciales ya que tiene que tener la capacidad de almacenar 4 | la historia completa del XRP Ledger. 5 |
6 | Eso significa un coste mayor y nuevas copias toman su tiempo ya que el coste de adquirir la historia 7 | completa toma su tiempo. 8 |

9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /public/content/html/hubServer_en.html: -------------------------------------------------------------------------------- 1 |

Hub Server

2 |
3 |

A Hub server is designed to help connectivity with the network; requires a good network connection. Should set the limit on the peer connection to a bigger number.

4 | 13 |
14 | -------------------------------------------------------------------------------- /public/content/html/hubServer_es.html: -------------------------------------------------------------------------------- 1 |

Servidor Hub

2 |
3 |

La principal misión de un Servidor Hub es mejorar la conectividad en la red; requiere una buena conexión de red. 4 | Su límite de conexiones a otros nodos es mayor que la de otros nodos.

5 | 19 |
20 | -------------------------------------------------------------------------------- /public/content/html/ledgerHistoryFull_en.html: -------------------------------------------------------------------------------- 1 |

Full History

2 |
3 |

Some servers in the XRP Ledger network are configured as "full-history" servers. These servers, which require significantly more disk space than other tracking servers, collect all available XRP Ledger history and do not use online deletion.

12 | -------------------------------------------------------------------------------- /public/content/html/ledgerHistoryFull_es.html: -------------------------------------------------------------------------------- 1 |

Full History

2 |
3 |

Some servers in the XRP Ledger network are configured as "full-history" servers. These servers, which require significantly more disk space than other tracking servers, collect all available XRP Ledger history and do not use online deletion.

12 | -------------------------------------------------------------------------------- /public/content/html/ledgerHistoryNone_en.html: -------------------------------------------------------------------------------- 1 |

No History

2 |
3 |

Servers that don't need to serve clients can set this to "none".

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/ledgerHistoryNone_es.html: -------------------------------------------------------------------------------- 1 |

No History

2 |
3 |

Servers that don't need to serve clients can set this to "none".

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/ledgerHistorySome_en.html: -------------------------------------------------------------------------------- 1 |

Some History

2 |
3 |

The server can backfill history from before it became synced, as well as filling in any gaps in the history it has collected after syncing. (Gaps in ledger history can occur if a server temporarily becomes too busy to keep up with the network, loses its network connection, or suffers other temporary issues.) To backfill history, the server requests data from its peer rippled servers. The amount the server tries to backfill is defined by the [ledger_history] setting.

4 |

If online deletion and advisory deletion are both enabled, the server automatically backfills data up to the oldest ledger it has not been allowed to delete yet. This can fetch data beyond the number of ledger versions configured in the [ledger_history] and online_delete settings. The can_delete method tells the server what ledger versions it is allowed to delete.

5 |
6 | -------------------------------------------------------------------------------- /public/content/html/ledgerHistorySome_es.html: -------------------------------------------------------------------------------- 1 |

Some History

2 |
3 |

The server can backfill history from before it became synced, as well as filling in any gaps in the history it has collected after syncing. (Gaps in ledger history can occur if a server temporarily becomes too busy to keep up with the network, loses its network connection, or suffers other temporary issues.) To backfill history, the server requests data from its peer rippled servers. The amount the server tries to backfill is defined by the [ledger_history] setting.

4 |

If online deletion and advisory deletion are both enabled, the server automatically backfills data up to the oldest ledger it has not been allowed to delete yet. This can fetch data beyond the number of ledger versions configured in the [ledger_history] and online_delete settings. The can_delete method tells the server what ledger versions it is allowed to delete.

5 |
6 | -------------------------------------------------------------------------------- /public/content/html/ledgerHistory_en.html: -------------------------------------------------------------------------------- 1 |

Ledger History

2 |
3 |

The consensus process creates a chain of validated ledger versions, each derived from the previous one by applying a set of transactions. Every rippled server stores ledger versions and transaction history locally. The amount of transaction history a server stores depends on how long that server has been online and how much history it is configured to fetch and keep.

4 |

Servers in the peer-to-peer XRP Ledger network share transactions and other data with each other as part of the consensus process. Each server independently builds each new ledger version and compares results with its trusted validators to ensure consistency. (If a consensus of trusted validators disagrees with a server's results, that server fetches the necessary data from its peers to achieve consistency.) Servers can download older data from their peers to fill gaps in their available history.

5 | 14 |
15 | -------------------------------------------------------------------------------- /public/content/html/ledgerHistory_es.html: -------------------------------------------------------------------------------- 1 |

Ledger History

2 |
3 |

The consensus process creates a chain of validated ledger versions, each derived from the previous one by applying a set of transactions. Every rippled server stores ledger versions and transaction history locally. The amount of transaction history a server stores depends on how long that server has been online and how much history it is configured to fetch and keep.

4 |

Servers in the peer-to-peer XRP Ledger network share transactions and other data with each other as part of the consensus process. Each server independently builds each new ledger version and compares results with its trusted validators to ensure consistency. (If a consensus of trusted validators disagrees with a server's results, that server fetches the necessary data from its peers to achieve consistency.) Servers can download older data from their peers to fill gaps in their available history.

5 | 14 |
15 | -------------------------------------------------------------------------------- /public/content/html/log_en.html: -------------------------------------------------------------------------------- 1 |

Logs

2 |
3 |

Check the following link for more info on logs: 4 |
5 | Understanding Log Messages 6 |

7 |
8 | -------------------------------------------------------------------------------- /public/content/html/log_es.html: -------------------------------------------------------------------------------- 1 |

Logs

2 |
3 |

Visita el siguiente link para mas información sobre logs en el XRP Ledger: 4 |
5 | (En Inglés) Understanding Log Messages 6 |

7 |
8 | -------------------------------------------------------------------------------- /public/content/html/mainnet_en.html: -------------------------------------------------------------------------------- 1 |

MainNet

2 |
3 |

The XRP Ledger, a decentralized cryptographic ledger powered by a network of peer-to-peer servers and the home of XRP.

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/mainnet_es.html: -------------------------------------------------------------------------------- 1 |

MainNet

2 |
3 |

The XRP Ledger, a decentralized cryptographic ledger powered by a network of peer-to-peer servers and the home of XRP.

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/manualPurge_en.html: -------------------------------------------------------------------------------- 1 |

Manual Purge

2 |
3 |

Content TBD.

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/manualPurge_es.html: -------------------------------------------------------------------------------- 1 |

Manual Purge

2 |
3 |

Content TBD.

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/networkAndValidators_en.html: -------------------------------------------------------------------------------- 1 |

Network

2 |
3 |

There is one production XRP Ledger peer-to-peer network, and all business that takes place on the XRP Ledger occurs within the production network—the Mainnet. 4 |
To help members of the XRP Ledger community interact with XRP Ledger technology without affecting anything on the Mainnet, Ripple hosts two alternative networks, or altnets: the Testnet and the Devnet.

5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
NetworkUpgrade CadenceDescription
MainnetStable releasesThe XRP Ledger, a decentralized cryptographic ledger powered by a network of peer-to-peer servers and the home of XRP.
TestnetStable releasesAn "alternate universe" network that acts as a testing ground for software built on the XRP Ledger.
DevnetBeta releasesA preview of coming attractions, where unstable changes to the core XRP Ledger software may be tested out.
31 |
32 | -------------------------------------------------------------------------------- /public/content/html/networkAndValidators_es.html: -------------------------------------------------------------------------------- 1 |

Network

2 |
3 |

There is one production XRP Ledger peer-to-peer network, and all business that takes place on the XRP Ledger occurs within the production network—the Mainnet. 4 |
To help members of the XRP Ledger community interact with XRP Ledger technology without affecting anything on the Mainnet, Ripple hosts two alternative networks, or altnets: the Testnet and the Devnet.

5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
NetworkUpgrade CadenceDescription
MainnetStable releasesThe XRP Ledger, a decentralized cryptographic ledger powered by a network of peer-to-peer servers and the home of XRP.
TestnetStable releasesAn "alternate universe" network that acts as a testing ground for software built on the XRP Ledger.
DevnetBeta releasesA preview of coming attractions, where unstable changes to the core XRP Ledger software may be tested out.
31 |
32 | -------------------------------------------------------------------------------- /public/content/html/network_en.html: -------------------------------------------------------------------------------- 1 |

Networks

2 |
3 |

Content TBD.

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/network_es.html: -------------------------------------------------------------------------------- 1 |

Networks

2 |
3 |

Content TBD.

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/nodeSizes_en.html: -------------------------------------------------------------------------------- 1 |

Node sizes

2 |
3 |

It is recommended that you always use the largest node size your available RAM can support. See the following table for recommended settings.

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 |
RAM for ripplednode_size valueNotes
< 8GBtinyNot recommended for testing or production servers.
8GBsmallRecommended for test servers.
16GBmedium
32GBhugeRecommended for production servers.
35 | 44 |
45 | -------------------------------------------------------------------------------- /public/content/html/nodeSizes_es.html: -------------------------------------------------------------------------------- 1 |

Node sizes

2 |
3 |

It is recommended that you always use the largest node size your available RAM can support. See the following table for recommended settings.

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 |
RAM for ripplednode_size valueNotes
< 8GBtinyNot recommended for testing or production servers.
8GBsmallRecommended for test servers.
16GBmedium
32GBhugeRecommended for production servers.
35 | 44 |
45 | -------------------------------------------------------------------------------- /public/content/html/nudb_en.html: -------------------------------------------------------------------------------- 1 |

NuDB

2 |
3 |

NuDB is a high-performance database written by Ripple Labs and optimized 4 | for rippled and solid-state drives. 5 |

6 |

7 | NuDB maintains its high speed regardless of the amount of history 8 | stored. Online delete may be selected, but is not required. NuDB is 9 | available on all platforms that rippled runs on. 10 |

11 |
12 | -------------------------------------------------------------------------------- /public/content/html/nudb_es.html: -------------------------------------------------------------------------------- 1 |

NuDB

2 |
3 |

NuDB is a high-performance database written by Ripple Labs and optimized 4 | for rippled and solid-state drives. 5 |

6 |

7 | NuDB maintains its high speed regardless of the amount of history 8 | stored. Online delete may be selected, but is not required. NuDB is 9 | available on all platforms that rippled runs on. 10 |

11 |
12 | -------------------------------------------------------------------------------- /public/content/html/peerPrivate_en.html: -------------------------------------------------------------------------------- 1 |

Broadcasting your address

2 |
3 |

A private server is an XRPL Ledger server that connects to the network only through specific, trusted peers instead of connecting directly to discovered peers in the open peer-to-peer network. This kind of configuration is an optional precaution most commonly recommended for validators, but it can be useful for other specific purposes.

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/peerPrivate_es.html: -------------------------------------------------------------------------------- 1 |

Emitir tu dirección

2 |
3 |

Un servidor privado es un nodo de XRPL Ledger que conecta a la red solo a través 4 | otros nodos confiados y específicos en vez de conectar directamente a cualquier nodo 5 | que encuentre. 6 |
7 | Este tipo de configuración una precaución opcional principalmente recomendada para nodos Validadores aunque 8 | puede ser útil para servidores con otros propósitos. 9 |

10 |
11 | -------------------------------------------------------------------------------- /public/content/html/purge_en.html: -------------------------------------------------------------------------------- 1 |

Automatic Data Purge

2 |
3 |

In its default configuration, the rippled server automatically deletes outdated history of XRP Ledger state and transactions as new ledger versions become available. 4 | This is sufficient for most servers, which do not need older history to know the current state and process transactions. However, it can be useful for the network if some servers provide as much history of the XRP Ledger as possible.

5 |
6 | 16 |

Advisory Deletion

17 |
18 |

19 | You can use advisory deletion with a scheduled job to trigger automatic deletion based on clock time instead of the number of ledger versions closed. 20 |

21 |
22 | 23 | -------------------------------------------------------------------------------- /public/content/html/purge_es.html: -------------------------------------------------------------------------------- 1 |

Purgado de datos automatico

2 |
3 |

In its default configuration, the rippled server automatically deletes outdated history of XRP Ledger state and transactions as new ledger versions become available. 4 | This is sufficient for most servers, which do not need older history to know the current state and process transactions. However, it can be useful for the network if some servers provide as much history of the XRP Ledger as possible.

5 |
6 | 16 |

Advisory Deletion

17 |
18 |

19 | You can use advisory deletion with a scheduled job to trigger automatic deletion based on clock time instead of the number of ledger versions closed. 20 |

21 |
22 | 23 | -------------------------------------------------------------------------------- /public/content/html/rocksdb_en.html: -------------------------------------------------------------------------------- 1 |

RocksDB

2 |
3 |

RocksDB is an open-source, general-purpose key/value store - see 4 | rocksdb.org for more details. 5 |

6 |

7 | RocksDB is an alternative backend for systems that don't use solid-state 8 | drives. Because RocksDB's performance degrades as it stores more data, 9 | keeping full history is not advised, and using online delete is 10 | recommended. 11 |

12 |
13 | -------------------------------------------------------------------------------- /public/content/html/rocksdb_es.html: -------------------------------------------------------------------------------- 1 |

RocksDB

2 |
3 |

RocksDB is an open-source, general-purpose key/value store - see 4 | rocksdb.org for more details. 5 |

6 |

7 | RocksDB is an alternative backend for systems that don't use solid-state 8 | drives. Because RocksDB's performance degrades as it stores more data, 9 | keeping full history is not advised, and using online delete is 10 | recommended. 11 |

12 |
13 | -------------------------------------------------------------------------------- /public/content/html/serverProtocolsGrpc_en.html: -------------------------------------------------------------------------------- 1 |

gPRC

2 |
The rippled server has an experimental gRPC API . Currently, this API provides a subset of the full rippled API. You can enable the gRPC API on your server with a new configuration stanza.
3 | 12 | -------------------------------------------------------------------------------- /public/content/html/serverProtocolsGrpc_es.html: -------------------------------------------------------------------------------- 1 |

gPRC

2 |
The rippled server has an experimental gRPC API . Currently, this API provides a subset of the full rippled API. You can enable the gRPC API on your server with a new configuration stanza.
3 | 12 | -------------------------------------------------------------------------------- /public/content/html/serverProtocolsPeer_en.html: -------------------------------------------------------------------------------- 1 |

Peer

2 |
3 |

4 | Peer Protocol implements the Ripple Payment protocol. It is over peer connections that transactions 5 | and validations are passed from to machine to machine, to determine the 6 | contents of validated ledgers. 7 |

8 |

9 | In Stand-alone mode these settings will not be taken into account. 10 |

11 |
12 | -------------------------------------------------------------------------------- /public/content/html/serverProtocolsPeer_es.html: -------------------------------------------------------------------------------- 1 |

Peer

2 |
3 |

4 | Peer Protocol implements the Ripple Payment protocol. It is over peer connections that transactions 5 | and validations are passed from to machine to machine, to determine the 6 | contents of validated ledgers. 7 |

8 |

9 | In Stand-alone mode these settings will not be taken into account. 10 |

11 |
12 | -------------------------------------------------------------------------------- /public/content/html/serverProtocolsRpc_en.html: -------------------------------------------------------------------------------- 1 |

JSON-RPC

2 |
You can use any HTTP client (like RESTED for Firefox , Postman for Chrome or Online HTTP client ExtendsClass ) to make JSON-RPC calls a rippled server. Most programming languages have a library for making HTTP requests built in.
3 | -------------------------------------------------------------------------------- /public/content/html/serverProtocolsRpc_es.html: -------------------------------------------------------------------------------- 1 |

JSON-RPC

2 |
You can use any HTTP client (like RESTED for Firefox , Postman for Chrome or Online HTTP client ExtendsClass ) to make JSON-RPC calls a rippled server. Most programming languages have a library for making HTTP requests built in.
3 | -------------------------------------------------------------------------------- /public/content/html/serverProtocolsWsAdmin_en.html: -------------------------------------------------------------------------------- 1 |

Websockets Admin

2 |
Admin level API commands over Secure Websockets
3 | -------------------------------------------------------------------------------- /public/content/html/serverProtocolsWsAdmin_es.html: -------------------------------------------------------------------------------- 1 |

Websockets Admin

2 |
Admin level API commands over Secure Websockets
3 | -------------------------------------------------------------------------------- /public/content/html/serverProtocolsWsPublic_en.html: -------------------------------------------------------------------------------- 1 |

Websockets Public

2 |
WebSocket follows a model where the client and server establish one connection, then send messages both ways through the same connection, which remains open until explicitly closed (or until the connection fails). This is in contrast to the HTTP-based API model (including JSON-RPC and RESTful APIs), where the client opens and closes a new connection for each request.¹
3 | -------------------------------------------------------------------------------- /public/content/html/serverProtocolsWsPublic_es.html: -------------------------------------------------------------------------------- 1 |

Websockets Public

2 |
WebSocket follows a model where the client and server establish one connection, then send messages both ways through the same connection, which remains open until explicitly closed (or until the connection fails). This is in contrast to the HTTP-based API model (including JSON-RPC and RESTful APIs), where the client opens and closes a new connection for each request.¹
3 | -------------------------------------------------------------------------------- /public/content/html/serverProtocols_en.html: -------------------------------------------------------------------------------- 1 |

Server Protocols

2 |
3 |

Only one port may be configured to support the peer protocol.

4 |

A port cannot have websocket and non websocket protocols at the same time. It is possible have both Websockets and Secure Websockets together in one port.

5 | 14 |
15 | -------------------------------------------------------------------------------- /public/content/html/serverProtocols_es.html: -------------------------------------------------------------------------------- 1 |

Server Protocols

2 |
3 |

Only one port may be configured to support the peer protocol.

4 |

A port cannot have websocket and non websocket protocols at the same time. It is possible have both Websockets and Secure Websockets together in one port.

5 | 14 |
15 | -------------------------------------------------------------------------------- /public/content/html/serverTypes_en.html: -------------------------------------------------------------------------------- 1 |

Server Modes

2 |
3 |

The rippled server software can run in several modes depending on its configuration, including: 4 |

5 |
    6 |
  • All-purpose server
  • 7 |
  • Validating server, or validator for short
  • 8 |
  • Hub server
  • 9 |
  • Full History server
  • 10 |
  • Development server
  • 11 |
12 |

13 | You can also run the rippled executable as a client application for accessing rippled APIs locally. (Two instances of the same binary can run side-by-side in this case; one as a server, and the other running briefly as a client and then terminating.) 14 |

15 |

16 | For information on the commands to run rippled in each of these modes, see the Commandline Reference .

17 |

18 |
19 | -------------------------------------------------------------------------------- /public/content/html/serverTypes_es.html: -------------------------------------------------------------------------------- 1 |

Tipos de Servidor

2 |
3 |

El software del XRP Ledger puede ser configurado de diferentes maneras dependiendo de las 4 | necesidades, entra otras: 5 |

6 |
    7 |
  • Servidor Multifuncion
  • 8 |
  • Validador Dedicado
  • 9 |
  • Servidor Hub
  • 10 |
  • Servidor con historia complete
  • 11 |
  • Servidor API dedicado
  • 12 |
  • Server para desarrollo
  • 13 |
14 |

15 | Tambien puedes utilizar el ejecutable del XRP Ledger como aplicacion de cliente para acceder 16 | las APIs de manera local.

17 |

18 | Para mas información sobre los comandos que pueden ser ejecutados en cada modo, visita la sección de 19 | (En Inglés) Commandline Reference . 20 |

21 |
22 | -------------------------------------------------------------------------------- /public/content/html/signingSupport_en.html: -------------------------------------------------------------------------------- 1 |

Signing Support

2 |
3 |

By default, the signing methods for rippled are limited to administrative connections. If you want to allow signing methods to be used as public API methods, you can enable it with a configuration change.

4 |

This enables the following methods to be used on "public" JSON-RPC and WebSocket connections, if your server accepts them:

5 |
    6 |
  • sign
  • 7 |
  • sign_for
  • 8 |
  • submit (in "sign-and-submit" mode)
  • 9 |
10 |

11 | You do not need to enable public signing to use these methods from an admin connection. 12 |

13 | 22 |
23 | -------------------------------------------------------------------------------- /public/content/html/signingSupport_es.html: -------------------------------------------------------------------------------- 1 |

Firma de transacciones

2 |
3 |

Por defecto, los metodos para firma transacciones que ofrece el XRP Ledger son reservados para conexiones 4 | tipo admin. Si quieres permitir estos metodos de una manera abierta puedes hacerlo con este cambio 5 | en la configuración.

6 |

Este ajuste activará los siguientes métodos para ser utilizados desde conexiones JSON-RPC y WebSocket si tu servidor las acepta:

7 |
    8 |
  • sign
  • 9 |
  • sign_for
  • 10 |
  • submit (en modo "sign-and-submit")
  • 11 |
12 |

13 | No necesitas habilitar estos métodos desde una conexión admin. 14 |

15 | 28 |
29 | -------------------------------------------------------------------------------- /public/content/html/ssd_en.html: -------------------------------------------------------------------------------- 1 | 2 |

SSD

3 |
4 |

NuDB is an append-only key-value store that is optimized for SSD drives. 5 |

6 | NuDB has nearly constant performance and memory footprints regardless of the amount of data being stored. NuDB requires a solid-state drive, but uses much less RAM than RocksDB to access a large database. 7 |

8 | Non-validator production servers should be configured to use NuDB and to store the amount of historical data required for the use case. 9 |

10 |
11 | 12 | -------------------------------------------------------------------------------- /public/content/html/ssd_es.html: -------------------------------------------------------------------------------- 1 | 2 |

SSD

3 |
4 |

NuDB es un almacén de valor-clave de solo adición que está optimizado para unidades SSD. 5 |

6 | NuDB tiene un rendimiento y una huella de memoria casi constantes, independientemente de la cantidad de datos que se almacenen. NuDB requiere una unidad de estado sólido, pero usa mucha menos RAM que RocksDB para acceder a una gran base de datos. 7 |

8 | Los servidores de producción que no son validadores deben configurarse para usar NuDB y almacenar la cantidad de datos históricos necesarios para el caso de uso. 9 |

10 |
11 | 12 | -------------------------------------------------------------------------------- /public/content/html/sslClient_en.html: -------------------------------------------------------------------------------- 1 |

SSL Client

2 |
3 |

The XRP Ledger server instance uses HTTPS GET requests in a variety of circumstances, including but not limited to contacting trusted domains to fetch information such as mapping an email address to a Ripple Payment Network address.

4 |

If checked, certificates will be checked for HTTPS client connections.

5 |

Certificate Verification File: A file system path leading to the certificate verification file for 6 | HTTPS client requests.

7 |

System path to file or directory containing the root certificates: A file system path leading to a file or directory containing the root certificates that the server will accept for verifying HTTP servers. Used only for outbound HTTPS client connections.

8 |
9 | -------------------------------------------------------------------------------- /public/content/html/sslClient_es.html: -------------------------------------------------------------------------------- 1 |

Client SSL

2 |
3 |

El node XRP Ledger utiliza peticiones HTTP GET en una numerosa variedad de circunstancias, por ejemplo, 4 | para contactar a otros nodos confiados y recoger informacion. 5 |

6 |

Si se selecciona este ajuste, los certificados seran verificados para cualquier conexion HTTP como cliente.

7 |

Verificacion de certificados: 8 | A file system path leading to the certificate verification file for 9 | HTTPS client requests.

10 |

System path to file or directory containing the root certificates: A file system path leading to a file or directory containing the root certificates that the server will accept for verifying HTTP servers. Used only for outbound HTTPS client connections.

11 |
12 | 13 | é, á, í, ó, ú, ñ 14 | -------------------------------------------------------------------------------- /public/content/html/sslServer_en.html: -------------------------------------------------------------------------------- 1 |

SSL Server

2 |
3 |

You can use this command to generate a self-signed key/cert pair:

4 | 5 | openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:4096 -keyout /etc/ssl/rippled/rippled.key -out /etc/ssl/rippled/rippled.crt 6 | 7 |

8 | Keep your key private: 9 |

10 | 11 | chown -R rippled:rippled /etc/ssl/rippled && chmod -R 500 /etc/ssl/ripple 12 | 13 |

14 | On RHEL/CentOS you might have to run: 15 |

16 | 17 | restorecon -FvR /etc/ssl/rippled 18 | 19 |

to change the selinux user to system_u.

20 |
21 | -------------------------------------------------------------------------------- /public/content/html/sslServer_es.html: -------------------------------------------------------------------------------- 1 |

SSL Server

2 |
3 |

You can use this command to generate a self-signed key/cert pair:

4 | 5 | openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:4096 -keyout /etc/ssl/rippled/rippled.key -out /etc/ssl/rippled/rippled.crt 6 | 7 |

8 | Keep your key private: 9 |

10 | 11 | chown -R rippled:rippled /etc/ssl/rippled && chmod -R 500 /etc/ssl/ripple 12 | 13 |

14 | On RHEL/CentOS you might have to run: 15 |

16 | 17 | restorecon -FvR /etc/ssl/rippled 18 | 19 |

to change the selinux user to system_u.

20 |
21 | -------------------------------------------------------------------------------- /public/content/html/standalone_en.html: -------------------------------------------------------------------------------- 1 |

Standalone Server

2 |
3 |

You can run rippled in stand-alone mode without a consensus of trusted servers. In stand-alone mode, rippled does not communicate with any other servers in the XRP Ledger peer-to-peer network, but you can do most of the same actions on your local server only. Stand-alone provides a method for testing rippled behavior without being tied to the live network. For example, you can test the effects of Amendments before those Amendments have gone into effect across the decentralized network.

4 |

When you run rippled in stand-alone mode, you have to tell it what ledger version to start from:

5 | 9 | 19 |
20 | -------------------------------------------------------------------------------- /public/content/html/standalone_es.html: -------------------------------------------------------------------------------- 1 |

Standalone Server

2 |
3 |

You can run rippled in stand-alone mode without a consensus of trusted servers. In stand-alone mode, rippled does not communicate with any other servers in the XRP Ledger peer-to-peer network, but you can do most of the same actions on your local server only. Stand-alone provides a method for testing rippled behavior without being tied to the live network. For example, you can test the effects of Amendments before those Amendments have gone into effect across the decentralized network.

4 |

When you run rippled in stand-alone mode, you have to tell it what ledger version to start from:

5 | 9 | 20 |
21 | -------------------------------------------------------------------------------- /public/content/html/step1_en.html: -------------------------------------------------------------------------------- 1 |

Server configuration

2 |
3 |

In this step you will select server related settings, how you want to run your XRP Ledger node and what protocols and ports will be exposed. 4 |

5 | 14 |
15 | -------------------------------------------------------------------------------- /public/content/html/step1_es.html: -------------------------------------------------------------------------------- 1 |

Configuración de Servidor

2 |
3 |

En este paso tienes que seleccionar ajustes de servidor, cómo quieres operar tu nodo de XRP Ledger y qué protocolos y puertos serán expuestos. 4 |

5 | 14 |
15 | -------------------------------------------------------------------------------- /public/content/html/step2_en.html: -------------------------------------------------------------------------------- 1 |

Protocol configuration

2 |
3 |

In the step you can configure the size of your node, how much history you want to keep, what network you want to run on and what validators you want to trust.

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/step2_es.html: -------------------------------------------------------------------------------- 1 |

Protocol configuration

2 |
3 |

In the step you can configure the size of your node, how much history you want to keep, what network you want to run on and what validators you want to trust.

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/step3_en.html: -------------------------------------------------------------------------------- 1 |

Storage configuration

2 |
3 |

In the step you can configure the databases of your XRP Ledger node and also configure periodic automatic (or manual) deletion of data.

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/step3_es.html: -------------------------------------------------------------------------------- 1 |

Storage configuration

2 |
3 |

In the step you can configure the databases of your XRP Ledger node and also configure periodic automatic (or manual) deletion of data.

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/step4_en.html: -------------------------------------------------------------------------------- 1 |

SSL configuration

2 |
3 |

In the step you can set the client and server ssl configuration.

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/step4_es.html: -------------------------------------------------------------------------------- 1 |

SSL configuration

2 |
3 |

In the step you can set the client and server ssl configuration.

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/step5_en.html: -------------------------------------------------------------------------------- 1 |
2 |

In the step you can configure other settings like signing support, log levels or node privacy.

3 |
4 | -------------------------------------------------------------------------------- /public/content/html/step5_es.html: -------------------------------------------------------------------------------- 1 |
2 |

En este último paso puedes configurar ajustes como activación de firma de transacciones, 3 | niveles de logs o modo de privacidad.

4 |
5 | -------------------------------------------------------------------------------- /public/content/html/step6_en.html: -------------------------------------------------------------------------------- 1 |

Get Started

2 |
3 |

4 | The following example gets the latest ledger version and a list of transactions that were newly-validated in that ledger version, using the getLedger() method. Try running it as-is, or change the code and see what happens. 5 |

6 |

7 |

 8 |       
 9 |         const mainnet = new ripple.RippleAPI({
10 |           server: 'wss://your.node.url'
11 |         });
12 | 
13 |         (async function(api) {
14 |           await api.connect();
15 | 
16 |           let response = await api.getLedger({
17 |             includeTransactions: true
18 |           });
19 |           console.log(response);
20 | 
21 |         })(mainnet);
22 |   

23 |
24 | -------------------------------------------------------------------------------- /public/content/html/step6_es.html: -------------------------------------------------------------------------------- 1 |

Get Started

2 |
3 |

4 | The following example gets the latest ledger version and a list of transactions that were newly-validated in that ledger version, using the getLedger() method. Try running it as-is, or change the code and see what happens. 5 |

6 |

7 |

 8 |       
 9 |         const mainnet = new ripple.RippleAPI({
10 |           server: 'wss://your.node.url'
11 |         });
12 | 
13 |         (async function(api) {
14 |           await api.connect();
15 | 
16 |           let response = await api.getLedger({
17 |             includeTransactions: true
18 |           });
19 |           console.log(response);
20 | 
21 |         })(mainnet);
22 |   

23 |
24 | -------------------------------------------------------------------------------- /public/content/html/testnet_en.html: -------------------------------------------------------------------------------- 1 |

TestNet

2 |
3 |

An "alternate universe" network that acts as a testing ground for software built on the XRP Ledger, without impacting production XRP Ledger users and without risking real money. The amendment status of the Testnet is intended to closely mirror the Mainnet, although slight variations in timing may occur due to the unpredictable nature of decentralized systems.

4 |

Testnet and Devnet each have their own separate supply of test XRP, which Ripple gives away for free to parties interested in experimenting with the XRP Ledger and developing applications and integrations. Test XRP does not have real-world value and is lost when the network is reset.

5 |

6 | TestNet Faucet 7 |

8 |
9 | -------------------------------------------------------------------------------- /public/content/html/testnet_es.html: -------------------------------------------------------------------------------- 1 |

TestNet

2 |
3 |

An "alternate universe" network that acts as a testing ground for software built on the XRP Ledger, without impacting production XRP Ledger users and without risking real money. The amendment status of the Testnet is intended to closely mirror the Mainnet, although slight variations in timing may occur due to the unpredictable nature of decentralized systems.

4 |

Testnet and Devnet each have their own separate supply of test XRP, which Ripple gives away for free to parties interested in experimenting with the XRP Ledger and developing applications and integrations. Test XRP does not have real-world value and is lost when the network is reset.

5 |

6 | TestNet Faucet 7 |

8 |
9 | -------------------------------------------------------------------------------- /public/content/html/validatorServer_en.html: -------------------------------------------------------------------------------- 1 |

Dedicated Validator Server

2 |
3 |

. 4 |

5 |
    6 |
  • 7 | Connects to a network of peers 8 |
  • 9 |
  • 10 | Relays cryptographically signed transactions 11 |
  • 12 |
  • 13 | Maintains a local copy of the complete shared global ledger 14 |
  • 15 |
  • 16 | Participates in consensus 17 |
  • 18 |
19 | 28 |
29 | -------------------------------------------------------------------------------- /public/content/html/validatorServer_es.html: -------------------------------------------------------------------------------- 1 |

Validador Dedicado

2 |
3 |

4 |

5 |
    6 |
  • 7 | Connecta a una red de nodos 8 |
  • 9 |
  • 10 | Retransmite transacciones firmadas criptográficamente 11 |
  • 12 |
  • 13 | Mantiene localmente una copia del estado completo de la red 14 |
  • 15 |
  • 16 | Participa en el consenso de la red 17 |
  • 18 |
19 | 39 |
40 | -------------------------------------------------------------------------------- /public/content/ledgerHistorySome_en.html: -------------------------------------------------------------------------------- 1 |

Some History

2 |
3 |

The server can backfill history from before it became synced, as well as filling in any gaps in the history it has collected after syncing. (Gaps in ledger history can occur if a server temporarily becomes too busy to keep up with the network, loses its network connection, or suffers other temporary issues.) To backfill history, the server requests data from its peer XRP Ledger servers. The amount the server tries to backfill is defined by the [ledger_history] setting.

4 |

If online deletion and advisory deletion are both enabled, the server automatically backfills data up to the oldest ledger it has not been allowed to delete yet. This can fetch data beyond the number of ledger versions configured in the [ledger_history] and online_delete settings. The can_delete method tells the server what ledger versions it is allowed to delete.

5 |
6 | -------------------------------------------------------------------------------- /public/content/serverTypes_en.html: -------------------------------------------------------------------------------- 1 |

XRP Ledger Server Modes

2 |
3 |

The XRP Ledger server software can run in several modes depending on its configuration, including: 4 |

5 |
    6 |
  • All-purpose server
  • 7 |
  • Validating server, or validator for short
  • 8 |
  • Hub server
  • 9 |
  • Full History server
  • 10 |
  • Development server
  • 11 |
12 |

13 | You can also run the XRP Ledger executable as a client application for accessing XRP Ledger APIs locally. (Two instances of the same binary can run side-by-side in this case; one as a server, and the other running briefly as a client and then terminating.) 14 |

15 |

16 | For information on the commands to run XRP Ledger in each of these modes, see the Commandline Reference.

17 |

18 |
19 | -------------------------------------------------------------------------------- /public/content/signingSupport_en.html: -------------------------------------------------------------------------------- 1 |

Signing Support

2 |
3 |

By default, the signing methods for XRP Ledger are limited to administrative connections. If you want to allow signing methods to be used as public API methods, you can enable it with a configuration change.

4 |

This enables the following methods to be used on "public" JSON-RPC and WebSocket connections, if your server accepts them:

5 |
    6 |
  • sign
  • 7 |
  • sign_for
  • 8 |
  • submit (in "sign-and-submit" mode)
  • 9 |
10 |

11 | You do not need to enable public signing to use these methods from an admin connection. 12 |

13 | 22 |
23 | -------------------------------------------------------------------------------- /public/content/standalone_en.html: -------------------------------------------------------------------------------- 1 |

Standalone Server

2 |
3 |

You can run XRP Ledger in stand-alone mode without a consensus of trusted servers. In stand-alone mode, rippled does not communicate with any other servers in the XRP Ledger peer-to-peer network, but you can do most of the same actions on your local server only. Stand-alone provides a method for testing rippled behavior without being tied to the live network. For example, you can test the effects of Amendments before those Amendments have gone into effect across the decentralized network.

4 |

When you run rippled in stand-alone mode, you have to tell it what ledger version to start from:

5 | 9 | 19 |
20 | -------------------------------------------------------------------------------- /public/content/txt/install_en.txt: -------------------------------------------------------------------------------- 1 | 2 | ----------- 3 | Next Steps: 4 | ----------- 5 | 6 | You will need to install rippled on your server before you can use this configuration. 7 | 8 | If you already have rippled installed you can skip this section, if not, here are instructions on how to do it: 9 | 10 | For more information, see Install rippled.: https://xrpl.org/install-rippled.html 11 | 12 | Install on CentOS/Red Hat with yum 13 | Install a precompiled rippled binary on CentOS or Red Hat Enterprise Linux. 14 | https://xrpl.org/install-rippled-on-centos-rhel-with-yum.html 15 | 16 | Install on Ubuntu or Debian Linux 17 | Install a precompiled rippled binary on Ubuntu Linux. 18 | https://xrpl.org/install-rippled-on-ubuntu.html 19 | 20 | Build and Run rippled on Ubuntu 21 | Compile rippled yourself on Ubuntu Linux. 22 | https://xrpl.org/build-run-rippled-ubuntu.html 23 | 24 | Build and Run rippled on macOS 25 | Compile rippled yourself on macOS. 26 | https://xrpl.org/build-run-rippled-macos.html 27 | 28 | You might want to enable automatic updates on your rippled server: 29 | 30 | Update Automatically on Linux 31 | Set up automatic updates for rippled on Linux. 32 | https://xrpl.org/update-rippled-automatically-on-linux.html 33 | 34 | -------------------------------------------------------------------------------- /public/content/txt/install_es.txt: -------------------------------------------------------------------------------- 1 | --------------- 2 | Proximos pasos: 3 | --------------- 4 | -------------------------------------------------------------------------------- /public/content/txt/validator_es.txt: -------------------------------------------------------------------------------- 1 | Activar validacion en el servidor: 2 | ---------------------------------- 3 | 4 | Content TBD 5 | -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/public/favicon.ico -------------------------------------------------------------------------------- /public/img/xrp_symbol_black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/img/xrp_symbol_white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | XRPL Node Configurator 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 30 | 31 | 32 | 35 |
36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /public/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/public/mstile-150x150.png -------------------------------------------------------------------------------- /public/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "short_name": "", 4 | "icons": [ 5 | { 6 | "src": "/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#000000", 17 | "background_color": "#000000", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /src/.env.ts: -------------------------------------------------------------------------------- 1 | export const API_PORT = '5000' 2 | export const API_URL = `http://localhost:${API_PORT}` 3 | export const DOMAIN_TITLE = 'XRPL Node Configurator' 4 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 26 | -------------------------------------------------------------------------------- /src/assets/css/popper.css: -------------------------------------------------------------------------------- 1 | 2 | .popper { 3 | width: auto; 4 | background-color: #fafafa; 5 | color: #212121; 6 | text-align: center; 7 | padding: 2px; 8 | display: inline-block; 9 | border-radius: 3px; 10 | position: absolute; 11 | font-size: 14px; 12 | font-weight: normal; 13 | border: 1px #ebebeb solid; 14 | z-index: 200000; 15 | -moz-box-shadow: rgb(58, 58, 58) 0 0 6px 0; 16 | -webkit-box-shadow: rgb(58, 58, 58) 0 0 6px 0; 17 | box-shadow: rgb(58, 58, 58) 0 0 6px 0; 18 | } 19 | .popper .popper__arrow { 20 | width: 0; 21 | height: 0; 22 | border-style: solid; 23 | position: absolute; 24 | margin: 5px; 25 | } 26 | .popper[x-placement^="top"] { 27 | margin-bottom: 5px; 28 | } 29 | .popper[x-placement^="top"] .popper__arrow { 30 | border-width: 5px 5px 0 5px; 31 | border-color: #fafafa transparent transparent transparent; 32 | bottom: -5px; 33 | left: calc(50% - 5px); 34 | margin-top: 0; 35 | margin-bottom: 0; 36 | } 37 | .popper[x-placement^="bottom"] { 38 | margin-top: 5px; 39 | } 40 | .popper[x-placement^="bottom"] .popper__arrow { 41 | border-width: 0 5px 5px 5px; 42 | border-color: transparent transparent #fafafa transparent; 43 | top: -5px; 44 | left: calc(50% - 5px); 45 | margin-top: 0; 46 | margin-bottom: 0; 47 | } 48 | .popper[x-placement^="right"] { 49 | margin-left: 5px; 50 | } 51 | .popper[x-placement^="right"] .popper__arrow { 52 | border-width: 5px 5px 5px 0; 53 | border-color: transparent #fafafa transparent transparent; 54 | left: -5px; 55 | top: calc(50% - 5px); 56 | margin-left: 0; 57 | margin-right: 0; 58 | } 59 | .popper[x-placement^="left"] { 60 | margin-right: 5px; 61 | } 62 | .popper[x-placement^="left"] .popper__arrow { 63 | border-width: 5px 0 5px 5px; 64 | border-color: transparent transparent transparent #fafafa; 65 | right: -5px; 66 | top: calc(50% - 5px); 67 | margin-left: 0; 68 | margin-right: 0; 69 | } 70 | -------------------------------------------------------------------------------- /src/assets/fonts/bebasneue.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Bebas Neue'; 3 | src: local('Bebas Neue Thin'), 4 | local('BebasNeue-Thin'), 5 | url('bebasneuethin.woff2') format('woff2'), 6 | url('bebasneuethin.woff') format('woff'), 7 | url('bebasneuethin.ttf') format('truetype'); 8 | font-weight: 100; 9 | font-style: normal; 10 | } 11 | 12 | @font-face { 13 | font-family: 'Bebas Neue'; 14 | src: local('Bebas Neue Light'), 15 | local('BebasNeue-Light'), 16 | url('bebasneuelight.woff2') format('woff2'), 17 | url('bebasneuelight.woff') format('woff'), 18 | url('bebasneuelight.ttf') format('truetype'); 19 | font-weight: 200; 20 | font-style: normal; 21 | } 22 | 23 | @font-face { 24 | font-family: 'Bebas Neue'; 25 | src: local('Bebas Neue Book'), 26 | local('BebasNeueBook'), 27 | url('bebasneuebook.woff2') format('woff2'), 28 | url('bebasneuebook.woff') format('woff'), 29 | url('bebasneuebook.ttf') format('truetype'); 30 | font-weight: 300; 31 | font-style: normal; 32 | } 33 | 34 | @font-face { 35 | font-family: 'Bebas Neue'; 36 | src: local('Bebas Neue Regular'), 37 | local('BebasNeueRegular'), 38 | url('bebasneueregular.woff2') format('woff2'), 39 | url('bebasneueregular.woff') format('woff'), 40 | url('bebasneueregular.ttf') format('truetype'); 41 | font-weight: 400; 42 | font-style: normal; 43 | } 44 | 45 | @font-face { 46 | font-family: 'Bebas Neue'; 47 | src: local('Bebas Neue Bold'), 48 | local('BebasNeueBold'), 49 | url('bebasneuebold.woff2') format('woff2'), 50 | url('bebasneuebold.woff') format('woff'), 51 | url('bebasneuebold.ttf') format('truetype'); 52 | font-weight: 700; 53 | font-style: normal; 54 | } 55 | -------------------------------------------------------------------------------- /src/assets/fonts/bebasneuebold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/fonts/bebasneuebold.ttf -------------------------------------------------------------------------------- /src/assets/fonts/bebasneuebold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/fonts/bebasneuebold.woff -------------------------------------------------------------------------------- /src/assets/fonts/bebasneuebold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/fonts/bebasneuebold.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/bebasneuebook.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/fonts/bebasneuebook.ttf -------------------------------------------------------------------------------- /src/assets/fonts/bebasneuebook.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/fonts/bebasneuebook.woff -------------------------------------------------------------------------------- /src/assets/fonts/bebasneuebook.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/fonts/bebasneuebook.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/bebasneuelight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/fonts/bebasneuelight.ttf -------------------------------------------------------------------------------- /src/assets/fonts/bebasneuelight.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/fonts/bebasneuelight.woff -------------------------------------------------------------------------------- /src/assets/fonts/bebasneuelight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/fonts/bebasneuelight.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/bebasneueregular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/fonts/bebasneueregular.ttf -------------------------------------------------------------------------------- /src/assets/fonts/bebasneueregular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/fonts/bebasneueregular.woff -------------------------------------------------------------------------------- /src/assets/fonts/bebasneueregular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/fonts/bebasneueregular.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/bebasneuethin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/fonts/bebasneuethin.ttf -------------------------------------------------------------------------------- /src/assets/fonts/bebasneuethin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/fonts/bebasneuethin.woff -------------------------------------------------------------------------------- /src/assets/fonts/bebasneuethin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/fonts/bebasneuethin.woff2 -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XRPLF/xrpl-node-configurator/b482e01b90788c9906db205a28d30f0197d97402/src/assets/logo.png -------------------------------------------------------------------------------- /src/components/custom/UiAlertIcon.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 16 | -------------------------------------------------------------------------------- /src/components/custom/UiBox.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 49 | 50 | 93 | -------------------------------------------------------------------------------- /src/components/custom/UiCheckbox.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 59 | -------------------------------------------------------------------------------- /src/components/custom/UiDialog.vue: -------------------------------------------------------------------------------- 1 | 28 | 69 | 76 | -------------------------------------------------------------------------------- /src/components/custom/UiDropdown.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 48 | -------------------------------------------------------------------------------- /src/components/custom/UiErrorBox.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 19 | -------------------------------------------------------------------------------- /src/components/custom/UiErrorPopup.vue: -------------------------------------------------------------------------------- 1 | 30 | 59 | -------------------------------------------------------------------------------- /src/components/custom/UiHelpBox.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 38 | -------------------------------------------------------------------------------- /src/components/custom/UiMultiSelect.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 47 | -------------------------------------------------------------------------------- /src/components/custom/UiRadio.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 56 | -------------------------------------------------------------------------------- /src/components/custom/UiStepSection.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | -------------------------------------------------------------------------------- /src/components/custom/UiSuccessPopup.vue: -------------------------------------------------------------------------------- 1 | 30 | 62 | -------------------------------------------------------------------------------- /src/components/custom/UiValidations.vue: -------------------------------------------------------------------------------- 1 | 35 | 74 | -------------------------------------------------------------------------------- /src/components/custom/progress-loaders/UiLinearLoading.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | 15 | 70 | -------------------------------------------------------------------------------- /src/components/custom/progress-loaders/UiPulseLoading.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 43 | -------------------------------------------------------------------------------- /src/components/custom/progress-loaders/UiSpinnerWave.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 31 | 32 | 81 | -------------------------------------------------------------------------------- /src/components/layout/AppContent.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 39 | -------------------------------------------------------------------------------- /src/config/datetime.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | FORMAT_DATE: 'MM/DD/YYYY', 3 | FORMAT_TIME: 'hh:mm:ss', 4 | FORMAT_DATETIME: 'MM/DD/YYYY hh:mm:ss' 5 | } 6 | -------------------------------------------------------------------------------- /src/config/index.ts: -------------------------------------------------------------------------------- 1 | import datetime from './datetime' 2 | 3 | export { 4 | datetime 5 | } 6 | -------------------------------------------------------------------------------- /src/directives/debounce.ts: -------------------------------------------------------------------------------- 1 | export default function directive (el: any, binding: any) { 2 | if (binding.value !== binding.oldValue) { // change debounce only if interval has changed 3 | el.oninput = directive.debounce((evt: any) => { 4 | el.dispatchEvent(new Event('debounce-change')) 5 | }, parseInt(binding.value) || 500) 6 | } 7 | } 8 | 9 | function debounce (fn: any, delay: any) { 10 | let timeoutID: any = null 11 | return () => { 12 | clearTimeout(timeoutID) 13 | timeoutID = setTimeout(() => { 14 | // @ts-expect-error ts-migrate(2683) FIXME: 'this' implicitly has type 'any' because it does n... Remove this comment to see the full error message 15 | fn.apply(this, arguments) 16 | }, delay) 17 | } 18 | } 19 | 20 | directive.debounce = debounce 21 | -------------------------------------------------------------------------------- /src/directives/index.ts: -------------------------------------------------------------------------------- 1 | import './numericOnly' 2 | -------------------------------------------------------------------------------- /src/directives/numericOnly.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | Vue.directive('numericOnly', { 4 | bind (el) { 5 | el.addEventListener('keyup', () => { 6 | const regex = /^[0-9]*$/ 7 | // @ts-expect-error ts-migrate(2339) FIXME: Property 'value' does not exist on type 'HTMLEleme... Remove this comment to see the full error message 8 | if (!regex.test(el.value)) { 9 | // @ts-expect-error ts-migrate(2339) FIXME: Property 'value' does not exist on type 'HTMLEleme... Remove this comment to see the full error message 10 | el.value = el.value.slice(0, -1) 11 | } 12 | }) 13 | } 14 | }) 15 | -------------------------------------------------------------------------------- /src/enums/index.ts: -------------------------------------------------------------------------------- 1 | export enum ServerType { 2 | ALL = 'allPurposeServer', 3 | VALIDATOR = 'validatorServer', 4 | HUB = 'hubServer', 5 | API = 'apiServer', 6 | FULLHISTORY = 'fullHistoryServer', 7 | DEVELOPMENT = 'developmentServer' 8 | } 9 | 10 | export enum HistoryType { 11 | SOME = 'some', 12 | FULL = 'full', 13 | NONE = 'none' 14 | } 15 | 16 | export enum NodeSize { 17 | TINY = 'tiny', 18 | SMALL = 'small', 19 | MEDIUM = 'medium', 20 | HUGE = 'huge' 21 | } 22 | 23 | export enum Network { 24 | DEV = 'devnet', 25 | TEST = 'testnet', 26 | MAIN = 'mainnet' 27 | } 28 | 29 | export enum ValidatorListType { 30 | KNOWNSITES = 'knownsites', 31 | OWNSITES = 'ownsites' 32 | } 33 | 34 | export enum DatabaseType { 35 | NUDB = 'nudb', 36 | ROCKSDB = 'rocksdb' 37 | } 38 | 39 | export enum LogLevel { 40 | DEBUG = 'debug', 41 | WARNING = 'warning', 42 | INFO = 'info', 43 | ERROR = 'error', 44 | FATAL = 'fatal' 45 | } 46 | 47 | export enum ConfigGroup { 48 | SERVER = 'server', 49 | PROTOCOL = 'protocol', 50 | STORAGE = 'storage', 51 | SSL = 'ssl', 52 | SETTINGS = 'settings', 53 | ALL = 'all' 54 | } 55 | 56 | export enum ProtocolType { 57 | PEER = 'peer', 58 | WSPUBLIC = 'wsPublic', 59 | WSADMIN = 'wsAdmin', 60 | JSONRPC = 'jsonRpc', 61 | GRPC = 'grpc' 62 | } 63 | -------------------------------------------------------------------------------- /src/i18n/index.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueI18n from 'vue-i18n' 3 | 4 | Vue.use(VueI18n) 5 | 6 | function loadLocaleMessages () { 7 | const locales = require.context('./locales', true, /[A-Za-z0-9-_,\s]+\.json$/i) 8 | const messages: any = {} 9 | locales.keys().forEach(key => { 10 | const matched = key.match(/([A-Za-z0-9-_]+)\./i) 11 | if (matched && matched.length > 1) { 12 | const locale = matched[1] 13 | messages[locale] = locales(key) 14 | } 15 | }) 16 | return messages 17 | } 18 | 19 | export default new VueI18n({ 20 | locale: process.env.VUE_APP_I18N_LOCALE || 'en', 21 | fallbackLocale: process.env.VUE_APP_I18N_FALLBACK_LOCALE || 'en', 22 | messages: loadLocaleMessages() 23 | }) 24 | -------------------------------------------------------------------------------- /src/layout/App.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 23 | -------------------------------------------------------------------------------- /src/layout/Default.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 15 | -------------------------------------------------------------------------------- /src/layout/Result.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | s 17 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VModal from 'vue-js-modal' 3 | import Vuelidate from 'vuelidate' 4 | 5 | import App from './App.vue' 6 | import router from './router' 7 | import store from './store' 8 | 9 | import './directives' 10 | import './plugins' 11 | 12 | import './scss/style.scss' 13 | import './assets/fonts/bebasneue.css' 14 | 15 | import i18n from './i18n' 16 | 17 | import AppLayout from './layout/App.vue' 18 | import ResultLayout from './layout/Result.vue' 19 | 20 | Vue.config.productionTip = false 21 | 22 | Vue.component('app-layout', AppLayout) 23 | Vue.component('result-layout', ResultLayout) 24 | 25 | Vue.use(Vuelidate) 26 | Vue.use(VModal) 27 | 28 | new Vue({ 29 | i18n, 30 | name: 'Root', 31 | router, 32 | store, 33 | render: h => h(App) 34 | }).$mount('#app') 35 | -------------------------------------------------------------------------------- /src/pages/NotFound.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/plugins/globalEventBus.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | const eventBus = new Vue() 3 | 4 | export default { 5 | install (Vue: any) { 6 | Vue.prototype.$bus = eventBus 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/plugins/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * import and init global plugins 3 | */ 4 | 5 | import Vue from 'vue' 6 | 7 | import globalEventBus from '../plugins/globalEventBus' 8 | 9 | Vue.use(globalEventBus) 10 | -------------------------------------------------------------------------------- /src/router/index.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | 4 | import { setPageTitleMiddleware } from './middlewares' 5 | import { routes } from './routes' 6 | 7 | Vue.use(Router) 8 | 9 | const router = new Router({ 10 | linkActiveClass: 'is-active', 11 | mode: 'hash', 12 | routes 13 | }) 14 | 15 | router.beforeEach(setPageTitleMiddleware) 16 | 17 | export default router 18 | -------------------------------------------------------------------------------- /src/router/middlewares.ts: -------------------------------------------------------------------------------- 1 | export function setPageTitleMiddleware (to: any, from: any, next: any) { 2 | const pageTitle = to.matched.find((item: any) => item.meta.title) 3 | 4 | if (pageTitle) window.document.title = pageTitle.meta.title 5 | next() 6 | } 7 | -------------------------------------------------------------------------------- /src/router/routes.ts: -------------------------------------------------------------------------------- 1 | import step1Page from '../pages/Step1.vue' 2 | import step2Page from '../pages/Step2.vue' 3 | import step3Page from '../pages/Step3.vue' 4 | import step4Page from '../pages/Step4.vue' 5 | import step5Page from '../pages/Step5.vue' 6 | import step6Page from '../pages/Step6.vue' 7 | import notFoundPage from '../pages/NotFound.vue' 8 | import rippledCfg from '../output/RippledCfg.vue' 9 | 10 | import { DOMAIN_TITLE } from '../.env' 11 | 12 | export const routes = [ 13 | { 14 | path: '/', 15 | name: 'index', 16 | component: step1Page, 17 | meta: { 18 | title: `${DOMAIN_TITLE} | Server`, 19 | layout: 'app' 20 | } 21 | }, 22 | { 23 | path: '/protocol', 24 | name: 'protocol', 25 | component: step2Page, 26 | meta: { 27 | title: `${DOMAIN_TITLE} | Protocol`, 28 | layout: 'app' 29 | } 30 | }, 31 | { 32 | path: '/storage', 33 | name: 'storage', 34 | component: step3Page, 35 | meta: { 36 | title: `${DOMAIN_TITLE} | Storage`, 37 | layout: 'app' 38 | } 39 | }, 40 | { 41 | path: '/ssl', 42 | name: 'ssl', 43 | component: step4Page, 44 | meta: { 45 | title: `${DOMAIN_TITLE} | SSL`, 46 | layout: 'app' 47 | } 48 | }, 49 | { 50 | path: '/settings', 51 | name: 'settings', 52 | component: step5Page, 53 | meta: { 54 | title: `${DOMAIN_TITLE} | Settings`, 55 | layout: 'app' 56 | } 57 | }, 58 | { 59 | path: '/finished', 60 | name: 'finished', 61 | component: step6Page, 62 | meta: { 63 | title: `${DOMAIN_TITLE} | Finished`, 64 | layout: 'app' 65 | } 66 | }, 67 | { 68 | path: '/result', 69 | name: 'result', 70 | component: rippledCfg, 71 | meta: { 72 | title: `${DOMAIN_TITLE} | Result`, 73 | layout: 'result' 74 | } 75 | }, 76 | { 77 | path: '*', 78 | component: notFoundPage, 79 | meta: { title: `${DOMAIN_TITLE} | not found` } 80 | } 81 | ] 82 | -------------------------------------------------------------------------------- /src/router/util.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * get query params from URL(via default vue query object) 3 | * and pass it to component props 4 | */ 5 | export function routePropResolver (routeOptions: any) { 6 | const { query } = routeOptions 7 | const resultQuery = {} 8 | 9 | Object.keys(query).forEach(key => { 10 | // parse strings 11 | if (query[key].length && !['0', 'null', 'undefined', 'NaN'].includes(query[key])) { 12 | // @ts-expect-error ts-migrate(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message 13 | resultQuery[key] = query[key] 14 | } 15 | // parse numbers 16 | if (parseInt(query[key])) { 17 | // @ts-expect-error ts-migrate(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message 18 | resultQuery[key] = +query[key] 19 | } 20 | }) 21 | return resultQuery 22 | } 23 | 24 | /** 25 | * validate route limit 26 | * API have default limit equals to 10, so we don't need send it 27 | * @param {int} limit 28 | * @return {boolean} 29 | */ 30 | export function isValidLimitQuery (limit: any) { 31 | return [20, 30, 40, 50, 100].includes(+limit) 32 | } 33 | 34 | /** 35 | * validate route page 36 | * API have default page equals to 0, so we don't need send it 37 | * @param {int} page 38 | * @return {boolean} 39 | */ 40 | export function isValidPageQuery (page: any) { 41 | return +page >= 1 42 | } 43 | -------------------------------------------------------------------------------- /src/scss/_defaults.scss: -------------------------------------------------------------------------------- 1 | // define default classes (IN UPPERCASE) 2 | 3 | // font 4 | .FONT_TITLE { 5 | font-family: $font-title; 6 | } 7 | .FONT_CONTENT { 8 | font-family: $font-content; 9 | } 10 | .ITALIC { 11 | font-style: italic; 12 | } 13 | .BOLD { 14 | font-weight: bold; 15 | } 16 | .NOWRAP { 17 | white-space: nowrap; 18 | } 19 | 20 | // color 21 | .COLOR_MAIN { 22 | color: blue; 23 | } 24 | .COLOR_ERROR { 25 | color: $color-error; 26 | } 27 | -------------------------------------------------------------------------------- /src/scss/_fonts.scss: -------------------------------------------------------------------------------- 1 | // free to use fonts only 2 | $font-title: 'Bebas Neue', Impact; // https://dharmatype.com/bebas-neue, https://github.com/dharmatype/Bebas-Neue 3 | $font-content: Lato, 'sans-serif'; 4 | $font-content-alt: Roboto, 'sans-serif'; 5 | -------------------------------------------------------------------------------- /src/scss/_global.scss: -------------------------------------------------------------------------------- 1 | html, body, #app { 2 | min-height: 100vh; 3 | } 4 | 5 | body { 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | font-family: Lato, Helvetica, Arial, sans-serif; 9 | } 10 | 11 | #app { 12 | display: flex; 13 | flex-direction: column; 14 | } 15 | 16 | img { 17 | vertical-align: top; 18 | } 19 | 20 | * { 21 | box-sizing: border-box; 22 | } 23 | 24 | // firefox fix 'shaking font inside button' 25 | input[type=button], button { 26 | padding: 0; 27 | } 28 | 29 | //.page { 30 | // height: 100%; 31 | // width: 100%; 32 | // background-color: green; 33 | //} 34 | 35 | .clearfix::after { 36 | display: table; 37 | clear: both; 38 | content: ""; 39 | } 40 | 41 | .is-active { 42 | //border-radius: 5px; 43 | //border: 3px solid #bebebe; 44 | //padding: 5px 15px; 45 | } 46 | 47 | .wrapper { 48 | width: 100%; 49 | min-width: 300px; // and paddind + 10 + 10 50 | 51 | margin: 0 auto; 52 | padding: 0 10px; 53 | 54 | box-sizing: border-box; 55 | 56 | @include media_desktop { 57 | max-width: 1200px; 58 | // background: red; 59 | } 60 | 61 | @include media_tablet { 62 | // background: yellow; 63 | max-width: 1024px; 64 | } 65 | 66 | @include media_mobile { 67 | // background: green; 68 | } 69 | } 70 | 71 | // routes transition animation 72 | .fade-enter-active { 73 | transition: opacity .8s 74 | } 75 | .fade-enter, .fade-leave-to { 76 | opacity: 0 77 | } 78 | -------------------------------------------------------------------------------- /src/scss/_helpers.scss: -------------------------------------------------------------------------------- 1 | /* 2 | This .scss loop will create "margin helpers" and "padding helpers" for use in your web projects. 3 | It will generate several classes such as: 4 | .mr10 which gives margin-right 10 pixels. 5 | .mr15 gives MARGIN to the RIGHT 15 pixels. 6 | .mt15 gives MARGIN to the TOP 15 pixels and so on. 7 | .pb5 gives PADDING to the BOTTOM of 5 pixels 8 | .pl40 gives PADDING to the LEFT of 40 pixels 9 | The first letter is "m" or "p" for MARGIN or PADDING 10 | Second letter is "t", "b", "l", or "r" for TOP, BOTTOM, LEFT, or RIGHT 11 | Third letter is the number of spacing in pixels. Adjust the amounts generated by editing the $spaceamounts variable below. 12 | */ 13 | 14 | $spaceamounts: (5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 75, 100); // Adjust this to include the pixel amounts you need. 15 | $sides: (top, bottom, left, right); // Leave this variable alone 16 | 17 | @each $space in $spaceamounts { 18 | @each $side in $sides { 19 | .m#{str-slice($side, 0, 1)}#{$space} { 20 | margin-#{$side}: #{$space}px !important; 21 | } 22 | 23 | .p#{str-slice($side, 0, 1)}#{$space} { 24 | padding-#{$side}: #{$space}px !important; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/scss/_medias.scss: -------------------------------------------------------------------------------- 1 | $desktop_width: 4096px; 2 | $tablet_width: 1024px; 3 | $mobile_width: 640px; 4 | 5 | @mixin media_desktop{ 6 | @media only screen 7 | and (max-width: #{$desktop_width}) { 8 | @content; 9 | } 10 | } 11 | 12 | @mixin media_tablet{ 13 | @media only screen 14 | and (max-width: #{$tablet_width}){ 15 | @content; 16 | } 17 | } 18 | @mixin media_mobile{ 19 | @media only screen 20 | and (max-width: #{$mobile_width}){ 21 | @content; 22 | } 23 | } 24 | 25 | @mixin media_ie{ // ie9+ (for applying rules USE !important) 26 | @media screen 27 | and (min-width:0\0) 28 | and (min-resolution: +72dpi) { 29 | @content; 30 | } 31 | } 32 | 33 | @mixin media_edge { 34 | @supports (-ms-accelerator:true){ 35 | @content; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | @mixin box-shadow($y: 7px) { 2 | box-shadow: 0 $y 5px -2px rgba(204, 204, 204, .25); 3 | } 4 | 5 | @mixin box-shadow-alt() { 6 | box-shadow: 7 | 0 2px 4px 0 rgba($color-gray-500, .2), 8 | 0 0 1px 1px rgba($color-gray-500, .05); 9 | } 10 | 11 | @mixin text-shadow() { 12 | text-shadow: 1px 1px 10px rgba(black, .2); 13 | } 14 | -------------------------------------------------------------------------------- /src/scss/_reset.scss: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v2.0 | 20110126 3 | License: none (public domain) 4 | */ 5 | 6 | /* HTML5 display-role reset for older browsers */ 7 | article, aside, details, figcaption, figure, 8 | footer, header, hgroup, menu, nav, section { 9 | display: block; 10 | } 11 | 12 | ol, ul { 13 | list-style: none; 14 | } 15 | blockquote, q { 16 | quotes: none; 17 | } 18 | blockquote:before, blockquote:after, 19 | q:before, q:after { 20 | content: ''; 21 | content: none; 22 | } 23 | table { 24 | border-collapse: collapse; 25 | border-spacing: 0; 26 | } 27 | -------------------------------------------------------------------------------- /src/scss/_util.scss: -------------------------------------------------------------------------------- 1 | .tooltip .tooltip-text { 2 | visibility: hidden; 3 | text-align: center; 4 | padding: 2px 6px; 5 | position: absolute; 6 | z-index: 100; 7 | } 8 | 9 | .tooltip:hover .tooltip-text { 10 | visibility: visible; 11 | } 12 | -------------------------------------------------------------------------------- /src/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | // GLOBAL COLORS 2 | $color-white: #fff; 3 | $color-body: #1e2221; 4 | $color-error: red; 5 | 6 | $color-line: #eceae8; 7 | $color-black-transparent: rgba(27, 31, 35, .15); 8 | 9 | // fonts color 10 | $color-font-main: #5a5a5a; 11 | $color-font-dim: #ccc; 12 | $color-font-placeholder: #e5e5e5; 13 | 14 | $color-line: #e5e5e5; 15 | 16 | $color-gray-50: #d1d1d1; 17 | $color-gray-100: #cccccc; 18 | $color-gray-200: #bfbfbf; 19 | $color-gray-300: #adadad; 20 | $color-gray-400: #989898; 21 | $color-gray-450: #808080; 22 | $color-gray-500: #7a7a7a; 23 | -------------------------------------------------------------------------------- /src/scss/style.scss: -------------------------------------------------------------------------------- 1 | @import "reset"; 2 | 3 | @import "variables"; 4 | @import "medias"; 5 | @import "global"; 6 | @import "fonts"; 7 | @import "util"; 8 | -------------------------------------------------------------------------------- /src/services/__tests__/fixtures/badJsonSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.3", 3 | "server": { 4 | "runAs": "hubServer", 5 | "protocols": { 6 | "peer": { 7 | "enabled": true, 8 | "secure": false, 9 | "ip": "0.0.0.0", 10 | "port": 2459 11 | }, 12 | "wsPublic": { 13 | "enabled": true, 14 | "secure": false, 15 | "admin": "127.0.0.1", 16 | "ip": "0.0.0.0", 17 | "port": 6005 18 | }, 19 | "wsAdmin": { 20 | "enabled": true, 21 | "secure": true, 22 | "admin": "127.0.0.1", 23 | "ip": "0.0.0.0", 24 | "port": 6006 25 | }, 26 | "jsonRpc": { 27 | "enabled": true, 28 | "secure": false, 29 | "admin": "127.0.0.1", 30 | "ip": "0.0.0.0", 31 | "port": 5005 32 | }, 33 | "grpc": { 34 | "enabled": true, 35 | "ip": "0.0.0.0", 36 | "port": 50051 37 | } 38 | } 39 | }, 40 | "protocol": { 41 | "nodeSize": "tiny", 42 | "history": { 43 | "type": "some", 44 | "ledgers": "512" 45 | }, 46 | "validators": { 47 | "type": "knownsites", 48 | "list": ["vl.ripple.com"] 49 | }, 50 | "network": "mainnet" 51 | }, 52 | "storage": { 53 | "ssd": false, 54 | "purge": { 55 | "online": { 56 | "enabled": true, 57 | "ledgers": 512 58 | }, 59 | "none": false, 60 | "advisory": true 61 | }, 62 | "database": { 63 | "type": "rocksdb", 64 | "path": "/var/lib/rippled/db", 65 | "bookKeepingPath": "/var/lib/rippled/db" 66 | } 67 | }, 68 | "ssl": { 69 | "client": { 70 | "verify": false, 71 | "filePath": null, 72 | "fileOrDirPath": null 73 | }, 74 | "server": { 75 | "enabled": false, 76 | "certPath": null, 77 | "keyPath": null 78 | } 79 | }, 80 | "settings": { 81 | "peer": { 82 | "private": true 83 | }, 84 | "signing": { 85 | "support": false 86 | }, 87 | "log": { 88 | "level": "warning", 89 | "logFilePath": "/var/log/rippled/debug.log" 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/services/__tests__/fixtures/nudbServer.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.3", 3 | "server": { 4 | "runAs": "hubServer", 5 | "protocols": { 6 | "peer": { 7 | "enabled": true, 8 | "secure": false, 9 | "ip": "0.0.0.0", 10 | "port": 2459 11 | }, 12 | "wsPublic": { 13 | "enabled": true, 14 | "secure": false, 15 | "admin": "127.0.0.1", 16 | "ip": "0.0.0.0", 17 | "port": 6005 18 | }, 19 | "wsAdmin": { 20 | "enabled": true, 21 | "secure": true, 22 | "admin": "127.0.0.1", 23 | "ip": "0.0.0.0", 24 | "port": 6006 25 | }, 26 | "jsonRpc": { 27 | "enabled": true, 28 | "secure": false, 29 | "admin": "127.0.0.1", 30 | "ip": "0.0.0.0", 31 | "port": 5005 32 | }, 33 | "grpc": { 34 | "enabled": true, 35 | "ip": "0.0.0.0", 36 | "port": 50051 37 | } 38 | } 39 | }, 40 | "protocol": { 41 | "nodeSize": "huge", 42 | "history": { 43 | "type": "some", 44 | "ledgers": 512 45 | }, 46 | "validators": { 47 | "type": "knownsites", 48 | "list": ["vl.ripple.com"] 49 | }, 50 | "network": "mainnet" 51 | }, 52 | "storage": { 53 | "ssd": false, 54 | "purge": { 55 | "online": { 56 | "enabled": true, 57 | "ledgers": 512 58 | }, 59 | "none": false, 60 | "advisory": true 61 | }, 62 | "database": { 63 | "type": "nudb", 64 | "path": "/var/lib/rippled/db", 65 | "bookKeepingPath": "/var/lib/rippled/db" 66 | } 67 | }, 68 | "ssl": { 69 | "client": { 70 | "verify": false, 71 | "filePath": null, 72 | "fileOrDirPath": null 73 | }, 74 | "server": { 75 | "enabled": false, 76 | "certPath": null, 77 | "keyPath": null 78 | } 79 | }, 80 | "settings": { 81 | "peer": { 82 | "private": true 83 | }, 84 | "signing": { 85 | "support": false 86 | }, 87 | "log": { 88 | "level": "warning", 89 | "logFilePath": "/var/log/rippled/debug.log" 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/services/__tests__/fixtures/productionServerWithTinySize.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.3", 3 | "server": { 4 | "runAs": "hubServer", 5 | "protocols": { 6 | "peer": { 7 | "enabled": true, 8 | "secure": false, 9 | "ip": "0.0.0.0", 10 | "port": 2459 11 | }, 12 | "wsPublic": { 13 | "enabled": true, 14 | "secure": false, 15 | "admin": "127.0.0.1", 16 | "ip": "0.0.0.0", 17 | "port": 6005 18 | }, 19 | "wsAdmin": { 20 | "enabled": true, 21 | "secure": true, 22 | "admin": "127.0.0.1", 23 | "ip": "0.0.0.0", 24 | "port": 6006 25 | }, 26 | "jsonRpc": { 27 | "enabled": true, 28 | "secure": false, 29 | "admin": "127.0.0.1", 30 | "ip": "0.0.0.0", 31 | "port": 5005 32 | }, 33 | "grpc": { 34 | "enabled": true, 35 | "ip": "0.0.0.0", 36 | "port": 50051 37 | } 38 | } 39 | }, 40 | "protocol": { 41 | "nodeSize": "tiny", 42 | "history": { 43 | "type": "some", 44 | "ledgers": 512 45 | }, 46 | "validators": { 47 | "type": "knownsites", 48 | "list": ["vl.ripple.com"] 49 | }, 50 | "network": "mainnet" 51 | }, 52 | "storage": { 53 | "purge": { 54 | "online": { 55 | "enabled": true, 56 | "ledgers": 512 57 | }, 58 | "none": false, 59 | "advisory": true 60 | }, 61 | "database": { 62 | "type": "rocksdb", 63 | "path": "/var/lib/rippled/db", 64 | "bookKeepingPath": "/var/lib/rippled/db" 65 | } 66 | }, 67 | "ssl": { 68 | "client": { 69 | "verify": false, 70 | "filePath": null, 71 | "fileOrDirPath": null 72 | }, 73 | "server": { 74 | "enabled": false, 75 | "certPath": null, 76 | "keyPath": null 77 | } 78 | }, 79 | "settings": { 80 | "peer": { 81 | "private": true 82 | }, 83 | "signing": { 84 | "support": false 85 | }, 86 | "log": { 87 | "level": "warning", 88 | "logFilePath": "/var/log/rippled/debug.log" 89 | } 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/services/__tests__/fixtures/validatorBroadcastAddress.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.3", 3 | "server": { 4 | "runAs": "validatorServer", 5 | "protocols": { 6 | "peer": { 7 | "enabled": true, 8 | "secure": false, 9 | "ip": "0.0.0.0", 10 | "port": 2459 11 | }, 12 | "wsPublic": { 13 | "enabled": true, 14 | "secure": false, 15 | "admin": "127.0.0.1", 16 | "ip": "0.0.0.0", 17 | "port": 6005 18 | }, 19 | "wsAdmin": { 20 | "enabled": true, 21 | "secure": true, 22 | "admin": "127.0.0.1", 23 | "ip": "0.0.0.0", 24 | "port": 6006 25 | }, 26 | "jsonRpc": { 27 | "enabled": true, 28 | "secure": false, 29 | "admin": "127.0.0.1", 30 | "ip": "0.0.0.0", 31 | "port": 5005 32 | }, 33 | "grpc": { 34 | "enabled": true, 35 | "ip": "0.0.0.0", 36 | "port": 50051 37 | } 38 | } 39 | }, 40 | "protocol": { 41 | "nodeSize": "tiny", 42 | "history": { 43 | "type": "some", 44 | "ledgers": 512 45 | }, 46 | "validators": { 47 | "type": "knownsites", 48 | "list": ["vl.ripple.com"] 49 | }, 50 | "network": "devnet" 51 | }, 52 | "storage": { 53 | "ssd": false, 54 | "purge": { 55 | "online": { 56 | "enabled": true, 57 | "ledgers": 512 58 | }, 59 | "none": false, 60 | "advisory": true 61 | }, 62 | "database": { 63 | "type": "rocksdb", 64 | "path": "/var/lib/rippled/db", 65 | "bookKeepingPath": "/var/lib/rippled/db" 66 | } 67 | }, 68 | "ssl": { 69 | "client": { 70 | "verify": false, 71 | "filePath": null, 72 | "fileOrDirPath": null 73 | }, 74 | "server": { 75 | "enabled": false, 76 | "certPath": null, 77 | "keyPath": null 78 | } 79 | }, 80 | "settings": { 81 | "peer": { 82 | "private": false 83 | }, 84 | "signing": { 85 | "support": false 86 | }, 87 | "log": { 88 | "level": "warning", 89 | "logFilePath": "/var/log/rippled/debug.log" 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/services/__tests__/fixtures/validatorWithALotOfLedgers.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.3", 3 | "server": { 4 | "runAs": "validatorServer", 5 | "protocols": { 6 | "peer": { 7 | "enabled": true, 8 | "secure": false, 9 | "ip": "0.0.0.0", 10 | "port": 2459 11 | }, 12 | "wsPublic": { 13 | "enabled": true, 14 | "secure": false, 15 | "admin": "127.0.0.1", 16 | "ip": "0.0.0.0", 17 | "port": 6005 18 | }, 19 | "wsAdmin": { 20 | "enabled": true, 21 | "secure": true, 22 | "admin": "127.0.0.1", 23 | "ip": "0.0.0.0", 24 | "port": 6006 25 | }, 26 | "jsonRpc": { 27 | "enabled": true, 28 | "secure": false, 29 | "admin": "127.0.0.1", 30 | "ip": "0.0.0.0", 31 | "port": 5005 32 | }, 33 | "grpc": { 34 | "enabled": true, 35 | "ip": "0.0.0.0", 36 | "port": 50051 37 | } 38 | } 39 | }, 40 | "protocol": { 41 | "nodeSize": "tiny", 42 | "history": { 43 | "type": "some", 44 | "ledgers": 999999999 45 | }, 46 | "validators": { 47 | "type": "knownsites", 48 | "list": ["vl.ripple.com"] 49 | }, 50 | "network": "devnet" 51 | }, 52 | "storage": { 53 | "purge": { 54 | "online": { 55 | "enabled": true, 56 | "ledgers": 512 57 | }, 58 | "none": false, 59 | "advisory": true 60 | }, 61 | "database": { 62 | "type": "rocksdb", 63 | "path": "/var/lib/rippled/db", 64 | "bookKeepingPath": "/var/lib/rippled/db" 65 | } 66 | }, 67 | "ssl": { 68 | "client": { 69 | "verify": false, 70 | "filePath": null, 71 | "fileOrDirPath": null 72 | }, 73 | "server": { 74 | "enabled": false, 75 | "certPath": null, 76 | "keyPath": null 77 | } 78 | }, 79 | "settings": { 80 | "peer": { 81 | "private": true 82 | }, 83 | "signing": { 84 | "support": false 85 | }, 86 | "log": { 87 | "level": "warning", 88 | "logFilePath": "/var/log/rippled/debug.log" 89 | } 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/services/__tests__/fixtures/validatorWithRocksDB.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.3", 3 | "server": { 4 | "runAs": "validatorServer", 5 | "protocols": { 6 | "peer": { 7 | "enabled": true, 8 | "secure": false, 9 | "ip": "0.0.0.0", 10 | "port": 2459 11 | }, 12 | "wsPublic": { 13 | "enabled": true, 14 | "secure": false, 15 | "admin": "127.0.0.1", 16 | "ip": "0.0.0.0", 17 | "port": 6005 18 | }, 19 | "wsAdmin": { 20 | "enabled": true, 21 | "secure": true, 22 | "admin": "127.0.0.1", 23 | "ip": "0.0.0.0", 24 | "port": 6006 25 | }, 26 | "jsonRpc": { 27 | "enabled": true, 28 | "secure": false, 29 | "admin": "127.0.0.1", 30 | "ip": "0.0.0.0", 31 | "port": 5005 32 | }, 33 | "grpc": { 34 | "enabled": true, 35 | "ip": "0.0.0.0", 36 | "port": 50051 37 | } 38 | } 39 | }, 40 | "protocol": { 41 | "nodeSize": "tiny", 42 | "history": { 43 | "type": "some", 44 | "ledgers": 256 45 | }, 46 | "validators": { 47 | "type": "knownsites", 48 | "list": ["vl.ripple.com"] 49 | }, 50 | "network": "devnet" 51 | }, 52 | "storage": { 53 | "ssd": true, 54 | "purge": { 55 | "online": { 56 | "enabled": true, 57 | "ledgers": 512 58 | }, 59 | "none": false, 60 | "advisory": true 61 | }, 62 | "database": { 63 | "type": "nudb", 64 | "path": "/var/lib/rippled/db", 65 | "bookKeepingPath": "/var/lib/rippled/db" 66 | } 67 | }, 68 | "ssl": { 69 | "client": { 70 | "verify": false, 71 | "filePath": null, 72 | "fileOrDirPath": null 73 | }, 74 | "server": { 75 | "enabled": false, 76 | "certPath": null, 77 | "keyPath": null 78 | } 79 | }, 80 | "settings": { 81 | "peer": { 82 | "private": true 83 | }, 84 | "signing": { 85 | "support": false 86 | }, 87 | "log": { 88 | "level": "warning", 89 | "logFilePath": "/var/log/rippled/debug.log" 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/services/__tests__/instructions.test.ts: -------------------------------------------------------------------------------- 1 | import 'jest' 2 | 3 | test('TODO', () => { 4 | }) 5 | -------------------------------------------------------------------------------- /src/services/__tests__/recommend.test.ts: -------------------------------------------------------------------------------- 1 | import recommend from '../recommend' 2 | import { ConfigGroup } from '../../enums' 3 | import 'jest' 4 | import validatorWithRocksDB from './fixtures/validatorWithRocksDB.json' 5 | import validatorWithALotOfLedgers from './fixtures/validatorWithALotOfLedgers.json' 6 | import productionServerWithTinySize from './fixtures/productionServerWithTinySize.json' 7 | import validatorBroadcastAddress from './fixtures/validatorBroadcastAddress.json' 8 | import nudbServer from './fixtures/nudbServer.json' 9 | 10 | test('rec0001, validator', () => { 11 | const result = recommend.list(ConfigGroup.ALL, validatorWithRocksDB) 12 | expect(1).toBe(result.length) 13 | expect(result[0]).toBe('rec0001') 14 | }) 15 | 16 | test('rec0002, validator', () => { 17 | const result = recommend.list(ConfigGroup.ALL, validatorWithALotOfLedgers) 18 | expect(1).toBe(result.length) 19 | expect(result[0]).toBe('rec0002') 20 | }) 21 | 22 | test('rec0003, validator', () => { 23 | const result = recommend.list(ConfigGroup.ALL, productionServerWithTinySize) 24 | expect(1).toBe(result.length) 25 | expect(result[0]).toBe('rec0003') 26 | }) 27 | 28 | test('rec0004, validator', () => { 29 | const result = recommend.list(ConfigGroup.ALL, validatorBroadcastAddress) 30 | expect(1).toBe(result.length) 31 | expect(result[0]).toBe('rec0004') 32 | }) 33 | 34 | test('rec0005, ssd', () => { 35 | const result = recommend.list(ConfigGroup.ALL, nudbServer) 36 | expect(1).toBe(result.length) 37 | expect(result[0]).toBe('rec0005') 38 | }) 39 | -------------------------------------------------------------------------------- /src/services/__tests__/rippled.test.ts: -------------------------------------------------------------------------------- 1 | import 'jest' 2 | 3 | test('TODO', () => { 4 | }) 5 | -------------------------------------------------------------------------------- /src/services/__tests__/validate.test.ts: -------------------------------------------------------------------------------- 1 | import validate from '../validate' 2 | import badJsonSchema from './fixtures/badJsonSchema.json' 3 | import validatorBroadcastAddress from './fixtures/validatorBroadcastAddress.json' 4 | import 'jest' 5 | 6 | test('mustBeDirOrFilePath, bad', () => { 7 | const result = validate.mustBeDirOrFilePath('asdad11_**') 8 | expect(result).toBe(false) 9 | }) 10 | 11 | test('mustBeDirOrFilePath, file name', () => { 12 | const result = validate.mustBeDirOrFilePath('test.json') 13 | expect(result).toBe(false) 14 | }) 15 | 16 | test('mustBeDirOrFilePath, file path', () => { 17 | const result = validate.mustBeDirOrFilePath('/test.json') 18 | expect(result).toBe(true) 19 | }) 20 | 21 | test('mustBeDirOrFilePath, path', () => { 22 | const result = validate.mustBeDirOrFilePath('/some/path/to/file') 23 | expect(result).toBe(true) 24 | }) 25 | 26 | test('jsonWithSchema, good config', () => { 27 | const result = validate.jsonWithSchema(validatorBroadcastAddress) 28 | expect(result.errors.length).toBe(0) 29 | }) 30 | 31 | test('jsonWithSchema, ledger string instead of number', () => { 32 | const result = validate.jsonWithSchema(badJsonSchema) 33 | expect(result.errors.length).toBe(1) 34 | }) 35 | 36 | test('mustbeValidDomain, valid domain', () => { 37 | const result = validate.mustbeValidDomain('xrpl.org') 38 | expect(result).toBe(true) 39 | }) 40 | 41 | test('mustbeValidDomain, valid subdomain', () => { 42 | const result = validate.mustbeValidDomain('start.xrpl.org') 43 | expect(result).toBe(true) 44 | }) 45 | 46 | test('mustbeValidDomain, invalid domain', () => { 47 | const result = validate.mustbeValidDomain('1dot') 48 | expect(result).toBe(false) 49 | }) 50 | -------------------------------------------------------------------------------- /src/services/instructions.ts: -------------------------------------------------------------------------------- 1 | const validatorFileName = 'validator' 2 | const installFileName = 'install' 3 | 4 | const get = async (validator: boolean, locale: string) : Promise => { 5 | const install = require(`../../public/content/txt/${installFileName}_${locale}.txt`) 6 | const result = [] 7 | result.push(install.default) 8 | if (validator) { 9 | const validator = require(`../../public/content/txt/${validatorFileName}_${locale}.txt`) 10 | result.push(validator.default) 11 | } 12 | return result.join('') 13 | } 14 | 15 | const instructions = { 16 | get 17 | } 18 | 19 | export default instructions 20 | -------------------------------------------------------------------------------- /src/services/validate.ts: -------------------------------------------------------------------------------- 1 | import jsonSchema from '../../cfg/schema.json' 2 | import { validate as validateSchema, ValidatorResult } from 'jsonschema' 3 | 4 | const mustBeFilePath = (value: string) => /^(\/[\w^ ]+)+\/?([\w.])+[^.]$/i.test(value) 5 | const mustBeDirPath = (value: string) => /^(\/[\w^ ]+)+\/?$/i.test(value) 6 | const mustbeValidDomain = (value: string) => /^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+$/i.test(value) 7 | 8 | const jsonWithSchema = (data: any) : ValidatorResult => { 9 | return validateSchema(data, jsonSchema) 10 | } 11 | 12 | const mustBeDirOrFilePath = (value: string) : boolean => { 13 | return (mustBeFilePath(value) || mustBeDirPath(value)) 14 | } 15 | 16 | const validate = { 17 | jsonWithSchema, 18 | mustBeDirOrFilePath, 19 | mustBeFilePath, 20 | mustBeDirPath, 21 | mustbeValidDomain 22 | } 23 | 24 | export default validate 25 | -------------------------------------------------------------------------------- /src/shims-tsx.d.ts: -------------------------------------------------------------------------------- 1 | import Vue, { VNode } from 'vue' 2 | 3 | declare global { 4 | namespace JSX { 5 | // tslint:disable no-empty-interface 6 | interface Element extends VNode {} 7 | // tslint:disable no-empty-interface 8 | interface ElementClass extends Vue {} 9 | interface IntrinsicElements { 10 | [elem: string]: any 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import Vue from 'vue' 3 | export default Vue 4 | } 5 | -------------------------------------------------------------------------------- /src/shims-vuex.d.ts: -------------------------------------------------------------------------------- 1 | import { Store } from '@/store' 2 | 3 | declare module '@vue/runtime-core' { 4 | interface ComponentCustomProperties { 5 | $store: Store; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/types/Config.ts: -------------------------------------------------------------------------------- 1 | import { ServerConfig } from './ServerConfig' 2 | import { ProtocolConfig } from './ProtocolConfig' 3 | import { StorageConfig } from './StorageConfig' 4 | import { SslConfig } from './SslConfig' 5 | import { SettingsConfig } from './SettingsConfig' 6 | 7 | export interface Config { 8 | server : ServerConfig, 9 | protocol: ProtocolConfig, 10 | storage: StorageConfig, 11 | ssl: SslConfig, 12 | settings: SettingsConfig 13 | } 14 | -------------------------------------------------------------------------------- /src/types/ConfigSection.ts: -------------------------------------------------------------------------------- 1 | import { ServerConfig } from './ServerConfig' 2 | import { ProtocolConfig } from './ProtocolConfig' 3 | import { StorageConfig } from './StorageConfig' 4 | import { SslConfig } from './SslConfig' 5 | import { SettingsConfig } from './SettingsConfig' 6 | 7 | export interface ConfigSection { 8 | cfg : ServerConfig | ProtocolConfig | StorageConfig | SslConfig | SettingsConfig; 9 | } 10 | -------------------------------------------------------------------------------- /src/types/ProtocolConfig.ts: -------------------------------------------------------------------------------- 1 | import { HistoryType, ValidatorListType, NodeSize, Network } from '@/enums' 2 | 3 | export interface ProtocolConfig { 4 | nodeSize: NodeSize, 5 | history: ProtocolHistory, 6 | validators: { 7 | type: string, 8 | list: ValidatorListType 9 | } 10 | network: Network 11 | } 12 | 13 | interface ProtocolHistory { 14 | type: HistoryType, 15 | ledgers: number 16 | } 17 | -------------------------------------------------------------------------------- /src/types/ProtocolProperties.ts: -------------------------------------------------------------------------------- 1 | export interface ProtocolProperties { 2 | enabled: boolean, 3 | secure?: boolean, 4 | admin?: string, 5 | ip: string, 6 | port: number 7 | } 8 | -------------------------------------------------------------------------------- /src/types/SelectOption.ts: -------------------------------------------------------------------------------- 1 | export interface SelectOption { 2 | id: string, 3 | name: string, 4 | value: string 5 | } 6 | -------------------------------------------------------------------------------- /src/types/ServerConfig.ts: -------------------------------------------------------------------------------- 1 | import { ServerType, ProtocolType } from '@/enums' 2 | import { ProtocolProperties } from './ProtocolProperties' 3 | 4 | export interface ServerConfig { 5 | runAs: ServerType, 6 | protocols: { 7 | [key: string]: ProtocolProperties; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/types/SettingsConfig.ts: -------------------------------------------------------------------------------- 1 | import { LogLevel } from '@/enums' 2 | 3 | export interface SettingsConfig { 4 | peer: { 5 | private: boolean 6 | }, 7 | signing: { 8 | support: boolean 9 | }, 10 | connections: { 11 | incoming: number, 12 | outgoing: number 13 | }, 14 | log: { 15 | level: LogLevel, 16 | logFilePath: string 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/types/SslConfig.ts: -------------------------------------------------------------------------------- 1 | export interface SslConfig { 2 | client: { 3 | verify: boolean, 4 | filePath?: string, 5 | fileOrDirPath?: string 6 | }, 7 | server: { 8 | enabled: boolean, 9 | certPath?: string, 10 | keyPath?: string 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/types/State.ts: -------------------------------------------------------------------------------- 1 | import { ServerConfig } from './ServerConfig' 2 | import { ProtocolConfig } from './ProtocolConfig' 3 | import { StorageConfig } from './StorageConfig' 4 | import { SslConfig } from './SslConfig' 5 | import { SettingsConfig } from './SettingsConfig' 6 | 7 | export interface State { 8 | currentStep: number, 9 | config: { 10 | server: ServerConfig, 11 | protocol: ProtocolConfig, 12 | storage: StorageConfig, 13 | ssl: SslConfig, 14 | settings: SettingsConfig 15 | }, 16 | locale: string 17 | } 18 | -------------------------------------------------------------------------------- /src/types/StorageConfig.ts: -------------------------------------------------------------------------------- 1 | import { DatabaseType } from '@/enums' 2 | 3 | export interface StorageConfig { 4 | purge: { 5 | online: { 6 | enabled: boolean, 7 | ledgers: number 8 | }, 9 | none: boolean, 10 | advisory: boolean 11 | }, 12 | ssd: boolean, 13 | database: { 14 | type: DatabaseType, 15 | path: string, 16 | bookKeepingPath: string 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/util/formUtils.ts: -------------------------------------------------------------------------------- 1 | import { SelectOption } from '@/types/SelectOption' 2 | 3 | export function getSelectOption (name: string, value: string, id: string) { 4 | const result: SelectOption = { 5 | name, 6 | value, 7 | id 8 | } 9 | return result 10 | } 11 | -------------------------------------------------------------------------------- /src/util/navUtils.ts: -------------------------------------------------------------------------------- 1 | export function getPathFromStepNumber (stepNumber: number): string { 2 | let path = '/' 3 | switch (stepNumber) { 4 | case 1: 5 | path = '/' 6 | break 7 | case 2: 8 | path = '/protocol' 9 | break 10 | case 3: 11 | path = '/storage' 12 | break 13 | case 4: 14 | path = '/ssl' 15 | break 16 | case 5: 17 | path = '/settings' 18 | break 19 | case 6: 20 | path = '/finished' 21 | break 22 | default: 23 | break 24 | } 25 | return path 26 | } 27 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "esnext", 5 | "strict": true, 6 | "jsx": "preserve", 7 | "importHelpers": true, 8 | "moduleResolution": "node", 9 | "experimentalDecorators": true, 10 | "allowJs": true, 11 | "skipLibCheck": true, 12 | "esModuleInterop": true, 13 | "allowSyntheticDefaultImports": true, 14 | "sourceMap": true, 15 | "resolveJsonModule": true, 16 | "baseUrl": ".", 17 | "types": [ 18 | "webpack-env", 19 | "@types/jest" 20 | ], 21 | "paths": { 22 | "@/*": [ 23 | "src/*" 24 | ] 25 | }, 26 | "lib": [ 27 | "esnext", 28 | "dom", 29 | "dom.iterable", 30 | "scripthost" 31 | ] 32 | }, 33 | "include": [ 34 | "src/**/*.ts", 35 | "src/**/*.tsx", 36 | "src/**/*.vue", 37 | "tests/**/*.ts", 38 | "tests/**/*.tsx" 39 | ], 40 | "exclude": [ 41 | "node_modules", 42 | "**/*.test.ts" 43 | ] 44 | } 45 | -------------------------------------------------------------------------------- /vue-loader.conf.ts: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | loaders: utils.cssLoaders({ 3 | sourceMap: isProduction 4 | ? config.build.productionSourceMap 5 | : config.dev.cssSourceMap, 6 | extract: isProduction 7 | }), 8 | esModule: true 9 | }; 10 | -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | 3 | module.exports = { 4 | publicPath: '', 5 | pluginOptions: { 6 | i18n: { 7 | locale: 'en', 8 | fallbackLocale: 'en', 9 | localeDir: 'locales', 10 | enableInSFC: true 11 | } 12 | }, 13 | 14 | css: { 15 | loaderOptions: { 16 | scss: { 17 | prependData: ` 18 | @import "@/scss/_variables.scss"; 19 | @import "@/scss/_fonts.scss"; 20 | @import "@/scss/_medias.scss"; 21 | @import "@/scss/_mixins.scss"; 22 | ` 23 | } 24 | } 25 | }, 26 | 27 | devServer: { 28 | disableHostCheck: true, 29 | watchOptions: { 30 | clientLogLevel: 'warning' 31 | } 32 | }, 33 | 34 | chainWebpack: config => { 35 | // Add "node_modules" alias 36 | config.resolve.alias 37 | .set('node_modules', path.join(__dirname, './node_modules')) 38 | 39 | // Disable "prefetch" plugin since it's not properly working in some browsers 40 | config.plugins 41 | .delete('prefetch') 42 | 43 | config.module 44 | .rule('raw') 45 | .test(/\.txt$/i) 46 | .use('raw-loader') 47 | .loader('raw-loader') 48 | .end() 49 | 50 | config.plugin('copy') 51 | .tap(args => { 52 | args[0].push({ 53 | from: path.resolve(__dirname, 'cfg/schema.json'), 54 | to: path.resolve(__dirname, 'dist/schema'), 55 | toType: 'dir' 56 | }) 57 | return args 58 | }) 59 | // Do not remove whitespaces 60 | config.module.rule('vue') 61 | .use('vue-loader') 62 | .loader('vue-loader') 63 | .tap(options => { 64 | options.compilerOptions.whitespace = 'preserve' 65 | return options 66 | }) 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | export const resolve = { 2 | alias: { 3 | '@': require('path').resolve(__dirname, 'src') 4 | } 5 | } 6 | --------------------------------------------------------------------------------