Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
+
+
\ No newline at end of file
diff --git a/static/CNAME b/CNAME
similarity index 100%
rename from static/CNAME
rename to CNAME
diff --git a/README.md b/README.md
deleted file mode 100644
index aaba2fa1e..000000000
--- a/README.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# Website
-
-This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator.
-
-### Installation
-
-```
-$ yarn
-```
-
-### Local Development
-
-```
-$ yarn start
-```
-
-This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
-
-### Build
-
-```
-$ yarn build
-```
-
-This command generates static content into the `build` directory and can be served using any static contents hosting service.
-
-### Deployment
-
-Using SSH:
-
-```
-$ USE_SSH=true yarn deploy
-```
-
-Not using SSH:
-
-```
-$ GIT_USER= yarn deploy
-```
-
-If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.
diff --git a/assets/css/styles.20649f07.css b/assets/css/styles.20649f07.css
new file mode 100644
index 000000000..95327c5d6
--- /dev/null
+++ b/assets/css/styles.20649f07.css
@@ -0,0 +1 @@
+.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.loadingRing_RJI3 div{box-sizing:border-box}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#00b1f4;--ifm-color-primary-dark:#009ed3;--ifm-color-primary-darker:#008cbf;--ifm-color-primary-darkest:#0076a8;--ifm-color-primary-light:#33b8f7;--ifm-color-primary-lighter:#66bff9;--ifm-color-primary-lightest:#99c6fb;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-blog-social-icon-size:1rem;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){-webkit-text-decoration:none;text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after,.searchBarContainer_NW3z.searchIndexLoading_EJ1f .searchBarLoadingRing_YnHq{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);-webkit-text-decoration:none;text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button_ni8S,.button_ni8S:hover,.card,.card:hover,.dropdown__link--active,.dropdown__link:hover,.menu__link:hover,.navbar__brand:hover,.navbar__link--active,.navbar__link:hover,.pagination-nav__link:hover,.pagination__link:hover,.sidebarItemLink_mo7H:hover,.tag_zVej:hover{-webkit-text-decoration:none;text-decoration:none}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);-webkit-text-decoration:none;text-decoration:none}.content_knG7 a,.hitFooter_E9YW a,.suggestion_fB_2.cursor_eG29 mark{-webkit-text-decoration:underline;text-decoration:underline}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;pointer-events:none;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color)}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.searchResultItem_U687>h2{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color)}.menu__caret:before,.menu__link--sublist-caret:after{content:"";height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color)}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}#nprogress,.navbar__item.dropdown .navbar__link:not([href]),.videoOverlay_xzii,.videoThumbnail_Dhao{pointer-events:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color)}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover)}.pagination-nav__link--next{grid-column:2/3;text-align:right}.card,.content_knG7,.heroBanner_qdFl,.hitFooter_E9YW{text-align:center}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto;padding-left:0}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#33b8f7;--ifm-color-primary-dark:#00b1f4;--ifm-color-primary-darker:#009ed3;--ifm-color-primary-darkest:#008cbf;--ifm-color-primary-light:#66bff9;--ifm-color-primary-lighter:#99c6fb;--ifm-color-primary-lightest:#c6daff;--docusaurus-highlighted-code-line-bg:#0000004d}.button-container{align-items:center;display:flex;justify-content:space-around}.beautiful-big-button{background:linear-gradient(45deg,var(--ifm-color-primary-lighter),var(--ifm-color-primary));border:none;border-radius:5px;box-shadow:0 4px 6px #0000001a;box-shadow:0 10px 20px #0000001a,0 6px 6px #0000001a;color:#fff;cursor:pointer;font-size:20px;padding:16px 32px;transition:background-color .3s,transform .3s}.beautiful-big-button:active{box-shadow:0 6px 12px #0000001a,0 4px 4px #0000001a;transform:scale(.98)}.beautiful-big-button:hover{background:linear-gradient(45deg,var(--ifm-color-primary-dark),var(--ifm-color-primary-darkest));box-shadow:0 14px 28px #00000026,0 10px 10px #0000001f;transform:scale(1.05)}[data-theme=dark] .beautiful-big-button{background:linear-gradient(45deg,var(--ifm-color-primary-light),var(--ifm-color-primary-darker))}[data-theme=dark] .beautiful-big-button:hover{background:linear-gradient(45deg,var(--ifm-color-primary),var(--ifm-color-primary-darkest))}.card-container{align-items:center;display:flex;gap:4rem;justify-content:center;width:100%}.card{border:1px solid #e0e0e0;border-radius:.5rem;box-shadow:0 .25rem .375rem #0000004d;display:flex;flex-direction:column;height:20rem;padding:1rem;transition:transform .3s;width:18rem}.card:hover{transform:translateY(-.5rem)}.card:active{transform:translateY(-.25rem)}.card img{border-radius:.5rem;display:block;margin:0 auto;width:auto}.dappnode-box{height:61%!important}.card h2{font-size:1.25rem;font-weight:700;margin-bottom:.5rem;margin-top:1rem}.card p{color:#777;flex-grow:1;font-size:1rem;margin:0}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.hideAction_vcyE>svg,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,#f5f6f7);border-radius:6px;box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64);left:auto!important;margin-top:8px;padding:var(--search-local-spacing,12px);position:relative;right:0!important;width:var(--search-local-modal-width,560px)}html[data-theme=dark] .searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,var(--ifm-background-color));box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309)}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2{align-items:center;background:var(--search-local-hit-background,#fff);border-radius:4px;box-shadow:var(--search-local-hit-shadow,0 1px 3px 0 #d4d9e1);color:var(--search-local-hit-color,#444950);cursor:pointer;display:flex;flex-direction:row;height:var(--search-local-hit-height,56px);padding:0 var(--search-local-spacing,12px);width:100%}.hitTree_kk6K,.noResults_l6Q3{align-items:center;display:flex}html[data-theme=dark] .dropdownMenu_qbY6 .suggestion_fB_2{background:var(--search-local-hit-background,var(--ifm-color-emphasis-100));box-shadow:var(--search-local-hit-shadow,none);color:var(--search-local-hit-color,var(--ifm-font-color-base))}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2:not(:last-child){margin-bottom:4px}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2.cursor_eG29{background-color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitFooter_E9YW a,.hitIcon_a7Zy,.hitPath_ieM4,.hitTree_kk6K,.noResultsIcon_EBY5{color:var(--search-local-muted-color,#969faf)}html[data-theme=dark] .hitIcon_a7Zy,html[data-theme=dark] .hitPath_ieM4,html[data-theme=dark] .hitTree_kk6K,html[data-theme=dark] .noResultsIcon_EBY5{color:var(--search-local-muted-color,var(--ifm-color-secondary-darkest))}.hitTree_kk6K>svg{height:var(--search-local-hit-height,56px);opacity:.5;width:24px}.hitIcon_a7Zy,.hitTree_kk6K>svg{stroke-width:var(--search-local-icon-stroke-width,1.4)}.hitAction_NqkB,.hitIcon_a7Zy{height:20px;width:20px}.hitWrapper_sAK8{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;margin:0 8px;overflow-x:hidden;width:80%}.hitWrapper_sAK8 mark{background:none;color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitTitle_vyVt{font-size:.9em}.hitPath_ieM4{font-size:.75em}.hitPath_ieM4,.hitTitle_vyVt{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.noResults_l6Q3{flex-direction:column;justify-content:center;padding:var(--search-local-spacing,12px) 0}.noResultsIcon_EBY5{margin-bottom:var(--search-local-spacing,12px)}.hitFooter_E9YW{font-size:.85em;margin-top:var(--search-local-spacing,12px)}.cursor_eG29 .hideAction_vcyE>svg,.tocCollapsibleContent_vkbj a{display:block}.suggestion_fB_2.cursor_eG29,.suggestion_fB_2.cursor_eG29 .hitIcon_a7Zy,.suggestion_fB_2.cursor_eG29 .hitPath_ieM4,.suggestion_fB_2.cursor_eG29 .hitTree_kk6K,.suggestion_fB_2.cursor_eG29 mark{color:var(--search-local-hit-active-color,var(--ifm-color-white))!important}.searchBarContainer_NW3z{margin-left:16px}.searchBarContainer_NW3z .searchBarLoadingRing_YnHq{display:none;left:10px;position:absolute;top:6px}.searchBarContainer_NW3z .searchClearButton_qk4g{background:none;border:none;line-height:1rem;padding:0;position:absolute;right:.8rem;top:50%;transform:translateY(-50%)}.navbar__search{position:relative}.searchIndexLoading_EJ1f .navbar__search-input{background-image:none}.searchHintContainer_Pkmr{align-items:center;display:flex;gap:4px;height:100%;justify-content:center;pointer-events:none;position:absolute;right:10px;top:0}.searchHint_iIMx{background-color:var(--ifm-navbar-search-input-background-color);border:1px solid var(--ifm-color-emphasis-500);box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-500);color:var(--ifm-navbar-search-input-placeholder-color)}html[dir=rtl] .searchHintContainer_Pkmr{left:10px;right:auto}html[dir=rtl] .searchBarContainer_NW3z .searchClearButton_qk4g{left:.8rem;right:auto}html[dir=rtl] .searchBarContainer_NW3z .searchBarLoadingRing_YnHq{left:auto;right:10px}html[dir=rtl] .navbar__search-input{padding:0 2.25em 0 .5em}.loadingRing_RJI3{display:inline-block;height:20px;opacity:var(--search-local-loading-icon-opacity,.5);position:relative;width:20px}.loadingRing_RJI3 div{animation:1.2s cubic-bezier(.5,0,.5,1) infinite a;border:2px solid var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color));border-color:var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color)) #0000 #0000 #0000;border-radius:50%;display:block;height:16px;margin:2px;position:absolute;width:16px}.loadingRing_RJI3 div:first-child{animation-delay:-.45s}.loadingRing_RJI3 div:nth-child(2){animation-delay:-.3s}.loadingRing_RJI3 div:nth-child(3){animation-delay:-.15s}@keyframes a{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size);font-weight:var(--ifm-font-weight-bold)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.buttons_AeoN,.features_t9lD{align-items:center;display:flex}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.yearGroupHeading_rMGB{margin-bottom:.4rem;margin-top:1.6rem}.yearGroupHeading_QT03{margin:1rem .75rem .5rem}.searchContextInput_mXoe,.searchQueryInput_CFBF{background:var(--ifm-background-color);border:var(--ifm-global-border-width) solid var(--ifm-color-content-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-font-color-base);font-size:var(--ifm-font-size-base);margin-bottom:1rem;padding:.5rem;width:100%}.searchResultItem_U687{border-bottom:1px solid #dfe3e8;padding:1rem 0}.searchResultItemPath_uIbk{color:var(--ifm-color-content-secondary);font-size:.8rem;margin:.5rem 0 0}.searchResultItemSummary_oZHr{font-style:italic;margin:.5rem 0 0}.features_t9lD{padding:2rem 0;width:100%}.featureSvg_GfXr{height:200px}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative}.buttons_AeoN{justify-content:center}.videoModal_mMww,.videoOverlay_xzii{align-items:center;display:flex;left:0}.carousel_qyqS{display:flex;gap:25px;margin:auto;max-width:89%;overflow-x:auto}.authorSocials_rSDt,.authorTitle_nd0D{overflow:hidden;-webkit-box-orient:vertical}.videoModal_mMww{background:#00000080;bottom:0;justify-content:center;position:fixed;right:0;top:0}.closeButton_muHm,.playButton_boOJ{background:none;border:none;cursor:pointer}.videoWrapper_XWWU{height:80vh;position:relative;width:80vw}.closeButton_muHm{font-size:24px;position:absolute;right:10px;top:10px}.videoOverlay_xzii{height:100%;justify-content:center;position:absolute;top:0;width:100%}.authorSocialIcon_XYv3,.authorSocialLink_owbf,.authorSocials_rSDt{height:var(--docusaurus-blog-social-icon-size)}.authorSocialIcon_XYv3,.authorSocialLink_owbf{width:var(--docusaurus-blog-social-icon-size)}.playButton_boOJ{color:#fff;font-size:50px;pointer-events:auto}[data-theme=dark] .githubSvg_Uu4N,[data-theme=dark] .instagramSvg_YC40,[data-theme=dark] .threadsSvg_PTXY,[data-theme=dark] .xSvg_y3PF{fill:var(--light)}[data-theme=light] .githubSvg_Uu4N,[data-theme=light] .instagramSvg_YC40,[data-theme=light] .threadsSvg_PTXY,[data-theme=light] .xSvg_y3PF{fill:var(--dark)}.authorSocials_rSDt{align-items:center;display:flex;flex-wrap:wrap;line-clamp:1;-webkit-line-clamp:1}.authorSocialLink_owbf,.authorSocials_rSDt{line-height:0}.authorSocialLink_owbf{margin-right:.4rem}.authorImage_XqGP{--ifm-avatar-photo-size:3.6rem}.author-as-h1_n9oJ .authorImage_XqGP{--ifm-avatar-photo-size:7rem}.author-as-h2_gXvM .authorImage_XqGP{--ifm-avatar-photo-size:5.4rem}.authorDetails_lV9A{align-items:flex-start;display:flex;flex-direction:column;justify-content:space-around}.authorName_yefp{display:flex;flex-direction:row;font-size:1.1rem;line-height:1.1rem}.author-as-h1_n9oJ .authorName_yefp{display:inline;font-size:2.4rem;line-height:2.4rem}.author-as-h2_gXvM .authorName_yefp{display:inline;font-size:1.4rem;line-height:1.4rem}.authorTitle_nd0D{display:-webkit-box;font-size:.8rem;line-height:1rem;line-clamp:1;-webkit-line-clamp:1}.author-as-h1_n9oJ .authorTitle_nd0D{font-size:1.2rem;line-height:1.6rem}.author-as-h2_gXvM .authorTitle_nd0D{font-size:1rem;line-height:1.3rem}.authorBlogPostCount_iiJ5{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.8rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.authorListItem_n3yI{list-style-type:none;margin-bottom:2rem}.authorCol_Hf19{max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color)}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.img_ev3q{height:auto}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.button_ni8S{align-items:center;background-color:var(--ifm-background-color);border:1px solid var(--ifm-color-primary);border-radius:4px;color:var(--ifm-color-primary);display:inline-flex;font-size:.75rem;font-weight:500;gap:.35rem;margin-left:auto;padding:.25rem .6rem;transition:.2s;vertical-align:middle;white-space:nowrap}.button_ni8S:hover{background-color:var(--ifm-color-primary);color:#fff}.button_ni8S:before{content:"{ }";font-family:monospace;font-size:.7rem;font-weight:700}@media screen and (min-width:768px){.button-container{flex-direction:row}}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);-webkit-text-decoration:none!important;text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block;width:max-content}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media not (max-width:996px){.searchBar_RVTs.searchBarLeft_MXDe .dropdownMenu_qbY6{left:0!important;right:auto!important}}@media only screen and (max-width:996px){.searchQueryColumn_q7nx{max-width:60%!important}.searchContextColumn_oWAF{max-width:40%!important}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media screen and (max-width:767px){.button-container{flex-direction:column}.beautiful-big-button{margin-bottom:10px}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.navbar__search-input:not(:focus){width:2rem}.searchBar_RVTs .dropdownMenu_qbY6{max-width:calc(100vw - var(--ifm-navbar-padding-horizontal)*2);width:var(--search-local-modal-width-sm,340px)}.searchBarContainer_NW3z:not(.focused_OWtg) .searchClearButton_qk4g,.searchHintContainer_Pkmr{display:none}.title_f1Hy{font-size:2rem}}@media screen and (max-width:576px){.searchQueryColumn_q7nx{max-width:100%!important}.searchContextColumn_oWAF{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}}
\ No newline at end of file
diff --git a/static/img/Dappnode_internal_IP.png b/assets/images/Dappnode_internal_IP-0dca768bdb66aa7a6864317c32179f64.png
similarity index 100%
rename from static/img/Dappnode_internal_IP.png
rename to assets/images/Dappnode_internal_IP-0dca768bdb66aa7a6864317c32179f64.png
diff --git a/static/img/Dappnode_screen.png b/assets/images/Dappnode_screen-9e04bbbfdaa9c21537262e2865da7312.png
similarity index 100%
rename from static/img/Dappnode_screen.png
rename to assets/images/Dappnode_screen-9e04bbbfdaa9c21537262e2865da7312.png
diff --git a/static/img/Dappnode_ssh.png b/assets/images/Dappnode_ssh-1d42c3fbfaf6c60cf3089cd6c688a44f.png
similarity index 100%
rename from static/img/Dappnode_ssh.png
rename to assets/images/Dappnode_ssh-1d42c3fbfaf6c60cf3089cd6c688a44f.png
diff --git a/static/img/Dappnode_wifi.png b/assets/images/Dappnode_wifi-60fa9cb414184bf4b7173f5c645f6352.png
similarity index 100%
rename from static/img/Dappnode_wifi.png
rename to assets/images/Dappnode_wifi-60fa9cb414184bf4b7173f5c645f6352.png
diff --git a/static/img/Download_Etcher.png b/assets/images/Download_Etcher-0e12704b9c93a696acfeaba23299fe53.png
similarity index 100%
rename from static/img/Download_Etcher.png
rename to assets/images/Download_Etcher-0e12704b9c93a696acfeaba23299fe53.png
diff --git a/static/img/Loading_flash.png b/assets/images/Loading_flash-6235ba645fffabe9050c09369e18578e.png
similarity index 100%
rename from static/img/Loading_flash.png
rename to assets/images/Loading_flash-6235ba645fffabe9050c09369e18578e.png
diff --git a/static/img/MEV_boost.png b/assets/images/MEV_boost-e13c7e0f9042dd694001114f37f4d067.png
similarity index 100%
rename from static/img/MEV_boost.png
rename to assets/images/MEV_boost-e13c7e0f9042dd694001114f37f4d067.png
diff --git a/static/img/Open_Etcher.png b/assets/images/Open_Etcher-12e395df66269c455643f183b70e6bb1.png
similarity index 100%
rename from static/img/Open_Etcher.png
rename to assets/images/Open_Etcher-12e395df66269c455643f183b70e6bb1.png
diff --git a/static/img/Step2.png b/assets/images/Step2-03f05ed784550e23e5fb8676be75147d.png
similarity index 100%
rename from static/img/Step2.png
rename to assets/images/Step2-03f05ed784550e23e5fb8676be75147d.png
diff --git a/static/img/Step3.png b/assets/images/Step3-a070005931f77f2357f9de8eaf9cc716.png
similarity index 100%
rename from static/img/Step3.png
rename to assets/images/Step3-a070005931f77f2357f9de8eaf9cc716.png
diff --git a/static/img/Step4_connect.png b/assets/images/Step4_connect-68c51fec5a0dc82814d430cce6312a23.png
similarity index 100%
rename from static/img/Step4_connect.png
rename to assets/images/Step4_connect-68c51fec5a0dc82814d430cce6312a23.png
diff --git a/static/img/Step5.png b/assets/images/Step5-cd8431bff08d3d816fc1dd6312569187.png
similarity index 100%
rename from static/img/Step5.png
rename to assets/images/Step5-cd8431bff08d3d816fc1dd6312569187.png
diff --git a/static/img/Step6.png b/assets/images/Step6-b17dacf439a9c28c78bdf9adb184c369.png
similarity index 100%
rename from static/img/Step6.png
rename to assets/images/Step6-b17dacf439a9c28c78bdf9adb184c369.png
diff --git a/static/img/Step7.png b/assets/images/Step7-9f2a6741f351d8f164d4bf37b6e94d8d.png
similarity index 100%
rename from static/img/Step7.png
rename to assets/images/Step7-9f2a6741f351d8f164d4bf37b6e94d8d.png
diff --git a/static/img/Step8.png b/assets/images/Step8-54a0af96b92605467d1f50f3e8132f60.png
similarity index 100%
rename from static/img/Step8.png
rename to assets/images/Step8-54a0af96b92605467d1f50f3e8132f60.png
diff --git a/static/img/activate-notifications.png b/assets/images/activate-notifications-46b6cf9d9279dbc8a851d3e1f9388501.png
similarity index 100%
rename from static/img/activate-notifications.png
rename to assets/images/activate-notifications-46b6cf9d9279dbc8a851d3e1f9388501.png
diff --git a/static/img/add-to-dock.png b/assets/images/add-to-dock-8cab6e9f562e414ddf810c4fb8879d37.png
similarity index 100%
rename from static/img/add-to-dock.png
rename to assets/images/add-to-dock-8cab6e9f562e414ddf810c4fb8879d37.png
diff --git a/static/img/allow-notifications.png b/assets/images/allow-notifications-bd00795e85dc8b4904c69bd4aa8d2fca.png
similarity index 100%
rename from static/img/allow-notifications.png
rename to assets/images/allow-notifications-bd00795e85dc8b4904c69bd4aa8d2fca.png
diff --git a/static/img/app-info.png b/assets/images/app-info-72a4780eb3c124de5bfed79af3ff98a8.png
similarity index 100%
rename from static/img/app-info.png
rename to assets/images/app-info-72a4780eb3c124de5bfed79af3ff98a8.png
diff --git a/static/img/app-popup.png b/assets/images/app-popup-8a90f56936fd674509a120305059167d.png
similarity index 100%
rename from static/img/app-popup.png
rename to assets/images/app-popup-8a90f56936fd674509a120305059167d.png
diff --git a/static/img/app-success.png b/assets/images/app-success-beb8396a0b7848e3e67e4faf03e8378b.png
similarity index 100%
rename from static/img/app-success.png
rename to assets/images/app-success-beb8396a0b7848e3e67e4faf03e8378b.png
diff --git a/static/img/backup-node-infra.png b/assets/images/backup-node-infra-a16a4f0aa2d29c1813f70ecb3d5e92e7.png
similarity index 100%
rename from static/img/backup-node-infra.png
rename to assets/images/backup-node-infra-a16a4f0aa2d29c1813f70ecb3d5e92e7.png
diff --git a/static/img/brave-settings.png b/assets/images/brave-settings-391980bef8675c1cb898c8c01c73b1c8.png
similarity index 100%
rename from static/img/brave-settings.png
rename to assets/images/brave-settings-391980bef8675c1cb898c8c01c73b1c8.png
diff --git a/static/img/browser_UI_login.png b/assets/images/browser_UI_login-841c35bddd014d58dd22fc19751657d8.png
similarity index 100%
rename from static/img/browser_UI_login.png
rename to assets/images/browser_UI_login-841c35bddd014d58dd22fc19751657d8.png
diff --git a/static/img/commands_welcome_message.png b/assets/images/commands_welcome_message-222154c662349b505e3cc94f59951d79.png
similarity index 100%
rename from static/img/commands_welcome_message.png
rename to assets/images/commands_welcome_message-222154c662349b505e3cc94f59951d79.png
diff --git a/static/img/consolidation_click.png b/assets/images/consolidation_click-59fc7856b8aa231fa0e97ef4f4b84d7d.png
similarity index 100%
rename from static/img/consolidation_click.png
rename to assets/images/consolidation_click-59fc7856b8aa231fa0e97ef4f4b84d7d.png
diff --git a/static/img/continue.png b/assets/images/continue-712da0a4fd0eafc3f60fdf675ea4b8a1.png
similarity index 100%
rename from static/img/continue.png
rename to assets/images/continue-712da0a4fd0eafc3f60fdf675ea4b8a1.png
diff --git a/static/img/continue-app.png b/assets/images/continue-app-9138f8293acf515483af4e729e46edc7.png
similarity index 100%
rename from static/img/continue-app.png
rename to assets/images/continue-app-9138f8293acf515483af4e729e46edc7.png
diff --git a/static/img/dappnode-ssv1.png b/assets/images/dappnode-ssv1-950c580e50f6f6f677341512ce02bd75.png
similarity index 100%
rename from static/img/dappnode-ssv1.png
rename to assets/images/dappnode-ssv1-950c580e50f6f6f677341512ce02bd75.png
diff --git a/static/img/dappnode-wifi.png b/assets/images/dappnode-wifi-f5bea29ef163e8454642ea24484c4a55.png
similarity index 100%
rename from static/img/dappnode-wifi.png
rename to assets/images/dappnode-wifi-f5bea29ef163e8454642ea24484c4a55.png
diff --git a/static/img/dappnode_package_network.png b/assets/images/dappnode_package_network-1b01955ff706cc5c39314bb407adf170.png
similarity index 100%
rename from static/img/dappnode_package_network.png
rename to assets/images/dappnode_package_network-1b01955ff706cc5c39314bb407adf170.png
diff --git a/static/img/dappnode_packages1.png b/assets/images/dappnode_packages1-9986b39b271ef6adbc6d4a98e907f5c7.png
similarity index 100%
rename from static/img/dappnode_packages1.png
rename to assets/images/dappnode_packages1-9986b39b271ef6adbc6d4a98e907f5c7.png
diff --git a/static/img/dappnode_packages2.png b/assets/images/dappnode_packages2-bfcef9f7947159b0341c2c914f93378e.png
similarity index 100%
rename from static/img/dappnode_packages2.png
rename to assets/images/dappnode_packages2-bfcef9f7947159b0341c2c914f93378e.png
diff --git a/static/img/dappnode_packages3.png b/assets/images/dappnode_packages3-96bce25fad6818075d28d1f51529b442.png
similarity index 100%
rename from static/img/dappnode_packages3.png
rename to assets/images/dappnode_packages3-96bce25fad6818075d28d1f51529b442.png
diff --git a/static/img/dappnode_packages4.png b/assets/images/dappnode_packages4-bb2f5a5218ea06c59a09858997773adf.png
similarity index 100%
rename from static/img/dappnode_packages4.png
rename to assets/images/dappnode_packages4-bb2f5a5218ea06c59a09858997773adf.png
diff --git a/static/img/dappnode_packages5.png b/assets/images/dappnode_packages5-dd905b985e061e57968acfccca3cd1f1.png
similarity index 100%
rename from static/img/dappnode_packages5.png
rename to assets/images/dappnode_packages5-dd905b985e061e57968acfccca3cd1f1.png
diff --git a/static/img/dappnode_packages6.png b/assets/images/dappnode_packages6-3da72f7cab4ec4f639799523d3274ff8.png
similarity index 100%
rename from static/img/dappnode_packages6.png
rename to assets/images/dappnode_packages6-3da72f7cab4ec4f639799523d3274ff8.png
diff --git a/static/img/dashboard.png b/assets/images/dashboard-d5fcdb44451606f0719f2cc138187c1c.png
similarity index 100%
rename from static/img/dashboard.png
rename to assets/images/dashboard-d5fcdb44451606f0719f2cc138187c1c.png
diff --git a/static/img/demo.gif b/assets/images/demo-3ae4e5dc0c026dfb372657f396712b72.gif
similarity index 100%
rename from static/img/demo.gif
rename to assets/images/demo-3ae4e5dc0c026dfb372657f396712b72.gif
diff --git a/static/img/deposits_validator.png b/assets/images/deposits_validator-bb581fea4e765c978db1fd81197c1dff.png
similarity index 100%
rename from static/img/deposits_validator.png
rename to assets/images/deposits_validator-bb581fea4e765c978db1fd81197c1dff.png
diff --git a/static/img/devices.png b/assets/images/devices-b1df4d994f5655f010e00f5b505449d8.png
similarity index 100%
rename from static/img/devices.png
rename to assets/images/devices-b1df4d994f5655f010e00f5b505449d8.png
diff --git a/static/img/diva-config1.png b/assets/images/diva-config1-9cd267af6aa4fb06df05a289a197b1c3.png
similarity index 100%
rename from static/img/diva-config1.png
rename to assets/images/diva-config1-9cd267af6aa4fb06df05a289a197b1c3.png
diff --git a/static/img/diva-config2.png b/assets/images/diva-config2-2e49aba2fbe6e74b845fb85f19d955ea.png
similarity index 100%
rename from static/img/diva-config2.png
rename to assets/images/diva-config2-2e49aba2fbe6e74b845fb85f19d955ea.png
diff --git a/static/img/dms-browse-dashboards.png b/assets/images/dms-browse-dashboards-37ab051b363a523366fc70f93df38cae.png
similarity index 100%
rename from static/img/dms-browse-dashboards.png
rename to assets/images/dms-browse-dashboards-37ab051b363a523366fc70f93df38cae.png
diff --git a/static/img/dms-dashboards-page.png b/assets/images/dms-dashboards-page-3e8a37465fa70b4a9da2a0fb31b0258b.png
similarity index 100%
rename from static/img/dms-dashboards-page.png
rename to assets/images/dms-dashboards-page-3e8a37465fa70b4a9da2a0fb31b0258b.png
diff --git a/static/img/dms-docker-dashboard.png b/assets/images/dms-docker-dashboard-37854c47052a09ff034780a00a42588b.png
similarity index 100%
rename from static/img/dms-docker-dashboard.png
rename to assets/images/dms-docker-dashboard-37854c47052a09ff034780a00a42588b.png
diff --git a/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg b/assets/images/docusaurus-plushie-banner-a60f7593abca1e3eef26a9afa244e4fb.jpeg
similarity index 100%
rename from blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg
rename to assets/images/docusaurus-plushie-banner-a60f7593abca1e3eef26a9afa244e4fb.jpeg
diff --git a/static/img/driving-school-logo.png b/assets/images/driving-school-logo-95fc32d66ea6db05037bd37a5ae77b9f.png
similarity index 100%
rename from static/img/driving-school-logo.png
rename to assets/images/driving-school-logo-95fc32d66ea6db05037bd37a5ae77b9f.png
diff --git a/static/img/dyndns.png b/assets/images/dyndns-f47d5e56e6cee010a45b8208a40d82c3.png
similarity index 100%
rename from static/img/dyndns.png
rename to assets/images/dyndns-f47d5e56e6cee010a45b8208a40d82c3.png
diff --git a/static/img/enable-notifications.png b/assets/images/enable-notifications-075923ce9ec6fdea6b2e25cacaafdb99.png
similarity index 100%
rename from static/img/enable-notifications.png
rename to assets/images/enable-notifications-075923ce9ec6fdea6b2e25cacaafdb99.png
diff --git a/static/img/ethereum-exit-validator.png b/assets/images/ethereum-exit-validator-cbe5bd9d4de4ba3ec4c69d377062fe52.png
similarity index 100%
rename from static/img/ethereum-exit-validator.png
rename to assets/images/ethereum-exit-validator-cbe5bd9d4de4ba3ec4c69d377062fe52.png
diff --git a/static/img/ethereum-staking-screenshot.png b/assets/images/ethereum-staking-screenshot-d41fdd2a5a44f0e9e7f4094c41ea9e2d.png
similarity index 100%
rename from static/img/ethereum-staking-screenshot.png
rename to assets/images/ethereum-staking-screenshot-d41fdd2a5a44f0e9e7f4094c41ea9e2d.png
diff --git a/static/img/ethical-metrics.png b/assets/images/ethical-metrics-5c8cad2d72b6475a0294c8f482a49b3a.png
similarity index 100%
rename from static/img/ethical-metrics.png
rename to assets/images/ethical-metrics-5c8cad2d72b6475a0294c8f482a49b3a.png
diff --git a/static/img/ethical-metrics-logo.png b/assets/images/ethical-metrics-logo-d0514fa034eae1b9bd5c57a2250d4515.png
similarity index 100%
rename from static/img/ethical-metrics-logo.png
rename to assets/images/ethical-metrics-logo-d0514fa034eae1b9bd5c57a2250d4515.png
diff --git a/static/img/ethical-metrics-setup.png b/assets/images/ethical-metrics-setup-1c7291004f39fb5cbc133557eebf35ee.png
similarity index 100%
rename from static/img/ethical-metrics-setup.png
rename to assets/images/ethical-metrics-setup-1c7291004f39fb5cbc133557eebf35ee.png
diff --git a/static/img/finish.png b/assets/images/finish-2df0f97cc1f35bd520ee8762e6d83acd.png
similarity index 100%
rename from static/img/finish.png
rename to assets/images/finish-2df0f97cc1f35bd520ee8762e6d83acd.png
diff --git a/static/img/getting-started.png b/assets/images/getting-started-0b96ec65495a5b2b8d1c08feafa4b171.png
similarity index 100%
rename from static/img/getting-started.png
rename to assets/images/getting-started-0b96ec65495a5b2b8d1c08feafa4b171.png
diff --git a/static/img/gnosis-deposit-ui-claim-deposit.png b/assets/images/gnosis-deposit-ui-claim-deposit-8270b3dcd297bab60c6003813c6c52ae.png
similarity index 100%
rename from static/img/gnosis-deposit-ui-claim-deposit.png
rename to assets/images/gnosis-deposit-ui-claim-deposit-8270b3dcd297bab60c6003813c6c52ae.png
diff --git a/static/img/gnosis-deposit-ui-connect-wallet.png b/assets/images/gnosis-deposit-ui-connect-wallet-7f55fa7b5429fc60f9cf81a130841875.png
similarity index 100%
rename from static/img/gnosis-deposit-ui-connect-wallet.png
rename to assets/images/gnosis-deposit-ui-connect-wallet-7f55fa7b5429fc60f9cf81a130841875.png
diff --git a/static/img/gnosis-deposit-ui-deposit-executed.png b/assets/images/gnosis-deposit-ui-deposit-executed-78daa713b036a8a46f512a1cda1d186f.png
similarity index 100%
rename from static/img/gnosis-deposit-ui-deposit-executed.png
rename to assets/images/gnosis-deposit-ui-deposit-executed-78daa713b036a8a46f512a1cda1d186f.png
diff --git a/static/img/gnosis-deposit-ui-deposit-submitted.png b/assets/images/gnosis-deposit-ui-deposit-submitted-e715e6c3f40dee64034d2445902261d3.png
similarity index 100%
rename from static/img/gnosis-deposit-ui-deposit-submitted.png
rename to assets/images/gnosis-deposit-ui-deposit-submitted-e715e6c3f40dee64034d2445902261d3.png
diff --git a/static/img/gnosis-deposit-ui-upload-deposit.png b/assets/images/gnosis-deposit-ui-upload-deposit-05733a1cdda007d8b01a92df65165e9d.png
similarity index 100%
rename from static/img/gnosis-deposit-ui-upload-deposit.png
rename to assets/images/gnosis-deposit-ui-upload-deposit-05733a1cdda007d8b01a92df65165e9d.png
diff --git a/static/img/gnosis-wagyu1.png b/assets/images/gnosis-wagyu1-c67da68262d9f9650ee5eb477a7b2589.png
similarity index 100%
rename from static/img/gnosis-wagyu1.png
rename to assets/images/gnosis-wagyu1-c67da68262d9f9650ee5eb477a7b2589.png
diff --git a/static/img/gnosis-wagyu2.png b/assets/images/gnosis-wagyu2-e9f88c7e6ee959624f14fcb8516753c6.png
similarity index 100%
rename from static/img/gnosis-wagyu2.png
rename to assets/images/gnosis-wagyu2-e9f88c7e6ee959624f14fcb8516753c6.png
diff --git a/static/img/gnosischain-staking.png b/assets/images/gnosischain-staking-f003eff94194ebf3febf7e770f7e538f.png
similarity index 100%
rename from static/img/gnosischain-staking.png
rename to assets/images/gnosischain-staking-f003eff94194ebf3febf7e770f7e538f.png
diff --git a/static/img/gnosiswithdrawals1.png b/assets/images/gnosiswithdrawals1-3319c9298d63c9bdc640b84a94bc4db3.png
similarity index 100%
rename from static/img/gnosiswithdrawals1.png
rename to assets/images/gnosiswithdrawals1-3319c9298d63c9bdc640b84a94bc4db3.png
diff --git a/static/img/gnosiswithdrawals2.png b/assets/images/gnosiswithdrawals2-a2f7f743a00c32f88e9b341c9f7b0e58.png
similarity index 100%
rename from static/img/gnosiswithdrawals2.png
rename to assets/images/gnosiswithdrawals2-a2f7f743a00c32f88e9b341c9f7b0e58.png
diff --git a/static/img/holesky-stakers.png b/assets/images/holesky-stakers-9a7c0d4739b3ee492f436d006562126e.png
similarity index 100%
rename from static/img/holesky-stakers.png
rename to assets/images/holesky-stakers-9a7c0d4739b3ee492f436d006562126e.png
diff --git a/static/img/install-app.png b/assets/images/install-app-22dde64fa005109b32ce4f1cba649825.png
similarity index 100%
rename from static/img/install-app.png
rename to assets/images/install-app-22dde64fa005109b32ce4f1cba649825.png
diff --git a/static/img/install-button.png b/assets/images/install-button-d55fe644a55916ad20dacb2e6c75bd07.png
similarity index 100%
rename from static/img/install-button.png
rename to assets/images/install-button-d55fe644a55916ad20dacb2e6c75bd07.png
diff --git a/static/img/launchpad1.png b/assets/images/launchpad1-a753b28ed2a802d489461a7c94e0c961.png
similarity index 100%
rename from static/img/launchpad1.png
rename to assets/images/launchpad1-a753b28ed2a802d489461a7c94e0c961.png
diff --git a/static/img/launchpad2.png b/assets/images/launchpad2-3e282073fa021d7180e64c524e0921b9.png
similarity index 100%
rename from static/img/launchpad2.png
rename to assets/images/launchpad2-3e282073fa021d7180e64c524e0921b9.png
diff --git a/static/img/launchpad3.png b/assets/images/launchpad3-9bd7c8a0bc7f1c0f0d4e3112ae2eb9ce.png
similarity index 100%
rename from static/img/launchpad3.png
rename to assets/images/launchpad3-9bd7c8a0bc7f1c0f0d4e3112ae2eb9ce.png
diff --git a/static/img/launchpad4.png b/assets/images/launchpad4-94bbe5bce7aade2be65583c0ddae47a6.png
similarity index 100%
rename from static/img/launchpad4.png
rename to assets/images/launchpad4-94bbe5bce7aade2be65583c0ddae47a6.png
diff --git a/static/img/launchpad5.png b/assets/images/launchpad5-961c3c6447f15d0a12e87a8eb7c7d732.png
similarity index 100%
rename from static/img/launchpad5.png
rename to assets/images/launchpad5-961c3c6447f15d0a12e87a8eb7c7d732.png
diff --git a/static/img/lido-csm-brain-import.png b/assets/images/lido-csm-brain-import-931b025593e1e791ae472dce17b4a2f6.png
similarity index 100%
rename from static/img/lido-csm-brain-import.png
rename to assets/images/lido-csm-brain-import-931b025593e1e791ae472dce17b4a2f6.png
diff --git a/static/img/lido-csm-config-tab.png b/assets/images/lido-csm-config-tab-c7fb1bebf1de0ef1eb30ecee4a7dff2c.png
similarity index 100%
rename from static/img/lido-csm-config-tab.png
rename to assets/images/lido-csm-config-tab-c7fb1bebf1de0ef1eb30ecee4a7dff2c.png
diff --git a/static/img/lido-csm-ensure-notifications.png b/assets/images/lido-csm-ensure-notifications-24da5f8905ac0e8f88c02b3aa2ccc18e.png
similarity index 100%
rename from static/img/lido-csm-ensure-notifications.png
rename to assets/images/lido-csm-ensure-notifications-24da5f8905ac0e8f88c02b3aa2ccc18e.png
diff --git a/static/img/lido-csm-exit-failed.png b/assets/images/lido-csm-exit-failed-c1a40f5e57d23aa055d6db230d3daa23.png
similarity index 100%
rename from static/img/lido-csm-exit-failed.png
rename to assets/images/lido-csm-exit-failed-c1a40f5e57d23aa055d6db230d3daa23.png
diff --git a/static/img/lido-csm-exit-request-warning.png b/assets/images/lido-csm-exit-request-warning-97bca18fffa89f3a29d75f5d92ce1928.png
similarity index 100%
rename from static/img/lido-csm-exit-request-warning.png
rename to assets/images/lido-csm-exit-request-warning-97bca18fffa89f3a29d75f5d92ce1928.png
diff --git a/static/img/lido-csm-exit-requested.png b/assets/images/lido-csm-exit-requested-c87d4dfaa31dedc26b98549748d0f509.png
similarity index 100%
rename from static/img/lido-csm-exit-requested.png
rename to assets/images/lido-csm-exit-requested-c87d4dfaa31dedc26b98549748d0f509.png
diff --git a/static/img/lido-csm-exit-success.png b/assets/images/lido-csm-exit-success-adc6c34aafd934e61358307adedc9822.png
similarity index 100%
rename from static/img/lido-csm-exit-success.png
rename to assets/images/lido-csm-exit-success-adc6c34aafd934e61358307adedc9822.png
diff --git a/static/img/lido-csm-infra-healthcheck.png b/assets/images/lido-csm-infra-healthcheck-a604a0e68905d8ddba967d23dac1316a.png
similarity index 100%
rename from static/img/lido-csm-infra-healthcheck.png
rename to assets/images/lido-csm-infra-healthcheck-a604a0e68905d8ddba967d23dac1316a.png
diff --git a/static/img/lido-csm-keys-not-imported-warning.png b/assets/images/lido-csm-keys-not-imported-warning-412139481617c883e7d334ef1014a6a2.png
similarity index 100%
rename from static/img/lido-csm-keys-not-imported-warning.png
rename to assets/images/lido-csm-keys-not-imported-warning-412139481617c883e7d334ef1014a6a2.png
diff --git a/static/img/lido-csm-log-in-already-NO.png b/assets/images/lido-csm-log-in-already-NO-73d10878dc29bca9157afc26ca1bb611.png
similarity index 100%
rename from static/img/lido-csm-log-in-already-NO.png
rename to assets/images/lido-csm-log-in-already-NO-73d10878dc29bca9157afc26ca1bb611.png
diff --git a/static/img/lido-csm-notifications-modal.png b/assets/images/lido-csm-notifications-modal-90a669424cf7b7048bd3ce55a2417279.png
similarity index 100%
rename from static/img/lido-csm-notifications-modal.png
rename to assets/images/lido-csm-notifications-modal-90a669424cf7b7048bd3ce55a2417279.png
diff --git a/static/img/lido-csm-performance-cards.png b/assets/images/lido-csm-performance-cards-16985805400e2365c98ae035610c5d4e.png
similarity index 100%
rename from static/img/lido-csm-performance-cards.png
rename to assets/images/lido-csm-performance-cards-16985805400e2365c98ae035610c5d4e.png
diff --git a/static/img/lido-csm-performance-chart.png b/assets/images/lido-csm-performance-chart-c5505bbb599d3d33274728865dce9620.png
similarity index 100%
rename from static/img/lido-csm-performance-chart.png
rename to assets/images/lido-csm-performance-chart-c5505bbb599d3d33274728865dce9620.png
diff --git a/static/img/lido-csm-performance-notification-above.png b/assets/images/lido-csm-performance-notification-above-96c382868f77fb2730c7ae422a8b31a9.png
similarity index 100%
rename from static/img/lido-csm-performance-notification-above.png
rename to assets/images/lido-csm-performance-notification-above-96c382868f77fb2730c7ae422a8b31a9.png
diff --git a/static/img/lido-csm-performance-notification-below.png b/assets/images/lido-csm-performance-notification-below-5bc1e36ef158f678a3227b740ae18369.png
similarity index 100%
rename from static/img/lido-csm-performance-notification-below.png
rename to assets/images/lido-csm-performance-notification-below-5bc1e36ef158f678a3227b740ae18369.png
diff --git a/static/img/lido-csm-performance-tab.png b/assets/images/lido-csm-performance-tab-0afcdd62fc4ab528a30c9d0f4c36ce48.png
similarity index 100%
rename from static/img/lido-csm-performance-tab.png
rename to assets/images/lido-csm-performance-tab-0afcdd62fc4ab528a30c9d0f4c36ce48.png
diff --git a/static/img/lido-csm-performance-table.png b/assets/images/lido-csm-performance-table-0cf1f40d756b1cf274d4ea6a29f5fe3e.png
similarity index 100%
rename from static/img/lido-csm-performance-table.png
rename to assets/images/lido-csm-performance-table-0cf1f40d756b1cf274d4ea6a29f5fe3e.png
diff --git a/static/img/lido-csm-relay-notification.png b/assets/images/lido-csm-relay-notification-73cbde5feb7836ee255249095b97b054.png
similarity index 100%
rename from static/img/lido-csm-relay-notification.png
rename to assets/images/lido-csm-relay-notification-73cbde5feb7836ee255249095b97b054.png
diff --git a/static/img/lido-csm-relays-warnings.png b/assets/images/lido-csm-relays-warnings-2a679e60b83cbc94f3bf3fbc572d4899.png
similarity index 100%
rename from static/img/lido-csm-relays-warnings.png
rename to assets/images/lido-csm-relays-warnings-2a679e60b83cbc94f3bf3fbc572d4899.png
diff --git a/static/img/lido-csm-report-submitted.png b/assets/images/lido-csm-report-submitted-92821ceb721fb8d41d56cdc1c8625f3f.png
similarity index 100%
rename from static/img/lido-csm-report-submitted.png
rename to assets/images/lido-csm-report-submitted-92821ceb721fb8d41d56cdc1c8625f3f.png
diff --git a/static/img/lido-csm-setup-notifications.png b/assets/images/lido-csm-setup-notifications-6b2635b85b84d6d5def3534b1d8552e3.png
similarity index 100%
rename from static/img/lido-csm-setup-notifications.png
rename to assets/images/lido-csm-setup-notifications-6b2635b85b84d6d5def3534b1d8552e3.png
diff --git a/static/img/lido-csm-ss-docs1.png b/assets/images/lido-csm-ss-docs1-032f26e141f28c01d7bd345801acc174.png
similarity index 100%
rename from static/img/lido-csm-ss-docs1.png
rename to assets/images/lido-csm-ss-docs1-032f26e141f28c01d7bd345801acc174.png
diff --git a/static/img/lido-csm-ss-docs2.png b/assets/images/lido-csm-ss-docs2-c66d0577d30534e1c30998b48a96a0b5.png
similarity index 100%
rename from static/img/lido-csm-ss-docs2.png
rename to assets/images/lido-csm-ss-docs2-c66d0577d30534e1c30998b48a96a0b5.png
diff --git a/static/img/lido-csm-ss-docs4.png b/assets/images/lido-csm-ss-docs4-55dc8306e52af58aca69e3f573a2d345.png
similarity index 100%
rename from static/img/lido-csm-ss-docs4.png
rename to assets/images/lido-csm-ss-docs4-55dc8306e52af58aca69e3f573a2d345.png
diff --git a/static/img/lido-csm-ss-docs5.png b/assets/images/lido-csm-ss-docs5-01fdabc27d6d6c62a2df11162754ed3e.png
similarity index 100%
rename from static/img/lido-csm-ss-docs5.png
rename to assets/images/lido-csm-ss-docs5-01fdabc27d6d6c62a2df11162754ed3e.png
diff --git a/static/img/lido-csm-stuck.png b/assets/images/lido-csm-stuck-ff03ce02cda4e6cc730d5bc9c7498e26.png
similarity index 100%
rename from static/img/lido-csm-stuck.png
rename to assets/images/lido-csm-stuck-ff03ce02cda4e6cc730d5bc9c7498e26.png
diff --git a/static/img/lido-csm-telegram-update.png b/assets/images/lido-csm-telegram-update-1a46e5289a71e893d1df3724694c461e.png
similarity index 100%
rename from static/img/lido-csm-telegram-update.png
rename to assets/images/lido-csm-telegram-update-1a46e5289a71e893d1df3724694c461e.png
diff --git a/static/img/lido-csm-wallet-connected.png b/assets/images/lido-csm-wallet-connected-113b5e31772ef307fb762443fa5cac15.png
similarity index 100%
rename from static/img/lido-csm-wallet-connected.png
rename to assets/images/lido-csm-wallet-connected-113b5e31772ef307fb762443fa5cac15.png
diff --git a/static/img/lido-infra.png b/assets/images/lido-infra-a00927b2b6ee742595c755da57c36fc8.png
similarity index 100%
rename from static/img/lido-infra.png
rename to assets/images/lido-infra-a00927b2b6ee742595c755da57c36fc8.png
diff --git a/static/img/lido-keystore-not-imported.png b/assets/images/lido-keystore-not-imported-ba70b9757a3c033322075d7fa85858f0.png
similarity index 100%
rename from static/img/lido-keystore-not-imported.png
rename to assets/images/lido-keystore-not-imported-ba70b9757a3c033322075d7fa85858f0.png
diff --git a/static/img/lido-notification-ejector.png b/assets/images/lido-notification-ejector-e74dca0b48d81e4b543f11a305324477.png
similarity index 100%
rename from static/img/lido-notification-ejector.png
rename to assets/images/lido-notification-ejector-e74dca0b48d81e4b543f11a305324477.png
diff --git a/static/img/lido-notifications-onboarding.png b/assets/images/lido-notifications-onboarding-ef5563fe24897cd96567072cde6ad1d2.png
similarity index 100%
rename from static/img/lido-notifications-onboarding.png
rename to assets/images/lido-notifications-onboarding-ef5563fe24897cd96567072cde6ad1d2.png
diff --git a/static/img/list_validators.png b/assets/images/list_validators-dbbb41ed0798116b9b8166e25bb284b3.png
similarity index 100%
rename from static/img/list_validators.png
rename to assets/images/list_validators-dbbb41ed0798116b9b8166e25bb284b3.png
diff --git a/static/img/lukso-launchpad1.png b/assets/images/lukso-launchpad1-feee8e797237cfdda9065a0778c87e82.png
similarity index 100%
rename from static/img/lukso-launchpad1.png
rename to assets/images/lukso-launchpad1-feee8e797237cfdda9065a0778c87e82.png
diff --git a/static/img/lukso-launchpad2.png b/assets/images/lukso-launchpad2-a06471841b30d5377c567417d618aa98.png
similarity index 100%
rename from static/img/lukso-launchpad2.png
rename to assets/images/lukso-launchpad2-a06471841b30d5377c567417d618aa98.png
diff --git a/static/img/lukso-launchpad3.png b/assets/images/lukso-launchpad3-bca6aef08176b4d71d978494ad6c947e.png
similarity index 100%
rename from static/img/lukso-launchpad3.png
rename to assets/images/lukso-launchpad3-bca6aef08176b4d71d978494ad6c947e.png
diff --git a/static/img/lukso-launchpad4.png b/assets/images/lukso-launchpad4-fda4750d49c92053aff1fe0e3a0a02f2.png
similarity index 100%
rename from static/img/lukso-launchpad4.png
rename to assets/images/lukso-launchpad4-fda4750d49c92053aff1fe0e3a0a02f2.png
diff --git a/static/img/lukso-staking-screenshot.png b/assets/images/lukso-staking-screenshot-605e7ed6329f5a73b11a6b8cc4015c9c.png
similarity index 100%
rename from static/img/lukso-staking-screenshot.png
rename to assets/images/lukso-staking-screenshot-605e7ed6329f5a73b11a6b8cc4015c9c.png
diff --git a/static/img/lukso-wagyu1.png b/assets/images/lukso-wagyu1-e38f326b1d87e8192b3cfe2193d5c8ed.png
similarity index 100%
rename from static/img/lukso-wagyu1.png
rename to assets/images/lukso-wagyu1-e38f326b1d87e8192b3cfe2193d5c8ed.png
diff --git a/static/img/lukso-wagyu2.png b/assets/images/lukso-wagyu2-118e3f6a51c4c39294effac0a4a6afe3.png
similarity index 100%
rename from static/img/lukso-wagyu2.png
rename to assets/images/lukso-wagyu2-118e3f6a51c4c39294effac0a4a6afe3.png
diff --git a/static/img/lukso-web3signer.png b/assets/images/lukso-web3signer-31c35566a88612cb0658f7eade5b358a.png
similarity index 100%
rename from static/img/lukso-web3signer.png
rename to assets/images/lukso-web3signer-31c35566a88612cb0658f7eade5b358a.png
diff --git a/static/img/manage-devices.png b/assets/images/manage-devices-e827fdd5fe076c7b23c4fcd8577aa9dc.png
similarity index 100%
rename from static/img/manage-devices.png
rename to assets/images/manage-devices-e827fdd5fe076c7b23c4fcd8577aa9dc.png
diff --git a/static/img/node_distribution.png b/assets/images/node_distribution-48b18d5d9b5d462eb1049d3a8aa33a27.png
similarity index 100%
rename from static/img/node_distribution.png
rename to assets/images/node_distribution-48b18d5d9b5d462eb1049d3a8aa33a27.png
diff --git a/static/img/notifications-devices.png b/assets/images/notifications-devices-4e142bb7f529e71931fc7438fc353f71.png
similarity index 100%
rename from static/img/notifications-devices.png
rename to assets/images/notifications-devices-4e142bb7f529e71931fc7438fc353f71.png
diff --git a/static/img/notifications-inbox.png b/assets/images/notifications-inbox-ebcd098f1dc2ffcbec4cd60f5ecb5aa5.png
similarity index 100%
rename from static/img/notifications-inbox.png
rename to assets/images/notifications-inbox-ebcd098f1dc2ffcbec4cd60f5ecb5aa5.png
diff --git a/static/img/notifications-settings.png b/assets/images/notifications-settings-4567c9bc82ce1191148277813181fc5b.png
similarity index 100%
rename from static/img/notifications-settings.png
rename to assets/images/notifications-settings-4567c9bc82ce1191148277813181fc5b.png
diff --git a/static/img/notifications-settings-installer.png b/assets/images/notifications-settings-installer-3e96781f3464a4a74ee564c1940c4c6a.png
similarity index 100%
rename from static/img/notifications-settings-installer.png
rename to assets/images/notifications-settings-installer-3e96781f3464a4a74ee564c1940c4c6a.png
diff --git a/static/img/notifications_access.png b/assets/images/notifications_access-f9218821a9933b8293aefa3608551e15.png
similarity index 100%
rename from static/img/notifications_access.png
rename to assets/images/notifications_access-f9218821a9933b8293aefa3608551e15.png
diff --git a/static/img/notifications_inbox.png b/assets/images/notifications_inbox-b08c50b3ae68074da28544ce2d25c66a.png
similarity index 100%
rename from static/img/notifications_inbox.png
rename to assets/images/notifications_inbox-b08c50b3ae68074da28544ce2d25c66a.png
diff --git a/static/img/notifications_legacy.png b/assets/images/notifications_legacy-8188ab9a99279c46ce1423d4cd67d05c.png
similarity index 100%
rename from static/img/notifications_legacy.png
rename to assets/images/notifications_legacy-8188ab9a99279c46ce1423d4cd67d05c.png
diff --git a/static/img/notifications_settings.png b/assets/images/notifications_settings-f79b6aae5ea6354af4b6f7989fb9268c.png
similarity index 100%
rename from static/img/notifications_settings.png
rename to assets/images/notifications_settings-f79b6aae5ea6354af4b6f7989fb9268c.png
diff --git a/static/img/obol-launchpad1.png b/assets/images/obol-launchpad1-384f64d06e76a09d4ec520ee76cf7fdf.png
similarity index 100%
rename from static/img/obol-launchpad1.png
rename to assets/images/obol-launchpad1-384f64d06e76a09d4ec520ee76cf7fdf.png
diff --git a/static/img/obol-launchpad2.png b/assets/images/obol-launchpad2-ce96b4add6b5709c4d88acb38a73a1ee.png
similarity index 100%
rename from static/img/obol-launchpad2.png
rename to assets/images/obol-launchpad2-ce96b4add6b5709c4d88acb38a73a1ee.png
diff --git a/static/img/obol-launchpad3.png b/assets/images/obol-launchpad3-c7f4df9b4d7b753d8d0e027b7a659bee.png
similarity index 100%
rename from static/img/obol-launchpad3.png
rename to assets/images/obol-launchpad3-c7f4df9b4d7b753d8d0e027b7a659bee.png
diff --git a/static/img/obol-launchpad4.png b/assets/images/obol-launchpad4-f9db7d75efeda34396609e991e2840b6.png
similarity index 100%
rename from static/img/obol-launchpad4.png
rename to assets/images/obol-launchpad4-f9db7d75efeda34396609e991e2840b6.png
diff --git a/static/img/obol-launchpad5.png b/assets/images/obol-launchpad5-678df34a484ab38012fd657c9dcfaf7e.png
similarity index 100%
rename from static/img/obol-launchpad5.png
rename to assets/images/obol-launchpad5-678df34a484ab38012fd657c9dcfaf7e.png
diff --git a/static/img/obol-launchpad6.png b/assets/images/obol-launchpad6-2048cc9b6c237bb96964596ee7bd32ec.png
similarity index 100%
rename from static/img/obol-launchpad6.png
rename to assets/images/obol-launchpad6-2048cc9b6c237bb96964596ee7bd32ec.png
diff --git a/static/img/obol-launchpad7.png b/assets/images/obol-launchpad7-11fdbb602d3e193d4a456ba9e0e05e1b.png
similarity index 100%
rename from static/img/obol-launchpad7.png
rename to assets/images/obol-launchpad7-11fdbb602d3e193d4a456ba9e0e05e1b.png
diff --git a/static/img/optimism-menu.png b/assets/images/optimism-menu-60612170996d4b9863d79b0a737bb280.png
similarity index 100%
rename from static/img/optimism-menu.png
rename to assets/images/optimism-menu-60612170996d4b9863d79b0a737bb280.png
diff --git a/static/img/overwrite-remote-eth-rpc.png b/assets/images/overwrite-remote-eth-rpc-dc10cf27dca37dd9b6eda81dcad60092.png
similarity index 100%
rename from static/img/overwrite-remote-eth-rpc.png
rename to assets/images/overwrite-remote-eth-rpc-dc10cf27dca37dd9b6eda81dcad60092.png
diff --git a/static/img/pkg-ownership-change-manager.png b/assets/images/pkg-ownership-change-manager-82ecca1b7b2637fc29ebbb10157193d5.png
similarity index 100%
rename from static/img/pkg-ownership-change-manager.png
rename to assets/images/pkg-ownership-change-manager-82ecca1b7b2637fc29ebbb10157193d5.png
diff --git a/static/img/pkg-ownership-connect.png b/assets/images/pkg-ownership-connect-a0129fa2f2ddc0b15bed39572ff31fbb.png
similarity index 100%
rename from static/img/pkg-ownership-connect.png
rename to assets/images/pkg-ownership-connect-a0129fa2f2ddc0b15bed39572ff31fbb.png
diff --git a/static/img/pkg-ownership-developer.png b/assets/images/pkg-ownership-developer-36db8d52926043fe4994ecbd9198d71b.png
similarity index 100%
rename from static/img/pkg-ownership-developer.png
rename to assets/images/pkg-ownership-developer-36db8d52926043fe4994ecbd9198d71b.png
diff --git a/static/img/pkg-ownership-ens.png b/assets/images/pkg-ownership-ens-a2312af3fa7d7d0b98f663c528d151b7.png
similarity index 100%
rename from static/img/pkg-ownership-ens.png
rename to assets/images/pkg-ownership-ens-a2312af3fa7d7d0b98f663c528d151b7.png
diff --git a/static/img/pkg-ownership-grant-developer.png b/assets/images/pkg-ownership-grant-developer-cf868b4a327d1cf4f7f9ff604c046326.png
similarity index 100%
rename from static/img/pkg-ownership-grant-developer.png
rename to assets/images/pkg-ownership-grant-developer-cf868b4a327d1cf4f7f9ff604c046326.png
diff --git a/static/img/pkg-ownership-navigate.png b/assets/images/pkg-ownership-navigate-97a949c0ab8c0386dd12925f0f159a68.png
similarity index 100%
rename from static/img/pkg-ownership-navigate.png
rename to assets/images/pkg-ownership-navigate-97a949c0ab8c0386dd12925f0f159a68.png
diff --git a/static/img/pkg-ownership-revoke-developer.png b/assets/images/pkg-ownership-revoke-developer-459a52b959a310608299c66bdd525099.png
similarity index 100%
rename from static/img/pkg-ownership-revoke-developer.png
rename to assets/images/pkg-ownership-revoke-developer-459a52b959a310608299c66bdd525099.png
diff --git a/static/img/pkg-ownership-standard.png b/assets/images/pkg-ownership-standard-29b116867b0f5d018701c815923865e5.png
similarity index 100%
rename from static/img/pkg-ownership-standard.png
rename to assets/images/pkg-ownership-standard-29b116867b0f5d018701c815923865e5.png
diff --git a/static/img/registering_operator_0.png b/assets/images/registering_operator_0-e647e1e4829436efc11a050874d93a09.png
similarity index 100%
rename from static/img/registering_operator_0.png
rename to assets/images/registering_operator_0-e647e1e4829436efc11a050874d93a09.png
diff --git a/static/img/registering_operator_2.png b/assets/images/registering_operator_2-38c04daca0578311df35d8deb7cb0611.png
similarity index 100%
rename from static/img/registering_operator_2.png
rename to assets/images/registering_operator_2-38c04daca0578311df35d8deb7cb0611.png
diff --git a/static/img/registering_operator_4.png b/assets/images/registering_operator_4-29fc3b3d2323081a17696a69e65e0b72.png
similarity index 100%
rename from static/img/registering_operator_4.png
rename to assets/images/registering_operator_4-29fc3b3d2323081a17696a69e65e0b72.png
diff --git a/static/img/registering_operator_5.png b/assets/images/registering_operator_5-a32b9a74cd2e40125d144a64ba459e3e.png
similarity index 100%
rename from static/img/registering_operator_5.png
rename to assets/images/registering_operator_5-a32b9a74cd2e40125d144a64ba459e3e.png
diff --git a/static/img/registering_operator_7.png b/assets/images/registering_operator_7-78eba980f52e82ad4d8e2bd4cf0af1c5.png
similarity index 100%
rename from static/img/registering_operator_7.png
rename to assets/images/registering_operator_7-78eba980f52e82ad4d8e2bd4cf0af1c5.png
diff --git a/static/img/release-trusted-keys.png b/assets/images/release-trusted-keys-b7f251d78c925c3b5c2692777afbd842.png
similarity index 100%
rename from static/img/release-trusted-keys.png
rename to assets/images/release-trusted-keys-b7f251d78c925c3b5c2692777afbd842.png
diff --git a/static/img/repository-ipfs-local.png b/assets/images/repository-ipfs-local-ba4ff0f2389c7a6acfc1dd18a92b5769.png
similarity index 100%
rename from static/img/repository-ipfs-local.png
rename to assets/images/repository-ipfs-local-ba4ff0f2389c7a6acfc1dd18a92b5769.png
diff --git a/static/img/repository-ipfs-remote.png b/assets/images/repository-ipfs-remote-63afc9cdd838ed399994b7563390b7b4.png
similarity index 100%
rename from static/img/repository-ipfs-remote.png
rename to assets/images/repository-ipfs-remote-63afc9cdd838ed399994b7563390b7b4.png
diff --git a/static/img/rocketpool.png b/assets/images/rocketpool-b58a9096fceb354093092b52031ad31a.png
similarity index 100%
rename from static/img/rocketpool.png
rename to assets/images/rocketpool-b58a9096fceb354093092b52031ad31a.png
diff --git a/static/img/safari-popup.png b/assets/images/safari-popup-a44183a8aab6d6cd324db5465cac6cdf.png
similarity index 100%
rename from static/img/safari-popup.png
rename to assets/images/safari-popup-a44183a8aab6d6cd324db5465cac6cdf.png
diff --git a/static/img/setup-1.png b/assets/images/setup-1-20f4539a87a606b2ab7be68a06080912.png
similarity index 100%
rename from static/img/setup-1.png
rename to assets/images/setup-1-20f4539a87a606b2ab7be68a06080912.png
diff --git a/static/img/setup-2.png b/assets/images/setup-2-a5a1f0456cdbb9e861104376a30d3047.png
similarity index 100%
rename from static/img/setup-2.png
rename to assets/images/setup-2-a5a1f0456cdbb9e861104376a30d3047.png
diff --git a/static/img/setup-3.png b/assets/images/setup-3-6b0500114fc971ac2b4e23aee5e2a6a7.png
similarity index 100%
rename from static/img/setup-3.png
rename to assets/images/setup-3-6b0500114fc971ac2b4e23aee5e2a6a7.png
diff --git a/static/img/setup-4.png b/assets/images/setup-4-853e6ca7d1d4f5dea03695e39223e572.png
similarity index 100%
rename from static/img/setup-4.png
rename to assets/images/setup-4-853e6ca7d1d4f5dea03695e39223e572.png
diff --git a/static/img/setup-5.png b/assets/images/setup-5-7ef2fb5a75d77003c5192bafbd656ff8.png
similarity index 100%
rename from static/img/setup-5.png
rename to assets/images/setup-5-7ef2fb5a75d77003c5192bafbd656ff8.png
diff --git a/static/img/setup-6.png b/assets/images/setup-6-8ca9deab19513fdc4b62aa78b4a5297c.png
similarity index 100%
rename from static/img/setup-6.png
rename to assets/images/setup-6-8ca9deab19513fdc4b62aa78b4a5297c.png
diff --git a/static/img/signed-safe-switch.png b/assets/images/signed-safe-switch-e6d549eb68086ef3684269e4c7692474.png
similarity index 100%
rename from static/img/signed-safe-switch.png
rename to assets/images/signed-safe-switch-e6d549eb68086ef3684269e4c7692474.png
diff --git a/static/img/smooth-unsub-table.png b/assets/images/smooth-unsub-table-bebccc787b3582ee85af18702df67c05.png
similarity index 100%
rename from static/img/smooth-unsub-table.png
rename to assets/images/smooth-unsub-table-bebccc787b3582ee85af18702df67c05.png
diff --git a/static/img/smooth_fee_recipient.png b/assets/images/smooth_fee_recipient-9a97308ed0c601ccc84b0295efe34cd4.png
similarity index 100%
rename from static/img/smooth_fee_recipient.png
rename to assets/images/smooth_fee_recipient-9a97308ed0c601ccc84b0295efe34cd4.png
diff --git a/static/img/smooth_my_validators.png b/assets/images/smooth_my_validators-72848a79b68c9a1ab67d754537f6e2c9.png
similarity index 100%
rename from static/img/smooth_my_validators.png
rename to assets/images/smooth_my_validators-72848a79b68c9a1ab67d754537f6e2c9.png
diff --git a/static/img/smooth_states.png b/assets/images/smooth_states-1ba74d83a78fa2e0b740effe50c30ee8.png
similarity index 100%
rename from static/img/smooth_states.png
rename to assets/images/smooth_states-1ba74d83a78fa2e0b740effe50c30ee8.png
diff --git a/static/img/solo-staking-ethereum.png b/assets/images/solo-staking-ethereum-d4f9cd76d07ba97523a818af09c1a4a5.png
similarity index 100%
rename from static/img/solo-staking-ethereum.png
rename to assets/images/solo-staking-ethereum-d4f9cd76d07ba97523a818af09c1a4a5.png
diff --git a/static/img/stakersnumbers.png b/assets/images/stakersnumbers-56800861e56cfac985a15737928b2cc7.png
similarity index 100%
rename from static/img/stakersnumbers.png
rename to assets/images/stakersnumbers-56800861e56cfac985a15737928b2cc7.png
diff --git a/static/img/stakerstab.png b/assets/images/stakerstab-c3ae3999bd921b68b0d7c4c3e712e9ba.png
similarity index 100%
rename from static/img/stakerstab.png
rename to assets/images/stakerstab-c3ae3999bd921b68b0d7c4c3e712e9ba.png
diff --git a/static/img/subscribe-device.png b/assets/images/subscribe-device-82abf205c19d63ada5e9c5c6f1836e03.png
similarity index 100%
rename from static/img/subscribe-device.png
rename to assets/images/subscribe-device-82abf205c19d63ada5e9c5c6f1836e03.png
diff --git a/static/img/summary.png b/assets/images/summary-870e3e69d7251dfc3ee105fa46c3f73f.png
similarity index 100%
rename from static/img/summary.png
rename to assets/images/summary-870e3e69d7251dfc3ee105fa46c3f73f.png
diff --git a/static/img/three-points.png b/assets/images/three-points-ac9341b3915e088c31669e0a1a25ca82.png
similarity index 100%
rename from static/img/three-points.png
rename to assets/images/three-points-ac9341b3915e088c31669e0a1a25ca82.png
diff --git a/static/img/validator_key.png b/assets/images/validator_key-0892560f7194edf59ce029e943258418.png
similarity index 100%
rename from static/img/validator_key.png
rename to assets/images/validator_key-0892560f7194edf59ce029e943258418.png
diff --git a/static/img/vpn-1.png b/assets/images/vpn-1-6287a68b939ea706930361adde9259e2.png
similarity index 100%
rename from static/img/vpn-1.png
rename to assets/images/vpn-1-6287a68b939ea706930361adde9259e2.png
diff --git a/static/img/wagyu1.png b/assets/images/wagyu1-e570b05560adf66a1fe0d5c75961cf84.png
similarity index 100%
rename from static/img/wagyu1.png
rename to assets/images/wagyu1-e570b05560adf66a1fe0d5c75961cf84.png
diff --git a/static/img/wagyu2.png b/assets/images/wagyu2-56f62ea0d459fc876917956e12a5310c.png
similarity index 100%
rename from static/img/wagyu2.png
rename to assets/images/wagyu2-56f62ea0d459fc876917956e12a5310c.png
diff --git a/static/img/wagyu3.png b/assets/images/wagyu3-c924247c89934873bbccd3d4867afdce.png
similarity index 100%
rename from static/img/wagyu3.png
rename to assets/images/wagyu3-c924247c89934873bbccd3d4867afdce.png
diff --git a/static/img/wagyu4.png b/assets/images/wagyu4-0673a83463eb844993339ecfdcc59b41.png
similarity index 100%
rename from static/img/wagyu4.png
rename to assets/images/wagyu4-0673a83463eb844993339ecfdcc59b41.png
diff --git a/static/img/wagyu5.png b/assets/images/wagyu5-644261c1588e13ba1177d70aef9ecf19.png
similarity index 100%
rename from static/img/wagyu5.png
rename to assets/images/wagyu5-644261c1588e13ba1177d70aef9ecf19.png
diff --git a/static/img/wagyu6.png b/assets/images/wagyu6-d5538d2bbd5a01f47d94c6c5b29b3abf.png
similarity index 100%
rename from static/img/wagyu6.png
rename to assets/images/wagyu6-d5538d2bbd5a01f47d94c6c5b29b3abf.png
diff --git a/static/img/wagyu7.png b/assets/images/wagyu7-8c346a2c9519b98a530d1005a69247f2.png
similarity index 100%
rename from static/img/wagyu7.png
rename to assets/images/wagyu7-8c346a2c9519b98a530d1005a69247f2.png
diff --git a/static/img/write_address.png b/assets/images/write_address-5d1edf9e42b1c5dfad9c06777e8cd26e.png
similarity index 100%
rename from static/img/write_address.png
rename to assets/images/write_address-5d1edf9e42b1c5dfad9c06777e8cd26e.png
diff --git a/assets/js/0058b4c6.b862f130.js b/assets/js/0058b4c6.b862f130.js
new file mode 100644
index 000000000..f6a352261
--- /dev/null
+++ b/assets/js/0058b4c6.b862f130.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[849],{86164:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"userSidebar":[{"type":"category","label":"Getting started","items":[{"type":"link","label":"Choose your path","href":"/docs/user/getting-started/choose-your-path","docId":"user/getting-started/choose-your-path","unlisted":false},{"type":"link","label":"Connect your Dappnode to the router","href":"/docs/user/getting-started/connect-dappnode-to-the-router","docId":"user/getting-started/connect-dappnode-to-the-router","unlisted":false},{"type":"link","label":"Access your Dappnode via WiFi","href":"/docs/user/getting-started/access-dappnode-via-wifi","docId":"user/getting-started/access-dappnode-via-wifi","unlisted":false},{"type":"link","label":"Register","href":"/docs/user/getting-started/register","docId":"user/getting-started/register","unlisted":false},{"type":"link","label":"Setup","href":"/docs/user/getting-started/setup","docId":"user/getting-started/setup","unlisted":false},{"type":"link","label":"Next steps","href":"/docs/user/getting-started/next-steps","docId":"user/getting-started/next-steps","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Access your dappnode","items":[{"type":"link","label":"Overview","href":"/docs/user/access-your-dappnode/overview","docId":"user/access-your-dappnode/overview","unlisted":false},{"type":"link","label":"Wi-Fi","href":"/docs/user/access-your-dappnode/wifi","docId":"user/access-your-dappnode/wifi","unlisted":false},{"type":"category","label":"VPN","items":[{"type":"link","label":"Overview","href":"/docs/user/access-your-dappnode/vpn/overview","docId":"user/access-your-dappnode/vpn/overview","unlisted":false},{"type":"link","label":"Tailscale","href":"/docs/user/access-your-dappnode/vpn/tailscale","docId":"user/access-your-dappnode/vpn/tailscale","unlisted":false},{"type":"link","label":"Wireguard","href":"/docs/user/access-your-dappnode/vpn/wireguard","docId":"user/access-your-dappnode/vpn/wireguard","unlisted":false},{"type":"link","label":"OpenVPN","href":"/docs/user/access-your-dappnode/vpn/openvpn","docId":"user/access-your-dappnode/vpn/openvpn","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Terminal (Advanced)","href":"/docs/user/access-your-dappnode/terminal","docId":"user/access-your-dappnode/terminal","unlisted":false},{"type":"link","label":"Local Proxy (Recovery)","href":"/docs/user/access-your-dappnode/local","docId":"user/access-your-dappnode/local","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Hardware","items":[{"type":"link","label":"Overview","href":"/docs/user/hardware/overview","docId":"user/hardware/overview","unlisted":false},{"type":"link","label":"Maintenance","href":"/docs/user/hardware/maintenance","docId":"user/hardware/maintenance","unlisted":false},{"type":"link","label":"Temperature","href":"/docs/user/hardware/temperature","docId":"user/hardware/temperature","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Staking","items":[{"type":"link","label":"Earn with Staking","href":"/docs/user/staking/overview","docId":"user/staking/overview","unlisted":false},{"type":"link","label":"Switch staking clients","href":"/docs/user/staking/switch-clients","docId":"user/staking/switch-clients","unlisted":false},{"type":"category","label":"Ethereum","items":[{"type":"category","label":"Solo Staking","items":[{"type":"link","label":"Mainnet","href":"/docs/user/staking/ethereum/solo/mainnet","docId":"user/staking/ethereum/solo/mainnet","unlisted":false},{"type":"link","label":"Testnet","href":"/docs/user/staking/ethereum/solo/holesky","docId":"user/staking/ethereum/solo/holesky","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"LSD Pools","items":[{"type":"category","label":"Lido CSM","items":[{"type":"link","label":"Overview","href":"/docs/user/staking/ethereum/lsd-pools/lido/overview","docId":"user/staking/ethereum/lsd-pools/lido/overview","unlisted":false},{"type":"link","label":"Register as a Node Operator","href":"/docs/user/staking/ethereum/lsd-pools/lido/register","docId":"user/staking/ethereum/lsd-pools/lido/register","unlisted":false},{"type":"link","label":"I am already a Node Operator","href":"/docs/user/staking/ethereum/lsd-pools/lido/already-node-operator","docId":"user/staking/ethereum/lsd-pools/lido/already-node-operator","unlisted":false},{"type":"link","label":"Validators performance","href":"/docs/user/staking/ethereum/lsd-pools/lido/performance","docId":"user/staking/ethereum/lsd-pools/lido/performance","unlisted":false},{"type":"link","label":"Notifications & Warnings","href":"/docs/user/staking/ethereum/lsd-pools/lido/notifications","docId":"user/staking/ethereum/lsd-pools/lido/notifications","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Rocketpool","href":"/docs/user/staking/ethereum/lsd-pools/rocketpool","docId":"user/staking/ethereum/lsd-pools/rocketpool","unlisted":false},{"type":"link","label":"Stakewise","href":"/docs/user/staking/ethereum/lsd-pools/stakewise","docId":"user/staking/ethereum/lsd-pools/stakewise","unlisted":false},{"type":"link","label":"Stakehouse","href":"/docs/user/staking/ethereum/lsd-pools/stakehouse","docId":"user/staking/ethereum/lsd-pools/stakehouse","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"DVT Technologies","items":[{"type":"link","label":"Obol","href":"/docs/user/staking/ethereum/dvt-technologies/obol-network","docId":"user/staking/ethereum/dvt-technologies/obol-network","unlisted":false},{"type":"link","label":"SSV","href":"/docs/user/staking/ethereum/dvt-technologies/ssv-network","docId":"user/staking/ethereum/dvt-technologies/ssv-network","unlisted":false},{"type":"link","label":"Diva","href":"/docs/user/staking/ethereum/dvt-technologies/diva","docId":"user/staking/ethereum/dvt-technologies/diva","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Gnosis Chain","items":[{"type":"link","label":"Gnosis Solo Staking","href":"/docs/user/staking/gnosis-chain/solo","docId":"user/staking/gnosis-chain/solo","unlisted":false},{"type":"link","label":"Gnosis Incentive Program","href":"/docs/user/staking/gnosis-chain/incentive-program","docId":"user/staking/gnosis-chain/incentive-program","unlisted":false},{"type":"link","label":"Consolidate Gnosis Validators","href":"/docs/user/staking/gnosis-chain/consolidation-gnosis","docId":"user/staking/gnosis-chain/consolidation-gnosis","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"LUKSO","items":[{"type":"link","label":"LUKSO Solo Staking","href":"/docs/user/staking/lukso/solo","docId":"user/staking/lukso/solo","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Starknet","items":[{"type":"link","label":"Starknet Solo Staking","href":"/docs/user/staking/starknet/solo","docId":"user/staking/starknet/solo","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Rollups","items":[{"type":"link","label":"Overview","href":"/docs/user/rollups/overview","docId":"user/rollups/overview","unlisted":false},{"type":"link","label":"Optimism","href":"/docs/user/rollups/optimism","docId":"user/rollups/optimism","unlisted":false},{"type":"link","label":"Aztec","href":"/docs/user/rollups/aztec","docId":"user/rollups/aztec","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Packages","items":[{"type":"category","label":"Understanding Dappnode Packages","items":[{"type":"link","label":"Overview","href":"/docs/user/packages/understanding-dappnode-packages/overview","docId":"user/packages/understanding-dappnode-packages/overview","unlisted":false},{"type":"link","label":"Info","href":"/docs/user/packages/understanding-dappnode-packages/info","docId":"user/packages/understanding-dappnode-packages/info","unlisted":false},{"type":"link","label":"Config","href":"/docs/user/packages/understanding-dappnode-packages/config","docId":"user/packages/understanding-dappnode-packages/config","unlisted":false},{"type":"link","label":"Network","href":"/docs/user/packages/understanding-dappnode-packages/network","docId":"user/packages/understanding-dappnode-packages/network","unlisted":false},{"type":"link","label":"Logs","href":"/docs/user/packages/understanding-dappnode-packages/logs","docId":"user/packages/understanding-dappnode-packages/logs","unlisted":false},{"type":"link","label":"Backup","href":"/docs/user/packages/understanding-dappnode-packages/backup","docId":"user/packages/understanding-dappnode-packages/backup","unlisted":false},{"type":"link","label":"File manager","href":"/docs/user/packages/understanding-dappnode-packages/file-manager","docId":"user/packages/understanding-dappnode-packages/file-manager","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Packages\' signature","href":"/docs/user/packages/signature","docId":"user/packages/signature","unlisted":false},{"type":"link","label":"DMS","href":"/docs/user/packages/dms","docId":"user/packages/dms","unlisted":false},{"type":"link","label":"Bitcoin","href":"/docs/user/packages/bitcoin","docId":"user/packages/bitcoin","unlisted":false},{"type":"link","label":"Eth Classic","href":"/docs/user/packages/ethclassic","docId":"user/packages/ethclassic","unlisted":false},{"type":"link","label":"Avalanche","href":"/docs/user/packages/avalanche","docId":"user/packages/avalanche","unlisted":false},{"type":"link","label":"Monero","href":"/docs/user/packages/monero","docId":"user/packages/monero","unlisted":false},{"type":"link","label":"Swarm","href":"/docs/user/packages/swarm","docId":"user/packages/swarm","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Repository","items":[{"type":"link","label":"Ethereum","href":"/docs/user/repository/ethereum","docId":"user/repository/ethereum","unlisted":false},{"type":"link","label":"IPFS","href":"/docs/user/repository/ipfs","docId":"user/repository/ipfs","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Install","items":[{"type":"link","label":"Overview","href":"/docs/user/install/overview","docId":"user/install/overview","unlisted":false},{"type":"link","label":"ISO","href":"/docs/user/install/iso","docId":"user/install/iso","unlisted":false},{"type":"link","label":"Script","href":"/docs/user/install/script","docId":"user/install/script","unlisted":false},{"type":"link","label":"ARM","href":"/docs/user/install/arm","docId":"user/install/arm","unlisted":false},{"type":"link","label":"Dappnode commands","href":"/docs/user/install/dappnode-commands","docId":"user/install/dappnode-commands","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Notifications","items":[{"type":"link","label":"Overview","href":"/docs/user/notifications/overview","docId":"user/notifications/overview","unlisted":false},{"type":"link","label":"Notifications List","href":"/docs/user/notifications/notifications-list","docId":"user/notifications/notifications-list","unlisted":false},{"type":"link","label":"Inbox","href":"/docs/user/notifications/inbox","docId":"user/notifications/inbox","unlisted":false},{"type":"link","label":"Settings","href":"/docs/user/notifications/settings","docId":"user/notifications/settings","unlisted":false},{"type":"link","label":"Legacy","href":"/docs/user/notifications/legacy","docId":"user/notifications/legacy","unlisted":false},{"type":"link","label":"Devices","href":"/docs/user/notifications/devices","docId":"user/notifications/devices","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Dappnode App","items":[{"type":"link","label":"Overview","href":"/docs/user/dappnode-app/overview","docId":"user/dappnode-app/overview","unlisted":false},{"type":"link","label":"How To Install Dappnode App","href":"/docs/user/dappnode-app/how-to-install","docId":"user/dappnode-app/how-to-install","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Dappnode Premium","items":[{"type":"link","label":"Overview","href":"/docs/user/dappnode-premium/premium-overview","docId":"user/dappnode-premium/premium-overview","unlisted":false},{"type":"link","label":"Premium services","href":"/docs/user/dappnode-premium/premium-services","docId":"user/dappnode-premium/premium-services","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Ethical metrics","items":[{"type":"link","label":"Overview","href":"/docs/user/ethical-metrics/overview","docId":"user/ethical-metrics/overview","unlisted":false},{"type":"link","label":"Setting up Notifications","href":"/docs/user/ethical-metrics/setup","docId":"user/ethical-metrics/setup","unlisted":false},{"type":"link","label":"Metrics collected","href":"/docs/user/ethical-metrics/metrics","docId":"user/ethical-metrics/metrics","unlisted":false},{"type":"link","label":"Troubleshooting","href":"/docs/user/ethical-metrics/troubleshooting","docId":"user/ethical-metrics/troubleshooting","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Dappnode Cloud","items":[{"type":"link","label":"Overview","href":"/docs/user/dappnode-cloud/overview","docId":"user/dappnode-cloud/overview","unlisted":false},{"type":"category","label":"Cloud Providers","items":[{"type":"category","label":"AWS","items":[{"type":"link","label":"AWS Overview","href":"/docs/user/dappnode-cloud/providers/aws/overview","docId":"user/dappnode-cloud/providers/aws/overview","unlisted":false},{"type":"link","label":"How to set up an Instance","href":"/docs/user/dappnode-cloud/providers/aws/set-up-instance","docId":"user/dappnode-cloud/providers/aws/set-up-instance","unlisted":false},{"type":"link","label":"FAQs & Troubleshooting","href":"/docs/user/dappnode-cloud/providers/aws/faqs","docId":"user/dappnode-cloud/providers/aws/faqs","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"More coming soon","href":"/docs/user/dappnode-cloud/providers/coming-soon","docId":"user/dappnode-cloud/providers/coming-soon","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Videos and tutorials","items":[{"type":"category","label":"Driving School","items":[{"type":"link","label":"Initial setup","href":"/docs/user/videos-and-tutorials/driving-school/initial-setup","docId":"user/videos-and-tutorials/driving-school/initial-setup","unlisted":false},{"type":"link","label":"Configuration","href":"/docs/user/videos-and-tutorials/driving-school/configuration","docId":"user/videos-and-tutorials/driving-school/configuration","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Crash Course","href":"/docs/user/videos-and-tutorials/crash-course","docId":"user/videos-and-tutorials/crash-course","unlisted":false},{"type":"category","label":"Guides","items":[{"type":"link","label":"How to connect a wallet to my node","href":"/docs/user/videos-and-tutorials/guides/connect-node","docId":"user/videos-and-tutorials/guides/connect-node","unlisted":false},{"type":"link","label":"Migrating from Avado","href":"/docs/user/videos-and-tutorials/guides/migrating-from-avado","docId":"user/videos-and-tutorials/guides/migrating-from-avado","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"link","label":"FAQs","href":"/docs/user/faqs","docId":"user/faqs","unlisted":false}],"devSidebar":[{"type":"link","label":"Introduction","href":"/docs/dev","docId":"dev","unlisted":false},{"type":"category","label":"DappnodeSDK","items":[{"type":"link","label":"Overview","href":"/docs/dev/sdk/overview","docId":"dev/sdk/overview","unlisted":false},{"type":"link","label":"Commands","href":"/docs/dev/sdk/commands","docId":"dev/sdk/commands","unlisted":false},{"type":"link","label":"SDK-Publish","href":"/docs/dev/sdk/sdk-publish","docId":"dev/sdk/sdk-publish","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"File references","items":[{"type":"link","label":"Docker Compose","href":"/docs/dev/references/docker-compose","docId":"dev/references/docker-compose","unlisted":false},{"type":"link","label":"Dappnode Manifest","href":"/docs/dev/references/manifest","docId":"dev/references/manifest","unlisted":false},{"type":"link","label":"Setup Wizard","href":"/docs/dev/references/setup-wizard","docId":"dev/references/setup-wizard","unlisted":false},{"type":"link","label":"Notifications","href":"/docs/dev/references/notifications","docId":"dev/references/notifications","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Package Development","items":[{"type":"link","label":"Overview","href":"/docs/dev/package-development/overview","docId":"dev/package-development/overview","unlisted":false},{"type":"link","label":"Single Configuration","href":"/docs/dev/package-development/single-configuration","docId":"dev/package-development/single-configuration","unlisted":false},{"type":"link","label":"Multi-Configuration","href":"/docs/dev/package-development/multi-configuration","docId":"dev/package-development/multi-configuration","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Package Publishing","items":[{"type":"link","label":"Publishing Guide","href":"/docs/dev/package-publishing/publish-packages-clients","docId":"dev/package-publishing/publish-packages-clients","unlisted":false},{"type":"link","label":"Package Ownership","href":"/docs/dev/package-publishing/package-ownership","docId":"dev/package-publishing/package-ownership","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Package Metrics","href":"/docs/dev/metrics","docId":"dev/metrics","unlisted":false},{"type":"link","label":"Package Notifications","href":"/docs/dev/notifications","docId":"dev/notifications","unlisted":false},{"type":"link","label":"Package DNS","href":"/docs/dev/dns","docId":"dev/dns","unlisted":false},{"type":"category","label":"GitHub Actions","items":[{"type":"link","label":"Overview","href":"/docs/dev/github-actions/overview","docId":"dev/github-actions/overview","unlisted":false},{"type":"link","label":"Standard Packages","href":"/docs/dev/github-actions/standard-packages","docId":"dev/github-actions/standard-packages","unlisted":false},{"type":"category","label":"Staker Packages","items":[{"type":"link","label":"Overview","href":"/docs/dev/github-actions/staker-packages/overview","docId":"dev/github-actions/staker-packages/overview","unlisted":false},{"type":"link","label":"Execution Clients","href":"/docs/dev/github-actions/staker-packages/execution-clients","docId":"dev/github-actions/staker-packages/execution-clients","unlisted":false},{"type":"link","label":"Consensus Clients","href":"/docs/dev/github-actions/staker-packages/consensus-clients","docId":"dev/github-actions/staker-packages/consensus-clients","unlisted":false},{"type":"link","label":"Web3Signer","href":"/docs/dev/github-actions/staker-packages/web3signer","docId":"dev/github-actions/staker-packages/web3signer","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true}],"smoothSidebar":[{"type":"link","label":"Smooth","href":"/docs/smooth","docId":"smooth","unlisted":false},{"type":"category","label":"Deep dive into Smooth","items":[{"type":"link","label":"Overview","href":"/docs/smooth/deep-dive-into-smooth/overview","docId":"smooth/deep-dive-into-smooth/overview","unlisted":false},{"type":"link","label":"Rewards","href":"/docs/smooth/deep-dive-into-smooth/rewards","docId":"smooth/deep-dive-into-smooth/rewards","unlisted":false},{"type":"link","label":"Validator States","href":"/docs/smooth/deep-dive-into-smooth/states","docId":"smooth/deep-dive-into-smooth/states","unlisted":false},{"type":"link","label":"Oracle & Smart Contract","href":"/docs/smooth/deep-dive-into-smooth/oracle-sm","docId":"smooth/deep-dive-into-smooth/oracle-sm","unlisted":false},{"type":"link","label":"Avoid proposing Vanilla Blocks","href":"/docs/smooth/deep-dive-into-smooth/vanilla-blocks","docId":"smooth/deep-dive-into-smooth/vanilla-blocks","unlisted":false},{"type":"link","label":"Validator Consolidations In Smooth","href":"/docs/smooth/deep-dive-into-smooth/consolidations","docId":"smooth/deep-dive-into-smooth/consolidations","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Subscribe to Smooth!","items":[{"type":"link","label":"Overview","href":"/docs/smooth/subscribe-to-smooth/overview","docId":"smooth/subscribe-to-smooth/overview","unlisted":false},{"type":"link","label":"Automatic subscription","href":"/docs/smooth/subscribe-to-smooth/automatic","docId":"smooth/subscribe-to-smooth/automatic","unlisted":false},{"type":"link","label":"Manual subscription","href":"/docs/smooth/subscribe-to-smooth/manual","docId":"smooth/subscribe-to-smooth/manual","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Unsubscribe from Smooth","href":"/docs/smooth/unsubscribe-from-smooth","docId":"smooth/unsubscribe-from-smooth","unlisted":false},{"type":"link","label":"FAQ / Glossary","href":"/docs/smooth/faq-glossary","docId":"smooth/faq-glossary","unlisted":false}],"daoSidebar":[{"type":"link","label":"DAO","href":"/docs/dao","docId":"dao","unlisted":false},{"type":"link","label":"The NODE Economy","href":"/docs/dao/node-basics","docId":"dao/node-basics","unlisted":false},{"type":"link","label":"Liquidity Mining","href":"/docs/dao/liquidity-mining","docId":"dao/liquidity-mining","unlisted":false},{"type":"link","label":"Dappnode DAO FAQ","href":"/docs/dao/faq","docId":"dao/faq","unlisted":false}]},"docs":{"dao":{"id":"dao","title":"DAO","description":"DAO information","sidebar":"daoSidebar"},"dao/faq":{"id":"dao/faq","title":"Dappnode DAO FAQ","description":"What is a DAO?","sidebar":"daoSidebar"},"dao/liquidity-mining":{"id":"dao/liquidity-mining","title":"Liquidity Mining","description":"Liquidity Mining (LM) launched on Jul 17 2021, 2000 GMT. 5.5% of the total token supply, 5.5 Million NODE, has been allocated to the first LM round of 6 months. NODE reward distribution for the 4 pools available is as follows:","sidebar":"daoSidebar"},"dao/node-basics":{"id":"dao/node-basics","title":"The NODE Economy","description":"NODE Basics","sidebar":"daoSidebar"},"dao/node-drop":{"id":"dao/node-drop","title":"NODEdrop","description":"\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\\""},"dao/node-stream":{"id":"dao/node-stream","title":"NODEstream","description":"\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\\""},"dev":{"id":"dev","title":"Welcome to the Developer Documentation!","description":"Welcome to the Dappnode\'s developer docs! This documentation is your comprehensive guide to using the tools and resources that enable you to create, deploy, and manage your own custom dappnode packages (DNP). Whether you\'re new to the project or an experienced developer, this documentation will help you navigate the intricacies of developing in the dappnode environment.","sidebar":"devSidebar"},"dev/dns":{"id":"dev/dns","title":"\ud83c\udf10 DNS","description":"By default, every DAppNode package runs on Docker networks that provide DNS-based service discovery. The main network is dncorenetwork, which uses a public IP range, and starting from core version 0.3.2, there is also a dnprivatenetwork with the private IP range 10.20.0.0/24. Both networks allow packages to communicate and resolve service names, but dnprivate_network adds a security layer by restricting access to a private IP range, making it ideal for accessing sensitive UIs and services.","sidebar":"devSidebar"},"dev/github-actions/overview":{"id":"dev/github-actions/overview","title":"GitHub Actions for Dappnode Packages","description":"GitHub Actions help automate workflows around your projects on GitHub. For Dappnode packages, we utilize specific GitHub Actions to manage updates, testing, and releases.","sidebar":"devSidebar"},"dev/github-actions/staker-packages/consensus-clients":{"id":"dev/github-actions/staker-packages/consensus-clients","title":"Consensus Client Workflows","description":"Consensus client packages (Lodestar, Teku, Prysm, Nimbus, Lighthouse) use three GitHub Actions workflows. Unlike execution clients, consensus clients do not need a sync.yml workflow because they use checkpoint sync, which doesn\'t require pre-synced volumes.","sidebar":"devSidebar"},"dev/github-actions/staker-packages/execution-clients":{"id":"dev/github-actions/staker-packages/execution-clients","title":"Execution Client Workflows","description":"Execution client packages (Geth, Reth, Nethermind, Besu, Erigon) use four GitHub Actions workflows to ensure proper testing and release automation.","sidebar":"devSidebar"},"dev/github-actions/staker-packages/overview":{"id":"dev/github-actions/staker-packages/overview","title":"Staker Packages CI Overview","description":"Staker packages require more complex CI than standard packages because they need integration testing on real Dappnode hardware. This ensures that execution clients, consensus clients, web3signer, and MEV-boost work correctly together in a real staking environment.","sidebar":"devSidebar"},"dev/github-actions/staker-packages/web3signer":{"id":"dev/github-actions/staker-packages/web3signer","title":"Web3Signer Workflows","description":"The CI workflows for Web3Signer packages are currently being designed. This documentation will be updated once the workflows are finalized.","sidebar":"devSidebar"},"dev/github-actions/standard-packages":{"id":"dev/github-actions/standard-packages","title":"Standard Packages CI","description":"Standard Dappnode packages (e.g., Rotki, IPFS) use a straightforward CI workflow consisting of two main GitHub Actions: upstream version checking and build/release automation.","sidebar":"devSidebar"},"dev/metrics":{"id":"dev/metrics","title":"\ud83d\udcca Package Metrics","description":"DAppNode supports an integrated metrics framework based on Prometheus and Grafana, powered by the DMS package.","sidebar":"devSidebar"},"dev/notifications":{"id":"dev/notifications","title":"\ud83d\udd14 Package Notifications (Coming soon)","description":"Notifications are a way to inform users about events happening in the DAppNode. They are displayed in the notifications tab within the DAppNode UI. Notifications are sent by third-party software, \\"Gatus,\\" which monitors the services running in the DAppNode or arbitrary services that send notifications. Users can configure the notifications they want to receive and set thresholds (if applicable) for these notifications.","sidebar":"devSidebar"},"dev/package-development/multi-configuration":{"id":"dev/package-development/multi-configuration","title":"Multi-Config Package Development","description":"This guide will walk you through the steps to develop a multi-config Dappnode package, allowing you to create multiple package configurations from a single source. We\'ll use the Lodestar Generic package as a reference, which builds multiple variants for different networks like Mainnet, Holesky, and Gnosis.","sidebar":"devSidebar"},"dev/package-development/overview":{"id":"dev/package-development/overview","title":"Package Development","description":"Welcome to the Package Development section! This guide will help you create your own Dappnode packages. In Dappnode, packages are applications that you can download and install on your Dappnode machine, allowing you to enhance its functionality.","sidebar":"devSidebar"},"dev/package-development/single-configuration":{"id":"dev/package-development/single-configuration","title":"Single-Variant Package Development","description":"This guide will walk you through the steps to develop a single-variant Dappnode package using a simple example. We\'ll start with initializing a basic package and progress to a more complex setup, using the Holesky Geth package as a reference.","sidebar":"devSidebar"},"dev/package-publishing/package-ownership":{"id":"dev/package-publishing/package-ownership","title":"Package Ownership","description":"This guide outlines the role permission system used in Dappnode package management, powered by Aragon\u2019s ACL (Access Control List) smart contracts. It explains how to check and modify roles such as permission managers and developers.","sidebar":"devSidebar"},"dev/package-publishing/publish-packages-clients":{"id":"dev/package-publishing/publish-packages-clients","title":"Publish your packages seamlessly","description":"The aim of this guide is to help you publish the new packages of your product in Dappnode seamlessly. We created a new UI to ease the publication of your packages in a few minutes.","sidebar":"devSidebar"},"dev/references/docker-compose":{"id":"dev/references/docker-compose","title":"Docker compose file","description":"Dappnode packages are built upon Docker containers. The heart of defining how these containers run and interact lies in the docker-compose.yml file. In this guide, we will explain the typical structure of the docker-compose.yml file for a Dappnode package.","sidebar":"devSidebar"},"dev/references/manifest":{"id":"dev/references/manifest","title":"Dappnode Package (DNP) manifest","description":"The Dappnode Package manifest defines all the necessary information for a Dappnode to understand this package:","sidebar":"devSidebar"},"dev/references/notifications":{"id":"dev/references/notifications","title":"Notifications File Reference (Comming soon)","description":"This document serves as a reference for the Notifications configuration file in DAppNode. It defines the structure, fields, and expected values based on the JSON Schema.","sidebar":"devSidebar"},"dev/references/setup-wizard":{"id":"dev/references/setup-wizard","title":"Wizard Reference","description":"The setup wizard for Dappnode packages helps automate the package customization and improve its user experience. You can allow users to conveniently edit environment variables, port mappings, and upload files while interacting with a simple web form, right before installing the package.","sidebar":"devSidebar"},"dev/sdk/commands":{"id":"dev/sdk/commands","title":"Main commands","description":"This page covers the top three functionalities of DappnodeSDK: init, build, and publish. Each command plays a crucial role in the development and deployment process of dappnode packages (DNPs).","sidebar":"devSidebar"},"dev/sdk/overview":{"id":"dev/sdk/overview","title":"DappnodeSDK","description":"The DappnodeSDK dappnodesdk is a tool that makes creating and publishing new Dappnode packages as simple as possible. It helps to initialize, build, test, and publish the new package/repo to an APM tracked on the Ethereum Mainnet.","sidebar":"devSidebar"},"dev/sdk/sdk-publish":{"id":"dev/sdk/sdk-publish","title":"SDK-Publish","description":"The SDK-Publish tool is a component of the Dappnode Software Development Kit (dappnodesdk). This tool simplifies the process of signing and publishing Dappnode package releases, utilizing your wallet for secure and efficient transaction management.","sidebar":"devSidebar"},"smooth":{"id":"smooth","title":"Smooth","description":"Smooth introduction","sidebar":"smoothSidebar"},"smooth/deep-dive-into-smooth/consolidations":{"id":"smooth/deep-dive-into-smooth/consolidations","title":"Consolidations","description":"Since the Pectra update on May 7, 2025, validators can stake up to 2048 ETH. Instead of having to manage multiple 32 ETH validators, users can now choose to stake an arbitrary amount of ETH in a single validator.","sidebar":"smoothSidebar"},"smooth/deep-dive-into-smooth/oracle-sm":{"id":"smooth/deep-dive-into-smooth/oracle-sm","title":"Smooth\'s architecture","description":"Smooth is composed of two main components: the Oracle and the Smart Contract. These two components work together to track validators and distribute rewards fairly. Both are open source and indispensable to the functioning of Smooth. While the Smart Contract serves to track all the events related to the pool onchain (subscriptions, unsubscriptions, block proposals, etc.), the Oracle is responsible for computing the rewards of each validator.","sidebar":"smoothSidebar"},"smooth/deep-dive-into-smooth/overview":{"id":"smooth/deep-dive-into-smooth/overview","title":"Deep Dive into Smooth!","description":"In this section, you will find an in-depth explanation on how Smooth works. This includes its different components, all states possible of a subscribed validator, and much more!","sidebar":"smoothSidebar"},"smooth/deep-dive-into-smooth/rewards":{"id":"smooth/deep-dive-into-smooth/rewards","title":"Rewards","description":"Receiving and distributing rewards is one of the core functionalities of Smooth. In this section we will explain how rewards are handled by Smooth and how they are distributed to validators, as well as how users can claim their rewards.","sidebar":"smoothSidebar"},"smooth/deep-dive-into-smooth/states":{"id":"smooth/deep-dive-into-smooth/states","title":"Smooth Validator States","description":"A Smooth validator can be in multiple states depending on its behavior. In this section we will explain all possible states a validator can have, the consequences of being each state, and how a validator can transition from one state to another.","sidebar":"smoothSidebar"},"smooth/deep-dive-into-smooth/vanilla-blocks":{"id":"smooth/deep-dive-into-smooth/vanilla-blocks","title":"What is a vanilla block?","description":"What is a vanilla block?","sidebar":"smoothSidebar"},"smooth/faq-glossary":{"id":"smooth/faq-glossary","title":"FAQ & Glossary","description":"FAQ","sidebar":"smoothSidebar"},"smooth/subscribe-to-smooth/automatic":{"id":"smooth/subscribe-to-smooth/automatic","title":"Automatic Subscription","description":"This is the simplest way to subscribe to Smooth. It consists of changing the fee recipient of your validator to Smooth\'s address and subscribing automatically when proposing your next block.","sidebar":"smoothSidebar"},"smooth/subscribe-to-smooth/manual":{"id":"smooth/subscribe-to-smooth/manual","title":"Manual Subscription","description":"Would you rather not wait until your next proposed block to subscribe and begin earning rewards? You can take a proactive step and opt for manual subscription right away. During this process, you\'ll change your validator\'s fee recipient to Smooth\'s address, just like in the automatic subscription. However, instead of waiting for your next proposed block, you\'ll immediately start accumulating rewards from Smooth.","sidebar":"smoothSidebar"},"smooth/subscribe-to-smooth/overview":{"id":"smooth/subscribe-to-smooth/overview","title":"Subscribing to Smooth","description":"Hello! In this section you will find all the information on how to subscribe your Validators to Smooth. Even though the process is simple, it is important to follow the steps carefully.","sidebar":"smoothSidebar"},"smooth/unsubscribe-from-smooth":{"id":"smooth/unsubscribe-from-smooth","title":"Unsubscribing from Smooth.","description":"Unsubscribing from Smooth is as simple as subscribing to it. You can unsubscribe from Smooth at any time, it is done through Smooth\'s website and it only takes one simple transaction.","sidebar":"smoothSidebar"},"user/access-your-dappnode/local":{"id":"user/access-your-dappnode/local","title":"Local Proxy Access to Dappnode","description":"The local proxy method provides a way to access your Dappnode from within the same local network without any previous configuration required. However, it\'s essential to understand that due to certain network incompatibilities, this method might not work for all users.","sidebar":"userSidebar"},"user/access-your-dappnode/overview":{"id":"user/access-your-dappnode/overview","title":"\ud83c\udf10 Access your Dappnode","description":"Dappnode is made to work on a dedicated computer, and its main control panel, the Dappmanager, is accessed from another device via my.dappnode , as it is meant to be installed over an operating system that does not include a graphical interface.","sidebar":"userSidebar"},"user/access-your-dappnode/terminal":{"id":"user/access-your-dappnode/terminal","title":"Terminal Access to Dappnode","description":"Accessing the terminal of your Dappnode, often referred to as the command-line interface (CLI), provides deep control and management capabilities. However, this method is considered advanced and requires familiarity with command line interactions. Incorrect or misguided commands can lead to unintended changes or potential system damage.","sidebar":"userSidebar"},"user/access-your-dappnode/vpn/openvpn":{"id":"user/access-your-dappnode/vpn/openvpn","title":"OpenVPN Access to Dappnode","description":"OpenVPN is a widely-accepted VPN protocol known for its reliability and high-security standards. Here\'s how you can set it up with Dappnode.","sidebar":"userSidebar"},"user/access-your-dappnode/vpn/overview":{"id":"user/access-your-dappnode/vpn/overview","title":"VPN Access to Dappnode","description":"Virtual Private Network (VPN) is a robust method for accessing your Dappnode. It ensures a secure and encrypted connection between your device and the Dappnode, allowing you to manage your Dappnode from virtually anywhere. Depending on your needs and preferences, Dappnode offers support for two primary VPN technologies: WireGuard and OpenVPN.","sidebar":"userSidebar"},"user/access-your-dappnode/vpn/tailscale":{"id":"user/access-your-dappnode/vpn/tailscale","title":"Connect to Your Dappnode Using Tailscale","description":"Tailscale is a secure, peer-to-peer VPN solution that simplifies connecting to your Dappnode without requiring complex port forwarding, solving issues such as UPnP not being recognized, routers behind CGNAT, or other port forwarding challenges. This guide walks you through setting up Tailscale to access your Dappnode.","sidebar":"userSidebar"},"user/access-your-dappnode/vpn/wireguard":{"id":"user/access-your-dappnode/vpn/wireguard","title":"WireGuard Access to Dappnode","description":"WireGuard is a modern, high-performance VPN protocol that offers a simple and streamlined approach for securely accessing your Dappnode. This guide will walk you through setting up WireGuard with your Dappnode.","sidebar":"userSidebar"},"user/access-your-dappnode/wifi":{"id":"user/access-your-dappnode/wifi","title":"Wi-Fi Access to Dappnode","description":"If you bought a Dappnode from our store, or installed Dappnode on a computer with a built-in Wi-Fi chip, you can easily connect to the Dappmanager (Dappnode web UI) using the Dappnode\'s Wi-Fi hotspot.","sidebar":"userSidebar"},"user/dappnode-app/how-to-install":{"id":"user/dappnode-app/how-to-install","title":"How to install the Dappnode app","description":"The complete process to install the Dappnode app is the following:","sidebar":"userSidebar"},"user/dappnode-app/overview":{"id":"user/dappnode-app/overview","title":"Overview","description":"The Dappnode app is a new form of interaction with Dappnode from mobile and desktop devices. It helps users to enter the Dappmanager remotely and get notified about the hardware status and the staking performance.","sidebar":"userSidebar"},"user/dappnode-cloud/overview":{"id":"user/dappnode-cloud/overview","title":"What is Dappnode Cloud?","description":"Dappnode Cloud is a service that allows users to deploy a Dappnode in a cloud provider so it can be tested without the need for physical hardware. We provide easy pre-configured instances for the main cloud providers (AWS for now, more to come later) to continue to make the deployment of web3 infrastructure accessible and hassle-free for everyone. It consists of a Dappnode image deployed on a machine instance from a cloud provider, eliminating the need to invest in hardware in order to test Dappnode.","sidebar":"userSidebar"},"user/dappnode-cloud/providers/aws/faqs":{"id":"user/dappnode-cloud/providers/aws/faqs","title":"FAQs & Troubleshooting","description":"Which machine should I choose?","sidebar":"userSidebar"},"user/dappnode-cloud/providers/aws/overview":{"id":"user/dappnode-cloud/providers/aws/overview","title":"AWS","description":"Amazon Web Services (AWS) is a cloud computing platform provided by Amazon. It offers a wide range of services, including computing power, storage options, and networking capabilities, enabling users to build and deploy applications and services efficiently.","sidebar":"userSidebar"},"user/dappnode-cloud/providers/aws/set-up-instance":{"id":"user/dappnode-cloud/providers/aws/set-up-instance","title":"How to Set Up an Instance","description":"To launch a Dappnode AMI instance, follow these steps:","sidebar":"userSidebar"},"user/dappnode-cloud/providers/coming-soon":{"id":"user/dappnode-cloud/providers/coming-soon","title":"More coming soon","description":"We are aiming to deploy Dappnode Images in more cloud providers in a nearly future.","sidebar":"userSidebar"},"user/dappnode-premium/premium-overview":{"id":"user/dappnode-premium/premium-overview","title":"Dappnode Premium","description":"What is Dappnode Premium?","sidebar":"userSidebar"},"user/dappnode-premium/premium-services":{"id":"user/dappnode-premium/premium-services","title":"Premium services","description":"Advanced push notifications","sidebar":"userSidebar"},"user/ethical-metrics/metrics":{"id":"user/ethical-metrics/metrics","title":"Metrics Collected by Ethical Metrics","description":"Dappnode has absolutely no hidden telemetry and is completely private by design. We were reluctant of setting up a monitoring service because we did NOT want to collect any data from our users. Because of our community\'s continuous requests to offer alerts, we came up with a solution that doesn\'t compromise your privacy.","sidebar":"userSidebar"},"user/ethical-metrics/overview":{"id":"user/ethical-metrics/overview","title":"Ethical Metrics","description":"Ethical Metrics requires the Dappnode Monitoring Service (DMS) and Dappnode Exporter as dependencies.","sidebar":"userSidebar"},"user/ethical-metrics/setup":{"id":"user/ethical-metrics/setup","title":"Setting up Ethical Metrics","description":"We highly recommend utilizing the Telegram channel option in addition to or instead of relying solely on email notifications.","sidebar":"userSidebar"},"user/ethical-metrics/troubleshooting":{"id":"user/ethical-metrics/troubleshooting","title":"Troubleshooting","description":"Experiencing trouble when setting your notifications up? Check this FAQ. If your issue isn\'t listed, please pay us a visit in the Dappnode Discord and we\'ll be happy to assist you!","sidebar":"userSidebar"},"user/faqs":{"id":"user/faqs","title":"FAQs","description":"How can I start validating?","sidebar":"userSidebar"},"user/getting-started/access-dappnode-via-wifi":{"id":"user/getting-started/access-dappnode-via-wifi","title":"Access Dappnode via Wi-Fi","description":"After connecting your Dappnode to the router and power, and turning it on, it\'s time to connect to it.","sidebar":"userSidebar"},"user/getting-started/choose-your-path":{"id":"user/getting-started/choose-your-path","title":"Choose your path","description":"Regardless of how you wish to utilize Dappnode, taking the initiative to contribute to decentralization and earning rewards is commendable. Embark on your desired path and experience the full potential of Dappnode.","sidebar":"userSidebar"},"user/getting-started/connect-dappnode-to-the-router":{"id":"user/getting-started/connect-dappnode-to-the-router","title":"Connect your dappnode to the router and power","description":"Dappnode offers a seamless plug-and-play experience. For optimal performance and to ensure smooth operation, please connect your Dappnode to your router and enable UPnP settings within the router.","sidebar":"userSidebar"},"user/getting-started/next-steps":{"id":"user/getting-started/next-steps","title":"Next Steps","description":"Now that your DAppNode is set up and ready to go, it\'s time to explore further configurations and features to get the most out of your experience. Here are some of the most common next steps:","sidebar":"userSidebar"},"user/getting-started/register":{"id":"user/getting-started/register","title":"Register","description":"1. Register as New User","sidebar":"userSidebar"},"user/getting-started/setup":{"id":"user/getting-started/setup","title":"Setup","description":"Setting up Dappnode is a straightforward process. This guide will walk you through configuring your Dappnode for the first time.","sidebar":"userSidebar"},"user/hardware/maintenance":{"id":"user/hardware/maintenance","title":"Maintenance","description":"This section will cover four different approaches to servicing your hardware. The order is by level of difficulty from easiest to hardest. Remember that if you have any questions they\'re always welcome in our Discord server.","sidebar":"userSidebar"},"user/hardware/overview":{"id":"user/hardware/overview","title":"Hardware","description":"In this section you will find information related to the hardware of the Dappnode\'s host machine. If you had noticed any issue with it and have tried some steps provided by the Dappnode community and/or staff without success, this section of the Dappnode documentation will help you solving those that are on the hardware side of things.","sidebar":"userSidebar"},"user/hardware/temperature":{"id":"user/hardware/temperature","title":"Temperature","description":"Keeping a close eye to your Dappnode\'s temperature is part of the Node Runner\'s basic good practices. Dappnode provides you with metrics \ud83d\udcca in the main dashboard to do so.","sidebar":"userSidebar"},"user/install/arm":{"id":"user/install/arm","title":"Install - ARM","description":"Hardware Recommendations","sidebar":"userSidebar"},"user/install/dappnode-commands":{"id":"user/install/dappnode-commands","title":"Dappnode commands","description":"Dappnode comes with a set of commands that can be used to manage the system. These commands can be used directly from the command line.","sidebar":"userSidebar"},"user/install/iso":{"id":"user/install/iso","title":"ISO Installation","description":"When you want to perform a clean installation by installing the base operating system and Dappnode. Installing from an ISO will wipe the machine data and install Dappnode over Debian.","sidebar":"userSidebar"},"user/install/overview":{"id":"user/install/overview","title":"Installation Overview","description":"Specifications & Minimum Requirements","sidebar":"userSidebar"},"user/install/script":{"id":"user/install/script","title":"Script installation","description":"You can install Dappnode using the installation script. In this case, we recommend you use Ubuntu or Debian as your operating system.","sidebar":"userSidebar"},"user/notifications/devices":{"id":"user/notifications/devices","title":"Devices management","description":"To receive push notifications in Dappnode, users need to subscribe their devices.","sidebar":"userSidebar"},"user/notifications/inbox":{"id":"user/notifications/inbox","title":"\ud83d\udce8 Notifications Inbox","description":"In the inbox section, you will see new notifications and the complete history.","sidebar":"userSidebar"},"user/notifications/legacy":{"id":"user/notifications/legacy","title":"Notifications Legacy","description":"In the legacy section you have access to the previous system of notifications with email and telegram. The aim of the new notification system is to unify the notifications in a single channel in desktop and mobile to facilitate the user experience and be more reliable, configurable and scalable. Therefore, this section will be deprecated in the upcoming core releases.","sidebar":"userSidebar"},"user/notifications/notifications-list":{"id":"user/notifications/notifications-list","title":"List of Notifications","description":"This is the full list of events that will be notified in your Dappnode.","sidebar":"userSidebar"},"user/notifications/overview":{"id":"user/notifications/overview","title":"Notifications Overview","description":"Dappnode Notifications is a built-in system that keeps you informed about important events and updates across your Dappnode setup. Whether it\'s a new software release, a hardware warning, or a consensus sync alert \u2014 notifications are your go-to source for staying up to date.","sidebar":"userSidebar"},"user/notifications/settings":{"id":"user/notifications/settings","title":"\ud83d\udee0\ufe0f Notifications Settings","description":"In the settings section you can configure the type of notification you would like to receive per package.","sidebar":"userSidebar"},"user/packages/avalanche":{"id":"user/packages/avalanche","title":"Avalanche","description":"Avalanche: A Revolutionary Consensus Protocol","sidebar":"userSidebar"},"user/packages/bitcoin":{"id":"user/packages/bitcoin","title":"Bitcoin","description":"Exploring Bitcoin: The Pioneer of Cryptocurrency","sidebar":"userSidebar"},"user/packages/dms":{"id":"user/packages/dms","title":"Dappnode Monitoring Service (DMS)","description":"As a Dappnode user, there are times when having insights into the performance of your packages or your whole system can be incredibly beneficial. This means understanding the condition or \\"health\\" of your packages, the utilization of your computer resources such as CPU, RAM, and disk space, as well as monitoring network traffic flow. Yet, managing all of these aspects can become complex and tedious, even for those with experience. This is precisely where the Dappnode Monitoring Service (DMS) steps in to simplify matters.","sidebar":"userSidebar"},"user/packages/ethclassic":{"id":"user/packages/ethclassic","title":"Ethereum Classic","description":"Introducing Ethereum Classic: Preserving Blockchain Principles","sidebar":"userSidebar"},"user/packages/monero":{"id":"user/packages/monero","title":"Monero","description":"Introducing Monero: A Privacy-Centric Cryptocurrency","sidebar":"userSidebar"},"user/packages/signature":{"id":"user/packages/signature","title":"Packages\' Signature","description":"Dappnode\'s Packages Signatures","sidebar":"userSidebar"},"user/packages/swarm":{"id":"user/packages/swarm","title":"Guide to Installing Bee Node on Dappnode","description":"Introduction to Swarm","sidebar":"userSidebar"},"user/packages/understanding-dappnode-packages/backup":{"id":"user/packages/understanding-dappnode-packages/backup","title":"Backup","description":"This option will be available in packages that generate any kind of local database that includes sensitive information such as validator keystores. You\'ll have two very self-explanatory options: \\"Backup Now\\" and \\"Restore Backup\\".","sidebar":"userSidebar"},"user/packages/understanding-dappnode-packages/config":{"id":"user/packages/understanding-dappnode-packages/config","title":"Config","description":"The Config section provides access to the package\'s settings, available in both simple and advanced modes. You can switch to the advanced mode by clicking the option in the lower-right corner of the screen when it is available. This flexibility allows users to customize package parameters according to their needs, from basic adjustments to more detailed configurations.","sidebar":"userSidebar"},"user/packages/understanding-dappnode-packages/file-manager":{"id":"user/packages/understanding-dappnode-packages/file-manager","title":"File Manager","description":"Also handy whenever your package has a database you\'ll need to access or modify, but without going through a terminal. Download and upload files in an easy way with the File Manager.","sidebar":"userSidebar"},"user/packages/understanding-dappnode-packages/info":{"id":"user/packages/understanding-dappnode-packages/info","title":"Info","description":"The Info section provides a comprehensive overview of the package\'s status and essential details. This section is crucial for understanding the current state of the package and managing its basic operations. Below are the key features you\'ll find in the Info section:","sidebar":"userSidebar"},"user/packages/understanding-dappnode-packages/logs":{"id":"user/packages/understanding-dappnode-packages/logs","title":"Logs","description":"This is a great section for finding out something that is not working in your package or to look for both expected and unexpected behavior. Packages with multiple services will give you the option to switch logs in the top \\"Service\\" bar, something common for consensus clients for example, which usually run one service for the beacon-chain and another one for validator. Whenever you request for support in the Dappnode community, keep these handy!","sidebar":"userSidebar"},"user/packages/understanding-dappnode-packages/network":{"id":"user/packages/understanding-dappnode-packages/network","title":"Network","description":"The Network section allows you to manage and configure the network settings for your packages. This includes adjusting network settings for individual services, changing port mappings, and setting up domain mappings to expose your package to the internet.","sidebar":"userSidebar"},"user/packages/understanding-dappnode-packages/overview":{"id":"user/packages/understanding-dappnode-packages/overview","title":"Dappnode Packages","description":"What are Dappnode packages? What features do they offer? How are they managed?","sidebar":"userSidebar"},"user/repository/ethereum":{"id":"user/repository/ethereum","title":"Ethereum repository","description":"Dappnode uses smart contracts to distribute Dappnode\'s packages available in the Dappstore and the Stakers tab. These smart contracts are deployed on the Ethereum blockchain, and the execution client interacts with them to get the list of available packages and download them.","sidebar":"userSidebar"},"user/repository/ipfs":{"id":"user/repository/ipfs","title":"IPFS repository","description":"Dappnode leverages IPFS for distributing packages available in the Dappstore. To download these packages, your Dappnode requires a connection to an IPFS node. When it comes to connecting to the IPFS network, you have two primary choices:","sidebar":"userSidebar"},"user/rollups/aztec":{"id":"user/rollups/aztec","title":"\ud83d\ude80 Becoming an Aztec Sequencer with DAppNode","description":"Your comprehensive guide to setting up and joining the Aztec network as a sequencer using DAppNode infrastructure. Let\'s get you sequencing! \ud83c\udfaf","sidebar":"userSidebar"},"user/rollups/optimism":{"id":"user/rollups/optimism","title":"Optimism Rollup","description":"Optimism is Ethereum\'s Layer 2 solution, leveraging Optimistic Rollups to enhance transaction speeds and lower costs. It conducts transactions off-chain, reconciling final states on the main Ethereum chain, all while preserving compatibility with Ethereum smart contracts.","sidebar":"userSidebar"},"user/rollups/overview":{"id":"user/rollups/overview","title":"Ethereum Rollups: An Overview","description":"Rollups are advanced layer-2 scaling solutions designed to increase the throughput of the Ethereum network. By executing and storing transaction data off the main Ethereum chain while keeping a cryptographic commitment on-chain, Rollups enhance scalability and reduce fees. Rollups can be broadly categorized into two types: Optimistic Rollups and zk-Rollups, each with its unique approach and trade-offs.","sidebar":"userSidebar"},"user/staking/ethereum/dvt-technologies/diva":{"id":"user/staking/ethereum/dvt-technologies/diva","title":"Diva package for Dappnode","description":"---","sidebar":"userSidebar"},"user/staking/ethereum/dvt-technologies/obol-network":{"id":"user/staking/ethereum/dvt-technologies/obol-network","title":"Obol Distributed Validator package for Dappnode","description":"---","sidebar":"userSidebar"},"user/staking/ethereum/dvt-technologies/ssv-network":{"id":"user/staking/ethereum/dvt-technologies/ssv-network","title":"SSV Distributed Validator package for Dappnode","description":"---","sidebar":"userSidebar"},"user/staking/ethereum/lsd-pools/lido/already-node-operator":{"id":"user/staking/ethereum/lsd-pools/lido/already-node-operator","title":"Already a node operator","description":"This document provides detailed instructions for existing Node Operators on integrating their setup with the Lido Community Staking Module (CSM) via Dappnode. By following these steps, you can efficiently manage your validators and ensure proper functionality within the Lido protocol.","sidebar":"userSidebar"},"user/staking/ethereum/lsd-pools/lido/notifications":{"id":"user/staking/ethereum/lsd-pools/lido/notifications","title":"Notifications & Warnings","description":"The DAppNodePackage-lido-csm provides notifications and warnings to help you monitor your infraestructure and validator performance. You will be able to setup your notifications either during the onboarding process if you are registering as a new Node Operator and from the UI navigating to /notifications.","sidebar":"userSidebar"},"user/staking/ethereum/lsd-pools/lido/overview":{"id":"user/staking/ethereum/lsd-pools/lido/overview","title":"Lido Community Staking Module (CSM)","description":"---","sidebar":"userSidebar"},"user/staking/ethereum/lsd-pools/lido/performance":{"id":"user/staking/ethereum/lsd-pools/lido/performance","title":"Validator performance monitoring","description":"The Performance tab allows you to monitor the performance of your Lido validators associated with your Node Operator.","sidebar":"userSidebar"},"user/staking/ethereum/lsd-pools/lido/register":{"id":"user/staking/ethereum/lsd-pools/lido/register","title":"**Become a Lido Node Operator with Dappnode**","description":"Dappnode provides an easy-to-use and intuitive interface for most of the infrastructure needed to become a Lido Node Operator. The process is straightforward and requires only a few steps to set up a node operator and start earning rewards. An overview of the process is how the Lido CSM UI will greet you when first connecting your wallet to the dApp:","sidebar":"userSidebar"},"user/staking/ethereum/lsd-pools/rocketpool":{"id":"user/staking/ethereum/lsd-pools/rocketpool","title":"Rocketpool","description":"---","sidebar":"userSidebar"},"user/staking/ethereum/lsd-pools/stakehouse":{"id":"user/staking/ethereum/lsd-pools/stakehouse","title":"Stakehouse","description":"---","sidebar":"userSidebar"},"user/staking/ethereum/lsd-pools/stakewise":{"id":"user/staking/ethereum/lsd-pools/stakewise","title":"StakeWise","description":"---","sidebar":"userSidebar"},"user/staking/ethereum/solo/holesky":{"id":"user/staking/ethereum/solo/holesky","title":"Holesky Testnet","description":"The Holesky testnet is a testnet for the Ethereum ecosystem, serving as a sandbox for users and developers alike.","sidebar":"userSidebar"},"user/staking/ethereum/solo/mainnet":{"id":"user/staking/ethereum/solo/mainnet","title":"Ethereum mainnet","description":"Ethereum stands as a titan in the realm of smart contract platforms. Its monumental shift from Proof of Work (PoW) to Proof of Stake (PoS) has opened up opportunities for individuals to participate in Ethereum\'s block production by staking ETH.","sidebar":"userSidebar"},"user/staking/gnosis-chain/consolidate-gnosis-validators":{"id":"user/staking/gnosis-chain/consolidate-gnosis-validators","title":"Consolidate your Gnosis validators","description":"After the Pectra hard fork, validator consolidations are ready to use in Gnosis chain."},"user/staking/gnosis-chain/consolidation-gnosis":{"id":"user/staking/gnosis-chain/consolidation-gnosis","title":"Consolidate your Gnosis validators","description":"After the Pectra hard fork, validator consolidations are ready to use in Gnosis chain.","sidebar":"userSidebar"},"user/staking/gnosis-chain/incentive-program":{"id":"user/staking/gnosis-chain/incentive-program","title":"Gnosis Chain Incentive Program","description":"Gnosis Chain is a Proof of Stake blockchain that uses the GNO token for staking. The Gnosis incentive program rewards validators for their work in the network. It is designed to incentivize validators to participate and secure the network.","sidebar":"userSidebar"},"user/staking/gnosis-chain/solo":{"id":"user/staking/gnosis-chain/solo","title":"Gnosis Chain","description":"Gnosis Chain stands as a sentinel, functioning as a canary chain for Ethereum. It\'s operated and nurtured by the GnosisDAO community. With over 10% of its validators being home stakers via Dappnode, it\'s a testament to its popularity and accessibility.","sidebar":"userSidebar"},"user/staking/lukso/solo":{"id":"user/staking/lukso/solo","title":"LUKSO","description":"LUKSO is the next-gen blockchain designed with creative industries in mind. Imagine a digital realm where the spirit of Ethereum meets the world of fashion, art, and design. That\'s LUKSO for you!","sidebar":"userSidebar"},"user/staking/overview":{"id":"user/staking/overview","title":"Earn with Staking in Dappnode","description":"Decentralize Proof-of-Stake chains and earn","sidebar":"userSidebar"},"user/staking/starknet/solo":{"id":"user/staking/starknet/solo","title":"\ud83d\ude80 Starknet Validator Solo Staking Guide","description":"Starknet is a Layer 2 network built on Ethereum, designed for scalability and performance using STARK proofs.","sidebar":"userSidebar"},"user/staking/switch-clients":{"id":"user/staking/switch-clients","title":"Switch staking clients","description":"This guide explains how to switch execution and consensus clients on Dappnode for Ethereum, Gnosis, and Lukso networks. It includes detailed information about the switching process and expected waiting times for resynchronization and attestation.","sidebar":"userSidebar"},"user/videos-and-tutorials/crash-course":{"id":"user/videos-and-tutorials/crash-course","title":"Crash Course","description":"Want to learn more about Dappnode through video tutorials? Check out our Dappnode Driving School!","sidebar":"userSidebar"},"user/videos-and-tutorials/driving-school/configuration":{"id":"user/videos-and-tutorials/driving-school/configuration","title":"2. Configuring your Dappnode","description":"We recommend going through Initial Setup of Dappnode Driving School before watching these videos, as these videos expect you to have a basic understanding of how your Dappnode works and how to access it.","sidebar":"userSidebar"},"user/videos-and-tutorials/driving-school/initial-setup":{"id":"user/videos-and-tutorials/driving-school/initial-setup","title":"1. Initial Dappnode Setup","description":"Welcome to Dappnode Driving School! Here you\'ll find a series of videos that will guide you through the initial setup process. From booting Dappnode from ISO and accessing it through VPN, to setting up your Ethereum node, we\'ve got you covered.","sidebar":"userSidebar"},"user/videos-and-tutorials/guides/connect-node":{"id":"user/videos-and-tutorials/guides/connect-node","title":"How to Connect to My Blockchain Node","description":"When you\'ve set up your Dappnode, you might want to connect various applications to your blockchain node. This process can vary depending on which blockchain you\'ve selected. Below is a guide on how to do this:","sidebar":"userSidebar"},"user/videos-and-tutorials/guides/migrating-from-avado":{"id":"user/videos-and-tutorials/guides/migrating-from-avado","title":"Transitioning To Dappnode","description":"Important: Before following this guide to install DappnodeOS on your Avado device, make sure to first backup any data if you are running a validator or any other dApp.","sidebar":"userSidebar"},"user/videos-and-tutorials/overview":{"id":"user/videos-and-tutorials/overview","title":"Videos and Tutorials","description":"Welcome to the Videos and Tutorials section! Here, you\'ll find a curated list of videos and written tutorials designed to help you get the most out of Dappnode. Whether you\'re a beginner or an advanced user, there\'s something here for everyone."}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/0085f636.2aaf1a87.js b/assets/js/0085f636.2aaf1a87.js
new file mode 100644
index 000000000..311e3eeed
--- /dev/null
+++ b/assets/js/0085f636.2aaf1a87.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9589],{70424:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>d,frontMatter:()=>r,metadata:()=>t,toc:()=>p});const t=JSON.parse('{"id":"user/rollups/optimism","title":"Optimism Rollup","description":"Optimism is Ethereum\'s Layer 2 solution, leveraging Optimistic Rollups to enhance transaction speeds and lower costs. It conducts transactions off-chain, reconciling final states on the main Ethereum chain, all while preserving compatibility with Ethereum smart contracts.","source":"@site/docs/user/rollups/optimism.md","sourceDirName":"user/rollups","slug":"/user/rollups/optimism","permalink":"/docs/user/rollups/optimism","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/rollups/optimism.md","tags":[],"version":"current","frontMatter":{"title":"Optimism Rollup","llm_description":"Setting up an Optimism Layer 2 node on Dappnode using op-node and op-geth/op-erigon."},"sidebar":"userSidebar","previous":{"title":"Overview","permalink":"/docs/user/rollups/overview"},"next":{"title":"Aztec","permalink":"/docs/user/rollups/aztec"}}');var s=i(74848),o=i(28453);const r={title:"Optimism Rollup",llm_description:"Setting up an Optimism Layer 2 node on Dappnode using op-node and op-geth/op-erigon."},l="Optimism Rollup",c={},p=[{value:"Setting Up an Optimism Node",id:"setting-up-an-optimism-node",level:2}];function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"optimism-rollup",children:"Optimism Rollup"})}),"\n",(0,s.jsx)(n.p,{children:"Optimism is Ethereum's Layer 2 solution, leveraging Optimistic Rollups to enhance transaction speeds and lower costs. It conducts transactions off-chain, reconciling final states on the main Ethereum chain, all while preserving compatibility with Ethereum smart contracts."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Optimism Rollup",src:i(66045).A+"",width:"1732",height:"885"})}),"\n",(0,s.jsx)(n.h2,{id:"setting-up-an-optimism-node",children:"Setting Up an Optimism Node"}),"\n",(0,s.jsx)(n.p,{children:"Optimism stands out as the inaugural choice in the Rollups suite. Initiating an Optimism node on Dappnode parallels the familiar Stakers Menu, yet with some distinctions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Utilize an ",(0,s.jsx)(n.code,{children:"op-node"})," client to link with the Optimism Mainnet."]}),"\n",(0,s.jsxs)(n.li,{children:["Employ ",(0,s.jsx)(n.code,{children:"op-geth"})," or ",(0,s.jsx)(n.code,{children:"op-erigon"})," to bridge your ",(0,s.jsx)(n.code,{children:"op-node"})," to Ethereum's execution layer, echoing the beacon chain/consensus client's role on the mainnet."]}),"\n",(0,s.jsxs)(n.li,{children:["For archive nodes, ",(0,s.jsx)(n.code,{children:"op-legacy"})," is essential for transactions predating the Bedrock upgrade."]}),"\n",(0,s.jsx)(n.li,{children:"A connection to an Ethereum Mainnet node is required. If your Dappnode already operates one, the Rollups menu will streamline configuration. Otherwise, integrate a public RPC for Ethereum Mainnet connection."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"For a deeper dive, consult Optimism\u2019s documentation:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://op-geth.optimism.io/",children:"OP Geth docs"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/testinprod-io/op-erigon",children:"Test In Prod - OP Erigon"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://community.optimism.io/docs/developers/bedrock/node-operator-guide/",children:"OP Node Operator"})}),"\n"]}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},66045:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/optimism-menu-60612170996d4b9863d79b0a737bb280.png"},28453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>l});var t=i(96540);const s={},o=t.createContext(s);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/00b2d067.6e73271e.js b/assets/js/00b2d067.6e73271e.js
new file mode 100644
index 000000000..607e39888
--- /dev/null
+++ b/assets/js/00b2d067.6e73271e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[6018],{40123:(s,e,i)=>{i.r(e),i.d(e,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"user/staking/gnosis-chain/consolidation-gnosis","title":"Consolidate your Gnosis validators","description":"After the Pectra hard fork, validator consolidations are ready to use in Gnosis chain.","source":"@site/docs/user/staking/gnosis-chain/consolidation-gnosis.md","sourceDirName":"user/staking/gnosis-chain","slug":"/user/staking/gnosis-chain/consolidation-gnosis","permalink":"/docs/user/staking/gnosis-chain/consolidation-gnosis","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/gnosis-chain/consolidation-gnosis.md","tags":[],"version":"current","frontMatter":{"title":"Consolidate your Gnosis validators","llm_description":"Guide to merge multiple Gnosis validators into fewer ones after Pectra hard fork."},"sidebar":"userSidebar","previous":{"title":"Gnosis Incentive Program","permalink":"/docs/user/staking/gnosis-chain/incentive-program"},"next":{"title":"LUKSO Solo Staking","permalink":"/docs/user/staking/lukso/solo"}}');var o=i(74848),t=i(28453);const a={title:"Consolidate your Gnosis validators",llm_description:"Guide to merge multiple Gnosis validators into fewer ones after Pectra hard fork."},r="Consolidate your Gnosis validators",d={},l=[{value:"Why should I consolidate my Gnosis validators?",id:"why-should-i-consolidate-my-gnosis-validators",level:2},{value:"1. Simplify Operations",id:"1-simplify-operations",level:4},{value:"2. Optimize Costs",id:"2-optimize-costs",level:4},{value:"3. Better Reward Management",id:"3-better-reward-management",level:4},{value:"4. Safe process",id:"4-safe-process",level:4},{value:"How do I consolidate my Gnosis validators?",id:"how-do-i-consolidate-my-gnosis-validators",level:2}];function c(s){const e={a:"a",h1:"h1",h2:"h2",h4:"h4",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...s.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.header,{children:(0,o.jsx)(e.h1,{id:"consolidate-your-gnosis-validators",children:"Consolidate your Gnosis validators"})}),"\n",(0,o.jsx)(e.p,{children:"After the Pectra hard fork, validator consolidations are ready to use in Gnosis chain."}),"\n",(0,o.jsx)(e.h2,{id:"why-should-i-consolidate-my-gnosis-validators",children:"Why should I consolidate my Gnosis validators?"}),"\n",(0,o.jsx)(e.p,{children:"If you\u2019ve been running multiple validators on Gnosis Chain, consolidation can simplify your setup and bring several advantages:"}),"\n",(0,o.jsx)(e.h4,{id:"1-simplify-operations",children:"1. Simplify Operations"}),"\n",(0,o.jsx)(e.p,{children:"Managing many validator keys and clients can become complex over time. Consolidating them into fewer validators helps reduce:"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"Configuration overhead"}),"\n",(0,o.jsx)(e.li,{children:"Monitoring burden"}),"\n",(0,o.jsx)(e.li,{children:"Risk of mistakes during upgrades or restarts"}),"\n"]}),"\n",(0,o.jsx)(e.h4,{id:"2-optimize-costs",children:"2. Optimize Costs"}),"\n",(0,o.jsx)(e.p,{children:"Each validator requires independent infrastructure resources. By consolidating:"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"You use less disk space, bandwidth, and processing power"}),"\n",(0,o.jsx)(e.li,{children:"You reduce maintenance costs and time"}),"\n",(0,o.jsx)(e.li,{children:"Fewer fees are required for transactions like reward claims"}),"\n"]}),"\n",(0,o.jsx)(e.h4,{id:"3-better-reward-management",children:"3. Better Reward Management"}),"\n",(0,o.jsx)(e.p,{children:"Instead of tracking rewards across many validators:"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"You centralize rewards into one or a few validator balances"}),"\n",(0,o.jsx)(e.li,{children:"Easier accounting and reporting"}),"\n",(0,o.jsx)(e.li,{children:"Less gas spent claiming rewards"}),"\n"]}),"\n",(0,o.jsx)(e.h4,{id:"4-safe-process",children:"4. Safe process"}),"\n",(0,o.jsx)(e.p,{children:"Consolidation does not change your withdrawal address or risk your funds. It simply merges balances and validator responsibilities in a protocol-safe way."}),"\n",(0,o.jsx)(e.h2,{id:"how-do-i-consolidate-my-gnosis-validators",children:"How do I consolidate my Gnosis validators?"}),"\n",(0,o.jsxs)(e.p,{children:["Step 1: Go to ",(0,o.jsx)(e.a,{href:"https://consolidate.gnosischain.com/",children:"https://consolidate.gnosischain.com/"})]}),"\n",(0,o.jsxs)(e.p,{children:["Step 2: Connect your wallet. Remember to use the ",(0,o.jsx)(e.strong,{children:"same address"})," with which you did the staking deposit of your validators.\n",(0,o.jsx)(e.img,{alt:"wallet",src:i(76176).A+"",width:"1016",height:"556"})]}),"\n",(0,o.jsxs)(e.p,{children:["Step 3: You will see a list of ",(0,o.jsx)(e.strong,{children:"your active validators"})," in the UI.\n",(0,o.jsx)(e.img,{alt:"summary",src:i(84043).A+"",width:"1590",height:"1386"}),"\nStep 4: Click Summary button"]}),"\n",(0,o.jsxs)(e.p,{children:["Step 5: Check the validator list and the ",(0,o.jsx)(e.strong,{children:"target validator"}),". The target validator will stay and the rest will be exited. Click Consolidate Batch\n",(0,o.jsx)(e.img,{alt:"List_validators",src:i(63097).A+"",width:"1140",height:"846"})]}),"\n",(0,o.jsxs)(e.p,{children:["Step 6: The transaction was sent, click ",(0,o.jsx)(e.strong,{children:"Finish"}),". You can check the transaction in the explorer link.\n",(0,o.jsx)(e.img,{alt:"Finish",src:i(50406).A+"",width:"2266",height:"890"})]}),"\n",(0,o.jsxs)(e.p,{children:["Step 7: To have more details, go to gnosischa.in to check the consolidation progress.\n",(0,o.jsx)(e.img,{alt:"deposits_validator",src:i(37161).A+"",width:"2880",height:"1570"})]}),"\n",(0,o.jsxs)(e.p,{children:["Step 8: ",(0,o.jsx)(e.strong,{children:"Write your address"})," in the search field highlighted.\n",(0,o.jsx)(e.img,{alt:"write_address",src:i(53267).A+"",width:"2880",height:"1570"}),"\nStep 9. Click in the target validator key (the only one that has not exited status).\n",(0,o.jsx)(e.img,{alt:"validator_key",src:i(68341).A+"",width:"2878",height:"876"})]}),"\n",(0,o.jsxs)(e.p,{children:["Step 10. Review the consolidation process.\n",(0,o.jsx)(e.img,{alt:"consolidation_click",src:i(20262).A+"",width:"1850",height:"986"})]}),"\n",(0,o.jsxs)(e.p,{children:["The consolidation process might take ",(0,o.jsx)(e.strong,{children:"2-3 days"}),". It depends on the consolidation queue at the moment of consolidation."]}),"\n",(0,o.jsx)(e.p,{children:"Now you are ready to consolidate your Gnosis validators.\nGood luck!"})]})}function h(s={}){const{wrapper:e}={...(0,t.R)(),...s.components};return e?(0,o.jsx)(e,{...s,children:(0,o.jsx)(c,{...s})}):c(s)}},20262:(s,e,i)=>{i.d(e,{A:()=>n});const n=i.p+"assets/images/consolidation_click-59fc7856b8aa231fa0e97ef4f4b84d7d.png"},76176:(s,e,i)=>{i.d(e,{A:()=>n});const n=i.p+"assets/images/continue-712da0a4fd0eafc3f60fdf675ea4b8a1.png"},37161:(s,e,i)=>{i.d(e,{A:()=>n});const n=i.p+"assets/images/deposits_validator-bb581fea4e765c978db1fd81197c1dff.png"},50406:(s,e,i)=>{i.d(e,{A:()=>n});const n=i.p+"assets/images/finish-2df0f97cc1f35bd520ee8762e6d83acd.png"},63097:(s,e,i)=>{i.d(e,{A:()=>n});const n=i.p+"assets/images/list_validators-dbbb41ed0798116b9b8166e25bb284b3.png"},84043:(s,e,i)=>{i.d(e,{A:()=>n});const n=i.p+"assets/images/summary-870e3e69d7251dfc3ee105fa46c3f73f.png"},68341:(s,e,i)=>{i.d(e,{A:()=>n});const n=i.p+"assets/images/validator_key-0892560f7194edf59ce029e943258418.png"},53267:(s,e,i)=>{i.d(e,{A:()=>n});const n=i.p+"assets/images/write_address-5d1edf9e42b1c5dfad9c06777e8cd26e.png"},28453:(s,e,i)=>{i.d(e,{R:()=>a,x:()=>r});var n=i(96540);const o={},t=n.createContext(o);function a(s){const e=n.useContext(t);return n.useMemo((function(){return"function"==typeof s?s(e):{...e,...s}}),[e,s])}function r(s){let e;return e=s.disableParentContext?"function"==typeof s.components?s.components(o):s.components||o:a(s.components),n.createElement(t.Provider,{value:e},s.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/01337eae.8eb3222e.js b/assets/js/01337eae.8eb3222e.js
new file mode 100644
index 000000000..a912131ad
--- /dev/null
+++ b/assets/js/01337eae.8eb3222e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[3150],{40369:(i,n,e)=>{e.r(n),e.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>u,frontMatter:()=>l,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"user/notifications/notifications-list","title":"List of Notifications","description":"This is the full list of events that will be notified in your Dappnode.","source":"@site/docs/user/notifications/notifications-list.md","sourceDirName":"user/notifications","slug":"/user/notifications/notifications-list","permalink":"/docs/user/notifications/notifications-list","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/notifications/notifications-list.md","tags":[],"version":"current","frontMatter":{"title":"List of Notifications","llm_description":"Complete list of Dappnode notifications: system, DMS, execution/consensus clients, validators."},"sidebar":"userSidebar","previous":{"title":"Overview","permalink":"/docs/user/notifications/overview"},"next":{"title":"Inbox","permalink":"/docs/user/notifications/inbox"}}');var s=e(74848),o=e(28453);const l={title:"List of Notifications",llm_description:"Complete list of Dappnode notifications: system, DMS, execution/consensus clients, validators."},c="List of Notifications",r={},a=[{value:"\ud83d\udee0\ufe0f System Notifications",id:"\ufe0f-system-notifications",level:3},{value:"\ud83d\udcca DMS (Dappnode Monitoring Service)",id:"-dms-dappnode-monitoring-service",level:3},{value:"\u2699\ufe0f Execution Clients",id:"\ufe0f-execution-clients",level:3},{value:"\u2696\ufe0f Consensus Clients",id:"\ufe0f-consensus-clients",level:3},{value:"\u2714\ufe0f Validator Notifications",id:"\ufe0f-validator-notifications",level:3},{value:"\ud83d\udce1 Direct Notifications",id:"-direct-notifications",level:3}];function d(i){const n={h1:"h1",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...i.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"list-of-notifications",children:"List of Notifications"})}),"\n",(0,s.jsx)(n.p,{children:"This is the full list of events that will be notified in your Dappnode."}),"\n",(0,s.jsx)(n.h3,{id:"\ufe0f-system-notifications",children:"\ud83d\udee0\ufe0f System Notifications"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Auto-updates (core and non-core packages)"}),"\n",(0,s.jsx)(n.li,{children:"Repository health (IPFS, Ethereum)"}),"\n",(0,s.jsx)(n.li,{children:"Host password security"}),"\n",(0,s.jsx)(n.li,{children:"Wi-Fi password security"}),"\n",(0,s.jsx)(n.li,{children:"Static IP address changes"}),"\n",(0,s.jsx)(n.li,{children:"Host reboot required"}),"\n",(0,s.jsx)(n.li,{children:"Disk usage warnings"}),"\n",(0,s.jsx)(n.li,{children:"Package stoppages due to system limits"}),"\n",(0,s.jsx)(n.li,{children:"No internet connection"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"-dms-dappnode-monitoring-service",children:"\ud83d\udcca DMS (Dappnode Monitoring Service)"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Memory usage"}),"\n",(0,s.jsx)(n.li,{children:"CPU load"}),"\n",(0,s.jsx)(n.li,{children:"Disk usage"}),"\n",(0,s.jsx)(n.li,{children:"Device temperature"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"\ufe0f-execution-clients",children:"\u2699\ufe0f Execution Clients"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Sync status"}),"\n",(0,s.jsx)(n.li,{children:"Peer count"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"\ufe0f-consensus-clients",children:"\u2696\ufe0f Consensus Clients"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Sync status"}),"\n",(0,s.jsx)(n.li,{children:"Peer count"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"\ufe0f-validator-notifications",children:"\u2714\ufe0f Validator Notifications"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Validator online"}),"\n",(0,s.jsx)(n.li,{children:"Validator offline"}),"\n",(0,s.jsx)(n.li,{children:"Validator slashed"}),"\n",(0,s.jsx)(n.li,{children:"Block proposal missed"}),"\n",(0,s.jsx)(n.li,{children:"Block proposal submitted"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"-direct-notifications",children:"\ud83d\udce1 Direct Notifications"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Important messages from the Dappnode team"}),"\n"]})]})}function u(i={}){const{wrapper:n}={...(0,o.R)(),...i.components};return n?(0,s.jsx)(n,{...i,children:(0,s.jsx)(d,{...i})}):d(i)}},28453:(i,n,e)=>{e.d(n,{R:()=>l,x:()=>c});var t=e(96540);const s={},o=t.createContext(s);function l(i){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof i?i(n):{...n,...i}}),[n,i])}function c(i){let n;return n=i.disableParentContext?"function"==typeof i.components?i.components(s):i.components||s:l(i.components),t.createElement(o.Provider,{value:n},i.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/01a85c17.8ceecd4d.js b/assets/js/01a85c17.8ceecd4d.js
new file mode 100644
index 000000000..0c6ca6826
--- /dev/null
+++ b/assets/js/01a85c17.8ceecd4d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8209],{83750:(e,t,a)=>{a.d(t,{in:()=>c,OU:()=>y,Ki:()=>A,kJ:()=>b,x:()=>l,e7:()=>m,J_:()=>f,Gx:()=>k});var s=a(96540),n=a(26849),i=a(69062),r=a(74848);function l(){const e=(0,i.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=s.createContext(null);function c(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const i=function(e){let{content:t,isBlogPostPage:a}=e;return(0,s.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return(0,r.jsx)(o.Provider,{value:i,children:t})}function m(){const e=(0,s.useContext)(o);if(null===e)throw new n.dV("BlogPostProvider");return e}var d=a(29030),u=a(40797);const g=e=>new Date(e).toISOString();function p(e){const t=e.map(x);return{author:1===t.length?t[0]:t}}function h(e,t,a){return e?{image:j({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function b(e){const{siteConfig:t}=(0,u.A)(),{withBaseUrl:a}=(0,d.hH)(),{metadata:{blogDescription:s,blogTitle:n,permalink:i}}=e,r=`${t.url}${i}`;return{"@context":"https://schema.org","@type":"Blog","@id":r,mainEntityOfPage:r,headline:n,description:s,blogPost:e.items.map((e=>function(e,t,a){const{assets:s,frontMatter:n,metadata:i}=e,{date:r,title:l,description:o,lastUpdatedAt:c}=i,m=s.image??n.image,d=n.keywords??[],u=`${t.url}${i.permalink}`,b=c?g(c):void 0;return{"@type":"BlogPosting","@id":u,mainEntityOfPage:u,url:u,headline:l,name:l,description:o,datePublished:r,...b?{dateModified:b}:{},...p(i.authors),...h(m,a,l),...d?{keywords:d}:{}}}(e.content,t,a)))}}function f(){const e=l(),{assets:t,metadata:a}=m(),{siteConfig:s}=(0,u.A)(),{withBaseUrl:n}=(0,d.hH)(),{date:i,title:r,description:o,frontMatter:c,lastUpdatedAt:b}=a,f=t.image??c.image,x=c.keywords??[],j=b?g(b):void 0,N=`${s.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":N,mainEntityOfPage:N,url:N,headline:r,name:r,description:o,datePublished:i,...j?{dateModified:j}:{},...p(a.authors),...h(f,n,r),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${s.url}${e.blogBasePath}`,name:e.blogTitle}}}function x(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function j(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}var N=a(56347),v=a(56289),C=a(11861),_=a(30214);function k(e){const{pathname:t}=(0,N.zy)();return(0,s.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,_.ys)(e.permalink,t))}(e,t)))),[e,t])}function A(e){const t=(0,C.$z)(e,(e=>`${new Date(e.date).getFullYear()}`)),a=Object.entries(t);return a.reverse(),a}function y(e){let{items:t,ulClassName:a,liClassName:s,linkClassName:n,linkActiveClassName:i}=e;return(0,r.jsx)("ul",{className:a,children:t.map((e=>(0,r.jsx)("li",{className:s,children:(0,r.jsx)(v.A,{isNavLink:!0,to:e.permalink,className:n,activeClassName:i,children:e.title})},e.permalink)))})}},60569:(e,t,a)=>{a.d(t,{A:()=>U});var s=a(96540),n=a(18215),i=a(99795),r=a(86682),l=a(50539),o=a(83750),c=a(53115),m=a(9303),d=a(74848);function u(e){let{year:t,yearGroupHeadingClassName:a,children:s}=e;return(0,d.jsxs)("div",{role:"group",children:[(0,d.jsx)(m.A,{as:"h3",className:a,children:t}),s]})}function g(e){let{items:t,yearGroupHeadingClassName:a,ListComponent:s}=e;if((0,c.p)().blog.sidebar.groupByYear){const e=(0,o.Ki)(t);return(0,d.jsx)(d.Fragment,{children:e.map((e=>{let[t,n]=e;return(0,d.jsx)(u,{year:t,yearGroupHeadingClassName:a,children:(0,d.jsx)(s,{items:n})},t)}))})}return(0,d.jsx)(s,{items:t})}const p=(0,s.memo)(g),h="sidebar_re4s",b="sidebarItemTitle_pO2u",f="sidebarItemList_Yudw",x="sidebarItem__DBe",j="sidebarItemLink_mo7H",N="sidebarItemLinkActive_I1ZP",v="yearGroupHeading_rMGB",C=e=>{let{items:t}=e;return(0,d.jsx)(o.OU,{items:t,ulClassName:(0,n.A)(f,"clean-list"),liClassName:x,linkClassName:j,linkActiveClassName:N})};function _(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,d.jsx)("aside",{className:"col col--3",children:(0,d.jsxs)("nav",{className:(0,n.A)(h,"thin-scrollbar"),"aria-label":(0,l.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,d.jsx)("div",{className:(0,n.A)(b,"margin-bottom--md"),children:t.title}),(0,d.jsx)(p,{items:a,ListComponent:C,yearGroupHeadingClassName:v})]})})}const k=(0,s.memo)(_);var A=a(63065);const y="yearGroupHeading_QT03",P=e=>{let{items:t}=e;return(0,d.jsx)(o.OU,{items:t,ulClassName:"menu__list",liClassName:"menu__list-item",linkClassName:"menu__link",linkActiveClassName:"menu__link--active"})};function w(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,d.jsx)(p,{items:a,ListComponent:P,yearGroupHeadingClassName:y})}function B(e){return(0,d.jsx)(A.GX,{component:w,props:e})}const G=(0,s.memo)(B);function O(e){let{sidebar:t}=e;const a=(0,r.l)();return t?.items.length?"mobile"===a?(0,d.jsx)(G,{sidebar:t}):(0,d.jsx)(k,{sidebar:t}):null}function U(e){const{sidebar:t,toc:a,children:s,...r}=e,l=t&&t.items.length>0;return(0,d.jsx)(i.A,{...r,children:(0,d.jsx)("div",{className:"container margin-vert--lg",children:(0,d.jsxs)("div",{className:"row",children:[(0,d.jsx)(O,{sidebar:t}),(0,d.jsx)("main",{className:(0,n.A)("col",{"col--7":l,"col--9 col--offset-1":!l}),children:s}),a&&(0,d.jsx)("div",{className:"col col--2",children:a})]})})})}},4941:(e,t,a)=>{a.r(t),a.d(t,{default:()=>b});a(96540);var s=a(18215),n=a(50539);const i=()=>(0,n.T)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});var r=a(81082),l=a(204),o=a(60569),c=a(23953),m=a(9303);const d={tag:"tag_Nnez"};var u=a(74848);function g(e){let{letterEntry:t}=e;return(0,u.jsxs)("article",{children:[(0,u.jsx)(m.A,{as:"h2",id:t.letter,children:t.letter}),(0,u.jsx)("ul",{className:"padding--none",children:t.tags.map((e=>(0,u.jsx)("li",{className:d.tag,children:(0,u.jsx)(c.A,{...e})},e.permalink)))}),(0,u.jsx)("hr",{})]})}function p(e){let{tags:t}=e;const a=function(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[s]=t;return a.localeCompare(s)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}(t);return(0,u.jsx)("section",{className:"margin-vert--lg",children:a.map((e=>(0,u.jsx)(g,{letterEntry:e},e.letter)))})}var h=a(37220);function b(e){let{tags:t,sidebar:a}=e;const n=i();return(0,u.jsxs)(r.e3,{className:(0,s.A)(l.G.wrapper.blogPages,l.G.page.blogTagsListPage),children:[(0,u.jsx)(r.be,{title:n}),(0,u.jsx)(h.A,{tag:"blog_tags_list"}),(0,u.jsxs)(o.A,{sidebar:a,children:[(0,u.jsx)(m.A,{as:"h1",children:n}),(0,u.jsx)(p,{tags:t})]})]})}},23953:(e,t,a)=>{a.d(t,{A:()=>l});a(96540);var s=a(18215),n=a(56289);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var r=a(74848);function l(e){let{permalink:t,label:a,count:l,description:o}=e;return(0,r.jsxs)(n.A,{href:t,title:o,className:(0,s.A)(i.tag,l?i.tagWithCount:i.tagRegular),children:[a,l&&(0,r.jsx)("span",{children:l})]})}}}]);
\ No newline at end of file
diff --git a/assets/js/027d004c.6ffa6c79.js b/assets/js/027d004c.6ffa6c79.js
new file mode 100644
index 000000000..79293f43d
--- /dev/null
+++ b/assets/js/027d004c.6ffa6c79.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1699],{28361:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>d,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"dao/node-basics","title":"The NODE Economy","description":"NODE Basics","source":"@site/docs/dao/node-basics.md","sourceDirName":"dao","slug":"/dao/node-basics","permalink":"/docs/dao/node-basics","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dao/node-basics.md","tags":[],"version":"current","frontMatter":{"title":"The NODE Economy","llm_description":"NODE token economics: 100M supply distribution, NODEdrop recipients, and NODEstream vesting."},"sidebar":"daoSidebar","previous":{"title":"DAO","permalink":"/docs/dao"},"next":{"title":"Liquidity Mining","permalink":"/docs/dao/liquidity-mining"}}');var t=i(74848),s=i(28453);const d={title:"The NODE Economy",llm_description:"NODE token economics: 100M supply distribution, NODEdrop recipients, and NODEstream vesting."},o="The NODE Economy",a={},l=[{value:"NODE Basics",id:"node-basics",level:3},{value:"NODEdrop",id:"nodedrop",level:3},{value:"NODEstream",id:"nodestream",level:3}];function c(e){const n={a:"a",h1:"h1",h3:"h3",header:"header",img:"img",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"the-node-economy",children:"The NODE Economy"})}),"\n",(0,t.jsx)(n.h3,{id:"node-basics",children:"NODE Basics"}),"\n",(0,t.jsxs)(n.p,{children:["Token Address on Mainnet - ",(0,t.jsx)(n.a,{href:"https://etherscan.io/address/0xDa007777D86AC6d989cC9f79A73261b3fC5e0DA0",children:"0xDa007777D86AC6d989cC9f79A73261b3fC5e0DA0"})]}),"\n",(0,t.jsxs)(n.p,{children:["Token Address on xDai - ",(0,t.jsx)(n.a,{href:"https://blockscout.com/xdai/mainnet/address/0xc60e38C6352875c051B481Cbe79Dd0383AdB7817/transactions",children:"0xc60e38C6352875c051B481Cbe79Dd0383AdB7817"})]}),"\n",(0,t.jsx)(n.p,{children:"NODE has a total initial supply of 100,000,000 tokens. These tokens have been distributed in accordance with the following chart:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"NODEdrop distribution pie chart",src:i(72086).A+"",width:"869",height:"498"})}),"\n",(0,t.jsx)(n.h3,{id:"nodedrop",children:"NODEdrop"}),"\n",(0,t.jsx)(n.p,{children:"NODE has been airdropped in a NODEdrop to our community of faithful supporters. Recipients of the NODEdrop include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Dappnode Team Members"}),"\n",(0,t.jsx)(n.li,{children:"Dappnode Founders"}),"\n",(0,t.jsx)(n.li,{children:"Purchasers of Dappnode hardware"}),"\n",(0,t.jsx)(n.li,{children:"Code Contributors"}),"\n",(0,t.jsx)(n.li,{children:"Active community members, ranked by our sourcecred algorithm"}),"\n",(0,t.jsx)(n.li,{children:"Donors to Dappnode in Gitcoin Grants Rounds (with donations above $1)"}),"\n",(0,t.jsx)(n.li,{children:'Eth2 stakers who have self-identified as Dappnode runners by including the word "Dappnode" in their graffiti'}),"\n",(0,t.jsx)(n.li,{children:"Eth2 stakers present in the Genesis of Eth2"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Check your NODEdrop ",(0,t.jsx)(n.a,{href:"http://app.dappnode.io/nodedrop",children:"here"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"nodestream",children:"NODEstream"}),"\n",(0,t.jsx)(n.p,{children:'90% of the entire initial supply of NODE has been allocated to the "NODEstream" which is set to flow for a period of 3 years (36 months - i.e. until July 2024). This is essentially a continuous stream of NODE that flows out of the "Reservoir" and into the "Claimable" section of the dashboard. NODEstream distribution can be roughly tracked as follows:'}),"\n",(0,t.jsx)(n.p,{children:"Table for Eth"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Date"}),(0,t.jsx)(n.th,{children:"Month"}),(0,t.jsx)(n.th,{children:"Claimable"}),(0,t.jsx)(n.th,{children:"Held in Reservoir"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Jul 17 2021, 22:00:00 GMT+0200 (Central European Summer Time)"}),(0,t.jsx)(n.td,{children:"0"}),(0,t.jsx)(n.td,{children:"10%"}),(0,t.jsx)(n.td,{children:"90%"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Apr 17 2022, 22:00:00 GMT+0200 (Central European Summer Time)"}),(0,t.jsx)(n.td,{children:"9"}),(0,t.jsx)(n.td,{children:"32.5%"}),(0,t.jsx)(n.td,{children:"67.5%"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Jan 17 2023, 22:00:00 GMT+0200 (Central European Summer Time)"}),(0,t.jsx)(n.td,{children:"18"}),(0,t.jsx)(n.td,{children:"55%"}),(0,t.jsx)(n.td,{children:"45%"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Oct 17 2023, 22:00:00 GMT+0200 (Central European Summer Time)"}),(0,t.jsx)(n.td,{children:"27"}),(0,t.jsx)(n.td,{children:"77.5%"}),(0,t.jsx)(n.td,{children:"22.5%"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Jul 17 2024, 16:00:00 GMT+0200 (Central European Summer Time)"}),(0,t.jsx)(n.td,{children:"36"}),(0,t.jsx)(n.td,{children:"100%"}),(0,t.jsx)(n.td,{children:"0%"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"Table for xDai"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Date"}),(0,t.jsx)(n.th,{children:"Month"}),(0,t.jsx)(n.th,{children:"Claimable"}),(0,t.jsx)(n.th,{children:"Held in Reservoir"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Jul 17 2021, 22:00:00 GMT+0200 (Central European Summer Time)"}),(0,t.jsx)(n.td,{children:"0"}),(0,t.jsx)(n.td,{children:"0%"}),(0,t.jsx)(n.td,{children:"100%"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Apr 17 2022, 22:00:00 GMT+0200 (Central European Summer Time)"}),(0,t.jsx)(n.td,{children:"9"}),(0,t.jsx)(n.td,{children:"25%"}),(0,t.jsx)(n.td,{children:"75%"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Jan 17 2023, 22:00:00 GMT+0200 (Central European Summer Time)"}),(0,t.jsx)(n.td,{children:"18"}),(0,t.jsx)(n.td,{children:"50%"}),(0,t.jsx)(n.td,{children:"50%"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Oct 17 2023, 22:00:00 GMT+0200 (Central European Summer Time)"}),(0,t.jsx)(n.td,{children:"27"}),(0,t.jsx)(n.td,{children:"75%"}),(0,t.jsx)(n.td,{children:"35%"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Jul 17 2024, 16:00:00 GMT+0200 (Central European Summer Time)"}),(0,t.jsx)(n.td,{children:"36"}),(0,t.jsx)(n.td,{children:"100%"}),(0,t.jsx)(n.td,{children:"0%"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"The NODEstream works on a time-based linear function, meaning the reservoir will gradually hold a smaller percentage of your NODE and thus more NODE is made instantly available from your staking rewards. At the end of the NODEstream The reservoir will no longer hold any NODE and 100% of your staking rewards will be instantly claimable."}),"\n",(0,t.jsx)(n.p,{children:"This chart show how the function works in Etherum network."}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{width:"70%",src:"/img/nodestream_vesting.png"})}),"\n",(0,t.jsx)(n.p,{children:"This chart show how the function works in dao network. In Ethereum 10% was available at the beginning. In xdai is different, initially it was not available any % token."}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{width:"70%",src:"../../img/nodestream_vesting_xdai.png"})}),"\n",(0,t.jsx)(n.p,{children:"The NODEstream has been designed to encourage long-term participation in the NODE Economy. As the NODE Economy grows and the Dappnode universe expands, our community is awarded even more NODE to use in DAO governance."}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"../../img/claimNODE.png"})}),"\n",(0,t.jsx)(n.p,{children:"Recipients of the NODEdrop on xDai Network are granted the NODEstream, whereas on Mainnet the NODEdrop does not include the NODEstream automatically. In order to receive and augment the flow of NODE you must provide liquidity in any of the eligible pools. Some part of the rewards earned from NODEstaking are claimable immediately, where as the other part is allocated to the reservoir for NODEstreaming."})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},72086:(e,n,i)=>{i.d(n,{A:()=>r});const r=i.p+"assets/images/node_distribution-48b18d5d9b5d462eb1049d3a8aa33a27.png"},28453:(e,n,i)=>{i.d(n,{R:()=>d,x:()=>o});var r=i(96540);const t={},s=r.createContext(t);function d(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0429b4a1.acb57326.js b/assets/js/0429b4a1.acb57326.js
new file mode 100644
index 000000000..b94dbdec3
--- /dev/null
+++ b/assets/js/0429b4a1.acb57326.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9572],{84133:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>t,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"user/dappnode-cloud/providers/aws/overview","title":"AWS","description":"Amazon Web Services (AWS) is a cloud computing platform provided by Amazon. It offers a wide range of services, including computing power, storage options, and networking capabilities, enabling users to build and deploy applications and services efficiently.","source":"@site/docs/user/dappnode-cloud/providers/aws/overview.md","sourceDirName":"user/dappnode-cloud/providers/aws","slug":"/user/dappnode-cloud/providers/aws/overview","permalink":"/docs/user/dappnode-cloud/providers/aws/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/dappnode-cloud/providers/aws/overview.md","tags":[],"version":"current","frontMatter":{"title":"AWS","llm_description":"AWS overview: Dappnode AMI at $15/month plus AWS infrastructure costs (pay-as-you-go)."},"sidebar":"userSidebar","previous":{"title":"Overview","permalink":"/docs/user/dappnode-cloud/overview"},"next":{"title":"How to set up an Instance","permalink":"/docs/user/dappnode-cloud/providers/aws/set-up-instance"}}');var s=o(74848),a=o(28453);const t={title:"AWS",llm_description:"AWS overview: Dappnode AMI at $15/month plus AWS infrastructure costs (pay-as-you-go)."},r="AWS",d={},c=[{value:"Dappnode AWS AMI",id:"dappnode-aws-ami",level:2},{value:"Pricing",id:"pricing",level:3},{value:"Dappnode AMI \ud83d\udcc0",id:"dappnode-ami-",level:4},{value:"AWS Machines \ud83d\udda5",id:"aws-machines-",level:4}];function p(e){const n={admonition:"admonition",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"aws",children:"AWS"})}),"\n",(0,s.jsx)(n.p,{children:"Amazon Web Services (AWS) is a cloud computing platform provided by Amazon. It offers a wide range of services, including computing power, storage options, and networking capabilities, enabling users to build and deploy applications and services efficiently."}),"\n",(0,s.jsx)(n.h2,{id:"dappnode-aws-ami",children:"Dappnode AWS AMI"}),"\n",(0,s.jsx)(n.p,{children:"The Dappnode AMI is an image specifically designed for running Dappnode in the AWS environment. It contains all the pre-installed software and configurations required to deploy a fully functional Dappnode instance. By using the Dappnode AMI, users can quickly launch an instance in the cloud without having to manually set up and configure the Dappnode software, simplifying the deployment process and ensuring consistency across different instances."}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"An Amazon Machine Image (AMI) is a pre-configured template used to create a virtual machine within the AWS cloud."})}),"\n",(0,s.jsx)(n.h3,{id:"pricing",children:"Pricing"}),"\n",(0,s.jsx)(n.p,{children:"When using Dappnode Cloud on AWS, there are two main charges to consider:"}),"\n",(0,s.jsx)(n.h4,{id:"dappnode-ami-",children:"Dappnode AMI \ud83d\udcc0"}),"\n",(0,s.jsx)(n.p,{children:"The Dappnode AMI is available for $15 per month. This fee grants you access to the Dappnode image, allowing you to launch as many instances as you need. This cost covers the use of Dappnode's software in the cloud."}),"\n",(0,s.jsx)(n.h4,{id:"aws-machines-",children:"AWS Machines \ud83d\udda5"}),"\n",(0,s.jsx)(n.p,{children:"In addition to the Dappnode AMI fee, you will incur charges for the AWS infrastructure itself. These costs vary based on several factors:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Instance Type:"})," The specifications of the machine you choose, such as CPU and memory will affect the pricing."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Storage:"})," The amount and type of storage you select for your instance, will also influence the cost."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Region:"})," AWS pricing varies by region, so the location where you launch your instance can impact the overall cost."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"AWS operates on a pay-as-you-go model, meaning you only pay for the resources you use. Before launching your instance, you can view an estimate of the expected costs on the Dappnode AMI launch page. This estimate provides transparency, helping you plan your budget effectively."})})]})}function l(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},28453:(e,n,o)=>{o.d(n,{R:()=>t,x:()=>r});var i=o(96540);const s={},a=i.createContext(s);function t(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/042eff12.e44d67fa.js b/assets/js/042eff12.e44d67fa.js
new file mode 100644
index 000000000..919ab0c13
--- /dev/null
+++ b/assets/js/042eff12.e44d67fa.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[7849],{73929:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"user/staking/switch-clients","title":"Switch staking clients","description":"This guide explains how to switch execution and consensus clients on Dappnode for Ethereum, Gnosis, and Lukso networks. It includes detailed information about the switching process and expected waiting times for resynchronization and attestation.","source":"@site/docs/user/staking/switch-clients.md","sourceDirName":"user/staking","slug":"/user/staking/switch-clients","permalink":"/docs/user/staking/switch-clients","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/switch-clients.md","tags":[],"version":"current","frontMatter":{"title":"Switch staking clients","llm_description":"How to switch execution and consensus clients on Dappnode with sync times and best practices."},"sidebar":"userSidebar","previous":{"title":"Earn with Staking","permalink":"/docs/user/staking/overview"},"next":{"title":"Mainnet","permalink":"/docs/user/staking/ethereum/solo/mainnet"}}');var s=i(74848),c=i(28453);const r={title:"Switch staking clients",llm_description:"How to switch execution and consensus clients on Dappnode with sync times and best practices."},o="Switch staking clients",l={},a=[{value:"General Information",id:"general-information",level:2},{value:"Execution client switch",id:"execution-client-switch",level:2},{value:"Consensus client switch",id:"consensus-client-switch",level:2},{value:"Blockchains sync time & recommended disk space",id:"blockchains-sync-time--recommended-disk-space",level:2},{value:"Best Practices",id:"best-practices",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2}];function d(e){const n={admonition:"admonition",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,c.R)(),...e.components},{Details:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"switch-staking-clients",children:"Switch staking clients"})}),"\n",(0,s.jsx)(n.p,{children:"This guide explains how to switch execution and consensus clients on Dappnode for Ethereum, Gnosis, and Lukso networks. It includes detailed information about the switching process and expected waiting times for resynchronization and attestation."}),"\n",(0,s.jsx)(n.h2,{id:"general-information",children:"General Information"}),"\n",(0,s.jsx)(n.p,{children:"Important considerations before switching clients:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Downtime:"})," Switching clients will result in temporary downtime and missed attestations."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Sync Time:"})," New clients will need time to synchronize with the network."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Disk Space:"})," Ensure you have enough disk space for the new client before switching."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Backup:"})," Always backup your validator keys and wallet information before making any changes."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Basic Switching Process Overview"}),"\nThe following switching process applies to Ethereum, Gnosis and Lukso."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Install new client."}),"\n",(0,s.jsx)(n.li,{children:"Go to the stakers tab in the left menu."}),"\n",(0,s.jsx)(n.li,{children:"Select the new client."}),"\n",(0,s.jsx)(n.li,{children:"Click on the Apply changes button."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"stakers tab",src:i(17955).A+"",width:"2866",height:"1570"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Wait for synchronization. You can view the sync process in the dashboard tab or inside the client package in the logs section.\n",(0,s.jsx)(n.img,{alt:"Dashboard",src:i(40887).A+"",width:"1844",height:"686"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"What's happening during Sync?"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Connecting to peers on the network"}),"\n",(0,s.jsx)(n.li,{children:"Downloading block headers and bodies"}),"\n",(0,s.jsx)(n.li,{children:"Processing and validating transactions"}),"\n",(0,s.jsx)(n.li,{children:"Building the state trie and other database structures"}),"\n",(0,s.jsx)(n.li,{children:"Executing all historical transactions"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Verify correct operation"}),"\nGo to the new client package in the packages tab and check the logs section (Technical knowledge is needed to read the logs)\nGo to Beaconcha.in dashboard and check if your validators are active and attesting."]}),"\n",(0,s.jsx)(n.h2,{id:"execution-client-switch",children:"Execution client switch"}),"\n",(0,s.jsx)(n.p,{children:"The current execution clients supported in Dappnode are the following:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Ethereum execution clients: Reth, Geth, Nethermind, Erigon and Besu"}),"\n",(0,s.jsx)(n.li,{children:"Gnosis execution clients: Nethermind and Erigon"}),"\n",(0,s.jsx)(n.li,{children:"Lukso execution client: Geth"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Switching execution clients is a ",(0,s.jsx)(n.strong,{children:"critical operation that can substantially impact attestation performance"})," due to the extensive sync time required. Additionally, it is important to consider that installing a new execution client demands significant disk space."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Sync time"}),(0,s.jsx)(n.th,{children:"Attestattion impact"}),(0,s.jsx)(n.th,{children:"Disk space required"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"12-48h"}),(0,s.jsx)(n.td,{children:"12-48h"}),(0,s.jsx)(n.td,{children:"+2 TB"})]})})]}),"\n",(0,s.jsx)(n.p,{children:"If the client was not downloaded and sync previously, an initial sync is needed. It typically takes from 12 to 48 hours depending on the client. All times mentioned here assume standard Solid State Disk storage and reasonable network conditions. Actual times may vary based on hardware, network conditions, and chain state. Attestation impact directly correlates with sync time plus small overhead for client initialization."}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["The sync process might ",(0,s.jsx)(n.strong,{children:"require high resources of your hardware"}),", do not worry if your CPU temperature reaches 100\xbaC or your CPU usage is +90%, it is normal during the sync process. It would be problematic only if it stays at these levels for several days. In this case check maintenance practices in this documentation."]})}),"\n",(0,s.jsx)(n.h2,{id:"consensus-client-switch",children:"Consensus client switch"}),"\n",(0,s.jsx)(n.p,{children:"The current consensus clients supported in Dappnode are the following:\nEthereum consensus clients: Lighthouse, Teku, Lodestar Nimbus and Prysm.\nGnosis consensus clients: Lighthouse, Teku, Lodestar and Nimbus\nLukso consensus clients: Teku and Prysm"}),"\n",(0,s.jsxs)(n.p,{children:["Switching consensus clients is a ",(0,s.jsx)(n.strong,{children:"quick action and the attestation impact is limited"}),". Consensus clients do not require a lot of space to run properly."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Sync time"}),(0,s.jsx)(n.th,{children:"Attestattion impact"}),(0,s.jsx)(n.th,{children:"Disk space required"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"10 min"}),(0,s.jsx)(n.td,{children:"30 min"}),(0,s.jsx)(n.td,{children:"+30 GB"})]})})]}),"\n",(0,s.jsxs)(n.p,{children:["All consensus clients have a ",(0,s.jsx)(n.strong,{children:"sync time of 5-10 minutes"})," max thanks to checkpoint sync.\nCheckpoint sync helps to connect to the current state of the blockchain getting the data from an external node, so it does not need to start from scratch, reducing the time of synchronization significantly."]}),"\n",(0,s.jsx)(n.p,{children:"It is always advisable to switch to a new consensus client from scratch (without existent volumes) to trigger the checkpoint sync. Otherwise, if you have a client with previous blockchain data, it will require more time to sync."}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"After sync time completes, it has an extra downtime of 1-3 epochs (6 - 18 minutes). This is the \u201cdoppelganger\u201d check, an extra protection measure to avoid slashing."})}),"\n",(0,s.jsx)(n.h2,{id:"blockchains-sync-time--recommended-disk-space",children:"Blockchains sync time & recommended disk space"}),"\n",(0,s.jsx)(n.p,{children:"The sync time varies depending on the blockchain selected to run your validators."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Blockchain"}),(0,s.jsx)(n.th,{children:"Sync time"}),(0,s.jsx)(n.th,{children:"Disk space recommended"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Ethereum"}),(0,s.jsx)(n.td,{children:"12-48 h"}),(0,s.jsx)(n.td,{children:"+1.5 TB"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Gnosis"}),(0,s.jsx)(n.td,{children:"8-16 h"}),(0,s.jsx)(n.td,{children:"+0.5 TB"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Lukso"}),(0,s.jsx)(n.td,{children:"4-12 h"}),(0,s.jsx)(n.td,{children:"+0.5 TB"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Hoodi"}),(0,s.jsx)(n.td,{children:"2-4 h"}),(0,s.jsx)(n.td,{children:"+0.5 TB"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"best-practices",children:"Best Practices"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Plan Your Switch"}),": Choose a time with low network activity for switching to minimize the impact of missed attestations."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Don't Delete Old Client Data Immediately:"})," Keep the data from your old client for a few days in case you need to switch back. If you want to keep the new client in the long term, we recommend deleting the previous client before installing the new one to ensure enough disk space"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Monitor Synchronization:"})," Use Dappnode's dashboard to monitor the synchronization progress of your new client."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Verify Client Health:"})," After switching, verify that your new client is properly connected to the network and producing attestations in the package logs."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Check Logs:"})," Regularly check the logs of your new client to ensure there are no errors or issues."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Update API Connections:"})," If you have any external tools connecting to your node, update their connection settings to point to the new client."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Enable Dappnode notifications:"})," Push notifications can help to track the status of your validators and clients."]}),"\n",(0,s.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,s.jsx)(n.p,{children:"Common Issues and Solutions"}),"\n",(0,s.jsxs)(t,{children:[(0,s.jsx)("summary",{children:(0,s.jsx)("b",{children:"New Client Won't Start"})}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Check disk space availability (Go to Dashboard)"}),"\n",(0,s.jsx)(n.li,{children:"Verify port conflicts aren't occurring (Go to Support tab/ Ports)"}),"\n",(0,s.jsx)(n.li,{children:"Ensure JWT token is correctly configured (Go to Package info)"}),"\n"]})]}),"\n",(0,s.jsxs)(t,{children:[(0,s.jsx)("summary",{children:(0,s.jsx)("b",{children:"Synchronization Takes Too Long"})}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Check your internet connection speed"}),"\n",(0,s.jsx)(n.li,{children:"Verify sufficient disk I/O performance (use SSD)"}),"\n",(0,s.jsx)(n.li,{children:"Restart client in the package to refresh peer connections"}),"\n",(0,s.jsx)(n.li,{children:"Delete the volumes of the client package to trigger Checkpoint sync"}),"\n"]})]}),"\n",(0,s.jsxs)(t,{children:[(0,s.jsx)("summary",{children:(0,s.jsx)("b",{children:"Missing Attestations After Switch"})}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Verify execution and consensus clients are properly connected"}),"\n",(0,s.jsx)(n.li,{children:"Check that validator keys were correctly imported"}),"\n",(0,s.jsx)(n.li,{children:"Ensure the beacon chain is fully synced"}),"\n"]})]}),"\n",(0,s.jsxs)(t,{children:[(0,s.jsx)("summary",{children:(0,s.jsx)("b",{children:"API Connection Errors"})}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Verify API endpoints are correctly configured"}),"\n",(0,s.jsx)(n.li,{children:"Check firewall settings"}),"\n",(0,s.jsx)(n.li,{children:"Ensure proper authentication is configured"}),"\n"]})]}),"\n",(0,s.jsxs)(t,{children:[(0,s.jsx)("summary",{children:(0,s.jsx)("b",{children:"High Resource Usage"})}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Different clients have different resource profiles"}),"\n",(0,s.jsx)(n.li,{children:"Hardware Maintenance (cleaning dust\u2026)"}),"\n",(0,s.jsx)(n.li,{children:"Consider hardware upgrades if consistently overloaded"}),"\n"]})]}),"\n",(0,s.jsx)(n.p,{children:"If you are experiencing a different problem, you can:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Ask the community in the support channel in Discord."}),"\n",(0,s.jsxs)(n.li,{children:["Subscribe to ",(0,s.jsx)(n.strong,{children:"Dappnode Premium"})," to be guided by a Dappnode team member personally."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},40887:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/dashboard-d5fcdb44451606f0719f2cc138187c1c.png"},17955:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/stakerstab-c3ae3999bd921b68b0d7c4c3e712e9ba.png"},28453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>o});var t=i(96540);const s={},c=t.createContext(s);function r(e){const n=t.useContext(c);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(c.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/058440e4.2ac93771.js b/assets/js/058440e4.2ac93771.js
new file mode 100644
index 000000000..cc39af251
--- /dev/null
+++ b/assets/js/058440e4.2ac93771.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[2933],{66086:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>h});const i=JSON.parse('{"id":"user/staking/overview","title":"Earn with Staking in Dappnode","description":"Decentralize Proof-of-Stake chains and earn","source":"@site/docs/user/staking/overview.md","sourceDirName":"user/staking","slug":"/user/staking/overview","permalink":"/docs/user/staking/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/overview.md","tags":[],"version":"current","frontMatter":{"title":"Earn with Staking in Dappnode","llm_description":"Introduction to staking with Dappnode on Ethereum, Gnosis Chain, and LUKSO networks."},"sidebar":"userSidebar","previous":{"title":"Temperature","permalink":"/docs/user/hardware/temperature"},"next":{"title":"Switch staking clients","permalink":"/docs/user/staking/switch-clients"}}');var s=t(74848),a=t(28453);const r={title:"Earn with Staking in Dappnode",llm_description:"Introduction to staking with Dappnode on Ethereum, Gnosis Chain, and LUKSO networks."},o="Earn with Staking in Dappnode",d={},h=[{value:"Decentralize Proof-of-Stake chains and earn",id:"decentralize-proof-of-stake-chains-and-earn",level:2},{value:"The Stakers UI",id:"the-stakers-ui",level:2},{value:"Can I stake without 32 ETH?",id:"can-i-stake-without-32-eth",level:2},{value:"What is Staking?",id:"what-is-staking",level:2},{value:"Why Stake with Dappnode?",id:"why-stake-with-dappnode",level:2}];function c(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"earn-with-staking-in-dappnode",children:"Earn with Staking in Dappnode"})}),"\n",(0,s.jsx)(n.h2,{id:"decentralize-proof-of-stake-chains-and-earn",children:"Decentralize Proof-of-Stake chains and earn"}),"\n",(0,s.jsxs)(n.p,{children:["Dappnode makes it ",(0,s.jsx)(n.strong,{children:"extremely simple"})," to stake and validate Proof-of-Stake chains such as Ethereum, Gnosis Chain and LUKSO. ",(0,s.jsx)(n.strong,{children:"Not only do you contribute to the network's security, but you also earn handsome rewards."})]}),"\n",(0,s.jsx)(n.p,{children:"Dappnode offers you the best UX, through our Stakers UI, with which you can run a validator node in a few simple steps and without ever needing command line or technical knowledge."}),"\n",(0,s.jsx)(n.h2,{id:"the-stakers-ui",children:"The Stakers UI"}),"\n",(0,s.jsxs)(n.p,{children:["You can run all the infrastructure for ",(0,s.jsx)(n.a,{href:"/docs/user/staking/ethereum/solo/mainnet",children:"Ethereum"}),", ",(0,s.jsx)(n.a,{href:"/docs/user/staking/gnosis-chain/solo",children:"Gnosis Chain"})," and ",(0,s.jsx)(n.a,{href:"/docs/user/staking/lukso/solo",children:"LUKSO"})," in 4 steps through the Stakers UI:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(9276).A+"",width:"1770",height:"1496"})}),"\n",(0,s.jsx)(n.p,{children:'Apart from installing the nodes, you will need to generate the keys for the validator and deposit (or "stake"!) your crypto. Please refer to each section for Ethereum, Gnosis Chain and LUKSO for step-by-step guides.'}),"\n",(0,s.jsx)(n.h2,{id:"can-i-stake-without-32-eth",children:"Can I stake without 32 ETH?"}),"\n",(0,s.jsx)(n.p,{children:"Yes! Thanks to LSDs AND DVT tech, you don't need 32 ETH to stake. Or you can stake in Gnosis Chain or LUKSO, which have more affordable cost for a solo validator."}),"\n",(0,s.jsx)(n.p,{children:"For more information on LSDs and DVT and how you can stake Ethereum without 32 ETH, please check their dedicated pages on the side menu under Ethereum > LSD Pools or Ethereum > DVT."}),"\n",(0,s.jsx)(n.h2,{id:"what-is-staking",children:"What is Staking?"}),"\n",(0,s.jsx)(n.p,{children:"Staking is the act of allocating a portion of your cryptocurrency holdings as collateral to participate in:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Validating Blocks:"})," Confirming transaction records and adding them to the blockchain."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Securing the Chain:"})," Ensuring the network remains resistant to malicious intentions."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Earning Rewards:"})," As a validator, you get paid for your services in the form of more cryptocurrency."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"why-stake-with-dappnode",children:"Why Stake with Dappnode?"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Simplicity is our mantra!"})," We've streamlined the staking process, so all you need to do is:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Select your desired blockchain."}),"\n",(0,s.jsx)(n.li,{children:"Dive into our comprehensive documentation for step-by-step guidance."}),"\n",(0,s.jsx)(n.li,{children:"Begin your staking journey."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Happy Staking!"})})]})}function l(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},9276:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/stakersnumbers-56800861e56cfac985a15737928b2cc7.png"},28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>o});var i=t(96540);const s={},a=i.createContext(s);function r(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/065f9932.27a33a88.js b/assets/js/065f9932.27a33a88.js
new file mode 100644
index 000000000..d34ef885d
--- /dev/null
+++ b/assets/js/065f9932.27a33a88.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1937],{3965:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>h,frontMatter:()=>c,metadata:()=>a,toc:()=>t});const a=JSON.parse('{"id":"dev/dns","title":"\ud83c\udf10 DNS","description":"By default, every DAppNode package runs on Docker networks that provide DNS-based service discovery. The main network is dncorenetwork, which uses a public IP range, and starting from core version 0.3.2, there is also a dnprivatenetwork with the private IP range 10.20.0.0/24. Both networks allow packages to communicate and resolve service names, but dnprivate_network adds a security layer by restricting access to a private IP range, making it ideal for accessing sensitive UIs and services.","source":"@site/docs/dev/dns.md","sourceDirName":"dev","slug":"/dev/dns","permalink":"/docs/dev/dns","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/dns.md","tags":[],"version":"current","frontMatter":{"title":"\ud83c\udf10 DNS","llm_description":"DNS-based service discovery and domain naming conventions for DAppNode packages."},"sidebar":"devSidebar","previous":{"title":"Package Notifications","permalink":"/docs/dev/notifications"},"next":{"title":"Overview","permalink":"/docs/dev/github-actions/overview"}}');var s=i(74848),d=i(28453);const c={title:"\ud83c\udf10 DNS",llm_description:"DNS-based service discovery and domain naming conventions for DAppNode packages."},r="\ud83c\udf10 DNS",o={},t=[{value:"Multiservice packages",id:"multiservice-packages",level:2},{value:"Monoservice packages",id:"monoservice-packages",level:2},{value:"Staker packages - fullnode",id:"staker-packages---fullnode",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,d.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"-dns",children:"\ud83c\udf10 DNS"})}),"\n",(0,s.jsxs)(n.p,{children:["By default, every DAppNode package runs on Docker networks that provide DNS-based service discovery. The main network is ",(0,s.jsx)(n.code,{children:"dncore_network"}),", which uses a public IP range, and starting from core version 0.3.2, there is also a ",(0,s.jsx)(n.code,{children:"dnprivate_network"})," with the private IP range ",(0,s.jsx)(n.code,{children:"10.20.0.0/24"}),". Both networks allow packages to communicate and resolve service names, but ",(0,s.jsx)(n.code,{children:"dnprivate_network"})," adds a security layer by restricting access to a private IP range, making it ideal for accessing sensitive UIs and services."]}),"\n",(0,s.jsxs)(n.p,{children:["During installation, each package is assigned a unique domain name (apart from the ones set by default by Docker: container name, service name, etc.) that can be used to access the services running inside the package. The aliasing convention is the same for both networks, with one key difference: domains in ",(0,s.jsx)(n.code,{children:"dncore_network"})," end with ",(0,s.jsx)(n.code,{children:".dappnode"}),", while in ",(0,s.jsx)(n.code,{children:"dnprivate_network"})," they end with ",(0,s.jsx)(n.code,{children:".dappnode.private"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"This document provides a comprehensive guide on how to access services running inside a package using the assigned domain names in both networks."}),"\n",(0,s.jsx)(n.h2,{id:"multiservice-packages",children:"Multiservice packages"}),"\n",(0,s.jsxs)(n.p,{children:["In multiservice packages, the naming convention is: ",(0,s.jsx)(n.code,{children:"..dappnode"})," (for ",(0,s.jsx)(n.code,{children:"dncore_network"}),") or ",(0,s.jsx)(n.code,{children:"..dappnode.private"})," (for ",(0,s.jsx)(n.code,{children:"dnprivate_network"}),"), where ",(0,s.jsx)(n.code,{children:"serviceName"})," is the name of the service running inside the package and ",(0,s.jsx)(n.code,{children:"shortDnpName"})," is the name of the package. For example, if you have a package named ",(0,s.jsx)(n.code,{children:"my-package"})," running a service named ",(0,s.jsx)(n.code,{children:"my-service"}),", the domain names to access the service would be:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["On ",(0,s.jsx)(n.code,{children:"dncore_network"}),": ",(0,s.jsx)(n.code,{children:"my-service.my-package.dappnode"})]}),"\n",(0,s.jsxs)(n.li,{children:["On ",(0,s.jsx)(n.code,{children:"dnprivate_network"}),": ",(0,s.jsx)(n.code,{children:"my-service.my-package.dappnode.private"})]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["The short DNP name is derived from the first part of the DNP name, which corresponds to the package name. For example, if the DNP name is ",(0,s.jsx)(n.code,{children:"my-package.dnp.dappnode.eth"}),", the short DNP name would be ",(0,s.jsx)(n.code,{children:"my-package"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Example multiservice:"})," ",(0,s.jsx)(n.a,{href:"https://github.com/dappnode/DAppNodePackage-prysm-generic",children:"Prysm"})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["DNP name: ",(0,s.jsx)(n.code,{children:"prysm.dnp.dappnode.eth"})]}),"\n",(0,s.jsx)(n.li,{children:"Docker Compose"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'version: "3.5"\nservices:\n beacon-chain:\n build:\n context: beacon-chain\n args:\n volumes:\n - beacon-chain-data:/data\n restart: unless-stopped\n environment:\n validator:\n build:\n context: validator\n args:\n restart: on-failure\n environment:\nvolumes:\n beacon-chain-data: {}\n validator-data: {}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Aliases will be:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["beacon-chain service: ",(0,s.jsx)(n.code,{children:"beacon-chain.prysm.dnp.dappnode"})," (public) and ",(0,s.jsx)(n.code,{children:"beacon-chain.prysm.dnp.dappnode.private"})," (private)"]}),"\n",(0,s.jsxs)(n.li,{children:["validator service: ",(0,s.jsx)(n.code,{children:"validator.prysm.dnp.dappnode"})," (public) and ",(0,s.jsx)(n.code,{children:"validator.prysm.dnp.dappnode.private"})," (private)"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["A main service can be defined in a multiservice package. This service will be the one used to access the package. For example, if you have a package named ",(0,s.jsx)(n.code,{children:"my-package"})," running a service named ",(0,s.jsx)(n.code,{children:"my-service"})," and you want to access the package using the domain name ",(0,s.jsx)(n.code,{children:"my-package.dappnode"})," or ",(0,s.jsx)(n.code,{children:"my-package.dappnode.private"}),", you can define the service ",(0,s.jsx)(n.code,{children:"my-service"})," as the main service. See ",(0,s.jsx)(n.a,{href:"https://docs.dappnode.io/docs/dev/references/manifest#mainservice",children:"manifest file reference - mainService"})," for details on how to define the main service."]})}),"\n",(0,s.jsx)(n.h2,{id:"monoservice-packages",children:"Monoservice packages"}),"\n",(0,s.jsxs)(n.p,{children:["In monoservice packages, the domain name is the same as the package name. For example, if you have a package named ",(0,s.jsx)(n.code,{children:"my-package"}),", the domain names to access the service would be:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["On ",(0,s.jsx)(n.code,{children:"dncore_network"}),": ",(0,s.jsx)(n.code,{children:"my-package.dappnode"})]}),"\n",(0,s.jsxs)(n.li,{children:["On ",(0,s.jsx)(n.code,{children:"dnprivate_network"}),": ",(0,s.jsx)(n.code,{children:"my-package.dappnode.private"})]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["It also follows the same convention as the multiservice packages. For example, if you have a package named ",(0,s.jsx)(n.code,{children:"my-package"})," running only one service named ",(0,s.jsx)(n.code,{children:"my-service"}),", the domain names to access the service would be:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["On ",(0,s.jsx)(n.code,{children:"dncore_network"}),": ",(0,s.jsx)(n.code,{children:"my-service.my-package.dappnode"})," or ",(0,s.jsx)(n.code,{children:"my-package.dappnode"})]}),"\n",(0,s.jsxs)(n.li,{children:["On ",(0,s.jsx)(n.code,{children:"dnprivate_network"}),": ",(0,s.jsx)(n.code,{children:"my-service.my-package.dappnode.private"})," or ",(0,s.jsx)(n.code,{children:"my-package.dappnode.private"})]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Example monoservice:"})," ",(0,s.jsx)(n.a,{href:"https://github.com/dappnode/DAppNodePackage-geth-generic",children:"Geth"})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["DNP name: ",(0,s.jsx)(n.code,{children:"geth.dnp.dappnode.eth"})]}),"\n",(0,s.jsx)(n.li,{children:"Docker Compose"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'version: "3.5"\nservices:\n geth:\n build:\n context: geth\n args:\n environment:\n restart: unless-stopped\n'})}),"\n",(0,s.jsx)(n.p,{children:"Alias will be:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["geth service: ",(0,s.jsx)(n.code,{children:"geth.dnp.dappnode"}),", ",(0,s.jsx)(n.code,{children:"geth.dnp.dappnode.eth"}),", ",(0,s.jsx)(n.code,{children:"geth.dnp.dappnode.private"}),", and ",(0,s.jsx)(n.code,{children:"geth.dnp.dappnode.eth.private"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"staker-packages---fullnode",children:"Staker packages - fullnode"}),"\n",(0,s.jsx)(n.p,{children:"Staker packages are a special case in DAppNode. They follow the same DNS conventions mentioned above, with some additional features:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"EVMs dedicated Docker networks"}),": Each EVM network supported in DAppNode has a dedicated Docker network that is used by the staker packages to communicate with each other. The Docker network name follows the convention ",(0,s.jsx)(n.code,{children:"_network"}),", e.g., ",(0,s.jsx)(n.code,{children:"hoodi_network"})," for the Hoodi network or ",(0,s.jsx)(n.code,{children:"mainnet_network"})," for the Mainnet network."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Fullnode aliases"}),": The selected Execution and Consensus client has an extra domain name to indicate that it is the client selected by the user. This domain name can be used by other packages to query the RPC node, the validator API, the beacon chain API, etc. (in some cases, it might require authentication). The naming convention is:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Execution: ",(0,s.jsx)(n.code,{children:"execution..dncore.dappnode"})," (public) and ",(0,s.jsx)(n.code,{children:"execution..dncore.dappnode.private"})," (private)"]}),"\n",(0,s.jsxs)(n.li,{children:["Consensus:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Beacon-chain: ",(0,s.jsx)(n.code,{children:"beacon-chain..dncore.dappnode"})," (public) and ",(0,s.jsx)(n.code,{children:"beacon-chain..dncore.dappnode.private"})," (private)"]}),"\n",(0,s.jsxs)(n.li,{children:["Validator: ",(0,s.jsx)(n.code,{children:"validator..dncore.dappnode"})," (public) and ",(0,s.jsx)(n.code,{children:"validator..dncore.dappnode.private"})," (private)"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["The fullnode alias is added to both Docker networks, ",(0,s.jsx)(n.code,{children:"dncore_network"})," and ",(0,s.jsx)(n.code,{children:"_network"}),", as well as to ",(0,s.jsx)(n.code,{children:"dnprivate_network"}),", so it can be accessed from any package running in the DAppNode, using either the public or private domain."]})})]})}function h(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>c,x:()=>r});var a=i(96540);const s={},d=a.createContext(s);function c(e){const n=a.useContext(d);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),a.createElement(d.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/090ba480.71e01473.js b/assets/js/090ba480.71e01473.js
new file mode 100644
index 000000000..afaea074c
--- /dev/null
+++ b/assets/js/090ba480.71e01473.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8027],{48790:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>a,contentTitle:()=>r,default:()=>l,frontMatter:()=>d,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"smooth/deep-dive-into-smooth/overview","title":"Deep Dive into Smooth!","description":"In this section, you will find an in-depth explanation on how Smooth works. This includes its different components, all states possible of a subscribed validator, and much more!","source":"@site/docs/smooth/deep-dive-into-smooth/overview.md","sourceDirName":"smooth/deep-dive-into-smooth","slug":"/smooth/deep-dive-into-smooth/overview","permalink":"/docs/smooth/deep-dive-into-smooth/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/smooth/deep-dive-into-smooth/overview.md","tags":[],"version":"current","frontMatter":{"title":"Deep Dive into Smooth!","llm_description":"Index page linking to deep-dive sections on rewards, validator states, and architecture."},"sidebar":"smoothSidebar","previous":{"title":"Smooth","permalink":"/docs/smooth"},"next":{"title":"Rewards","permalink":"/docs/smooth/deep-dive-into-smooth/rewards"}}');var s=t(74848),i=t(28453);const d={title:"Deep Dive into Smooth!",llm_description:"Index page linking to deep-dive sections on rewards, validator states, and architecture."},r="Deep Dive into Smooth!",a={},h=[];function c(e){const o={a:"a",admonition:"admonition",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.header,{children:(0,s.jsx)(o.h1,{id:"deep-dive-into-smooth",children:"Deep Dive into Smooth!"})}),"\n",(0,s.jsxs)(o.p,{children:["In this section, you will find an in-depth explanation on how ",(0,s.jsx)(o.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," works. This includes its different components, all states possible of a subscribed validator, and much more!"]}),"\n",(0,s.jsx)(o.admonition,{type:"info",children:(0,s.jsxs)(o.p,{children:["We recommend reading and understanding the contents of this section before subscribing to ",(0,s.jsx)(o.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),"."]})}),"\n",(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.a,{href:"/docs/smooth/deep-dive-into-smooth/rewards",children:(0,s.jsx)(o.strong,{children:"Smooth's Rewards"})}),": Learn how ",(0,s.jsx)(o.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," handles incoming rewards and how they are distributed to validators."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.a,{href:"/docs/smooth/deep-dive-into-smooth/states",children:(0,s.jsx)(o.strong,{children:"Validator States"})}),": A detailed explanation of all possible states of a subscribed ",(0,s.jsx)(o.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," validator."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.a,{href:"/docs/smooth/deep-dive-into-smooth/oracle-sm",children:(0,s.jsx)(o.strong,{children:"Smooth's Oracle and Smart Contract"})}),": Learn how the two main components of ",(0,s.jsx)(o.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),", the Oracle and smart contract work together to track validators and distribute rewards."]}),"\n"]}),"\n"]})]})}function l(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453:(e,o,t)=>{t.d(o,{R:()=>d,x:()=>r});var n=t(96540);const s={},i=n.createContext(s);function d(e){const o=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function r(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0af727f1.00991d37.js b/assets/js/0af727f1.00991d37.js
new file mode 100644
index 000000000..cc8a1cdcb
--- /dev/null
+++ b/assets/js/0af727f1.00991d37.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[181],{29996:(e,s,o)=>{o.r(s),o.d(s,{assets:()=>i,contentTitle:()=>d,default:()=>h,frontMatter:()=>n,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"smooth/faq-glossary","title":"FAQ & Glossary","description":"FAQ","source":"@site/docs/smooth/faq-glossary.md","sourceDirName":"smooth","slug":"/smooth/faq-glossary","permalink":"/docs/smooth/faq-glossary","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/smooth/faq-glossary.md","tags":[],"version":"current","frontMatter":{"title":"FAQ & Glossary","llm_description":"FAQ about fees, claiming rewards, and glossary of terms like pending/accumulated rewards."},"sidebar":"smoothSidebar","previous":{"title":"Unsubscribe from Smooth","permalink":"/docs/smooth/unsubscribe-from-smooth"}}');var r=o(74848),a=o(28453);const n={title:"FAQ & Glossary",llm_description:"FAQ about fees, claiming rewards, and glossary of terms like pending/accumulated rewards."},d="FAQ & Glossary",i={},l=[{value:"FAQ",id:"faq",level:2},{value:"Glossary",id:"glossary",level:2}];function c(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,a.R)(),...e.components},{Details:o}=s;return o||function(e,s){throw new Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"faq--glossary",children:"FAQ & Glossary"})}),"\n",(0,r.jsx)(s.h2,{id:"faq",children:"FAQ"}),"\n",(0,r.jsxs)(o,{children:[(0,r.jsx)("summary",{children:(0,r.jsx)("b",{children:"What do I need to do to claim my rewards?"})}),(0,r.jsx)(s.p,{children:"Once your pending rewards are transformed into accumulated rewards after your block proposal, a small claim transaction will be required from the withdrawal address to send the ETH rewards to your wallet."})]}),"\n",(0,r.jsxs)(o,{children:[(0,r.jsx)("summary",{children:(0,r.jsxs)("b",{children:["Is there a fee that Dappnode takes for participating in ",(0,r.jsx)("a",{href:"https://smooth.dappnode.io/",children:"Smooth"}),"?"]})}),(0,r.jsxs)(s.p,{children:["7% of all the Rewards goes to supporting the development of Dappnode and sustainability of ",(0,r.jsx)("a",{href:"https://smooth.dappnode.io/",children:"Smooth"})]})]}),"\n",(0,r.jsxs)(o,{children:[(0,r.jsx)("summary",{children:(0,r.jsxs)("b",{children:["If I want to unsubscribe my validator from ",(0,r.jsx)("a",{href:"https://smooth.dappnode.io/",children:"Smooth"}),", when is the best time to do it?"]})}),(0,r.jsxs)(s.p,{children:["Unsubscribing a validator from ",(0,r.jsx)("a",{href:"https://smooth.dappnode.io/",children:"Smooth"})," causes it to lose all its pending rewards. Hence, the ideal moment to exit ",(0,r.jsx)("a",{href:"https://smooth.dappnode.io/",children:"Smooth"})," is just after your last successful block proposal is reflected in Smooth's Smart Contract. A successful block proposal transfers all pending rewards claimable, allowing you to claim them before unsubscribing. This approach minimizes the pending rewards lost when unsubscribing."]})]}),"\n",(0,r.jsxs)(o,{children:[(0,r.jsx)("summary",{children:(0,r.jsxs)("b",{children:["Does ",(0,r.jsx)("a",{href:"https://smooth.dappnode.io/",children:"Smooth"})," take my Consensus Layer (CL) rewards?"]})}),(0,r.jsxs)(s.p,{children:["No, ",(0,r.jsx)("a",{href:"https://smooth.dappnode.io/",children:"Smooth"})," does not take your CL rewards. CL rewards are always sent directly to your withdrawal address. ",(0,r.jsx)("a",{href:"https://smooth.dappnode.io/",children:"Smooth"})," only takes the execution layer rewards, which are the fees or MEV of the blocks you propose. These are the rewards that are sent to the fee recipient."]})]}),"\n",(0,r.jsx)(s.h2,{id:"glossary",children:"Glossary"}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"Reward"}),": Any balance denominated in ETH that is sent to ",(0,r.jsx)(s.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),". Rewards are detected by the oracle and shared fairly among all the participants in the pool. The oracle will detect all types of rewards and distribute them fairly. All rewards are denominated in ",(0,r.jsx)(s.code,{children:"ETH"})," and other types of tokens such as ERC20 are not considered by the oracle. The vast majority of rewards come from block proposals of Smooth's validators and Donations."]}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"Pending rewards"}),": Pending rewards are those to be owned by the validator but not yet consolidated, rendering them unclaimable. Upon a successful block proposal by the validator, these rewards transition into the 'Accumulated rewards' category, becoming claimable. This mechanism ensures that validators can only claim rewards after contributing to the pool, guarding against cheating or exploiting the system."]}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"Accumulated rewards"}),": All consolidated rewards your validator has generated, i.e. those claimed and claimable."]}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"Claimable rewards"}),": Rewards ready to claim. Claimable rewards are the sum of all your accumulated rewards minus the rewards that have been claimed already. Only the withdrawal address of the validator can claim its rewards."]})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},28453:(e,s,o)=>{o.d(s,{R:()=>n,x:()=>d});var t=o(96540);const r={},a=t.createContext(r);function n(e){const s=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:n(e.components),t.createElement(a.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0f7f07eb.78516fab.js b/assets/js/0f7f07eb.78516fab.js
new file mode 100644
index 000000000..489a67a9e
--- /dev/null
+++ b/assets/js/0f7f07eb.78516fab.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9372],{13342:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>p,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"user/access-your-dappnode/terminal","title":"Terminal Access to Dappnode","description":"Accessing the terminal of your Dappnode, often referred to as the command-line interface (CLI), provides deep control and management capabilities. However, this method is considered advanced and requires familiarity with command line interactions. Incorrect or misguided commands can lead to unintended changes or potential system damage.","source":"@site/docs/user/access-your-dappnode/terminal.md","sourceDirName":"user/access-your-dappnode","slug":"/user/access-your-dappnode/terminal","permalink":"/docs/user/access-your-dappnode/terminal","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/access-your-dappnode/terminal.md","tags":[],"version":"current","frontMatter":{"title":"Terminal Access to Dappnode","llm_description":"Advanced CLI access via SSH or physical terminal for deep control and management."},"sidebar":"userSidebar","previous":{"title":"OpenVPN","permalink":"/docs/user/access-your-dappnode/vpn/openvpn"},"next":{"title":"Local Proxy (Recovery)","permalink":"/docs/user/access-your-dappnode/local"}}');var o=s(74848),a=s(28453);const i={title:"Terminal Access to Dappnode",llm_description:"Advanced CLI access via SSH or physical terminal for deep control and management."},t="Terminal Access to Dappnode",c={},d=[{value:"SSH Access",id:"ssh-access",level:2},{value:"External SSH Access",id:"external-ssh-access",level:3},{value:"Physical Terminal Access",id:"physical-terminal-access",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"terminal-access-to-dappnode",children:"Terminal Access to Dappnode"})}),"\n",(0,o.jsx)(n.p,{children:"Accessing the terminal of your Dappnode, often referred to as the command-line interface (CLI), provides deep control and management capabilities. However, this method is considered advanced and requires familiarity with command line interactions. Incorrect or misguided commands can lead to unintended changes or potential system damage."}),"\n",(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsx)(n.p,{children:"Proceed with caution when using terminal access. Always understand the implications of commands and configurations before executing them."})}),"\n",(0,o.jsx)(n.h2,{id:"ssh-access",children:"SSH Access"}),"\n",(0,o.jsx)(n.p,{children:"SSH (Secure Shell) allows secure remote access to systems."}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Ensure your device is connected to the same network as the Dappnode."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Open a terminal or command prompt on your device."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Type:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"ssh dappnode@\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Replace ",(0,o.jsx)(n.code,{children:""})," with your Dappnode's actual IP address."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"When prompted, use the following credentials:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Username:"})," dappnode"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Password:"})," dappnode.s0"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsxs)(n.p,{children:['During the onboarding process in Dappmanager, you are prompted to change the default host password for the "dappnode" user. If you have completed this step, the default password ',(0,o.jsx)(n.code,{children:"dappnode.s0"})," might no longer work. Always use the password you set during onboarding."]})}),"\n",(0,o.jsx)(n.h3,{id:"external-ssh-access",children:"External SSH Access"}),"\n",(0,o.jsx)(n.p,{children:"For accessing Dappnode from outside your local network:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Configure port forwarding on your router. Direct external SSH requests (typically port 22) to your Dappnode's internal IP address."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"For added security, use a strong password or implement SSH keys."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"To SSH, use:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"ssh dappnode@\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsx)(n.p,{children:"Exposing SSH to the internet can be risky. Ensure you adopt robust security practices and are aware of potential vulnerabilities."})}),"\n",(0,o.jsx)(n.h2,{id:"physical-terminal-access",children:"Physical Terminal Access"}),"\n",(0,o.jsx)(n.p,{children:"Directly interface with Dappnode using a monitor and keyboard:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Connect a monitor via the HDMI/VGA port."}),"\n",(0,o.jsx)(n.li,{children:"Plug in a USB keyboard."}),"\n",(0,o.jsx)(n.li,{children:"Power on or restart the Dappnode machine."}),"\n",(0,o.jsxs)(n.li,{children:["When prompted, enter the password: ",(0,o.jsx)(n.code,{children:"dappnode.s0"})," (or ",(0,o.jsx)(n.a,{href:"/docs/user/getting-started/setup",children:"the one you've set if changed during onboarding"}),")."]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>t});var r=s(96540);const o={},a=r.createContext(o);function i(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/10626e9c.05700175.js b/assets/js/10626e9c.05700175.js
new file mode 100644
index 000000000..7aa68b418
--- /dev/null
+++ b/assets/js/10626e9c.05700175.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8083],{14408:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>a,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"dev/github-actions/staker-packages/overview","title":"Staker Packages CI Overview","description":"Staker packages require more complex CI than standard packages because they need integration testing on real Dappnode hardware. This ensures that execution clients, consensus clients, web3signer, and MEV-boost work correctly together in a real staking environment.","source":"@site/docs/dev/github-actions/staker-packages/overview.md","sourceDirName":"dev/github-actions/staker-packages","slug":"/dev/github-actions/staker-packages/overview","permalink":"/docs/dev/github-actions/staker-packages/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/github-actions/staker-packages/overview.md","tags":[],"version":"current","frontMatter":{"title":"Staker Packages CI Overview","sidebar_label":"Overview","llm_description":"Overview of CI/CD workflows for Dappnode staker packages including execution clients, consensus clients, and web3signer."},"sidebar":"devSidebar","previous":{"title":"Standard Packages","permalink":"/docs/dev/github-actions/standard-packages"},"next":{"title":"Execution Clients","permalink":"/docs/dev/github-actions/staker-packages/execution-clients"}}');var i=s(74848),r=s(28453);const a={title:"Staker Packages CI Overview",sidebar_label:"Overview",llm_description:"Overview of CI/CD workflows for Dappnode staker packages including execution clients, consensus clients, and web3signer."},c="Staker Packages CI Overview",l={},o=[{value:"Architecture",id:"architecture",level:2},{value:"Fresh Dappnode Instance",id:"fresh-dappnode-instance",level:3},{value:"API-Driven Testing",id:"api-driven-testing",level:3},{value:"Pre-Synced Volumes",id:"pre-synced-volumes",level:3},{value:"Test Types",id:"test-types",level:2},{value:"Sync Test",id:"sync-test",level:3},{value:"Proof of Attestation Test",id:"proof-of-attestation-test",level:3},{value:"Package-Specific Workflows",id:"package-specific-workflows",level:2},{value:"Manual Triggering",id:"manual-triggering",level:2},{value:"Self-Hosted Runners",id:"self-hosted-runners",level:2},{value:"Test Report Example",id:"test-report-example",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"staker-packages-ci-overview",children:"Staker Packages CI Overview"})}),"\n",(0,i.jsx)(n.p,{children:"Staker packages require more complex CI than standard packages because they need integration testing on real Dappnode hardware. This ensures that execution clients, consensus clients, web3signer, and MEV-boost work correctly together in a real staking environment."}),"\n",(0,i.jsx)(n.h2,{id:"architecture",children:"Architecture"}),"\n",(0,i.jsxs)(n.p,{children:["The staker package CI runs on a ",(0,i.jsx)(n.strong,{children:"GitHub self-hosted runner"})," with the following characteristics:"]}),"\n",(0,i.jsx)(n.h3,{id:"fresh-dappnode-instance",children:"Fresh Dappnode Instance"}),"\n",(0,i.jsxs)(n.p,{children:["Each test runs on a ",(0,i.jsx)(n.strong,{children:"fresh Dappnode instance"})," that is always kept up to date with the ",(0,i.jsx)(n.strong,{children:"latest versions of all core packages"}),". When a test starts, ",(0,i.jsx)(n.strong,{children:"no staker packages are installed"})," - the environment is completely clean, ensuring consistent and reproducible test results."]}),"\n",(0,i.jsx)(n.h3,{id:"api-driven-testing",children:"API-Driven Testing"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["The Dappmanager runs with ",(0,i.jsx)(n.code,{children:"DEV=true"}),", which ",(0,i.jsx)(n.strong,{children:"enables the WebSocket frontend-backend RPC as an API"})]}),"\n",(0,i.jsxs)(n.li,{children:["The CI uses the ",(0,i.jsx)(n.strong,{children:"same RPC calls a user would make"})," through the UI to configure their staker setup (installing execution clients, consensus clients, web3signer, etc.)"]}),"\n",(0,i.jsx)(n.li,{children:"This ensures tests are as close to real user interactions as possible"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"pre-synced-volumes",children:"Pre-Synced Volumes"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Pre-synced execution client databases"})," are stored in their respective volumes on the runner, enabling fast sync without waiting hours for a full sync from scratch"]}),"\n",(0,i.jsxs)(n.li,{children:["Consensus clients use ",(0,i.jsx)(n.strong,{children:"checkpoint sync"}),", so no pre-synced volume is required"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"test-types",children:"Test Types"}),"\n",(0,i.jsx)(n.h3,{id:"sync-test",children:"Sync Test"}),"\n",(0,i.jsx)(n.p,{children:"Verifies that both execution and consensus clients reach a synced state. This test ensures:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The staker configuration is valid"}),"\n",(0,i.jsx)(n.li,{children:"Clients can synchronize with the network"}),"\n",(0,i.jsx)(n.li,{children:"The package builds correctly and can be installed"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"A report is posted to the PR with test details including:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Clients used and their versions"}),"\n",(0,i.jsx)(n.li,{children:"Timing measurements"}),"\n",(0,i.jsx)(n.li,{children:"Container error logs (if any)"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"proof-of-attestation-test",children:"Proof of Attestation Test"}),"\n",(0,i.jsx)(n.p,{children:"This is the most comprehensive test, executed during releases:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Sync phase"}),": Same as the sync test - ensures clients are synchronized"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Attestation phase"}),": Imports validators into web3signer and waits for them to become live on the beacon chain"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["A successful attestation proves the ",(0,i.jsx)(n.strong,{children:"full staker stack is operational end-to-end"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"package-specific-workflows",children:"Package-Specific Workflows"}),"\n",(0,i.jsx)(n.p,{children:"Different staker packages have different workflow requirements:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Package Type"}),(0,i.jsx)(n.th,{children:"auto_check.yml"}),(0,i.jsx)(n.th,{children:"sync.yml"}),(0,i.jsx)(n.th,{children:"sync-test.yml"}),(0,i.jsx)(n.th,{children:"release.yml"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Execution Clients"}),(0,i.jsx)(n.td,{children:"\u2705"}),(0,i.jsx)(n.td,{children:"\u2705"}),(0,i.jsx)(n.td,{children:"\u2705"}),(0,i.jsx)(n.td,{children:"\u2705"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Consensus Clients"}),(0,i.jsx)(n.td,{children:"\u2705"}),(0,i.jsx)(n.td,{children:"\u274c"}),(0,i.jsx)(n.td,{children:"\u2705"}),(0,i.jsx)(n.td,{children:"\u2705"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Web3Signer"}),(0,i.jsx)(n.td,{children:"\ud83d\udd04 TBD"}),(0,i.jsx)(n.td,{children:"\ud83d\udd04 TBD"}),(0,i.jsx)(n.td,{children:"\ud83d\udd04 TBD"}),(0,i.jsx)(n.td,{children:"\ud83d\udd04 TBD"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"See the specific workflow documentation:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/dev/github-actions/staker-packages/execution-clients",children:"Execution Client Workflows"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/dev/github-actions/staker-packages/consensus-clients",children:"Consensus Client Workflows"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/dev/github-actions/staker-packages/web3signer",children:"Web3Signer Workflows"})}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"manual-triggering",children:"Manual Triggering"}),"\n",(0,i.jsxs)(n.p,{children:["All staker package workflows can be ",(0,i.jsx)(n.strong,{children:"triggered manually"})," via ",(0,i.jsx)(n.code,{children:"workflow_dispatch"}),", allowing you to:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Test any client combination (execution + consensus)"}),"\n",(0,i.jsx)(n.li,{children:"Debug issues with specific client pairings"}),"\n",(0,i.jsx)(n.li,{children:"Run tests outside of the normal CI triggers"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"When triggering manually, you can select the consensus client to pair with the execution client (or vice versa)."}),"\n",(0,i.jsx)(n.h2,{id:"self-hosted-runners",children:"Self-Hosted Runners"}),"\n",(0,i.jsx)(n.p,{children:"The staker tests run on specific self-hosted runners:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"staking-test-hoodi"})}),": Main runner for sync and attestation tests on Hoodi testnet"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"ipfs-dev-gateway"})}),": Used for the final release step to publish packages"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"test-report-example",children:"Test Report Example"}),"\n",(0,i.jsx)(n.p,{children:"When a sync test completes, a report like this is posted to the PR:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-markdown",children:"## \u2705 SYNC TEST REPORT - PASSED\n\n### \ud83d\udce6 Clients Used\n\n| Component | DNP Name | DNP Version |\n| --------- | ----------------------------- | ----------- |\n| Execution | `hoodi-reth.dnp.dappnode.eth` | `0.1.4` |\n| Consensus | `teku-hoodi.dnp.dappnode.eth` | `0.1.3` |\n\n### \u23f1\ufe0f Timing Measurements\n\n| Operation | Duration | Status |\n| ---------------------- | -------- | ------ |\n| WaitForBeaconchainSync | 3ms | \u2705 |\n| WaitForExecutionSync | 24.015s | \u2705 |\n"})}),"\n",(0,i.jsx)(n.p,{children:"The report includes version tracking (before/after install), timing measurements, and any container error logs for debugging."})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>c});var t=s(96540);const i={},r=t.createContext(i);function a(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/138e0e15.0e802d60.js b/assets/js/138e0e15.0e802d60.js
new file mode 100644
index 000000000..6cd53cfd1
--- /dev/null
+++ b/assets/js/138e0e15.0e802d60.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4921],{41597:s=>{s.exports=JSON.parse('{"name":"@easyops-cn/docusaurus-search-local","id":"default"}')}}]);
\ No newline at end of file
diff --git a/assets/js/14c20d3a.e6e6d33b.js b/assets/js/14c20d3a.e6e6d33b.js
new file mode 100644
index 000000000..7b69ffb52
--- /dev/null
+++ b/assets/js/14c20d3a.e6e6d33b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5635],{59688:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>c,frontMatter:()=>i,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"user/staking/ethereum/solo/holesky","title":"Holesky Testnet","description":"The Holesky testnet is a testnet for the Ethereum ecosystem, serving as a sandbox for users and developers alike.","source":"@site/docs/user/staking/ethereum/solo/holesky.md","sourceDirName":"user/staking/ethereum/solo","slug":"/user/staking/ethereum/solo/holesky","permalink":"/docs/user/staking/ethereum/solo/holesky","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/ethereum/solo/holesky.md","tags":[],"version":"current","frontMatter":{"title":"Holesky Testnet","llm_description":"Run validators on Holesky testnet for risk-free Ethereum staking practice."},"sidebar":"userSidebar","previous":{"title":"Mainnet","permalink":"/docs/user/staking/ethereum/solo/mainnet"},"next":{"title":"Overview","permalink":"/docs/user/staking/ethereum/lsd-pools/lido/overview"}}');var o=s(74848),r=s(28453);const i={title:"Holesky Testnet",llm_description:"Run validators on Holesky testnet for risk-free Ethereum staking practice."},a="Holesky Testnet",l={},d=[{value:"Navigating to Holesky in Dappnode",id:"navigating-to-holesky-in-dappnode",level:2},{value:"Why Run a Holesky Testnet Node?",id:"why-run-a-holesky-testnet-node",level:2},{value:"Holesky Faucet",id:"holesky-faucet",level:2}];function h(e){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"holesky-testnet",children:"Holesky Testnet"})}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.strong,{children:"Holesky testnet"})," is a testnet for the Ethereum ecosystem, serving as a sandbox for users and developers alike."]}),"\n",(0,o.jsx)(t.p,{children:"Dappnode paves an easy pathway for enthusiasts to operate a node on the Holesky testnet, ensuring practical experience without the risks associated with the mainnet."}),"\n",(0,o.jsx)(t.h2,{id:"navigating-to-holesky-in-dappnode",children:"Navigating to Holesky in Dappnode"}),"\n",(0,o.jsxs)(t.p,{children:["You can locate the Holesky testnet under the ",(0,o.jsxs)(t.a,{href:"http://my.dappnode/stakers/holesky",children:[(0,o.jsx)(t.strong,{children:"Holesky"})," tab"]})," in the ",(0,o.jsx)(t.strong,{children:"Stakers Menu"}),". If you want to run Holesky testnet validators, you'll also need to select Web3Signer Holesky."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Holesky - Stakers Menu",src:s(54910).A+"",width:"2554",height:"1302"})}),"\n",(0,o.jsx)(t.h2,{id:"why-run-a-holesky-testnet-node",children:"Why Run a Holesky Testnet Node?"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Hands-on Experience"}),": Running a validator on the Holesky testnet offers invaluable practical knowledge. It mimics the mainnet processes, providing a comprehensive understanding of node operation."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Risk-free Exploration"}),": As it's a testnet, you're not staking real ETH. This provides an opportunity for experimentation without the financial stakes of the main Ethereum network."]}),"\n"]}),"\n",(0,o.jsx)(t.admonition,{type:"tip",children:(0,o.jsx)(t.p,{children:"If you're new to Ethereum or wish to familiarize yourself with node operation intricacies, starting with the Holesky testnet is highly recommended. It's the perfect platform for hands-on learning in a risk-free environment."})}),"\n",(0,o.jsx)(t.h2,{id:"holesky-faucet",children:"Holesky Faucet"}),"\n",(0,o.jsxs)(t.p,{children:["If you're interested in getting 32 HolETH for running a test validator, you can get it in the ",(0,o.jsx)(t.a,{href:"https://holesky-faucet.pk910.de/",children:"Holesky PoW Faucet"}),". Make sure you understand how the faucet works before doing your request, as it will temporarily impact your computer's performance in the claiming process."]})]})}function c(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},54910:(e,t,s)=>{s.d(t,{A:()=>n});const n=s.p+"assets/images/holesky-stakers-9a7c0d4739b3ee492f436d006562126e.png"},28453:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>a});var n=s(96540);const o={},r=n.createContext(o);function i(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/17896441.5c7e9141.js b/assets/js/17896441.5c7e9141.js
new file mode 100644
index 000000000..3377061bf
--- /dev/null
+++ b/assets/js/17896441.5c7e9141.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8401],{40665:(e,t,n)=>{n.d(t,{A:()=>c});n(96540);var s=n(18215),a=n(27289),i=n(204),o=n(52362),l=n(74848);function r(e){let{className:t}=e;return(0,l.jsx)(o.A,{type:"caution",title:(0,l.jsx)(a.Rc,{}),className:(0,s.A)(t,i.G.common.unlistedBanner),children:(0,l.jsx)(a.Uh,{})})}function c(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(a.AE,{}),(0,l.jsx)(r,{...e})]})}},52075:(e,t,n)=>{n.d(t,{A:()=>d});n(96540);var s=n(18215),a=n(27289),i=n(204),o=n(52362),l=n(74848);function r(e){let{className:t}=e;return(0,l.jsx)(o.A,{type:"caution",title:(0,l.jsx)(a.Yh,{}),className:(0,s.A)(t,i.G.common.draftBanner),children:(0,l.jsx)(a.TT,{})})}var c=n(40665);function d(e){let{metadata:t}=e;const{unlisted:n,frontMatter:s}=t;return(0,l.jsxs)(l.Fragment,{children:[(n||s.unlisted)&&(0,l.jsx)(c.A,{}),s.draft&&(0,l.jsx)(r,{})]})}},97959:(e,t,n)=>{n.d(t,{A:()=>c});n(96540);var s=n(18215),a=n(71021);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var o=n(74848);const l="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,o.jsx)("div",{className:(0,s.A)(i.tableOfContents,"thin-scrollbar",t),children:(0,o.jsx)(a.A,{...n,linkClassName:l,linkActiveClassName:r})})}},71021:(e,t,n)=>{n.d(t,{A:()=>v});var s=n(96540),a=n(53115);function i(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const s=n.slice(2,e.level);e.parentIndex=Math.max(...s),n[e.level]=t}));const s=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):s.push(a)})),s}function o(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return t.flatMap((e=>{const t=o({toc:e.children,minHeadingLevel:n,maxHeadingLevel:s});return function(e){return e.level>=n&&e.level<=s}(e)?[{...e,children:t}]:t}))}function l(e){const t=e.getBoundingClientRect();return t.top===t.bottom?l(e.parentNode):t}function r(e,t){let{anchorTopOffset:n}=t;const s=e.find((e=>l(e).top>=n));if(s){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,s.useRef)(void 0),n=c();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:i,maxHeadingLevel:o}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),l=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const s=[];for(let a=t;a<=n;a+=1)s.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:i,maxHeadingLevel:o}),c=r(l,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,n])}var u=n(56289),m=n(74848);function h(e){let{toc:t,className:n,linkClassName:s,isChild:a}=e;return t.length?(0,m.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:n,linkClassName:s})]},e.id)))}):null}const b=s.memo(h);function v(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:l="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const v=(0,a.p)(),x=c??v.tableOfContents.minHeadingLevel,f=u??v.tableOfContents.maxHeadingLevel,p=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>o({toc:i(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:x,maxHeadingLevel:f});return d((0,s.useMemo)((()=>{if(l&&r)return{linkClassName:l,linkActiveClassName:r,minHeadingLevel:x,maxHeadingLevel:f}}),[l,r,x,f])),(0,m.jsx)(b,{toc:p,className:n,linkClassName:l,...h})}},27289:(e,t,n)=>{n.d(t,{AE:()=>r,Rc:()=>o,TT:()=>d,Uh:()=>l,Yh:()=>c});n(96540);var s=n(50539),a=n(27143),i=n(74848);function o(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function r(){return(0,i.jsx)(a.A,{children:(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}},79148:(e,t,n)=>{n.r(t),n.d(t,{default:()=>re});var s=n(96540),a=n(81082),i=n(26849),o=n(74848);const l=s.createContext(null);function r(e){let{children:t,content:n}=e;const a=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return(0,o.jsx)(l.Provider,{value:a,children:t})}function c(){const e=(0,s.useContext)(l);if(null===e)throw new i.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:n}=c();return(0,o.jsx)(a.be,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(18215),m=n(86682),h=n(50539),b=n(11865);function v(e){const{previous:t,next:n}=e;return(0,o.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,o.jsx)(b.A,{...t,subLabel:(0,o.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,o.jsx)(b.A,{...n,subLabel:(0,o.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function x(){const{metadata:e}=c();return(0,o.jsx)(v,{previous:e.previous,next:e.next})}var f=n(40797),p=n(56289),g=n(56942),j=n(204),A=n(96351),L=n(21858);const C={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,o.jsx)(h.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,o.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,o.jsx)(h.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,o.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function N(e){const t=C[e.versionMetadata.banner];return(0,o.jsx)(t,{...e})}function _(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,o.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,o.jsx)("b",{children:(0,o.jsx)(p.A,{to:n,onClick:s,children:(0,o.jsx)(h.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function T(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:s}}=(0,f.A)(),{pluginId:a}=(0,g.vT)({failfast:!0}),{savePreferredVersionName:i}=(0,A.g1)(a),{latestDocSuggestion:l,latestVersionSuggestion:r}=(0,g.HW)(a),c=l??(d=r).docs.find((e=>e.id===d.mainDocId));var d;return(0,o.jsxs)("div",{className:(0,u.A)(t,j.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,o.jsx)("div",{children:(0,o.jsx)(N,{siteTitle:s,versionMetadata:n})}),(0,o.jsx)("div",{className:"margin-top--md",children:(0,o.jsx)(_,{versionLabel:r.label,to:c.path,onClick:()=>i(r.name)})})]})}function k(e){let{className:t}=e;const n=(0,L.r)();return n.banner?(0,o.jsx)(T,{className:t,versionMetadata:n}):null}function H(e){let{className:t}=e;const n=(0,L.r)();return n.badge?(0,o.jsx)("span",{className:(0,u.A)(t,j.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,o.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}var y=n(56239),M=n(5783);function w(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,tags:a}=e,i=a.length>0,l=!!(t||n||s);return i||l?(0,o.jsxs)("footer",{className:(0,u.A)(j.G.docs.docFooter,"docusaurus-mt-lg"),children:[i&&(0,o.jsx)("div",{className:(0,u.A)("row margin-top--sm",j.G.docs.docFooterTagsRow),children:(0,o.jsx)("div",{className:"col",children:(0,o.jsx)(y.A,{tags:a})})}),l&&(0,o.jsx)(M.A,{className:(0,u.A)("margin-top--sm",j.G.docs.docFooterEditMetaRow),editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s})]}):null}var E=n(33535),I=n(71021);const B={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function V(e){let{collapsed:t,...n}=e;return(0,o.jsx)("button",{type:"button",...n,className:(0,u.A)("clean-btn",B.tocCollapsibleButton,!t&&B.tocCollapsibleButtonExpanded,n.className),children:(0,o.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const O={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function S(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:i,toggleCollapsed:l}=(0,E.u)({initialState:!0});return(0,o.jsxs)("div",{className:(0,u.A)(O.tocCollapsible,!i&&O.tocCollapsibleExpanded,n),children:[(0,o.jsx)(V,{collapsed:i,onClick:l}),(0,o.jsx)(E.N,{lazy:!0,className:O.tocCollapsibleContent,collapsed:i,children:(0,o.jsx)(I.A,{toc:t,minHeadingLevel:s,maxHeadingLevel:a})})]})}const G={tocMobile:"tocMobile_ITEo"};function P(){const{toc:e,frontMatter:t}=c();return(0,o.jsx)(S,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.A)(j.G.docs.docTocMobile,G.tocMobile)})}var R=n(97959);function U(){const{toc:e,frontMatter:t}=c();return(0,o.jsx)(R.A,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:j.G.docs.docTocDesktop})}var F=n(9303),D=n(900);function z(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return(0,o.jsxs)("div",{className:(0,u.A)(j.G.docs.docMarkdown,"markdown"),children:[n&&(0,o.jsx)("header",{children:(0,o.jsx)(F.A,{as:"h1",children:n})}),(0,o.jsx)(D.A,{children:t})]})}var $=n(93751),q=n(30214),Y=n(29030);function W(e){return(0,o.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,o.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const Z={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function J(){const e=(0,Y.Ay)("/");return(0,o.jsx)("li",{className:"breadcrumbs__item",children:(0,o.jsx)(p.A,{"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,o.jsx)(W,{className:Z.breadcrumbHomeIcon})})})}const K={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function Q(e){let{children:t,href:n,isLast:s}=e;const a="breadcrumbs__link";return s?(0,o.jsx)("span",{className:a,itemProp:"name",children:t}):n?(0,o.jsx)(p.A,{className:a,href:n,itemProp:"item",children:(0,o.jsx)("span",{itemProp:"name",children:t})}):(0,o.jsx)("span",{className:a,children:t})}function X(e){let{children:t,active:n,index:s,addMicrodata:a}=e;return(0,o.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,o.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function ee(){const e=(0,$.OF)(),t=(0,q.Dt)();return e?(0,o.jsx)("nav",{className:(0,u.A)(j.G.docs.docBreadcrumbs,K.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,o.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,o.jsx)(J,{}),e.map(((t,n)=>{const s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,o.jsx)(X,{active:s,index:n,addMicrodata:!!a,children:(0,o.jsx)(Q,{href:a,isLast:s,children:t.label})},n)}))]})}):null}var te=n(52075);const ne={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function se(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.l)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,o.jsx)(P,{}):void 0,desktop:!a||"desktop"!==n&&"ssr"!==n?void 0:(0,o.jsx)(U,{})}}(),{metadata:s}=c();return(0,o.jsxs)("div",{className:"row",children:[(0,o.jsxs)("div",{className:(0,u.A)("col",!n.hidden&&ne.docItemCol),children:[(0,o.jsx)(te.A,{metadata:s}),(0,o.jsx)(k,{}),(0,o.jsxs)("div",{className:ne.docItemContainer,children:[(0,o.jsxs)("article",{children:[(0,o.jsx)(ee,{}),(0,o.jsx)(H,{}),n.mobile,(0,o.jsx)(z,{children:t}),(0,o.jsx)(w,{})]}),(0,o.jsx)(x,{})]})]}),n.desktop&&(0,o.jsx)("div",{className:"col col--3",children:n.desktop})]})}function ae(e){const t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,o.jsx)(r,{content:e.content,children:(0,o.jsxs)(a.e3,{className:t,children:[(0,o.jsx)(d,{}),(0,o.jsx)(se,{children:(0,o.jsx)(n,{})})]})})}var ie=n(56347);const oe={button:"button_ni8S"};function le(){const e=(0,ie.zy)(),t=!1;return(0,s.useEffect)((()=>{const t=document.querySelector("article header h1, article h1");if(!t)return;const n=t.querySelector(`.${oe.button}`);n&&n.remove();const s=document.createElement("a"),a=e.pathname.replace(/\/$/,"");return s.href=`${a}.md`,s.target="_blank",s.rel="noopener noreferrer",s.className=oe.button,s.title="View raw markdown (optimized for LLMs)",s.textContent="View as Markdown",t.style.display="flex",t.style.alignItems="center",t.style.flexWrap="wrap",t.style.gap="0.75rem",t.appendChild(s),()=>{s.remove()}}),[t,e.pathname]),null}function re(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(le,{}),(0,o.jsx)(ae,{...e})]})}}}]);
\ No newline at end of file
diff --git a/assets/js/1a4e3797.9465e713.js b/assets/js/1a4e3797.9465e713.js
new file mode 100644
index 000000000..e0f8817c0
--- /dev/null
+++ b/assets/js/1a4e3797.9465e713.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[2138],{81430:(e,t,r)=>{r.d(t,{W:()=>u});var s=r(96540),a=r(40797);const n=["zero","one","two","few","many","other"];function c(e){return n.filter((t=>e.includes(t)))}const l={locale:"en",pluralForms:c(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,a.A)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:c(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),l}}),[e])}function u(){const e=o();return{selectMessage:(t,r)=>function(e,t,r){const s=e.split("|");if(1===s.length)return s[0];s.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const a=r.select(t),n=r.pluralForms.indexOf(a);return s[Math.min(n,s.length-1)]}(r,t,e)}}},71738:(e,t,r)=>{r.r(t),r.d(t,{default:()=>N});var s=r(96540),a=r(40797),n=r(99795),c=r(27143),l=r(56289),o=r(50539),u=r(81430),i=r(20053),h=r(56347),d=r(9136),m=r(45351);const p=function(){const e=(0,d.A)(),t=(0,h.W6)(),r=(0,h.zy)(),{siteConfig:{baseUrl:s}}=(0,a.A)(),n=e?new URLSearchParams(r.search):null,c=n?.get("q")||"",l=n?.get("ctx")||"",o=n?.get("version")||"",u=e=>{const t=new URLSearchParams(r.search);return e?t.set("q",e):t.delete("q"),t};return{searchValue:c,searchContext:l&&Array.isArray(m.Hg)&&m.Hg.some((e=>"string"==typeof e?e===l:e.path===l))?l:"",searchVersion:o,updateSearchPath:e=>{const r=u(e);t.replace({search:r.toString()})},updateSearchContext:e=>{const s=new URLSearchParams(r.search);s.set("ctx",e),t.replace({search:s.toString()})},generateSearchPageLink:e=>{const t=u(e);return`${s}search?${t.toString()}`}}};var g=r(64342),f=r(55203),x=r(83008),y=r(16826),j=r(86068),S=r(6609),A=r(6985),C=r(42142);const w="searchContextInput_mXoe",v="searchQueryInput_CFBF",_="searchResultItem_U687",P="searchResultItemPath_uIbk",b="searchResultItemSummary_oZHr",F="searchQueryColumn_q7nx",R="searchContextColumn_oWAF";var T=r(50596),$=r(74848);function I(){const{siteConfig:{baseUrl:e},i18n:{currentLocale:t}}=(0,a.A)(),{selectMessage:r}=(0,u.W)(),{searchValue:n,searchContext:l,searchVersion:h,updateSearchPath:d,updateSearchContext:x}=p(),[y,j]=(0,s.useState)(n),[S,C]=(0,s.useState)(),[_,P]=(0,s.useState)(),b=`${e}${h}`,I=(0,s.useMemo)((()=>y?(0,o.T)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:y}):(0,o.T)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"})),[y]);(0,s.useEffect)((()=>{d(y),S&&(y?S(y,(e=>{P(e)})):P(void 0))}),[y,S]);const N=(0,s.useCallback)((e=>{j(e.target.value)}),[]);return(0,s.useEffect)((()=>{n&&n!==y&&j(n)}),[n]),(0,s.useEffect)((()=>{!async function(){const{wrappedIndexes:e,zhDictionary:t}=!Array.isArray(m.Hg)||l||m.dz?await(0,g.Z)(b,l):{wrappedIndexes:[],zhDictionary:[]};C((()=>(0,f.m)(e,t,100)))}()}),[l,b]),(0,$.jsxs)(s.Fragment,{children:[(0,$.jsxs)(c.A,{children:[(0,$.jsx)("meta",{property:"robots",content:"noindex, follow"}),(0,$.jsx)("title",{children:I})]}),(0,$.jsxs)("div",{className:"container margin-vert--lg",children:[(0,$.jsx)("h1",{children:I}),(0,$.jsxs)("div",{className:"row",children:[(0,$.jsx)("div",{className:(0,i.A)("col",{[F]:Array.isArray(m.Hg),"col--9":Array.isArray(m.Hg),"col--12":!Array.isArray(m.Hg)}),children:(0,$.jsx)("input",{type:"search",name:"q",className:v,"aria-label":"Search",onChange:N,value:y,autoComplete:"off",autoFocus:!0})}),Array.isArray(m.Hg)?(0,$.jsx)("div",{className:(0,i.A)("col","col--3","padding-left--none",R),children:(0,$.jsxs)("select",{name:"search-context",className:w,id:"context-selector",value:l,onChange:e=>x(e.target.value),children:[m.dz&&(0,$.jsx)("option",{value:"",children:(0,o.T)({id:"theme.SearchPage.searchContext.everywhere",message:"Everywhere"})}),m.Hg.map((e=>{const{label:r,path:s}=(0,T.p)(e,t);return(0,$.jsx)("option",{value:s,children:r},s)}))]})}):null]}),!S&&y&&(0,$.jsx)("div",{children:(0,$.jsx)(A.A,{})}),_&&(_.length>0?(0,$.jsx)("p",{children:r(_.length,(0,o.T)({id:"theme.SearchPage.documentsFound.plurals",message:"1 document found|{count} documents found",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)'},{count:_.length}))}):(0,$.jsx)("p",{children:(0,o.T)({id:"theme.SearchPage.noResultsText",message:"No documents were found",description:"The paragraph for empty search result"})})),(0,$.jsx)("section",{children:_&&_.map((e=>(0,$.jsx)(H,{searchResult:e},e.document.i)))})]})]})}function H(e){let{searchResult:{document:t,type:r,page:s,tokens:a,metadata:n}}=e;const c=r===x.i.Title,o=r===x.i.Keywords,u=r===x.i.Description,i=u||o,h=c||i,d=r===x.i.Content,p=(c?t.b:s.b).slice(),g=d||i?t.s:t.t;h||p.push(s.t);let f="";if(m.CU&&a.length>0){const e=new URLSearchParams;for(const t of a)e.append("_highlight",t);f=`?${e.toString()}`}return(0,$.jsxs)("article",{className:_,children:[(0,$.jsx)("h2",{children:(0,$.jsx)(l.A,{to:t.u+f+(t.h||""),dangerouslySetInnerHTML:{__html:d||i?(0,y.Z)(g,a):(0,j.C)(g,(0,S.g)(n,"t"),a,100)}})}),p.length>0&&(0,$.jsx)("p",{className:P,children:(0,C.$)(p)}),(d||u)&&(0,$.jsx)("p",{className:b,dangerouslySetInnerHTML:{__html:(0,j.C)(t.t,(0,S.g)(n,"t"),a,100)}})]})}const N=function(){return(0,$.jsx)(n.A,{children:(0,$.jsx)(I,{})})}}}]);
\ No newline at end of file
diff --git a/assets/js/1df93b7f.2c2c50db.js b/assets/js/1df93b7f.2c2c50db.js
new file mode 100644
index 000000000..e9a4c4139
--- /dev/null
+++ b/assets/js/1df93b7f.2c2c50db.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4583],{91486:(e,t,r)=>{r.d(t,{A:()=>A});var o,a,s=r(96540);function i(){return i=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{title:t,titleId:r,...A}=e;return s.createElement("svg",i({xmlns:"http://www.w3.org/2000/svg",width:134,height:134,fill:"none",viewBox:"0 0 134 134","aria-labelledby":r},A),t?s.createElement("title",{id:r},t):null,o||(o=s.createElement("g",{clipPath:"url(#a)"},s.createElement("path",{fill:"#007DFC",d:"M64.88 111.756 9.811 56.688C3.27 50.147 0 41.574 0 33c0-4.364.847-8.727 2.542-12.823A33.4 33.4 0 0 0 0 33v67c0 18.502 14.999 33.5 33.5 33.5 14.365 0 26.618-9.042 31.38-21.744"}),s.createElement("path",{fill:"#FC9E22",d:"M67 33v67c0 18.502 14.999 33.5 33.5 33.5 18.502 0 33.5-14.998 33.5-33.5V33c0 18.502-14.998 33.5-33.5 33.5C81.999 66.5 67 51.502 67 33"}),s.createElement("path",{fill:"url(#b)",fillRule:"evenodd",d:"M9.812 9.312c13.083-13.083 34.294-13.083 47.376 0l67 67c13.083 13.082 13.083 34.294 0 47.376s-34.294 13.083-47.376 0l-67-67c-13.083-13.083-13.083-34.293 0-47.376",clipRule:"evenodd"}),s.createElement("path",{fill:"#06D4E7",d:"M64.88 111.756 21.743 68.621A33.4 33.4 0 0 1 33.5 66.5C52 66.5 67 81.499 67 100c0 4.136-.75 8.098-2.12 11.756"}),s.createElement("path",{fill:"#FF397F",d:"m69.12 21.244 43.136 43.135A33.4 33.4 0 0 1 100.5 66.5C81.999 66.5 67 51.502 67 33c0-4.136.75-8.098 2.12-11.756"}),s.createElement("path",{fill:"#FFB900",d:"M112.256 64.38C124.958 59.617 134 47.364 134 33c0-18.501-14.998-33.5-33.5-33.5-14.365 0-26.618 9.042-31.38 21.745z"}),s.createElement("path",{fill:"#00B1F4",d:"M21.745 68.62C9.042 73.383 0 85.636 0 100c0 18.502 14.999 33.5 33.5 33.5 14.365 0 26.618-9.042 31.38-21.744z"}))),a||(a=s.createElement("defs",null,s.createElement("linearGradient",{id:"b",x1:2.345,x2:129.31,y1:5.53,y2:126.8,gradientUnits:"userSpaceOnUse"},s.createElement("stop",{stopColor:"#5231C6"}),s.createElement("stop",{offset:1,stopColor:"#E60AF6"})),s.createElement("clipPath",{id:"a"},s.createElement("path",{fill:"#fff",d:"M0 0h134v134H0z"})))))}},77944:(e,t,r)=>{r.r(t),r.d(t,{default:()=>v});var o=r(96540),a=r(20053),s=r(40797),i=r(99795);const A={features:"features_t9lD",featureSvg:"featureSvg_GfXr"};var n=r(56347),l=r(74848);const d=[{title:"Getting started",Image:r(46438).A,description:(0,l.jsx)(l.Fragment,{children:"Kickstart your blockchain journey with Dappnode. Our straightforward setup guides you to deploy and manage your decentralized applications easily. No more technical jargon, just a seamless blockchain experience. With Dappnode, diving into decentralization has never been simpler. Start now!"}),url:"/docs/user/getting-started/choose-your-path"},{title:"Solo staking",Image:r(80523).A,description:(0,l.jsx)(l.Fragment,{children:"Experience the future of Ethereum with Dappnode. Simplify your solo staking journey with our user-friendly platform, empowering you to run your own Ethereum 2.0 validator node with ease and security. With Dappnode, you're in control. Stake smarter, stake with Dappnode."}),url:"/docs/user/staking/overview"},{title:"Driving School",Image:r(65308).A,description:(0,l.jsx)(l.Fragment,{children:"Dappnode Driving School is a collection of tutorial videos that provide all the tools you need for a successful Dappnode journey. From initial installation to advanced VPN setups, exploring hardware essentials, and expanding functionalities, each video offers step-by-step instructions tailored for both beginners and seasoned users."}),url:"/docs/user/videos-and-tutorials/driving-school/initial-setup"},{title:"Lido CSM",Image:r(19263).A,description:(0,l.jsx)(l.Fragment,{children:"Community Staking Module (CSM) is the third Lido on Ethereum module after the Curated Module and Simple DVT, and the first to offer permissionless entry allowing community stakers to operate validators by providing an ETH-based bond. Dappnode facilitates this process by providing a user-friendly interface for community stakers to stake on Ethereum and Hoodi as node operators."}),url:"/docs/user/staking/ethereum/lsd-pools/lido/overview"},{title:"Rocketpool",Image:r(49674).A,description:(0,l.jsx)(l.Fragment,{children:"How Rocket Pool Works. Unlike solo stakers, who are required to put 32 ETH up for deposit to create a new validator, Rocket Pool nodes only need to deposit 8/16 ETH per validator. This will be coupled with 16 ETH from the staking pool (which stakers deposited in exchange for rETH) to create a new Ethereum validator. This new validator is called a minipool."}),url:"/docs/user/staking/ethereum/lsd-pools/rocketpool"},{title:"Ethical metrics",Image:r(81506).A,description:(0,l.jsx)(l.Fragment,{children:"Ethical metrics is privacy-ensured solution for monitoring your Dappnode. This service alerts you about your Dappnode's status, using Tor hidden services to maintain the privacy of your IP address. Setting up is straightforward, requiring only an email address to receive alerts."}),url:"/docs/user/ethical-metrics/overview"},{title:"Smooth",Image:r(91486).A,description:(0,l.jsx)(l.Fragment,{children:"Smooth is a opt-in feature that enables solo stakers to earn higher MEV rewards. Joining Smooth is easier than ever with Dappnode. Simply set your Fee Recipient Address to Smooth and claim your rewards after proposing a slot!"}),url:"/docs/smooth"}];function c(e){let{title:t,Image:r,description:o,url:s}=e;const i="string"!=typeof r,d=(0,n.W6)();return(0,l.jsxs)("div",{className:(0,a.A)("col col--4"),onClick:()=>{s&&d.push(s)},style:{cursor:"pointer"},children:[(0,l.jsx)("div",{className:"text--center",children:i?(0,l.jsx)(r,{className:A.featureSvg,role:"img"}):(0,l.jsx)("img",{src:r,className:A.featureSvg,alt:t})}),(0,l.jsxs)("div",{className:"text--center padding-horiz--md",children:[(0,l.jsx)("h3",{children:t}),(0,l.jsx)("p",{children:o})]})]})}function u(){return(0,l.jsx)("section",{className:A.features,children:(0,l.jsx)("div",{className:"container",children:(0,l.jsx)("div",{className:"row",children:d.map(((e,t)=>(0,l.jsx)(c,{...e},t)))})})})}const p={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN",carousel:"carousel_qyqS",videoModal:"videoModal_mMww",videoWrapper:"videoWrapper_XWWU",closeButton:"closeButton_muHm",videoThumbnail:"videoThumbnail_Dhao",videoOverlay:"videoOverlay_xzii",playButton:"playButton_boOJ"},m=[{title:"Booting from the Dappnode ISO",url:"https://www.youtube.com/embed/lh5hADm1Iuk",featured:!0},{title:"Accessing the Dappnode User Interface or Dashboard",url:"https://www.youtube.com/embed/Z1uDv_J7wlg",featured:!0},{title:"Setting up Dappnode Security",url:"https://www.youtube.com/embed/TZUK39yiZ30",featured:!0},{title:"Configuring your Dappnode VPN",url:"https://www.youtube.com/embed/qB0sMaNpXpU",featured:!0},{title:"Syncing your clients/An overview on node running",url:"https://www.youtube.com/embed/zJowD3X-MUc",featured:!0},{title:"Understanding your Dappnode's Hardware",url:"https://www.youtube.com/embed/1GW-GbGKs7o?si=DZVO185qWNWiXFl4",featured:!0}];function h(){const{siteConfig:e}=(0,s.A)(),[t,r]=(0,o.useState)(null);(0,o.useEffect)((()=>{const e=e=>{"Escape"===e.key&&r(null)};return window.addEventListener("keydown",e),()=>{window.removeEventListener("keydown",e)}}),[]);return(0,l.jsx)("header",{className:(0,a.A)("hero hero--primary",p.heroBanner),children:(0,l.jsxs)("div",{className:"container",children:[(0,l.jsx)("h1",{className:"hero__title",children:e.title}),(0,l.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,l.jsx)("div",{className:(0,a.A)("carousel",p.carousel),children:m.filter((e=>e.featured)).map(((e,t)=>(0,l.jsxs)("div",{className:(0,a.A)("carousel__item",p.carouselItem),onClick:()=>(e=>{r(e.url)})(e),children:[(0,l.jsx)("iframe",{className:p.videoThumbnail,width:"560",height:"315",src:e.url,allowFullScreen:!0}),(0,l.jsx)("div",{className:p.videoOverlay})]},t)))}),t&&(0,l.jsx)("div",{className:p.videoModal,children:(0,l.jsxs)("div",{className:p.videoWrapper,children:[(0,l.jsx)("button",{className:p.closeButton,onClick:()=>{r(null)},children:"X"}),(0,l.jsx)("iframe",{width:"100%",height:"100%",src:t,allowFullScreen:!0})]})})]})})}function v(){const{siteConfig:e}=(0,s.A)();return(0,l.jsxs)(i.A,{title:`Hello from ${e.title}`,description:"Description will go into a meta tag in ",children:[(0,l.jsx)(h,{}),(0,l.jsx)("main",{children:(0,l.jsx)(u,{})})]})}},65308:(e,t,r)=>{r.d(t,{A:()=>o});const o=r.p+"assets/images/driving-school-logo-95fc32d66ea6db05037bd37a5ae77b9f.png"},81506:(e,t,r)=>{r.d(t,{A:()=>o});const o=r.p+"assets/images/ethical-metrics-logo-d0514fa034eae1b9bd5c57a2250d4515.png"},46438:(e,t,r)=>{r.d(t,{A:()=>o});const o=r.p+"assets/images/getting-started-0b96ec65495a5b2b8d1c08feafa4b171.png"},19263:(e,t,r)=>{r.d(t,{A:()=>o});const o="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxAPDxANDxAPDw8PDw0PDQ8ODQ8PDQ4NFREWFhYRFRUYHSggGBolGxUVITEhJSkrLi4uFx8zODMsNygtLisBCgoKDg0OGxAQGi0mHiUtLS4wKy8tLS0tNS01LS0rLS4tLS4tKy0rLS0tLi0tLSs1LS0tLS0wLS0tLS0tLS0tLf/AABEIAOEA4QMBIgACEQEDEQH/xAAbAAEAAgMBAQAAAAAAAAAAAAAAAQQCAwUGB//EAD0QAAIBAgMFBAYJAwQDAAAAAAABAgMRBCExBRJBUWEicYGxBhMyUpGhI0JicnPB0eHwgpKyFGOD4jNDU//EABoBAQADAQEBAAAAAAAAAAAAAAABAgMEBQb/xAArEQEAAgICAgEDAwMFAAAAAAAAAQIDERIxBCFBBSJRMmGBcZHwI0JSsdH/2gAMAwEAAhEDEQA/APuIAAAAAAAAAAAAAAAAAAAAAAQBIAAAAAAAAAAAAAAAAAAAAAAQBIAAAgXAAhswcidJ0zuLmreCkNJ03XBrUjJMaRpkSY3JuQhIIJAAACCSABIAAAAAAAAAAAEASAQAFyGzFskS5GDkYuRhKRbRplKRrlM0YnFRhrryWpysTipzy0jyX58y9a7dGLDNv6LmK2nGOUe3Lp7K72cqtiqk3nJ9ybUfgjCbUdf3K0q8uCS+bNq1iHpYcNa9R/K3SrVIu8ZyX9Tt8Dr4Pa18qis/eWj71wPO08RLo/AuUail0fJi1d9mbDW0e4/mHqoTTV07p6NPIzueew9aVP2X3p+y/A6mGx0ZZPsvro+5mE008vJgmvuPcL1zJM1pmSZRgzJMUySEpABAgkEASAAAAAAAAAQAIbDMGyUpbMJMxlK2byRSr43hDPq9PAtEbXrjm3SxVqqKu3Y59fGN5RyXPj+xrleTu3d9TXKa4Zv5GkQ6aYoj92DjxfxZXqT934lh029SfUGkNpyRXtznSvmzXVjbLizpVIKKbfA5lV53N8dZs5c/1CKRrapRrqNRxfst27nzOp6k81jp9qXezu+jmN9dB05f+SmvGUOD8NPhzN/I8eYpzj+XJ4f1etsk4pn+n/i/TqNZPNfMswtLT9w6BrdNrTI8963Ktul2hiJQy1XJ/kzo0MRGejz5PU4sK3CXxRuXNeDRSYc+TFEu3FmRzcPjGspZrnx/cv06ikrp3M5jTmtjmvbYSYkoqokgkAAAAAAAAAQAAMZGuTNkjXImFoczHOTlZ+zlbl3laU1Hq+SLOPrPe9WskrXfG7XDkVI4fkbR09CmuEbRnLu5I3U6JspUi3TpjbDLm16hojQJdNFlo01o3TV7X4k1efkyTLj42e87LRfN8yvHDrV59OBbrUXHXTmtDUd1Z1GoeZf3bdnJx+GhUk01Zp5SWT/cp4XDzw9SNWGe69Vo1xTXU34mr9JNfaZZwilN7sU2+h27mtNT087VbX3He/h6jDzjUhGcdJK/VPiiJ0TXs7DulF3azzaXsx63LtjxbxEWnXT6bBltxjl25tSkac46ZeR0qkCtUplYl6OPLvthTxCeUuy/kWad00468OvQpSo3NuFruk8s1xT1t05CY/DW1YmPt/s76JIRJi8xIIJIEEkEgAAAAIAkhgAYsxaMyGiTarXwynno+ZWdBx105rQ6NiJItErxlmI0qU4m4OK4BlmN7bYSZRqza7S8eRcq6MqTRtRzZGtYlPJ5ProzTVoLVZdOBXxCs7fDuNMcTKPVcn+R1Vx/NXFbJHVlensdyqTnUdouTajHOTXfwL1faFDCx3Fbe4U4e0+snw8Tz+1Nv1HKVKkvVpNxlLWbfTl59xy6V2+Lbfi2zujxr3iJyT6/Dzp8umOZjFHv8u3X2jVxDe892mtIR9m/Xmem2DinUopPOVN7j5tcH8PI8zGjuRUfj1Z1vRWXbqx4OMH4pv8AUw8mlZxTxjp1eHkvGaOU99vQyiaZxLJCpX1PIfQ0vpSVJt2SuWsPgEnvSzeqX1V+pZpwS0NiImzSc0zGoSiSESUYhJBJCUEgAAAAIJAEAAkQQyWYthCGzGTMZSMJTLxCsym5DKuJx1Ol7ckm9FrJ+Bro7UpSyu196Nkaxjtremc2jpaqaMqyLd75orVI2JozvCljKd1fivI5c0dqZzq9Kz6cDsxW+HBmp8vJYqj9LP78vMv7JwubqPSOUfvfzzMq2HvUkks3J2OpCkoRUVw+b5noZM32xDy8WD75tKvVR1PRalnVnw7MV82/yObOLbSSu27JLiz02z8N6qnGHHWT5yev86HF5F9Y+P5ej4mObZeX4XUZI1bxorYxR0V/I82KzPT2IdCBkUsJjYTdk7S916+HMuoztWYnUrwkkgkqkJIASkAEAAABBJAAAgkQ2a5szkzRUZasKy1VqqSbbslqcfaWMr2+ihuR9+coqT7ovQuYmortv2acd99+dvJ/E8zi8W5ycpPP5Jckd/j4tzvTK/uNMacW23Jtyerbu2+86FCByFX6nQwWNTajLLk+HiduWttM6UiHZwtRx005cC7vKSKMDl7Q9JadPsUUqs+d/oo+P1vD4nFGK2S32w0vqI9u3UjYq1oXRR2d6QuWVWml9qne39r/AFO5BQmt5WknxQtW2Kfuhz2xco9OHTodqU+rsZqlKTtFNvodlYaHur5s2q0VZWXRIT5H4Z18OelTAYBU+3LOfyj3fqXWzBVEyWzntabTuXXXHGONRCltKu04wTs/aduWi/M1uLkstfMp1Ku/VlLhe0e5ZF6nU3YuXJN259DfjxiNFZ3Ln/6WU5Wb3FfVrO65I9Rg1aEVvSnZW3pu8n3s8lisf9K439jsN85L2n/c2el2NV3qMZdZeY8qtuETK1LbnToEkEnntQAIJSACAAAAgkAQQyQyRqmV6rLEyrVNKKy4+1Z2p13+GvB2/VnmqC36kY8G8+5K56PbEexWXOlGa/oln8t08vsqd6y7peR7Pix/pzP+dMbdu4qSeVlblZWK9bZnah6t235NOL0ikruV+RdpoyrXWa/+OJS+9uxa+UWZ85ifTSK+nE2hGVReqjXk4RytubsJeN7td5RpbPlDVXXNZosYS8morNtpJc2zt/6WdO2+snldNNdxvbNOKOK0ePW87ntRwlA7OCTg7rx5M1UqavlxL9KBw5svJtGDj6lchO6ucvD416Tz+0vzRfhKxyYROarfDirqd/st1aySvfLmUpbXa3o2dnFqMnqpcPA3NZT/AApeaOXUp3NsXGZ9sc9J4zELOERYxuI9XDef1FKq1z3Lbq8ZuHzNOBd11WTKHpJV7G6vryS/46f/AHb/ALTqpTnkiHn/AKauHHEv2nfNvPm9X5n0H0Rqb2Fg/tVP8meA2lR3MJhZWs51MXKXg6cV8kj2/oFK+Bg/t1v82b/UYicHKP8Alr+24Rh/Vr9npESED591hJBISAAgAAAIJAAhkkAa5orVUW5Ir1ImlZRLk7Qirb79mN1U/CkrS+GT/pPAubw2JtL/ANdRxl1jpf4O59JqxPCel+znC1RJ9lWv71Jaf1R06xs+Erex9PvE24T8sckfL0VEsOF1lqneN9G+T6NXXieU9F9uRaWHqyUZLKlOTspLhBvny/l/TVcYqTe+mopRbms0t5tK611XApnw3pfjMN8UxMPO7roVsvqyUoX5J5J+T7j1+GxMK0LrR5Sjxi+RzsbgoYqCq0pRcvqyT7MrcHyZy8JUnSnbOMllKL8mVyazV3/uhtSnw7FeO7p1Xc1/E/Es4aveOeuj7zRGpCortZ8ea8RTgo3s3Z8Gcc/u7tRNdT2vooQiWKNe3ZenAwgirOImNtdZdmf4U/OJSw9NyT6LefddfqdDErKX4U/OJV2YnvNrhFu3vK6ui9ZZ2/TLXTThLeWnEqY7C+urxprNXjTT+yval/kzsVKKTsvZecX0Zu2fhEp7/JZd7/Y6KZ+P3fOnnZMe5ec9LsP9FRSWSq4y3Rb8TvegUbYGC/3K3+bMNrbNliFCnBK8aldybyjHekrXZ2Ni7PWGoxoqW9Zyk3a2bd8kTnz1nxox7973/wBqVrPPboIAHlugJIJIAEEgAAAAAEEkEgYs1TRuZjJExKFKpApYvCxqRcJq8Xr+qfB9TqTgVpxN6X10afL9u+ilag5VKSdajm+yl6yC5SitV1XwRhsTHynfDVJtwq05Uob7uoVLpwd+W8kvE+myicjaHo/hq7c5U92b1nTe5Jvm+D8UexT6lzrxyx/MKxh1O6vM+jmKdGvHevGLbhUTys9M+52PX47Bxq56TWkvyfQ8xtvZ0qVTfzlGWs39Z83b63PnrxaXU2VtfsKFW7srRks7rk/1MvJjnrLR1YYmPTOnGUMnk0b/AFhlWqKSclxkt3S9rWb/AJyKzdjin29SscqtzmXMM7xTOW5HTwsXGCT11ZW0ahTLXUMsVpL8OfnE0bJXbf3X5o3V3k+sJLxuhgKDi955XVrcdUR8OO3WlmdP6vXeh+aLWHp7qtx4mMDdEzmXNaG2KNqRjTjxNhlMqABJAAAgAAAAAAAACCSAJIZIA1tGucLm8xaLRIoVKbRokjpuJqnRT1ReLNa2125danGcXGSUovVPRnErbH3XvUnde6/aXc+J6aeE5P4mp4SXR+JtTNNepdNbUcGjBrJqz6qzNyoSlktOLeh1Xh5e6/kx6mXuv4Ezk97dEZo16VaGGjDPV83+XI3G1YefusyjhJvhbvaKTbfbOckdzLSlnc3RN0MA+Ml4K5ap4WK4X7yk3hhfLVXpQb0XjwLdOlbqzNIkpNtua1tpAJKqgAIAgACQAAAAAAAAABBIIAkgEgYtEbpmQSNbiRum2wsNp21bpO6Z2JsNm2FhYzsLA2xsSTYkIRYEggAAAIJAEEgAAAAAAAAAAAAAAAAACCQBAJAEEgAAABAJAEAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/2Q=="},49674:(e,t,r)=>{r.d(t,{A:()=>o});const o=r.p+"assets/images/rocketpool-b58a9096fceb354093092b52031ad31a.png"},80523:(e,t,r)=>{r.d(t,{A:()=>o});const o=r.p+"assets/images/solo-staking-ethereum-d4f9cd76d07ba97523a818af09c1a4a5.png"}}]);
\ No newline at end of file
diff --git a/assets/js/1e4f1bb9.0e6c1675.js b/assets/js/1e4f1bb9.0e6c1675.js
new file mode 100644
index 000000000..886c5db8d
--- /dev/null
+++ b/assets/js/1e4f1bb9.0e6c1675.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4541],{25159:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>d,contentTitle:()=>t,default:()=>l,frontMatter:()=>r,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"user/packages/dms","title":"Dappnode Monitoring Service (DMS)","description":"As a Dappnode user, there are times when having insights into the performance of your packages or your whole system can be incredibly beneficial. This means understanding the condition or \\"health\\" of your packages, the utilization of your computer resources such as CPU, RAM, and disk space, as well as monitoring network traffic flow. Yet, managing all of these aspects can become complex and tedious, even for those with experience. This is precisely where the Dappnode Monitoring Service (DMS) steps in to simplify matters.","source":"@site/docs/user/packages/dms.md","sourceDirName":"user/packages","slug":"/user/packages/dms","permalink":"/docs/user/packages/dms","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/packages/dms.md","tags":[],"version":"current","frontMatter":{"title":"Dappnode Monitoring Service (DMS)","llm_description":"Dappnode Monitoring Service using Prometheus and Grafana for system and package health monitoring."},"sidebar":"userSidebar","previous":{"title":"Packages\' signature","permalink":"/docs/user/packages/signature"},"next":{"title":"Bitcoin","permalink":"/docs/user/packages/bitcoin"}}');var o=n(74848),i=n(28453);const r={title:"Dappnode Monitoring Service (DMS)",llm_description:"Dappnode Monitoring Service using Prometheus and Grafana for system and package health monitoring."},t="Dappnode Monitoring Service (DMS)",d={},c=[{value:"How It All Works",id:"how-it-all-works",level:2},{value:"Installing and accessing DMS",id:"installing-and-accessing-dms",level:2},{value:"Monitoring through Dashboards",id:"monitoring-through-dashboards",level:2}];function h(e){const a={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.header,{children:(0,o.jsx)(a.h1,{id:"dappnode-monitoring-service-dms",children:"Dappnode Monitoring Service (DMS)"})}),"\n",(0,o.jsx)(a.p,{children:'As a Dappnode user, there are times when having insights into the performance of your packages or your whole system can be incredibly beneficial. This means understanding the condition or "health" of your packages, the utilization of your computer resources such as CPU, RAM, and disk space, as well as monitoring network traffic flow. Yet, managing all of these aspects can become complex and tedious, even for those with experience. This is precisely where the Dappnode Monitoring Service (DMS) steps in to simplify matters.'}),"\n",(0,o.jsx)(a.h2,{id:"how-it-all-works",children:"How It All Works"}),"\n",(0,o.jsx)(a.p,{children:"DMS acts as a strong monitoring solution, simplifying the complex task of monitoring your packages and system by automatically collecting all available data and visualizing it for you. But how does it achieve this? DMS primarily comprises two key components: Prometheus and Grafana. Let's break it down."}),"\n",(0,o.jsxs)(a.ol,{children:["\n",(0,o.jsxs)(a.li,{children:["\n",(0,o.jsxs)(a.p,{children:[(0,o.jsx)(a.strong,{children:"Prometheus Integration:"})," DMS seamlessly incorporates ",(0,o.jsx)(a.a,{href:"https://prometheus.io/",children:"Prometheus"}),", a comprehensive monitoring toolkit. Prometheus is responsible for gathering all data coming from other Dappnode packages. This information is the foundation for understanding your package's performance."]}),"\n"]}),"\n",(0,o.jsxs)(a.li,{children:["\n",(0,o.jsxs)(a.p,{children:[(0,o.jsx)(a.strong,{children:"Grafana Dashboards:"})," To transform raw data coming from Prometheus into meaningful insights, DMS brings in ",(0,o.jsx)(a.a,{href:"https://grafana.com/",children:"Grafana"}),", renowned for its exceptional data visualization capabilities. Through customizable dashboards, you gain instant access to both real-time and historical perspectives on how your packages are functioning."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(a.p,{children:(0,o.jsx)(a.strong,{children:"Your Privacy Matters:"})}),"\n",(0,o.jsx)(a.p,{children:"At Dappnode, we respect your privacy. Rest assured that all the metrics collected by DMS are stored locally, ensuring your information remains private and secure."}),"\n",(0,o.jsx)(a.h2,{id:"installing-and-accessing-dms",children:"Installing and accessing DMS"}),"\n",(0,o.jsxs)(a.p,{children:["Locate DMS in your DAppStore, listed among the Featured packages. The installation process is straightforward, much like any other Dappnode package. After installation, you can access DMS Grafana and explore all its dashboards by visiting ",(0,o.jsx)(a.a,{href:"http://dms.dappnode",children:"http://dms.dappnode"}),"."]}),"\n",(0,o.jsx)(a.h2,{id:"monitoring-through-dashboards",children:"Monitoring through Dashboards"}),"\n",(0,o.jsxs)(a.p,{children:["As explained in the ",(0,o.jsx)(a.a,{href:"https://grafana.com/docs/grafana/latest/dashboards/",children:"official Grafana documentation"}),", Grafana simplifies data visualization through organized views known as dashboards. In the context of Dappnode, many packages, especially our staker packages, come equipped with pre-built Grafana dashboards that seamlessly integrate into DMS upon installation. These dashboards are designed to provide specific insights into the performance of the corresponding packages. To explore the range of available Grafana dashboards within DMS, follow these simple steps:"]}),"\n",(0,o.jsxs)(a.ol,{children:["\n",(0,o.jsxs)(a.li,{children:[(0,o.jsx)(a.strong,{children:"Accessing Dashboards:"}),' Find the "Dashboards" icon on the left-hand side of the DMS interface and hover your mouse over it. Click on "Browse" to proceed.']}),"\n"]}),"\n",(0,o.jsx)("div",{style:{textAlign:"center"},children:(0,o.jsx)(a.p,{children:(0,o.jsx)(a.img,{alt:"Browse Dashboards",src:n(23852).A+"",width:"500",height:"500"})})}),"\n",(0,o.jsxs)(a.ol,{start:"2",children:["\n",(0,o.jsxs)(a.li,{children:["\n",(0,o.jsxs)(a.p,{children:[(0,o.jsx)(a.strong,{children:"Dashboard Folders:"})," In the dashboard browsing view, you'll see different dashboard folders. Each folder contains one or more dashboards related to specific aspects of your Dappnode environment. For instance, let's click on the \"Docker\" dashboard provided by the ",(0,o.jsx)(a.strong,{children:"Dappnode Exporter"})," package."]}),"\n",(0,o.jsx)(a.p,{children:(0,o.jsx)(a.img,{alt:"Dashboard Folders",src:n(89981).A+"",width:"1618",height:"725"})}),"\n"]}),"\n",(0,o.jsxs)(a.li,{children:["\n",(0,o.jsxs)(a.p,{children:[(0,o.jsx)(a.strong,{children:"Exploring a Dashboard:"})," That's it! You are now within the chosen dashboard, such as the \"Docker\" dashboard. Here, you'll find valuable information about all your installed packages, including relevant metrics and performance indicators."]}),"\n",(0,o.jsx)(a.p,{children:(0,o.jsx)(a.img,{alt:"Docker Dashboard",src:n(89665).A+"",width:"2549",height:"1303"})}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(a.p,{children:["As you navigate through these Grafana dashboards, it's worth mentioning that the ",(0,o.jsx)(a.a,{href:"https://grafana.com/docs/grafana/latest/",children:"official Grafana documentation"})," provides a wealth of information about dashboards, visualization techniques, and best practices. Exploring this documentation can greatly enhance your ability to interpret and utilize the data presented in DMS dashboards. Whether you're new to Grafana or seeking advanced tips, the official documentation is a valuable resource for maximizing your monitoring experience."]}),"\n",(0,o.jsx)(a.admonition,{type:"info",children:(0,o.jsxs)(a.p,{children:["\ud83d\udca1 If you're looking for specific dashboards beyond what comes pre-installed, ",(0,o.jsx)(a.a,{href:"https://grafana.com/grafana/dashboards/",children:"Grafana's dashboard repository"})," makes it easy to search and import dashboards created by the community."]})}),"\n",(0,o.jsx)(a.p,{children:"Feel free to check out the different dashboard folders and adjust how things look based on what you like. Grafana offers a bunch of cool features, so have fun exploring and making the dashboards work just right for you!"})]})}function l(e={}){const{wrapper:a}={...(0,i.R)(),...e.components};return a?(0,o.jsx)(a,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},23852:(e,a,n)=>{n.d(a,{A:()=>s});const s=n.p+"assets/images/dms-browse-dashboards-37ab051b363a523366fc70f93df38cae.png"},89981:(e,a,n)=>{n.d(a,{A:()=>s});const s=n.p+"assets/images/dms-dashboards-page-3e8a37465fa70b4a9da2a0fb31b0258b.png"},89665:(e,a,n)=>{n.d(a,{A:()=>s});const s=n.p+"assets/images/dms-docker-dashboard-37854c47052a09ff034780a00a42588b.png"},28453:(e,a,n)=>{n.d(a,{R:()=>r,x:()=>t});var s=n(96540);const o={},i=s.createContext(o);function r(e){const a=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function t(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:a},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/1ee5c5d2.aa8be7c6.js b/assets/js/1ee5c5d2.aa8be7c6.js
new file mode 100644
index 000000000..47e5d8e60
--- /dev/null
+++ b/assets/js/1ee5c5d2.aa8be7c6.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8177],{60743:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>n,metadata:()=>s,toc:()=>h});const s=JSON.parse('{"id":"smooth/deep-dive-into-smooth/oracle-sm","title":"Smooth\'s architecture","description":"Smooth is composed of two main components: the Oracle and the Smart Contract. These two components work together to track validators and distribute rewards fairly. Both are open source and indispensable to the functioning of Smooth. While the Smart Contract serves to track all the events related to the pool onchain (subscriptions, unsubscriptions, block proposals, etc.), the Oracle is responsible for computing the rewards of each validator.","source":"@site/docs/smooth/deep-dive-into-smooth/oracle-sm.md","sourceDirName":"smooth/deep-dive-into-smooth","slug":"/smooth/deep-dive-into-smooth/oracle-sm","permalink":"/docs/smooth/deep-dive-into-smooth/oracle-sm","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/smooth/deep-dive-into-smooth/oracle-sm.md","tags":[],"version":"current","frontMatter":{"title":"Smooth\'s architecture","llm_description":"Explains Smooth\'s Oracle and Smart Contract architecture for tracking validators and rewards."},"sidebar":"smoothSidebar","previous":{"title":"Validator States","permalink":"/docs/smooth/deep-dive-into-smooth/states"},"next":{"title":"Avoid proposing Vanilla Blocks","permalink":"/docs/smooth/deep-dive-into-smooth/vanilla-blocks"}}');var r=o(74848),a=o(28453);const n={title:"Smooth's architecture",llm_description:"Explains Smooth's Oracle and Smart Contract architecture for tracking validators and rewards."},i="Smooth's architecture",c={},h=[{value:"The Smart Contract",id:"the-smart-contract",level:2},{value:"The Oracle",id:"the-oracle",level:2}];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"smooths-architecture",children:"Smooth's architecture"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," is composed of two main components: the ",(0,r.jsx)(t.strong,{children:"Oracle"})," and the ",(0,r.jsx)(t.strong,{children:"Smart Contract"}),". These two components work together to track validators and distribute rewards fairly. Both are open source and indispensable to the functioning of ",(0,r.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),". While the Smart Contract serves to track all the events related to the pool onchain (subscriptions, unsubscriptions, block proposals, etc.), the Oracle is responsible for computing the rewards of each validator."]}),"\n",(0,r.jsx)(t.h2,{id:"the-smart-contract",children:"The Smart Contract"}),"\n",(0,r.jsxs)(t.p,{children:['Smooth\'s Smart Contract is deployed on the Ethereum mainnet and is responsible for "receiving" all the events related to the pool onchain. This includes subscriptions, unsubscriptions, block proposals, and more. Since it is the Smart Contract the one who holds all the ETH collected by the pool, it is from the Smart Contract where all ',(0,r.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," users will claim their rewards."]}),"\n",(0,r.jsxs)(t.p,{children:["Computing and storing all rewards calculations onchain would be almost impossible and very expensive, so merkle trees are used to summarize the state of all validators. This allows the Smart Contract to store a single hash onchain that represents the state of all validators subscribed to the pool. This hash is called the ",(0,r.jsx)(t.strong,{children:"Merkle Root"})," and ",(0,r.jsx)(t.strong,{children:"is computed by the Oracle"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"the-oracle",children:"The Oracle"}),"\n",(0,r.jsxs)(t.p,{children:["As mentioned before, ",(0,r.jsx)(t.strong,{children:"the Oracle is responsible for computing the rewards of each validator"}),". It does so by computing a merkle tree that summarizes the state of all validators subscribed to the pool. This merkle tree, computed offchain, is summarized into a ",(0,r.jsx)(t.strong,{children:"Merkle Root"}),"."]}),"\n",(0,r.jsx)(t.admonition,{type:"caution",children:(0,r.jsx)(t.p,{children:"Oracle works only with finalized data. This means that Oracle will effectively work with data from a few epochs ago. This is done to ensure that the data Oracle processes is non-reversible and no reorgs are possible."})}),"\n",(0,r.jsx)(t.p,{children:"Once every 28800 slots (4 days), the Oracle sends a transaction to the Smart Contract with the updated Merkle Root."}),"\n",(0,r.jsx)(t.admonition,{type:"info",children:(0,r.jsx)(t.p,{children:"It is not until the Oracle sends the transaction to the Smart Contract with the updated Merkle Root that the rewards are available to be claimed by the validators. This means that if a validator correctly proposes a block, it will not be able to claim its rewards until the Oracle sends the transaction to the Smart Contract with the updated Merkle Root."})})]})}function d(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},28453:(e,t,o)=>{o.d(t,{R:()=>n,x:()=>i});var s=o(96540);const r={},a=s.createContext(r);function n(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:n(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/20034248.08ada7c1.js b/assets/js/20034248.08ada7c1.js
new file mode 100644
index 000000000..dbe7c66c6
--- /dev/null
+++ b/assets/js/20034248.08ada7c1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8012],{27945:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"user/ethical-metrics/overview","title":"Ethical Metrics","description":"Ethical Metrics requires the Dappnode Monitoring Service (DMS) and Dappnode Exporter as dependencies.","source":"@site/docs/user/ethical-metrics/overview.md","sourceDirName":"user/ethical-metrics","slug":"/user/ethical-metrics/overview","permalink":"/docs/user/ethical-metrics/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/ethical-metrics/overview.md","tags":[],"version":"current","frontMatter":{"title":"Ethical Metrics","llm_description":"Introduces Ethical Metrics for privacy-preserving external monitoring and offline alerts via TOR."},"sidebar":"userSidebar","previous":{"title":"Premium services","permalink":"/docs/user/dappnode-premium/premium-services"},"next":{"title":"Setting up Notifications","permalink":"/docs/user/ethical-metrics/setup"}}');var o=i(74848),r=i(28453);const s={title:"Ethical Metrics",llm_description:"Introduces Ethical Metrics for privacy-preserving external monitoring and offline alerts via TOR."},a="Ethical Metrics",c={},d=[{value:"Introduction",id:"introduction",level:2}];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"ethical-metrics",children:"Ethical Metrics"})}),"\n",(0,o.jsx)(t.admonition,{type:"note",children:(0,o.jsxs)(t.p,{children:["Ethical Metrics requires the ",(0,o.jsx)(t.a,{href:"/docs/user/packages/dms",children:"Dappnode Monitoring Service (DMS)"})," and Dappnode Exporter as dependencies."]})}),"\n",(0,o.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,o.jsxs)(t.p,{children:["When it comes to monitoring your Dappnode, the ",(0,o.jsx)(t.a,{href:"/docs/user/packages/dms",children:"Dappnode Monitoring Service (DMS)"})," offers valuable insights into the health and performance of your packages and system. Yet, there's a key thing that DMS can't do: ",(0,o.jsx)(t.strong,{children:"DMS can't notify you when your Dappnode goes offline"}),". This limitation arises because DMS operates from within your Dappnode, so it can't help when it experiences downtime."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"Ethical Metrics solves this DMS limitation."})," It is a service that allows for external monitoring of your Dappnode ",(0,o.jsx)(t.strong,{children:"without leaking any identifying information"}),". This way, you will be able to receive notifications when your Dappnode goes offline."]}),"\n",(0,o.jsx)(t.admonition,{type:"info",children:(0,o.jsx)(t.p,{children:"Ethical Metrics comes from the request of the users to have useful alerts and the strict compromise of Dappnode of preserving privacy for its users."})}),"\n",(0,o.jsxs)(t.p,{children:["So, how did we manage to overcome the difficulty of monitoring your Dappnode without compromising your privacy? In order to keep your privacy intact, ",(0,o.jsx)(t.strong,{children:"all the communication between your Dappnode and our monitoring servers is done through the TOR network"}),". The TOR network enables anonymous communication by directing Internet traffic through a free, worldwide, volunteered overlay network that consists of more than seven thousand relays."]}),"\n",(0,o.jsx)(t.admonition,{type:"tip",children:(0,o.jsx)(t.p,{children:"In a nutshell, your Dappnode signals that it's alive via a private channel so we don't know where it comes from. If it stops sending this signal, we can assume that it's offline and send an alert to the Email or Telegram associated with that particular Dappnode. This way, your Dappnode's IP address remains hidden and nobody (not even us) can identify which metrics belong to whom."})}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"To put it simply:"})," Ethical Metrics enables us to monitor a group of Dappnode metrics for you. In the event that your Dappnode goes offline, Ethical Metrics can send notifications to an email address or Telegram handle that you provide during configuration. All this communication occurs via the TOR network, which guarantees the protection of your Dappnode's IP address and the confidentiality of your metrics."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"setup-5",src:i(40265).A+"",width:"1872",height:"1001"})}),"\n",(0,o.jsx)(t.admonition,{type:"info",children:(0,o.jsx)(t.p,{children:"Ethical metrics is one of our newest packages and it is still under constant improvement. Please come back to this page to check for updates."})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},40265:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/ethical-metrics-5c8cad2d72b6475a0294c8f482a49b3a.png"},28453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var n=i(96540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2057bc77.beef3457.js b/assets/js/2057bc77.beef3457.js
new file mode 100644
index 000000000..550374d14
--- /dev/null
+++ b/assets/js/2057bc77.beef3457.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[586],{6252:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>s,default:()=>c,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"user/hardware/maintenance","title":"Maintenance","description":"This section will cover four different approaches to servicing your hardware. The order is by level of difficulty from easiest to hardest. Remember that if you have any questions they\'re always welcome in our Discord server.","source":"@site/docs/user/hardware/maintenance.md","sourceDirName":"user/hardware","slug":"/user/hardware/maintenance","permalink":"/docs/user/hardware/maintenance","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/hardware/maintenance.md","tags":[],"version":"current","frontMatter":{"title":"Maintenance","llm_description":"Hardware maintenance tips: airflow, dust cleaning, and thermal paste replacement procedures."},"sidebar":"userSidebar","previous":{"title":"Overview","permalink":"/docs/user/hardware/overview"},"next":{"title":"Temperature","permalink":"/docs/user/hardware/temperature"}}');var n=a(74848),o=a(28453);const i={title:"Maintenance",llm_description:"Hardware maintenance tips: airflow, dust cleaning, and thermal paste replacement procedures."},s="Maintenance",h={},d=[{value:"1. Air Flow",id:"1-air-flow",level:3},{value:"2. Dust cleaning",id:"2-dust-cleaning",level:3},{value:"3. Thermal Paste Change",id:"3-thermal-paste-change",level:3}];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",h3:"h3",header:"header",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"maintenance",children:"Maintenance"})}),"\n",(0,n.jsxs)(t.p,{children:["This section will cover four different approaches to servicing your hardware. The order is by level of difficulty from easiest to hardest. Remember that if you have any questions they're always welcome in our ",(0,n.jsx)(t.a,{href:"https://discord.gg/dappnode",children:"Discord server"}),"."]}),"\n",(0,n.jsx)(t.admonition,{type:"info",children:(0,n.jsx)(t.p,{children:"\ud83d\udca1 Keep in mind these have different levels of difficulty, and if you're hesitant about trying them you should find a professional to give you a hand. Hardware is delicate and if mishandled it can cause permanent damage to your Dappnode, so proceed with caution."})}),"\n",(0,n.jsx)(t.h3,{id:"1-air-flow",children:"1. Air Flow"}),"\n",(0,n.jsxs)(t.p,{children:["One of the key elements to keep your Dappnode's performance optimal is where you place it. There's this myth about air conditioning or cool air being able to lower your devices' temperatures, however constant ",(0,n.jsx)(t.strong,{children:"air flow"})," is much more important than the temperature of the air itself. We recommend picking a place for your Dappnode that will favor this, and where the heat it produces won't stay in the same room and raise the atmosphere temperature. An open room with windows is great for this, so you should avoid closets or small storage rooms. If your Dappnode is still struggling to keep its temperature low, try removing the upper lid. It won't look as pretty, but it'll get the job done!"]}),"\n",(0,n.jsx)(t.h3,{id:"2-dust-cleaning",children:"2. Dust cleaning"}),"\n",(0,n.jsx)(t.p,{children:"Dust is the enemy of electronics. It can cause overheating and short circuits, so it's important to keep your Dappnode clean. The best way to do this is by using a can of compressed air (also called air dusters), which you can find in any hardware store."}),"\n",(0,n.jsx)(t.p,{children:"These cans are very helpful to get your Dappnode's insides clean. You can do this by carefully oppening the bottom metal lid. Loosen its four screws and be specially careful when lifting it, as there's a SATA ribbon cable attached to the NUC's board and the metal lid that can be damaged if handled roughly."}),"\n",(0,n.jsx)(t.p,{children:"For diving into the actual cleaning of your Dappnode, try to be in an outside location when performing this dust cleaning process. Keep your Dappnode safe from humidity or extreme direct temperatures. Carefully place the can of duster in a vertical position for starting the cleaning process. Always point the airstream somewhere other than your device when starting to use it, as these release liquid for a brief period of time sometimes. After you've made sure the duster is working as expected, start blowing at the smaller spaces in the board and gradually moving to the more general area of your hardware without getting the tip of the duster to close to the circuits. Make sure the fans don't have big chunks of dust that prevent them from working properly."}),"\n",(0,n.jsx)(t.p,{children:"When done, put the bottom metal lid back on and screw it back without leaving it too tight."}),"\n",(0,n.jsx)(t.h3,{id:"3-thermal-paste-change",children:"3. Thermal Paste Change"}),"\n",(0,n.jsx)(t.p,{children:"Your CPU has a heatsink right above it that helps dissipate heat. To facilitate this transfer of heat effectively, thermal paste is applied between the CPU's top plate and the heatsink. Over time, the thermal paste can degrade or dry out, leading to reduced thermal conductivity and potentially higher operating temperatures for the CPU."}),"\n",(0,n.jsxs)(t.p,{children:["To replace the thermal paste, start by powering down your dappnode, removing the heatsink, and cleaning both the CPU surface and the heatsink thoroughly with rubbing alcohol. Then, apply a small amount of fresh thermal paste onto the center of the CPU (Be careful not to use too much, as excess paste can lead to inefficient heat transfer), reattach the heatsink carefully, and ensure all connections are secure before powering it back on. Monitoring temperatures post-replacement ensures optimal performance and cooling efficiency. You can learn how to monitor it in ",(0,n.jsx)(t.a,{href:"/docs/user/hardware/temperature",children:(0,n.jsx)(t.strong,{children:"Temperature"})})," section."]})]})}function c(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},28453:(e,t,a)=>{a.d(t,{R:()=>i,x:()=>s});var r=a(96540);const n={},o=r.createContext(n);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/22a3df87.098e1916.js b/assets/js/22a3df87.098e1916.js
new file mode 100644
index 000000000..1ec58ba8c
--- /dev/null
+++ b/assets/js/22a3df87.098e1916.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[2170],{31354:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"user/install/script","title":"Script installation","description":"You can install Dappnode using the installation script. In this case, we recommend you use Ubuntu or Debian as your operating system.","source":"@site/docs/user/install/script.md","sourceDirName":"user/install","slug":"/user/install/script","permalink":"/docs/user/install/script","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/install/script.md","tags":[],"version":"current","frontMatter":{"title":"Script installation","llm_description":"Install Dappnode via bash script on Debian/Ubuntu, including prerequisites and update commands."},"sidebar":"userSidebar","previous":{"title":"ISO","permalink":"/docs/user/install/iso"},"next":{"title":"ARM","permalink":"/docs/user/install/arm"}}');var i=t(74848),a=t(28453);const o={title:"Script installation",llm_description:"Install Dappnode via bash script on Debian/Ubuntu, including prerequisites and update commands."},l="Script installation",r={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Install Dappnode",id:"install-dappnode",level:2},{value:"Reboot",id:"reboot",level:2},{value:"Restore to the latest version",id:"restore-to-the-latest-version",level:2},{value:"Uninstall",id:"uninstall",level:2}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"script-installation",children:"Script installation"})}),"\n",(0,i.jsx)(n.p,{children:"You can install Dappnode using the installation script. In this case, we recommend you use Ubuntu or Debian as your operating system."}),"\n",(0,i.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsx)(n.p,{children:"Before installing Dappnode, you need to install some prerequisites:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://docs.docker.com/install/",children:"Docker"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"Docker-compose"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://packages.debian.org/sid/xz-utils",children:"xz"})}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"To install all the above prerequisites, execute the command below in the terminal of the machine you want to install Dappnode. If you already have the dependencies installed or you want to install them on your own you can skip this step."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo wget -O - https://prerequisites.dappnode.io | sudo bash\n"})}),"\n",(0,i.jsx)(n.h2,{id:"install-dappnode",children:"Install Dappnode"}),"\n",(0,i.jsx)(n.p,{children:"To install Dappnode, execute the next script:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo wget -O - https://installer.dappnode.io | sudo bash\n"})}),"\n",(0,i.jsx)(n.h2,{id:"reboot",children:"Reboot"}),"\n",(0,i.jsx)(n.p,{children:"To finalize the installation once it has finished completing, reboot your machine (you might need to do this twice):"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"shutdown -r now\n"})}),"\n",(0,i.jsx)(n.h2,{id:"restore-to-the-latest-version",children:"Restore to the latest version"}),"\n",(0,i.jsx)(n.p,{children:"If you are experiencing any problem or just want to make sure you are running the latest Dappnode versions, execute this command in the Dappnode terminal. This will update the core packages to the latest versions without erasing any data from your volumes."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo wget -O - https://installer.dappnode.io | sudo UPDATE=true bash\n"})}),"\n",(0,i.jsx)(n.h2,{id:"uninstall",children:"Uninstall"}),"\n",(0,i.jsx)(n.p,{children:"This command will uninstall Dappnode components (but not docker et al.)."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"wget -qO - https://uninstaller.dappnode.io | sudo bash\n"})})]})}function p(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var s=t(96540);const i={},a=s.createContext(i);function o(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/25229465.48d1e06f.js b/assets/js/25229465.48d1e06f.js
new file mode 100644
index 000000000..6ca68aef1
--- /dev/null
+++ b/assets/js/25229465.48d1e06f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8384],{25910:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"user/ethical-metrics/metrics","title":"Metrics Collected by Ethical Metrics","description":"Dappnode has absolutely no hidden telemetry and is completely private by design. We were reluctant of setting up a monitoring service because we did NOT want to collect any data from our users. Because of our community\'s continuous requests to offer alerts, we came up with a solution that doesn\'t compromise your privacy.","source":"@site/docs/user/ethical-metrics/metrics.md","sourceDirName":"user/ethical-metrics","slug":"/user/ethical-metrics/metrics","permalink":"/docs/user/ethical-metrics/metrics","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/ethical-metrics/metrics.md","tags":[],"version":"current","frontMatter":{"title":"Metrics Collected by Ethical Metrics","llm_description":"Lists all metrics collected by Ethical Metrics: host, Dappmanager, and staking metrics via TOR."},"sidebar":"userSidebar","previous":{"title":"Setting up Notifications","permalink":"/docs/user/ethical-metrics/setup"},"next":{"title":"Troubleshooting","permalink":"/docs/user/ethical-metrics/troubleshooting"}}');var t=s(74848),r=s(28453);const o={title:"Metrics Collected by Ethical Metrics",llm_description:"Lists all metrics collected by Ethical Metrics: host, Dappmanager, and staking metrics via TOR."},c="Metrics Collected by Ethical Metrics",a={},l=[{value:"Dappnode host metrics",id:"dappnode-host-metrics",level:2},{value:"Dappmanager metrics",id:"dappmanager-metrics",level:2},{value:"Staking Metrics",id:"staking-metrics",level:2}];function d(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"metrics-collected-by-ethical-metrics",children:"Metrics Collected by Ethical Metrics"})}),"\n",(0,t.jsx)(n.p,{children:"Dappnode has absolutely no hidden telemetry and is completely private by design. We were reluctant of setting up a monitoring service because we did NOT want to collect any data from our users. Because of our community's continuous requests to offer alerts, we came up with a solution that doesn't compromise your privacy."}),"\n",(0,t.jsxs)(n.p,{children:["Even if we can't link the metrics from your Dappnode to your identity, ",(0,t.jsx)(n.strong,{children:"we are fully committed to maintain total transparency about the metrics we collect from your Dappnode when using Ethical Metrics"}),". We want you to have a clear understanding of the information that is being monitored. The metrics we collect fall into several categories. Here's an overview of the metrics we gather."]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsx)(n.p,{children:"These metrics also help us better allocate resources by knowing what our users are running on their Dappnodes. This way, we can better understand which packages are the most popular and which ones need improvement."})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsx)(n.p,{children:"Ethical Metrics is one of our newest packages and it is still under constant improvement. This section will be updated as we add or remove metrics."})}),"\n",(0,t.jsx)(n.h2,{id:"dappnode-host-metrics",children:"Dappnode host metrics"}),"\n",(0,t.jsx)(n.p,{children:"These are all the metrics related directly to the host machine running your Dappnode. All of these metrics are collected by the Dappnode Exporter package."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"node_cpu_seconds_total"}),": Total CPU usage in seconds by the node."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"container_memory_usage_bytes"}),": Memory usage in bytes by containers."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"container_memory_cache"}),": Memory cache usage by containers."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"node_memory_MemTotal_bytes"}),": Total memory available in bytes on the node."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"node_memory_MemFree_bytes"}),": Free memory in bytes on the node."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"node_memory_Buffers_bytes"}),": Memory used for buffers in bytes on the node."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"node_memory_Cached_bytes"}),": Cached memory in bytes on the node."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"node_disk_io_time_seconds_total"}),": Total disk I/O time in seconds on the node."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"node_disk_reads_completed_total"}),": Total completed disk reads on the node."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"node_disk_writes_completed_total"}),": Total completed disk writes on the node."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"container_fs_usage_bytes"}),": Filesystem usage by containers in bytes."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"node_filesystem_size_bytes"}),": Total size of the filesystem in bytes on the node."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"node_filesystem_free_bytes"}),": Free space in the filesystem in bytes on the node."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"container_last_seen"}),": Timestamp of the last seen container."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"cadvisor_version_info"}),": Information about the cAdvisor version."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"container_cpu_usage_seconds_total"}),": Total CPU usage in seconds by containers."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"dappmanager-metrics",children:"Dappmanager metrics"}),"\n",(0,t.jsx)(n.p,{children:"The following are all the metrics related to your Dappnode's configuration. These are all stored in your Dappmanager."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"dappmmanager_staker_config"}),": Your current staking package."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"dappmanager_ipfs_client_target_local"}),": Whether IPFS client is in local or remote mode."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"dappmanager_eth_fallback_enabled"}),": Whether the ethereum fallback client is enabled."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"dappmanager_eth_client_target_local"}),": Whether ethereum client is in local or remote mode."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"dappmanager_auto_updates_user_packages"}),": Whether auto updates for user packages is enabled."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"dappmanager_auto_updates_system_packages"}),": Whether auto updates for system packages is enabled."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"dappmanager_host_info"}),": Details including Docker and Docker Compose versions, kernel version, operating system version, and architecture type."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"staking-metrics",children:"Staking Metrics"}),"\n",(0,t.jsx)(n.p,{children:"The following metrics are all related directly to the staking packages, including Web3Signer."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"eth2_slashingprotection_prevented_signings"}),": Number of prevented slashing signings."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"signing_signers_loaded_count"}),": Count of loaded validators signing in web3signer."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"signing_bls_signing_duration"}),": Duration of BLS signing."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"signing_bls_signing_duration_count"}),": Count of BLS signing durations."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"signing_bls_signing_duration_sum"}),": Sum of BLS signing durations."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"signing_bls_missing_identifier_count"}),": Count of missing BLS identifier."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"api_rpc_cons_peers"}),": Number of connected peers to your staking execution clients."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"api_rpc_exec_peers"}),": Number of connected peers to your staking consensus clients."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"api_rpc_cons_syncing"}),": Whether your staking execution clients are syncing."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"api_rpc_exec_syncing"}),": Whether your staking consensus clients are syncing."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"To sum it up, the metrics we collect give us a peek into how your Dappnode is doing overall, how it allocates resources, memory, disk, and even info related to staking performance."}),"\n",(0,t.jsx)(n.p,{children:"Your privacy is of utmost importance to us. Remember that all this data transmission occurs through the TOR network to protect your privacy."}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsx)(n.p,{children:"For any questions or concerns about the metrics collected by Ethical Metrics, feel free to reach out to our support team."})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>c});var i=s(96540);const t={},r=i.createContext(t);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/29689ead.8a3dc990.js b/assets/js/29689ead.8a3dc990.js
new file mode 100644
index 000000000..a6aafcae4
--- /dev/null
+++ b/assets/js/29689ead.8a3dc990.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[3619],{48502:(o,e,t)=>{t.r(e),t.d(e,{assets:()=>r,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"smooth/deep-dive-into-smooth/vanilla-blocks","title":"What is a vanilla block?","description":"What is a vanilla block?","source":"@site/docs/smooth/deep-dive-into-smooth/vanilla-blocks.md","sourceDirName":"smooth/deep-dive-into-smooth","slug":"/smooth/deep-dive-into-smooth/vanilla-blocks","permalink":"/docs/smooth/deep-dive-into-smooth/vanilla-blocks","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/smooth/deep-dive-into-smooth/vanilla-blocks.md","tags":[],"version":"current","frontMatter":{"title":"What is a vanilla block?","llm_description":"Explains vanilla blocks and why MEV blocks are required; 3 vanilla blocks leads to ban."},"sidebar":"smoothSidebar","previous":{"title":"Oracle & Smart Contract","permalink":"/docs/smooth/deep-dive-into-smooth/oracle-sm"},"next":{"title":"Validator Consolidations In Smooth","permalink":"/docs/smooth/deep-dive-into-smooth/consolidations"}}');var n=t(74848),i=t(28453);const s={title:"What is a vanilla block?",llm_description:"Explains vanilla blocks and why MEV blocks are required; 3 vanilla blocks leads to ban."},l=void 0,r={},c=[];function d(o){const e={a:"a",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",...(0,i.R)(),...o.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:"What is a vanilla block?"})}),"\n",(0,n.jsx)(e.p,{children:"In the context of the Smooth protocol, we define a vanilla block as a block build locally by the execution client, as opposed to a block built by professional block builders with sofisticated algorithms for extracting MEV and sometimes private transactions that do not appear in the mempool."}),"\n",(0,n.jsx)(e.p,{children:"While building blocks locally is a perfectly valid option for validators, it is one that doesn't serve to maximize the profit that can be extracted from proposing that block. Since the goal of Smooth as a MEV smoothing pool is to use these MEV rewards to maximize high and consistent rewards, proposing vanilla blocks into the pool is suboptimal."}),"\n",(0,n.jsx)(e.p,{children:"Those wishing to build their own blocks locally when they propose a block are free to do so, but outside of Smooth."}),"\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.strong,{children:"Why proposing a Vanilla block is not beneficial for you?"}),"\nAs a Smooth user, your goal is to maximize your rewards. Proposing a vanilla block can hinder this objective for several reasons:"]}),"\n",(0,n.jsxs)(e.ol,{children:["\n",(0,n.jsx)(e.li,{children:"Lower Rewards: Vanilla blocks generally include less transaction fees for the block builder (or for the smoothing pool) because blocks built by professional operators include custom algorithms for reordering transactions, inject transactions to extract value (front-running and back-running) and potentially have access to transactions coming via private channels that do not appear in the mempool. Hence, without these algorithms, capital to take advantage of the arbitrage opportunities and value extraction and private flow of transactions, it will almost always be less profitable to build a vanilla block."}),"\n"]}),"\n",(0,n.jsx)(e.p,{children:'Then, if a vanilla block is almost assured to propose lower rewards than an MEV block, a validator proposing vanilla blocks is capping the amount that they can contribute to the pool while enjoying the smoothing from blocks that are not capped from the rest of the participants in the pool. These validators can be considered "free riders" because they contribute less than what they get from the pool.'}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:"How can you avoid to propose a Vanilla block?"})}),"\n",(0,n.jsx)(e.p,{children:"Update Your Node Configuration: If you are running a validator in Smooth, make sure that your configuration is up to date and that the MEV boost module is enabled. You can go to the Stakers tab in the Dappmanager and activate the relays in the MEV boost section. It is highly recommended to activate all the relays to ensure that one of them is building your block and therefore optimizing your rewards."}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{alt:"MEVboost",src:t(57335).A+"",width:"1438",height:"786"})}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:"How does Smooth act on Vanilla blocks?"})}),"\n",(0,n.jsxs)(e.p,{children:["In order to maximize the rewards for all the participants in Smooth, vanilla block proposers will be banned after 3 consecutive vanilla blocks proposed if they had the chance to be MEV blocks/had MEV opportunity.\nThis banning process requires a voting phase by the SmoothDAO to effectively ban the withdrawal address of the validator. You can read more about it ",(0,n.jsx)(e.a,{href:"https://snapshot.box/#/s:dao.smooth.dappnode.eth/proposal/0xddd71930ac1a2876cc7e012861320a19b24fc2c4cc8289060c626737413251a3",children:"here"})]})]})}function h(o={}){const{wrapper:e}={...(0,i.R)(),...o.components};return e?(0,n.jsx)(e,{...o,children:(0,n.jsx)(d,{...o})}):d(o)}},57335:(o,e,t)=>{t.d(e,{A:()=>a});const a=t.p+"assets/images/MEV_boost-e13c7e0f9042dd694001114f37f4d067.png"},28453:(o,e,t)=>{t.d(e,{R:()=>s,x:()=>l});var a=t(96540);const n={},i=a.createContext(n);function s(o){const e=a.useContext(i);return a.useMemo((function(){return"function"==typeof o?o(e):{...e,...o}}),[e,o])}function l(o){let e;return e=o.disableParentContext?"function"==typeof o.components?o.components(n):o.components||n:s(o.components),a.createElement(i.Provider,{value:e},o.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2a82f816.8815fc7b.js b/assets/js/2a82f816.8815fc7b.js
new file mode 100644
index 000000000..1ee4d70b8
--- /dev/null
+++ b/assets/js/2a82f816.8815fc7b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[3057],{37541:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>t,contentTitle:()=>c,default:()=>o,frontMatter:()=>d,metadata:()=>i,toc:()=>h});const i=JSON.parse('{"id":"dev/references/manifest","title":"Dappnode Package (DNP) manifest","description":"The Dappnode Package manifest defines all the necessary information for a Dappnode to understand this package:","source":"@site/docs/dev/references/manifest.md","sourceDirName":"dev/references","slug":"/dev/references/manifest","permalink":"/docs/dev/references/manifest","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/references/manifest.md","tags":[],"version":"current","frontMatter":{"title":"Dappnode Package (DNP) manifest","llm_description":"Complete reference for dappnode_package.json manifest file properties."},"sidebar":"devSidebar","previous":{"title":"Docker Compose","permalink":"/docs/dev/references/docker-compose"},"next":{"title":"Setup Wizard","permalink":"/docs/dev/references/setup-wizard"}}');var r=s(74848),l=s(28453);const d={title:"Dappnode Package (DNP) manifest",llm_description:"Complete reference for dappnode_package.json manifest file properties."},c="Dappnode Package (DNP) manifest",t={},h=[{value:"Example",id:"example",level:2},{value:"Properties reference",id:"properties-reference",level:2},{value:"name",id:"name",level:3},{value:"version",id:"version",level:3},{value:"upstreamVersion",id:"upstreamversion",level:3},{value:"shortDescription",id:"shortdescription",level:3},{value:"description",id:"description",level:3},{value:"type",id:"type",level:3},{value:"chain",id:"chain",level:3},{value:"mainService",id:"mainservice",level:3},{value:"dockerTimeout",id:"dockertimeout",level:3},{value:"dependencies",id:"dependencies",level:3},{value:"requirements",id:"requirements",level:3},{value:"minimumDappnodeVersion",id:"minimumdappnodeversion",level:4},{value:"globalEnvs",id:"globalenvs",level:3},{value:"all",id:"all",level:4},{value:"architectures",id:"architectures",level:3},{value:"backup",id:"backup",level:3},{value:"name",id:"name-1",level:4},{value:"path",id:"path",level:4},{value:"service",id:"service",level:4},{value:"changelog",id:"changelog",level:3},{value:"warnings",id:"warnings",level:3},{value:"onInstall",id:"oninstall",level:4},{value:"onUpdate",id:"onupdate",level:4},{value:"onReset",id:"onreset",level:4},{value:"onRemove",id:"onremove",level:4},{value:"updateAlerts",id:"updatealerts",level:3},{value:"from",id:"from",level:4},{value:"to",id:"to",level:4},{value:"message",id:"message",level:4},{value:"disclaimer",id:"disclaimer",level:3},{value:"message",id:"message-1",level:4},{value:"style",id:"style",level:3},{value:"featuredBackground",id:"featuredbackground",level:4},{value:"featuredColor",id:"featuredcolor",level:4},{value:"featuredAvatarFilter",id:"featuredavatarfilter",level:4},{value:"exposable",id:"exposable",level:3},{value:"name",id:"name-2",level:4},{value:"description",id:"description-1",level:4},{value:"serviceName",id:"servicename",level:4},{value:"port",id:"port",level:4},{value:"author",id:"author",level:3},{value:"contributors",id:"contributors",level:3},{value:"categories",id:"categories",level:3},{value:"keywords",id:"keywords",level:3},{value:"links",id:"links",level:3},{value:"homepage",id:"homepage",level:4},{value:"ui",id:"ui",level:4},{value:"api",id:"api",level:4},{value:"gateway",id:"gateway",level:4},{value:"repository",id:"repository",level:3},{value:"type",id:"type-1",level:4},{value:"url",id:"url",level:4},{value:"directory",id:"directory",level:4},{value:"bugs",id:"bugs",level:3},{value:"url",id:"url-1",level:4},{value:"license",id:"license",level:3}];function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"dappnode-package-dnp-manifest",children:"Dappnode Package (DNP) manifest"})}),"\n",(0,r.jsx)(n.p,{children:"The Dappnode Package manifest defines all the necessary information for a Dappnode to understand this package:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"IPFS of BZZ hashes to download its docker image"}),"\n",(0,r.jsx)(n.li,{children:"Docker related data to configure and run its container"}),"\n",(0,r.jsx)(n.li,{children:"Metadata to control how the package is shown in the admin UI."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"example",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "name": "ipfs.dnp.dappnode.eth",\n "version": "0.2.0",\n "upstreamVersion": "2.6.0-beta",\n "shortDescription": "Distributed file system for storing and accessing data.",\n "description": "Welcome! IPFS is a distributed system for storing and accessing files, websites, applications, and data. If you\u2019re new to IPFS, check our [introductory page](https://ipfs.io/#why) for an easy overview. \\n\\nWith this node you can upload and download files from IPFS using it own fancy web console at [http://ipfs.dappnode:5001/webui](http://ipfs.dappnode:5001/webui). Other Dappnode Packages and external applications can use its API at the endpoint `http://ipfs.dappnode:5001/api`. Go to the [IPFS HTTP API full reference](https://docs.ipfs.io/reference/api/http/) to check all the features of the API.",\n "type": "service",\n "chain": "ethereum",\n "mainService": "webserver",\n "dockerTimeout": "5min",\n "dependencies": {\n "bitcoin.dnp.dappnode.eth": "^0.1.2",\n "swarm.dnp.dappnode.eth": "latest"\n },\n "requirements": {\n "minimumDappnodeVersion": "0.2.0"\n },\n "globalEnvs": {\n "all": "true"\n },\n "architectures": ["linux/amd64", "linux/arm64"],\n "backup": [\n {\n "name": "keystore",\n "path": "/root/.raiden/secret/keystore",\n "service": "validator"\n }\n ],\n "changelog": "Brief summary of the most relevant changes that the user must known before installing",\n "warnings": {\n "onInstall": "You must set the PASSWORD ENV before installing the Dappnode Package in order for the setup to work correctly.",\n "onUpdate": "Your VPN connection will be lost when the VPN finalizes updating. Leave 1-2 minutes after executing the update and then reconnect and refresh this site.",\n "onReset": "You MUST properly close your open channels before resetting this Dappnode Package or you may lose your funds.",\n "onRemove": "You MUST properly close your open channels before removing this Dappnode Package or you may lose your funds."\n },\n "updateAlerts": [\n {\n "from": "0.1.x",\n "to": "0.1.x",\n "message": "Major update to OpenVPN: This update breaks compatibility with the last VPN version. Please read the migration guide: https://migration020.dappnode.io"\n }\n ],\n "disclaimer": {\n "message": "This software is experimental, presented \u201cas is\u201d and inherently carries risks."\n },\n "style": {\n "featuredBackground": "linear-gradient(to right, #323131, #395353)",\n "featuredColor": "white",\n "featuredAvatarFilter": "invert(1)"\n },\n "exposable": [\n {\n "name": "Geth JSON RPC",\n "description": "JSON RPC endpoint for Geth mainnet",\n "serviceName": "beacon_chain",\n "port": 80\n }\n ],\n "author": "Dappnode Association (https://github.com/dappnode)",\n "contributors": [\n "Michael First (https://github.com/developerHanlder)",\n "Michael Second (https://github.com/developerHanlder)"\n ],\n "categories": ["Developer tools", "Blockchain"],\n "keywords": ["DappnodeCore"],\n "links": {\n "homepage": "https://github.com/dappnode/DNP_IPFS#readme",\n "ui": "http://ipfs.dappnode:5001/webui",\n "api": "http://ipfs.dappnode:5001/api/v0",\n "gateway": "http://ipfs.dappnode:8080/ipfs"\n },\n "repository": {\n "type": "git",\n "url": "https://github.com/dappnode/DNP_IPFS.git",\n "directory": "packages/react-dom"\n },\n "bugs": {\n "url": "https://github.com/dappnode/DNP_IPFS/issues"\n },\n "license": "GPL-3.0"\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"properties-reference",children:"Properties reference"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#name",children:"name"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"string"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Required"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#version",children:"version"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"string"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Required"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#upstreamversion",children:"upstreamVersion"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#shortdescription",children:"shortDescription"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#description",children:"description"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"string"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Required"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#type",children:"type"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"enum"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Required"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#chain",children:"chain"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"enum"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#mainservice",children:"mainService"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#dockertimeout",children:"dockerTimeout"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#dependencies",children:"dependencies"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"object"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#requirements",children:"requirements"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"object"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#globalenvs",children:"globalEnvs"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"object"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#architectures",children:"architectures"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"enum[]"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#backup",children:"backup"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"object[]"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#changelog",children:"changelog"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#warnings",children:"warnings"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"object"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#updatealerts",children:"updateAlerts"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"object[]"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#disclaimer",children:"disclaimer"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"object"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#style",children:"style"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"object"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#exposable",children:"exposable"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"object[]"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#author",children:"author"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#contributors",children:"contributors"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"string[]"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#categories",children:"categories"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"enum[]"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#keywords",children:"keywords"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"string[]"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#links",children:"links"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"object"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#repository",children:"repository"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"object"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#bugs",children:"bugs"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"object"})}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"#license",children:"license"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"string"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Required"})})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"name",children:"name"}),"\n",(0,r.jsx)(n.p,{children:"Dappnode Package ENS name."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["is ",(0,r.jsx)(n.strong,{children:"required"})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"ipfs.dnp.dappnode.eth"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"version",children:"version"}),"\n",(0,r.jsx)(n.p,{children:"Dappnode Package semantic version (semver)."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["is ",(0,r.jsx)(n.strong,{children:"required"})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"All instances must conform to this regular expression"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-regex",children:"^((([0-9]+).([0-9]+).([0-9]+)))$\n"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["test example:\n",(0,r.jsx)(n.a,{href:"https://regexr.com/?expression=%5E(((%5B0-9%5D%2B).(%5B0-9%5D%2B).(%5B0-9%5D%2B)))%24&text=0.2.0",children:"0.2.0"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"0.2.0"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"upstreamversion",children:"upstreamVersion"}),"\n",(0,r.jsxs)(n.p,{children:["For Dappnode Packages that only wrap existing software (i.e. Bitcoin node, Ethereum node), the underlying software\nversion can be specified here. It will be shown in the admin UI alongside the field ",(0,r.jsx)(n.code,{children:"version"}),"."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Examples:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"2.6.0-beta"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"any-text"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"shortdescription",children:"shortDescription"}),"\n",(0,r.jsx)(n.p,{children:"Short Dappnode Package description, 6-8 words sentence briefly describing the purpose of this Dappnode Package. The\npurpose is to quickly grab users' attention and clearly define its purpose. Markdown is discouraged as it will NOT be\nrendered on the Dappnode Package store view."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"Distributed file system for storing and accessing data."\n'})}),"\n",(0,r.jsx)(n.h3,{id:"description",children:"description"}),"\n",(0,r.jsx)(n.p,{children:"Dappnode Package description. Markdown and links are allowed and ecouraged to give users the option to read more\ninformation about this Dappnode Package."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["is ",(0,r.jsx)(n.strong,{children:"required"})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"Welcome! IPFS is a distributed system for storing and accessing files, websites, applications, and data. If you\u2019re new to IPFS, check our [introductory page](https://ipfs.io/#why) for an easy overview. \\n\\nWith this node you can upload and download files from IPFS using it own fancy web console at [http://ipfs.dappnode:5001/webui](http://ipfs.dappnode:5001/webui). Other Dappnode Packages and external applications can use its API at the endpoint `http://ipfs.dappnode:5001/api`. Go to the [IPFS HTTP API full reference](https://docs.ipfs.io/reference/api/http/) to check all the features of the API."\n'})}),"\n",(0,r.jsx)(n.h3,{id:"type",children:"type"}),"\n",(0,r.jsx)(n.p,{children:"Type of this Dappnode Package. It is used to trigger some special features such as core functionality."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["is ",(0,r.jsx)(n.strong,{children:"required"})]}),"\n",(0,r.jsxs)(n.li,{children:["default: ",(0,r.jsx)(n.code,{children:'"service"'})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["The value of this property ",(0,r.jsx)(n.strong,{children:"must"})," be equal to one of the known values below."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Value"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"service"})}),(0,r.jsx)(n.td,{children:"Can have ENVs a depend on library Dappnode Packages"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"library"})}),(0,r.jsx)(n.td,{children:"Should not have ENVs and cannot depend on service Dappnode Packages"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"dncore"})}),(0,r.jsx)(n.td,{children:"Dappnode Packages that are part of the Dappnode core and have special permissions"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Examples:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"service"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"dncore"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"chain",children:"chain"}),"\n",(0,r.jsx)(n.p,{children:"Indicate that this Dappnode Package is a blockchain node so the admin UI shows its syncing status"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["The value of this property ",(0,r.jsx)(n.strong,{children:"must"})," be equal to one of the known values below."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Value"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"ethereum"})}),(0,r.jsx)(n.td,{children:"Must have an Ethereum JSON RPC exposed internally at port 8545"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"bitcoin"})}),(0,r.jsxs)(n.td,{children:["Must have a standard Bitcoin JSON API exposed at the default port (8332). Uses the NPM package ",(0,r.jsx)(n.code,{children:"bitcoin-core"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"monero"})}),(0,r.jsxs)(n.td,{children:["Must have a Monero API exposed internally at port 18081. Uses the NPM package ",(0,r.jsx)(n.code,{children:"monero-rpc"})]})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Examples:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"ethereum"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"bitcoin"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"monero"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"mainservice",children:"mainService"}),"\n",(0,r.jsx)(n.p,{children:"For multi-service packages, indicate which service is the main one. The root ENS domain of this package will be mapped\nto this service IP."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Examples:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"webserver"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"backend"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"service1"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"dockertimeout",children:"dockerTimeout"}),"\n",(0,r.jsxs)(n.p,{children:["Modify the default Docker timeout of 10 seconds. It affects package updates, removals, container restarts, start and\nstop, updating config environments and port mappings. You can either pass a numerical value in seconds or a string\nrepresentation parsed with ",(0,r.jsx)(n.a,{href:"http://npmjs.com/package/timestring",children:"timestring"}),". Available from DAPPMANAGER v0.2.36"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Examples:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"5min"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"60"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"dependencies",children:"dependencies"}),"\n",(0,r.jsxs)(n.p,{children:["Dappnode Package dependencies. Must be an object where the keys are the Dappnode Package's ENS. The values must be a\nsemantic range, i.e. ",(0,r.jsx)(n.code,{children:"'0.2.0'"}),", ",(0,r.jsx)(n.code,{children:"'^0.2.1'"}),", ",(0,r.jsx)(n.code,{children:"'*'"}),", ",(0,r.jsx)(n.code,{children:"'latest'"}),",\n",(0,r.jsx)(n.code,{children:"'/ipfs/QmWwMb3XhuCH6JnCF6m6EQzA4mW9pHHtg7rqAfhDr2ofi8'"}),"."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"object"})," with the following properties:"]}),"\n"]}),"\n",(0,r.jsx)(n.table,{children:(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"})]})})}),"\n",(0,r.jsx)(n.p,{children:"Examples:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "bitcoin.dnp.dappnode.eth": "^0.1.2",\n "swarm.dnp.dappnode.eth": "latest"\n}\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "only-for-dev-1.dappnode.eth": "/ipfs/QmYjtig7VJQ6XsnUjqqJvj7QaMcCAwtrgNdahSiFofrE7o",\n "only-for-dev-2.dappnode.eth": "/ipfs/zdj7WWeQ43G6JJvLWQWZpyHuAMq6uYWRjkBXFad11vE2LHhQ7"\n}\n'})}),"\n",(0,r.jsx)(n.h3,{id:"requirements",children:"requirements"}),"\n",(0,r.jsx)(n.p,{children:"Specify requirements to be met before allowing users to install this Dappnode Package."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"object"})," with the following properties:"]}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"minimumDappnodeVersion"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]})})]}),"\n",(0,r.jsx)(n.h4,{id:"minimumdappnodeversion",children:"minimumDappnodeVersion"}),"\n",(0,r.jsx)(n.p,{children:"Minimum Dappnode version that includes all the features necessary to run this Dappnode Package."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"All instances must conform to this regular expression"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-regex",children:"^((([0-9]+).([0-9]+).([0-9]+)))$\n"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["test example:\n",(0,r.jsx)(n.a,{href:"https://regexr.com/?expression=%5E(((%5B0-9%5D%2B).(%5B0-9%5D%2B).(%5B0-9%5D%2B)))%24&text=0.2.0",children:"0.2.0"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"0.2.0"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"globalenvs",children:"globalEnvs"}),"\n",(0,r.jsx)(n.p,{children:"Request the DAPPMANAGER to inject global ENVs to this package's containers"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"object"})," with the following properties:"]}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"all"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"Optional"})]})})]}),"\n",(0,r.jsx)(n.h4,{id:"all",children:"all"}),"\n",(0,r.jsx)(n.p,{children:"Request the DAPPMANAGER to inject all available global ENVs"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"boolean"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"true"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"architectures",children:"architectures"}),"\n",(0,r.jsxs)(n.p,{children:["Build and distribute this package in multiple architectures using\n",(0,r.jsx)(n.a,{href:"https://docs.docker.com/buildx/working-with-buildx/",children:"Docker's buildx plugin"})]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: Array type: ",(0,r.jsx)(n.code,{children:"enum[]"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["All items must be of the type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsxs)(n.p,{children:["The value of this property ",(0,r.jsx)(n.strong,{children:"must"})," be equal to one of the known values below."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Value"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"linux/amd64"})}),(0,r.jsx)(n.td,{children:"Default architecture, x86-64"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"linux/arm64"})}),(0,r.jsx)(n.td,{children:"ARM architecture"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'["linux/amd64", "linux/arm64"]\n'})}),"\n",(0,r.jsx)(n.h3,{id:"backup",children:"backup"}),"\n",(0,r.jsxs)(n.p,{children:["Allows users to download and restore a backup of key files of this package. If this property is non-empty array, a new\nview will be available in the admin UI for this Dappnode Package. The files or directories specified in the array will\nbe bundled in a tarball. As long as the name properties stay the same, their associated paths can change in future\nversions. Then, when restoring an old backup, the new paths will be associated to files stored under the same name\nkeys. ",(0,r.jsx)(n.strong,{children:"Note:"})," it is recommended to only backup lightweight files such as configs, keys or passwords."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: Array type: ",(0,r.jsx)(n.code,{children:"object[]"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["All items must be of the type: ",(0,r.jsx)(n.code,{children:"object"})," with the following properties:"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"name"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Required"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"path"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Required"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"service"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"name-1",children:"name"}),"\n",(0,r.jsx)(n.p,{children:"A key identifier of this file or directory. Its purpose is to allow the path to change in the future."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["is ",(0,r.jsx)(n.strong,{children:"required"})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsx)(n.li,{children:"minimum length: 1 characters"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Examples:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"keystore"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"config"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"keys"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"path",children:"path"}),"\n",(0,r.jsxs)(n.p,{children:["Path to the file or directory to backup. It ",(0,r.jsx)(n.strong,{children:"MUST"})," be an absolute path (do not use the ",(0,r.jsx)(n.code,{children:"~"})," character) for the backup\ntool to work correctly."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["is ",(0,r.jsx)(n.strong,{children:"required"})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsx)(n.li,{children:"minimum length: 1 characters"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Examples:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"/root/.raiden/secret/keystore"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"/usr/src/app/config.json"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"service",children:"service"}),"\n",(0,r.jsx)(n.p,{children:"Service to which the path belongs to. Must be equal to the name used in the docker-compose services object"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsx)(n.li,{children:"minimum length: 1 characters"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Examples:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"validator"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"service1"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"changelog",children:"changelog"}),"\n",(0,r.jsx)(n.p,{children:"Description of relevant changes of this specific version. Supports markdown and links."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"Brief summary of the most relevant changes that the user must known before installing"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"warnings",children:"warnings"}),"\n",(0,r.jsx)(n.p,{children:"Very relevant information that MUST be shown to the user BEFORE executing a specific action in the Dappnode Package's\nlifecycle."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"object"})," with the following properties:"]}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"onInstall"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"onUpdate"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"onReset"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"onRemove"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"oninstall",children:"onInstall"}),"\n",(0,r.jsx)(n.p,{children:"Will be shown before installing the Dappnode Package."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"You must set the PASSWORD ENV before installing the Dappnode Package in order for the setup to work correctly."\n'})}),"\n",(0,r.jsx)(n.h4,{id:"onupdate",children:"onUpdate"}),"\n",(0,r.jsx)(n.p,{children:"Will be shown before updating the Dappnode Package, not in the first installation."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"Your VPN connection will be lost when the VPN finalizes updating. Leave 1-2 minutes after executing the update and then reconnect and refresh this site."\n'})}),"\n",(0,r.jsx)(n.h4,{id:"onreset",children:"onReset"}),"\n",(0,r.jsx)(n.p,{children:"Will be shown before resetting the Dappnode Package."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"You MUST properly close your open channels before resetting this Dappnode Package or you may lose your funds."\n'})}),"\n",(0,r.jsx)(n.h4,{id:"onremove",children:"onRemove"}),"\n",(0,r.jsx)(n.p,{children:"Will be shown before removing the Dappnode Package."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"You MUST properly close your open channels before removing this Dappnode Package or you may lose your funds."\n'})}),"\n",(0,r.jsx)(n.h3,{id:"updatealerts",children:"updateAlerts"}),"\n",(0,r.jsx)(n.p,{children:"Alerts targeted to a specific update jump."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: Array type: ",(0,r.jsx)(n.code,{children:"object[]"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["All items must be of the type: ",(0,r.jsx)(n.code,{children:"object"})," with the following properties:"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Default"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"from"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Required"})}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"to"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"*"'})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"message"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Required"})}),(0,r.jsx)(n.td,{})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"from",children:"from"}),"\n",(0,r.jsx)(n.p,{children:"Semver range, show this message when a user updates this Dappnode Package FROM a version that satisfies this range."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["is ",(0,r.jsx)(n.strong,{children:"required"})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsx)(n.li,{children:"minimum length: 1 characters"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Examples:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"0.1.x"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"^0.2.0"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"to",children:"to"}),"\n",(0,r.jsx)(n.p,{children:"Semver range, show this message when a user updates this Dappnode Package TO a version that satisfies this range."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["default: ",(0,r.jsx)(n.code,{children:'"*"'})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsx)(n.li,{children:"minimum length: 1 characters"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Examples:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"0.1.x"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"^0.2.0"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"*"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"message",children:"message"}),"\n",(0,r.jsxs)(n.p,{children:["Alert message to be shown when ",(0,r.jsx)(n.code,{children:"from"})," and ",(0,r.jsx)(n.code,{children:"to"})," ranges are satisfied."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["is ",(0,r.jsx)(n.strong,{children:"required"})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsx)(n.li,{children:"minimum length: 1 characters"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"Major update to OpenVPN: This update breaks compatibility with the last VPN version. Please read the migration guide: https://migration020.dappnode.io"\n'})}),"\n",(0,r.jsx)(n.p,{children:"Specific update jump alert."}),"\n",(0,r.jsx)(n.h3,{id:"disclaimer",children:"disclaimer"}),"\n",(0,r.jsx)(n.p,{children:"Disclaimer to be shown to the user on install, and will require the user to approve it."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"object"})," with the following properties:"]}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"message"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Required"})})]})})]}),"\n",(0,r.jsx)(n.h4,{id:"message-1",children:"message"}),"\n",(0,r.jsx)(n.p,{children:"The message shown in the pop-up. Markdown and links are allowed."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["is ",(0,r.jsx)(n.strong,{children:"required"})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"This software is experimental, presented \u201cas is\u201d and inherently carries risks."\n'})}),"\n",(0,r.jsx)(n.h3,{id:"style",children:"style"}),"\n",(0,r.jsx)(n.p,{children:"Graphic information to control the appearance of Dappnode Package related items in the admin UI."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"object"})," with the following properties:"]}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"featuredBackground"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"featuredColor"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"featuredAvatarFilter"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"featuredbackground",children:"featuredBackground"}),"\n",(0,r.jsxs)(n.p,{children:["CSS background property to be applied to the Dappnode Package card in the Dappnode Package store if featured. Go to the\n",(0,r.jsx)(n.a,{href:"https://developer.mozilla.org/docs/Web/CSS/background",children:"Mozilla CSS background reference"})," for valid values."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Examples:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"linear-gradient(to right, #323131, #395353)"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"black"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"featuredcolor",children:"featuredColor"}),"\n",(0,r.jsxs)(n.p,{children:["CSS color property to be applied to the Dappnode Package card in the Dappnode Package store if featured. Go to the\n",(0,r.jsx)(n.a,{href:"https://developer.mozilla.org/docs/Web/CSS/color",children:"Mozilla CSS color reference"})," for valid values."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Examples:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"white"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"#fff"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"featuredavatarfilter",children:"featuredAvatarFilter"}),"\n",(0,r.jsxs)(n.p,{children:["CSS filter property to be applied to ",(0,r.jsx)(n.code,{children:""})," component (avatar) of the Dappnode Package card in the Dappnode Package\nstore if featured. Go to the ",(0,r.jsx)(n.a,{href:"https://developer.mozilla.org/docs/Web/CSS/filter",children:"Mozilla CSS filter reference"})," for\nvalid values."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Examples:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"invert(1)"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"grayscale(80%);"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"exposable",children:"exposable"}),"\n",(0,r.jsx)(n.p,{children:"Exposable services safe to be in the public internet"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: Array type: ",(0,r.jsx)(n.code,{children:"object[]"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["All items must be of the type: ",(0,r.jsx)(n.code,{children:"object"})," with the following properties:"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"name"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Required"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"description"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"serviceName"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"port"})}),(0,r.jsx)(n.td,{children:"number"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Required"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"fromSubdomain"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"name-2",children:"name"}),"\n",(0,r.jsx)(n.p,{children:"Short human readable name of this exposable service"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["is ",(0,r.jsx)(n.strong,{children:"required"})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsx)(n.li,{children:"minimum length: 1 characters"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"Geth JSON RPC"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"description-1",children:"description"}),"\n",(0,r.jsx)(n.p,{children:"Description of this exposable service"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"JSON RPC endpoint for Geth mainnet"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"servicename",children:"serviceName"}),"\n",(0,r.jsx)(n.p,{children:"Docker compose service this exposable service belongs to. Defaults to the first service."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsx)(n.li,{children:"minimum length: 1 characters"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"beacon_chain"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"port",children:"port"}),"\n",(0,r.jsx)(n.p,{children:"Port this exposable service listens to"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["is ",(0,r.jsx)(n.strong,{children:"required"})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"number"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Examples:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"80\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"5001\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"8545\n"})}),"\n",(0,r.jsx)(n.p,{children:"Single exposable service item"}),"\n",(0,r.jsx)(n.h3,{id:"author",children:"author"}),"\n",(0,r.jsxs)(n.p,{children:["Main author of this Dappnode Package. Must follow the structure ",(0,r.jsx)(n.code,{children:"${name} <${email}> (${githubUserLink})"}),"."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsx)(n.li,{children:"minimum length: 1 characters"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"Dappnode Association (https://github.com/dappnode)"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"contributors",children:"contributors"}),"\n",(0,r.jsx)(n.p,{children:"Contributing authors of this Dappnode Package."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: Array type: ",(0,r.jsx)(n.code,{children:"string[]"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["All items must be of the type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"minimum length: 1 characters"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Contributor author. Must follow the structure ",(0,r.jsx)(n.code,{children:"${name} <${email}> (${githubUserLink})"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'[\n "Michael First (https://github.com/developerHanlder)",\n "Michael Second (https://github.com/developerHanlder)"\n]\n'})}),"\n",(0,r.jsx)(n.h3,{id:"categories",children:"categories"}),"\n",(0,r.jsxs)(n.p,{children:["Categories to organize and group Dappnode Packages in the Dappnode Package store. Only one or two categories maximum\nshould be specified per package. If you feel that any of the current categories represent the nature of your package,\nplease open an issue requesting a new category ",(0,r.jsx)(n.a,{href:"https://github.com/dappnode/dnp-manifest/issues/new",children:"https://github.com/dappnode/dnp-manifest/issues/new"})]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: Array type: ",(0,r.jsx)(n.code,{children:"enum[]"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["All items must be of the type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsxs)(n.p,{children:["The value of this property ",(0,r.jsx)(n.strong,{children:"must"})," be equal to one of the known values below."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Value"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Blockchain"})}),(0,r.jsx)(n.td,{children:"Blockchain nodes, i.e. Bitcoin, Monero"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Communications"})}),(0,r.jsx)(n.td,{children:"Decentralized networking or chat solutions, i.e. Swarm"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Developer tools"})}),(0,r.jsx)(n.td,{children:"Packages that their main purpose is to aid in developing, i.e. testnets"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"ETH2.0"})}),(0,r.jsx)(n.td,{children:"Packages to participate or use the Eth2.0 network"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Economic incentive"})}),(0,r.jsx)(n.td,{children:"Packages that offer an economic incentive or reward to the admin that runs it, i.e. Lightning Network"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Monitoring"})}),(0,r.jsx)(n.td,{children:"Packages that track metrics"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Payment channels"})}),(0,r.jsx)(n.td,{children:"Packages whose main purpose is to manage or control payment channels, i.e. Raiden"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Storage"})}),(0,r.jsx)(n.td,{children:"Decentralized storage solutions, i.e. Swarm"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'["Developer tools", "Blockchain"]\n'})}),"\n",(0,r.jsx)(n.h3,{id:"keywords",children:"keywords"}),"\n",(0,r.jsx)(n.p,{children:"Keywords, relevant and descriptive of this Dappnode Package. They will be shown in the admin UI Dappnode Package store."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: Array type: ",(0,r.jsx)(n.code,{children:"string[]"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["All items must be of the type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"minimum length: 1 characters"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Single keyword."}),"\n",(0,r.jsx)(n.h3,{id:"links",children:"links"}),"\n",(0,r.jsx)(n.p,{children:"Various links (URLs) useful for the user of this package. All links will be shown in the dedicated view of this package\nin the admin UI. The predefined links properties below will be shown with concept related icons. Other links will be\nshown as well but with their plain name instead of an icon."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"object"})," with the following properties:"]}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"homepage"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"ui"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"api"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"gateway"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"homepage",children:"homepage"}),"\n",(0,r.jsx)(n.p,{children:"Url to an informative homepage for this Dappnode Package. Should be a README or landing website."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"https://github.com/dappnode/DNP_IPFS#readme"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"ui",children:"ui"}),"\n",(0,r.jsx)(n.p,{children:"Url to this DNP's Dappnode local UI."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"http://ipfs.dappnode:5001/webui"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"api",children:"api"}),"\n",(0,r.jsx)(n.p,{children:"Url to this DNP's Dappnode local HTTP API endpoint."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"http://ipfs.dappnode:5001/api/v0"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"gateway",children:"gateway"}),"\n",(0,r.jsx)(n.p,{children:"Url to this DNP's Dappnode local gateway."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"http://ipfs.dappnode:8080/ipfs"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"repository",children:"repository"}),"\n",(0,r.jsx)(n.p,{children:"Dappnode Package's repository. Must be a publicly available url that can be handed directly to a VCS program."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"object"})," with the following properties:"]}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"type"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Required"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"url"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Required"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"directory"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"Optional"})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"type-1",children:"type"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["is ",(0,r.jsx)(n.strong,{children:"required"})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsx)(n.li,{children:"minimum length: 1 characters"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"git"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"url",children:"url"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["is ",(0,r.jsx)(n.strong,{children:"required"})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsx)(n.li,{children:"minimum length: 1 characters"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"https://github.com/dappnode/DNP_IPFS.git"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"directory",children:"directory"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"packages/react-dom"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"bugs",children:"bugs"}),"\n",(0,r.jsx)(n.p,{children:"Url to your project\u2019s issue tracker."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"is optional"}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"object"})," with the following properties:"]}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"url"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Required"})})]})})]}),"\n",(0,r.jsx)(n.h4,{id:"url-1",children:"url"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["is ",(0,r.jsx)(n.strong,{children:"required"})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"https://github.com/dappnode/DNP_IPFS/issues"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"license",children:"license"}),"\n",(0,r.jsx)(n.p,{children:"Dappnode Package's License."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["is ",(0,r.jsx)(n.strong,{children:"required"})]}),"\n",(0,r.jsxs)(n.li,{children:["type: ",(0,r.jsx)(n.code,{children:"string"})]}),"\n",(0,r.jsx)(n.li,{children:"minimum length: 1 characters"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'"GPL-3.0"\n'})})]})}function o(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>c});var i=s(96540);const r={},l=i.createContext(r);function d(e){const n=i.useContext(l);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),i.createElement(l.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2c509ddc.8b8d99e0.js b/assets/js/2c509ddc.8b8d99e0.js
new file mode 100644
index 000000000..3d8c7c467
--- /dev/null
+++ b/assets/js/2c509ddc.8b8d99e0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1065],{69568:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>n,default:()=>c,frontMatter:()=>a,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"smooth/subscribe-to-smooth/manual","title":"Manual Subscription","description":"Would you rather not wait until your next proposed block to subscribe and begin earning rewards? You can take a proactive step and opt for manual subscription right away. During this process, you\'ll change your validator\'s fee recipient to Smooth\'s address, just like in the automatic subscription. However, instead of waiting for your next proposed block, you\'ll immediately start accumulating rewards from Smooth.","source":"@site/docs/smooth/subscribe-to-smooth/manual.md","sourceDirName":"smooth/subscribe-to-smooth","slug":"/smooth/subscribe-to-smooth/manual","permalink":"/docs/smooth/subscribe-to-smooth/manual","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/smooth/subscribe-to-smooth/manual.md","tags":[],"version":"current","frontMatter":{"title":"Manual Subscription","llm_description":"Manual subscription via website with 0.01 ETH deposit to start earning immediately."},"sidebar":"smoothSidebar","previous":{"title":"Automatic subscription","permalink":"/docs/smooth/subscribe-to-smooth/automatic"},"next":{"title":"Unsubscribe from Smooth","permalink":"/docs/smooth/unsubscribe-from-smooth"}}');var s=o(74848),r=o(28453);const a={title:"Manual Subscription",llm_description:"Manual subscription via website with 0.01 ETH deposit to start earning immediately."},n="Manual Subscription",d={},l=[{value:"Step 1: Change your fee recipient to Smooth's address.",id:"step-1-change-your-fee-recipient-to-smooths-address",level:3},{value:"Step 2: Log in to Smooth's website.",id:"step-2-log-in-to-smooths-website",level:3},{value:"Step 3: Select your validator.",id:"step-3-select-your-validator",level:3},{value:"Scenario 1: Validator is not registered to any MEV relay.",id:"scenario-1-validator-is-not-registered-to-any-mev-relay",level:4},{value:"Scenario 2: Validator registered to MEV relays but without Smooth's address as fee recipient in any relay.",id:"scenario-2-validator-registered-to-mev-relays-but-without-smooths-address-as-fee-recipient-in-any-relay",level:4},{value:"Scenario 3: Validator does not have the Smooth's address as fee recipient in some relays.",id:"scenario-3-validator-does-not-have-the-smooths-address-as-fee-recipient-in-some-relays",level:4},{value:"Scenario 4: Validator is registered to at least one MEV relay and has the correct fee recipient set.",id:"scenario-4-validator-is-registered-to-at-least-one-mev-relay-and-has-the-correct-fee-recipient-set",level:4},{value:"Step 4: Confirm Relays check.",id:"step-4-confirm-relays-check",level:3},{value:"Step 5: Make the deposit and subscribe!",id:"step-5-make-the-deposit-and-subscribe",level:3},{value:"Troubleshooting.",id:"troubleshooting",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",p:"p",strong:"strong",...(0,r.R)(),...e.components},{Details:i}=t;return i||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"manual-subscription",children:"Manual Subscription"})}),"\n",(0,s.jsxs)(t.p,{children:["Would you rather not wait until your next proposed block to subscribe and begin earning rewards? You can take a proactive step and opt for manual subscription right away. During this process, you'll change your validator's fee recipient to Smooth's address, just like in the automatic subscription. However, instead of waiting for your next proposed block, you'll immediately start accumulating rewards from ",(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["The manual subscription is done through ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth's website"})}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"step-1-change-your-fee-recipient-to-smooths-address",children:"Step 1: Change your fee recipient to Smooth's address."}),"\n",(0,s.jsxs)(t.p,{children:["Change the fee recipient of your validator to Smooth's address, just as if you were subscribing automatically. In Dappnode, this process is as simple as changing the fee recipient in your ",(0,s.jsx)(t.a,{href:"http://brain.web3signer.dappnode/",children:"staking brain"}),"."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"fee_recipient",src:o(65320).A+"",width:"2728",height:"552"})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"This step is extremely important"}),". Make sure you're changing the fee recipient of the validators you are going to manually subscribe and that the fee recipient is correctly set to Smooth's address (",(0,s.jsx)(t.code,{children:"0xAdFb8D27671F14f297eE94135e266aAFf8752e35"}),"). If a subscribed validator proposes a block with an incorrect fee recipient, it will be banned from ",(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," and will not be able to participate in it again."]}),"\n",(0,s.jsx)(t.admonition,{title:"Keep the fee recipient set to Smooth's address!",type:"danger",children:(0,s.jsxs)(t.p,{children:["It is crucial that you keep the fee recipient of your validator set to Smooth's address (",(0,s.jsx)(t.code,{children:"0xAdFb8D27671F14f297eE94135e266aAFf8752e35"}),") as long as it is subscribed to ",(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),". If, at any point, you change the fee recipient of your validator and propose a block without unsubscribing first, you will be banned from ",(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," and will not be able to participate in it again."]})}),"\n",(0,s.jsx)(t.h3,{id:"step-2-log-in-to-smooths-website",children:"Step 2: Log in to Smooth's website."}),"\n",(0,s.jsxs)(t.p,{children:["Go to ",(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth's website"})," and log in with your wallet. A list of all the validators with the same withdrawal address as your logged in wallet will appear."]}),"\n",(0,s.jsx)(t.h3,{id:"step-3-select-your-validator",children:"Step 3: Select your validator."}),"\n",(0,s.jsxs)(t.p,{children:["Select the validator you want to subscribe to ",(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),' by clicking on the "Subscribe" button.\n',(0,s.jsx)(t.img,{alt:"my_validators",src:o(21216).A+"",width:"1033",height:"393"})]}),"\n",(0,s.jsxs)(t.p,{children:['When clicking on the "Subscribe" button, ',(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," will check if your validator is registered to any MEV relay. If it is, it will also check if the fee recipient of your validator is set to Smooth's address in each relay. ",(0,s.jsx)(t.strong,{children:"Four different dialogs can appear"}),", depending on the state of your validator and the MEV relays it is registered to."]}),"\n",(0,s.jsx)(t.h4,{id:"scenario-1-validator-is-not-registered-to-any-mev-relay",children:"Scenario 1: Validator is not registered to any MEV relay."}),"\n",(0,s.jsx)("p",{align:"center",children:(0,s.jsx)("img",{src:"/img/smooth_no_relays.png",alt:"no_relays",width:"400"})}),"\n",(0,s.jsxs)(t.p,{children:['When doing a manual subscription, it is obligatory to be registered in at least one MEV relay. In Dappnode, registering and using a relay is as simple as selecting the desired relay in the "MEV Boost" Card at the ',(0,s.jsx)(t.a,{href:"http://my.dappnode/stakers/ethereum/",children:"Stakers UI"}),". Once you have selected at least one relay, you can go back to the ",(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),' website and click on the "Subscribe" button again.']}),"\n",(0,s.jsx)(t.h4,{id:"scenario-2-validator-registered-to-mev-relays-but-without-smooths-address-as-fee-recipient-in-any-relay",children:"Scenario 2: Validator registered to MEV relays but without Smooth's address as fee recipient in any relay."}),"\n",(0,s.jsx)("p",{align:"center",children:(0,s.jsx)("img",{src:"/img/smooth_subscription_norelays.png",alt:"incorrect_fee_recipient",width:"400"})}),"\n",(0,s.jsx)(t.p,{children:"Please make sure that you have correctly done the first step of this guide! This dialog means that not a single relay has reflected your fee recipient change to Smooth's address. If running a dappnode, make sure your MEV boost package is running!"}),"\n",(0,s.jsx)(t.admonition,{type:"info",children:(0,s.jsx)(t.p,{children:'It can take up to a few minutes for relays to reflect your fee recipient change. If you have already changed your fee recipient but this alert still appears, please check the "Troubleshooting" section down below for more information.'})}),"\n",(0,s.jsx)(t.h4,{id:"scenario-3-validator-does-not-have-the-smooths-address-as-fee-recipient-in-some-relays",children:"Scenario 3: Validator does not have the Smooth's address as fee recipient in some relays."}),"\n",(0,s.jsx)("p",{align:"center",children:(0,s.jsx)("img",{src:"/img/smooth_incorrect_fee_recipient.png",alt:"incorrect_fee_recipient",width:"400"})}),"\n",(0,s.jsxs)(t.p,{children:["If this dialog appears, it means that your validator's fee recipient is set to ",(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," in some relays while also being set to an incorrect address in others. This situation likely arises because your validator was registered in a relay it no longer uses, and the fee recipient in that specific relay wasn't updated accordingly."]}),"\n",(0,s.jsx)(t.admonition,{type:"info",children:(0,s.jsx)(t.p,{children:'Relays that you no longer use won\'t reflect the fee recipient changes you did for each validator in your staking brain. If you have already changed your fee recipient but the warning still appears, please check the "Troubleshooting" section down below for more information.'})}),"\n",(0,s.jsx)(t.h4,{id:"scenario-4-validator-is-registered-to-at-least-one-mev-relay-and-has-the-correct-fee-recipient-set",children:"Scenario 4: Validator is registered to at least one MEV relay and has the correct fee recipient set."}),"\n",(0,s.jsx)("p",{align:"center",children:(0,s.jsx)("img",{src:"/img/smooth_correct_fee_recipient.png",alt:"correct_fee_recipient",width:"400"})}),"\n",(0,s.jsxs)(t.p,{children:["This is the dialog you want to see! If you see this dialog, it means that your validator is registered to at least one MEV relay, and that the fee recipient of your validator is set to Smooth's address in all relays it has been registered to. In other words, this means that your validator is ready to subscribe to ",(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),"!"]}),"\n",(0,s.jsx)(t.h3,{id:"step-4-confirm-relays-check",children:"Step 4: Confirm Relays check."}),"\n",(0,s.jsx)("p",{align:"center",children:(0,s.jsx)("img",{src:"/img/smooth_mev_blocks.png",alt:"mev_blocks",width:"400"})}),"\n",(0,s.jsx)(t.p,{children:'This step is just a confirmation of the relays your validator has the correct fee recipient set in. Click on "Next" to continue the subscription process, we\'re almost there!'}),"\n",(0,s.jsx)(t.h3,{id:"step-5-make-the-deposit-and-subscribe",children:"Step 5: Make the deposit and subscribe!"}),"\n",(0,s.jsx)("p",{align:"center",children:(0,s.jsx)("img",{src:"/img/smooth_make_deposit.png",alt:"deposit",width:"400"})}),"\n",(0,s.jsxs)(t.p,{children:["This is the last step! Here, you will make the deposit to subscribe your validator to ",(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),". The deposit is a one-time upfront payment that will be returned to you as Claimable rewards when proposing your first block to ",(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),". The deposit is 0.01 ETH, and it is used to prevent spam and malicious validators from subscribing to ",(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["Once the deposit transaction is processed by the chain, your validator will be subscribed to ",(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," and you will start receiving rewards from other members of the pool!"]}),"\n",(0,s.jsx)("p",{align:"center",children:(0,s.jsx)("img",{src:"/img/smooth_subscribe_success.png",alt:"subscription_success",width:"400"})}),"\n",(0,s.jsx)(t.admonition,{type:"caution",children:(0,s.jsxs)(t.p,{children:['Since the Oracle operates with only finalized data, it will take up to 35 minutes to process your subscription. Your "My Validator" table will be updated instantly, but it may take a while to see how "Total Subscribers" counter increases. To know more, visit the ',(0,s.jsx)(t.a,{href:"/docs/smooth/deep-dive-into-smooth/overview",children:"Deep Dive into Smooth"})," section."]})}),"\n",(0,s.jsx)(t.h2,{id:"troubleshooting",children:"Troubleshooting."}),"\n",(0,s.jsxs)(i,{children:[(0,s.jsx)("summary",{children:(0,s.jsxs)("strong",{children:["I have changed my fee recipient but the ",(0,s.jsx)("i",{children:'"Fee recipient warning"'})," warning still appears!"]})}),(0,s.jsxs)(t.p,{children:["If you have changed your fee recipient to Smooth's address (",(0,s.jsx)("code",{children:"0xAdFb8D27671F14f297eE94135e266aAFf8752e35"}),") but this warning still appears, it could be because of two reasons:"]}),(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:"The relays you are registered to are not reflecting the change in the fee recipient yet. It can take up to a few minutes for the relays to reflect your fee recipient update. This is something that is out of Smooth's control. We recommend you to wait a few minutes and try again."}),(0,s.jsxs)("li",{children:["The fee recipient is only updated in your current ",(0,s.jsx)("strong",{children:"active"})," relays. This means that if you used to be registered to a relay, but you are not using it anymore, the fee recipient of your validator will not be updated in that relay. This is something expected and that it won't affect your validator's subscription to ",(0,s.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),". If you want to update the fee recipient in the relays you are no longer registered to, you can quickly register and unregister again to the outdated relays to force an update the fee recipient there."]})]}),(0,s.jsxs)(t.p,{children:["To clarify: As long as the fee recipient of your validator is set to Smooth's address in your ",(0,s.jsx)("a",{href:"http://brain.web3signer.dappnode/",children:"staking brain"}),", you can continue the subscription process normally."]})]})]})}function c(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},65320:(e,t,o)=>{o.d(t,{A:()=>i});const i=o.p+"assets/images/smooth_fee_recipient-9a97308ed0c601ccc84b0295efe34cd4.png"},21216:(e,t,o)=>{o.d(t,{A:()=>i});const i=o.p+"assets/images/smooth_my_validators-72848a79b68c9a1ab67d754537f6e2c9.png"},28453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>n});var i=o(96540);const s={},r=i.createContext(s);function a(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function n(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2da4a763.ce02aaf0.js b/assets/js/2da4a763.ce02aaf0.js
new file mode 100644
index 000000000..81295ad5c
--- /dev/null
+++ b/assets/js/2da4a763.ce02aaf0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[2635],{37440:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>c,default:()=>f,frontMatter:()=>a,metadata:()=>n,toc:()=>r});const n=JSON.parse('{"id":"user/notifications/legacy","title":"Notifications Legacy","description":"In the legacy section you have access to the previous system of notifications with email and telegram. The aim of the new notification system is to unify the notifications in a single channel in desktop and mobile to facilitate the user experience and be more reliable, configurable and scalable. Therefore, this section will be deprecated in the upcoming core releases.","source":"@site/docs/user/notifications/legacy.md","sourceDirName":"user/notifications","slug":"/user/notifications/legacy","permalink":"/docs/user/notifications/legacy","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/notifications/legacy.md","tags":[],"version":"current","frontMatter":{"title":"Notifications Legacy","llm_description":"Legacy email/telegram notification system being deprecated in favor of the new unified system."},"sidebar":"userSidebar","previous":{"title":"Settings","permalink":"/docs/user/notifications/settings"},"next":{"title":"Devices","permalink":"/docs/user/notifications/devices"}}');var o=t(74848),s=t(28453);const a={title:"Notifications Legacy",llm_description:"Legacy email/telegram notification system being deprecated in favor of the new unified system."},c="Notifications Legacy",l={},r=[{value:"The Notification system will evolve continuously",id:"the-notification-system-will-evolve-continuously",level:3}];function d(e){const i={h1:"h1",h3:"h3",header:"header",img:"img",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"notifications-legacy",children:"Notifications Legacy"})}),"\n",(0,o.jsx)(i.p,{children:"In the legacy section you have access to the previous system of notifications with email and telegram. The aim of the new notification system is to unify the notifications in a single channel in desktop and mobile to facilitate the user experience and be more reliable, configurable and scalable. Therefore, this section will be deprecated in the upcoming core releases."}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"Notifications_legacy",src:t(91493).A+"",width:"1906",height:"1080"})}),"\n",(0,o.jsx)(i.h3,{id:"the-notification-system-will-evolve-continuously",children:"The Notification system will evolve continuously"}),"\n",(0,o.jsx)(i.p,{children:"We hope the new notification system will help you to have a 360\xba tracking of your Dappnode and staking activity. New notifications will be added to improve your monitoring continuously."}),"\n",(0,o.jsx)(i.p,{children:"If you have feedback to improve the new notifications, let us know all your ideas in Discord."})]})}function f(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},91493:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/notifications_legacy-8188ab9a99279c46ce1423d4cd67d05c.png"},28453:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>c});var n=t(96540);const o={},s=n.createContext(o);function a(e){const i=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/3042.b37ed2eb.js b/assets/js/3042.b37ed2eb.js
new file mode 100644
index 000000000..ba8934b6c
--- /dev/null
+++ b/assets/js/3042.b37ed2eb.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[3042],{65932:(e,t,n)=>{n.d(t,{A:()=>d});n(96540);var o=n(18215),i=n(50539),s=n(9303),a=n(74848);function d(e){let{className:t}=e;return(0,a.jsx)("main",{className:(0,o.A)("container margin-vert--xl",t),children:(0,a.jsx)("div",{className:"row",children:(0,a.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,a.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,a.jsx)(i.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,a.jsx)("p",{children:(0,a.jsx)(i.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,a.jsx)("p",{children:(0,a.jsx)(i.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},73042:(e,t,n)=>{n.r(t),n.d(t,{default:()=>r});n(96540);var o=n(50539),i=n(81082),s=n(99795),a=n(65932),d=n(74848);function r(){const e=(0,o.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(i.be,{title:e}),(0,d.jsx)(s.A,{children:(0,d.jsx)(a.A,{})})]})}}}]);
\ No newline at end of file
diff --git a/assets/js/3093fe32.a0368c4d.js b/assets/js/3093fe32.a0368c4d.js
new file mode 100644
index 000000000..6732f9601
--- /dev/null
+++ b/assets/js/3093fe32.a0368c4d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1842],{14245:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"user/dappnode-cloud/overview","title":"What is Dappnode Cloud?","description":"Dappnode Cloud is a service that allows users to deploy a Dappnode in a cloud provider so it can be tested without the need for physical hardware. We provide easy pre-configured instances for the main cloud providers (AWS for now, more to come later) to continue to make the deployment of web3 infrastructure accessible and hassle-free for everyone. It consists of a Dappnode image deployed on a machine instance from a cloud provider, eliminating the need to invest in hardware in order to test Dappnode.","source":"@site/docs/user/dappnode-cloud/overview.md","sourceDirName":"user/dappnode-cloud","slug":"/user/dappnode-cloud/overview","permalink":"/docs/user/dappnode-cloud/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/dappnode-cloud/overview.md","tags":[],"version":"current","frontMatter":{"title":"What is Dappnode Cloud?","llm_description":"Deploy Dappnode in cloud (AWS) without hardware; ideal for testing, dev, or short-term use."},"sidebar":"userSidebar","previous":{"title":"Troubleshooting","permalink":"/docs/user/ethical-metrics/troubleshooting"},"next":{"title":"AWS Overview","permalink":"/docs/user/dappnode-cloud/providers/aws/overview"}}');var i=n(74848),a=n(28453);const r={title:"What is Dappnode Cloud?",llm_description:"Deploy Dappnode in cloud (AWS) without hardware; ideal for testing, dev, or short-term use."},s="What is Dappnode Cloud?",d={},l=[{value:"Why using Dappnode Cloud?",id:"why-using-dappnode-cloud",level:2},{value:"No Initial Hardware Investment \ud83d\udcb0",id:"no-initial-hardware-investment-",level:3},{value:"Stop when you want \ud83e\uddd1\u200d\ud83d\udd27\ufe0f",id:"stop-when-you-want-\ufe0f",level:3},{value:"Scalability \ud83d\udcc8",id:"scalability-",level:3},{value:"Physical or Cloud?",id:"physical-or-cloud",level:2},{value:"1. Economics \ud83d\udcb2",id:"1-economics-",level:3},{value:"2. Decentralization \ud83d\uddfd",id:"2-decentralization-",level:3},{value:"Use cases",id:"use-cases",level:2},{value:"Blockchain participation & Solo Staking \u26d3\ufe0f",id:"blockchain-participation--solo-staking-\ufe0f",level:3},{value:"Testing \ud83e\uddea",id:"testing-",level:3},{value:"Developing \ud83e\uddd1\u200d\ud83d\udcbb\ufe0f",id:"developing-\ufe0f",level:3}];function c(e){const o={admonition:"admonition",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"what-is-dappnode-cloud",children:"What is Dappnode Cloud?"})}),"\n",(0,i.jsx)(o.p,{children:"Dappnode Cloud is a service that allows users to deploy a Dappnode in a cloud provider so it can be tested without the need for physical hardware. We provide easy pre-configured instances for the main cloud providers (AWS for now, more to come later) to continue to make the deployment of web3 infrastructure accessible and hassle-free for everyone. It consists of a Dappnode image deployed on a machine instance from a cloud provider, eliminating the need to invest in hardware in order to test Dappnode."}),"\n",(0,i.jsx)(o.admonition,{type:"tip",children:(0,i.jsx)(o.p,{children:"This allows you to run your decentralized applications more efficiently and cost-effectively, as you can customize your hardware specifications to meet your needs."})}),"\n",(0,i.jsx)(o.h2,{id:"why-using-dappnode-cloud",children:"Why using Dappnode Cloud?"}),"\n",(0,i.jsx)(o.p,{children:"Dappnode Cloud offers numerous advantages over traditional hardware-based setups. By leveraging cloud infrastructure, you can bypass the complexities and limitations associated with physical hardware. Here are the key benefits that make Dappnode Cloud an attractive option:"}),"\n",(0,i.jsx)(o.h3,{id:"no-initial-hardware-investment-",children:"No Initial Hardware Investment \ud83d\udcb0"}),"\n",(0,i.jsx)(o.p,{children:"With Dappnode Cloud, there is no need to purchase an entire new machine every time you need a new Dappnode. This significantly reduces the initial cost barrier, allowing you to test Dappnode before you decide to install it in a physical machine or to quickly deploy a new Dappnode without having to purchase a new machine."}),"\n",(0,i.jsx)(o.h3,{id:"stop-when-you-want-\ufe0f",children:"Stop when you want \ud83e\uddd1\u200d\ud83d\udd27\ufe0f"}),"\n",(0,i.jsx)(o.p,{children:"For short stints, Dappnode Cloud allows you to deploy and also to stop running your Dappnode as soon as you have performed the tasks you wanted to do, with no electronic waste or an unallocated physical machine on your side."}),"\n",(0,i.jsx)(o.h3,{id:"scalability-",children:"Scalability \ud83d\udcc8"}),"\n",(0,i.jsx)(o.p,{children:"With Dappnode Cloud, you can easily scale your resources up or down based on your current needs. Whether you're experiencing a lack of storage or you need a few more nodes quickly, you can adjust your cloud resources accordingly without the constraints of physical hardware limitations."}),"\n",(0,i.jsx)(o.h2,{id:"physical-or-cloud",children:"Physical or Cloud?"}),"\n",(0,i.jsx)(o.p,{children:"It is much better to run a physical Dappnode at your place for these 2 main reasons:"}),"\n",(0,i.jsx)(o.h3,{id:"1-economics-",children:"1. Economics \ud83d\udcb2"}),"\n",(0,i.jsx)(o.p,{children:"A physical machine has a higher initial cost, but leverages your existing internet connection and consumes less energy than your fridge. This initial cost is pretty much the only cost you will have for the lifetime of the hardware you use.\nCloud servers have monthly costs associated with it that never go away, resulting in higher cost in the long term."}),"\n",(0,i.jsx)(o.p,{children:"In summary, you will be better off with a physical machine if you plan to use your Dappnode for a long time, and better off with a Dappnode Cloud if you only want to use the instance for a short period of time."}),"\n",(0,i.jsx)(o.h3,{id:"2-decentralization-",children:"2. Decentralization \ud83d\uddfd"}),"\n",(0,i.jsx)(o.p,{children:"The networks you will run on your Dapppnode become more resilient to corporate capture, government interference and localized events the more decentralized their nodes are. By running a Node in the cloud it is very likely that there is already a node of that network in the same data center, therefore adding no extra value to the decentralization of the network.\nIf instead you run the same node in a home setup from your home, you are adding a node that is much harder to censor, block, locate and subjugate than a node controlled by a big infrastructure corporation."}),"\n",(0,i.jsx)(o.p,{children:'Remember, "The Cloud" is just someone else\'s computer.'}),"\n",(0,i.jsx)(o.h2,{id:"use-cases",children:"Use cases"}),"\n",(0,i.jsx)(o.p,{children:"Dappnode Cloud offers versatile solutions for various users, providing the flexibility and reliability needed to meet your goals. Here are some of the primary use cases:"}),"\n",(0,i.jsx)(o.h3,{id:"blockchain-participation--solo-staking-\ufe0f",children:"Blockchain participation & Solo Staking \u26d3\ufe0f"}),"\n",(0,i.jsx)(o.p,{children:"If obtaining hardware is not an option, Dappnode Cloud allows you to run a full node or even host your Ethereum or Gnosis validators without worrying about hardware requirements, internet connectivity, or power outages. This ensures continuous participation in the blockchain network with minimal hassle."}),"\n",(0,i.jsx)(o.h3,{id:"testing-",children:"Testing \ud83e\uddea"}),"\n",(0,i.jsx)(o.p,{children:"For those considering purchasing their own Dappnode but still uncertain, Dappnode Cloud provides an excellent opportunity to run a temporary Dappnode. This allows you to demo the system without facing the initial cost barrier, helping you make an informed decision."}),"\n",(0,i.jsx)(o.h3,{id:"developing-\ufe0f",children:"Developing \ud83e\uddd1\u200d\ud83d\udcbb\ufe0f"}),"\n",(0,i.jsx)(o.p,{children:"Dappnode Cloud is an excellent choice for developers who need a reliable and scalable environment to test and deploy dApps. Without the constraints of local hardware, developers can quickly iterate and deploy their applications, leveraging the power of cloud computing to simulate real-world conditions."})]})}function p(e={}){const{wrapper:o}={...(0,a.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},28453:(e,o,n)=>{n.d(o,{R:()=>r,x:()=>s});var t=n(96540);const i={},a=t.createContext(i);function r(e){const o=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function s(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(a.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/31f84294.ec5740e7.js b/assets/js/31f84294.ec5740e7.js
new file mode 100644
index 000000000..a0adcb070
--- /dev/null
+++ b/assets/js/31f84294.ec5740e7.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5332],{50617:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>a,metadata:()=>t,toc:()=>h});const t=JSON.parse('{"id":"user/staking/gnosis-chain/incentive-program","title":"Gnosis Chain Incentive Program","description":"Gnosis Chain is a Proof of Stake blockchain that uses the GNO token for staking. The Gnosis incentive program rewards validators for their work in the network. It is designed to incentivize validators to participate and secure the network.","source":"@site/docs/user/staking/gnosis-chain/incentive-program.md","sourceDirName":"user/staking/gnosis-chain","slug":"/user/staking/gnosis-chain/incentive-program","permalink":"/docs/user/staking/gnosis-chain/incentive-program","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/gnosis-chain/incentive-program.md","tags":[],"version":"current","frontMatter":{"title":"Gnosis Chain Incentive Program","llm_description":"How to claim free GNO validators through Dappnode\'s Gnosis Chain incentive program."},"sidebar":"userSidebar","previous":{"title":"Gnosis Solo Staking","permalink":"/docs/user/staking/gnosis-chain/solo"},"next":{"title":"Consolidate Gnosis Validators","permalink":"/docs/user/staking/gnosis-chain/consolidation-gnosis"}}');var i=n(74848),o=n(28453);const a={title:"Gnosis Chain Incentive Program",llm_description:"How to claim free GNO validators through Dappnode's Gnosis Chain incentive program."},r="Gnosis Chain Incentive Program",d={},h=[{value:"So you got your Dappnode and want to know how to get your Gnosis Chain validators?",id:"so-you-got-your-dappnode-and-want-to-know-how-to-get-your-gnosis-chain-validators",level:2},{value:"1. Set Up Your Gnosis Chain Node",id:"1-set-up-your-gnosis-chain-node",level:2},{value:"2. Get safe address",id:"2-get-safe-address",level:2},{value:"3. Generate and import your validator keys",id:"3-generate-and-import-your-validator-keys",level:2},{value:"4. Submit deposit data",id:"4-submit-deposit-data",level:2},{value:"5. Start validating",id:"5-start-validating",level:2}];function c(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"gnosis-chain-incentive-program",children:"Gnosis Chain Incentive Program"})}),"\n",(0,i.jsx)(s.p,{children:"Gnosis Chain is a Proof of Stake blockchain that uses the GNO token for staking. The Gnosis incentive program rewards validators for their work in the network. It is designed to incentivize validators to participate and secure the network."}),"\n",(0,i.jsx)(s.h2,{id:"so-you-got-your-dappnode-and-want-to-know-how-to-get-your-gnosis-chain-validators",children:"So you got your Dappnode and want to know how to get your Gnosis Chain validators?"}),"\n",(0,i.jsx)(s.p,{children:"Here are the prerequisites:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["You must have purchased a ",(0,i.jsx)(s.a,{href:"https://dappnode.com/collections/frontpage/products/gnosis-chain-home",children:"Dappnode Home - Gnosis Chain Edition"})]}),"\n",(0,i.jsxs)(s.li,{children:["You must have given us an Ethereum address you control for us to whitelist during that purchase. If you didn\u2019t, please send an email to ",(0,i.jsx)(s.a,{href:"mailto:support@nodlers.com",children:"support@nodlers.com"})," with your order number and your address"]}),"\n",(0,i.jsx)(s.li,{children:"You have set up your dappnode so you can use it"}),"\n",(0,i.jsx)(s.li,{children:"You can do step 1 immediately after receiving your dappnode, steps 2 and 3 after receiving a first email from dappnode, and finally 4 when"}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"1-set-up-your-gnosis-chain-node",children:"1. Set Up Your Gnosis Chain Node"}),"\n",(0,i.jsxs)(s.p,{children:["Follow ",(0,i.jsx)(s.a,{href:"https://docs.dappnode.io/docs/user/staking/gnosis-chain/solo#1-install-the-necessary-packages-on-dappnode",children:"these instructions"})," to setup your Gnosis Chain node on Dappnode."]}),"\n",(0,i.jsx)(s.h2,{id:"2-get-safe-address",children:"2. Get safe address"}),"\n",(0,i.jsxs)(s.p,{children:["To participate in the Gnosis incentive program, you need to have a safe address provided by the Dappnode team. You should have received an email with the safe address. This email may not be send just after the order is done, it can take a few days. If you don't have it, please send an email to ",(0,i.jsx)(s.a,{href:"mailto:support@nodlers.com",children:"support@nodlers.com"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"The safe address will be controlled by both the Dappnode team and you. It will have a threshold of 2, meaning that both parties need to sign a transaction to execute it. The address will have an expiration time of 1 year."}),"\n",(0,i.jsx)(s.admonition,{type:"tip",children:(0,i.jsxs)(s.p,{children:["You can also use the ",(0,i.jsx)(s.a,{href:"https://deposit.gnosischain.com/",children:"Gnosis deposit UI"})," (Dappnode section) to visualize the safe address (withdrawal address) that must be used to generate the keys in step 3.\nYou must connect the wallet you specified while purchasing the Dappnode to the Gnosis deposit UI to see the safe address."]})}),"\n",(0,i.jsx)(s.h2,{id:"3-generate-and-import-your-validator-keys",children:"3. Generate and import your validator keys"}),"\n",(0,i.jsx)(s.admonition,{type:"caution",children:(0,i.jsxs)(s.p,{children:["Before generating the keys, make sure you have received an email from Dappnode letting you know which one should be your ",(0,i.jsx)(s.strong,{children:"withdrawal address"})," that these keys need to have. If you don't have it, please contact the Dappnode team."]})}),"\n",(0,i.jsx)(s.admonition,{type:"caution",children:(0,i.jsx)(s.p,{children:"It is mandatory that you specify 3 as the number of validators when generating the keys. If you have participated in the Dappcon program, you should select 4 instead."})}),"\n",(0,i.jsxs)(s.p,{children:["To generate the validator keys, follow the step detailed ",(0,i.jsx)(s.a,{href:"https://docs.dappnode.io/docs/user/staking/gnosis-chain/solo#2-creating-validator-keys-for-gnosis-chain",children:"here"}),"."]}),"\n",(0,i.jsx)(s.h2,{id:"4-submit-deposit-data",children:"4. Submit deposit data"}),"\n",(0,i.jsxs)(s.p,{children:["Once the validator keys are generated, you need to submit the deposit data to the ",(0,i.jsx)(s.a,{href:"https://deposit.gnosischain.com/",children:"Gnosis deposit UI"})," (dappnode section)."]}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Navigate to: ",(0,i.jsx)(s.a,{href:"https://deposit.gnosischain.com/",children:"https://deposit.gnosischain.com/"}),"\n",(0,i.jsx)(s.img,{alt:"Gnosis Deposit UI - Connect wallet",src:n(84251).A+"",width:"1920",height:"959"})]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Connect ",(0,i.jsx)(s.strong,{children:"the wallet that you gave when filling the order for your DAppNode."})]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:['Move to the "Dappnode" tab\n',(0,i.jsx)(s.img,{alt:"Gnosis Deposit UI - Upload Deposit",src:n(83989).A+"",width:"1920",height:"959"})]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Upload the ",(0,i.jsx)(s.code,{children:"deposit_data*.json"})," you generated with the key generator tool in step 2\n",(0,i.jsx)(s.img,{alt:"Gnosis Deposit UI - Claim Deposit",src:n(1790).A+"",width:"1920",height:"959"})]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Click ",(0,i.jsx)(s.code,{children:"claim"})]}),"\n",(0,i.jsx)(s.admonition,{type:"tip",children:(0,i.jsxs)(s.p,{children:["In case you need some xDai for transaction fees you can get some from this ",(0,i.jsx)(s.a,{href:"https://faucet.gnosischain.com/",children:"faucet"}),"."]})}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Gnosis Deposit UI - Submit Deposit",src:n(48417).A+"",width:"1920",height:"959"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Dappnode Team will trigger the actual GNO deposits to the validator keys all the incentive program recipients submit ",(0,i.jsx)(s.strong,{children:"at least once a week"}),". You will receive a final email when this happens!"]}),"\n",(0,i.jsx)(s.admonition,{type:"info",children:(0,i.jsx)(s.p,{children:"The execution of the deposit can take a few days. Once dappnode executes the deposit data for you, you should receive an email letting you know that the deposit has been submitted and your validators are ready."})}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Gnosis Deposit UI - Deposit Executed",src:n(28328).A+"",width:"1920",height:"959"})}),"\n",(0,i.jsx)(s.admonition,{type:"info",children:(0,i.jsxs)(s.p,{children:["If you encounter an issue claiming your incentive program GNO validators, such as an error about your address not being whitelisted please visit the ",(0,i.jsx)(s.a,{href:"https://discord.gg/dappnode",children:"DAppNode Discord Server"})," and open a support ticket in this channel. (#1-sales-support-ticket)"]})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"5-start-validating",children:"5. Start validating"}),"\n",(0,i.jsx)(s.p,{children:"Once the deposit is submitted, you can start validating on the Gnosis Chain network. Remember to upload your keystores to the Web3Signer Gnosis package that you installed during step 1."})]})}function l(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},1790:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/gnosis-deposit-ui-claim-deposit-8270b3dcd297bab60c6003813c6c52ae.png"},84251:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/gnosis-deposit-ui-connect-wallet-7f55fa7b5429fc60f9cf81a130841875.png"},28328:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/gnosis-deposit-ui-deposit-executed-78daa713b036a8a46f512a1cda1d186f.png"},48417:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/gnosis-deposit-ui-deposit-submitted-e715e6c3f40dee64034d2445902261d3.png"},83989:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/gnosis-deposit-ui-upload-deposit-05733a1cdda007d8b01a92df65165e9d.png"},28453:(e,s,n)=>{n.d(s,{R:()=>a,x:()=>r});var t=n(96540);const i={},o=t.createContext(i);function a(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/3217192f.5d40d3bd.js b/assets/js/3217192f.5d40d3bd.js
new file mode 100644
index 000000000..144b89cbd
--- /dev/null
+++ b/assets/js/3217192f.5d40d3bd.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8462],{8174:a=>{a.exports=JSON.parse('{"tag":{"label":"docusaurus","permalink":"/blog/tags/docusaurus","allTagsPath":"/blog/tags","count":4,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/docusaurus","page":1,"postsPerPage":10,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/342f5eb1.f07aa3f0.js b/assets/js/342f5eb1.f07aa3f0.js
new file mode 100644
index 000000000..ed5b16163
--- /dev/null
+++ b/assets/js/342f5eb1.f07aa3f0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[6111],{56337:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"user/staking/ethereum/lsd-pools/lido/overview","title":"Lido Community Staking Module (CSM)","description":"---","source":"@site/docs/user/staking/ethereum/lsd-pools/lido/overview.md","sourceDirName":"user/staking/ethereum/lsd-pools/lido","slug":"/user/staking/ethereum/lsd-pools/lido/overview","permalink":"/docs/user/staking/ethereum/lsd-pools/lido/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/ethereum/lsd-pools/lido/overview.md","tags":[],"version":"current","frontMatter":{"title":"Lido Community Staking Module (CSM)","llm_description":"Lido CSM overview: permissionless staking from 2.4 ETH with Dappnode integration features."},"sidebar":"userSidebar","previous":{"title":"Testnet","permalink":"/docs/user/staking/ethereum/solo/holesky"},"next":{"title":"Register as a Node Operator","permalink":"/docs/user/staking/ethereum/lsd-pools/lido/register"}}');var o=i(74848),r=i(28453);const s={title:"Lido Community Staking Module (CSM)",llm_description:"Lido CSM overview: permissionless staking from 2.4 ETH with Dappnode integration features."},a="Lido Community Staking Module (CSM)",d={},l=[{value:"Lido CSM Overview",id:"lido-csm-overview",level:2},{value:"Lido CSM in dappnode",id:"lido-csm-in-dappnode",level:2},{value:"Notifications",id:"notifications",level:3},{value:"Ejector",id:"ejector",level:3},{value:"Track multiple Node Operators",id:"track-multiple-node-operators",level:3},{value:"Import keystores directly from the Lido CSM",id:"import-keystores-directly-from-the-lido-csm",level:3},{value:"Infraestructure monitoring",id:"infraestructure-monitoring",level:3},{value:"Performance",id:"performance",level:3},{value:"MEV Boost Relays",id:"mev-boost-relays",level:3},{value:"Testnet",id:"testnet",level:2},{value:"Execution Client RPC",id:"execution-client-rpc",level:2},{value:"Reducing the Waiting Time",id:"reducing-the-waiting-time",level:3},{value:"How to Change the RPC",id:"how-to-change-the-rpc",level:3}];function c(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"lido-community-staking-module-csm",children:"Lido Community Staking Module (CSM)"})}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.h2,{id:"lido-csm-overview",children:(0,o.jsx)(t.strong,{children:"Lido CSM Overview"})}),"\n",(0,o.jsxs)(t.p,{children:["Lido is a ",(0,o.jsx)(t.strong,{children:"liquid staking"})," solution for Ethereum that addresses the liquidity issues of traditional staking. Instead of locking up assets and losing access to them, users can stake through Lido and receive liquid tokens. These tokens retain the value of the staked assets and can be used elsewhere while still earning staking rewards."]}),"\n",(0,o.jsxs)(t.p,{children:["Lido, with over ",(0,o.jsx)(t.a,{href:"https://lido.fi",children:"8 million ETH"})," staked on its platform, is a significant contributor in the Ethereum ecosystem. To broaden and diversify its network of node operators, Lido introduced the ",(0,o.jsxs)(t.a,{href:"https://lido.fi/csm",children:[(0,o.jsx)(t.strong,{children:"Community Staking Module"})," (CSM)"]}),", the first Lido module with a ",(0,o.jsx)(t.strong,{children:"permissionless entry"})," for Ethereum staking. By first providing an ETH-based bond, anyone can now become a node operator by running validators in the Lido protocol. Designed with solo stakers in mind, the CSM lowers the barrier to becoming an Ethereum validator with 2.4 ETH, requiring far less than the standard 32 ETH, and offers a user-friendly experience. While tailored for smaller stakers, it is open to all, including professional operators."]}),"\n",(0,o.jsx)(t.admonition,{type:"info",children:(0,o.jsxs)(t.p,{children:["Becoming a Lido Node Operator is recommended for users with some experience in running validators. The process requires a basic understanding of the Ethereum network and the Lido protocol. If you are new to staking, we recommend setting up a validator on the Testnet first to familiarize yourself with the process, see ",(0,o.jsx)(t.a,{href:"/docs/user/staking/ethereum/solo/holesky",children:"Staking on the Ethereum Testnet"}),"."]})}),"\n",(0,o.jsx)(t.h2,{id:"lido-csm-in-dappnode",children:(0,o.jsx)(t.strong,{children:"Lido CSM in dappnode"})}),"\n",(0,o.jsx)(t.p,{children:"Dappnode provides an easy-to-use and intuitive interface for most of the infrastructure needed to become a Lido Node Operator. The process is straightforward and requires only a few steps to set up a node operator and start earning rewards."}),"\n",(0,o.jsx)(t.p,{children:"Steps to become Node Operator"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["Go to Dappnode platform ",(0,o.jsx)(t.a,{href:"https://my.dappnode/",children:"https://my.dappnode/"})]}),"\n",(0,o.jsx)(t.li,{children:"Go to Dappstore tab in the left menu"}),"\n",(0,o.jsx)(t.li,{children:"Search and install Lido CSM package"}),"\n",(0,o.jsx)(t.li,{children:"Once it is installed, go to packages tab and click on the name of the Lido CSM package and find the section Ui below the version title."}),"\n",(0,o.jsx)(t.li,{children:"You will be in the Lido interface, connect your wallet and start the staking process."}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"Dappnode takes care of the Lido protocol requirements, such as exiting validator when needed, and provides a user-friendly interface to manage the node operator."}),"\n",(0,o.jsx)(t.p,{children:"The main functionalities covered by Dappnode in the Lido CSM package are:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Telegram Notifications"}),": you can setup notifications for your Node Operator to be informed about any event. You need to configure the user ID and Telegram token to received your notifications."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Ejector"}),": whenever any of your validator requires to be exited, it will be done automatically sending you the corresponding notification."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Track multiple Node Operators"}),": you can track multiple Node Operators from the same DAppNodePackage-lido-csm."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Performance"}),": your validators performance will be tracked and you will be notified if they are not performing as expected according to the Lido thresholds."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"MEV boost relays"}),": you will receive notifications whenever your validators are using relays blocklisted in the Lido CSM or not using any relay at all."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Import keystores directly from the Lido CSM"}),": you can import your keystores directly from the Lido CSM to your DAppNodePackage-lido-csm and they will be automatically tagged as Lido."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Infraestructure monitoring"}),": you will be able to visualize the status of your infraestructure (EC - CC - Signer - MEV Boost)."]}),"\n"]}),"\n",(0,o.jsx)(t.h3,{id:"notifications",children:(0,o.jsx)(t.strong,{children:"Notifications"})}),"\n",(0,o.jsxs)(t.p,{children:["The DAppNodePackage-lido-csm provides notifications and warnings to help you monitor your infraestructure and validator performance. You will be able to setup your notifications either during the onboarding process if you are registering as a new Node Operator and from the UI navigating to ",(0,o.jsx)(t.code,{children:"/notifications"}),"."]}),"\n",(0,o.jsx)(t.admonition,{type:"info",children:(0,o.jsx)(t.p,{children:"For further information on how to setup your notifications, see Notifications section"})}),"\n",(0,o.jsx)(t.h3,{id:"ejector",children:(0,o.jsx)(t.strong,{children:"Ejector"})}),"\n",(0,o.jsx)(t.p,{children:"The Ejector is a service that will automatically exit your validator when needed. You will receive a notification when the validator has been successfully exited and when the exit has failed, letting you know that a manual exit is required. The ejector has the following characteristics:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Automatic exit"}),": the Ejector will automatically exit your validator when needed."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Ejector Notifications"}),": you will receive a notification when the validator has been successfully exited and when the exit has failed, letting you know that a manual exit is required."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Retry mechanism"}),": the Ejector will retry the exit process if it fails, ensuring that the validator is exited successfully."]}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"lido-notification-ejector",src:i(99526).A+"",width:"531",height:"111"})}),"\n",(0,o.jsx)(t.h3,{id:"track-multiple-node-operators",children:(0,o.jsx)(t.strong,{children:"Track multiple Node Operators"})}),"\n",(0,o.jsx)(t.p,{children:"The DAppNodePackage-lido-csm allows you to track multiple Node Operators from the same package. This feature is useful if you are managing multiple Node Operators and want to keep track of their performance and status in one place. To make the package to track a new Node Operator, you must sign in with the new Node Operator's wallet and import the keystores."}),"\n",(0,o.jsx)(t.admonition,{type:"warning",children:(0,o.jsx)(t.p,{children:"Make sure to import the correct keystores for each Node Operator. Importing the wrong keystores can result in penalties."})}),"\n",(0,o.jsx)(t.h3,{id:"import-keystores-directly-from-the-lido-csm",children:(0,o.jsx)(t.strong,{children:"Import keystores directly from the Lido CSM"})}),"\n",(0,o.jsxs)(t.p,{children:["You can import your keystores directly from the DAppNodePackage-lido-csm UI during the onboarding process or from the ",(0,o.jsx)(t.code,{children:"/keystores"})," section (comming soon). The keystores will be automatically tagged as Lido, and you will be able to use them to run validators in the Lido protocol. These keystores will be located in the web3signer package, for further editing or deleting them you must go to the web3signer UI."]}),"\n",(0,o.jsx)(t.p,{children:"Whenever there are 1 or more keystores that belongs to your Node Operator and are not imported you will be able to see the following message in the DAppNodePackage-lido-csm UI:"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"lido-keystore-not-imported",src:i(97051).A+"",width:"1901",height:"648"})}),"\n",(0,o.jsx)(t.h3,{id:"infraestructure-monitoring",children:(0,o.jsx)(t.strong,{children:"Infraestructure monitoring"})}),"\n",(0,o.jsx)(t.p,{children:"You will be able to visualize the status of your infraestructure (EC - CC - Signer - MEV Boost) from the DAppNodePackage-lido-csm UI. This feature is useful to monitor the status of your infraestructure and ensure that everything is running smoothly."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"lido-infra",src:i(45140).A+"",width:"1901",height:"516"})}),"\n",(0,o.jsx)(t.h3,{id:"performance",children:(0,o.jsx)(t.strong,{children:"Performance"})}),"\n",(0,o.jsxs)(t.p,{children:["You can check the performance of the validators associated with your Node Operator by visiting the ",(0,o.jsx)(t.code,{children:"/performance"})," tab. This section provides attestation rates for your validators in a table and a comparison with the Lido threshold in a chart."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"lido-performance-tab",src:i(35942).A+"",width:"1901",height:"1076"})}),"\n",(0,o.jsx)(t.admonition,{type:"info",children:(0,o.jsx)(t.p,{children:"All the data displayed in the performance tab comes from reports already distributed by the Lido CSM team. This means the information is not in real-time but rather backwards looking."})}),"\n",(0,o.jsx)(t.admonition,{type:"info",children:(0,o.jsx)(t.p,{children:"The provided data is sourced from the Lido CSM team. It represents the information used to determine whether your validators received rewards for previous frames."})}),"\n",(0,o.jsxs)(t.p,{children:["For more details, visit the ",(0,o.jsx)(t.a,{href:"/docs/user/staking/ethereum/lsd-pools/lido/performance",children:"Validators' Performance section"})," in this documentation."]}),"\n",(0,o.jsx)(t.h3,{id:"mev-boost-relays",children:(0,o.jsx)(t.strong,{children:"MEV Boost Relays"})}),"\n",(0,o.jsx)(t.p,{children:"Lido CSM only allows certain relays for your node configuration. You must use at least some of the vetted relays, but you should not include any relays that are not on the approved list."}),"\n",(0,o.jsx)(t.p,{children:"You can check the list of allowed relays in the smart contracts:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Mainnet relays"}),": See ",(0,o.jsx)(t.code,{children:"get_relays"})," from ",(0,o.jsx)(t.a,{href:"https://etherscan.io/address/0xf95f069f9ad107938f6ba802a3da87892298610e#readContract#F4",children:"Mainnet"})]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Hoodi relays"}),": See ",(0,o.jsx)(t.code,{children:"get_relays"})," from ",(0,o.jsx)(t.a,{href:"https://hoodi.etherscan.io/address/0x279d3A456212a1294DaEd0faEE98675a52E8A4Bf#readContract#F4",children:"Hoodi"})]}),"\n"]}),"\n",(0,o.jsx)(t.admonition,{type:"warning",children:(0,o.jsx)(t.p,{children:"You must select at least one relay to ensure the node operator does not propose vanilla blocks. As a Lido Node Operator, it is your responsibility to ensure that your infrastructure is correctly using MEV Boost."})}),"\n",(0,o.jsxs)(t.p,{children:["The Lido CSM Dappnode package also includes infrastructure checks and warnings in the ",(0,o.jsx)(t.code,{children:"/dashboard"})," tab. Here, you can verify whether the ",(0,o.jsx)(t.code,{children:"MEV Boost"})," package is running, confirm that you are subscribed to at least one approved relay, and ensure that you are not subscribed to any unauthorized relays."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"lido-relays-warnings",src:i(69318).A+"",width:"1901",height:"824"})}),"\n",(0,o.jsx)(t.admonition,{type:"tip",children:(0,o.jsxs)(t.p,{children:["You can select/unselect relays in the ",(0,o.jsx)(t.a,{href:"http://my.dappnode/stakers",children:"Stakers"})," tab in the Dappmanager or directly modify the relay URLs in the ",(0,o.jsx)(t.code,{children:"MEV Boost"})," package configuration tab."]})}),"\n",(0,o.jsxs)(t.p,{children:["For more details on MEV in CSM, visit the ",(0,o.jsx)(t.a,{href:"https://operatorportal.lido.fi/modules/community-staking-module#block-99fed4cdcc7641f1af431ddb8afafbec",children:"Lido CSM Docs"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"testnet",children:"Testnet"}),"\n",(0,o.jsxs)(t.p,{children:["The Lido Community Staking Module is available on the Ethereum Mainnet. If you are new to staking, we recommend setting up a validator on the Testnet first to familiarize yourself with the process. The process is the same, the dappnode package for Lido CSM in testnet is ",(0,o.jsx)(t.strong,{children:"lido-csm-hoodi.dnp.dappnode.eth"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"execution-client-rpc",children:"Execution Client RPC"}),"\n",(0,o.jsx)(t.p,{children:"When logging in to the Lido CSM package with an Ethereum address for the first time, the execution client must query and scan all Ethereum blockchain events since the deployment of Lido's CSM smart contract. This process determines whether a node operator has already been created with that address."}),"\n",(0,o.jsx)(t.p,{children:"By default, each Lido CSM package makes these requests to the execution client running on the Dappnode where the package is installed. However, these execution clients do not cache all blockchain events, causing the query to take several minutes (approximately 10 minutes on Mainnet) depending on the execution client. This process occurs only during the first login per address, ensuring a fully decentralized approach where each user relies on their execution client."}),"\n",(0,o.jsx)(t.h3,{id:"reducing-the-waiting-time",children:"Reducing the Waiting Time"}),"\n",(0,o.jsx)(t.p,{children:"To avoid long waiting times, you can configure the package to use an alternative RPC that caches all required data (e.g., Infura's free RPCs). This significantly reduces the loading time to a few seconds."}),"\n",(0,o.jsxs)(t.admonition,{type:"info",children:[(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"What is an Execution client RPC?"})}),(0,o.jsx)(t.p,{children:"An execution client RPC (Remote Procedure Call) is an interface that allows applications to communicate with an Ethereum execution client. By connecting to an RPC endpoint, users and applications can retrieve blockchain information."})]}),"\n",(0,o.jsx)(t.h3,{id:"how-to-change-the-rpc",children:"How to Change the RPC"}),"\n",(0,o.jsx)(t.admonition,{type:"warning",children:(0,o.jsx)(t.p,{children:"Changing the RPC is done at your own risk. Dappnode is not responsible for any performance issues or failures caused by using a centralized external RPC."})}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsx)(t.li,{children:"Obtain an RPC URL that provides pre-cached blockchain events. (e.g.,\nInfura)."}),"\n",(0,o.jsxs)(t.li,{children:["Navigate to the ",(0,o.jsx)(t.code,{children:"/config"})," tab of your Lido CSM package:","\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"http://my.dappnode/packages/my/lido-csm-mainnet.dnp.dappnode.eth/config",children:"Mainnet Lido CSM package's config tab"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"http://my.dappnode/packages/my/lido-csm-hoodi.dnp.dappnode.eth/config",children:"Hoodi Lido CSM package's config tab"})}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["Change the ",(0,o.jsx)(t.code,{children:"RPC_URL"})," environment variable in the ",(0,o.jsx)(t.strong,{children:"Lido Events Section"}),"."]}),"\n",(0,o.jsxs)(t.li,{children:["Click the ",(0,o.jsx)(t.code,{children:"Update"})," button\n",(0,o.jsx)(t.img,{alt:"lido-csm-config-tab",src:i(6044).A+"",width:"1460",height:"694"})]}),"\n"]}),"\n",(0,o.jsxs)(t.admonition,{type:"tip",children:[(0,o.jsx)(t.p,{children:"After the first scan we suggest to change it back again to:"}),(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.code,{children:"http://execution.mainnet.dncore.dappnode:8545"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.code,{children:"http://execution.hoodi.dncore.dappnode:8545"})}),"\n"]})]}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.p,{children:"Refer to the Lido Community Staking Module documentation for more details:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"https://blog.lido.fi/lido-community-staking-an-overview/",children:"Lido Community Staking Overview"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"https://operatorportal.lido.fi/modules/community-staking-module",children:"Lido Community Staking Module"})}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},6044:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/lido-csm-config-tab-c7fb1bebf1de0ef1eb30ecee4a7dff2c.png"},35942:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/lido-csm-performance-tab-0afcdd62fc4ab528a30c9d0f4c36ce48.png"},69318:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/lido-csm-relays-warnings-2a679e60b83cbc94f3bf3fbc572d4899.png"},45140:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/lido-infra-a00927b2b6ee742595c755da57c36fc8.png"},97051:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/lido-keystore-not-imported-ba70b9757a3c033322075d7fa85858f0.png"},99526:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/lido-notification-ejector-e74dca0b48d81e4b543f11a305324477.png"},28453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var n=i(96540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/34d45c9f.5a961416.js b/assets/js/34d45c9f.5a961416.js
new file mode 100644
index 000000000..7c21041dd
--- /dev/null
+++ b/assets/js/34d45c9f.5a961416.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[7087],{89634:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>h,contentTitle:()=>a,default:()=>c,frontMatter:()=>r,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"smooth","title":"Smooth","description":"Smooth introduction","source":"@site/docs/smooth.md","sourceDirName":".","slug":"/smooth","permalink":"/docs/smooth","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/smooth.md","tags":[],"version":"current","frontMatter":{"title":"Smooth","description":"Smooth introduction","llm_description":"Introduction to Smooth, Dappnode\'s MEV Smoothing Pool for consistent solo staker rewards."},"sidebar":"smoothSidebar","next":{"title":"Overview","permalink":"/docs/smooth/deep-dive-into-smooth/overview"}}');var s=t(74848),i=t(28453);const r={title:"Smooth",description:"Smooth introduction",llm_description:"Introduction to Smooth, Dappnode's MEV Smoothing Pool for consistent solo staker rewards."},a="Welcome to Smooth, Dappnode's MEV Smoothing Pool!",h={},l=[{value:"What is Smooth and why should you join it?",id:"what-is-smooth-and-why-should-you-join-it",level:2},{value:"\ud83c\udfb0 Stop Depending on Luck!",id:"slot_machine-stop-depending-on-luck",level:3},{value:"\ud83d\ude80 Don't miss high fee seasons!",id:"rocket-dont-miss-high-fee-seasons",level:3},{value:"\ud83d\udcb0 Hitting MEV Lottery Blocks",id:"moneybag-hitting-mev-lottery-blocks",level:3}];function d(e){const o={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.header,{children:(0,s.jsx)(o.h1,{id:"welcome-to-smooth-dappnodes-mev-smoothing-pool",children:"Welcome to Smooth, Dappnode's MEV Smoothing Pool!"})}),"\n",(0,s.jsx)(o.p,{children:"Welcome to the Smooth Documentation! Here, you'll find detailed insights and essential information to navigate and maximize your experience with Smooth, an MEV Smoothing Pool designed to enhance rewards for Solo Stakers in the Ethereum network."}),"\n",(0,s.jsx)(o.admonition,{type:"info",children:(0,s.jsxs)(o.p,{children:["Interested in Smooth? Check out ",(0,s.jsx)(o.strong,{children:(0,s.jsx)(o.a,{href:"/docs/smooth/deep-dive-into-smooth/overview",children:"Deep Dive into Smooth"})})," to get a general idea of how Smooth works, or check the ",(0,s.jsx)(o.strong,{children:(0,s.jsx)(o.a,{href:"/docs/smooth/subscribe-to-smooth/overview",children:"subscription guides"})})," to learn how to join!"]})}),"\n",(0,s.jsx)(o.hr,{}),"\n",(0,s.jsx)("center",{children:(0,s.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/WoTfl8h_lKM",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,s.jsx)(o.h2,{id:"what-is-smooth-and-why-should-you-join-it",children:"What is Smooth and why should you join it?"}),"\n",(0,s.jsxs)(o.p,{children:["Smooth is a MEV Smoothing Pool designed to elevate the Ethereum solo staking experience. By pooling MEV rewards, ",(0,s.jsx)(o.strong,{children:"Smooth offers Solo Stakers the unique opportunity to earn higher rewards consistently"}),", reducing reliance on luck and maximizing the potential of every staked ether. Join Smooth and take your solo staking experience to the next level!"]}),"\n",(0,s.jsxs)(o.h3,{id:"slot_machine-stop-depending-on-luck",children:["\ud83c\udfb0"," Stop Depending on Luck!"]}),"\n",(0,s.jsx)(o.p,{children:"Currently, luck plays a big role in every Solo Staker when it comes to earning rewards. While the average validator will propose 3 blocks per year, some will propose more, some less. A Solo Staker does not have any control over this, and can only hope to get lucky and propose as much blocks as possible to maximize their rewards."}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.strong,{children:"Smooth changes this by pooling together the block proposals of all its members, so that every member gets a share of the rewards of every block proposed by the pool"}),". This way, you can stop worrying about luck and start earning rewards consistently!"]}),"\n",(0,s.jsxs)(o.h3,{id:"rocket-dont-miss-high-fee-seasons",children:["\ud83d\ude80"," Don't miss high fee seasons!"]}),"\n",(0,s.jsx)(o.p,{children:"With an average of only 3 block proposals per year, how likely are you to catch a period of high fees? How much does it hurt to see a NFT sale, or a peak in activity and not catch any of the action?"}),"\n",(0,s.jsxs)(o.p,{children:["In Smooth, block proposals are constant, so ",(0,s.jsx)(o.strong,{children:"no matter what happens in the network, you will always be there to get your share of it!"})]}),"\n",(0,s.jsxs)(o.h3,{id:"moneybag-hitting-mev-lottery-blocks",children:["\ud83d\udcb0"," Hitting MEV Lottery Blocks"]}),"\n",(0,s.jsxs)(o.p,{children:["Ever since they arrived, MEV rewards are distributed very unevenly. The vast majority of blocks have very low MEV rewards, while only very few blocks have very high rewards. As a Solo Staker, you have a ",(0,s.jsx)(o.em,{children:"very"})," low chance of hitting one of these high-reward blocks. The median MEV typically hovers around 0.05 ETH, but certain lottery blocks can reach up to 30, 90, or even 300 ETH!"]}),"\n",(0,s.jsxs)(o.p,{children:["By adding together all our chances of hitting a lottery block, we have a much higher chance of proposing one! ",(0,s.jsxs)(o.strong,{children:["In ",(0,s.jsx)(o.a,{href:"https://github.com/htimsk/SPanalysis",children:"backtesting simulations"}),", rewards of a Smoothing Pool participant are up to 60% higher than those of a Solo Staker!"]})]}),"\n",(0,s.jsxs)(o.admonition,{type:"tip",children:[(0,s.jsx)(o.mdxAdmonitionTitle,{}),(0,s.jsxs)(o.p,{children:["For a detailed comparison between Solo Stakers and Smoothing Pool participants' rewards, explore this ",(0,s.jsx)(o.a,{href:"https://github.com/htimsk/SPanalysis",children:"Smoothing Pool analysis"})]})]}),"\n",(0,s.jsx)(o.p,{children:"Lido, Centralized Exchanges and other pools with lots of validators consistently hit lottery blocks because of the sheer numbers of validators they have. They naturally split these rewards between all their validators, effectively being at an advantage vs the average Solo Staker."}),"\n",(0,s.jsxs)(o.p,{children:["This is a centralizing force, as the rich become richer and bigger operations get bigger rewards. ",(0,s.jsx)(o.strong,{children:"Now, Solo Stakers with few validators don't depend on luck to be at par with the big guys!"})]})]})}function c(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},28453:(e,o,t)=>{t.d(o,{R:()=>r,x:()=>a});var n=t(96540);const s={},i=n.createContext(s);function r(e){const o=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/36994c47.28052c2e.js b/assets/js/36994c47.28052c2e.js
new file mode 100644
index 000000000..3cec3f258
--- /dev/null
+++ b/assets/js/36994c47.28052c2e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9858],{45516:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]);
\ No newline at end of file
diff --git a/assets/js/3a2db09e.1520ce9d.js b/assets/js/3a2db09e.1520ce9d.js
new file mode 100644
index 000000000..fff0357ac
--- /dev/null
+++ b/assets/js/3a2db09e.1520ce9d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8121],{68070:a=>{a.exports=JSON.parse('{"tags":[{"label":"facebook","permalink":"/blog/tags/facebook","count":1},{"label":"hello","permalink":"/blog/tags/hello","count":2},{"label":"docusaurus","permalink":"/blog/tags/docusaurus","count":4},{"label":"hola","permalink":"/blog/tags/hola","count":1}]}')}}]);
\ No newline at end of file
diff --git a/assets/js/3d867185.7d12c55c.js b/assets/js/3d867185.7d12c55c.js
new file mode 100644
index 000000000..5f4512497
--- /dev/null
+++ b/assets/js/3d867185.7d12c55c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9913],{90224:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"dev/metrics","title":"\ud83d\udcca Package Metrics","description":"DAppNode supports an integrated metrics framework based on Prometheus and Grafana, powered by the DMS package.","source":"@site/docs/dev/metrics.md","sourceDirName":"dev","slug":"/dev/metrics","permalink":"/docs/dev/metrics","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/metrics.md","tags":[],"version":"current","frontMatter":{"title":"\ud83d\udcca Package Metrics","llm_description":"Prometheus and Grafana metrics framework for DAppNode packages via DMS."},"sidebar":"devSidebar","previous":{"title":"Package Ownership","permalink":"/docs/dev/package-publishing/package-ownership"},"next":{"title":"Package Notifications","permalink":"/docs/dev/notifications"}}');var r=s(74848),t=s(28453);const i={title:"\ud83d\udcca Package Metrics",llm_description:"Prometheus and Grafana metrics framework for DAppNode packages via DMS."},o="\ud83d\udcca Package Metrics",d={},c=[{value:"\u2699\ufe0f How It Works",id:"\ufe0f-how-it-works",level:2},{value:"\ud83e\uddf1 File Structure & Naming Convention",id:"-file-structure--naming-convention",level:2},{value:"\ud83d\udce6 Single vs Multi-Variant Package Configuration",id:"-single-vs-multi-variant-package-configuration",level:2},{value:"\ud83d\udcca Default Dashboards",id:"-default-dashboards",level:2},{value:"\ud83d\udd17 Useful Links",id:"-useful-links",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"-package-metrics",children:"\ud83d\udcca Package Metrics"})}),"\n",(0,r.jsxs)(n.p,{children:["DAppNode supports an integrated metrics framework based on ",(0,r.jsx)(n.a,{href:"https://prometheus.io/",children:"Prometheus"})," and ",(0,r.jsx)(n.a,{href:"https://grafana.com/",children:"Grafana"}),", powered by the ",(0,r.jsx)(n.a,{href:"https://docs.dappnode.io/docs/user/packages/dms/",children:"DMS package"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"This framework enables package developers to expose useful metrics and provide prebuilt dashboards to monitor their services."}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:"\ud83e\udde0 What is DMS?\nThe DMS (DAppNode Monitoring Stack) package collects metrics using Prometheus and visualizes them through Grafana. It automatically discovers and injects metrics configurations from installed packages."})}),"\n",(0,r.jsx)(n.h2,{id:"\ufe0f-how-it-works",children:"\u2699\ufe0f How It Works"}),"\n",(0,r.jsx)(n.p,{children:"To use the metrics framework in your package:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"The DMS package must be installed by the user."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Your package must include:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"One or more Grafana dashboard files"}),"\n",(0,r.jsx)(n.li,{children:"A Prometheus targets file"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"-file-structure--naming-convention",children:"\ud83e\uddf1 File Structure & Naming Convention"}),"\n",(0,r.jsx)(n.p,{children:"These files must follow specific naming conventions and formats:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Grafana dashboard files"}),":","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Name: Must follow this naming pattern ",(0,r.jsx)(n.code,{children:"/.*grafana-dashboard.json$/"})," and be placed in the root directory of your package (or within the variant directory)."]}),"\n",(0,r.jsx)(n.li,{children:"Max size: 10MB"}),"\n",(0,r.jsx)(n.li,{children:"Multiple files: You can include multiple dashboard files, and they will be merged into a single dashboard in Grafana."}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Prometheus targets file"}),":","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Name: Must follow this naming pattern ",(0,r.jsx)(n.code,{children:"/.*prometheus-targets.(json|yaml|yml)$/"})," and be placed in the root directory of your package (or within the variant directory)."]}),"\n",(0,r.jsx)(n.li,{children:"Max size: 1MB"}),"\n",(0,r.jsx)(n.li,{children:"Only one file: You can only include one targets file."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["\ud83d\udca1 Need the DNS name of a service to configure Prometheus targets?\nRefer to the ",(0,r.jsx)(n.a,{href:"https://docs.dappnode.io/docs/dev/dns",children:"Package DNS documentation"})," to learn how to reference services within your Prometheus targets."]})}),"\n",(0,r.jsx)(n.h2,{id:"-single-vs-multi-variant-package-configuration",children:"\ud83d\udce6 Single vs Multi-Variant Package Configuration"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Single Variant"}),"\nFor packages with a single variant:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Place 1 Prometheus targets file in the root of the package."}),"\n",(0,r.jsx)(n.li,{children:"Add as many Grafana dashboard files as needed in the same root directory."}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Multi-Variant"}),"\nFor multi-variant packages:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Place Grafana dashboard files in the root of the package, as they are usually shared. See ",(0,r.jsx)(n.a,{href:"https://github.com/dappnode/DAppNodePackage-geth-generic/blob/main/geth-grafana-dashboard.json",children:"example"}),"."]}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:"\ud83d\udcc1 Example:\ngeth-grafana-dashboard.json"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Place Prometheus targets files in each variant directory, as the data source may differ per variant. See ",(0,r.jsx)(n.a,{href:"https://github.com/dappnode/DAppNodePackage-geth-generic/blob/main/package_variants/mainnet/prometheus-targets.json",children:"example"}),"."]}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:"\ud83d\udcc1 Example:\nmainnet/prometheus-targets.json"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"-default-dashboards",children:"\ud83d\udcca Default Dashboards"}),"\n",(0,r.jsxs)(n.p,{children:["The DMS package includes default dashboards and Prometheus targets for ",(0,r.jsx)(n.a,{href:"https://github.com/google/cadvisor",children:"cadvisor"})," and ",(0,r.jsx)(n.a,{href:"https://github.com/prometheus/node_exporter",children:"node_exporter"}),". These dashboards provide metrics about the host and Docker containers running on the host."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"http://dms.dappnode/d/dms-host/host?orgId=1&refresh=10s",children:"Host dashboards"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"http://dms.dappnode/d/dms-docker/docker?orgId=1&refresh=2h",children:"Docker dashboards"})}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"-useful-links",children:"\ud83d\udd17 Useful Links"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Grafana: Access Grafana dashboards, create new ones, and more. ",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"http://dms.dappnode/dashboards",children:"http://dms.dappnode/dashboards"})})]}),"\n",(0,r.jsxs)(n.li,{children:["Prometheus: Access the Prometheus UI to check target statuses, perform manual queries, and more. ",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"http://prometheus.dms.dappnode:9090/",children:"http://prometheus.dms.dappnode:9090/"})})]}),"\n",(0,r.jsxs)(n.li,{children:["Manager status: Debug which dashboards and targets have been uploaded successfully. ",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"http://manager.dms.dappnode/",children:"http://manager.dms.dappnode/"})})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>o});var a=s(96540);const r={},t=a.createContext(r);function i(e){const n=a.useContext(t);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),a.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/3f7aee3c.3b01f820.js b/assets/js/3f7aee3c.3b01f820.js
new file mode 100644
index 000000000..191051324
--- /dev/null
+++ b/assets/js/3f7aee3c.3b01f820.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4532],{38320:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>i,contentTitle:()=>c,default:()=>u,frontMatter:()=>t,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"user/access-your-dappnode/overview","title":"\ud83c\udf10 Access your Dappnode","description":"Dappnode is made to work on a dedicated computer, and its main control panel, the Dappmanager, is accessed from another device via my.dappnode , as it is meant to be installed over an operating system that does not include a graphical interface.","source":"@site/docs/user/access-your-dappnode/overview.md","sourceDirName":"user/access-your-dappnode","slug":"/user/access-your-dappnode/overview","permalink":"/docs/user/access-your-dappnode/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/access-your-dappnode/overview.md","tags":[],"version":"current","frontMatter":{"title":"\ud83c\udf10 Access your Dappnode","llm_description":"Overview of four ways to access Dappnode: WiFi, VPN, Local Proxy, and Terminal."},"sidebar":"userSidebar","previous":{"title":"Next steps","permalink":"/docs/user/getting-started/next-steps"},"next":{"title":"Wi-Fi","permalink":"/docs/user/access-your-dappnode/wifi"}}');var r=n(74848),a=n(28453);const t={title:"\ud83c\udf10 Access your Dappnode",llm_description:"Overview of four ways to access Dappnode: WiFi, VPN, Local Proxy, and Terminal."},c="\ud83c\udf10 Access your Dappnode",i={},d=[];function p(e){const o={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",p:"p",strong:"strong",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.header,{children:(0,r.jsx)(o.h1,{id:"-access-your-dappnode",children:"\ud83c\udf10 Access your Dappnode"})}),"\n",(0,r.jsxs)(o.p,{children:["Dappnode is made to work on a dedicated computer, and its main control panel, the ",(0,r.jsx)(o.strong,{children:"Dappmanager"}),", is accessed from another device via ",(0,r.jsx)(o.a,{href:"http://my.dappnode/",children:"my.dappnode"})," , as it is meant to be installed over an operating system that does not include a graphical interface."]}),"\n",(0,r.jsx)(o.admonition,{type:"info",children:(0,r.jsxs)(o.p,{children:["Starting from core version 0.3.2, you can also access your Dappnode using ",(0,r.jsx)(o.a,{href:"http://my.dappnode.private/",children:"my.dappnode.private"}),". This address uses a private IP range, providing a more secure way to access your Dappnode's control panel."]})}),"\n",(0,r.jsxs)(o.admonition,{type:"tip",children:[(0,r.jsxs)(o.p,{children:["\ud83d\udd10 From core 0.3.2, you can access your Dappnode through HTTPS if you have the ",(0,r.jsx)(o.code,{children:"https.dnp.dappnode.eth"})," package installed and you are connected via VPN or Wifi to your Dappnode. Use this link: ",(0,r.jsx)(o.code,{children:"https://pwa..io"})]}),(0,r.jsx)(o.p,{children:(0,r.jsx)(o.a,{href:"https://docs.dappnode.io/docs/user/pwa/",children:"Learn more about Dappnode App."})})]}),"\n",(0,r.jsxs)(o.p,{children:["Here are ",(0,r.jsx)(o.strong,{children:"four ways"})," you can connect to your Dappnode:"]}),"\n",(0,r.jsxs)(o.p,{children:[(0,r.jsx)(o.a,{href:"/docs/user/access-your-dappnode/wifi",children:(0,r.jsx)(o.strong,{children:"\ud83d\udce1 Wifi"})}),": A user-friendly way, especially for those with Dappnode pre-installed on their machines."]}),"\n",(0,r.jsxs)(o.p,{children:[(0,r.jsx)(o.a,{href:"/docs/user/access-your-dappnode/vpn/overview",children:(0,r.jsx)(o.strong,{children:"\ud83d\udd10 VPN"})}),": Using either Wireguard or OpenVPN, this method is both secure and versatile. You can connect from inside or outside your local network, but if you're connecting from outside, you might need to adjust some settings."]}),"\n",(0,r.jsxs)(o.p,{children:[(0,r.jsx)(o.a,{href:"/docs/user/access-your-dappnode/local",children:(0,r.jsx)(o.strong,{children:"\ud83d\udd17 Local Proxy (Recovery)"})}),": This is a backup connection method. It allows you to connect to Dappmanager when you're on the same local network. It's mainly for recovery purposes because of its limitations."]}),"\n",(0,r.jsxs)(o.p,{children:[(0,r.jsx)(o.a,{href:"/docs/user/access-your-dappnode/terminal",children:(0,r.jsx)(o.strong,{children:"\ud83d\udcbb Terminal (Advanced, Recovery)"})}),": This is for those who know their way around computer commands. It provides complete control but might be complex for some users."]}),"\n",(0,r.jsx)(o.admonition,{type:"info",children:(0,r.jsx)(o.p,{children:"\ud83d\udca1 To ensure you can always access your Dappnode, it's a smart idea to set up and know more than one connection method. In the coming sections, we'll guide you through setting up each of these connection ways."})})]})}function u(e={}){const{wrapper:o}={...(0,a.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},28453:(e,o,n)=>{n.d(o,{R:()=>t,x:()=>c});var s=n(96540);const r={},a=s.createContext(r);function t(e){const o=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),s.createElement(a.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/3fac1d53.1441a248.js b/assets/js/3fac1d53.1441a248.js
new file mode 100644
index 000000000..6b082a0db
--- /dev/null
+++ b/assets/js/3fac1d53.1441a248.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9071],{47356:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>n,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"smooth/deep-dive-into-smooth/states","title":"Smooth Validator States","description":"A Smooth validator can be in multiple states depending on its behavior. In this section we will explain all possible states a validator can have, the consequences of being each state, and how a validator can transition from one state to another.","source":"@site/docs/smooth/deep-dive-into-smooth/states.md","sourceDirName":"smooth/deep-dive-into-smooth","slug":"/smooth/deep-dive-into-smooth/states","permalink":"/docs/smooth/deep-dive-into-smooth/states","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/smooth/deep-dive-into-smooth/states.md","tags":[],"version":"current","frontMatter":{"title":"Smooth Validator States","llm_description":"Validator state machine: Active, YellowCard, RedCard, NotSubscribed, Banned, and Untracked."},"sidebar":"smoothSidebar","previous":{"title":"Rewards","permalink":"/docs/smooth/deep-dive-into-smooth/rewards"},"next":{"title":"Oracle & Smart Contract","permalink":"/docs/smooth/deep-dive-into-smooth/oracle-sm"}}');var a=o(74848),i=o(28453);const n={title:"Smooth Validator States",llm_description:"Validator state machine: Active, YellowCard, RedCard, NotSubscribed, Banned, and Untracked."},r="Smooth Validator States",d={},l=[{value:"State Machine Overview",id:"state-machine-overview",level:2},{value:"The purpose of the State Machine",id:"the-purpose-of-the-state-machine",level:2}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"smooth-validator-states",children:"Smooth Validator States"})}),"\n",(0,a.jsxs)(t.p,{children:["A ",(0,a.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," validator can be in multiple states depending on its behavior. In this section we will explain all possible states a validator can have, the consequences of being each state, and how a validator can transition from one state to another."]}),"\n",(0,a.jsx)(t.h2,{id:"state-machine-overview",children:"State Machine Overview"}),"\n",(0,a.jsxs)(t.p,{children:["The oracle employs a ",(0,a.jsx)(t.strong,{children:"state machine"})," to monitor the status of subscribed validators within ",(0,a.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),". Various actions trigger state changes, detailed in the following image encompassing all possible transitions. Let's take a look at it:"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"statemachine",src:o(2252).A+"",width:"2998",height:"1494"})}),"\n",(0,a.jsx)(t.p,{children:"There are 6 different states a validator can have:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\ud83d\udfe2 ",(0,a.jsx)(t.strong,{children:"Active"}),": The validator is active and subscribed to the pool, earning rewards over time."]}),"\n",(0,a.jsxs)(t.li,{children:["\ud83d\udfe1 ",(0,a.jsx)(t.strong,{children:"YellowCard"}),": The validator missed its last block proposal but not two in a row. This validator earns rewards as if it was active."]}),"\n",(0,a.jsxs)(t.li,{children:["\ud83d\udd34 ",(0,a.jsx)(t.strong,{children:"RedCard"}),": The validator missed its latest two block proposals in a row. As a penalty, the validator does not earn rewards until its next block is successfully proposed to the pool. In other words, this validator is not receiving ",(0,a.jsx)(t.code,{children:"Pending Rewards"})," when somebody else contributes to the pool."]}),"\n",(0,a.jsxs)(t.li,{children:["\u26aa ",(0,a.jsx)(t.strong,{children:"NotSubscribed"}),": The validator is no longer subscribed to the pool, but still tracked by the validator. For example, a validator that unsubscribed. Note that this is still tracked because a validator can unsubscribe but it may still have pending balance to claim. In this state, the validator does not earn rewards."]}),"\n",(0,a.jsxs)(t.li,{children:["\u2620\ufe0f ",(0,a.jsx)(t.strong,{children:"Banned"}),": The validator is banned forever from the pool. A validator is banned when it is subscribed to the pool but proposes a block with the wrong fee recipient."]}),"\n",(0,a.jsxs)(t.li,{children:["\u2753",(0,a.jsx)(t.strong,{children:"Untracked"}),": The validator is not tracked by the pool. It has never subscribed to the pool."]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"And 6 different actions can trigger a state transition:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.code,{children:"ProposalOk"}),": The validator proposed a valid block with its rewards correctly sent to the smoothing pool address."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.code,{children:"ProposalMissed"}),": The validator should have proposed a block but missed its proposal."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.code,{children:"ProposalWrongFee"}),": The validator proposes a block but with a wrong fee recipient."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.code,{children:"ManualSubscription"}),": The validator manually subscribes to the pool, depositing collateral for its validator index by calling the smart contract function (see event)."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.code,{children:"AutoSubscription"}),": The validator is automatically subscribed to the pool, by setting as fee recipient the smoothing pool address."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.code,{children:"Unsubscribe"}),": The validator manually unsubscribes to the pool, calling the unsubscribe function from the smart contract (see event)."]}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"the-purpose-of-the-state-machine",children:"The purpose of the State Machine"}),"\n",(0,a.jsx)(t.p,{children:"Beyond tracking validator statuses, the state machine ensures fair reward distribution and encourages correct behavior among validators."}),"\n",(0,a.jsx)(t.p,{children:"Validators consistently proposing blocks receive greater rewards compared to those frequently missing proposals, promoting active participation and contribution to the pool."})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},2252:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/smooth_states-1ba74d83a78fa2e0b740effe50c30ee8.png"},28453:(e,t,o)=>{o.d(t,{R:()=>n,x:()=>r});var s=o(96540);const a={},i=s.createContext(a);function n(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:n(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/3fd5908e.234ad521.js b/assets/js/3fd5908e.234ad521.js
new file mode 100644
index 000000000..ae6a79164
--- /dev/null
+++ b/assets/js/3fd5908e.234ad521.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4767],{42180:(i,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>e,toc:()=>l});const e=JSON.parse('{"id":"user/notifications/inbox","title":"\ud83d\udce8 Notifications Inbox","description":"In the inbox section, you will see new notifications and the complete history.","source":"@site/docs/user/notifications/inbox.md","sourceDirName":"user/notifications","slug":"/user/notifications/inbox","permalink":"/docs/user/notifications/inbox","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/notifications/inbox.md","tags":[],"version":"current","frontMatter":{"title":"\ud83d\udce8 Notifications Inbox","llm_description":"View notification inbox with history, priority levels, status, categories, and filtering options."},"sidebar":"userSidebar","previous":{"title":"Notifications List","permalink":"/docs/user/notifications/notifications-list"},"next":{"title":"Settings","permalink":"/docs/user/notifications/settings"}}');var o=t(74848),s=t(28453);const r={title:"\ud83d\udce8 Notifications Inbox",llm_description:"View notification inbox with history, priority levels, status, categories, and filtering options."},c="\ud83d\udce8 Notifications Inbox",a={},l=[];function d(i){const n={code:"code",h1:"h1",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...i.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"-notifications-inbox",children:"\ud83d\udce8 Notifications Inbox"})}),"\n",(0,o.jsx)(n.p,{children:"In the inbox section, you will see new notifications and the complete history.\nTo understand how notifications work, there are several key characteristic to consider:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"New notification"}),": Unread notification that will show at the top of the history."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"History"}),": Notifications seen previously"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Priority"}),": Importance level of the notification: Informational, Relevant, Important and Critical","\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Informational"})," \u2013 Awareness only; no action is needed."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Relevant"})," \u2013 Action is recommended but not urgent."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Important"})," \u2013 Prompt action is strongly advised."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Critical"})," \u2013 Immediate action is required."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Status"}),": Two notification status: ",(0,o.jsx)(n.code,{children:"Triggered"})," when the notification is active and it is sent, and ",(0,o.jsx)(n.code,{children:"Resolved"})," when the event notified is back to normal."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Category"}),": There are different notifications categories: Hardware, System, Ethereum, Lukso, Gnosis and Hoodi. You can filter the notifications by category."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Banner"}),": It is shown at the top of the UI for urgent notices."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Filter:"})," You can filter notifications in the search bar by Package name (",(0,o.jsx)(n.code,{children:"DnpName"}),") Title and keywords."]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Notifications_inbox",src:t(81086).A+"",width:"2880",height:"1570"})})]})}function h(i={}){const{wrapper:n}={...(0,s.R)(),...i.components};return n?(0,o.jsx)(n,{...i,children:(0,o.jsx)(d,{...i})}):d(i)}},81086:(i,n,t)=>{t.d(n,{A:()=>e});const e=t.p+"assets/images/notifications_inbox-b08c50b3ae68074da28544ce2d25c66a.png"},28453:(i,n,t)=>{t.d(n,{R:()=>r,x:()=>c});var e=t(96540);const o={},s=e.createContext(o);function r(i){const n=e.useContext(s);return e.useMemo((function(){return"function"==typeof i?i(n):{...n,...i}}),[n,i])}function c(i){let n;return n=i.disableParentContext?"function"==typeof i.components?i.components(o):i.components||o:r(i.components),e.createElement(s.Provider,{value:n},i.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/429a0bc8.cbc6041e.js b/assets/js/429a0bc8.cbc6041e.js
new file mode 100644
index 000000000..2bd43bc20
--- /dev/null
+++ b/assets/js/429a0bc8.cbc6041e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[6636],{11741:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"user/staking/starknet/solo","title":"\ud83d\ude80 Starknet Validator Solo Staking Guide","description":"Starknet is a Layer 2 network built on Ethereum, designed for scalability and performance using STARK proofs.","source":"@site/docs/user/staking/starknet/solo.md","sourceDirName":"user/staking/starknet","slug":"/user/staking/starknet/solo","permalink":"/docs/user/staking/starknet/solo","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/starknet/solo.md","tags":[],"version":"current","frontMatter":{"title":"\ud83d\ude80 Starknet Validator Solo Staking Guide","llm_description":"Guide to become a Starknet validator: create accounts, stake STRK, run attestation client."},"sidebar":"userSidebar","previous":{"title":"LUKSO Solo Staking","permalink":"/docs/user/staking/lukso/solo"},"next":{"title":"Overview","permalink":"/docs/user/rollups/overview"}}');var s=t(74848),a=t(28453);const i={title:"\ud83d\ude80 Starknet Validator Solo Staking Guide",llm_description:"Guide to become a Starknet validator: create accounts, stake STRK, run attestation client."},o="\ud83d\ude80 Starknet Validator Solo Staking Guide",l={},c=[{value:"\ud83d\udee0 Prerequisites",id:"-prerequisites",level:2},{value:"1\ufe0f\u20e3 Create Accounts",id:"1\ufe0f\u20e3-create-accounts",level:2},{value:"2\ufe0f\u20e3 Fund and Deploy the Accounts",id:"2\ufe0f\u20e3-fund-and-deploy-the-accounts",level:2},{value:"3\ufe0f\u20e3 Export your operator address private key",id:"3\ufe0f\u20e3-export-your-operator-address-private-key",level:2},{value:"4\ufe0f\u20e3 Approve spending",id:"4\ufe0f\u20e3-approve-spending",level:2},{value:"5\ufe0f\u20e3 Stake STRK",id:"5\ufe0f\u20e3-stake-strk",level:2},{value:"6\ufe0f\u20e3 Install the Starknet Staking Package on Dappnode",id:"6\ufe0f\u20e3-install-the-starknet-staking-package-on-dappnode",level:2},{value:"\ud83e\udde0 Notes & Tips",id:"-notes--tips",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",br:"br",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"-starknet-validator-solo-staking-guide",children:"\ud83d\ude80 Starknet Validator Solo Staking Guide"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Starknet"})," is a Layer 2 network built on Ethereum, designed for scalability and performance using STARK proofs.",(0,s.jsx)(n.br,{}),"\n","This guide will walk you through the ",(0,s.jsx)(n.strong,{children:"complete process of becoming a Starknet validator and Solo Staker"}),", from wallet setup to running your attestation client and validator on DAppNode."]}),"\n",(0,s.jsxs)(n.p,{children:["We\u2019ll use ",(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.a,{href:"https://www.ready.co/",children:"Ready Wallet"})})," and Starknet's block explorer interfaces for all on-chain interactions."]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"-prerequisites",children:"\ud83d\udee0 Prerequisites"}),"\n",(0,s.jsxs)(n.p,{children:["\u2705 ",(0,s.jsx)(n.a,{href:"https://www.ready.co/ready-wallet",children:"Ready Wallet"})," installed",(0,s.jsx)(n.br,{}),"\n","\u2705 Access to a synced Starknet full node (Juno or Pathfinder)",(0,s.jsx)(n.br,{}),"\n","\u2705 Minimum STRK balance:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Sepolia:"})," 1 STRK"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Mainnet:"})," 20,000 STRK"]}),"\n"]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"1\ufe0f\u20e3-create-accounts",children:"1\ufe0f\u20e3 Create Accounts"}),"\n",(0,s.jsxs)(n.p,{children:["We\u2019ll use ",(0,s.jsx)(n.strong,{children:"three Starknet accounts"})," in Ready:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"staker"})," \u2192 Holds your stake"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"operator"})," \u2192 Runs the validator"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"rewards"})," \u2192 Receives rewards"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["\ud83d\udc49 Create them directly in Ready Wallet as ",(0,s.jsx)(n.em,{children:"Standard Account"})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:"https://github.com/dappnode/DAppNodePackage-starknetstaking-generic/raw/main/images/argent-create-account.png",alt:"Ready wallet create account"})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"2\ufe0f\u20e3-fund-and-deploy-the-accounts",children:"2\ufe0f\u20e3 Fund and Deploy the Accounts"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Fund your ",(0,s.jsx)(n.strong,{children:"staker"})," and ",(0,s.jsx)(n.strong,{children:"operator"})," accounts with the required STRK amount."]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["Remember to add more than the minimum staking amount to cover gas fees.",(0,s.jsx)(n.br,{}),"\n","On Sepolia, you can use the ",(0,s.jsx)(n.a,{href:"https://starknet-faucet.vercel.app",children:"Starknet Faucet"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Deploy your ",(0,s.jsx)(n.strong,{children:"accounts"})," in Ready Wallet following these steps:",(0,s.jsx)(n.br,{}),"\n",(0,s.jsx)(n.img,{src:"https://i.imgur.com/LzwWHl0.gif",alt:"account deploy"})]}),"\n"]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"3\ufe0f\u20e3-export-your-operator-address-private-key",children:"3\ufe0f\u20e3 Export your operator address private key"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.em,{children:"starknetstaking"})," package needs your ",(0,s.jsx)(n.strong,{children:"operator"})," address private key to make the ",(0,s.jsx)(n.em,{children:"attestations"}),".",(0,s.jsx)(n.br,{}),"\n","You can obtain it from ",(0,s.jsx)(n.em,{children:"Ready Wallet"})," following these steps:",(0,s.jsx)(n.br,{}),"\n",(0,s.jsx)(n.img,{src:"https://github.com/dappnode/DAppNodePackage-starknetstaking-generic/raw/main/images/export-pk.gif",alt:"export PK"})]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"4\ufe0f\u20e3-approve-spending",children:"4\ufe0f\u20e3 Approve spending"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Go to the block explorer STRK token contract ",(0,s.jsx)(n.a,{href:"https://sepolia.voyager.online/contract/0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d#writeContract",children:"STRK (Sepolia)"})," or ",(0,s.jsx)(n.a,{href:"https://voyager.online/contract/0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d#writeContract",children:"STRK (Mainnet)"})]}),"\n",(0,s.jsxs)(n.li,{children:["Connect your ",(0,s.jsx)(n.strong,{children:"staker"})," Ready Wallet."]}),"\n",(0,s.jsxs)(n.li,{children:["In the implementation section, scroll down to the ",(0,s.jsx)(n.code,{children:"approve"})," function (#19 on Sepolia #22 in Mainnet)"]}),"\n",(0,s.jsxs)(n.li,{children:["Click and fill in the data:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"spender"})," \u2192 Starknet Staking Contract ",(0,s.jsx)(n.a,{href:"https://docs.starknet.io/resources/chain-info/#staking",children:"Starknet Addresses"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"amount"})," \u2192 Amount in FRI (1 STRK = ",(0,s.jsx)(n.code,{children:"1000000000000000000"}),")"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Click the ",(0,s.jsx)(n.strong,{children:"Transact"})," button."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:"https://github.com/dappnode/DAppNodePackage-starknetstaking-generic/raw/main/images/voyager-approve.png",alt:"Voyager approve"})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"5\ufe0f\u20e3-stake-strk",children:"5\ufe0f\u20e3 Stake STRK"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Open the ",(0,s.jsx)(n.a,{href:"https://sepolia.voyager.online/contract/0x03745ab04a431fc02871a139be6b93d9260b0ff3e779ad9c8b377183b23109f1#writeContract",children:"Staking Contract on Voyager (Sepolia)"})," or the ",(0,s.jsx)(n.a,{href:"https://voyager.online/contract/0x00ca1702e64c81d9a07b86bd2c540188d92a2c73cf5cc0e508d949015e7e84a7#writeContract",children:"Staking Contract on Voyager (Mainnet)"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Connect your ",(0,s.jsx)(n.strong,{children:"staker"})," Ready Wallet."]}),"\n",(0,s.jsxs)(n.li,{children:["In the implementation section, scroll down to the ",(0,s.jsx)(n.code,{children:"stake"})," function (#1)"]}),"\n",(0,s.jsxs)(n.li,{children:["Click and fill in the calldata:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"rewards_address"})," \u2192 Your rewards account"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"operational_address"})," \u2192 Your operator account"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"amount"})," \u2192 Amount in FRI (1 STRK = ",(0,s.jsx)(n.code,{children:"1000000000000000000"}),")"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Click the ",(0,s.jsx)(n.strong,{children:"Transact"})," button."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["\ud83d\udccc ",(0,s.jsx)(n.strong,{children:"Staking contract addresses:"})," ",(0,s.jsx)(n.a,{href:"https://docs.starknet.io/resources/chain-info/#staking",children:"Starknet Docs \u2013 Staking"})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:"https://github.com/dappnode/DAppNodePackage-starknetstaking-generic/raw/main/images/voyager-stake.png",alt:"Voyager write contract stake"})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"6\ufe0f\u20e3-install-the-starknet-staking-package-on-dappnode",children:"6\ufe0f\u20e3 Install the Starknet Staking Package on Dappnode"}),"\n",(0,s.jsx)(n.p,{children:"Now that you\u2019ve staked, you need to set up the validator client on your DAppNode."}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Open your Dappnode UI."}),"\n",(0,s.jsxs)(n.li,{children:["Go to the ",(0,s.jsx)(n.strong,{children:"DAppStore"})," and search for ",(0,s.jsx)(n.code,{children:"starknetstaking"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Install"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"During the installation process, you will need to enter the following information:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"Operational Address"})," \u2192 The address for the ",(0,s.jsx)(n.code,{children:"operator"})," Account you created via Ready Wallet in step #1"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"Private Key"})," \u2192 The private key from your operator account (exported from Ready Wallet in step #3)"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:"https://github.com/dappnode/DAppNodePackage-starknetstaking-generic/raw/main/images/dappnode-package.png",alt:"Dappnode"})}),"\n",(0,s.jsxs)(n.p,{children:["The attestation process will start automatically, and your validator will be live. You can check rewards and more info via the ",(0,s.jsx)(n.code,{children:"staker_info_v1"})," contract in Voyager ",(0,s.jsx)(n.a,{href:"https://voyager.online/contract/0x00ca1702e64c81d9a07b86bd2c540188d92a2c73cf5cc0e508d949015e7e84a7#readContract",children:"Mainnet"})," or ",(0,s.jsx)(n.a,{href:"https://sepolia.voyager.online/contract/0x03745Ab04a431fc02871A139be6B93D9260b0Ff3E779AD9c8B377183B23109F1#readContract",children:"Sepolia"})]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"-notes--tips",children:"\ud83e\udde0 Notes & Tips"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["You can ",(0,s.jsx)(n.strong,{children:"claim rewards"})," or ",(0,s.jsx)(n.strong,{children:"increase stake"})," later from the same Voyager contract UI."]}),"\n",(0,s.jsxs)(n.li,{children:["Make sure your validator client runs ",(0,s.jsx)(n.strong,{children:"24/7"})," to avoid penalties."]}),"\n",(0,s.jsx)(n.li,{children:"Always test your setup on Sepolia before moving to mainnet."}),"\n"]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"References:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.ready.co/",children:"Ready Wallet"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://voyager.online/",children:"Voyager StarkNet Explorer"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://starkscan.co/",children:"Starkscan Starknet Explorer"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.starknet.io/architecture/staking/",children:"Starknet Staking Docs"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/NethermindEth/juno",children:"Juno Full Node"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>o});var r=t(96540);const s={},a=r.createContext(s);function i(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/4622.a84f3638.js b/assets/js/4622.a84f3638.js
new file mode 100644
index 000000000..32137f8a3
--- /dev/null
+++ b/assets/js/4622.a84f3638.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4622],{83750:(e,t,s)=>{s.d(t,{in:()=>c,OU:()=>A,Ki:()=>k,kJ:()=>x,x:()=>i,e7:()=>h,J_:()=>f,Gx:()=>N});var a=s(96540),n=s(26849),l=s(69062),r=s(74848);function i(){const e=(0,l.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=a.createContext(null);function c(e){let{children:t,content:s,isBlogPostPage:n=!1}=e;const l=function(e){let{content:t,isBlogPostPage:s}=e;return(0,a.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:s})),[t,s])}({content:s,isBlogPostPage:n});return(0,r.jsx)(o.Provider,{value:l,children:t})}function h(){const e=(0,a.useContext)(o);if(null===e)throw new n.dV("BlogPostProvider");return e}var m=s(29030),u=s(40797);const d=e=>new Date(e).toISOString();function g(e){const t=e.map(v);return{author:1===t.length?t[0]:t}}function p(e,t,s){return e?{image:w({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${s}`})}:{}}function x(e){const{siteConfig:t}=(0,u.A)(),{withBaseUrl:s}=(0,m.hH)(),{metadata:{blogDescription:a,blogTitle:n,permalink:l}}=e,r=`${t.url}${l}`;return{"@context":"https://schema.org","@type":"Blog","@id":r,mainEntityOfPage:r,headline:n,description:a,blogPost:e.items.map((e=>function(e,t,s){const{assets:a,frontMatter:n,metadata:l}=e,{date:r,title:i,description:o,lastUpdatedAt:c}=l,h=a.image??n.image,m=n.keywords??[],u=`${t.url}${l.permalink}`,x=c?d(c):void 0;return{"@type":"BlogPosting","@id":u,mainEntityOfPage:u,url:u,headline:i,name:i,description:o,datePublished:r,...x?{dateModified:x}:{},...g(l.authors),...p(h,s,i),...m?{keywords:m}:{}}}(e.content,t,s)))}}function f(){const e=i(),{assets:t,metadata:s}=h(),{siteConfig:a}=(0,u.A)(),{withBaseUrl:n}=(0,m.hH)(),{date:l,title:r,description:o,frontMatter:c,lastUpdatedAt:x}=s,f=t.image??c.image,v=c.keywords??[],w=x?d(x):void 0,j=`${a.url}${s.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":j,mainEntityOfPage:j,url:j,headline:r,name:r,description:o,datePublished:l,...w?{dateModified:w}:{},...g(s.authors),...p(f,n,r),...v?{keywords:v}:{},isPartOf:{"@type":"Blog","@id":`${a.url}${e.blogBasePath}`,name:e.blogTitle}}}function v(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function w(e){let{imageUrl:t,caption:s}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:s}}var j=s(56347),b=s(56289),C=s(11861),M=s(30214);function N(e){const{pathname:t}=(0,j.zy)();return(0,a.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,M.ys)(e.permalink,t))}(e,t)))),[e,t])}function k(e){const t=(0,C.$z)(e,(e=>`${new Date(e.date).getFullYear()}`)),s=Object.entries(t);return s.reverse(),s}function A(e){let{items:t,ulClassName:s,liClassName:a,linkClassName:n,linkActiveClassName:l}=e;return(0,r.jsx)("ul",{className:s,children:t.map((e=>(0,r.jsx)("li",{className:a,children:(0,r.jsx)(b.A,{isNavLink:!0,to:e.permalink,className:n,activeClassName:l,children:e.title})},e.permalink)))})}},95921:(e,t,s)=>{s.d(t,{A:()=>C});var a=s(96540),n=s(18215),l=s(56289),r=s(74848);const i="githubSvg_Uu4N";const o="xSvg_y3PF";const c=function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[(0,r.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,r.jsx)("path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"}),(0,r.jsx)("path",{d:"M3.6 9h16.8"}),(0,r.jsx)("path",{d:"M3.6 15h16.8"}),(0,r.jsx)("path",{d:"M11.5 3a17 17 0 0 0 0 18"}),(0,r.jsx)("path",{d:"M12.5 3a17 17 0 0 1 0 18"})]})};const h="instagramSvg_YC40";const m="threadsSvg_PTXY";const u={authorSocials:"authorSocials_rSDt",authorSocialLink:"authorSocialLink_owbf",authorSocialIcon:"authorSocialIcon_XYv3"},d={twitter:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 209",width:"1em",height:"1em",preserveAspectRatio:"xMidYMid",...e,children:(0,r.jsx)("path",{d:"M256 25.45c-9.42 4.177-19.542 7-30.166 8.27 10.845-6.5 19.172-16.793 23.093-29.057a105.183 105.183 0 0 1-33.351 12.745C205.995 7.201 192.346.822 177.239.822c-29.006 0-52.523 23.516-52.523 52.52 0 4.117.465 8.125 1.36 11.97-43.65-2.191-82.35-23.1-108.255-54.876-4.52 7.757-7.11 16.78-7.11 26.404 0 18.222 9.273 34.297 23.365 43.716a52.312 52.312 0 0 1-23.79-6.57c-.003.22-.003.44-.003.661 0 25.447 18.104 46.675 42.13 51.5a52.592 52.592 0 0 1-23.718.9c6.683 20.866 26.08 36.05 49.062 36.475-17.975 14.086-40.622 22.483-65.228 22.483-4.24 0-8.42-.249-12.529-.734 23.243 14.902 50.85 23.597 80.51 23.597 96.607 0 149.434-80.031 149.434-149.435 0-2.278-.05-4.543-.152-6.795A106.748 106.748 0 0 0 256 25.45",fill:"#55acee"})})},label:"Twitter"},github:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 256 250",preserveAspectRatio:"xMidYMid",style:{"--dark":"#000","--light":"#fff"},...e,className:(0,n.A)(e.className,i),children:(0,r.jsx)("path",{d:"M128.001 0C57.317 0 0 57.307 0 128.001c0 56.554 36.676 104.535 87.535 121.46 6.397 1.185 8.746-2.777 8.746-6.158 0-3.052-.12-13.135-.174-23.83-35.61 7.742-43.124-15.103-43.124-15.103-5.823-14.795-14.213-18.73-14.213-18.73-11.613-7.944.876-7.78.876-7.78 12.853.902 19.621 13.19 19.621 13.19 11.417 19.568 29.945 13.911 37.249 10.64 1.149-8.272 4.466-13.92 8.127-17.116-28.431-3.236-58.318-14.212-58.318-63.258 0-13.975 5-25.394 13.188-34.358-1.329-3.224-5.71-16.242 1.24-33.874 0 0 10.749-3.44 35.21 13.121 10.21-2.836 21.16-4.258 32.038-4.307 10.878.049 21.837 1.47 32.066 4.307 24.431-16.56 35.165-13.12 35.165-13.12 6.967 17.63 2.584 30.65 1.255 33.873 8.207 8.964 13.173 20.383 13.173 34.358 0 49.163-29.944 59.988-58.447 63.157 4.591 3.972 8.682 11.762 8.682 23.704 0 17.126-.148 30.91-.148 35.126 0 3.407 2.304 7.398 8.792 6.14C219.37 232.5 256 184.537 256 128.002 256 57.307 198.691 0 128.001 0Zm-80.06 182.34c-.282.636-1.283.827-2.194.39-.929-.417-1.45-1.284-1.15-1.922.276-.655 1.279-.838 2.205-.399.93.418 1.46 1.293 1.139 1.931Zm6.296 5.618c-.61.566-1.804.303-2.614-.591-.837-.892-.994-2.086-.375-2.66.63-.566 1.787-.301 2.626.591.838.903 1 2.088.363 2.66Zm4.32 7.188c-.785.545-2.067.034-2.86-1.104-.784-1.138-.784-2.503.017-3.05.795-.547 2.058-.055 2.861 1.075.782 1.157.782 2.522-.019 3.08Zm7.304 8.325c-.701.774-2.196.566-3.29-.49-1.119-1.032-1.43-2.496-.726-3.27.71-.776 2.213-.558 3.315.49 1.11 1.03 1.45 2.505.701 3.27Zm9.442 2.81c-.31 1.003-1.75 1.459-3.199 1.033-1.448-.439-2.395-1.613-2.103-2.626.301-1.01 1.747-1.484 3.207-1.028 1.446.436 2.396 1.602 2.095 2.622Zm10.744 1.193c.036 1.055-1.193 1.93-2.715 1.95-1.53.034-2.769-.82-2.786-1.86 0-1.065 1.202-1.932 2.733-1.958 1.522-.03 2.768.818 2.768 1.868Zm10.555-.405c.182 1.03-.875 2.088-2.387 2.37-1.485.271-2.861-.365-3.05-1.386-.184-1.056.893-2.114 2.376-2.387 1.514-.263 2.868.356 3.061 1.403Z"})})},label:"GitHub"},stackoverflow:{Icon:function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 169.61 200",width:"1em",height:"1em",...e,children:[(0,r.jsx)("path",{d:"M140.44 178.38v-48.65h21.61V200H0v-70.27h21.61v48.65z",fill:"#bcbbbb"}),(0,r.jsx)("path",{d:"M124.24 140.54l4.32-16.22-86.97-17.83-3.78 17.83zM49.7 82.16L130.72 120l7.56-16.22-81.02-37.83zm22.68-40l68.06 57.3 11.35-13.51-68.6-57.3-11.35 13.51zM116.14 0l-14.59 10.81 53.48 71.89 14.58-10.81zM37.81 162.16h86.43v-16.21H37.81z",fill:"#f48024"})]})},label:"Stack Overflow"},linkedin:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",preserveAspectRatio:"xMidYMid",viewBox:"0 0 256 256",...e,children:(0,r.jsx)("path",{d:"M218.123 218.127h-37.931v-59.403c0-14.165-.253-32.4-19.728-32.4-19.756 0-22.779 15.434-22.779 31.369v60.43h-37.93V95.967h36.413v16.694h.51a39.907 39.907 0 0 1 35.928-19.733c38.445 0 45.533 25.288 45.533 58.186l-.016 67.013ZM56.955 79.27c-12.157.002-22.014-9.852-22.016-22.009-.002-12.157 9.851-22.014 22.008-22.016 12.157-.003 22.014 9.851 22.016 22.008A22.013 22.013 0 0 1 56.955 79.27m18.966 138.858H37.95V95.967h37.97v122.16ZM237.033.018H18.89C8.58-.098.125 8.161-.001 18.471v219.053c.122 10.315 8.576 18.582 18.89 18.474h218.144c10.336.128 18.823-8.139 18.966-18.474V18.454c-.147-10.33-8.635-18.588-18.966-18.453",fill:"#0A66C2"})})},label:"LinkedIn"},x:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",fill:"none",viewBox:"0 0 1200 1227",style:{"--dark":"#000","--light":"#fff"},...e,className:(0,n.A)(e.className,o),children:(0,r.jsx)("path",{d:"M714.163 519.284 1160.89 0h-105.86L667.137 450.887 357.328 0H0l468.492 681.821L0 1226.37h105.866l409.625-476.152 327.181 476.152H1200L714.137 519.284h.026ZM569.165 687.828l-47.468-67.894-377.686-540.24h162.604l304.797 435.991 47.468 67.894 396.2 566.721H892.476L569.165 687.854v-.026Z"})})},label:"X"},bluesky:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",preserveAspectRatio:"xMidYMid",viewBox:"0 0 256 226",...e,children:(0,r.jsx)("path",{fill:"#1185FE",d:"M55.491 15.172c29.35 22.035 60.917 66.712 72.509 90.686 11.592-23.974 43.159-68.651 72.509-90.686C221.686-.727 256-13.028 256 26.116c0 7.818-4.482 65.674-7.111 75.068-9.138 32.654-42.436 40.983-72.057 35.942 51.775 8.812 64.946 38 36.501 67.187-54.021 55.433-77.644-13.908-83.696-31.676-1.11-3.257-1.63-4.78-1.637-3.485-.008-1.296-.527.228-1.637 3.485-6.052 17.768-29.675 87.11-83.696 31.676-28.445-29.187-15.274-58.375 36.5-67.187-29.62 5.041-62.918-3.288-72.056-35.942C4.482 91.79 0 33.934 0 26.116 0-13.028 34.314-.727 55.491 15.172Z"})})},label:"Bluesky"},instagram:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",preserveAspectRatio:"xMidYMid",viewBox:"0 0 256 256",style:{"--dark":"#000","--light":"#fff"},...e,className:(0,n.A)(e.className,h),children:(0,r.jsx)("path",{d:"M128 23.064c34.177 0 38.225.13 51.722.745 12.48.57 19.258 2.655 23.769 4.408 5.974 2.322 10.238 5.096 14.717 9.575 4.48 4.479 7.253 8.743 9.575 14.717 1.753 4.511 3.838 11.289 4.408 23.768.615 13.498.745 17.546.745 51.723 0 34.178-.13 38.226-.745 51.723-.57 12.48-2.655 19.257-4.408 23.768-2.322 5.974-5.096 10.239-9.575 14.718-4.479 4.479-8.743 7.253-14.717 9.574-4.511 1.753-11.289 3.839-23.769 4.408-13.495.616-17.543.746-51.722.746-34.18 0-38.228-.13-51.723-.746-12.48-.57-19.257-2.655-23.768-4.408-5.974-2.321-10.239-5.095-14.718-9.574-4.479-4.48-7.253-8.744-9.574-14.718-1.753-4.51-3.839-11.288-4.408-23.768-.616-13.497-.746-17.545-.746-51.723 0-34.177.13-38.225.746-51.722.57-12.48 2.655-19.258 4.408-23.769 2.321-5.974 5.095-10.238 9.574-14.717 4.48-4.48 8.744-7.253 14.718-9.575 4.51-1.753 11.288-3.838 23.768-4.408 13.497-.615 17.545-.745 51.723-.745M128 0C93.237 0 88.878.147 75.226.77c-13.625.622-22.93 2.786-31.071 5.95-8.418 3.271-15.556 7.648-22.672 14.764C14.367 28.6 9.991 35.738 6.72 44.155 3.555 52.297 1.392 61.602.77 75.226.147 88.878 0 93.237 0 128c0 34.763.147 39.122.77 52.774.622 13.625 2.785 22.93 5.95 31.071 3.27 8.417 7.647 15.556 14.763 22.672 7.116 7.116 14.254 11.492 22.672 14.763 8.142 3.165 17.446 5.328 31.07 5.95 13.653.623 18.012.77 52.775.77s39.122-.147 52.774-.77c13.624-.622 22.929-2.785 31.07-5.95 8.418-3.27 15.556-7.647 22.672-14.763 7.116-7.116 11.493-14.254 14.764-22.672 3.164-8.142 5.328-17.446 5.95-31.07.623-13.653.77-18.012.77-52.775s-.147-39.122-.77-52.774c-.622-13.624-2.786-22.929-5.95-31.07-3.271-8.418-7.648-15.556-14.764-22.672C227.4 14.368 220.262 9.99 211.845 6.72c-8.142-3.164-17.447-5.328-31.071-5.95C167.122.147 162.763 0 128 0Zm0 62.27C91.698 62.27 62.27 91.7 62.27 128c0 36.302 29.428 65.73 65.73 65.73 36.301 0 65.73-29.428 65.73-65.73 0-36.301-29.429-65.73-65.73-65.73Zm0 108.397c-23.564 0-42.667-19.103-42.667-42.667S104.436 85.333 128 85.333s42.667 19.103 42.667 42.667-19.103 42.667-42.667 42.667Zm83.686-110.994c0 8.484-6.876 15.36-15.36 15.36-8.483 0-15.36-6.876-15.36-15.36 0-8.483 6.877-15.36 15.36-15.36 8.484 0 15.36 6.877 15.36 15.36Z"})})},label:"Instagram"},threads:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg","aria-label":"Threads",viewBox:"0 0 192 192",width:"1em",fill:"none",height:"1em",style:{"--dark":"#000","--light":"#fff"},...e,className:(0,n.A)(e.className,m),children:(0,r.jsx)("path",{d:"M141.537 88.988a66.667 66.667 0 0 0-2.518-1.143c-1.482-27.307-16.403-42.94-41.457-43.1h-.34c-14.986 0-27.449 6.396-35.12 18.036l13.779 9.452c5.73-8.695 14.724-10.548 21.348-10.548h.229c8.249.053 14.474 2.452 18.503 7.129 2.932 3.405 4.893 8.111 5.864 14.05-7.314-1.243-15.224-1.626-23.68-1.14-23.82 1.371-39.134 15.264-38.105 34.568.522 9.792 5.4 18.216 13.735 23.719 7.047 4.652 16.124 6.927 25.557 6.412 12.458-.683 22.231-5.436 29.049-14.127 5.178-6.6 8.453-15.153 9.899-25.93 5.937 3.583 10.337 8.298 12.767 13.966 4.132 9.635 4.373 25.468-8.546 38.376-11.319 11.308-24.925 16.2-45.488 16.351-22.809-.169-40.06-7.484-51.275-21.742C35.236 139.966 29.808 120.682 29.605 96c.203-24.682 5.63-43.966 16.133-57.317C56.954 24.425 74.204 17.11 97.013 16.94c22.975.17 40.526 7.52 52.171 21.847 5.71 7.026 10.015 15.86 12.853 26.162l16.147-4.308c-3.44-12.68-8.853-23.606-16.219-32.668C147.036 9.607 125.202.195 97.07 0h-.113C68.882.194 47.292 9.642 32.788 28.08 19.882 44.485 13.224 67.315 13.001 95.932L13 96v.067c.224 28.617 6.882 51.447 19.788 67.854C47.292 182.358 68.882 191.806 96.957 192h.113c24.96-.173 42.554-6.708 57.048-21.189 18.963-18.945 18.392-42.692 12.142-57.27-4.484-10.454-13.033-18.945-24.723-24.553ZM98.44 129.507c-10.44.588-21.286-4.098-21.82-14.135-.397-7.442 5.296-15.746 22.461-16.735 1.966-.114 3.895-.169 5.79-.169 6.235 0 12.068.606 17.371 1.765-1.978 24.702-13.58 28.713-23.802 29.274Z"})})},label:"Threads"},mastodon:{Icon:function(e){const t=(0,a.useId)();return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 61 65",width:"1em",height:"1em",...e,children:[(0,r.jsx)("path",{fill:`url(#${t})`,d:"M60.754 14.39C59.814 7.406 53.727 1.903 46.512.836 45.294.656 40.682 0 29.997 0h-.08C19.23 0 16.938.656 15.72.836 8.705 1.873 2.299 6.82.745 13.886c-.748 3.48-.828 7.338-.689 10.877.198 5.075.237 10.142.697 15.197a71.482 71.482 0 0 0 1.664 9.968c1.477 6.056 7.458 11.096 13.317 13.152a35.718 35.718 0 0 0 19.484 1.028 28.365 28.365 0 0 0 2.107-.576c1.572-.5 3.413-1.057 4.766-2.038a.154.154 0 0 0 .062-.118v-4.899a.146.146 0 0 0-.055-.111.145.145 0 0 0-.122-.028 54 54 0 0 1-12.644 1.478c-7.328 0-9.298-3.478-9.863-4.925a15.258 15.258 0 0 1-.857-3.882.142.142 0 0 1 .178-.145 52.976 52.976 0 0 0 12.437 1.477c1.007 0 2.012 0 3.02-.026 4.213-.119 8.654-.334 12.8-1.144.103-.02.206-.038.295-.065 6.539-1.255 12.762-5.196 13.394-15.176.024-.393.083-4.115.083-4.523.003-1.386.446-9.829-.065-15.017Z"}),(0,r.jsx)("path",{fill:"#fff",d:"M50.394 22.237v17.35H43.52V22.749c0-3.545-1.478-5.353-4.483-5.353-3.303 0-4.958 2.139-4.958 6.364v9.217h-6.835V23.76c0-4.225-1.657-6.364-4.96-6.364-2.988 0-4.48 1.808-4.48 5.353v16.84H10.93V22.237c0-3.545.905-6.362 2.715-8.45 1.868-2.082 4.317-3.152 7.358-3.152 3.519 0 6.178 1.354 7.951 4.057l1.711 2.871 1.714-2.871c1.773-2.704 4.432-4.056 7.945-4.056 3.038 0 5.487 1.069 7.36 3.152 1.81 2.085 2.712 4.902 2.71 8.449Z"}),(0,r.jsx)("defs",{children:(0,r.jsxs)("linearGradient",{id:t,x1:30.5,x2:30.5,y1:0,y2:65,gradientUnits:"userSpaceOnUse",children:[(0,r.jsx)("stop",{stopColor:"#6364FF"}),(0,r.jsx)("stop",{offset:1,stopColor:"#563ACC"})]})})]})},label:"Mastodon"},youtube:{Icon:function(e){return(0,r.jsxs)("svg",{viewBox:"0 0 256 180",width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",...e,children:[(0,r.jsx)("path",{d:"M250.346 28.075A32.18 32.18 0 0 0 227.69 5.418C207.824 0 127.87 0 127.87 0S47.912.164 28.046 5.582A32.18 32.18 0 0 0 5.39 28.24c-6.009 35.298-8.34 89.084.165 122.97a32.18 32.18 0 0 0 22.656 22.657c19.866 5.418 99.822 5.418 99.822 5.418s79.955 0 99.82-5.418a32.18 32.18 0 0 0 22.657-22.657c6.338-35.348 8.291-89.1-.164-123.134Z",fill:"red"}),(0,r.jsx)("path",{fill:"#FFF",d:"m102.421 128.06 66.328-38.418-66.328-38.418z"})]})},label:"YouTube"},twitch:{Icon:function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",x:0,y:0,viewBox:"0 0 2400 2800",width:"1em",height:"1em",...e,children:[(0,r.jsx)("path",{d:"m2200 1300-400 400h-400l-350 350v-350H600V200h1600z",fill:"#fff"}),(0,r.jsxs)("g",{children:[(0,r.jsx)("path",{d:"M500 0 0 500v1800h600v500l500-500h400l900-900V0H500zm1700 1300-400 400h-400l-350 350v-350H600V200h1600v1100z",fill:"#9146ff"}),(0,r.jsx)("path",{d:"M1700 550h200v600h-200zM1150 550h200v600h-200z",fill:"#9146ff"})]})]})},label:"Twitch"}};function g(e){let{platform:t,link:s}=e;const{Icon:a,label:i}=d[o=t]??{Icon:c,label:o};var o;return(0,r.jsx)(l.A,{className:u.authorSocialLink,href:s,title:i,children:(0,r.jsx)(a,{className:(0,n.A)(u.authorSocialLink)})})}function p(e){let{author:t}=e;const s=Object.entries(t.socials??{});return(0,r.jsx)("div",{className:u.authorSocials,children:s.map((e=>{let[t,s]=e;return(0,r.jsx)(g,{platform:t,link:s},t)}))})}var x=s(9303);const f={authorImage:"authorImage_XqGP","author-as-h1":"author-as-h1_n9oJ","author-as-h2":"author-as-h2_gXvM",authorDetails:"authorDetails_lV9A",authorName:"authorName_yefp",authorTitle:"authorTitle_nd0D",authorBlogPostCount:"authorBlogPostCount_iiJ5"};function v(e){return e.href?(0,r.jsx)(l.A,{...e}):(0,r.jsx)(r.Fragment,{children:e.children})}function w(e){let{title:t}=e;return(0,r.jsx)("small",{className:f.authorTitle,title:t,children:t})}function j(e){let{name:t,as:s}=e;return s?(0,r.jsx)(x.A,{as:s,className:f.authorName,children:t}):(0,r.jsx)("span",{className:f.authorName,children:t})}function b(e){let{count:t}=e;return(0,r.jsx)("span",{className:(0,n.A)(f.authorBlogPostCount),children:t})}function C(e){let{as:t,author:s,className:a,count:l}=e;const{name:i,title:o,url:c,imageURL:h,email:m,page:u}=s,d=u?.permalink||c||m&&`mailto:${m}`||void 0;return(0,r.jsxs)("div",{className:(0,n.A)("avatar margin-bottom--sm",a,f[`author-as-${t}`]),children:[h&&(0,r.jsx)(v,{href:d,className:"avatar__photo-link",children:(0,r.jsx)("img",{className:(0,n.A)("avatar__photo",f.authorImage),src:h,alt:i})}),(i||o)&&(0,r.jsxs)("div",{className:(0,n.A)("avatar__intro",f.authorDetails),children:[(0,r.jsxs)("div",{className:"avatar__name",children:[i&&(0,r.jsx)(v,{href:d,children:(0,r.jsx)(j,{name:i,as:t})}),void 0!==l&&(0,r.jsx)(b,{count:l})]}),!!o&&(0,r.jsx)(w,{title:o}),(0,r.jsx)(p,{author:s})]})]})}},60569:(e,t,s)=>{s.d(t,{A:()=>L});var a=s(96540),n=s(18215),l=s(99795),r=s(86682),i=s(50539),o=s(83750),c=s(53115),h=s(9303),m=s(74848);function u(e){let{year:t,yearGroupHeadingClassName:s,children:a}=e;return(0,m.jsxs)("div",{role:"group",children:[(0,m.jsx)(h.A,{as:"h3",className:s,children:t}),a]})}function d(e){let{items:t,yearGroupHeadingClassName:s,ListComponent:a}=e;if((0,c.p)().blog.sidebar.groupByYear){const e=(0,o.Ki)(t);return(0,m.jsx)(m.Fragment,{children:e.map((e=>{let[t,n]=e;return(0,m.jsx)(u,{year:t,yearGroupHeadingClassName:s,children:(0,m.jsx)(a,{items:n})},t)}))})}return(0,m.jsx)(a,{items:t})}const g=(0,a.memo)(d),p="sidebar_re4s",x="sidebarItemTitle_pO2u",f="sidebarItemList_Yudw",v="sidebarItem__DBe",w="sidebarItemLink_mo7H",j="sidebarItemLinkActive_I1ZP",b="yearGroupHeading_rMGB",C=e=>{let{items:t}=e;return(0,m.jsx)(o.OU,{items:t,ulClassName:(0,n.A)(f,"clean-list"),liClassName:v,linkClassName:w,linkActiveClassName:j})};function M(e){let{sidebar:t}=e;const s=(0,o.Gx)(t.items);return(0,m.jsx)("aside",{className:"col col--3",children:(0,m.jsxs)("nav",{className:(0,n.A)(p,"thin-scrollbar"),"aria-label":(0,i.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,m.jsx)("div",{className:(0,n.A)(x,"margin-bottom--md"),children:t.title}),(0,m.jsx)(g,{items:s,ListComponent:C,yearGroupHeadingClassName:b})]})})}const N=(0,a.memo)(M);var k=s(63065);const A="yearGroupHeading_QT03",_=e=>{let{items:t}=e;return(0,m.jsx)(o.OU,{items:t,ulClassName:"menu__list",liClassName:"menu__list-item",linkClassName:"menu__link",linkActiveClassName:"menu__link--active"})};function y(e){let{sidebar:t}=e;const s=(0,o.Gx)(t.items);return(0,m.jsx)(g,{items:s,ListComponent:_,yearGroupHeadingClassName:A})}function B(e){return(0,m.jsx)(k.GX,{component:y,props:e})}const I=(0,a.memo)(B);function P(e){let{sidebar:t}=e;const s=(0,r.l)();return t?.items.length?"mobile"===s?(0,m.jsx)(I,{sidebar:t}):(0,m.jsx)(N,{sidebar:t}):null}function L(e){const{sidebar:t,toc:s,children:a,...r}=e,i=t&&t.items.length>0;return(0,m.jsx)(l.A,{...r,children:(0,m.jsx)("div",{className:"container margin-vert--lg",children:(0,m.jsxs)("div",{className:"row",children:[(0,m.jsx)(P,{sidebar:t}),(0,m.jsx)("main",{className:(0,n.A)("col",{"col--7":i,"col--9 col--offset-1":!i}),children:a}),s&&(0,m.jsx)("div",{className:"col col--2",children:s})]})})})}},81430:(e,t,s)=>{s.d(t,{W:()=>c});var a=s(96540),n=s(40797);const l=["zero","one","two","few","many","other"];function r(e){return l.filter((t=>e.includes(t)))}const i={locale:"en",pluralForms:r(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,n.A)();return(0,a.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:r(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),i}}),[e])}function c(){const e=o();return{selectMessage:(t,s)=>function(e,t,s){const a=e.split("|");if(1===a.length)return a[0];a.length>s.pluralForms.length&&console.error(`For locale=${s.locale}, a maximum of ${s.pluralForms.length} plural forms are expected (${s.pluralForms.join(",")}), but the message contains ${a.length}: ${e}`);const n=s.select(t),l=s.pluralForms.indexOf(n);return a[Math.min(l,a.length-1)]}(s,t,e)}}}}]);
\ No newline at end of file
diff --git a/assets/js/48096941.0d53229d.js b/assets/js/48096941.0d53229d.js
new file mode 100644
index 000000000..8b656512d
--- /dev/null
+++ b/assets/js/48096941.0d53229d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8756],{255:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>r,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"dev/notifications","title":"\ud83d\udd14 Package Notifications (Coming soon)","description":"Notifications are a way to inform users about events happening in the DAppNode. They are displayed in the notifications tab within the DAppNode UI. Notifications are sent by third-party software, \\"Gatus,\\" which monitors the services running in the DAppNode or arbitrary services that send notifications. Users can configure the notifications they want to receive and set thresholds (if applicable) for these notifications.","source":"@site/docs/dev/notifications.md","sourceDirName":"dev","slug":"/dev/notifications","permalink":"/docs/dev/notifications","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/notifications.md","tags":[],"version":"current","frontMatter":{"title":"\ud83d\udd14 Package Notifications (Coming soon)","llm_description":"Notification system for alerting users about events via the DAppNode UI."},"sidebar":"devSidebar","previous":{"title":"Package Metrics","permalink":"/docs/dev/metrics"},"next":{"title":"Package DNS","permalink":"/docs/dev/dns"}}');var o=i(74848),a=i(28453);const s={title:"\ud83d\udd14 Package Notifications (Coming soon)",llm_description:"Notification system for alerting users about events via the DAppNode UI."},c="\ud83d\udd14 Package Notifications (Coming soon)",r={},d=[{value:"Notification Structure",id:"notification-structure",level:2},{value:"Example Notification Payload",id:"example-notification-payload",level:3},{value:"Notifications Package API",id:"notifications-package-api",level:2},{value:"Example API Request",id:"example-api-request",level:3},{value:"Notifications Inbox",id:"notifications-inbox",level:2},{value:"Notifications Settings",id:"notifications-settings",level:2},{value:"Communication Channels",id:"communication-channels",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"-package-notifications-coming-soon",children:"\ud83d\udd14 Package Notifications (Coming soon)"})}),"\n",(0,o.jsxs)(t.p,{children:["Notifications are a way to inform users about events happening in the DAppNode. They are displayed in the ",(0,o.jsx)(t.a,{href:"http://dappmanager.dappnode/notifications",children:"notifications tab"}),' within the DAppNode UI. Notifications are sent by third-party software, "Gatus," which monitors the services running in the DAppNode or arbitrary services that send notifications. Users can configure the notifications they want to receive and set thresholds (if applicable) for these notifications.']}),"\n",(0,o.jsx)(t.admonition,{type:"info",children:(0,o.jsxs)(t.p,{children:["It is mandatory for users to install the ",(0,o.jsx)(t.a,{href:"https://github.com/dappnode/DNP_NOTIFICATIONS",children:"Notifications package"})," to receive notifications."]})}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.h2,{id:"notification-structure",children:(0,o.jsx)(t.strong,{children:"Notification Structure"})}),"\n",(0,o.jsx)(t.p,{children:"Each notification has a structure that includes the following fields:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"title"}),": The title of the notification. Part of the notification payload."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"body"}),": The body of the notification. Part of the notification payload."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"category"}),": The category of the notification, used to group notifications by type. Part of the notification payload."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"dnpName"}),": The DNP name of the package that sent the notification, used to identify the source package. Part of the notification payload."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"seen"}),": A boolean value indicating whether the notification has been seen by the user. This is handled automatically by the notifications package, with a default value of ",(0,o.jsx)(t.code,{children:"false"}),". It is set to ",(0,o.jsx)(t.code,{children:"true"})," once the user views the notification."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"timestamp"}),": The timestamp of when the notification was sent, used to sort notifications by date. This is automatically set by the notifications package when the notification is received."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"callToAction"}),": An optional field that includes a title and a URL, providing a link for the user to take action on the notification. Part of the notification payload.","\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"title"}),": The title of the call to action."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"url"}),": The URL for the call to action."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"errors"}),": An optional field that includes an error message, providing additional information about the notification. If provided, the notification will not be shown in the inbox. Part of the notification payload."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"icon"}),": An optional field that includes an icon URL, used to display an icon for the notification. If not provided, the icon of the package that sent the notification will be used. Part of the notification payload."]}),"\n"]}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.h3,{id:"example-notification-payload",children:(0,o.jsx)(t.strong,{children:"Example Notification Payload"})}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-json",children:'{\n "title": "string", // e.g., "Geth Ethereum Node Sync Status"\n "body": "string", // e.g., "Geth Ethereum Node Syncing"\n "category": "string", // e.g., "ethereum"\n "dnpName": "string", // e.g., "geth.dnp.dappnode.eth"\n "seen": false, // e.g., false\n "timestamp": "string", // e.g., "2023-10-01T12:00:00Z"\n "priority": "string", // e.g., "medium"\n "status": "string", // e.g., "triggered"\n "correlationId": "string", // e.g., "geth-eth-syncing"\n "isBanner": false, // e.g., false\n "callToAction": {\n "title": "string", // e.g., "View Logs"\n "url": "string" // e.g., "http://dappmanager.dappnode/packages/my/geth.dnp.dappnode.eth/logs"\n },\n "errors": "string", // e.g., "Error: no such host: geth.dappnode"\n "icon": "string" // e.g., "https://gateway.ipfs.dappnode.io/ipfs/QmTVc5LQkTuaN3VxcteQ2E27pHSVJakE6XPo2FMxQTP284"\n}\n'})}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.h2,{id:"notifications-package-api",children:(0,o.jsx)(t.strong,{children:"Notifications Package API"})}),"\n",(0,o.jsx)(t.p,{children:"The notifications package exposes an API that allows other packages to send notifications. This API is a simple HTTP POST request that includes the notification structure as the body of the request. The API is available at the following URL:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"http://notifier.notifications.dappnode:8080/api/v1/notifications\n"})}),"\n",(0,o.jsx)(t.h3,{id:"example-api-request",children:(0,o.jsx)(t.strong,{children:"Example API Request"})}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:'curl -X POST \\\n http://notifier.notifications.dappnode:8080/api/v1/notifications \\\n -H \'Content-Type: application/json\' \\\n -d \'{\n "title": "Test Notification",\n "body": "This is a test notification sent with curl",\n "category": "other",\n "dnpName": "test.dnp.dappnode.eth",\n "priority": "low",\n "status": "triggered",\n "callToAction": {\n "title": "Hello World",\n "url": "http://dappmanager.dappnode"\n },\n "correlationId": "testPkg-test",\n "isBanner": false\n}\'\n'})}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.h2,{id:"notifications-inbox",children:(0,o.jsx)(t.strong,{children:"Notifications Inbox"})}),"\n",(0,o.jsxs)(t.p,{children:["The notifications inbox is a place where users can see all the notifications that have been sent to them. Notifications are grouped by category and can be filtered by date, ",(0,o.jsx)(t.code,{children:"dnpName"}),", and category. Users can also mark notifications as read or delete them."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Notifications-Inbox",src:i(96312).A+"",width:"3382",height:"1452"})}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.h2,{id:"notifications-settings",children:(0,o.jsx)(t.strong,{children:"Notifications Settings"})}),"\n",(0,o.jsx)(t.p,{children:"The notifications settings allow users to configure the notifications they want to receive. Users can enable or disable notifications for each category and set thresholds for each notification. Thresholds determine when a notification should be sent. For example, if a user wants to receive a notification when CPU usage exceeds 80%, they can set the threshold to 80%. If the CPU usage goes above 80%, a notification will be sent."}),"\n",(0,o.jsxs)(t.p,{children:["In order to have a slider in the UI to adjust the threshold of the notification, the (gatus) endpoint must have a ",(0,o.jsx)(t.code,{children:"metric"})," object. Yo can see it in the ",(0,o.jsx)(t.a,{href:"/docs/dev/references/notifications#example-gatus-endpoints",children:"Notifications file reference section"}),"."]}),"\n",(0,o.jsx)(t.admonition,{type:"info",children:(0,o.jsx)(t.p,{children:"Only a threshold per endpoint is supported. The value it will be extracted from the first entry from the conditions array. Updating the value of the slider in the UI will update also the value of that condition."})}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Notifications-Settings",src:i(69417).A+"",width:"3388",height:"1762"})}),"\n",(0,o.jsx)(t.p,{children:"Furthermore, the notifications settings can be configured also during the installation process of the dappnode package."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Notifications-Settings-installer",src:i(72642).A+"",width:"1916",height:"1085"})}),"\n",(0,o.jsx)(t.admonition,{type:"tip",children:(0,o.jsx)(t.p,{children:"The notifications settings are persisted during the automatic update of the package."})}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.h2,{id:"communication-channels",children:(0,o.jsx)(t.strong,{children:"Communication Channels"})}),"\n",(0,o.jsx)(t.p,{children:"Currently, the only communication channel available is the DAppNode UI. However, there are plans to implement additional communication channels, with the following priorities:"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsx)(t.li,{children:"Web push notifications"}),"\n",(0,o.jsx)(t.li,{children:"Telegram"}),"\n"]}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.p,{children:"Thanks for reading the guide! If you found some problem in the process, do not hesitate to contact us in Discord / Telegram."})]})}function l(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},96312:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/notifications-inbox-ebcd098f1dc2ffcbec4cd60f5ecb5aa5.png"},72642:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/notifications-settings-installer-3e96781f3464a4a74ee564c1940c4c6a.png"},69417:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/notifications-settings-4567c9bc82ce1191148277813181fc5b.png"},28453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>c});var n=i(96540);const o={},a=n.createContext(o);function s(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/489.471847d4.js b/assets/js/489.471847d4.js
new file mode 100644
index 000000000..c80f13b5b
--- /dev/null
+++ b/assets/js/489.471847d4.js
@@ -0,0 +1,2 @@
+/*! For license information please see 489.471847d4.js.LICENSE.txt */
+(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[489],{90489:(t,e,n)=>{"use strict";t.exports=n(810)},2542:(t,e,n)=>{"use strict";var i=n(46573),s={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},suggestions:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionChild:{whiteSpace:"normal"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:"0"},defaultClasses:{root:"algolia-autocomplete",prefix:"aa",noPrefix:!1,dropdownMenu:"dropdown-menu",input:"input",hint:"hint",suggestions:"suggestions",suggestion:"suggestion",cursor:"cursor",dataset:"dataset",empty:"empty"},appendTo:{wrapper:{position:"absolute",zIndex:"100",display:"none"},input:{},inputWithNoHint:{},dropdown:{display:"block"}}};i.isMsie()&&i.mixin(s.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),i.isMsie()&&i.isMsie()<=7&&i.mixin(s.input,{marginTop:"-1px"}),t.exports=s},10897:(t,e,n)=>{"use strict";var i="aaDataset",s="aaValue",r="aaDatum",o=n(46573),a=n(61348),u=n(99272),c=n(2542),l=n(84436);function h(t){var e;(t=t||{}).templates=t.templates||{},t.source||o.error("missing source"),t.name&&(e=t.name,!/^[_a-zA-Z0-9-]+$/.test(e))&&o.error("invalid dataset name: "+t.name),this.query=null,this._isEmpty=!0,this.highlight=!!t.highlight,this.name=void 0===t.name||null===t.name?o.getUniqueId():t.name,this.source=t.source,this.displayFn=function(t){return t=t||"value",o.isFunction(t)?t:e;function e(e){return e[t]}}(t.display||t.displayKey),this.debounce=t.debounce,this.cache=!1!==t.cache,this.templates=function(t,e){return{empty:t.empty&&o.templatify(t.empty),header:t.header&&o.templatify(t.header),footer:t.footer&&o.templatify(t.footer),suggestion:t.suggestion||n};function n(t){return"
{"use strict";var i,s,r,o=[n(45741),n(91856),n(41015),n(16486),n(45723),n(26345)],a=-1,u=[],c=!1;function l(){i&&s&&(i=!1,s.length?u=s.concat(u):a=-1,u.length&&h())}function h(){if(!i){c=!1,i=!0;for(var t=u.length,e=setTimeout(l);t;){for(s=u,u=[];s&&++a1)for(var n=1;n{"use strict";e.test=function(){return!n.g.setImmediate&&void 0!==n.g.MessageChannel},e.install=function(t){var e=new n.g.MessageChannel;return e.port1.onmessage=t,function(){e.port2.postMessage(0)}}},41015:(t,e,n)=>{"use strict";var i=n.g.MutationObserver||n.g.WebKitMutationObserver;e.test=function(){return i},e.install=function(t){var e=0,s=new i(t),r=n.g.document.createTextNode("");return s.observe(r,{characterData:!0}),function(){r.data=e=++e%2}}},91856:(t,e,n)=>{"use strict";e.test=function(){return"function"==typeof n.g.queueMicrotask},e.install=function(t){return function(){n.g.queueMicrotask(t)}}},45723:(t,e,n)=>{"use strict";e.test=function(){return"document"in n.g&&"onreadystatechange"in n.g.document.createElement("script")},e.install=function(t){return function(){var e=n.g.document.createElement("script");return e.onreadystatechange=function(){t(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},n.g.document.documentElement.appendChild(e),t}}},26345:(t,e)=>{"use strict";e.test=function(){return!0},e.install=function(t){return function(){setTimeout(t,0)}}}}]);
\ No newline at end of file
diff --git a/assets/js/489.471847d4.js.LICENSE.txt b/assets/js/489.471847d4.js.LICENSE.txt
new file mode 100644
index 000000000..4f7ccd8a7
--- /dev/null
+++ b/assets/js/489.471847d4.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! https://mths.be/cssesc v3.0.0 by @mathias */
diff --git a/assets/js/4bb29089.c06ea6fc.js b/assets/js/4bb29089.c06ea6fc.js
new file mode 100644
index 000000000..5162d6736
--- /dev/null
+++ b/assets/js/4bb29089.c06ea6fc.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5495],{33127:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>i,contentTitle:()=>d,default:()=>g,frontMatter:()=>t,metadata:()=>s,toc:()=>p});const s=JSON.parse('{"id":"user/packages/understanding-dappnode-packages/overview","title":"Dappnode Packages","description":"What are Dappnode packages? What features do they offer? How are they managed?","source":"@site/docs/user/packages/understanding-dappnode-packages/overview.md","sourceDirName":"user/packages/understanding-dappnode-packages","slug":"/user/packages/understanding-dappnode-packages/overview","permalink":"/docs/user/packages/understanding-dappnode-packages/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/packages/understanding-dappnode-packages/overview.md","tags":[],"version":"current","frontMatter":{"title":"Dappnode Packages","llm_description":"Overview of Dappnode package features: Info, Config, Network, Logs, File Manager, and Backup."},"sidebar":"userSidebar","previous":{"title":"Aztec","permalink":"/docs/user/rollups/aztec"},"next":{"title":"Info","permalink":"/docs/user/packages/understanding-dappnode-packages/info"}}');var o=n(74848),r=n(28453);const t={title:"Dappnode Packages",llm_description:"Overview of Dappnode package features: Info, Config, Network, Logs, File Manager, and Backup."},d="Dappnode Packages",i={},p=[{value:"What are Dappnode packages? What features do they offer? How are they managed?",id:"what-are-dappnode-packages-what-features-do-they-offer-how-are-they-managed",level:3}];function c(e){const a={a:"a",h1:"h1",h3:"h3",header:"header",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.header,{children:(0,o.jsx)(a.h1,{id:"dappnode-packages",children:"Dappnode Packages"})}),"\n",(0,o.jsx)(a.h3,{id:"what-are-dappnode-packages-what-features-do-they-offer-how-are-they-managed",children:"What are Dappnode packages? What features do they offer? How are they managed?"}),"\n",(0,o.jsx)(a.p,{children:"One of Dappnode's top features is its user-friendly interface, which allows users to interact with various packages containing clients and other applications. This section will go over the basic features you'll find in any Dappnode package."}),"\n",(0,o.jsx)(a.p,{children:"There are 6 sections in the package view:"}),"\n",(0,o.jsxs)(a.p,{children:[(0,o.jsx)(a.a,{href:"/docs/user/packages/understanding-dappnode-packages/info",children:(0,o.jsx)(a.strong,{children:"\ud83d\udd0d Info"})}),": Provides basic information about the package, including its running status and volume management."]}),"\n",(0,o.jsxs)(a.p,{children:[(0,o.jsx)(a.a,{href:"/docs/user/packages/understanding-dappnode-packages/config",children:(0,o.jsx)(a.strong,{children:"\ud83d\udd27 Config"})}),": Contains configuration settings for the package, allowing users to adjust parameters and customize its behavior according to their needs."]}),"\n",(0,o.jsxs)(a.p,{children:[(0,o.jsx)(a.a,{href:"/docs/user/packages/understanding-dappnode-packages/network",children:(0,o.jsx)(a.strong,{children:"\ud83d\udce1 Network"})}),": Details the network configuration, including port settings and forwarding options."]}),"\n",(0,o.jsxs)(a.p,{children:[(0,o.jsx)(a.a,{href:"/docs/user/packages/understanding-dappnode-packages/logs",children:(0,o.jsx)(a.strong,{children:"\ud83d\udcdd Logs"})}),": Provides access to various logs generated by each of the package's services, useful for troubleshooting and monitoring package performance."]}),"\n",(0,o.jsxs)(a.p,{children:[(0,o.jsx)(a.a,{href:"/docs/user/packages/understanding-dappnode-packages/file-manager",children:(0,o.jsx)(a.strong,{children:"\ud83d\udcc1 File Manager"})}),": Offers a file management interface that allows users to upload and download files within any of the services that make up the package."]}),"\n",(0,o.jsxs)(a.p,{children:[(0,o.jsx)(a.a,{href:"/docs/user/packages/understanding-dappnode-packages/backup",children:(0,o.jsx)(a.strong,{children:"\ud83d\udcbe Backup"})}),": Includes backup options to safeguard package data, providing the ability to download and restore backups in a compressed file format."]})]})}function g(e={}){const{wrapper:a}={...(0,r.R)(),...e.components};return a?(0,o.jsx)(a,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},28453:(e,a,n)=>{n.d(a,{R:()=>t,x:()=>d});var s=n(96540);const o={},r=s.createContext(o);function t(e){const a=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function d(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),s.createElement(r.Provider,{value:a},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/4c4b1a63.700760e1.js b/assets/js/4c4b1a63.700760e1.js
new file mode 100644
index 000000000..89466a56c
--- /dev/null
+++ b/assets/js/4c4b1a63.700760e1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1577],{82616:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>s,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"user/videos-and-tutorials/driving-school/configuration","title":"2. Configuring your Dappnode","description":"We recommend going through Initial Setup of Dappnode Driving School before watching these videos, as these videos expect you to have a basic understanding of how your Dappnode works and how to access it.","source":"@site/docs/user/videos-and-tutorials/driving-school/configuration.md","sourceDirName":"user/videos-and-tutorials/driving-school","slug":"/user/videos-and-tutorials/driving-school/configuration","permalink":"/docs/user/videos-and-tutorials/driving-school/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/videos-and-tutorials/driving-school/configuration.md","tags":[],"version":"current","frontMatter":{"title":"2. Configuring your Dappnode","llm_description":"Video tutorials on configuring Dappnode: repositories, monitoring service, and notifications."},"sidebar":"userSidebar","previous":{"title":"Initial setup","permalink":"/docs/user/videos-and-tutorials/driving-school/initial-setup"},"next":{"title":"Crash Course","permalink":"/docs/user/videos-and-tutorials/crash-course"}}');var t=n(74848),r=n(28453);const s={title:"2. Configuring your Dappnode",llm_description:"Video tutorials on configuring Dappnode: repositories, monitoring service, and notifications."},a="2. Configuring your Dappnode",d={},c=[];function u(e){const o={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"2-configuring-your-dappnode",children:"2. Configuring your Dappnode"})}),"\n",(0,t.jsx)(o.admonition,{type:"info",children:(0,t.jsxs)(o.p,{children:["We recommend going through ",(0,t.jsx)(o.strong,{children:(0,t.jsx)(o.a,{href:"/docs/user/videos-and-tutorials/driving-school/initial-setup",children:"Initial Setup"})})," of Dappnode Driving School before watching these videos, as these videos expect you to have a basic understanding of how your Dappnode works and how to access it."]})}),"\n",(0,t.jsx)(o.p,{children:"Once you have your Dappnode up and running, you can start configuring it to suit your needs. Here are some videos to help you with that:"}),"\n",(0,t.jsx)(o.h1,{id:"-21-repositories",children:"\ud83e\uddec 2.1 Repositories"}),"\n",(0,t.jsx)(o.p,{children:"Your Dappnode uses two technologies in order to stay decentralized and permissionless. In this video we'll go through Ethereum and IPFS and how do they work in Dappnode."}),"\n",(0,t.jsx)("center",{children:(0,t.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/b3NN2E6YALU",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,t.jsx)("br",{}),"\n",(0,t.jsx)("br",{}),"\n",(0,t.jsx)(o.h1,{id:"-22-dappnode-monitoring-service-dms",children:"\ud83e\uddee 2.2 Dappnode Monitoring Service (DMS)"}),"\n",(0,t.jsx)(o.p,{children:"This video is about Dappnode Monitoring Service, a tool that will make it easy to monitor your Dappnode's health and activity."}),"\n",(0,t.jsx)("center",{children:(0,t.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/l4T1G9u17xg",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,t.jsx)(o.h1,{id:"-23-ethical-metrics",children:"\ud83c\udf21 2.3 Ethical Metrics"}),"\n",(0,t.jsx)(o.p,{children:"Ethical Metrics is Dappnode's private solution to notify you through Email and Telegram when there's unexpected behavior in your Dappnode."}),"\n",(0,t.jsx)("center",{children:(0,t.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/YisNnejt8do",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})})]})}function l(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},28453:(e,o,n)=>{n.d(o,{R:()=>s,x:()=>a});var i=n(96540);const t={},r=i.createContext(t);function s(e){const o=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),i.createElement(r.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/4d8f6977.1e6255f5.js b/assets/js/4d8f6977.1e6255f5.js
new file mode 100644
index 000000000..dd880605a
--- /dev/null
+++ b/assets/js/4d8f6977.1e6255f5.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[2616],{95152:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"user/staking/ethereum/dvt-technologies/obol-network","title":"Obol Distributed Validator package for Dappnode","description":"---","source":"@site/docs/user/staking/ethereum/dvt-technologies/obol-network.md","sourceDirName":"user/staking/ethereum/dvt-technologies","slug":"/user/staking/ethereum/dvt-technologies/obol-network","permalink":"/docs/user/staking/ethereum/dvt-technologies/obol-network","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/ethereum/dvt-technologies/obol-network.md","tags":[],"version":"current","frontMatter":{"title":"Obol Distributed Validator package for Dappnode","llm_description":"Set up Obol distributed validators with DKG ceremony and cluster configuration on Dappnode."},"sidebar":"userSidebar","previous":{"title":"Stakehouse","permalink":"/docs/user/staking/ethereum/lsd-pools/stakehouse"},"next":{"title":"SSV","permalink":"/docs/user/staking/ethereum/dvt-technologies/ssv-network"}}');var a=n(74848),s=n(28453);const i={title:"Obol Distributed Validator package for Dappnode",llm_description:"Set up Obol distributed validators with DKG ceremony and cluster configuration on Dappnode."},r="Obol Distributed Validator package for Dappnode",d={},l=[{value:"Introduction",id:"introduction",level:3},{value:"Requirements",id:"requirements",level:3},{value:"First Steps",id:"first-steps",level:3},{value:"Cluster Configuration",id:"cluster-configuration",level:3},{value:"Distributed Key Generation (DKG) Event",id:"distributed-key-generation-dkg-event",level:3},{value:"Adding Validators to an Active Cluster",id:"adding-validators-to-an-active-cluster",level:3}];function c(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h3:"h3",header:"header",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"obol-distributed-validator-package-for-dappnode",children:"Obol Distributed Validator package for Dappnode"})}),"\n",(0,a.jsx)(t.hr,{}),"\n",(0,a.jsx)(t.h3,{id:"introduction",children:(0,a.jsx)(t.strong,{children:"Introduction"})}),"\n",(0,a.jsx)(t.p,{children:"The Obol Network package for Dappnode aims to make it seamless for Dappnode users to integrate and benefit from Obol's Distributed Validator Technology (DVT)."}),"\n",(0,a.jsx)(t.p,{children:"A Distributed Validator is one or more logical Ethereum validators being operated across a number of nodes that are all online simultaneously and that all control a subset of the validators' private keys. Each of these nodes need to run an Execution client, a Consensus client, a Distributed Validator client, and a Validator client/Key Manager.\nThe distributed validator clients in these nodes come to consensus on what should be signed before constructing a signature for the validator that will be accepted by the wider Ethereum network. Dividing a validator across a group of nodes allows for fault tolerant validators that can remain online and validating despite a subset of its nodes experiencing an outage, contributing to a stronger and more resilient network."}),"\n",(0,a.jsxs)(t.p,{children:["The Obol Dappnode package is available for ",(0,a.jsx)(t.a,{href:"http://my.dappnode/installer/dnp/obol.dnp.dappnode.eth",children:"Ethereum Mainnet"})," and the ",(0,a.jsx)(t.a,{href:"http://my.dappnode/installer/dnp/holesky-obol.dnp.dappnode.eth",children:"Holesky Testnet"}),"."]}),"\n",(0,a.jsx)(t.h3,{id:"requirements",children:(0,a.jsx)(t.strong,{children:"Requirements"})}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["The first thing you'll need to do is set up a fully-synced node. This can be done through the Stakers Menu in Dappnode by selecting:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"1 Execution Client (Geth, Besu, Erigon or Nethermind)"}),"\n",(0,a.jsx)(t.li,{children:"1 Consensus Client (Prysm, Lighhouse, Lodestar, Teku or Nimbus)"}),"\n",(0,a.jsx)(t.li,{children:"MEV Boost (optional)"}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:"Install the Obol package from the DAppStore."}),"\n"]}),"\n",(0,a.jsx)(t.h3,{id:"first-steps",children:(0,a.jsx)(t.strong,{children:"First Steps"})}),"\n",(0,a.jsx)(t.admonition,{title:"It's important that you understand that the requirements of the DV node runner are not the same as a Solo Stakers'. This technology facilitates the creation of Distributed Validators between a group of independent people. This means you are placing significant trust in the participants you'll run this Distributed Validator Cluster with.",type:"tip",children:(0,a.jsx)(t.p,{children:"You need to ensure every operator in the Cluster is competent and trustworthy before sharing this responsibility. Negligence on behalf of others in your group can put you at risk, however as far as 66% of these nodes are synced the validators will keep performing their duties."})}),"\n",(0,a.jsxs)(t.p,{children:["Once all participants have synced nodes, you'll need to install the Obol Dappnode package. After Dappnodes are ready, the next steps will take place at Obol's Distributed Validator Launchpad. There's a launchpad for ",(0,a.jsx)(t.a,{href:"https://launchpad.obol.org/",children:"Ethereum Mainnet"})," and another one for the ",(0,a.jsx)(t.a,{href:"https://holesky.launchpad.obol.org/",children:"Holesky Testnet"}),". Start by connecting your wallet and selecting the option that best fits your DV's distribution and setup."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"ObolLaunchpad1",src:n(68057).A+"",width:"1904",height:"1090"})}),"\n",(0,a.jsx)(t.h3,{id:"cluster-configuration",children:(0,a.jsx)(t.strong,{children:"Cluster Configuration"})}),"\n",(0,a.jsx)(t.p,{children:"For creating a new cluster with a group, all operators must have an operator's address, which will submit the necessary information to the launchpad. The first step in the configuration process will be to select the cluster size and to enter the operator's addresses."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"ObolLaunchpad2",src:n(19874).A+"",width:"1904",height:"981"})}),"\n",(0,a.jsxs)(t.p,{children:["In this next step, you'll be required to enter your Charon client's ENR, which is a public key that will give your node a unique ID. This ENR can be obtained after installing the Obol Dappnode package ",(0,a.jsx)(t.a,{href:"http://my.dappnode/packages/my/holesky-obol.dnp.dappnode.eth/info",children:"under the Info tab"}),"."]}),"\n",(0,a.jsx)(t.admonition,{type:"warning",children:(0,a.jsx)(t.p,{children:"The Obol Dappnode package supports up to 5 ENRs. This means that you can participate in 5 different clusters with 5 different ENRs using the same package, however it's important to properly backup the package's database if the generated ENRs are committed to functional clusters."})}),"\n",(0,a.jsxs)(t.p,{children:["Next, you'll need to specify the amount of validator keys that this cluster will be generating and how these validators will be splitting the rewards. You can read more about the ",(0,a.jsx)(t.a,{href:"https://docs.obol.org/docs/sc/introducing-obol-splits",children:"Obol Splits contract"})," and the different options it offers in Obol's documentation."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"ObolLaunchpad3",src:n(41003).A+"",width:"1904",height:"1047"})}),"\n",(0,a.jsx)(t.p,{children:"The last step will require that you perform a signature from your operator's address to generate a cluster invite link. You'll need to share this invite link with the rest of the operators so that they can register their ENRs and set everything up for the Distributed Key Generation (DKG) event."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"ObolLaunchpad4",src:n(95092).A+"",width:"1604",height:"1478"})}),"\n",(0,a.jsx)(t.h3,{id:"distributed-key-generation-dkg-event",children:(0,a.jsx)(t.strong,{children:"Distributed Key Generation (DKG) Event"})}),"\n",(0,a.jsx)(t.p,{children:"After all operators have successfully submitted their ENRs, the Obol launchpad will generate a \"Definition File URL\" we'll need to load in our Obol Dappnode package's configuration to proceed with the DKG."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"ObolLaunchpad5",src:n(16221).A+"",width:"1904",height:"981"})}),"\n",(0,a.jsxs)(t.p,{children:["Copy the URL under the Dappnode tab in the Launchpad, go to your package's configuration section and enter it in the cluster number corresponding to the ENR you submitted in the launchpad. Make sure ",(0,a.jsx)(t.code,{children:"URL"}),' is selected under "Config Mode" and apply the configuration.']}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"ObolLaunchpad6",src:n(74982).A+"",width:"1904",height:"1089"})}),"\n",(0,a.jsx)(t.p,{children:"After all operators have completed this step the DKG ceremony will start automatically and each of the operators' keystores will be stored in the Obol package's database."}),"\n",(0,a.jsx)(t.admonition,{type:"danger",children:(0,a.jsx)(t.p,{children:"Please make sure to create a backup of your Obol package. If you lose your private keys you won't be able to start the DV cluster successfully and may risk your validator deposit becoming unrecoverable. Ensure every operator has their backup secured before activating any validators."})}),"\n",(0,a.jsx)(t.h3,{id:"adding-validators-to-an-active-cluster",children:"Adding Validators to an Active Cluster"}),"\n",(0,a.jsxs)(t.p,{children:["After the DKG has succeeded and all of the operators have backed up their cluster's keys, it's time to move on to the validator's deposits. The launchpad will show you an option to submit a ",(0,a.jsx)(t.code,{children:"deposit_data.json"})," file."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"ObolLaunchpad7",src:n(13999).A+"",width:"1904",height:"1019"})}),"\n",(0,a.jsx)(t.p,{children:"You can get this file if you decompress your Obol package's backup and look for it inside the charon folder corresponding to the cluster number you intend to run. The launchpad will confirm that you have enough balance in your connected wallet to perform the validator deposit and make you go over final checks prior to signing the deposit."}),"\n",(0,a.jsxs)(t.p,{children:["Remember that if you have any questions, you can always drop by the ",(0,a.jsx)(t.a,{href:"https://discord.gg/dappnode",children:"Dappnode Discord server"})," to ask for community support."]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},68057:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/obol-launchpad1-384f64d06e76a09d4ec520ee76cf7fdf.png"},19874:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/obol-launchpad2-ce96b4add6b5709c4d88acb38a73a1ee.png"},41003:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/obol-launchpad3-c7f4df9b4d7b753d8d0e027b7a659bee.png"},95092:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/obol-launchpad4-f9db7d75efeda34396609e991e2840b6.png"},16221:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/obol-launchpad5-678df34a484ab38012fd657c9dcfaf7e.png"},74982:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/obol-launchpad6-2048cc9b6c237bb96964596ee7bd32ec.png"},13999:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/obol-launchpad7-11fdbb602d3e193d4a456ba9e0e05e1b.png"},28453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>r});var o=n(96540);const a={},s=o.createContext(a);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/504e39d9.927a85c7.js b/assets/js/504e39d9.927a85c7.js
new file mode 100644
index 000000000..c8687dec9
--- /dev/null
+++ b/assets/js/504e39d9.927a85c7.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5932],{87846:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>o,default:()=>h,frontMatter:()=>d,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"dev/package-publishing/package-ownership","title":"Package Ownership","description":"This guide outlines the role permission system used in Dappnode package management, powered by Aragon\u2019s ACL (Access Control List) smart contracts. It explains how to check and modify roles such as permission managers and developers.","source":"@site/docs/dev/package-publishing/package-ownership.md","sourceDirName":"dev/package-publishing","slug":"/dev/package-publishing/package-ownership","permalink":"/docs/dev/package-publishing/package-ownership","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/package-publishing/package-ownership.md","tags":[],"version":"current","frontMatter":{"title":"Package Ownership","llm_description":"Role permission system for managing package ownership via Aragon ACL contracts."},"sidebar":"devSidebar","previous":{"title":"Publishing Guide","permalink":"/docs/dev/package-publishing/publish-packages-clients"},"next":{"title":"Package Metrics","permalink":"/docs/dev/metrics"}}');var r=n(74848),a=n(28453);const d={title:"Package Ownership",llm_description:"Role permission system for managing package ownership via Aragon ACL contracts."},o="Package Ownership",t={},l=[{value:"Roles \ud83c\udf96\ufe0f",id:"roles-\ufe0f",level:2},{value:"Permission manager:",id:"permission-manager",level:4},{value:"Developer:",id:"developer",level:4},{value:"Standard:",id:"standard",level:4},{value:"Dappnode's ACLs \ud83d\udd10",id:"dappnodes-acls-closed_lock_with_key",level:2},{value:"Package Management UI \u2699\ufe0f",id:"package-management-ui-\ufe0f",level:2},{value:"Standard Address",id:"standard-address",level:3},{value:"Developer Address",id:"developer-address",level:3},{value:"Manager Address",id:"manager-address",level:3},{value:"Set a New Permission Manager",id:"set-a-new-permission-manager",level:4},{value:"Grant Developer (Publishing Permissions)",id:"grant-developer-publishing-permissions",level:4},{value:"Revoke Developer (Publishing Permissions):",id:"revoke-developer-publishing-permissions",level:4}];function c(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"package-ownership",children:"Package Ownership"})}),"\n",(0,r.jsx)(s.p,{children:"This guide outlines the role permission system used in Dappnode package management, powered by Aragon\u2019s ACL (Access Control List) smart contracts. It explains how to check and modify roles such as permission managers and developers."}),"\n",(0,r.jsx)(s.p,{children:"Whether you're assigning roles or verifying access, this doc walks you through each step clearly and effectively."}),"\n",(0,r.jsx)(s.h2,{id:"roles-\ufe0f",children:"Roles \ud83c\udf96\ufe0f"}),"\n",(0,r.jsx)(s.p,{children:"For every package, there are three possible roles for any Ethereum address:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsx)(s.h4,{id:"permission-manager",children:"Permission manager:"}),"\n",(0,r.jsx)(s.p,{children:"The address that can grant or revoke developer permissions for other addresses. This role can be held by only one address."}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsx)(s.h4,{id:"developer",children:"Developer:"}),"\n",(0,r.jsx)(s.p,{children:"Addresses that are allowed to publish new versions of the package."}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsx)(s.h4,{id:"standard",children:"Standard:"}),"\n",(0,r.jsx)(s.p,{children:"Addresses that do not have any permissions related to the package."}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.h2,{id:"dappnodes-acls-closed_lock_with_key",children:["Dappnode's ACLs ","\ud83d\udd10"]}),"\n",(0,r.jsx)(s.p,{children:"Dappnode package permissions are managed via the smart contract ACL of their respective package repositories."}),"\n",(0,r.jsx)(s.admonition,{type:"info",children:(0,r.jsx)(s.p,{children:"In Aragon, the ACL (Access Control List) is a core smart contract that manages permissions. It determines which address (or entity) can call which function on which app (smart contract)."})}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Dappnode's ACLs by package suffix:"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["ACL ",(0,r.jsx)(s.code,{children:".public"})," => ",(0,r.jsx)(s.a,{href:"https://etherscan.io/address/0xFCb2C44E61031AE29e5c54A700FB6B4FB430dA4C#readProxyContract",children:"See the SC in Etherscan"})]}),"\n",(0,r.jsxs)(s.li,{children:["ACL ",(0,r.jsx)(s.code,{children:".dnp"})," => ",(0,r.jsx)(s.a,{href:"https://etherscan.io/address/0x89d0A07b792754460Faa49e57437B40aA33FB757#readProxyContract",children:"See the SC in Etherscan"})]}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"package-management-ui-\ufe0f",children:"Package Management UI \u2699\ufe0f"}),"\n",(0,r.jsx)(s.p,{children:'Our package publishing UI includes an "Ownership" tab that allows you to check the current role of an address for a specified package and perform actions based on that role.'}),"\n",(0,r.jsxs)(s.p,{children:["You can access this UI by navigating to the ",(0,r.jsx)(s.a,{href:"https://dappnode.github.io/sdk-publish",children:"Dappnode SDK-publish UI"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"Here's a guide to help you use it:"}),"\n",(0,r.jsxs)(s.ol,{children:["\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Connect your wallet"}),", if it\u2019s not already connected. The connected wallet address will be used for role checking.\n",(0,r.jsx)(s.img,{alt:"Connect Wallet",src:n(13276).A+"",width:"927",height:"329"})]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:'Click the "Ownership" tab'})," in the navigation bar.\n",(0,r.jsx)(s.img,{alt:"Navigate to "Ownership" tab",src:n(44549).A+"",width:"1218",height:"105"})]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Enter the package's ENS"})," you want to check or manage.\n",(0,r.jsx)(s.img,{alt:"Provide ENS",src:n(52262).A+"",width:"927",height:"482"})]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Review your role."})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Once the ENS is submitted, your role for the specified package will be displayed:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsx)(s.h3,{id:"standard-address",children:"Standard Address"}),"\n",(0,r.jsxs)(s.p,{children:["Your address has no special permissions for this package. You can check who the current manager is and contact them to request permission.\n",(0,r.jsx)(s.img,{alt:"Standard Address",src:n(73535).A+"",width:"927",height:"717"})]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsx)(s.h3,{id:"developer-address",children:"Developer Address"}),"\n",(0,r.jsxs)(s.p,{children:['As a developer, you are allowed to publish new versions of the package. To do this, click on the "Publishing" tab in the navigation bar.\n',(0,r.jsx)(s.img,{alt:"Developer Address",src:n(38272).A+"",width:"927",height:"620"})]}),"\n",(0,r.jsx)(s.admonition,{type:"info",children:(0,r.jsx)(s.p,{children:"A package can have multiple addresses with developer permissions."})}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsx)(s.h3,{id:"manager-address",children:"Manager Address"}),"\n",(0,r.jsx)(s.p,{children:"The manager is typically the address that published the first version of the package. It is the only address that can transfer management rights, as well as grant or revoke developer permissions."}),"\n",(0,r.jsx)(s.admonition,{type:"info",children:(0,r.jsx)(s.p,{children:"A package can only have one address as its package manager."})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsx)(s.h4,{id:"set-a-new-permission-manager",children:"Set a New Permission Manager"}),"\n",(0,r.jsx)(s.admonition,{type:"danger",children:(0,r.jsx)(s.p,{children:"Changing the manager will transfer full control of the package to the specified address, revoking all manager permissions from the current manager. This action is irreversible."})}),"\n",(0,r.jsxs)(s.p,{children:["To change the manager address, provide the new manager address and click ",(0,r.jsx)(s.strong,{children:'"Transfer Manager Role"'})," in the ",(0,r.jsx)(s.strong,{children:'"Change Manager"'})," section."]}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.img,{alt:"Change manager Address",src:n(67818).A+"",width:"927",height:"813"})}),"\n",(0,r.jsx)(s.admonition,{type:"info",children:(0,r.jsxs)(s.p,{children:["Transferring the manager role does ",(0,r.jsx)(s.strong,{children:"not"})," automatically grant developer permissions to the new address. If you want to provide publishing access, you must grant developer rights separately."]})}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsx)(s.h4,{id:"grant-developer-publishing-permissions",children:"Grant Developer (Publishing Permissions)"}),"\n",(0,r.jsx)(s.p,{children:"Granting developer permissions allows the specified address to publish new versions of the package."}),"\n",(0,r.jsxs)(s.p,{children:["To do this, enter the new developer address and click ",(0,r.jsx)(s.strong,{children:'"Grant Developer Permission"'})," in the ",(0,r.jsx)(s.strong,{children:'"Grant Developer"'})," section.\n",(0,r.jsx)(s.img,{alt:"Grant developer Address",src:n(82913).A+"",width:"927",height:"654"})]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsx)(s.h4,{id:"revoke-developer-publishing-permissions",children:"Revoke Developer (Publishing Permissions):"}),"\n",(0,r.jsx)(s.p,{children:"Revoking developer permissions prevents the specified address from publishing new versions of the package (if it previously had developer access)."}),"\n",(0,r.jsxs)(s.p,{children:["To revoke, enter the address and click ",(0,r.jsx)(s.strong,{children:'"Revoke Developer Permission"'})," in the ",(0,r.jsx)(s.strong,{children:'"Revoke Developer"'})," section.\n",(0,r.jsx)(s.img,{alt:"Revoke developer Address",src:n(36387).A+"",width:"927",height:"642"})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},67818:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/pkg-ownership-change-manager-82ecca1b7b2637fc29ebbb10157193d5.png"},13276:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/pkg-ownership-connect-a0129fa2f2ddc0b15bed39572ff31fbb.png"},38272:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/pkg-ownership-developer-36db8d52926043fe4994ecbd9198d71b.png"},52262:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/pkg-ownership-ens-a2312af3fa7d7d0b98f663c528d151b7.png"},82913:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/pkg-ownership-grant-developer-cf868b4a327d1cf4f7f9ff604c046326.png"},44549:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/pkg-ownership-navigate-97a949c0ab8c0386dd12925f0f159a68.png"},36387:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/pkg-ownership-revoke-developer-459a52b959a310608299c66bdd525099.png"},73535:(e,s,n)=>{n.d(s,{A:()=>i});const i=n.p+"assets/images/pkg-ownership-standard-29b116867b0f5d018701c815923865e5.png"},28453:(e,s,n)=>{n.d(s,{R:()=>d,x:()=>o});var i=n(96540);const r={},a=i.createContext(r);function d(e){const s=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),i.createElement(a.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/51a190f1.1f539ff6.js b/assets/js/51a190f1.1f539ff6.js
new file mode 100644
index 000000000..07f5915e1
--- /dev/null
+++ b/assets/js/51a190f1.1f539ff6.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4007],{66882:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"user/staking/ethereum/lsd-pools/lido/already-node-operator","title":"Already a node operator","description":"This document provides detailed instructions for existing Node Operators on integrating their setup with the Lido Community Staking Module (CSM) via Dappnode. By following these steps, you can efficiently manage your validators and ensure proper functionality within the Lido protocol.","source":"@site/docs/user/staking/ethereum/lsd-pools/lido/already-node-operator.md","sourceDirName":"user/staking/ethereum/lsd-pools/lido","slug":"/user/staking/ethereum/lsd-pools/lido/already-node-operator","permalink":"/docs/user/staking/ethereum/lsd-pools/lido/already-node-operator","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/ethereum/lsd-pools/lido/already-node-operator.md","tags":[],"version":"current","frontMatter":{"title":"Already a node operator","llm_description":"Instructions for existing Lido CSM node operators to integrate with Dappnode."},"sidebar":"userSidebar","previous":{"title":"Register as a Node Operator","permalink":"/docs/user/staking/ethereum/lsd-pools/lido/register"},"next":{"title":"Validators performance","permalink":"/docs/user/staking/ethereum/lsd-pools/lido/performance"}}');var o=i(74848),s=i(28453);const r={title:"Already a node operator",llm_description:"Instructions for existing Lido CSM node operators to integrate with Dappnode."},a="Already a node operator",d={},l=[{value:"1. Importing Keystores into the Brain UI",id:"1-importing-keystores-into-the-brain-ui",level:2},{value:"Steps to Import Keystores",id:"steps-to-import-keystores",level:3},{value:"2. Opening the Lido CSM UI and Wallet Connection",id:"2-opening-the-lido-csm-ui-and-wallet-connection",level:2},{value:"3. Configuring Telegram Notifications",id:"3-configuring-telegram-notifications",level:2},{value:"4. Monitoring Infrastructure",id:"4-monitoring-infrastructure",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",ol:"ol",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"already-a-node-operator",children:"Already a node operator"})}),"\n",(0,o.jsx)(n.p,{children:"This document provides detailed instructions for existing Node Operators on integrating their setup with the Lido Community Staking Module (CSM) via Dappnode. By following these steps, you can efficiently manage your validators and ensure proper functionality within the Lido protocol."}),"\n",(0,o.jsx)(n.h2,{id:"1-importing-keystores-into-the-brain-ui",children:"1. Importing Keystores into the Brain UI"}),"\n",(0,o.jsx)(n.p,{children:"Keystore files contain critical information for managing your validators. When you becamo a Node Operator you lido deposists the necessary amount of ETH to the validator to start staking. These keys files must be imported into the Staking Brain (Brain UI) with the appropriate configuration for the Lido protocol."}),"\n",(0,o.jsx)(n.h3,{id:"steps-to-import-keystores",children:"Steps to Import Keystores"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Ensure your keys are not already uploaded in any node."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Access the ",(0,o.jsx)(n.code,{children:"/import"})," tab in Brain UI:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Mainnet ",(0,o.jsx)(n.a,{href:"http://brain.web3signer.dappnode",children:"Staking Brain"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Hoodi ",(0,o.jsx)(n.a,{href:"http://brain.web3signer-hoodi.dappnode",children:"Staking Brain"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Select the \u201cLido\u201d Tag:\nWhile uploading your keystore files, make sure to tag them with \u201cLido\u201d to designate automatically the required fee recipient from the Lido protocol:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Mainnet: ",(0,o.jsx)(n.code,{children:"0x388C818CA8B9251b393131C08a736A67ccB19297"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Hoodi: ",(0,o.jsx)(n.code,{children:"0x9b108015fe433F173696Af3Aa0CF7CDb3E104258"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.admonition,{type:"danger",children:(0,o.jsx)(n.p,{children:"Do not edit the fee recipient address. Doing so will result in penalties."})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Provide the password"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Import keystores to Staking Brain",src:i(19382).A+"",width:"1919",height:"956"})}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.admonition,{type:"tip",children:[(0,o.jsx)(n.mdxAdmonitionTitle,{}),(0,o.jsxs)(n.p,{children:["For keys that have not yet been uploaded to the Lido protocol, you can import them to the Staking Brain through the Lido CSM UI while simultaneously submitting them to the Lido protocol via the ",(0,o.jsx)(n.code,{children:"/keys/submit"})," path."]})]}),"\n",(0,o.jsx)(n.h2,{id:"2-opening-the-lido-csm-ui-and-wallet-connection",children:"2. Opening the Lido CSM UI and Wallet Connection"}),"\n",(0,o.jsx)(n.p,{children:"The Lido CSM UI serves as the central interface for managing validator keys and monitoring validator and infrastucture status. Before proceeding with any validator operations, ensure your wallet is connected."}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Access the Lido CSM UI:"}),"\n",(0,o.jsxs)(n.p,{children:["Navigate to the Lido CSM package UI. - ",(0,o.jsx)(n.a,{href:"http://ui.lido-csm-mainnet.dappnode/",children:"Mainnet UI"})," - ",(0,o.jsx)(n.a,{href:"http://ui.lido-csm-hoodi.dappnode/",children:"Hoodi UI"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Connect Your Wallet:"}),"\n",(0,o.jsx)(n.p,{children:"Use the \u201cI am a Node Operator\u201d button and choose your wallet provider."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Log In as already Node Operator",src:i(78801).A+"",width:"1460",height:"737"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Authorize the Connection:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Follow the on-screen prompts to grant the necessary permissions."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Ensure the wallet\u2019s network matches the intended environment (e.g., Mainnet or Hoodi)."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Verify Connection:"}),"\n",(0,o.jsx)(n.p,{children:"Once connected, your wallet address will appear in the top-right corner of the interface."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Ensure wallet is connected",src:i(38105).A+"",width:"664",height:"72"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"3-configuring-telegram-notifications",children:"3. Configuring Telegram Notifications"}),"\n",(0,o.jsx)(n.p,{children:"To receive critical updates and alerts regarding your validator operations, it is essential to configure Telegram notifications."}),"\n",(0,o.jsx)(n.p,{children:"This provides alerts about validator penalties, slashing incidents, exit requests, key deposits and smart contract events."}),"\n",(0,o.jsx)(n.p,{children:"Staying informed helps safeguard your assets, reduce risks, and maintain transparency and control over your activities in the protocol, ensuring smooth and efficient participation."}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Initial Setup:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"When accessing the Lido CSM UI for the first time, a modal will appear prompting you to configure Telegram notifications."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Click \u201cNavigate\u201d to go to ",(0,o.jsx)(n.code,{children:"/notifications"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Notifications Modal",src:i(86310).A+"",width:"1905",height:"1046"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Generate a Telegram Bot Token:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Open Telegram and search for ",(0,o.jsx)(n.a,{href:"https://web.telegram.org/a/#93372553",children:(0,o.jsx)(n.code,{children:"@BotFather"})}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Start a chat with BotFather and type ",(0,o.jsx)(n.code,{children:"/newbot"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:'Follow the instructions to name your bot and choose a username (must end with "bot").'}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Once created, BotFather will send you the bot token."}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Example: ",(0,o.jsx)(n.code,{children:"123456789:ABCDefghIJKLMNOPQRSTuvwxYZ"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Start the chat with the created bot by clicking ",(0,o.jsx)(n.code,{children:"Start"})," button."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsxs)(n.p,{children:["You must start the conversation with the bot clicking ",(0,o.jsx)(n.code,{children:"Start"})," so it can send you notifications."]})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Obtain Your User ID:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Open ",(0,o.jsx)(n.a,{href:"https://web.telegram.org/a/",children:"Telegram"})," and search for ",(0,o.jsx)(n.a,{href:"https://web.telegram.org/a/#52504489",children:(0,o.jsx)(n.code,{children:"@userinfobot"})})," or ",(0,o.jsx)(n.a,{href:"https://web.telegram.org/a/#1533228735",children:(0,o.jsx)(n.code,{children:"@raw_data_bot"})}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Start a chat with the bot by clicking ",(0,o.jsx)(n.code,{children:"Start"})," button."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"The bot will reply with your Telegram ID"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Input the Bot Token and User ID:"}),"\n",(0,o.jsxs)(n.p,{children:["Enter the bot token and your user ID in the Lido CSM package UI and click ",(0,o.jsx)(n.code,{children:"Update Telegram Data"}),".\n",(0,o.jsx)(n.img,{alt:"Set up Notifications",src:i(58626).A+"",width:"1905",height:"1046"})]}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsxs)(n.p,{children:["You must start the conversation with the bot using ",(0,o.jsx)(n.code,{children:"/start"})," so it can send you notifications."]})}),"\n",(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsx)(n.p,{children:"To receive the notifications, is mandatory to fill both inputs, otherwise the notification system won't work"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Verify Notifications:"}),"\n",(0,o.jsxs)(n.p,{children:["Ensure that test alert was sent to your Telegram to confirm that notifiactions are properly configured.\n",(0,o.jsx)(n.img,{alt:"Ensure Notifications are set",src:i(67005).A+"",width:"770",height:"255"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"4-monitoring-infrastructure",children:"4. Monitoring Infrastructure"}),"\n",(0,o.jsx)(n.p,{children:"The dashboard provides an at-a-glance view of your infrastructure\u2019s health and status, including execution clients, consensus clients, web3 signer, and subscribed relays."})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},19382:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/lido-csm-brain-import-931b025593e1e791ae472dce17b4a2f6.png"},67005:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/lido-csm-ensure-notifications-24da5f8905ac0e8f88c02b3aa2ccc18e.png"},78801:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/lido-csm-log-in-already-NO-73d10878dc29bca9157afc26ca1bb611.png"},86310:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/lido-csm-notifications-modal-90a669424cf7b7048bd3ce55a2417279.png"},58626:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/lido-csm-setup-notifications-6b2635b85b84d6d5def3534b1d8552e3.png"},38105:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/lido-csm-wallet-connected-113b5e31772ef307fb762443fa5cac15.png"},28453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>a});var t=i(96540);const o={},s=t.createContext(o);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/536a4320.746d4810.js b/assets/js/536a4320.746d4810.js
new file mode 100644
index 000000000..3db5839d3
--- /dev/null
+++ b/assets/js/536a4320.746d4810.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[7689],{85604:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"user/faqs","title":"FAQs","description":"How can I start validating?","source":"@site/docs/user/faqs.md","sourceDirName":"user","slug":"/user/faqs","permalink":"/docs/user/faqs","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/faqs.md","tags":[],"version":"current","frontMatter":{"title":"FAQs","llm_description":"Common questions about staking, installation issues, VPN/Wireguard, client syncing, and specs."},"sidebar":"userSidebar","previous":{"title":"Migrating from Avado","permalink":"/docs/user/videos-and-tutorials/guides/migrating-from-avado"}}');var i=n(74848),r=n(28453);const o={title:"FAQs",llm_description:"Common questions about staking, installation issues, VPN/Wireguard, client syncing, and specs."},a="FAQs",l={},c=[];function d(e){const s={a:"a",h1:"h1",header:"header",strong:"strong",...(0,r.R)(),...e.components},{Details:n}=s;return n||function(e,s){throw new Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"faqs",children:"FAQs"})}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)("strong",{children:"How can I start validating?"})}),(0,i.jsx)("p",{children:"These steps will help you set up an Ethereum/Gnosis Chain/LUKSO solo staker validator:"}),(0,i.jsxs)("ol",{children:[(0,i.jsx)("li",{children:"Go to the Stakers menu, select the network tab that you want to validate in and select an execution client (Geth, Nethermind, Erigon or Besu), a consensus client (Prysm, Lighthouse, Teku, Nimbus or Lodestar) and Web3Signer. You can optionally select MEV Boost and any relays you choose to run (where applies)."}),(0,i.jsx)("li",{children:"Create keystore and deposit files using Ethereum/Gnosis/LUKSO CLI or the Wagyu Keygen tool."}),(0,i.jsx)("li",{children:"Wait until clients are synced and check logs to see that everything is running fine."}),(0,i.jsx)("li",{children:"Import keystore file(s) into Web3Signer."}),(0,i.jsx)("li",{children:"Do the deposit. Make sure to triple-check you're interacting with the right website/contract!"}),(0,i.jsx)("li",{children:"Wait until you start attesting."})]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)("strong",{children:"I'm not able to install! / Package not found"})}),(0,i.jsx)("p",{children:"You'll most likely have to switch your IPFS repository to remote, perform updates and go back to your Local IPFS node:"}),(0,i.jsxs)("ol",{children:[(0,i.jsxs)("li",{children:["Try switching local/remote in IPFS repository: ",(0,i.jsx)("a",{href:"http://my.dappnode/repository/ipfs",children:(0,i.jsx)(s.a,{href:"http://my.dappnode/repository/ipfs",children:"http://my.dappnode/repository/ipfs"})})]}),(0,i.jsx)("li",{children:"Wait a few seconds, then retry downloading/updating your package."}),(0,i.jsx)("li",{children:"Make sure you set your IPFS node to Local for optimal Dappnode performance."})]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)("strong",{children:"I want to install Dappnode, what are the minimum specs I need?"})}),(0,i.jsx)("p",{children:"Assuming you want to sync only one chain (two clients) you should have at least:"}),(0,i.jsxs)("ul",{children:[(0,i.jsx)("li",{children:"16GB RAM"}),(0,i.jsx)("li",{children:"2TB of FAST storage (NVMe recommended)"}),(0,i.jsx)("li",{children:"Intel i3 or i5 processor"})]}),(0,i.jsx)("p",{children:"If you want to run Dappnode as recommended, we suggest the following specs:"}),(0,i.jsxs)("ul",{children:[(0,i.jsx)("li",{children:"32-64GB RAM"}),(0,i.jsx)("li",{children:"4TB NVMe"}),(0,i.jsx)("li",{children:"Intel i7 processor"})]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)("strong",{children:"VPN/Wireguard isn't working!"})}),(0,i.jsxs)("ul",{children:[(0,i.jsxs)("li",{children:["Are you in the same network as the Dappnode? Use the local proxy access to configure your VPN: ",(0,i.jsx)("a",{href:"http://dappnode.local/",children:(0,i.jsx)(s.a,{href:"http://dappnode.local/",children:"http://dappnode.local/"})})]}),(0,i.jsx)("li",{children:"Is UPnP enabled in your router settings? Try restarting your router after applying this setting!"}),(0,i.jsx)("li",{children:"Is the port for Wireguard open in your router's port forwarding settings? (UDP 51820)"}),(0,i.jsx)("li",{children:"If you're using OpenVPN, is its port open as well? (UDP 1194)"}),(0,i.jsx)("li",{children:"Are you behind a CGNAT? You need to contact your ISP and request an IPv4 static address."}),(0,i.jsx)("li",{children:"Are you connected to another VPN? Please disconnect from this VPN before connecting to your Dappnode's VPN."}),(0,i.jsxs)("li",{children:["If you're trying to access with Wireguard through a local network, ",(0,i.jsx)(s.strong,{children:"make sure you're using your local credentials"})]})]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)("strong",{children:"How can I know if I'm using Wireguard's local or remote credentials?"})}),(0,i.jsxs)("ul",{children:[(0,i.jsxs)("li",{children:["If you're using local credentials, your Wireguard profile's endpoint should be an IP + Port (e.g., ",(0,i.jsx)("code",{children:"192.168.X.X:"}),")."]}),(0,i.jsxs)("li",{children:["If you're using remote credentials, then the endpoint should be a dynDNS string + Port (e.g., ",(0,i.jsx)("code",{children:".dyndns.dappnode.io:"}),")."]})]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)("strong",{children:"My Web3Signer status has an odd grey bar in its status, is something wrong?"})}),(0,i.jsx)("p",{children:"Web3Signer includes 5 containers (services): Web3Signer, Brain, Flyway, Postgres and Tracker. You can check it yourself in the package view."}),(0,i.jsx)("p",{children:"Whenever one is indicated as Stopped (gray), it means that it was stopped. But in this case - just the flyway service is stopped, which is an expected behavior - it should run only once, while migration of the database. If it\u2019s indicated as grey - that means that whenever it migrated - everything went well, and now there is no need for it to run!"})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)("strong",{children:"My clients are not syncing!"})}),(0,i.jsx)("p",{children:"It's always a good idea to check the logs first for any specific errors, but here are some of the most common issues:"}),(0,i.jsxs)("ul",{children:[(0,i.jsx)("li",{children:"Have you selected both Execution and Consensus clients in the Stakers Menu?"}),(0,i.jsx)("li",{children:"If something looks wrong in the dashboard, always check the logs first! The clients might be syncing as expected. Check if the block number and the package's volume size are increasing. This is a common issue for Nethermind."})]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)("strong",{children:"How long do clients take to sync?"})}),(0,i.jsx)("p",{children:"This is very different for every Dappnode depending on a number of factors:"}),(0,i.jsxs)("ul",{children:[(0,i.jsx)("li",{children:"Geographic location"}),(0,i.jsx)("li",{children:"Bandwidth"}),(0,i.jsx)("li",{children:"ISP limitations"}),(0,i.jsx)("li",{children:"Chosen EL and CL clients"})]}),(0,i.jsx)("p",{children:"There is no exact information on how long exactly every client takes to sync, but there are a couple of facts that would be useful:"}),(0,i.jsxs)("ul",{children:[(0,i.jsx)("li",{children:"Consensus client usually doesn't take longer than 5 minutes, as long as you enabled checksync when selecting your clients in the Stakers menu."}),(0,i.jsx)("li",{children:"Execution client syncing time depends on many factors, but it might take up to several days in some cases, so if you felt like consensus client synced fast, and execution client is still syncing after several hours - that's ok, it might take some time!"})]})]})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,s,n)=>{n.d(s,{R:()=>o,x:()=>a});var t=n(96540);const i={},r=t.createContext(i);function o(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/53ed655b.aff8b6e2.js b/assets/js/53ed655b.aff8b6e2.js
new file mode 100644
index 000000000..9753d0439
--- /dev/null
+++ b/assets/js/53ed655b.aff8b6e2.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4866],{86712:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>p});const r=JSON.parse('{"id":"user/packages/monero","title":"Monero","description":"Introducing Monero: A Privacy-Centric Cryptocurrency","source":"@site/docs/user/packages/monero.md","sourceDirName":"user/packages","slug":"/user/packages/monero","permalink":"/docs/user/packages/monero","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/packages/monero.md","tags":[],"version":"current","frontMatter":{"title":"Monero","llm_description":"Running a Monero node on Dappnode to support the privacy-focused cryptocurrency network."},"sidebar":"userSidebar","previous":{"title":"Avalanche","permalink":"/docs/user/packages/avalanche"},"next":{"title":"Swarm","permalink":"/docs/user/packages/swarm"}}');var t=o(74848),c=o(28453);const a={title:"Monero",llm_description:"Running a Monero node on Dappnode to support the privacy-focused cryptocurrency network."},i="Monero",s={},p=[{value:"Introducing Monero: A Privacy-Centric Cryptocurrency",id:"introducing-monero-a-privacy-centric-cryptocurrency",level:2},{value:"Monero\u2019s Package on Dappnode",id:"moneros-package-on-dappnode",level:2}];function d(e){const n={h1:"h1",h2:"h2",header:"header",p:"p",...(0,c.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"monero",children:"Monero"})}),"\n",(0,t.jsx)(n.h2,{id:"introducing-monero-a-privacy-centric-cryptocurrency",children:"Introducing Monero: A Privacy-Centric Cryptocurrency"}),"\n",(0,t.jsx)(n.p,{children:"Monero stands as a privacy-focused cryptocurrency with a core focus on anonymity and transaction fungibility. Monero uses innovative cryptographic techniques to obscure transaction details, making it difficult to trace the sender, receiver, and transaction amount."}),"\n",(0,t.jsx)(n.h2,{id:"moneros-package-on-dappnode",children:"Monero\u2019s Package on Dappnode"}),"\n",(0,t.jsx)(n.p,{children:"By running a Monero node in Dappnode, you play a crucial role in supporting the decentralized nature of the Monero ecosystem. You actively contribute to the decentralization of the network, playing a role in shaping a financial ecosystem that values privacy and security."})]})}function u(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},28453:(e,n,o)=>{o.d(n,{R:()=>a,x:()=>i});var r=o(96540);const t={},c=r.createContext(t);function a(e){const n=r.useContext(c);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),r.createElement(c.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5456a9ed.6d11d4a0.js b/assets/js/5456a9ed.6d11d4a0.js
new file mode 100644
index 000000000..9d90efb9d
--- /dev/null
+++ b/assets/js/5456a9ed.6d11d4a0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[3704],{29186:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"user/access-your-dappnode/local","title":"Local Proxy Access to Dappnode","description":"The local proxy method provides a way to access your Dappnode from within the same local network without any previous configuration required. However, it\'s essential to understand that due to certain network incompatibilities, this method might not work for all users.","source":"@site/docs/user/access-your-dappnode/local.md","sourceDirName":"user/access-your-dappnode","slug":"/user/access-your-dappnode/local","permalink":"/docs/user/access-your-dappnode/local","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/access-your-dappnode/local.md","tags":[],"version":"current","frontMatter":{"title":"Local Proxy Access to Dappnode","llm_description":"Access Dappnode via http://dappnode.local on same network; limited to Admin UI dashboard only."},"sidebar":"userSidebar","previous":{"title":"Terminal (Advanced)","permalink":"/docs/user/access-your-dappnode/terminal"},"next":{"title":"Overview","permalink":"/docs/user/hardware/overview"}}');var t=n(74848),a=n(28453);const r={title:"Local Proxy Access to Dappnode",llm_description:"Access Dappnode via http://dappnode.local on same network; limited to Admin UI dashboard only."},i="Local Proxy Access to Dappnode",c={},l=[{value:"When to Use Local Proxy",id:"when-to-use-local-proxy",level:2},{value:"Accessing Dappnode via Local Proxy",id:"accessing-dappnode-via-local-proxy",level:2},{value:"Limitations & Settings",id:"limitations--settings",level:2}];function d(e){const o={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"local-proxy-access-to-dappnode",children:"Local Proxy Access to Dappnode"})}),"\n",(0,t.jsx)(o.p,{children:"The local proxy method provides a way to access your Dappnode from within the same local network without any previous configuration required. However, it's essential to understand that due to certain network incompatibilities, this method might not work for all users."}),"\n",(0,t.jsx)(o.h2,{id:"when-to-use-local-proxy",children:"When to Use Local Proxy"}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsxs)(o.li,{children:["\ud83d\udee0 ",(0,t.jsx)(o.strong,{children:"Setup & Recovery"}),": If you're setting up your VPN or recovering from access issues, the local proxy can be really useful."]}),"\n",(0,t.jsxs)(o.li,{children:["\ud83d\udce1 ",(0,t.jsx)(o.strong,{children:"Same Network"}),": It's crucial to be on the same local network as your Dappnode."]}),"\n",(0,t.jsxs)(o.li,{children:["\u26a0\ufe0f ",(0,t.jsx)(o.strong,{children:"Network Limitations"}),": Local proxy access might not always be available due to specific network configurations or restrictions."]}),"\n"]}),"\n",(0,t.jsx)(o.h2,{id:"accessing-dappnode-via-local-proxy",children:"Accessing Dappnode via Local Proxy"}),"\n",(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsx)(o.li,{children:"\ud83d\udcf1 On a device of your choice that's connected to the same network as your Dappnode, open a web browser."}),"\n",(0,t.jsxs)(o.li,{children:["\ud83c\udf10 Type in ",(0,t.jsx)(o.a,{href:"http://dappnode.local",children:"http://dappnode.local"})," in the address bar."]}),"\n",(0,t.jsx)(o.li,{children:"\ud83d\udee1 If prompted, use your Dappnode credentials to log in or register as a new user if you haven't already."}),"\n"]}),"\n",(0,t.jsx)(o.admonition,{type:"caution",children:(0,t.jsxs)(o.p,{children:["If ",(0,t.jsx)(o.a,{href:"http://dappnode.local",children:"http://dappnode.local"})," doesn't work, there might be network-specific restrictions or configurations preventing access. In such cases, consider other access methods or reach out for support."]})}),"\n",(0,t.jsx)(o.h2,{id:"limitations--settings",children:"Limitations & Settings"}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsxs)(o.p,{children:["\u26a0\ufe0f ",(0,t.jsx)(o.strong,{children:"Access Limitations"}),": When using the local network proxy, you're limited to the Dappnode Admin UI dashboard at ",(0,t.jsx)(o.code,{children:"dappnode.local"})," and cannot access other features like blockchain clients (Ethereum, Gnosis Chain, etc.). For full feature access, you'd need to configure and use either a VPN or the included Wi-Fi hotspot."]}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"Turning Local Proxy Off"}),": If you primarily use VPN features or the included Wi-Fi hotspot and find no use for local network access, you can disable it. Disabling can also be a security measure if you don't want all devices on your network to have access to this UI, even though it's protected by a password. To toggle local network access, navigate to the Wi-Fi sidebar menu on your Dappnode:"]}),"\n",(0,t.jsxs)(o.p,{children:["\ud83d\udd0d Navigate to the ",(0,t.jsx)(o.a,{href:"http://my.dappnode/wireless-network/local",children:"Local Network menu"})," on your Dappnode."]}),"\n",(0,t.jsx)(o.p,{children:'\ud83d\udd27 Toggle the "Local Network Proxy" switch.'}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/local-proxy-switch.png",alt:"Dappnode Local Proxy Switch",width:"600"})}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:o}={...(0,a.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},28453:(e,o,n)=>{n.d(o,{R:()=>r,x:()=>i});var s=n(96540);const t={},a=s.createContext(t);function r(e){const o=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(a.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/56fab60b.df3a6215.js b/assets/js/56fab60b.df3a6215.js
new file mode 100644
index 000000000..8f287b140
--- /dev/null
+++ b/assets/js/56fab60b.df3a6215.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[3787],{1730:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>r,contentTitle:()=>p,default:()=>c,frontMatter:()=>a,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"user/dappnode-app/how-to-install","title":"How to install the Dappnode app","description":"The complete process to install the Dappnode app is the following:","source":"@site/docs/user/dappnode-app/how-to-install.md","sourceDirName":"user/dappnode-app","slug":"/user/dappnode-app/how-to-install","permalink":"/docs/user/dappnode-app/how-to-install","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/dappnode-app/how-to-install.md","tags":[],"version":"current","frontMatter":{"title":"How to install the Dappnode app","llm_description":"Step-by-step guide to install Dappnode PWA app on mobile/desktop with VPN and notifications."},"sidebar":"userSidebar","previous":{"title":"Overview","permalink":"/docs/user/dappnode-app/overview"},"next":{"title":"Overview","permalink":"/docs/user/dappnode-premium/premium-overview"}}');var t=s(74848),o=s(28453);const a={title:"How to install the Dappnode app",llm_description:"Step-by-step guide to install Dappnode PWA app on mobile/desktop with VPN and notifications."},p="How to install the Dappnode app",r={},l=[{value:"Dappnode App specific installation",id:"dappnode-app-specific-installation",level:3},{value:"Mobile installation",id:"mobile-installation",level:4},{value:"Desktop installation",id:"desktop-installation",level:4},{value:"Brave browser",id:"brave-browser",level:4},{value:"Safari browser",id:"safari-browser",level:4},{value:"Frequent Asked Questions",id:"frequent-asked-questions",level:3},{value:"Access the Dappnode app after installation",id:"access-the-dappnode-app-after-installation",level:4},{value:"Reset notifications permissions",id:"reset-notifications-permissions",level:4},{value:"Requirements to use the Dappnode app",id:"requirements-to-use-the-dappnode-app",level:4}];function d(e){const n={a:"a",br:"br",h1:"h1",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"how-to-install-the-dappnode-app",children:"How to install the Dappnode app"})}),"\n",(0,t.jsx)(n.p,{children:"The complete process to install the Dappnode app is the following:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Go to ",(0,t.jsx)(n.a,{href:"http://my.dappnode",children:"http://my.dappnode"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Go to ",(0,t.jsx)(n.strong,{children:"System"})," in the navigation menu on the left and click ",(0,t.jsx)(n.strong,{children:"App"})," section."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"After clicking Continue, you will be redirected to a private domain (https) to start the App installation. In the first login you will need to type your Dappnode credentials."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"continue-app",src:s(44102).A+"",width:"2874",height:"904"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["You need to ",(0,t.jsx)(n.strong,{children:"set up your VPN connection before installing the Dappnode app"}),". This is mandatory to connect remotely to your Dappnode.\n",(0,t.jsx)(n.img,{alt:"install-button",src:s(9613).A+"",width:"2880",height:"1472"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["There are two VPN options: ",(0,t.jsx)(n.strong,{children:"Tailscale and Wireguard."})," OpenVPN is not supported.\nYou can do the setup in the VPN section in the navigation menu on the left."]}),"\n",(0,t.jsx)(n.p,{children:"Follow these steps to setup the VPN connection:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"1. Download the VPN package in your Dappnode."})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Wireguard is installed by default in your Dappnode"}),"\n",(0,t.jsx)(n.li,{children:"Tailscale can be downloaded in the Dappstore"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"2. Configure the VPN."})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Follow the installation process of ",(0,t.jsx)(n.a,{href:"https://docs.dappnode.io/docs/user/access-your-dappnode/vpn/wireguard",children:"Wireguard"})," or ",(0,t.jsx)(n.a,{href:"https://docs.dappnode.io/docs/user/access-your-dappnode/vpn/tailscale",children:"Tailscale"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"3. Install the VPN app in your phone."})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Go to Google play/App store and ",(0,t.jsx)(n.strong,{children:"download the VPN app in your phone"}),". After the previous configuration, you just need to ",(0,t.jsx)(n.strong,{children:"activate the VPN connection in the VPN mobile app."})]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"dappnode-app-specific-installation",children:"Dappnode App specific installation"}),"\n",(0,t.jsxs)(n.p,{children:["Now that you are done with the VPN connection, you can ",(0,t.jsx)(n.strong,{children:"install the Dappnode App"})," in your phone or computer."]}),"\n",(0,t.jsxs)(n.p,{children:["The Dappnode App will be installed in the browser. ",(0,t.jsx)(n.strong,{children:"We recommend you to use Chrome"})," to have the best experience. Other browser options are Brave and Safari (requires manual setup, check Safari section below)"]}),"\n",(0,t.jsxs)(n.p,{children:["The following installation process is based on the ",(0,t.jsx)(n.strong,{children:"Chrome mobile and desktop experience"}),":"]}),"\n",(0,t.jsx)(n.h4,{id:"mobile-installation",children:"Mobile installation"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Go to ",(0,t.jsx)(n.a,{href:"http://my.dappnode",children:"http://my.dappnode"})," and then go to System / App"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click the ",(0,t.jsx)(n.strong,{children:"Install App"})," button and then click Install in the pop up."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/dnp-app-mobile.png",alt:"dnpappmobile"})}),"\n",(0,t.jsxs)(n.ol,{start:"3",children:["\n",(0,t.jsxs)(n.li,{children:["The App will open in a new window and you need to click ",(0,t.jsx)(n.strong,{children:"Grant permissions"})," button. In the following browser pop up click ",(0,t.jsx)(n.strong,{children:"Allow"}),"."]}),"\n"]}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/grant-mobile.png",alt:"grantmobile"})}),"\n",(0,t.jsxs)(n.ol,{start:"4",children:["\n",(0,t.jsxs)(n.li,{children:["The app was ",(0,t.jsx)(n.strong,{children:"succesfully configured"}),". You can manage your subscribed devices and test the notifications."]}),"\n"]}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/devices-mobile.png",alt:"devicesmobile"})}),"\n",(0,t.jsx)(n.h4,{id:"desktop-installation",children:"Desktop installation"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Go to ",(0,t.jsx)(n.a,{href:"http://my.dappnode",children:"http://my.dappnode"})," and then go to System / App\n",(0,t.jsx)(n.img,{alt:"install-button",src:s(9613).A+"",width:"2880",height:"1472"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click ",(0,t.jsx)(n.strong,{children:"Install"})," in the browser pop up. The app will be installed and opened in a new window.\n",(0,t.jsx)(n.img,{alt:"install-app",src:s(78552).A+"",width:"2876",height:"1520"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Grant permissions"})," to receive push notifications.\n",(0,t.jsx)(n.img,{alt:"grant-permission",src:s(19493).A+"",width:"2876",height:"1618"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click ",(0,t.jsx)(n.strong,{children:"Allow"})," in the popup to receive push notifications.\n",(0,t.jsx)(n.img,{alt:"app-popup",src:s(50439).A+"",width:"2880",height:"1532"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The Dappnode app is ",(0,t.jsx)(n.strong,{children:"successfully configured"})," and you can manage your ",(0,t.jsx)(n.strong,{children:"subscribed devices"}),".",(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.img,{alt:"app-installed",src:s(67140).A+"",width:"2874",height:"1576"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.strong,{children:"Devices"})," tab in the Notifications section you can edit the name of the device subscription, delete the subscription and send a test notification to your device.\n",(0,t.jsx)(n.img,{alt:"devices",src:s(32890).A+"",width:"1424",height:"699"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"brave-browser",children:"Brave browser"}),"\n",(0,t.jsx)(n.p,{children:"The installation process in Brave works similarly to Chrome but there are a few extra steps to consider:"}),"\n",(0,t.jsx)(n.p,{children:"After installing the app, you need to grant permissions twice:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:['Change "Remember my decision" to ',(0,t.jsx)(n.strong,{children:"Forever"})," in the Pop up. Click ",(0,t.jsx)(n.strong,{children:"Allow"}),". This step is critical to receive the notifications.\n",(0,t.jsx)(n.img,{alt:"allow-notifications",src:s(67771).A+"",width:"2812",height:"1556"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["You must activate the field ",(0,t.jsx)(n.strong,{children:'"Use Google services for push messaging"'})," in Settings / Privacy & security. To change it, go to Brave settings or write brave://settings/privacy in the browser search bar in desktop.\n",(0,t.jsx)(n.img,{alt:"activate-push-messaging",src:s(4243).A+"",width:"2694",height:"1114"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"safari-browser",children:"Safari browser"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Go to ",(0,t.jsx)(n.a,{href:"http://my.dappnode",children:"http://my.dappnode"})," in Safari, then go to System / App"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["In the Safari menu, click on the first icon on the top right corner / ",(0,t.jsx)(n.strong,{children:"Add to Dock"}),"\n",(0,t.jsx)(n.img,{alt:"add-dock",src:s(1920).A+"",width:"2510",height:"1578"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click the ",(0,t.jsx)(n.strong,{children:"Dappnode App icon in the dock"})," (bottom menu) to open it."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click Grant Permissions button.\n",(0,t.jsx)(n.img,{alt:"grant-permission",src:s(19493).A+"",width:"2876",height:"1618"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Click Options"})," and ",(0,t.jsx)(n.strong,{children:"Allow"})," on the Popup to activate the notifications. If you click over the banner, notifications will be blocked directly.\n",(0,t.jsx)(n.img,{alt:"grant-popup",src:s(59518).A+"",width:"2592",height:"1508"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Your App was successfully configured.\n",(0,t.jsx)(n.img,{alt:"success-popup",src:s(67140).A+"",width:"2874",height:"1576"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["In case you blocked the notifications, you need to go to ",(0,t.jsx)(n.strong,{children:"System Settings / Notifications / Dappnode app"})," and activate the ",(0,t.jsx)(n.strong,{children:"Allow notifications"})," toggle.\n",(0,t.jsx)(n.img,{alt:"activate-notifications",src:s(89291).A+"",width:"2874",height:"1482"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["To update the Permission changes in the App, ",(0,t.jsx)(n.strong,{children:"close the App by clicking Quit"})," at the dock icon."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Open the Dappnode App again and click ",(0,t.jsx)(n.strong,{children:"manage devices"})," to subscribe your device to notifications.\n",(0,t.jsx)(n.img,{alt:"manage-devices",src:s(91472).A+"",width:"2516",height:"1226"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The Dappnode App ",(0,t.jsx)(n.strong,{children:"installation is completed"})," in Safari. Congrats!"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"frequent-asked-questions",children:"Frequent Asked Questions"}),"\n",(0,t.jsx)(n.h4,{id:"access-the-dappnode-app-after-installation",children:"Access the Dappnode app after installation"}),"\n",(0,t.jsxs)(n.p,{children:["Option 1: You will have the ",(0,t.jsx)(n.strong,{children:"Dappnode app icon"})," in your phone or computer home screen (as any other app)."]}),"\n",(0,t.jsx)(n.p,{children:"Option 2: In desktop you can type in your browser search bar the following:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"brave://apps/ (For Brave)"}),"\n",(0,t.jsx)(n.li,{children:"chrome://apps/ (For Chrome)"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Option 3: You can access the Dappnode app using your ",(0,t.jsx)(n.strong,{children:"dyndns"})," (Dappnode's unique identifier) and ",(0,t.jsx)(n.strong,{children:"https"})," writing the domain below in the browser:",(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.a,{href:"https://pwa.%22your-dyndns%22.io",children:'https://pwa."your-dyndns".io'}),"\ne.g. ",(0,t.jsx)(n.a,{href:"https://pwa.e17cb74a302298e6.dyndns.dappnode.io/",children:"https://pwa.e17cb74a302298e6.dyndns.dappnode.io/"}),"\nYou can find your dyndns in the top right icon in the Dappmanager.\n",(0,t.jsx)(n.img,{alt:"dyndns",src:s(41681).A+"",width:"2880",height:"1330"})]}),"\n",(0,t.jsx)(n.h4,{id:"reset-notifications-permissions",children:"Reset notifications permissions"}),"\n",(0,t.jsx)(n.p,{children:"If you denied the permission to send you push notifications, you need to change the notifications configuration manually."}),"\n",(0,t.jsxs)(n.p,{children:["In ",(0,t.jsx)(n.strong,{children:"Chrome"}),":\nWithin the app, go to the three vertical points in the top right corner.\n",(0,t.jsx)(n.img,{alt:"points",src:s(81895).A+"",width:"2362",height:"1384"})]}),"\n",(0,t.jsxs)(n.p,{children:["Click App Info and activate Notifications.\n",(0,t.jsx)(n.img,{alt:"app-info",src:s(79733).A+"",width:"2368",height:"1396"})]}),"\n",(0,t.jsxs)(n.p,{children:["In Chrome mobile the route changes slightly:\nGo directly to browser settings ",(0,t.jsx)(n.strong,{children:"Settings/Site settings/ Notifications/Managed by app/ Notifications"}),". and activate the permission."]}),"\n",(0,t.jsxs)(n.p,{children:["In ",(0,t.jsx)(n.strong,{children:"Brave"}),":"]}),"\n",(0,t.jsx)(n.p,{children:"Within the app, go to the three horizontal lines in the top right corner.\nClick App Info and activate Notifications."}),"\n",(0,t.jsxs)(n.p,{children:["In the browser you can go to ",(0,t.jsx)(n.strong,{children:"Settings/Privacy and security/ Site and Shield settings"}),"\nIn mobile the route changes slightly: ",(0,t.jsx)(n.strong,{children:"Settings/Site settings/Notifications"})]}),"\n",(0,t.jsxs)(n.p,{children:["In ",(0,t.jsx)(n.strong,{children:"Safari"}),":\nIn your Device go to ",(0,t.jsx)(n.strong,{children:"System Settings/Notifications/Dappnode App"})," and activate the general toggle to allow notifications. If you enter the App and your permissions are not granted yet, please close the App completely to update the permissions and try to enter again."]}),"\n",(0,t.jsx)(n.h4,{id:"requirements-to-use-the-dappnode-app",children:"Requirements to use the Dappnode app"}),"\n",(0,t.jsx)(n.p,{children:"You need to update at least to Dappnode Core v0.3.2."}),"\n",(0,t.jsx)(n.p,{children:"Default packages like Https, Notifications and Bind will be updated automatically with the Core update.\nA VPN connection is needed to have the Dappnode App working."}),"\n",(0,t.jsx)(n.p,{children:"Enjoy your Dappnode App experience!"})]})}function c(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},89291:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/activate-notifications-46b6cf9d9279dbc8a851d3e1f9388501.png"},1920:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/add-to-dock-8cab6e9f562e414ddf810c4fb8879d37.png"},67771:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/allow-notifications-bd00795e85dc8b4904c69bd4aa8d2fca.png"},79733:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/app-info-72a4780eb3c124de5bfed79af3ff98a8.png"},50439:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/app-popup-8a90f56936fd674509a120305059167d.png"},67140:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/app-success-beb8396a0b7848e3e67e4faf03e8378b.png"},4243:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/brave-settings-391980bef8675c1cb898c8c01c73b1c8.png"},44102:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/continue-app-9138f8293acf515483af4e729e46edc7.png"},32890:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/devices-b1df4d994f5655f010e00f5b505449d8.png"},41681:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/dyndns-f47d5e56e6cee010a45b8208a40d82c3.png"},19493:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/enable-notifications-075923ce9ec6fdea6b2e25cacaafdb99.png"},78552:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/install-app-22dde64fa005109b32ce4f1cba649825.png"},9613:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/install-button-d55fe644a55916ad20dacb2e6c75bd07.png"},91472:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/manage-devices-e827fdd5fe076c7b23c4fcd8577aa9dc.png"},59518:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/safari-popup-a44183a8aab6d6cd324db5465cac6cdf.png"},81895:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/three-points-ac9341b3915e088c31669e0a1a25ca82.png"},28453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>p});var i=s(96540);const t={},o=i.createContext(t);function a(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function p(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5741.2c70031d.js b/assets/js/5741.2c70031d.js
new file mode 100644
index 000000000..4de042704
--- /dev/null
+++ b/assets/js/5741.2c70031d.js
@@ -0,0 +1 @@
+(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5741],{45741:()=>{}}]);
\ No newline at end of file
diff --git a/assets/js/59362658.b486722f.js b/assets/js/59362658.b486722f.js
new file mode 100644
index 000000000..596be777c
--- /dev/null
+++ b/assets/js/59362658.b486722f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9325],{37358:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>u});var s=o(41632),n=o(74848),r=o(28453);const a={slug:"mdx-blog-post",title:"MDX Blog Post",authors:["slorber"],tags:["docusaurus"]},l=void 0,c={authorsImageUrls:[void 0]},u=[];function i(e){const t={a:"a",admonition:"admonition",code:"code",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["Blog posts support ",(0,n.jsx)(t.a,{href:"https://docusaurus.io/docs/markdown-features",children:"Docusaurus Markdown features"}),", such as ",(0,n.jsx)(t.a,{href:"https://mdxjs.com/",children:"MDX"}),"."]}),"\n",(0,n.jsxs)(t.admonition,{type:"tip",children:[(0,n.jsx)(t.p,{children:"Use the power of React to create interactive blog posts."}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-js",children:"\n"})}),(0,n.jsx)("button",{onClick:()=>alert("button clicked!"),children:"Click me!"})]})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(i,{...e})}):i(e)}},28453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>l});var s=o(96540);const n={},r=s.createContext(n);function a(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),s.createElement(r.Provider,{value:t},e.children)}},41632:e=>{e.exports=JSON.parse('{"permalink":"/blog/mdx-blog-post","source":"@site/blog/2021-08-01-mdx-blog-post.mdx","title":"MDX Blog Post","description":"Blog posts support Docusaurus Markdown features, such as MDX.","date":"2021-08-01T00:00:00.000Z","tags":[{"inline":true,"label":"docusaurus","permalink":"/blog/tags/docusaurus"}],"readingTime":0.175,"hasTruncateMarker":false,"authors":[{"name":"S\xe9bastien Lorber","title":"Docusaurus maintainer","url":"https://sebastienlorber.com","imageURL":"https://github.com/slorber.png","key":"slorber","page":null}],"frontMatter":{"slug":"mdx-blog-post","title":"MDX Blog Post","authors":["slorber"],"tags":["docusaurus"]},"unlisted":false,"prevItem":{"title":"Welcome","permalink":"/blog/welcome"},"nextItem":{"title":"Long Blog Post","permalink":"/blog/long-blog-post"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/59a51c52.d0433b09.js b/assets/js/59a51c52.d0433b09.js
new file mode 100644
index 000000000..5ff11633d
--- /dev/null
+++ b/assets/js/59a51c52.d0433b09.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4566],{43612:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"user/ethical-metrics/setup","title":"Setting up Ethical Metrics","description":"We highly recommend utilizing the Telegram channel option in addition to or instead of relying solely on email notifications.","source":"@site/docs/user/ethical-metrics/setup.md","sourceDirName":"user/ethical-metrics","slug":"/user/ethical-metrics/setup","permalink":"/docs/user/ethical-metrics/setup","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/ethical-metrics/setup.md","tags":[],"version":"current","frontMatter":{"title":"Setting up Ethical Metrics","llm_description":"Step-by-step guide to configure Telegram and email notifications for Ethical Metrics alerts."},"sidebar":"userSidebar","previous":{"title":"Overview","permalink":"/docs/user/ethical-metrics/overview"},"next":{"title":"Metrics collected","permalink":"/docs/user/ethical-metrics/metrics"}}');var o=t(74848),s=t(28453);const a={title:"Setting up Ethical Metrics",llm_description:"Step-by-step guide to configure Telegram and email notifications for Ethical Metrics alerts."},r="Setting up Ethical Metrics",c={},l=[{value:"Telegram Notifications",id:"telegram-notifications",level:2},{value:"Email Notifications",id:"email-notifications",level:2}];function d(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"setting-up-ethical-metrics",children:"Setting up Ethical Metrics"})}),"\n",(0,o.jsx)(i.admonition,{type:"tip",children:(0,o.jsx)(i.p,{children:"We highly recommend utilizing the Telegram channel option in addition to or instead of relying solely on email notifications."})}),"\n",(0,o.jsx)(i.p,{children:"Email notifications may sometimes encounter hurdles such as being categorized as spam or getting lost in a cluttered inbox. This could inadvertently lead to missing out on important notifications that require your immediate attention."}),"\n",(0,o.jsx)(i.p,{children:"In contrast, Telegram channels provide a streamlined and efficient way to receive notifications directly to your device, ensuring that you stay informed without any interruptions."}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"setup-6",src:t(97381).A+"",width:"1685",height:"674"})}),"\n",(0,o.jsx)(i.p,{children:"In order to setup your Ethical Metrics notification system, you need to follow these steps:"}),"\n",(0,o.jsx)(i.h2,{id:"telegram-notifications",children:"Telegram Notifications"}),"\n",(0,o.jsxs)(i.ol,{children:["\n",(0,o.jsxs)(i.li,{children:["\n",(0,o.jsxs)(i.p,{children:["Access Telegram Web:\nOpen Telegram Web using ",(0,o.jsx)(i.a,{href:"https://web.telegram.org/a/",children:"this link"})," and login with your account. Ensure the URL ends with ",(0,o.jsx)(i.code,{children:"/a/"}),". If not, manually add ",(0,o.jsx)(i.code,{children:"/a/"})," after ",(0,o.jsx)(i.code,{children:"https://web.telegram.org/"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(i.li,{children:["\n",(0,o.jsx)(i.p,{children:"Create a Private Channel."}),"\n"]}),"\n",(0,o.jsxs)(i.li,{children:["\n",(0,o.jsxs)(i.p,{children:["Add the DappNode bot (",(0,o.jsx)(i.code,{children:"@ethicalMetricsAlerts_bot"}),") to your channel as an administrator."]}),"\n"]}),"\n",(0,o.jsxs)(i.li,{children:["\n",(0,o.jsxs)(i.p,{children:["Find Your Channel ID:\nCopy the channel ID from the URL.\nIt's a 13-digit number following the ",(0,o.jsx)(i.code,{children:"-"})," in the URL. The ID always starts with ",(0,o.jsx)(i.code,{children:"-100"}),". Ensure to include the ",(0,o.jsx)(i.code,{children:"-"})," when copying."]}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"telegram-channel-id",src:t(54172).A+"",width:"302",height:"29"})}),"\n"]}),"\n",(0,o.jsxs)(i.li,{children:["\n",(0,o.jsxs)(i.p,{children:["Navigate to ",(0,o.jsx)(i.a,{href:"http://my.dappnode/system/notifications",children:"http://my.dappnode/system/notifications"})]}),"\n"]}),"\n",(0,o.jsxs)(i.li,{children:["\n",(0,o.jsxs)(i.p,{children:["Enable Notifications:\nPaste the channel ID into the Telegram Channel ID field and toggle the switch ",(0,o.jsx)(i.code,{children:"ON"})," to start receiving notifications."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(i.h2,{id:"email-notifications",children:"Email Notifications"}),"\n",(0,o.jsxs)(i.ol,{children:["\n",(0,o.jsxs)(i.li,{children:["Navigate to ",(0,o.jsx)(i.a,{href:"http://my.dappnode/system/notifications",children:"http://my.dappnode/system/notifications"})]}),"\n",(0,o.jsx)(i.li,{children:"Introduce the email address where you want to receive the notifications and click on the switch to activate the notifications."}),"\n",(0,o.jsx)(i.li,{children:"That's it! Your Ethical Metrics will automatically register your TOR instance with the email address you provided. This will happen through the TOR network, preserving your privacy. You should receive a welcome email in the following minutes."}),"\n"]}),"\n",(0,o.jsx)(i.admonition,{type:"caution",children:(0,o.jsxs)(i.p,{children:["To send email notifications, it is necessary that you provide an email address. In order to remain private, we recommend you to use an address that can't be linked to your identity. For example, John Doe probably wouldn't want to use \"",(0,o.jsx)(i.a,{href:"mailto:johndoe@gmail.com",children:"johndoe@gmail.com"}),'" if he wanted to remain anonymous.']})})]})}function h(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},97381:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/ethical-metrics-setup-1c7291004f39fb5cbc133557eebf35ee.png"},54172:(e,i,t)=>{t.d(i,{A:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAS4AAAAdCAYAAAAU2YH0AAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAAAmdEVYdENyZWF0aW9uIFRpbWUAanVlIDI4IG1hciAyMDI0IDE0OjE3OjE4soT19wAAElNJREFUeJztnH9sU+e5xz/8sB2S4BBXxh2zA+W0OHibkW8TFCKQW7VEKcMURFSSBREtICBUWbOCmnapUsV3KbiiUwoaAQRpQWT8UKpsy2VICdOwuEosflxfXM2kpaYNcelNzfLDS1KOXcL9Iz9wEjt2aNc26/lIR0qe532f8/i8Pt/zPu85PtPu379/HwkJCYkpxPTvOgEJCQmJySIJl4SExJRDEi4JCYkphyRcEhISU46Z33UCEhLfNom5177rFCQmQe+pJeNs0oxLQkJiyhFBuDpx1R+k3tX77WYzCdovnOZ0c3tU29fDh7PWRq3D/w3GDMVLo7WYavu/Kv7UZrLj+c2Pv8T3lQjC1UHzH89ibw9E6NZLh6uZ6x2x2r9hAi7OHDrB1b6EiW1fGy+NNTU0eMQY2op4nXac3snE9+FobMThe8j0/p2Z7Hj+S8Zf4vvKQ5aKLmrKdnPm+lhhi2T/hmm9wJXexZifVE1s+1ZxUFWwlRp3LCInEZXJjue49u3UbFlPxYXBqqG36RUsJfVMfE2dRsqyFP5+fDFVj08b7ZLFsbloEZ7jP+PO0cWc26wkJWb/dNKf1XHubQN3Ti3hzkE99XmzmRvz/hWs3vQYzQd/OtR/ESfXJJAUsz+Umawu0nPnlB7b4yHmx+dx9dQSekO2v29OQDHsV8+m4lU9nuNL6D1uoHnnXFYkRe47uAlsjo+hP6CYN4eq/1yM9/gS7hzVU79pzPEdw5Rc43JdaKF3sZllqoltElOXyY7nuPadLlo7dKQZE4EArVc8qFJT0UTor1AnsKPoCZpfSma+fKx3Gis2PcY7aQM0HG9jW10fc83zeW9NXGz+pCR+83w83dc62La3jfJr91nx/HzeWTY9xv0PoOArmuq85O5to/warPxFChWGaTH6H3yO9DULOJgm4+7Yz58wgzmBXsqtN3j69cEt98/9DF6GZewoWsCLc/op33ODp/fdoWPBjzi5Zc6gOLb52G79mOeGt91tHPl0gO4b/+RSfwz9ZfFYd+rIoYeX9twg92Q/Kc/O5701CiIxgXAFaT/za/Is2WRb8thScZrRS15BWvasITs7m+zsEs52TmTv4MLbr7Albz2W7Gws6wso2V2Pa6RPL9frK9iRZyE728L6gleo9wCdF6jIW0/J6dB1CxcXWnpZbF6GapztP/hgVzr63FpGqi9PNav066gZKeE8VK/Ss6raM/iv6KHRWsCq5Ub0xuWsK67FOWbJyVu3i3XLjej16TxTYKXRG2lWJdKwVc+CBQtYoM+l1hdb/NEhorX3YrdtHfTr9RiXryK3uBY3AD4arVtZ90w6er0efXouNR5w1xTwTLoevV5P+jMFWO2+kVgNZbmsWp6OXr8AvXE5uWW11NmKWfeMEb3eyPLcMhoilr9eGm1bWZWuH8q1OqTsDZ/LxPkPM3qMPadfoWD9g+/Gweax86aQ9s0VWLKzyf7FflzBVvb/Ipvs7DW8bu+j44+/xlLRHOZzTGPpGi07533Jm9V3+HBswRCfxI7Mmbj+1E7JeT/vn2unxP4VS1c+wgpZDP6eLnJf/oi84//g/SvdHDjyOXXdMzAa4oZmNFH2T5D3j7fzxvluzl/p5sCRL2gKyNHPnxGjf5AkwzwOrrrPm9V3uDXuM85A0R/AdaOfyx8Pbh/4hn4NKEtg5eNw8dxn1Lr7uXzlC0qbvyRuQQJGGRAMctndx8Wh7cP4OVjmfcnvjnzBBzH0VzyRzOoff0Xtsc95393P+fNeSlvusdT8CD8LM1oQ5XGIxIVr2VYsIO+9Tv2hd9m9X+DYa2kMXhBkGLdVUZwmB+Qkj6hIOHsnrS4XpO3kjZUa6LzO2XdrKHu9i6oDhQieE+w5dJPU4kp2psro6+giQQMEggQCECDkKF+/wNVegRdCL8Ujth9hGjBBmRO3mI9ZAX6nA4/owekWQasAvxunR43JJAB+HNat7HIYKK08hgE3NVYrxVYtf91rHpkmi2jJKS1EUPporLZRXACn/lKOadwFQYG5vJ5yswJQoFb7cZRFj/+AaPmIOKwFbG1Qk1+6n3JBgb/BRnGdEx/5gBen3Y7fVMnhvQIKv4haC+qMQsoNJagVIu46K2XFZZj++zAWpQ+3wwnmvRzL0SJ6arGVlWE15FNaehhB4aXOVkaZ1UTG4RzUo3IVcZQVUNyoprD8MOVKHw1VVgoKoL6+CIMiXC7R8g8/xpq0tWxb/EuSZX14/3KQfW/vI9VYyVOJYdon7uTYH/rwnimj7ObPOfCqmYQ+O3t2nGXhW2/xgi6RlC3Xxxz3+1w8+iECwPxH2Tx2VBckYEz4iqaPAyPtL7m/pHvlLNLVcGnOxP6Lt0EMhvwkOH4mGtkAt9qCQzOaifc/CpmMFc8lszTYx+/dX8Xuj5+NrSiJWydvcPR2MhvHdItLmEFc8B5J82QktQXpGeUN0NYzHUuakrn2br5ARvp8OXc/8/FhcOz+49mZMxta2jjaFmP/+BkkcY+O/uFjdB/XpyIsU7BIFv4wTCBcMpLTzGSmqQAjuq4WtpxpppU0jEMtEpJ16HTj5rUR7DISU58kzTgYL02AHTvOcObKRl6ji15ZMqlpRgQNDI4gwEoq3185Ksr1pqt0CmtJU4W3KU0ZGMRa7G4wm0ScDjcKJTgdbsgyITrtOBUmKk2Ar5HqBhHL4b3kZygAE5UldpZbG3BiJmMovpBTQr5l8LTNMIi4l9uosZeyP2u89Ci1AoIwZPfVxRR/hGj5+BupqfORUX6K8pwhGfFpoW50GLXJjNkUIjMGM+bhP4VCGuqqcHrAYhrK2ZBBhkkNJgF/YwNlyizyswazM/gaaLA58DBGuPwN1DT4MFfWU2pRDh4bQcTzTBXVjkL2m8Pk4m/AFkP+Y8c4Ucgkc8i3WLeBpgs1uG7CU8Zw7RNRqeS0dnWhWpiKTqWCri465TrWCipUclDETydONh0FIAbv0dMf5T0D8TKSuEdPd0i7niA9zCJlzrTo/tuh8WWsL3iUFd3/YJ197Fk/Memb9PxtVRxwj4vHPub3bbH6p7Eibx4rP/ucp+1BxHnjY2tkA3TIkjhkUxEXCHKp5XNeOtLFB0Eg2M+bR3ws/ZWO/9mTzMX+OFYk9bB9TxdfjImTlDaXfPWX/O5t/wPxi9a/rY8PAknkP6+k7oifW8jQq2cAA8QRnpgfQNVokqG3i2/sAQmdEaPqBFdcHbBxLS8Ir3NoxxaurNzAhhfMGFXjBRGu03S1E2FtZshaxRibNoMswUaj0wsmH3anmvwSA3V1DjyY8NudiBklZCgArxuP34ujwBhy7oiImPH6AWWYFNQmTFoRu8dLiMKGZ7Lxo7X3OHGLAoUZamJHxNNgw1Zjx+nxgVKJKIpow1a7StRqJaLPz3B6SrUahV/EL8KoKaLHjVs0UGgK+RBaEybBj93tYUQpQ4kp/7FjHKD9wkEOnrlKa0cnyBMJBANoApHaA3TQ3h5Ak6YbjNDuoUNjZPhaurroJxxLH1ol+czH0ztvc3mCjIbp+Zp+mMnqzQs5ZLhLqfVzLk5Ot3D9qY2nr8kxpqn5Td5CTvXfGCV+Ef3z1FRk3uP31i5uRYj90blP+Mk5IF7GisxHqdqUwnt9ATKP9yEyDY1agSbYT11zHxjkoJ7N5iVxNJ2/y4Ov0kxyzLPB7eXE7dDoUfr7OnnpaAInNz2G2wwwwN3AdOi/G/GYxv7kvFyOnNGFcaR7h7HdUwwRJvliNlQdI635LGdOHOSVs6dZW1nFdmPi6C7X7VztFFibqZnAZiAjQ0tVox1vhh8HGVTmmPBU1eLwZuF3+DDkZwxqhiiCwkD+sf3kh55LCiXacKIVA6P0YLLxo7UXB9Uj8pJlGNxVFO9qRF1SzuEsAaW/kbLcmsjtFYqh/Qz/DwrCqNzD3DyNJf+x4+k5QcWeFlQvFPNbsw55XxP7y85Gbn9lN+srmukLBmFfHpZ9QDBIkKvssJxAnvkazu65rD0/JFx9AT6Klnd/mNlTkowkgtzqvg9E8wPM5NnNAu+lf0X57k85envyb5MSe+5y+dpdLl/rpXuOgWPPPcIi+/+N5B/JT9oclibMYqltCdaQeMbf/pSUd/5OXktILv1BLp73UvrEbP64JAkjfVxWq3grL4FLR9yUtAzAn30czXuCv+U9yurmT3m/f6hvUhKrDXD5aM/omVjU/vf5yH6LJ5u9pKhl0AerX1qElT4uRRD3h/zJTyLyRAj29QKqGOxh6GzlZqccXeqw4CQiZG7gtcynSC3ZQk29i0JjZqi8cd3eQqduLaN1a7zNZDGjrWukts6P31SCQWnAbCijsbYWv9dATtaQKggmBBrweJUIsc5iPA4cXiUGg3aMQzF4zvv9wEPGj9ZeMKClEYfbT36Myur3ePAoMygtymKwMhSYzHwtcq4GBOpwOP0UDufideL0KBAEAcYst8ea/9jx7L3poSPByPbCTBYDkEoyZyO2x7iNA28kUFbh5edVO8lM7OXC7hKaUit5Y50GuSwZYcd1zo8psyZC/LQPV5+KpY/LwS0C01hqmMUcn5/LPhC7J/YDzDVrOWS+z9E9n3Cg7eu+Au8+4tAJHf4iMNr/kb2NZddC7jCqH+G9Xym5XP0Jb16LnotCHU9KQpBLtwdG4n/k/pKe52Yxfw4wJFwKw2zS6efN/x14qP4EB7h1W2TushReNNyj6Z2ecaXoMA8pXFpSdXDh7AmaNE+R3NuJ3PgURlUkO0CQ9rPvUp9gRpfYRfOJGlwqM2+lyaG9mbOtchYuTIa+m7R2BUnUJSLvvEDFi/vpWltF1YZe7C2d6FaljSoTx9sAkwWzOpeaWiWWwxkoUGC2GLBaa8FUzrBuoc6i0FLFVlsxZWIhFoMSfF586iwsISWQ3+3A4dSCz0mtzYbbUEKlWQG+BorXWfEVnuJUoYDJAA211TRos1D6fCgyosVXolZCY2MDbnM+hmj5qLPIN1exy1pMNUWYlD6cdU7E8atlIygFAa2/gdrqRpRmLQrRi4/wVXBURn3eLIpyqimwFmOjiCyll4YqG04hn3pzhDlV1PzHj2eiVoeqz0796WbkaRoSAu30AYkR2iNXkRzooku1EKOgQUMnXV1yBGMqOk245YcY6O/hQPOPqH9eR1XPF5yPn0OFeSauun8MlnvBKH7i2LlmNly7zX8F4kgffn4qGMQ1skA/AfGzeTlnFh037tIRnM58QzIvp03Dda578K5dNH+PyAehNVcwiMgAPb673OoHZPFszlPCjX7ahvsvm8GH57txAeKn/8TVrWJjwaO46vzckinIz0tC09M5IswPxLqHy2Pqu1j6z52XgHGeHGP6I7y4bBbd9jZeaglz82GIhxQuFSu3befK7hr2vf4XSE5lY/lTGFWR7IO95HTQdKiCm71yNIvNvPrb7RjlEOhqpenEWTwdfQRlySxM+yWv/dIIND3YpcdOS6eOVZm6iW0AmMjJEqitE8jKGDyJtGYLJtwocrJCZhxKzJXH2G+zUVW9izqviEJrIKs0Y0hY1BgyTNjtZRTU+kGpxZRVyqnyQgzjjokaS2k59l1V7MqtRaE1UXTYQtGE8QVySnJoLLNR5bBw2BI9H8vew/jKbNSWFVAlajEJUUovQxF7y71Yq3eRa/ODUo1aMJD1kKXwA5RklB9jv6IMm7WAGr8SwVzE4coiDBETipJ/uPFcvJFXt3Ww/8xuXnk3CLIEkjUCTyZHaA90tLYT0JoHxazXS3unBmOYm0ixc5+Lxz+hNCGF32x+jI3BAJftbWz7893Y/PGzWKSejubHWs6lh4T13eG5lz+LvtaVMJNFTyTz4rNxaOQDdPtELp5ro/Tk3dj8UZlGyrwkNpo1aBIG6O4WuXy+jdKTQ89x9Xezfd9M3tmk5p1XNczhHm1tPWzbO3qdLkU9k7s94vjSO2r/6Vi2LMQ2/x5tbb2cqPbyu5bI61sA076dVzdf52DBK7S+cIyqnz/cE6KegwWUuFZx4MAGdBPYfmj46gpYXm2g/q+lYcT0+09o/opJjufDjr/0doipRbi3Q0yR19p4sF/pRLcyM+QLGs72746Iu7EOj0JAq1Yieu3UVDnQZpVEu7/5PWGi/D3UTmo8f4jjLzHM1BAuj53mDg2ZY8rEcbZ/e/x47XVUNXrw+kUUagFT1l4Ol5omd6fxO2OC/D01kxvPH+T4SwzzLZWKEhLfH6RScWoRrlSUhEtCQmLKMSXfDiEhIfHDRhIuCQmJKYckXBISElMOSbgkJCSmHJJwSUhITDn+H8jAhSjsBOBaAAAAAElFTkSuQmCC"},28453:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>r});var n=t(96540);const o={},s=n.createContext(o);function a(e){const i=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5b35db5e.4b401959.js b/assets/js/5b35db5e.4b401959.js
new file mode 100644
index 000000000..b5af2e5c5
--- /dev/null
+++ b/assets/js/5b35db5e.4b401959.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[54],{24722:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>d,default:()=>p,frontMatter:()=>l,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"user/access-your-dappnode/vpn/openvpn","title":"OpenVPN Access to Dappnode","description":"OpenVPN is a widely-accepted VPN protocol known for its reliability and high-security standards. Here\'s how you can set it up with Dappnode.","source":"@site/docs/user/access-your-dappnode/vpn/openvpn.md","sourceDirName":"user/access-your-dappnode/vpn","slug":"/user/access-your-dappnode/vpn/openvpn","permalink":"/docs/user/access-your-dappnode/vpn/openvpn","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/access-your-dappnode/vpn/openvpn.md","tags":[],"version":"current","frontMatter":{"title":"OpenVPN Access to Dappnode","llm_description":"Setup guide for OpenVPN access with credential retrieval and multi-platform installation steps."},"sidebar":"userSidebar","previous":{"title":"Wireguard","permalink":"/docs/user/access-your-dappnode/vpn/wireguard"},"next":{"title":"Terminal (Advanced)","permalink":"/docs/user/access-your-dappnode/terminal"}}');var t=i(74848),s=i(28453);const l={title:"OpenVPN Access to Dappnode",llm_description:"Setup guide for OpenVPN access with credential retrieval and multi-platform installation steps."},d="OpenVPN Access to Dappnode",r={},c=[{value:"Setting Up OpenVPN",id:"setting-up-openvpn",level:2},{value:"1. Get VPN Credentials URL",id:"1-get-vpn-credentials-url",level:3},{value:"Option 1: Via Dappmanager UI",id:"option-1-via-dappmanager-ui",level:4},{value:"Option 2: Via Dappnode Terminal",id:"option-2-via-dappnode-terminal",level:4},{value:"2. Download OpenVPN Credentials",id:"2-download-openvpn-credentials",level:3},{value:"3. OpenVPN Installation",id:"3-openvpn-installation",level:2},{value:"4. Connecting to Dappnode via OpenVPN",id:"4-connecting-to-dappnode-via-openvpn",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Details:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"openvpn-access-to-dappnode",children:"OpenVPN Access to Dappnode"})}),"\n",(0,t.jsx)(n.p,{children:"OpenVPN is a widely-accepted VPN protocol known for its reliability and high-security standards. Here's how you can set it up with Dappnode."}),"\n",(0,t.jsx)(n.h2,{id:"setting-up-openvpn",children:"Setting Up OpenVPN"}),"\n",(0,t.jsx)(n.h3,{id:"1-get-vpn-credentials-url",children:"1. Get VPN Credentials URL"}),"\n",(0,t.jsx)(n.p,{children:"There are two primary methods to obtain your VPN credentials, based on your access level to the Dappmanager:"}),"\n",(0,t.jsxs)(n.h4,{id:"option-1-via-dappmanager-ui",children:[(0,t.jsx)(n.em,{children:"Option 1"}),": Via Dappmanager UI"]}),"\n",(0,t.jsx)(n.p,{children:"If you have access to the Dappmanager:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Navigate to ",(0,t.jsx)(n.strong,{children:"VPN > OpenVPN"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"If you don't see any device added to the list:"})}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Provide a name for your device."}),"\n",(0,t.jsx)(n.li,{children:"Click on 'Add New Device'."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"To retrieve the credentials:"})}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Click on the 'Get Link' button."}),"\n",(0,t.jsx)(n.li,{children:"Copy the URL displayed."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.admonition,{title:"Separate Credentials for Each Device",type:"tip",children:[(0,t.jsx)(n.p,{children:"For the best experience and to enable simultaneous access, it's recommended to create a separate device entry in the Dappnode VPN list for each device you intend to use for accessing your Dappnode."}),(0,t.jsx)(n.p,{children:"While it's technically possible to use the same credentials on multiple devices, doing so can lead to connectivity issues when trying to access the Dappnode from multiple devices at the same time."}),(0,t.jsx)(n.p,{children:"By setting up distinct credentials for each device, you ensure a smooth, uninterrupted connection for all your devices."})]}),"\n",(0,t.jsxs)(n.h4,{id:"option-2-via-dappnode-terminal",children:[(0,t.jsx)(n.em,{children:"Option 2"}),": Via Dappnode Terminal"]}),"\n",(0,t.jsx)(n.p,{children:"If you can't access the Dappmanager, you'll need to get the credentials via the Dappnode terminal:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Access the Dappnode terminal, as explained ",(0,t.jsx)(n.a,{href:"/docs/user/access-your-dappnode/terminal",children:"here"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Execute the command: ",(0,t.jsx)(n.code,{children:"dappnode_openvpn"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"A URL will be displayed on the terminal. Copy it."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"2-download-openvpn-credentials",children:"2. Download OpenVPN Credentials"}),"\n",(0,t.jsx)(n.p,{children:"With the URL you obtained in the previous step, you'll now download the OpenVPN credentials:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Open a web browser on any device."}),"\n",(0,t.jsx)(n.li,{children:"Paste the URL you copied into the address bar and navigate to it."}),"\n",(0,t.jsxs)(n.li,{children:["You should be taken to a page where the OpenVPN credentials for your Dappnode can be downloaded. Click on the download button or link to download the ",(0,t.jsx)(n.code,{children:".ovpn"})," file, which contains your OpenVPN configuration and credentials."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"caution",children:(0,t.jsxs)(n.p,{children:["Ensure that you ",(0,t.jsx)(n.strong,{children:"store credentials securely"}),". The ",(0,t.jsx)(n.code,{children:".ovpn"})," file provides direct access to your Dappnode, so treat it with the same caution you'd treat a password."]})}),"\n",(0,t.jsx)(n.h2,{id:"3-openvpn-installation",children:"3. OpenVPN Installation"}),"\n",(0,t.jsxs)(n.p,{children:["Once you've obtained your OpenVPN credentials, the next step is to install an OpenVPN client. You can download the one that's compatible with the device you are going to use to connect to the Dappnode machine from the ",(0,t.jsx)(n.a,{href:"https://openvpn.net/client/",children:"OpenVPN website"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"4-connecting-to-dappnode-via-openvpn",children:"4. Connecting to Dappnode via OpenVPN"}),"\n",(0,t.jsx)(n.p,{children:"Once you have installed the OpenVPN client on your device, follow the steps below based on your operating system to connect to Dappnode:"}),"\n",(0,t.jsxs)(i,{children:[(0,t.jsx)("summary",{children:(0,t.jsx)("b",{children:"Android"})}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Launch the OpenVPN for Android app."}),"\n",(0,t.jsx)(n.li,{children:'Tap on "Import file".'}),"\n",(0,t.jsxs)(n.li,{children:["Upload the ",(0,t.jsx)(n.code,{children:".ovpn"})," file you downloaded earlier."]}),"\n",(0,t.jsx)(n.li,{children:'Click on "Connect".'}),"\n",(0,t.jsx)(n.li,{children:"Allow the app to create a VPN connection."}),"\n"]}),(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/openvpn_android.jpg",alt:"Import file in Android",style:{width:"20em"}})})]}),"\n",(0,t.jsxs)(i,{children:[(0,t.jsx)("summary",{children:(0,t.jsx)("b",{children:"iPhone/iPad"})}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Go to the URL you obtained in the previous step."}),"\n",(0,t.jsxs)(n.li,{children:["Download the ",(0,t.jsx)(n.code,{children:".ovpn"})," file."]}),"\n",(0,t.jsx)(n.li,{children:'Click on "Open in OpenVPN".'}),"\n",(0,t.jsx)(n.li,{children:'Click on "Add".'}),"\n",(0,t.jsx)(n.li,{children:'Click on "Connect"'}),"\n",(0,t.jsx)(n.li,{children:"Allow the app to create a VPN connection."}),"\n"]}),(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/openvpn_iphone_import.jpg",alt:"Import file in iPhone",style:{width:"10em"}})})]}),"\n",(0,t.jsxs)(i,{children:[(0,t.jsx)("summary",{children:(0,t.jsx)("b",{children:"macOS"})}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Launch Tunnelblick app for macOS."}),"\n",(0,t.jsx)(n.li,{children:'Click on "VPN Details" in the top bar menu.'}),"\n",(0,t.jsxs)(n.li,{children:["Drag and drop the ",(0,t.jsx)(n.code,{children:".ovpn"})," file you downloaded earlier in the left side bar."]}),"\n",(0,t.jsx)(n.li,{children:"Click on Connect."}),"\n"]}),(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/openvpn_mac.png",alt:"Import file in macOS",style:{width:"20em"}})})]}),"\n",(0,t.jsxs)(i,{children:[(0,t.jsx)("summary",{children:(0,t.jsx)("b",{children:"Windows"})}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Launch the OpenVPN for Windows app."}),"\n",(0,t.jsx)(n.li,{children:'Click on "Import file".'}),"\n",(0,t.jsxs)(n.li,{children:["Upload the ",(0,t.jsx)(n.code,{children:".ovpn"})," file you downloaded earlier."]}),"\n",(0,t.jsx)(n.li,{children:"Allow the app to create a VPN connection."}),"\n"]}),(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/openvpn_windows.jpg",alt:"Import file in Windows",style:{width:"20em"}})})]}),"\n",(0,t.jsxs)(i,{children:[(0,t.jsxs)("summary",{children:[" ",(0,t.jsx)("b",{children:"Recent Ubuntu"})]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Open Settings>Network."}),"\n",(0,t.jsx)(n.li,{children:'Click on the "+" button to add a new VPN connection.'}),"\n",(0,t.jsx)(n.li,{children:'Select "Import from file".'}),"\n",(0,t.jsxs)(n.li,{children:["Upload the ",(0,t.jsx)(n.code,{children:".ovpn"})," file you downloaded earlier."]}),"\n",(0,t.jsx)(n.li,{children:'Click on "Add".'}),"\n",(0,t.jsx)(n.li,{children:"Toggle the switch button to connect."}),"\n"]}),(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/openvpn_ubuntu_network.png",alt:"Import file in Ubuntu",style:{width:"40em"}})}),(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/openvpn_ubuntu_import.png",alt:"Import file in Ubuntu",style:{width:"40em"}})})]}),"\n",(0,t.jsxs)(i,{children:[(0,t.jsxs)("summary",{children:[" ",(0,t.jsx)("b",{children:"Other Linux"})]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Open the terminal."}),"\n",(0,t.jsxs)(n.li,{children:["Navigate to the directory where you have stored your ",(0,t.jsx)(n.code,{children:".ovpn"})," file."]}),"\n",(0,t.jsxs)(n.li,{children:["Execute the command: ",(0,t.jsx)(n.code,{children:"sudo openvpn Dappnode_VPN.ovpn"}),"."]}),"\n"]})]}),"\n",(0,t.jsx)("br",{}),"\n",(0,t.jsx)(n.admonition,{title:"Testing Your Connection",type:"tip",children:(0,t.jsxs)(n.p,{children:["Once connected, you can directly type ",(0,t.jsx)(n.a,{href:"http://my.dappnode",children:"http://my.dappnode"})," in your browser to access the Dappmanager."]})})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>d});var o=i(96540);const t={},s=o.createContext(t);function l(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5bbd2a48.8405511e.js b/assets/js/5bbd2a48.8405511e.js
new file mode 100644
index 000000000..481abaf57
--- /dev/null
+++ b/assets/js/5bbd2a48.8405511e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1355],{88324:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"dev/github-actions/staker-packages/execution-clients","title":"Execution Client Workflows","description":"Execution client packages (Geth, Reth, Nethermind, Besu, Erigon) use four GitHub Actions workflows to ensure proper testing and release automation.","source":"@site/docs/dev/github-actions/staker-packages/execution-clients.md","sourceDirName":"dev/github-actions/staker-packages","slug":"/dev/github-actions/staker-packages/execution-clients","permalink":"/docs/dev/github-actions/staker-packages/execution-clients","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/github-actions/staker-packages/execution-clients.md","tags":[],"version":"current","frontMatter":{"title":"Execution Client Workflows","sidebar_label":"Execution Clients","llm_description":"GitHub Actions workflows for Dappnode execution client packages including sync, sync-test, and release workflows."},"sidebar":"devSidebar","previous":{"title":"Overview","permalink":"/docs/dev/github-actions/staker-packages/overview"},"next":{"title":"Consensus Clients","permalink":"/docs/dev/github-actions/staker-packages/consensus-clients"}}');var r=s(74848),i=s(28453);const o={title:"Execution Client Workflows",sidebar_label:"Execution Clients",llm_description:"GitHub Actions workflows for Dappnode execution client packages including sync, sync-test, and release workflows."},l="Execution Client Workflows",c={},d=[{value:"Workflow Overview",id:"workflow-overview",level:2},{value:"1. Auto Check for Upstream Updates (auto_check.yml)",id:"1-auto-check-for-upstream-updates-auto_checkyml",level:2},{value:"2. Sync Production (sync.yml)",id:"2-sync-production-syncyml",level:2},{value:"Workflow File",id:"workflow-file",level:3},{value:"Features",id:"features",level:3},{value:"3. Sync Test (sync-test.yml)",id:"3-sync-test-sync-testyml",level:2},{value:"Workflow File",id:"workflow-file-1",level:3},{value:"Features",id:"features-1",level:3},{value:"PR Report",id:"pr-report",level:3},{value:"4. Release (release.yml)",id:"4-release-releaseyml",level:2},{value:"Workflow File",id:"workflow-file-2",level:3},{value:"Features",id:"features-2",level:3},{value:"Test Logs",id:"test-logs",level:3},{value:"Environment Variables",id:"environment-variables",level:2}];function a(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"execution-client-workflows",children:"Execution Client Workflows"})}),"\n",(0,r.jsx)(n.p,{children:"Execution client packages (Geth, Reth, Nethermind, Besu, Erigon) use four GitHub Actions workflows to ensure proper testing and release automation."}),"\n",(0,r.jsx)(n.h2,{id:"workflow-overview",children:"Workflow Overview"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Workflow"}),(0,r.jsx)(n.th,{children:"Trigger"}),(0,r.jsx)(n.th,{children:"Purpose"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"auto_check.yml"})}),(0,r.jsx)(n.td,{children:"Scheduled (every 4h)"}),(0,r.jsx)(n.td,{children:"Check for upstream updates"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"sync.yml"})}),(0,r.jsx)(n.td,{children:"Scheduled daily + manual"}),(0,r.jsx)(n.td,{children:"Keep execution client synced"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"sync-test.yml"})}),(0,r.jsx)(n.td,{children:"Pull requests + manual"}),(0,r.jsx)(n.td,{children:"Test package changes"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"release.yml"})}),(0,r.jsx)(n.td,{children:"Push to main + manual"}),(0,r.jsx)(n.td,{children:"Release with attestation test"})]})]})]}),"\n",(0,r.jsxs)(n.h2,{id:"1-auto-check-for-upstream-updates-auto_checkyml",children:["1. Auto Check for Upstream Updates (",(0,r.jsx)(n.code,{children:"auto_check.yml"}),")"]}),"\n",(0,r.jsx)(n.p,{children:"Same as standard packages - checks for upstream updates and creates PRs when new versions are available."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'name: Bump upstream version\n\non:\n schedule:\n - cron: "00 */4 * * *"\n push:\n branches:\n - "master"\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v3\n - run: npx @dappnode/dappnodesdk github-action bump-upstream\n env:\n GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n PINATA_API_KEY: ${{ secrets.PINATA_API_KEY }}\n PINATA_SECRET_API_KEY: ${{ secrets.PINATA_SECRET_API_KEY }}\n'})}),"\n",(0,r.jsxs)(n.h2,{id:"2-sync-production-syncyml",children:["2. Sync Production (",(0,r.jsx)(n.code,{children:"sync.yml"}),")"]}),"\n",(0,r.jsx)(n.p,{children:"This workflow keeps the execution client synced on the self-hosted runner. By maintaining a synced state, other workflows (sync-test, release) complete much faster."}),"\n",(0,r.jsx)(n.h3,{id:"workflow-file",children:"Workflow File"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'name: Execution Client Sync Production\n\non:\n schedule:\n - cron: "0 4 * * *"\n workflow_dispatch:\n inputs:\n consensus_client:\n description: "Consensus Client"\n required: true\n type: choice\n options: [lodestar, teku, prysm, nimbus, lighthouse]\n\njobs:\n sync:\n runs-on: staking-test-hoodi\n steps:\n - name: Run sync\n run: |\n docker run --rm --pull=always --network dncore_network \\\n -v /var/run/docker.sock:/var/run/docker.sock \\\n -e MODE=sync \\\n -e EXECUTION_CLIENT=\'geth\' \\\n -e CONSENSUS_CLIENT=${{ github.event.inputs.consensus_client }} \\\n -e NETWORK=hoodi \\\n ghcr.io/dappnode/staker-test-util/test-runner:latest\n'})}),"\n",(0,r.jsx)(n.h3,{id:"features",children:"Features"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Scheduled daily"}),": Runs at 4 AM UTC to keep the client synced"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Manual trigger"}),": Can be triggered manually with any consensus client"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Uses test-runner image"}),": The ",(0,r.jsx)(n.code,{children:"ghcr.io/dappnode/staker-test-util/test-runner"})," container handles the sync logic"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Network access"}),": Connects to the Dappnode's ",(0,r.jsx)(n.code,{children:"dncore_network"})," to communicate with other services"]}),"\n"]}),"\n",(0,r.jsxs)(n.h2,{id:"3-sync-test-sync-testyml",children:["3. Sync Test (",(0,r.jsx)(n.code,{children:"sync-test.yml"}),")"]}),"\n",(0,r.jsx)(n.p,{children:"Triggered on PRs to test package changes. Builds the package, uploads it to the local IPFS node, and runs a sync test with the new version."}),"\n",(0,r.jsx)(n.h3,{id:"workflow-file-1",children:"Workflow File"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'name: Execution Client Sync Test\n\non:\n workflow_dispatch:\n inputs:\n consensus_client:\n description: "Consensus Client"\n required: true\n type: choice\n options: [lodestar, teku, prysm, nimbus, lighthouse]\n pull_request:\n branches:\n - "main"\n paths-ignore:\n - "README.md"\n\njobs:\n build:\n runs-on: staking-test-hoodi\n name: Build\n outputs:\n ipfs_hash: ${{ steps.extract_hash.outputs.ipfs_hash }}\n steps:\n - uses: actions/checkout@v6\n - name: Build and upload\n run: npx @dappnode/dappnodesdk build --provider=http://$(docker inspect DAppNodeCore-ipfs.dnp.dappnode.eth --format \'{{.NetworkSettings.Networks.dncore_network.IPAddress}}\'):5001 --variant=hoodi\n - name: Extract IPFS hash from releases.json\n id: extract_hash\n run: |\n # Get the last key\'s hash from releases.json\n IPFS_HASH=$(jq -r \'to_entries | last | .value.hash\' package_variants/hoodi/releases.json)\n echo "ipfs_hash=$IPFS_HASH" >> $GITHUB_OUTPUT\n echo "Extracted IPFS hash: $IPFS_HASH"\n\n sync-test:\n runs-on: staking-test-hoodi\n name: Execution Client Sync Test\n needs: [build]\n steps:\n - name: Run sync\n run: |\n docker run --rm --pull=always --network dncore_network \\\n -v /var/run/docker.sock:/var/run/docker.sock \\\n -e MODE=sync \\\n -e EXECUTION_CLIENT=\'geth\' \\\n -e IPFS_HASH=${{ needs.build.outputs.ipfs_hash }} \\\n -e CONSENSUS_CLIENT=${{ github.event.inputs.consensus_client }} \\\n -e GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} \\\n -e GITHUB_REPOSITORY=${{ github.repository }} \\\n -e GITHUB_PR_NUMBER=${{ github.event.pull_request.number }} \\\n -e GITHUB_RUN_ID=${{ github.run_id }} \\\n -e GITHUB_SERVER_URL=${{ github.server_url }} \\\n ghcr.io/dappnode/staker-test-util/test-runner:latest\n'})}),"\n",(0,r.jsx)(n.h3,{id:"features-1",children:"Features"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Builds to local IPFS"}),": Uses the Dappnode's IPFS node as the provider"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"IPFS hash extraction"}),": Extracts the hash from ",(0,r.jsx)(n.code,{children:"releases.json"})," for the test"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"PR integration"}),": Posts a test report to the PR with results"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"GitHub context"}),": Passes GitHub environment variables for PR commenting"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"pr-report",children:"PR Report"}),"\n",(0,r.jsx)(n.p,{children:"After the test completes, a report is posted to the PR including:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Clients used and versions (before/after install)"}),"\n",(0,r.jsx)(n.li,{children:"Timing measurements for each operation"}),"\n",(0,r.jsx)(n.li,{children:"Container error logs (if any)"}),"\n",(0,r.jsx)(n.li,{children:"Link to full CI logs"}),"\n"]}),"\n",(0,r.jsxs)(n.h2,{id:"4-release-releaseyml",children:["4. Release (",(0,r.jsx)(n.code,{children:"release.yml"}),")"]}),"\n",(0,r.jsx)(n.p,{children:"Triggered on push to main. Runs a full attestation test before releasing the package."}),"\n",(0,r.jsx)(n.h3,{id:"workflow-file-2",children:"Workflow File"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'name: "Release"\n\non:\n workflow_dispatch:\n inputs:\n consensus_client:\n description: "Consensus Client"\n required: true\n type: choice\n options: [lodestar, teku, prysm, nimbus, lighthouse]\n push:\n branches:\n - "main"\n paths-ignore:\n - "README.md"\n\njobs:\n build:\n runs-on: staking-test-hoodi\n name: Build\n outputs:\n ipfs_hash: ${{ steps.extract_hash.outputs.ipfs_hash }}\n steps:\n - uses: actions/checkout@v6\n - name: Build and upload\n run: npx @dappnode/dappnodesdk build --provider=http://$(docker inspect DAppNodeCore-ipfs.dnp.dappnode.eth --format \'{{.NetworkSettings.Networks.dncore_network.IPAddress}}\'):5001 --variant=hoodi\n - name: Extract IPFS hash from releases.json\n id: extract_hash\n run: |\n # Get the last key\'s hash from releases.json\n IPFS_HASH=$(jq -r \'to_entries | last | .value.hash\' package_variants/hoodi/releases.json)\n echo "ipfs_hash=$IPFS_HASH" >> $GITHUB_OUTPUT\n echo "Extracted IPFS hash: $IPFS_HASH"\n\n test:\n name: Test\n runs-on: staking-test-hoodi\n needs: [build]\n steps:\n - uses: actions/checkout@v6\n - name: Run staker test runner\n run: |\n docker run --rm --pull=always \\\n --network dncore_network \\\n -v /var/run/docker.sock:/var/run/docker.sock \\\n -e MODE=test \\\n -e IPFS_HASH=${{ needs.build.outputs.ipfs_hash }} \\\n -e CONSENSUS_CLIENT=${{ github.event.inputs.consensus_client }} \\\n -e GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} \\\n -e GITHUB_REPOSITORY=${{ github.repository }} \\\n -e GITHUB_PR_NUMBER=${{ github.event.pull_request.number }} \\\n -e GITHUB_RUN_ID=${{ github.run_id }} \\\n -e GITHUB_SERVER_URL=${{ github.server_url }} \\\n ghcr.io/dappnode/staker-test-util/test-runner:latest\n\n release:\n name: Release\n runs-on: ipfs-dev-gateway\n needs: [test]\n steps:\n - uses: actions/checkout@v6\n - uses: actions/setup-node@v6\n with:\n node-version: "22"\n - name: Publish\n run: npx @dappnode/dappnodesdk publish patch --content_provider=http://10.200.200.7:5001 --eth_provider=https://web3.dappnode.net --timeout 2h --all-variants\n env:\n GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n DEVELOPER_ADDRESS: "0xf35960302a07022aba880dffaec2fdd64d5bf1c1"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"features-2",children:"Features"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Proof of Attestation Test"}),": The test job uses ",(0,r.jsx)(n.code,{children:"MODE=test"})," which:","\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Syncs execution and consensus clients"}),"\n",(0,r.jsx)(n.li,{children:"Imports validators into web3signer"}),"\n",(0,r.jsx)(n.li,{children:"Waits for validators to become live on the beacon chain"}),"\n",(0,r.jsx)(n.li,{children:"Confirms successful attestation"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Three-stage pipeline"}),": Build \u2192 Test \u2192 Release"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Different runners"}),": Test runs on ",(0,r.jsx)(n.code,{children:"staking-test-hoodi"}),", release on ",(0,r.jsx)(n.code,{children:"ipfs-dev-gateway"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"All variants"}),": Publishes all package variants with ",(0,r.jsx)(n.code,{children:"--all-variants"})]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"test-logs",children:"Test Logs"}),"\n",(0,r.jsx)(n.p,{children:"The proof of attestation test logs include:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Validator beaconcha.in URL"}),"\n",(0,r.jsx)(n.li,{children:"Clients used and versions"}),"\n",(0,r.jsx)(n.li,{children:"Sync timing measurements"}),"\n",(0,r.jsx)(n.li,{children:"Attestation confirmation"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Variable"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"MODE"})}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"sync"})," for sync only, ",(0,r.jsx)(n.code,{children:"test"})," for full attestation test"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"EXECUTION_CLIENT"})}),(0,r.jsxs)(n.td,{children:["The execution client name (e.g., ",(0,r.jsx)(n.code,{children:"geth"}),", ",(0,r.jsx)(n.code,{children:"reth"}),")"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"CONSENSUS_CLIENT"})}),(0,r.jsx)(n.td,{children:"The consensus client to pair with"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"IPFS_HASH"})}),(0,r.jsx)(n.td,{children:"The IPFS hash of the built package to test"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"NETWORK"})}),(0,r.jsxs)(n.td,{children:["The network to use (e.g., ",(0,r.jsx)(n.code,{children:"hoodi"}),")"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"GITHUB_TOKEN"})}),(0,r.jsx)(n.td,{children:"For PR commenting and GitHub API access"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"GITHUB_REPOSITORY"})}),(0,r.jsx)(n.td,{children:"Repository name for PR comments"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"GITHUB_PR_NUMBER"})}),(0,r.jsx)(n.td,{children:"PR number for posting reports"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"GITHUB_RUN_ID"})}),(0,r.jsx)(n.td,{children:"Run ID for linking to CI logs"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"GITHUB_SERVER_URL"})}),(0,r.jsx)(n.td,{children:"GitHub server URL for links"})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>l});var t=s(96540);const r={},i=t.createContext(r);function o(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5d0a1dad.1659667e.js b/assets/js/5d0a1dad.1659667e.js
new file mode 100644
index 000000000..2f5b94809
--- /dev/null
+++ b/assets/js/5d0a1dad.1659667e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4301],{43605:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>s,metadata:()=>o,toc:()=>p});const o=JSON.parse('{"id":"user/getting-started/choose-your-path","title":"Choose your path","description":"Regardless of how you wish to utilize Dappnode, taking the initiative to contribute to decentralization and earning rewards is commendable. Embark on your desired path and experience the full potential of Dappnode.","source":"@site/docs/user/getting-started/choose-your-path.md","sourceDirName":"user/getting-started","slug":"/user/getting-started/choose-your-path","permalink":"/docs/user/getting-started/choose-your-path","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/getting-started/choose-your-path.md","tags":[],"version":"current","frontMatter":{"title":"Choose your path","llm_description":"Entry point to choose between using pre-installed Dappnode or installing on your own machine."},"sidebar":"userSidebar","next":{"title":"Connect your Dappnode to the router","permalink":"/docs/user/getting-started/connect-dappnode-to-the-router"}}');var a=n(74848),r=n(28453);const s={title:"Choose your path",llm_description:"Entry point to choose between using pre-installed Dappnode or installing on your own machine."},i="Choose your path",d={},p=[];function c(e){const t={admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"choose-your-path",children:"Choose your path"})}),"\n",(0,a.jsx)(t.p,{children:"Regardless of how you wish to utilize Dappnode, taking the initiative to contribute to decentralization and earning rewards is commendable. Embark on your desired path and experience the full potential of Dappnode."}),"\n",(0,a.jsx)(t.admonition,{type:"note",children:(0,a.jsxs)(t.p,{children:["Interested in purchasing a Dappnode? Explore our ",(0,a.jsx)("a",{href:"https://dappnode.io",children:"official store"}),"."]})}),"\n",(0,a.jsxs)("div",{className:"card-container",children:[(0,a.jsxs)("a",{href:"/docs/user/getting-started/connect-dappnode-to-the-router",className:"card",children:[(0,a.jsx)("img",{src:"/img/dappnode_box.png",alt:"Dappnode Box",className:"dappnode-box"}),(0,a.jsx)("h2",{children:"Dappnode is installed"}),(0,a.jsx)("p",{children:"I have bought a Dappnode or I already installed it"})]}),(0,a.jsxs)("a",{href:"/docs/user/install/iso",className:"card",children:[(0,a.jsx)("img",{src:"/img/install_dappnode.png",alt:"Install Dappnode"}),(0,a.jsx)("h2",{children:"I want to install Dappnode"}),(0,a.jsx)("p",{children:"I own a machine where I want to install Dappnode software"})]})]})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>i});var o=n(96540);const a={},r=o.createContext(a);function s(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5d665ce0.46f2736f.js b/assets/js/5d665ce0.46f2736f.js
new file mode 100644
index 000000000..17f3cd139
--- /dev/null
+++ b/assets/js/5d665ce0.46f2736f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1939],{84206:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"user/hardware/overview","title":"Hardware","description":"In this section you will find information related to the hardware of the Dappnode\'s host machine. If you had noticed any issue with it and have tried some steps provided by the Dappnode community and/or staff without success, this section of the Dappnode documentation will help you solving those that are on the hardware side of things.","source":"@site/docs/user/hardware/overview.md","sourceDirName":"user/hardware","slug":"/user/hardware/overview","permalink":"/docs/user/hardware/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/hardware/overview.md","tags":[],"version":"current","frontMatter":{"title":"Hardware","llm_description":"Overview of hardware-related documentation covering maintenance and temperature monitoring."},"sidebar":"userSidebar","previous":{"title":"Local Proxy (Recovery)","permalink":"/docs/user/access-your-dappnode/local"},"next":{"title":"Maintenance","permalink":"/docs/user/hardware/maintenance"}}');var o=n(74848),a=n(28453);const s={title:"Hardware",llm_description:"Overview of hardware-related documentation covering maintenance and temperature monitoring."},i="Hardware",d={},c=[];function h(e){const r={a:"a",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.header,{children:(0,o.jsx)(r.h1,{id:"hardware",children:"Hardware"})}),"\n",(0,o.jsx)(r.p,{children:"In this section you will find information related to the hardware of the Dappnode's host machine. If you had noticed any issue with it and have tried some steps provided by the Dappnode community and/or staff without success, this section of the Dappnode documentation will help you solving those that are on the hardware side of things."}),"\n",(0,o.jsx)(r.p,{children:"Here are some topics you can check:"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.a,{href:"/docs/user/hardware/maintenance",children:(0,o.jsx)(r.strong,{children:"\ud83d\udee0\ufe0f Maintenance"})}),": Some approaches that may be helpful for your dappnode to perform as expected."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.a,{href:"/docs/user/hardware/temperature",children:(0,o.jsx)(r.strong,{children:"\ud83c\udf21\ufe0f Temperature"})}),": Instructions for keeping track of your dappnode's temperature."]}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:r}={...(0,a.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},28453:(e,r,n)=>{n.d(r,{R:()=>s,x:()=>i});var t=n(96540);const o={},a=t.createContext(o);function s(e){const r=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),t.createElement(a.Provider,{value:r},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5e90a9b3.81fdccc0.js b/assets/js/5e90a9b3.81fdccc0.js
new file mode 100644
index 000000000..78c5214b9
--- /dev/null
+++ b/assets/js/5e90a9b3.81fdccc0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8025],{27134:a=>{a.exports=JSON.parse('{"tag":{"label":"hola","permalink":"/blog/tags/hola","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/hola","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/5e95c892.a7f1852a.js b/assets/js/5e95c892.a7f1852a.js
new file mode 100644
index 000000000..f1beac545
--- /dev/null
+++ b/assets/js/5e95c892.a7f1852a.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9647],{18122:(e,s,d)=>{d.r(s),d.d(s,{default:()=>o});d(96540);var r=d(18215),a=d(81082),c=d(204),n=d(22831),p=d(99795),u=d(74848);function o(e){return(0,u.jsx)(a.e3,{className:(0,r.A)(c.G.wrapper.docsPages),children:(0,u.jsx)(p.A,{children:(0,n.v)(e.route.routes)})})}}}]);
\ No newline at end of file
diff --git a/assets/js/5f141bf4.7732046d.js b/assets/js/5f141bf4.7732046d.js
new file mode 100644
index 000000000..030d9d3bc
--- /dev/null
+++ b/assets/js/5f141bf4.7732046d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[2422],{99940:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"user/packages/understanding-dappnode-packages/logs","title":"Logs","description":"This is a great section for finding out something that is not working in your package or to look for both expected and unexpected behavior. Packages with multiple services will give you the option to switch logs in the top \\"Service\\" bar, something common for consensus clients for example, which usually run one service for the beacon-chain and another one for validator. Whenever you request for support in the Dappnode community, keep these handy!","source":"@site/docs/user/packages/understanding-dappnode-packages/logs.md","sourceDirName":"user/packages/understanding-dappnode-packages","slug":"/user/packages/understanding-dappnode-packages/logs","permalink":"/docs/user/packages/understanding-dappnode-packages/logs","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/packages/understanding-dappnode-packages/logs.md","tags":[],"version":"current","frontMatter":{"title":"Logs","llm_description":"View package logs for troubleshooting, with multi-service support for beacon-chain/validator."},"sidebar":"userSidebar","previous":{"title":"Network","permalink":"/docs/user/packages/understanding-dappnode-packages/network"},"next":{"title":"Backup","permalink":"/docs/user/packages/understanding-dappnode-packages/backup"}}');var s=n(74848),a=n(28453);const r={title:"Logs",llm_description:"View package logs for troubleshooting, with multi-service support for beacon-chain/validator."},i="Logs",c={},d=[];function p(e){const o={code:"code",h1:"h1",header:"header",img:"img",p:"p",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.header,{children:(0,s.jsx)(o.h1,{id:"logs",children:"Logs"})}),"\n",(0,s.jsxs)(o.p,{children:['This is a great section for finding out something that is not working in your package or to look for both expected and unexpected behavior. Packages with multiple services will give you the option to switch logs in the top "Service" bar, something common for consensus clients for example, which usually run one service for the ',(0,s.jsx)(o.code,{children:"beacon-chain"})," and another one for ",(0,s.jsx)(o.code,{children:"validator"}),". Whenever you request for support in the Dappnode community, keep these handy!"]}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.img,{alt:"dappnode_packages4",src:n(64166).A+"",width:"1741",height:"1091"})})]})}function u(e={}){const{wrapper:o}={...(0,a.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},64166:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/dappnode_packages4-bb2f5a5218ea06c59a09858997773adf.png"},28453:(e,o,n)=>{n.d(o,{R:()=>r,x:()=>i});var t=n(96540);const s={},a=t.createContext(s);function r(e){const o=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5f877448.dd4b4f4c.js b/assets/js/5f877448.dd4b4f4c.js
new file mode 100644
index 000000000..50faab0f8
--- /dev/null
+++ b/assets/js/5f877448.dd4b4f4c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5364],{12992:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"user/access-your-dappnode/vpn/overview","title":"VPN Access to Dappnode","description":"Virtual Private Network (VPN) is a robust method for accessing your Dappnode. It ensures a secure and encrypted connection between your device and the Dappnode, allowing you to manage your Dappnode from virtually anywhere. Depending on your needs and preferences, Dappnode offers support for two primary VPN technologies: WireGuard and OpenVPN.","source":"@site/docs/user/access-your-dappnode/vpn/overview.md","sourceDirName":"user/access-your-dappnode/vpn","slug":"/user/access-your-dappnode/vpn/overview","permalink":"/docs/user/access-your-dappnode/vpn/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/access-your-dappnode/vpn/overview.md","tags":[],"version":"current","frontMatter":{"title":"VPN Access to Dappnode","llm_description":"Overview of VPN options (Tailscale, WireGuard, OpenVPN) for secure local and remote access."},"sidebar":"userSidebar","previous":{"title":"Wi-Fi","permalink":"/docs/user/access-your-dappnode/wifi"},"next":{"title":"Tailscale","permalink":"/docs/user/access-your-dappnode/vpn/tailscale"}}');var r=s(74848),t=s(28453);const i={title:"VPN Access to Dappnode",llm_description:"Overview of VPN options (Tailscale, WireGuard, OpenVPN) for secure local and remote access."},a="VPN Access to Dappnode",c={},d=[{value:"VPN Clients",id:"vpn-clients",level:2},{value:"Tailscale",id:"tailscale",level:3},{value:"WireGuard",id:"wireguard",level:3},{value:"OpenVPN (Deprecated)",id:"openvpn-deprecated",level:3},{value:"Local vs. Remote Access",id:"local-vs-remote-access",level:2}];function l(e){const n={a:"a",admonition:"admonition",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"vpn-access-to-dappnode",children:"VPN Access to Dappnode"})}),"\n",(0,r.jsxs)(n.p,{children:["Virtual Private Network (VPN) is a robust method for accessing your Dappnode. It ensures a secure and encrypted connection between your device and the Dappnode, allowing you to manage your Dappnode from virtually anywhere. Depending on your needs and preferences, Dappnode offers support for two primary VPN technologies: ",(0,r.jsx)(n.strong,{children:"WireGuard"})," and ",(0,r.jsx)(n.strong,{children:"OpenVPN"}),"."]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"It is not possible to use both Dappnode WiFi hotspot and VPN at the same time. If you want to use VPN, you'll need to disconnect your device from the WiFi hotspot."})}),"\n",(0,r.jsx)(n.h2,{id:"vpn-clients",children:"VPN Clients"}),"\n",(0,r.jsx)(n.h3,{id:"tailscale",children:(0,r.jsx)(n.a,{href:"/docs/user/access-your-dappnode/vpn/tailscale",children:"Tailscale"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Tailscale is a user-friendly VPN service that simplifies the process of connecting to your Dappnode."}),"\n",(0,r.jsxs)(n.li,{children:["It's an excellent choice if you're experiencing issues with port forwarding, UPnP, or CGNAT. ",(0,r.jsx)(n.a,{href:"https://tailscale.com/",children:"Learn more"})]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"wireguard",children:(0,r.jsx)(n.a,{href:"/docs/user/access-your-dappnode/vpn/wireguard",children:"WireGuard"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"WireGuard is a newer, streamlined VPN protocol known for its simplicity, speed, and security."}),"\n",(0,r.jsxs)(n.li,{children:["It requires less configuration and is considered more efficient in terms of CPU usage. ",(0,r.jsx)(n.a,{href:"https://www.wireguard.com/",children:"Learn more"})]}),"\n"]}),"\n",(0,r.jsxs)(n.h3,{id:"openvpn-deprecated",children:[(0,r.jsx)(n.a,{href:"/docs/user/access-your-dappnode/vpn/openvpn",children:"OpenVPN"})," (Deprecated)"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"OpenVPN is a well-established VPN protocol praised for its security and reliability."}),"\n",(0,r.jsxs)(n.li,{children:["It's more versatile and can bypass most network restrictions and firewalls. ",(0,r.jsx)(n.a,{href:"https://openvpn.net/",children:"Learn more"})]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"local-vs-remote-access",children:"Local vs. Remote Access"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Local Access"}),": Connecting to your Dappnode when you're on the same local network. Generally, this means that your Dappnode machine and the device you're using to access it are connected to the same router."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Remote Access"}),": Connecting to your Dappnode from a different network or location. This is one of the major advantages of using a VPN."]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(n.p,{children:"VPN provides a balance of security, versatility, and remote access capability. You can choose the VPN technology that best suits your needs and preferences, both fulfill the requirements of most users."})})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var o=s(96540);const r={},t=o.createContext(r);function i(e){const n=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/621db11d.76e2e285.js b/assets/js/621db11d.76e2e285.js
new file mode 100644
index 000000000..5602dca64
--- /dev/null
+++ b/assets/js/621db11d.76e2e285.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4212],{30217:(t,e,s)=>{s.r(e),s.d(e,{default:()=>m});s(96540);var a=s(18215),o=s(81082),r=s(204),l=s(11926),u=s(60569),n=s(37220),i=s(9303),c=s(95921);const h={authorListItem:"authorListItem_n3yI"};var g=s(74848);function p(t){let{author:e}=t;return(0,g.jsx)("li",{className:h.authorListItem,children:(0,g.jsx)(c.A,{as:"h2",author:e,count:e.count})})}function d(t){let{authors:e}=t;return(0,g.jsx)("section",{className:(0,a.A)("margin-vert--lg",h.authorsListSection),children:(0,g.jsx)("ul",{children:e.map((t=>(0,g.jsx)(p,{author:t},t.key)))})})}function m(t){let{authors:e,sidebar:s}=t;const c=(0,l.uz)();return(0,g.jsxs)(o.e3,{className:(0,a.A)(r.G.wrapper.blogPages,r.G.page.blogAuthorsListPage),children:[(0,g.jsx)(o.be,{title:c}),(0,g.jsx)(n.A,{tag:"blog_authors_list"}),(0,g.jsxs)(u.A,{sidebar:s,children:[(0,g.jsx)(i.A,{as:"h1",children:c}),(0,g.jsx)(d,{authors:e})]})]})}},11926:(t,e,s)=>{s.d(e,{ZD:()=>l,uz:()=>u});s(96540);var a=s(50539),o=s(81430);s(74848);function r(){const{selectMessage:t}=(0,o.W)();return e=>t(e,(0,a.T)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:e}))}function l(t){const e=r();return(0,a.T)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:e(t.count),tagName:t.label})}const u=()=>(0,a.T)({id:"theme.blog.authorsList.pageTitle",message:"Authors",description:"The title of the authors page"})}}]);
\ No newline at end of file
diff --git a/assets/js/6696a323.9843e328.js b/assets/js/6696a323.9843e328.js
new file mode 100644
index 000000000..3ef105c5e
--- /dev/null
+++ b/assets/js/6696a323.9843e328.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9091],{37362:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"dev/package-development/multi-configuration","title":"Multi-Config Package Development","description":"This guide will walk you through the steps to develop a multi-config Dappnode package, allowing you to create multiple package configurations from a single source. We\'ll use the Lodestar Generic package as a reference, which builds multiple variants for different networks like Mainnet, Holesky, and Gnosis.","source":"@site/docs/dev/package-development/multi-configuration.md","sourceDirName":"dev/package-development","slug":"/dev/package-development/multi-configuration","permalink":"/docs/dev/package-development/multi-configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/package-development/multi-configuration.md","tags":[],"version":"current","frontMatter":{"title":"Multi-Config Package Development","llm_description":"Guide for developing multi-variant packages supporting different networks from one codebase."},"sidebar":"devSidebar","previous":{"title":"Single Configuration","permalink":"/docs/dev/package-development/single-configuration"},"next":{"title":"Publishing Guide","permalink":"/docs/dev/package-publishing/publish-packages-clients"}}');var t=a(74848),o=a(28453);const s={title:"Multi-Config Package Development",llm_description:"Guide for developing multi-variant packages supporting different networks from one codebase."},r="Multi-Config Package Development",c={},l=[{value:"Step 1: Initialize the Package",id:"step-1-initialize-the-package",level:2},{value:"Step 2: Customize your package",id:"step-2-customize-your-package",level:2},{value:"Create a directory for each variant",id:"create-a-directory-for-each-variant",level:3},{value:"Customize the Avatar",id:"customize-the-avatar",level:3},{value:"Key Changes in docker-compose.yml and dappnode_package.json",id:"key-changes-in-docker-composeyml-and-dappnode_packagejson",level:3},{value:"Simplified Dockerfile",id:"simplified-dockerfile",level:3},{value:"Simplified entrypoint",id:"simplified-entrypoint",level:3},{value:"Prometheus and Grafana",id:"prometheus-and-grafana",level:3},{value:"Step 3: Build the packages",id:"step-3-build-the-packages",level:2},{value:"Step 4: Publish the Packages",id:"step-4-publish-the-packages",level:2},{value:"Automating Publication with GitHub Actions",id:"automating-publication-with-github-actions",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"multi-config-package-development",children:"Multi-Config Package Development"})}),"\n",(0,t.jsx)(n.p,{children:"This guide will walk you through the steps to develop a multi-config Dappnode package, allowing you to create multiple package configurations from a single source. We'll use the Lodestar Generic package as a reference, which builds multiple variants for different networks like Mainnet, Holesky, and Gnosis."}),"\n",(0,t.jsx)(n.h2,{id:"step-1-initialize-the-package",children:"Step 1: Initialize the Package"}),"\n",(0,t.jsx)(n.p,{children:"Start by running the following command to initialize your multi-variant Dappnode package:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npx @dappnode/dappnodesdk@latest init --use-variants\n"})}),"\n",(0,t.jsx)(n.p,{children:"This will create the following directory structure:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:".\n\u251c\u2500\u2500 avatar-default.png\n\u251c\u2500\u2500 dappnode_package.json\n\u251c\u2500\u2500 docker-compose.yml\n\u251c\u2500\u2500 Dockerfile\n\u2514\u2500\u2500 package_variants\n \u251c\u2500\u2500 mainnet\n \u2502 \u251c\u2500\u2500 dappnode_package.json\n \u2502 \u2514\u2500\u2500 docker-compose.yml\n \u2514\u2500\u2500 testnet\n \u251c\u2500\u2500 dappnode_package.json\n \u2514\u2500\u2500 docker-compose.yml\n"})}),"\n",(0,t.jsx)(n.h2,{id:"step-2-customize-your-package",children:"Step 2: Customize your package"}),"\n",(0,t.jsx)(n.h3,{id:"create-a-directory-for-each-variant",children:"Create a directory for each variant"}),"\n",(0,t.jsxs)(n.p,{children:["Each variant of your package will have its own configuration files under ",(0,t.jsx)(n.code,{children:"package_variants"}),". For example, if you have ",(0,t.jsx)(n.code,{children:"mainnet"})," and ",(0,t.jsx)(n.code,{children:"testnet"})," variants, you will find the following:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"package_variants/\n\u251c\u2500\u2500 mainnet/\n\u2502 \u251c\u2500\u2500 dappnode_package.json\n\u2502 \u2514\u2500\u2500 docker-compose.yml\n\u2514\u2500\u2500 testnet/\n \u251c\u2500\u2500 dappnode_package.json\n \u2514\u2500\u2500 docker-compose.yml\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The contents within each variant directory include the fields that differ from one variant to another. When building a specific variant, such as ",(0,t.jsx)(n.code,{children:"testnet"}),", the data from these variant-specific files is merged with the root-level ",(0,t.jsx)(n.code,{children:"dappnode_package.json"})," and ",(0,t.jsx)(n.code,{children:"docker-compose.yml"}),". This ensures that only the necessary variant-specific changes are applied, while the common configuration remains consistent across all variants."]}),"\n",(0,t.jsx)(n.p,{children:"You can add more variants as needed by creating additional directories and files following this structure."}),"\n",(0,t.jsx)(n.h3,{id:"customize-the-avatar",children:"Customize the Avatar"}),"\n",(0,t.jsxs)(n.p,{children:["Replace the default avatar (",(0,t.jsx)(n.code,{children:"avatar-default.png"}),") with a square ",(0,t.jsx)(n.code,{children:".png"})," image that represents your package (recommended dimensions: width between 200px and 300px). This image will appear in the Dappnode UI, so it's important to choose one that aligns with your package's branding. The avatar is common for each of the variants."]}),"\n",(0,t.jsxs)(n.h3,{id:"key-changes-in-docker-composeyml-and-dappnode_packagejson",children:["Key Changes in ",(0,t.jsx)(n.code,{children:"docker-compose.yml"})," and ",(0,t.jsx)(n.code,{children:"dappnode_package.json"})]}),"\n",(0,t.jsxs)(n.p,{children:["In the root-level ",(0,t.jsx)(n.code,{children:"docker-compose.yml"})," and ",(0,t.jsx)(n.code,{children:"dappnode_package.json"}),", specify the general configuration that applies across all variants."]}),"\n",(0,t.jsxs)(n.p,{children:["Each variant in ",(0,t.jsx)(n.code,{children:"package_variants"})," will have its own ",(0,t.jsx)(n.code,{children:"docker-compose.yml"})," and ",(0,t.jsx)(n.code,{children:"dappnode_package.json"}),", tailored to the network or environment it is intended for."]}),"\n",(0,t.jsxs)(n.p,{children:["For example, ",(0,t.jsx)(n.code,{children:"package_variants/mainnet/docker-compose.yml"})," could define services using ",(0,t.jsx)(n.code,{children:"NETWORK=mainnet"}),", while ",(0,t.jsx)(n.code,{children:"package_variants/testnet/docker-compose.yml"})," would use ",(0,t.jsx)(n.code,{children:"NETWORK=testnet"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Example of a variant-specific ",(0,t.jsx)(n.code,{children:"dappnode_package.json"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "name": "test-mainnet.public.dappnode.eth",\n "version": "0.1.0",\n "type": "service"\n}\n'})}),"\n",(0,t.jsxs)(n.p,{children:["And the corresponding ",(0,t.jsx)(n.code,{children:"docker-compose.yml"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'version: "3.5"\nservices:\n test:\n build:\n args:\n NETWORK: mainnet\n\n'})}),"\n",(0,t.jsx)(n.h3,{id:"simplified-dockerfile",children:"Simplified Dockerfile"}),"\n",(0,t.jsxs)(n.p,{children:["Here\u2019s an example of the ",(0,t.jsx)(n.code,{children:"Dockerfile"})," used for the Lodestar Generic package. This ",(0,t.jsx)(n.code,{children:"Dockerfile"})," is responsible for configuring the Lodestar Ethereum client and handling multiple variants."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-Dockerfile",children:'ARG UPSTREAM_VERSION\n\nFROM chainsafe/lodestar:${UPSTREAM_VERSION}\n\nARG NETWORK\nARG STAKER_SCRIPTS_VERSION\n\n# Additional envs\n\nENV STAKER_SCRIPTS_URL=https://github.com/dappnode/staker-package-scripts/releases/download/${STAKER_SCRIPTS_VERSION}\n\nCOPY entrypoint.sh /usr/local/bin/entrypoint.sh\n\n# These scripts provide useful tools for the entrypoint\nADD ${STAKER_SCRIPTS_URL}/consensus_tools.sh /etc/profile.d/\nRUN chmod +rx /etc/profile.d/consensus_tools.sh\n\n# Additional commands or package installation\n\n# This environment variable sets the variant (e.g., mainnet, testnet)\nENV NETWORK=${NETWORK}\n\nENTRYPOINT ["/usr/local/bin/entrypoint.sh"]\n'})}),"\n",(0,t.jsx)(n.h3,{id:"simplified-entrypoint",children:"Simplified entrypoint"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"entrypoint.sh"})," script for the Lodestar client manages different network setups (e.g., Holesky, Gnosis, Mainnet) and configures runtime flags accordingly. Here\u2019s a simplified version:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'#!/bin/sh\n\nSUPPORTED_NETWORKS="gnosis holesky mainnet"\nMEVBOOST_FLAG_KEY="--builder"\nCLIENT="lodestar"\n\n# Load the tools scripts\n. /etc/profile\n\n# Get the necessary environment variables for the beacon node\nENGINE_URL="http://execution.${NETWORK}.staker.dappnode:8551"\nVALID_FEE_RECIPIENT=$(get_valid_fee_recipient "${FEE_RECIPIENT}")\nMEVBOOST_FLAG=$(get_mevboost_flag "${NETWORK}" "${MEVBOOST_FLAG_KEY}")\n\nJWT_SECRET=$(get_jwt_secret_by_network "${NETWORK}")\necho "${JWT_SECRET}" >"${JWT_FILE_PATH}"\n\n# Start the beacon node with the appropriate flags\necho "[INFO - entrypoint] Running beacon node"\n\nFLAGS="beacon \\\n --network=${NETWORK} \\\n --suggestedFeeRecipient=${VALID_FEE_RECIPIENT} \\\n --jwt-secret=${JWT_FILE_PATH} \\\n --execution.urls=${ENGINE_URL} \\\n # ... Additional flags here\n --logFileDailyRotate=5 $MEVBOOST_FLAG $EXTRA_OPTS"\n\n# Run the Lodestar client with the specified flags\nexec ${CLIENT_BIN} $FLAGS\n'})}),"\n",(0,t.jsx)(n.h3,{id:"prometheus-and-grafana",children:"Prometheus and Grafana"}),"\n",(0,t.jsxs)(n.p,{children:["In multi-variant packages, you can use a common Grafana dashboard located at the root level, while each variant can have its own Prometheus targets. These are stored in variant-specific directories like ",(0,t.jsx)(n.code,{children:"package_variants/gnosis/prometheus-targets.json"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"By following this guide, you\u2019ll be able to create multi-variant packages that support different networks or configurations within a single source code base."}),"\n",(0,t.jsx)(n.h2,{id:"step-3-build-the-packages",children:"Step 3: Build the packages"}),"\n",(0,t.jsx)(n.p,{children:"Once your variants are configured, build any of them using the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npx @dappnode/dappnodesdk@latest build --variants=\n"})}),"\n",(0,t.jsx)(n.p,{children:"If you want to build all variants at the same time, you can use:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npx @dappnode/dappnodesdk@latest build --all-variants\n"})}),"\n",(0,t.jsx)(n.p,{children:"These commands will package your services, making them ready for installation on Dappnode machines."}),"\n",(0,t.jsx)(n.h2,{id:"step-4-publish-the-packages",children:"Step 4: Publish the Packages"}),"\n",(0,t.jsx)(n.p,{children:"Once you have built your variants, you can choose to publish them. While publishing is optional if you only want to use the package locally, it is required if you want your package to be available in the public Dappstore for other users to discover and install."}),"\n",(0,t.jsxs)(n.p,{children:["The publish command allows you to specify which variants you want to publish, using the same ",(0,t.jsx)(n.code,{children:"--variants"})," flag as the build command. You can publish one or more variants as follows:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npx @dappnode/dappnodesdk@latest publish --type= --variants= --eth-provider= --content-provider= --developer-address=\n"})}),"\n",(0,t.jsx)(n.p,{children:"If you want to generate all variants publish links at once, you can use the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npx @dappnode/dappnodesdk@latest publish --type=patch --all-variants --eth-provider=https://your-eth-node --content-provider=https://your-ipfs-api --developer-address=0xYourAddress\n"})}),"\n",(0,t.jsx)(n.p,{children:"After running the publish command, you will receive a link to sign the transaction to complete the publishing process."}),"\n",(0,t.jsx)(n.h3,{id:"automating-publication-with-github-actions",children:"Automating Publication with GitHub Actions"}),"\n",(0,t.jsxs)(n.p,{children:["If your package source code is hosted on GitHub, you can automate the publishing process by setting up GitHub Actions. Use the workflows ",(0,t.jsx)(n.a,{href:"/docs/dev/github-actions/overview",children:"here"})," to integrate publishing workflows, ensuring your package builds and publishes automatically."]}),"\n",(0,t.jsx)(n.p,{children:"By following these steps, you'll be able to develop, build, and publish multi-variant packages on Dappnode, making it easier to support multiple configurations from a single codebase."})]})}function p(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},28453:(e,n,a)=>{a.d(n,{R:()=>s,x:()=>r});var i=a(96540);const t={},o=i.createContext(t);function s(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/67625ece.5c4f9f16.js b/assets/js/67625ece.5c4f9f16.js
new file mode 100644
index 000000000..240a204dc
--- /dev/null
+++ b/assets/js/67625ece.5c4f9f16.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4156],{24768:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>r,contentTitle:()=>d,default:()=>l,frontMatter:()=>s,metadata:()=>t,toc:()=>p});const t=JSON.parse('{"id":"dev/sdk/overview","title":"DappnodeSDK","description":"The DappnodeSDK dappnodesdk is a tool that makes creating and publishing new Dappnode packages as simple as possible. It helps to initialize, build, test, and publish the new package/repo to an APM tracked on the Ethereum Mainnet.","source":"@site/docs/dev/sdk/overview.md","sourceDirName":"dev/sdk","slug":"/dev/sdk/overview","permalink":"/docs/dev/sdk/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/sdk/overview.md","tags":[],"version":"current","frontMatter":{"title":"DappnodeSDK","llm_description":"Overview of DappnodeSDK tool for creating, building, and publishing packages."},"sidebar":"devSidebar","previous":{"title":"Introduction","permalink":"/docs/dev"},"next":{"title":"Commands","permalink":"/docs/dev/sdk/commands"}}');var i=o(74848),a=o(28453);const s={title:"DappnodeSDK",llm_description:"Overview of DappnodeSDK tool for creating, building, and publishing packages."},d="DappnodeSDK",r={},p=[{value:"Command-line options",id:"command-line-options",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"dappnodesdk",children:"DappnodeSDK"})}),"\n",(0,i.jsxs)(n.p,{children:["The DappnodeSDK ",(0,i.jsx)(n.code,{children:"dappnodesdk"})," is a tool that makes creating and publishing new Dappnode packages as simple as possible. It helps to initialize, build, test, and publish the new package/repo to an APM tracked on the Ethereum Mainnet."]}),"\n",(0,i.jsxs)(n.p,{children:["We have deployed a public APM (Aragon Package Manager) registry in which anyone can create their own APM repository: ",(0,i.jsx)(n.a,{href:"https://etherscan.io/address/public.dappnode.eth",children:"public.dappnode.eth"})]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Demo GIF",src:o(36733).A+"",width:"1049",height:"638"})}),"\n",(0,i.jsx)(n.h2,{id:"command-line-options",children:"Command-line options"}),"\n",(0,i.jsx)(n.p,{children:"DappnodeSDK is usually executed from the command line. The following are all the available commands."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["You can run ",(0,i.jsx)(n.code,{children:"dappnodesdk help"})," to get more information about each command."]})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'Usage: dappnodesdk [options]\n\nCommands:\n build Build a new version (only generates the ipfs hash)\n from_github [repoSlug] Gets an existing DNP Github release (assets) and uploa\n d it to IPFS\n increase [type] Increases the version defined in the manifest\n init Initialize a new DAppNodePackage (DNP) repository\n next [type] Compute the next release version from local\n publish [type] Publish a new version of the package in an Aragon Pack\n age Manager Repository\n github-action Github actions tooling to be run in CI. Uses a specifi\n c set of options for internal DAppNode use. Caution: o\n ptions may change without notice.\n\nOptions:\n --dir, --directory Change the base directory [string] [default: "./"]\n --compose_file_name Compose file for docker-compose\n [string] [default: "docker-compose.yml"]\n --silent Silence output to terminal [boolean]\n --verbose, --debug Show more output to terminal [boolean]\n -h, --help Show help [boolean]\n -v, --version Show version number [boolean]```\n'})})]})}function l(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},36733:(e,n,o)=>{o.d(n,{A:()=>t});const t=o.p+"assets/images/demo-3ae4e5dc0c026dfb372657f396712b72.gif"},28453:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>d});var t=o(96540);const i={},a=t.createContext(i);function s(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/6875c492.2287b86c.js b/assets/js/6875c492.2287b86c.js
new file mode 100644
index 000000000..de83a05a1
--- /dev/null
+++ b/assets/js/6875c492.2287b86c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4813],{17448:(e,t,n)=>{n.d(t,{A:()=>r});n(96540);var s=n(50539),a=n(11865),i=n(74848);function r(e){const{metadata:t}=e,{previousPage:n,nextPage:r}=t;return(0,i.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,i.jsx)(a.A,{permalink:n,title:(0,i.jsx)(s.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer entries"})}),r&&(0,i.jsx)(a.A,{permalink:r,title:(0,i.jsx)(s.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},18189:(e,t,n)=>{n.d(t,{A:()=>B});n(96540);var s=n(18215),a=n(83750),i=n(74848);function r(e){let{children:t,className:n}=e;return(0,i.jsx)("article",{className:n,children:t})}var l=n(56289);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:n,isBlogPostPage:r}=(0,a.e7)(),{permalink:c,title:d}=n,u=r?"h1":"h2";return(0,i.jsx)(u,{className:(0,s.A)(o.title,t),children:r?d:(0,i.jsx)(l.A,{to:c,children:d})})}var d=n(50539),u=n(81430),g=n(98569);const m={container:"container_mt6G"};function h(e){let{readingTime:t}=e;const n=function(){const{selectMessage:e}=(0,u.W)();return t=>{const n=Math.ceil(t);return e(n,(0,d.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:n}))}}();return(0,i.jsx)(i.Fragment,{children:n(t)})}function p(e){let{date:t,formattedDate:n}=e;return(0,i.jsx)("time",{dateTime:t,children:n})}function x(){return(0,i.jsx)(i.Fragment,{children:" \xb7 "})}function j(e){let{className:t}=e;const{metadata:n}=(0,a.e7)(),{date:r,readingTime:l}=n,o=(0,g.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,i.jsxs)("div",{className:(0,s.A)(m.container,"margin-vert--md",t),children:[(0,i.jsx)(p,{date:r,formattedDate:(c=r,o.format(new Date(c)))}),void 0!==l&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(x,{}),(0,i.jsx)(h,{readingTime:l})]})]});var c}var f=n(95921);const b={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function A(e){let{className:t}=e;const{metadata:{authors:n},assets:r}=(0,a.e7)();if(0===n.length)return null;const l=n.every((e=>{let{name:t}=e;return!t})),o=1===n.length;return(0,i.jsx)("div",{className:(0,s.A)("margin-top--md margin-bottom--sm",l?b.imageOnlyAuthorRow:"row",t),children:n.map(((e,t)=>(0,i.jsx)("div",{className:(0,s.A)(!l&&(o?"col col--12":"col col--6"),l?b.imageOnlyAuthorCol:b.authorCol),children:(0,i.jsx)(f.A,{author:{...e,imageURL:r.authorsImageUrls[t]??e.imageURL}})},t)))})}function T(){return(0,i.jsxs)("header",{children:[(0,i.jsx)(c,{}),(0,i.jsx)(j,{}),(0,i.jsx)(A,{})]})}var v=n(30099),N=n(900);function w(e){let{children:t,className:n}=e;const{isBlogPostPage:r}=(0,a.e7)();return(0,i.jsx)("div",{id:r?v.LU:void 0,className:(0,s.A)("markdown",n),children:(0,i.jsx)(N.A,{children:t})})}var y=n(204),P=n(5783),_=n(56239);function k(){return(0,i.jsx)("b",{children:(0,i.jsx)(d.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function U(e){const{blogPostTitle:t,...n}=e;return(0,i.jsx)(l.A,{"aria-label":(0,d.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...n,children:(0,i.jsx)(k,{})})}function R(){const{metadata:e,isBlogPostPage:t}=(0,a.e7)(),{tags:n,title:r,editUrl:l,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,u=!t&&o,g=n.length>0;if(!(g||u||l))return null;if(t){const e=!!(l||d||c);return(0,i.jsxs)("footer",{className:"docusaurus-mt-lg",children:[g&&(0,i.jsx)("div",{className:(0,s.A)("row","margin-top--sm",y.G.blog.blogFooterEditMetaRow),children:(0,i.jsx)("div",{className:"col",children:(0,i.jsx)(_.A,{tags:n})})}),e&&(0,i.jsx)(P.A,{className:(0,s.A)("margin-top--sm",y.G.blog.blogFooterEditMetaRow),editUrl:l,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,i.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[g&&(0,i.jsx)("div",{className:(0,s.A)("col",{"col--9":u}),children:(0,i.jsx)(_.A,{tags:n})}),u&&(0,i.jsx)("div",{className:(0,s.A)("col text--right",{"col--3":g}),children:(0,i.jsx)(U,{blogPostTitle:r,to:e.permalink})})]})}function B(e){let{children:t,className:n}=e;const l=function(){const{isBlogPostPage:e}=(0,a.e7)();return e?void 0:"margin-bottom--xl"}();return(0,i.jsxs)(r,{className:(0,s.A)(l,n),children:[(0,i.jsx)(T,{}),(0,i.jsx)(w,{children:t}),(0,i.jsx)(R,{})]})}},14005:(e,t,n)=>{n.d(t,{A:()=>r});n(96540);var s=n(83750),a=n(18189),i=n(74848);function r(e){let{items:t,component:n=a.A}=e;return(0,i.jsx)(i.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,i.jsx)(s.in,{content:t,children:(0,i.jsx)(n,{children:(0,i.jsx)(t,{})})},t.metadata.permalink)}))})}},26956:(e,t,n)=>{n.r(t),n.d(t,{default:()=>f});n(96540);var s=n(18215),a=n(50539),i=n(81082),r=n(204),l=n(11926),o=n(56289),c=n(60569),d=n(17448),u=n(37220),g=n(14005),m=n(40665),h=n(9303),p=n(74848);function x(e){let{tag:t}=e;const n=(0,l.ZD)(t);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(i.be,{title:n,description:t.description}),(0,p.jsx)(u.A,{tag:"blog_tags_posts"})]})}function j(e){let{tag:t,items:n,sidebar:s,listMetadata:i}=e;const r=(0,l.ZD)(t);return(0,p.jsxs)(c.A,{sidebar:s,children:[t.unlisted&&(0,p.jsx)(m.A,{}),(0,p.jsxs)("header",{className:"margin-bottom--xl",children:[(0,p.jsx)(h.A,{as:"h1",children:r}),t.description&&(0,p.jsx)("p",{children:t.description}),(0,p.jsx)(o.A,{href:t.allTagsPath,children:(0,p.jsx)(a.A,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,p.jsx)(g.A,{items:n}),(0,p.jsx)(d.A,{metadata:i})]})}function f(e){return(0,p.jsxs)(i.e3,{className:(0,s.A)(r.G.wrapper.blogPages,r.G.page.blogTagPostListPage),children:[(0,p.jsx)(x,{...e}),(0,p.jsx)(j,{...e})]})}},40665:(e,t,n)=>{n.d(t,{A:()=>c});n(96540);var s=n(18215),a=n(27289),i=n(204),r=n(52362),l=n(74848);function o(e){let{className:t}=e;return(0,l.jsx)(r.A,{type:"caution",title:(0,l.jsx)(a.Rc,{}),className:(0,s.A)(t,i.G.common.unlistedBanner),children:(0,l.jsx)(a.Uh,{})})}function c(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(a.AE,{}),(0,l.jsx)(o,{...e})]})}},11926:(e,t,n)=>{n.d(t,{ZD:()=>r,uz:()=>l});n(96540);var s=n(50539),a=n(81430);n(74848);function i(){const{selectMessage:e}=(0,a.W)();return t=>e(t,(0,s.T)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}function r(e){const t=i();return(0,s.T)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}const l=()=>(0,s.T)({id:"theme.blog.authorsList.pageTitle",message:"Authors",description:"The title of the authors page"})},27289:(e,t,n)=>{n.d(t,{AE:()=>o,Rc:()=>r,TT:()=>d,Uh:()=>l,Yh:()=>c});n(96540);var s=n(50539),a=n(27143),i=n(74848);function r(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function o(){return(0,i.jsx)(a.A,{children:(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]);
\ No newline at end of file
diff --git a/assets/js/6e504cb9.181fa3cf.js b/assets/js/6e504cb9.181fa3cf.js
new file mode 100644
index 000000000..e26764bef
--- /dev/null
+++ b/assets/js/6e504cb9.181fa3cf.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[3099],{33428:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>p,contentTitle:()=>d,default:()=>u,frontMatter:()=>t,metadata:()=>s,toc:()=>a});const s=JSON.parse('{"id":"user/dappnode-cloud/providers/coming-soon","title":"More coming soon","description":"We are aiming to deploy Dappnode Images in more cloud providers in a nearly future.","source":"@site/docs/user/dappnode-cloud/providers/coming-soon.md","sourceDirName":"user/dappnode-cloud/providers","slug":"/user/dappnode-cloud/providers/coming-soon","permalink":"/docs/user/dappnode-cloud/providers/coming-soon","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/dappnode-cloud/providers/coming-soon.md","tags":[],"version":"current","frontMatter":{"title":"More coming soon","llm_description":"More cloud providers coming soon; request new providers via GitHub issues."},"sidebar":"userSidebar","previous":{"title":"FAQs & Troubleshooting","permalink":"/docs/user/dappnode-cloud/providers/aws/faqs"},"next":{"title":"Initial setup","permalink":"/docs/user/videos-and-tutorials/driving-school/initial-setup"}}');var r=n(74848),i=n(28453);const t={title:"More coming soon",llm_description:"More cloud providers coming soon; request new providers via GitHub issues."},d="More coming soon",p={},a=[];function c(e){const o={a:"a",h1:"h1",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.header,{children:(0,r.jsx)(o.h1,{id:"more-coming-soon",children:"More coming soon"})}),"\n",(0,r.jsx)(o.p,{children:"We are aiming to deploy Dappnode Images in more cloud providers in a nearly future."}),"\n",(0,r.jsxs)(o.p,{children:["If you are willing to run Dappnode in a specific provider you can open an Issue in ",(0,r.jsx)(o.a,{href:"https://github.com/dappnode/DNP_DAPPMANAGER/issues/new?assignees=&labels=&projects=&template=feature_request.md",children:"Dappnode's GitHub"})," and tell us more about it!"]})]})}function u(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},28453:(e,o,n)=>{n.d(o,{R:()=>t,x:()=>d});var s=n(96540);const r={},i=s.createContext(r);function t(e){const o=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function d(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),s.createElement(i.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/6e93d9f5.5b298421.js b/assets/js/6e93d9f5.5b298421.js
new file mode 100644
index 000000000..b865c3118
--- /dev/null
+++ b/assets/js/6e93d9f5.5b298421.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[186],{96034:(o,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>e,toc:()=>l});const e=JSON.parse('{"id":"smooth/unsubscribe-from-smooth","title":"Unsubscribing from Smooth.","description":"Unsubscribing from Smooth is as simple as subscribing to it. You can unsubscribe from Smooth at any time, it is done through Smooth\'s website and it only takes one simple transaction.","source":"@site/docs/smooth/unsubscribe-from-smooth.md","sourceDirName":"smooth","slug":"/smooth/unsubscribe-from-smooth","permalink":"/docs/smooth/unsubscribe-from-smooth","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/smooth/unsubscribe-from-smooth.md","tags":[],"version":"current","frontMatter":{"title":"Unsubscribing from Smooth.","llm_description":"How to unsubscribe via website; warns that pending rewards are lost on exit."},"sidebar":"smoothSidebar","previous":{"title":"Manual subscription","permalink":"/docs/smooth/subscribe-to-smooth/manual"},"next":{"title":"FAQ / Glossary","permalink":"/docs/smooth/faq-glossary"}}');var n=s(74848),i=s(28453);const r={title:"Unsubscribing from Smooth.",llm_description:"How to unsubscribe via website; warns that pending rewards are lost on exit."},a="Unsubscribing from Smooth.",c={},l=[{value:"Step 1: Log in to Smooth's website.",id:"step-1-log-in-to-smooths-website",level:2},{value:"Step 2: Click on the "Unsubscribe" button of the validator you want to unsubscribe.",id:"step-2-click-on-the-unsubscribe-button-of-the-validator-you-want-to-unsubscribe",level:2},{value:"Step 3: Follow the dialog instructions.",id:"step-3-follow-the-dialog-instructions",level:2}];function h(o){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",strong:"strong",...(0,i.R)(),...o.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"unsubscribing-from-smooth",children:"Unsubscribing from Smooth."})}),"\n",(0,n.jsxs)(t.p,{children:["Unsubscribing from ",(0,n.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," is as simple as subscribing to it. You can unsubscribe from ",(0,n.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," at any time, it is done through ",(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth's website"})})," and it only takes one simple transaction."]}),"\n",(0,n.jsx)(t.admonition,{type:"caution",children:(0,n.jsxs)(t.p,{children:["When unsubscribing a validator from ",(0,n.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),", you will lose all pending rewards attached to it. We recommend unsubscribing just after successfully proposing a block, so lost pending rewards are minimized."]})}),"\n",(0,n.jsx)(t.h2,{id:"step-1-log-in-to-smooths-website",children:"Step 1: Log in to Smooth's website."}),"\n",(0,n.jsxs)(t.p,{children:["Go to ",(0,n.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth's website"})," and log in with your wallet. A list of all the validators with the same withdrawal address as your logged in wallet will appear."]}),"\n",(0,n.jsx)(t.h2,{id:"step-2-click-on-the-unsubscribe-button-of-the-validator-you-want-to-unsubscribe",children:'Step 2: Click on the "Unsubscribe" button of the validator you want to unsubscribe.'}),"\n",(0,n.jsxs)(t.p,{children:['Once logged in, click on the "Unsubscribe" button of the validator you want to unsubscribe from ',(0,n.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),"."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"my-unsub-table",src:s(70724).A+"",width:"1021",height:"258"})}),"\n",(0,n.jsx)(t.h2,{id:"step-3-follow-the-dialog-instructions",children:"Step 3: Follow the dialog instructions."}),"\n",(0,n.jsx)("p",{align:"center",children:(0,n.jsx)("img",{src:"/img/smooth-unsub-initial-dialog.png",alt:"unsub-initial-dialog",width:"400"})}),"\n",(0,n.jsxs)(t.p,{children:['Once clicking on the "Unsubscribe" button, a dialog will appear warning you that you are about to unsubscribe from ',(0,n.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),", and that it is recommended to do it when pending rewards are low. Click on ",(0,n.jsx)("em",{children:'"Claim my rewards"'})," to continue and follow the dialog instructions. If you have any claimable rewards, a transaction that claims them will be prepared. If no claimable rewards are available, you will jump directly into the unsubscribe transaction."]}),"\n",(0,n.jsx)("p",{align:"center",children:(0,n.jsx)("img",{src:"/img/smooth-unsubscribe-done.png",alt:"unsub-done",width:"400"})}),"\n",(0,n.jsxs)(t.p,{children:["Once the subscription transaction is processed by the chain, your validator will have been unsubscribed successfully from ",(0,n.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),". You can check it by reloading your validator's table."]}),"\n",(0,n.jsx)(t.admonition,{type:"caution",children:(0,n.jsxs)(t.p,{children:["After unsubscribing, we recommend to change your validator's fee recipient back to another address as soon as possible, in order to avoid automatically subscribing to ",(0,n.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," again."]})})]})}function d(o={}){const{wrapper:t}={...(0,i.R)(),...o.components};return t?(0,n.jsx)(t,{...o,children:(0,n.jsx)(h,{...o})}):h(o)}},70724:(o,t,s)=>{s.d(t,{A:()=>e});const e=s.p+"assets/images/smooth-unsub-table-bebccc787b3582ee85af18702df67c05.png"},28453:(o,t,s)=>{s.d(t,{R:()=>r,x:()=>a});var e=s(96540);const n={},i=e.createContext(n);function r(o){const t=e.useContext(i);return e.useMemo((function(){return"function"==typeof o?o(t):{...t,...o}}),[t,o])}function a(o){let t;return t=o.disableParentContext?"function"==typeof o.components?o.components(n):o.components||n:r(o.components),e.createElement(i.Provider,{value:t},o.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/722b075e.726370f5.js b/assets/js/722b075e.726370f5.js
new file mode 100644
index 000000000..b60e9d127
--- /dev/null
+++ b/assets/js/722b075e.726370f5.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[3189],{41473:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"user/staking/ethereum/lsd-pools/lido/performance","title":"Validator performance monitoring","description":"The Performance tab allows you to monitor the performance of your Lido validators associated with your Node Operator.","source":"@site/docs/user/staking/ethereum/lsd-pools/lido/performance.md","sourceDirName":"user/staking/ethereum/lsd-pools/lido","slug":"/user/staking/ethereum/lsd-pools/lido/performance","permalink":"/docs/user/staking/ethereum/lsd-pools/lido/performance","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/ethereum/lsd-pools/lido/performance.md","tags":[],"version":"current","frontMatter":{"title":"Validator performance monitoring","llm_description":"Monitor Lido validator performance with attestation rates and efficiency comparisons."},"sidebar":"userSidebar","previous":{"title":"I am already a Node Operator","permalink":"/docs/user/staking/ethereum/lsd-pools/lido/already-node-operator"},"next":{"title":"Notifications & Warnings","permalink":"/docs/user/staking/ethereum/lsd-pools/lido/notifications"}}');var i=r(74848),s=r(28453);const a={title:"Validator performance monitoring",llm_description:"Monitor Lido validator performance with attestation rates and efficiency comparisons."},o="Validator performance monitoring",d={},c=[{value:"Understanding Lido CSM Reports",id:"understanding-lido-csm-reports",level:2},{value:"Lido Report Cards",id:"lido-report-cards",level:2},{value:"Range Selector",id:"range-selector",level:2},{value:"Available Ranges:",id:"available-ranges",level:3},{value:"Node Operator Efficiency vs. Lido Average Efficiency",id:"node-operator-efficiency-vs-lido-average-efficiency",level:2},{value:"Summary Table",id:"summary-table",level:2},{value:"Efficiency Calculation:",id:"efficiency-calculation",level:3}];function l(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"validator-performance-monitoring",children:"Validator performance monitoring"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"Performance"})," tab allows you to monitor the performance of your Lido validators associated with your Node Operator."]}),"\n",(0,i.jsx)(n.h2,{id:"understanding-lido-csm-reports",children:"Understanding Lido CSM Reports"}),"\n",(0,i.jsxs)(n.p,{children:["Before diving into the details, it's essential to understand what a ",(0,i.jsx)(n.strong,{children:"Lido CSM report"})," is. These reports contain performance data for all validators in the CSM and are distributed via IPFS hashes by the Lido team."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["On ",(0,i.jsx)(n.strong,{children:"Mainnet"}),", reports are distributed every ",(0,i.jsx)(n.strong,{children:"28 days"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["On ",(0,i.jsx)(n.strong,{children:"Hoodi"}),", reports are distributed every ",(0,i.jsx)(n.strong,{children:"7 days"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"lido-report-cards",children:"Lido Report Cards"}),"\n",(0,i.jsxs)(n.p,{children:["At the top of the ",(0,i.jsx)(n.strong,{children:"Performance"})," tab, you'll find two key information cards:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Performance cards",src:r(9326).A+"",width:"621",height:"126"})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Next Lido Report"}),": Displays the time remaining until the next report is distributed by the Lido CSM team."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Pending Data"}),": As mentioned earlier, reports are distributed by the Lido team via IPFS. The Lido CSM package backend scans for these IPFS hashes and attempts to resolve their content to process the report data."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["This card shows the ",(0,i.jsx)(n.strong,{children:"number of reports left to be processed"})," by the backend. If ",(0,i.jsx)(n.code,{children:"reports > 0"}),", the data in the table and chart below is not fully updated, and some reports are missing."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["The backend processes pending hashes ",(0,i.jsx)(n.strong,{children:"every 3 hours"}),". If ",(0,i.jsx)(n.code,{children:"reports > 0"})," for an extended period, the IPFS gateway may not be able to find the remaining hashes."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["To resolve this issue, navigate to the ",(0,i.jsx)(n.strong,{children:"Config"})," tab of the Lido CSM package and change the ",(0,i.jsx)(n.code,{children:"IPFS_URL"})," to another gateway that may successfully locate the hashes."]})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"range-selector",children:"Range Selector"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Range Selector",src:r(54308).A+"",width:"180",height:"69"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"Range Selector"})," controls all the data displayed in the Performance tab. It acts as a filter for the chart and table below."]}),"\n",(0,i.jsx)(n.h3,{id:"available-ranges",children:"Available Ranges:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Last month"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Last year"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Ever"})," (From the first report that included a validator associated with your Node Operator)"]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["On ",(0,i.jsx)(n.strong,{children:"Hoodi"}),", an additional ",(0,i.jsx)(n.strong,{children:"week"})," range is available since reports are distributed weekly."]})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"node-operator-efficiency-vs-lido-average-efficiency",children:"Node Operator Efficiency vs. Lido Average Efficiency"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Performance Chart",src:r(26891).A+"",width:"947",height:"561"})}),"\n",(0,i.jsxs)(n.p,{children:["This chart compares the efficiency of your validators with the ",(0,i.jsx)(n.strong,{children:"Lido threshold"})," for the selected range."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Includes a ",(0,i.jsx)(n.strong,{children:"slider"})," to adjust the number of frames displayed."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"A frame represents the period between Lido CSM reports"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Allows toggling validator visibility by clicking on the validator index in the legend next to the chart."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"summary-table",children:"Summary Table"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Performance Tbale",src:r(9783).A+"",width:"645",height:"248"})}),"\n",(0,i.jsxs)(n.p,{children:["This table provides an overview of the ",(0,i.jsx)(n.strong,{children:"attestations"})," assigned and included for each validator within the selected range."]}),"\n",(0,i.jsx)(n.h3,{id:"efficiency-calculation",children:"Efficiency Calculation:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"efficiency column"})," is based on your validator's ",(0,i.jsx)(n.strong,{children:"attestation rate"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If ",(0,i.jsx)(n.code,{children:"attestation rate for selected range > Lido average threshold for selected range"}),", the efficiency is displayed in ",(0,i.jsx)(n.strong,{children:"green"}),". Otherwise, it appears in ",(0,i.jsx)(n.strong,{children:"red"}),"."]}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"Even if efficiency is red, you may still receive rewards for the current report, and vice versa, since this data is based on past reports and can fluctuate significantly between frames."})}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},9326:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/lido-csm-performance-cards-16985805400e2365c98ae035610c5d4e.png"},26891:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/lido-csm-performance-chart-c5505bbb599d3d33274728865dce9620.png"},54308:(e,n,r)=>{r.d(n,{A:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAABFCAYAAADjA8yOAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAAAtdEVYdENyZWF0aW9uIFRpbWUAV2VkIDA1IEZlYiAyMDI1IDAyOjAzOjAyIFBNIENFVJGRYiEAAA5gSURBVHic7Z19dBTlvcc/szubYEIlUj0tKi9VahGaUisGgYp6e+CCUjUKilRvb4/0BU1VKhYOikekV+RcX7CU4rGFVupbqUCVW25frFApORITioCt1UIIJQEhQqJmafZt+sfszM7M7rzubHYT5ntOzjff+T0z88yzv/k+v5nZTIRB539eQgIEMGWQf5GkHFrT0KiNbBcvGis4VXSJsl0+5cw/vRZByCw0Y3UdwUQLubWR7eJFY04xXaJsl0+m+ZfRIZDkTM9iHGrkZV60ke3inplAu9IF4nzzxZh3Sj5q4jYOLTjTrs+wnnZwAu1KF9uBbbSR1e4LhOTf/HK4AAEKCft8TCe0Dw5nDBmRt1k4nC1c61ONcRl3qRUUZPKwb6R3aM81rPKrxRmUdzknFUifaozLuEutwNPnbZFPlvmVYb1De65hcagLCNsZIrveKg1tXg8WVRvRIx9l3tO4ktB9AHblfJaDlIo2zo7F7o8JesnlUiahfatheyMLp5i2O/5SZiy1MOj86l5y7gUIYA97h1a1Sc3VK7hYjmhkv+OF0iXMNtccgUP7BgHrQrPQ8QAAIoKA+iUQUyY9niZagbLcqe5zsDu4Qsd7OWzzx5hv2Vr0fv/SoLWdcKMDBNDCNn+s7844dOg8HVzVHll7cD2pjchzhikTRSrKIpSHRcLhUF/3W1tIQDKZojuRIBqPE4vHXeZTdj66cOg8HVxKZ6i63Kk2ZHhPayPbxU24qqKCyvIyAmQgAGI4hBguo7K8jK7ubjqiJ+WgbT4ZtcyiZQ3sO4wbd6p7N5/Zvz/lokgAa1SWlyOGw7R/3OV5G2J2TZJnr0xhvEo3032LqyoqgmR2gXJRpOq0fhmndglrh3ZbY9ri1HBkhcvESFBmeEBleTnReIJYIuFuRQlCSMj1h5Re4kZrGSuNucZK926uiEQI4A0VZRHr/MrFSIiymfjkTA6f5mRpwUz3JhZAkHTLg1LDO8rDokU+mbOmhi5mTavAQgukz1StztFdv7WRTeNSVvtwuO98mbGnEQ6HNJ+3c9bX0EWrae32r0ijdre6Z23XXbMJiwBeIU967vMpZF3jniKMy7hTHSA/ePg85cdV2hpWp/1kwaPuAcZl3KkOkB885Jm9Q9tpxyx51L2YA+SHgji0nXbMJeTIPer8ATzDk0OD+xrTk5aydc7GfY0DeIaHfEu/OUnCkvGmH3/kQUaOuEDdXywWY+/f3mXl02tobTuSWQ8YNmQwTz25jHUbN7Fm7QvqOuFwiN+89CzLnljJlte36/pf+9WpDBsymCdWPg3AJ/pXMuvG6xk/dgwDzziDzg8/ZNeet3n2xfUcef8oAP/9tRuZOf26rLF759193D1/kenYFgORmtmsqBtLhTGQeoe1332MVz8qRq96EOpM5zz/RNU5hcLwfYuXsmv3XhCgot9pzJxRy/88sIDb7phLMiGhPIy44rJxNO3azeVfHsfPfvECkvbpJPCd227lrd17Od7RYThqCZDoX1nJ8mVL+Mf+Zh565HGOvH+UqqoBTLpyIsuXLabunoW0tx8H4MWXfs0vXvyVfiuafYVCISRJkvtQZMSbN7PgB//HMe3CZJx4qlg9gtraa9i48ZW829jCQ77JJUcBa9pUSiKZSpFMSnzU1cVPn3mecDjM8PPO05yBAldcNp7Va58nFosx4nMX6LcD/PYPW7i77ltqe31nBb520w00H/wnSx9bwb7mFrqiJ2ltO8LPn1vHD1etpn9lf7T3sZNJSfeTSknqtjY8t4bqUSMN+/Ly4wdicgLHNT8p4KzJLFhxJ5cP0DSNVDP78Ye4eThAhKETZ7Fg2WOsWbOKNSse4p5bx3J2+ml8pGY2K+bVMvX2B1jx9CqW3DDEcY9aW9uYO7fONF5X921aW9u8HKweHvJN8yjLrMb1lyUpRSwWJ6Q+RZMYccH5xBMJ9je3sHVbPVdeNj5rvefWbeDMTw5k8lcuR3HlTFxi4oRL2fDyb3LG6ne8yYGD/8RwgCZ9lLhn4YO8t2+/D8dcQBzbSWPbUMZcdLq6KHLhlxjZvYfG/VBR83XumjGElvWPUjd7DnUP/5qWoTcy79ZqtYSJfH4yl8d+x9I757Bo/UHHu25oaGT79jeYP39uVqyu7ts0NDTR0NCY7xGm4W7MRZ2TqDWJn8i4VSgUYtrUSZx2Wj/+se+AuvyKyyawdVs9ILB1Wz2PPfwgT61eSyqVUtskU0n+98lVLFt8H7t2v83R9nZ1+5FIGZ8ceAYtBw9l+i9A7bSruOmGawFIJBPccpvsKtdNm8qUSf+h9rCrK8ptdd9D/vI+7Gtu0Z/9kkf2AZGh03jgR5M1Sz7g1eVLeenddt5sbOPaMRczYOsWOokwsmYEXTtX8V7qTKZ+pZqO3z/CCw2H5dUO7+SltUMZveDLjH5xD40A0d28/PwO2v7lvl9Kwi5aNJ8lS5YBhUhm94Mo6txEqUV8xMJ77yKZlL8GWDVAnh/vvPc+4vEYICf5xAmXcu/9DwESrW2HOdb+ARd9YRRNu3aj9k+C5gMtbNi0mbl132Lhg0s1nZbbpKSkpr3Axk2b2bhpM9WjLuT7d9epsf//wx9Zt2FT5rB19Xr6IsP4FzOeOH/ED73GqhVbOKbWzDG6OuIAdDbs5MA11VwyYAuvRkdwyciTvLX8IESqOefsCoYNnccK7bmASGW/w5yVLlPix494SmYFSuIuWbKI998/6nMyg5eZruAO/cNVP2XvX98BYFzNGK6dNoX3NO5cPepCBp5RxeqVj+vWm3fX7dz8jTmG/gis27CJ8WMv4atTJ6nL4vEE7cePM+Tcc/n7e/uUxWpSDRsymIOtreq2urtjnOjs1I+Xpn0kUkYimUBKaYKauGPtB5JROo61axJag84mGlumMW7M6fzp+JcYGd3Dk4eAMJBqZ+uPHmDt3njOzUYGA8kYuaPOoU1gf5MZvAxiKONw+joy+8cYwwHDxx93caKjgxMdnfz21dcQw2EmXDpGbadcDE6pncWU2puZUjuLW2bfQSQSIRIxfv1SIpVK8eiTP+aWmdMZ9OlPqZFt23dw/TVXaZsCEoIgcPWUSfy5foeuX1b3NH+19mlGfu4C07gnXRB8yK7GFs4Zcynja0bQ9ZcmWlJA/DCtx6r47PAz9c3PHcv0q6sZkHNb3tHQ0FiAZAYv1y4htcZV3qBjqsmtLZmsOx6/3PgKN15/LQgghkUmjKvhT39+Q9eu/YMTNLccpObii3Ju5+ChNtZtfIVpUyap8Wd/uZ7h532GeXfNYdiQwZT3K+ecswcx/3t3EI1G+d0ft+r6FRZDhMMhldWLVAHuWbiY/S0tmv3asGARzxtlEI6kT/D0j+ZSvrNpJweG/ifTR5/krR3KhV079b9vonLy1/mvCeczoKKCsy68kjl3zGL8WeTtyj0Hd3c4QNDU0K4dSKkVrTSqUyrx17Zs49abbuDi0V9AFMMcOtTG0WPHMNauW1+v58qJ43njzaac29nw8mbG14xRl3d1Rbl7/v3cMnMGi++/l4FVVRw/cYLXt+9g+cqfkEqm1P7NnH5d1sMV+cHK/SAJ7Gs+kDnonMeRQ+dsnz8in7mKR1ZfpV+ofbDy0U7q/z6DUQObqNfcKetseIZHIzO4edrtPPHN0+Gjw7y9/RmWrt9DFOgdf0uT69pECeXWwqDho/0Z+vT2XWsj28V7EZ8zIHNLLYB7tHZ8mBHG/DCBw/+xYl8rZ+4SZIcsdY5N+dKlUuEA/sCYX2h1hsW87rOqjIl2yNr+edYC8ht0NNrTFOEnB8gblvmVnY+isTb1fL81Z43pgslXS7m17YqBRZc0dMNpl29S+vvQHq4m9YyJ9okF0P1FuCstmGsj28XdcoD8YZlf2Voseo3p2OhMHNhWS9bayHZxM1a+9aVZHhQe3pE10Tpk0bJG1aEYNajbWtWt9hmGTSdTKcRQ8CoDL0imUhkXtvz8Fcha1C3D0MYyUGzL9qsILxy6EwnEsuBVYF7QnUhkzXi5GZ0W/TNIgay7DOob1qXcuuQd3K3D6+PReILKIKE9IRpPv9cuK3+UFkYtNwv5YpAS6N5Lp9OSudYyBdJI6X0XQmuZrHgsnqArFiOAO3TFYsSUhM7KH0y0LEV/HFOBnYPZwLiqX7rHWMha3nGyGzEUCt5z5xDdiQQdJ7sNM7kC+3wUPV/VO65hfYLZNWm+2voaQ8OaKc6lbv84SlVFv6D8sEFXLEZH1PgFbbP8ys2l5dB26CkHN40bHdi57jjZTTSeoCIiUi6KhEPB/1iRkO9myP9jJUEskcT6/r29Y2cc2ngf1UybMiaaLMfS6xJgpaOmWhk/p/HcOqZ8aHQ7au99/zbHY3f8Pcpm+WHGZvkmszDos180y0ANqyNm0AEClBIkQt7vEqBZbqV7gDFq/NFG2IQLdfngef9Z2qfxKSqb5Zucn/r3QzutMV3XkAVmjBp/tBF2k1OhJy+3+8/SPo1P0dnYH1ROO7Qm0426FB05i7HWmGkCrdMOx7MkHVrW6Ro6QIC+gfTbR93WqA5r1gAB/ISDGj/9bju3NarDmtVX2BaIJtohOz7WPqI9Mw51AeCgxnfm0PnWtJhpXGgpWzta2SE7no36iPbMmOsSqOGdOXS+V6GYafLTvmwsYD3jUOdAvp+nD3fN+tC3z73aQ8B6xqEuTfiY0EWqYXOy4JPua+zD+JRsDS9D/51GybSdAxSphvV6b9qx7muc53iUbA0vQ+/QrpLZaYHkE1ue8UYHOVUd2AcHtxvPgjuwnw7tCj1co9o6ALm1YwcWZOG7NrLfca/ahO3Gs+AOnJ9Dp98PLclnmCRhq3Oy0syoS4S1Y2CpBX+10V38juetya3txq9obJZvGda8fdShI7quWUuEyVcbHM42LqBv7Hfcbf9carvxKxqb5ZvM/waL8iNAJNDl+AAAAABJRU5ErkJggg=="},9783:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/lido-csm-performance-table-0cf1f40d756b1cf274d4ea6a29f5fe3e.png"},28453:(e,n,r)=>{r.d(n,{R:()=>a,x:()=>o});var t=r(96540);const i={},s=t.createContext(i);function a(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/73664a40.c530e5fe.js b/assets/js/73664a40.c530e5fe.js
new file mode 100644
index 000000000..3df4246e8
--- /dev/null
+++ b/assets/js/73664a40.c530e5fe.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1972],{68371:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>l,contentTitle:()=>r,default:()=>a,frontMatter:()=>u,metadata:()=>t,toc:()=>m});var t=i(25802),o=i(74848),n=i(28453);const u={slug:"long-blog-post",title:"Long Blog Post",authors:"endi",tags:["hello","docusaurus"]},r=void 0,l={authorsImageUrls:[void 0]},m=[];function c(e){const s={code:"code",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.p,{children:"This is the summary of a very long blog post,"}),"\n",(0,o.jsxs)(s.p,{children:["Use a ",(0,o.jsx)(s.code,{children:"\x3c!--"})," ",(0,o.jsx)(s.code,{children:"truncate"})," ",(0,o.jsx)(s.code,{children:"--\x3e"})," comment to limit blog post size in the list view."]}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"})]})}function a(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},28453:(e,s,i)=>{i.d(s,{R:()=>u,x:()=>r});var t=i(96540);const o={},n=t.createContext(o);function u(e){const s=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:u(e.components),t.createElement(n.Provider,{value:s},e.children)}},25802:e=>{e.exports=JSON.parse('{"permalink":"/blog/long-blog-post","source":"@site/blog/2019-05-29-long-blog-post.md","title":"Long Blog Post","description":"This is the summary of a very long blog post,","date":"2019-05-29T00:00:00.000Z","tags":[{"inline":true,"label":"hello","permalink":"/blog/tags/hello"},{"inline":true,"label":"docusaurus","permalink":"/blog/tags/docusaurus"}],"readingTime":2.05,"hasTruncateMarker":true,"authors":[{"name":"Endilie Yacop Sucipto","title":"Maintainer of Docusaurus","url":"https://github.com/endiliey","imageURL":"https://github.com/endiliey.png","key":"endi","page":null}],"frontMatter":{"slug":"long-blog-post","title":"Long Blog Post","authors":"endi","tags":["hello","docusaurus"]},"unlisted":false,"prevItem":{"title":"MDX Blog Post","permalink":"/blog/mdx-blog-post"},"nextItem":{"title":"First Blog Post","permalink":"/blog/first-blog-post"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/7381b33d.2ea2d2ff.js b/assets/js/7381b33d.2ea2d2ff.js
new file mode 100644
index 000000000..532c2310d
--- /dev/null
+++ b/assets/js/7381b33d.2ea2d2ff.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4255],{51212:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"user/dappnode-premium/premium-services","title":"Premium services","description":"Advanced push notifications","source":"@site/docs/user/dappnode-premium/premium-services.md","sourceDirName":"user/dappnode-premium","slug":"/user/dappnode-premium/premium-services","permalink":"/docs/user/dappnode-premium/premium-services","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/dappnode-premium/premium-services.md","tags":[],"version":"current","frontMatter":{"title":"Premium services","llm_description":"Premium features: push notifications, validator alerts, backup node (168h/month), and support calls."},"sidebar":"userSidebar","previous":{"title":"Overview","permalink":"/docs/user/dappnode-premium/premium-overview"},"next":{"title":"Overview","permalink":"/docs/user/ethical-metrics/overview"}}');var o=n(74848),t=n(28453);const a={title:"Premium services",llm_description:"Premium features: push notifications, validator alerts, backup node (168h/month), and support calls."},r=void 0,d={},l=[{value:"Advanced push notifications",id:"advanced-push-notifications",level:2},{value:"Validator notifications",id:"validator-notifications",level:3},{value:"Backup node for validators",id:"backup-node-for-validators",level:2},{value:"Use cases for the Backup node",id:"use-cases-for-the-backup-node",level:3},{value:"Backup node characteristics",id:"backup-node-characteristics",level:3},{value:"Validators limit per network",id:"validators-limit-per-network",level:3},{value:"Personalized support",id:"personalized-support",level:2},{value:"Subscribe to Dappnode Premium",id:"subscribe-to-dappnode-premium",level:2}];function c(e){const i={a:"a",admonition:"admonition",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.h2,{id:"advanced-push-notifications",children:"Advanced push notifications"}),"\n",(0,o.jsxs)(i.p,{children:["All Dappnode users have ",(0,o.jsx)(i.strong,{children:"complete access to the whole set of notifications"})," in the Dappmanager or in the app for free. The advantage of being a Premium user is to ",(0,o.jsx)(i.strong,{children:"receive push notifications in mobile and desktop"}),"."]}),"\n",(0,o.jsx)(i.p,{children:"Dappnode users can activate their preferred notifications and manage the subscribed devices in the Dappmanager's Notification section."}),"\n",(0,o.jsx)(i.h3,{id:"validator-notifications",children:"Validator notifications"}),"\n",(0,o.jsxs)(i.p,{children:["In addition to the current ",(0,o.jsx)(i.a,{href:"https://docs.dappnode.io/docs/user/notifications/notifications-list",children:"list of notifications"})," (System, DMS, Execution and Consensus clients and Direct notifications), the following free ",(0,o.jsx)(i.strong,{children:"validator notifications"})," have been added recently:"]}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.strong,{children:"Validator offline"}),". Sent you if any of your validator(s) missed an attestation."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.strong,{children:"Validator back online"}),". Sent if all your validator(s) are attesting again."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.strong,{children:"Validator slashed"}),". Sent if your validator(s) was slashed."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.strong,{children:"Missed block proposal"})," Sent if you missed a proposal."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.strong,{children:"Submitted block proposal"})," Sent if you proposed a block."]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"All validator notifications are sent approximately 6 minutes after the event happens, based on the latest justified epoch data."}),"\n",(0,o.jsxs)(i.admonition,{type:"info",children:[(0,o.jsx)(i.p,{children:"All the data needed to send these notifications is fetched directly from your local consensus client. No third party services are used. Because of this, these notifications are only available if your consensus client is fully synced and running properly."}),(0,o.jsx)(i.p,{children:"Best effort is made to gather the data, but in some cases (e.g. if your consensus client has recently restarted) some notifications may be missed."})]}),"\n",(0,o.jsx)(i.p,{children:"More notifications will be added to the current set gradually to provide a more complete monitoring experience."}),"\n",(0,o.jsx)(i.h2,{id:"backup-node-for-validators",children:"Backup node for validators"}),"\n",(0,o.jsx)(i.p,{children:"The Backup node ensures that all imported validators in your Dappnode remain active when your execution client or beacon node experience issues."}),"\n",(0,o.jsx)(i.h3,{id:"use-cases-for-the-backup-node",children:"Use cases for the Backup node"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"If your Execution Client gets corrupted, you will have a backup while you resync it."}),"\n",(0,o.jsx)(i.li,{children:"If you want to switch Execution Client, you will have a backup while you sync the new client."}),"\n",(0,o.jsx)(i.li,{children:"If your Beacon Node is down, you will be covered by the backup while resyncing even if it requires a short time using checkpoint-sync."}),"\n",(0,o.jsx)(i.li,{children:"If your MEV Boost is down, the backup node also has MEV Boost configured, so you will build MEV blocks while using the backup."}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"Map-backup",src:n(2453).A+"",width:"2398",height:"1202"})}),"\n",(0,o.jsx)(i.h3,{id:"backup-node-characteristics",children:"Backup node characteristics"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"The backup node for validators is available in Ethereum, Gnosis and Hoodi."}),"\n",(0,o.jsx)(i.li,{children:"It provides 168h of backup coverage per month in each network. This time should allow users to fix their attestation issues safely and return to normal operation."}),"\n",(0,o.jsx)(i.li,{children:"The backup is activated manually by the user in the Premium interface. You can activate and deactivate it at any moment. You will only spend backup time when the backup is active in the selected network."}),"\n",(0,o.jsx)(i.li,{children:"After activating the backup, you will need to wait 2 epochs (13 min) to start attesting."}),"\n"]}),"\n",(0,o.jsx)(i.h3,{id:"validators-limit-per-network",children:"Validators limit per network"}),"\n",(0,o.jsx)(i.p,{children:"The backup has a default limit of validators per network."}),"\n",(0,o.jsxs)(i.p,{children:["In Ethereum, the backup service has a limit of ",(0,o.jsx)(i.strong,{children:"10 validators"}),". If you exceed this number, you have two options:"]}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["\n",(0,o.jsxs)(i.ol,{children:["\n",(0,o.jsx)(i.li,{children:"Consolidation. You can consolidate your validators in 10 or less validators. Consolidation could be beneficial to reduce maintenance and validator management."}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(i.li,{children:["\n",(0,o.jsxs)(i.ol,{start:"2",children:["\n",(0,o.jsx)(i.li,{children:"Custom backup coverage. You can ask to our team to get extra backup coverage for your validators. Please open a support ticket in Discord."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(i.p,{children:["In Hoodi (testnet) applies the same limit of ",(0,o.jsx)(i.strong,{children:"10 validators"}),"."]}),"\n",(0,o.jsxs)(i.p,{children:["In Gnosis, the backup service has a limit of ",(0,o.jsx)(i.strong,{children:"100 validators"}),".If you exceed this number, you can ask to our team to get extra backup coverage for your validators. Please open a support ticket in Discord to let us know."]}),"\n",(0,o.jsx)(i.p,{children:"Prysm and Teku consensus clients are not supported in the backup service. Please use alternative consensus clients."}),"\n",(0,o.jsx)(i.p,{children:"The backup service connects to the user's consensus client via an API key. Validator keys are not managed by Dappnode in the backup process. The users always retains full control of their keys."}),"\n",(0,o.jsxs)(i.p,{children:["The Backup Node ensures that ",(0,o.jsx)(i.strong,{children:"all imported validators in your Dappnode remain active"})," when attestation issues arise."]}),"\n",(0,o.jsx)(i.h2,{id:"personalized-support",children:"Personalized support"}),"\n",(0,o.jsx)(i.p,{children:"Dappnode's Support system is based on 4 levels:"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"Community support (Dappnode users' shared knowledge in Discord)"}),"\n",(0,o.jsx)(i.li,{children:"Dappnode Home support (Individual private chats)"}),"\n",(0,o.jsx)(i.li,{children:"Paid Individual sessions (private 30 min call, 60 USD/session)"}),"\n",(0,o.jsx)(i.li,{children:(0,o.jsx)(i.strong,{children:"Premium Personalized support"})}),"\n"]}),"\n",(0,o.jsxs)(i.p,{children:["As part of the Premium subscription, Dappnode users can book ",(0,o.jsx)(i.strong,{children:"4 personalized support sessions with Dappnode experts in a year"}),"."]}),"\n",(0,o.jsxs)(i.p,{children:["Personalized support has been created to ",(0,o.jsx)(i.strong,{children:"guide Dappnode users in every step of your staking process"}),". Premium users can book a 30-minute video call to discuss any relevant topic related to Dappnode."]}),"\n",(0,o.jsx)(i.p,{children:"Most common support sessions:"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.strong,{children:"Guided onboarding:"})," Receive guidance from a Dappnode expert to start your staking journey."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.strong,{children:"Most adequate staking setup:"})," A Dappnode expert can assist you in selecting the best performing clients for your needs."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.strong,{children:"Resolve problems:"})," If you are experiencing issues with your validators, a Dappnode expert can help you resolve them."]}),"\n"]}),"\n",(0,o.jsx)(i.h2,{id:"subscribe-to-dappnode-premium",children:"Subscribe to Dappnode Premium"}),"\n",(0,o.jsxs)(i.p,{children:["Visit the ",(0,o.jsx)(i.a,{href:"https://dappnode.com/pages/dappnode-premium",children:"Dappnode Premium website"})," and get your subscription for 9.99\u20ac/month"]})]})}function p(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},2453:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/backup-node-infra-a16a4f0aa2d29c1813f70ecb3d5e92e7.png"},28453:(e,i,n)=>{n.d(i,{R:()=>a,x:()=>r});var s=n(96540);const o={},t=s.createContext(o);function a(e){const i=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(t.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/747b92bf.de9185f3.js b/assets/js/747b92bf.de9185f3.js
new file mode 100644
index 000000000..645bbae86
--- /dev/null
+++ b/assets/js/747b92bf.de9185f3.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5988],{53080:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>s,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"user/getting-started/connect-dappnode-to-the-router","title":"Connect your dappnode to the router and power","description":"Dappnode offers a seamless plug-and-play experience. For optimal performance and to ensure smooth operation, please connect your Dappnode to your router and enable UPnP settings within the router.","source":"@site/docs/user/getting-started/connect-dappnode-to-the-router.md","sourceDirName":"user/getting-started","slug":"/user/getting-started/connect-dappnode-to-the-router","permalink":"/docs/user/getting-started/connect-dappnode-to-the-router","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/getting-started/connect-dappnode-to-the-router.md","tags":[],"version":"current","frontMatter":{"title":"Connect your dappnode to the router and power","llm_description":"Instructions to connect Dappnode to router via ethernet and enable UPnP for port forwarding."},"sidebar":"userSidebar","previous":{"title":"Choose your path","permalink":"/docs/user/getting-started/choose-your-path"},"next":{"title":"Access your Dappnode via WiFi","permalink":"/docs/user/getting-started/access-dappnode-via-wifi"}}');var r=o(74848),a=o(28453);const s={title:"Connect your dappnode to the router and power",llm_description:"Instructions to connect Dappnode to router via ethernet and enable UPnP for port forwarding."},i="Connect your dappnode to the router and power",d={},u=[{value:"Enable UPnP in your router",id:"enable-upnp-in-your-router",level:2},{value:"[Advanced] Using dappnode without UPnP enabled",id:"advanced-using-dappnode-without-upnp-enabled",level:2},{value:"Troubleshooting",id:"troubleshooting",level:3}];function p(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",...(0,a.R)(),...e.components},{Details:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"connect-your-dappnode-to-the-router-and-power",children:"Connect your dappnode to the router and power"})}),"\n",(0,r.jsx)(t.p,{children:"Dappnode offers a seamless plug-and-play experience. For optimal performance and to ensure smooth operation, please connect your Dappnode to your router and enable UPnP settings within the router."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Connect to router",src:o(83893).A+"",width:"200",height:"100"})}),"\n",(0,r.jsx)(t.p,{children:"Make sure you also connect your Dappnode to a power outlet and you are ready to turn it on."}),"\n",(0,r.jsx)(t.h2,{id:"enable-upnp-in-your-router",children:"Enable UPnP in your router"}),"\n",(0,r.jsx)(t.p,{children:"Enabling UPnP (Universal Plug and Play) on a router allows devices on your network to set up port forwarding rules for themselves automatically. This simplifies device communication and functions, especially for applications that require open ports, like some games and peer-to-peer programs."}),"\n",(0,r.jsx)(t.p,{children:"Here are basic instructions to enable UPnP on most routers:"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Log into Your Router"}),": Open a web browser on a computer connected to your network.\nEnter your router's IP address in the address bar. Common addresses include 192.168.1.1, 192.168.0.1, or 10.0.0.1. If you're unsure of your router's IP, you can check your device's network settings or consult the router's manual.\nYou'll be prompted for a username and password. If you haven't changed them, the default details are usually admin/admin, admin/password, or some similar combination. Refer to your router's documentation if you're unsure."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Navigate to the UPnP Section"}),': Once logged in, look for a section labeled "UPnP", often found under "Advanced Settings", "WAN", "NAT", or similar categories. The exact path can vary based on the router manufacturer and model.']}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Enable UPnP"}),': There should be an option to enable or disable UPnP. Make sure it\'s set to "Enable" or "On".\nSave or apply the changes.']}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"advanced-using-dappnode-without-upnp-enabled",children:"[Advanced] Using dappnode without UPnP enabled"}),"\n",(0,r.jsx)(t.p,{children:"If you want to have your UPnP disabled on router, manual port forwarding must be done. First, make sure that your Wireguard is reachable by forwarding default port 51820. (Pro tip: You can choose any external port you like, but you have to set that port wireguard configuration file by yourself.)"}),"\n",(0,r.jsxs)(t.p,{children:["After that is done, go to ",(0,r.jsx)(t.a,{href:"http://my.dappnode/support/ports",children:"ports page"})," and manually forward all the ports listed there."]}),"\n",(0,r.jsx)(t.p,{children:"Please note that this list is updated automatically after you install new package and you should make sure that you update ports in your router as well."}),"\n",(0,r.jsx)("hr",{}),"\n",(0,r.jsx)(t.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:(0,r.jsx)("b",{children:"How can I verify that the ports were successfully opened by UPnP? "})}),(0,r.jsxs)(t.p,{children:["Access your dappnode ",(0,r.jsx)("a",{href:"http://my.dappnode/support/ports",children:"support > ports"})," view and execute an API scan of the ports."]}),(0,r.jsx)(t.p,{children:"An alternative is to manually check if the ports have been opened successfully, follow these steps:"}),(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsx)(t.li,{children:'Use an online port checker tool, like "YouGetSignal" or "Canyouseeme."'}),"\n",(0,r.jsx)(t.li,{children:"Enter your external IP address and the port number you want to check."}),"\n",(0,r.jsx)(t.li,{children:'Click "Check." If the port is open and accessible from the outside, the tool will confirm it.'}),"\n"]}),(0,r.jsxs)(t.p,{children:["Alternatively, you can use tools like ",(0,r.jsx)(t.code,{children:"nmap"})," to scan your own ports from a different network."]})]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:(0,r.jsx)("b",{children:"Why can't I connect my DappNode to the router via Wi-Fi?"})}),(0,r.jsx)(t.p,{children:"Currently, Dappnode doesn't support Wi-Fi connections to a router. Ensure your Dappnode is connected directly to the router using an ethernet cable."})]})]})}function l(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},83893:(e,t,o)=>{o.d(t,{A:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAABqnSURBVHgB7Z0LXFzVmcC/79w7wwwQoHmQqNGkNlqrboylSYAEmCQwSBsfqcbtWrVat3a7ff1Wf13brlujfezWx7arfah1bWu7/tpSW83WEEhQkhAIGqyvpE1NNJoY81QIAeZx7/n2O3dmeIUAMzDDgOf/Y2bu49wH957vnO9xHgAajUaj0SQCDtxQULAy0+MJTJcGTIM4sKUhe06KFgG4wAI6Al1Hj7a2toZBo5mAmH1XqqqqMto7w49LMEoRKJNg5BiC+iQ3eFkKN0A7ZE17lDf8O38s0GgmGEbflfzTz/465+ybeTELIsKT6McV/eXz0Mdmzzln1/439+wAjWaCIWILRUWrvQR4OaiMTfQjQriMf8tJwmUI2DSSk3Ed8jMJVAkkypHkSoHYwAqXB0hWgUYzAelRsUzzYLYN3rlKT5Igf9qyqX6n2l5YesknieSFJ1srJ8OCVOoRoVsaGjacUOtLyvzn8o8PNJoJiuhdzB48BcmlnPNzYCQgfThouX2xVUnQCRrNBKaPgJwYPAXCWRAX5I0tGUAu0GgmMGK4BKxZTYEEsYc9u0aT3gyfhRHk4JuhDYY7lCgEGs0Exhw+CYkB8cRjvNZJQIcEoGDpKTjlkWp3PMEUjSbNSEQJUi5fF6ngOUAOIur4hmbSEreAoOOcQg/XHhcjVxEcJzkCGs0kZQQq1kksZOWpgYOCSAIDLCGrtBalmazELSAsDKfz12KuSo6zcKjAYgZoNJOURGoQpWedzt+n65pDM9nRkQqNZgi0gGg0Q6AFRKMZgrhtEHbzvsOm+gsgjDYpYS4CXczrmaDRTELirkGIvVf86ZKW9Rqg7OYtusWuZtISvxeL4MP83c4R9BwiWsB1ynTQaCYpibl5ARcR4lFWr7RwaCYl5/t82XnS/WCCAqJsES0cmsnJ4sUrZgppPMFxviXai6XR9KGgoCBTZIjHeHEJf9oSrkEmAuXl5bldXTIvti6lHEHP+vGFKKe7pWXtIdCMC67sqd9mT5Sfbe3jZIhVk1pAuoJ4L5nmTaDGoQASCGbaCwhA4K/89RHQpJyi0spruIS6hRctNIybmhtqNk1qAQHED/D3cZaOpxAwrZuOIdEcvl8fS7AHNCnHx0Z5UNKP1TJnlJ+wcDyhFie1gEhVEgB0iHDuPzU3V3dDGlPoq7gBpR4iabwISPdtnFfy2Pl01AXBewEifWEntZHOpbJ2QmiG5UL2WrGGcYOzgnjX8uXL347tm+QqllMKyIyMI3rw7FHA6ofZHnblZ9hht1qXbokC3B4pbffAtKY00RKChBVsV+vvGTnHdm1d2wFpTJbLuJIrjNkE9HZepvnLNWvW9AxUkqiAnIh+ZsCA8X01E5/58+dnZeXNepiIVL8fCNhgZhh4MRpuNWZzzws3xMkVtKqzDVUuuSOyMxUCBwtLKv4a3f1LYRu7mprWNw9yWeVASbmduHr1amP/4fYvqCtzLVJds25dB9ciPfsTaax4ggx5lRT0IoZd9yHIT4NmUpGbe9oFFtCliDjcmGhqxP5jnCu6OV+ElE1LCNM4s6mROGO5bBafZ1Z02UemtIpK/S2881tNm+ue6XOucXGi7Dv03rkI4oNqWbhgHQtHv/uIW0AkYADR8+oxt92WT9BCFmgBmWSQaSDYzmwVxzm3PICEa8nAwwPTGWFLWp7MoNEdIMtr22pbpu32BrDX+SNCaKBbLrMl/R1nvU+w2HyINy/h8z5RXOp/jmNT/7GtcWMDjBcSZrIl7tSMFSXF9Vvr6/rtTqAGoelghe6absFmisz7MWlgVeBZLu18kERIYsW2xtqNkMbYaMdK0XfPnJl7R3V1tQ2jY0/096vFZSsWkjTvZg9KCV/Ej0L4i0r8LxPgj0zq/H1jY6MakDB1tYkQq6JL/WyPGInaIJ/lKvKzoIkbNCkbRsG8efMy8vPPzrVtD0ppofTYjiojAkZCmUpkdZmyM5PtapMsd9AxKtCSeZxhVWYxXz/w3hn8uw/GKNM2bap/nn+WFZb5q1jn/1c+7UJen88F78M2Zt5eXFL+HbDFU01NdUcg2YKyZo0QzzRfTI4BInYNlmRye7HSELTlqJwaM06bU8V6/iPC7DYiJrLjqkP0hhPLTNKVIbzhoDIn3MT2NarzoRp0XAUsc10Gbigs9f+ZpfD+9qP7t+/cuTOu4WSVByxouS5lcetsatrQo79s21RXwz81xT7/hXz7X2WHwFW8fhaheJhz5bf4mr/gm3v8kuVLdw1Wso+WgoICV2Z9S56F5IwMiiS3DpZOxwlSDJrm6AKWhpjJ39P4THmRjwpuQW7vetwfb+w8LGtslJMyzGPR/BNswObw+f+elzfkTTvjIZ/vhrgi/QHLXAoC/8DFwvq5c30eVXMUlparpjROzdfUULfjcKb4EoTxQyyZ9/DG13nzbP69na/9cm190xNLyipLYIzJz8/3WoKW8qLqDXvADtq7IvdE/Zoj6RpkgkFCSJSOUrAPwbgcIAzkhgBI6YUE4KBFmO0A9rWYHnUuQ1KQz+vnK6hocpsMyuWYgR/llD/k7HNDwD7gLSoqurG5uTkuQWfbDs+Y613AamE1oti7uKqqWHRZldKUm1tqag7tBuBaDL6+ZEnFDy1DlJtA/8L/4wK+5hWSZEVxaUW9RfTwc1s2Pg1jwJvZ2YHczvbPRG+uvqWlPtpAtH9zPS0gKUYSDakusKoxtKoklYqG6jXazZtr/gxJoNBXUYCRhs/o9YaPNDQ0/HbRihUbzZChhORaNLNV4PU6iBMCezafMosX5hmd8nOsyn1fhA01tvOC4hL/lRaZL29tXPc3Xn+sqGh1Nbjar+GH8Tn+by/i38sMxMtY9VrHT/BbLY11rTAKphxqmwORKQeBbHjsVOne1yqW0kPVtNesJ3tUPwBIAdIwhvQIcUE76P6C8vJcdb+C0A2po6c4fa6+/ljTlrrr2FX7EiFeyxn6UxAnXPEFo7/sJ5PqeSt7LKewtOpqVmyqBdrfKC31f7CwxP8TSxw9u3lz3aMeEVrKtWYV30k1p+3gG/q4QPjDIl/Fx2AUsLF1dfQffNFjBrcPlobzRd77VkBUBNWdPe1xV1bw+aB0N7uypzVxSVUAScYgGrLJfdR71A9Waaa6wrjenTWtnjPX1yB1yHA43E9ghQmf5+d0lCuY7y0s9Z8JcZAB6Mwpw7E49Qx6nwPaZbFF9gB8hv0EXzCF+T+LSvyXB2zXBrJkx+z83H9g4bxZZWg16xkXM7+P2jJxo+6ba6SvqmWusNdyDTnoXDcB6b71fatiKd9+UVnFQn7Zc9S6Ez9NUm8RNVQSSWpWg32DFY57NHzbyJxuEBZGzxWBBe1jS1ec7RJGPYwRnFn2btuyYVmfTUY47OlXY5kU2hVE1/2cx+9yIagYwv0wQmxhhCIBSLSFQDWbsrNdgOClAeUC4kwD6Eu84GOt9Kq3D7VfQQK+wDb0t0GFGJBdwwQ1BcXLV7Q2PbNnhLcgliy75Bzbkr/l41Uzqf3CAw+dKjE/60WJCohqW/MCf66BCcsarj1Vk6Dkx6T4Ch9gT85iXpSWwHuGSstO1pNqEC5RY+9pE2eQJ1maf6CK4e1bSvYuLmu6GSxyJdrfhQ10CRRGEkauSbh3wG7bNSsr6tYtYNdvq9VlGIZJrsfAtv+NBer68vLyX27cuLF9RNeywqbTzondyQLIFftHT2V38VbDaRaFwkPK20SqGQtdwvf8j7yvlh/WHLdpbi8q9ferASjiinqVF/dwORIS/NhZLeT3TSulLWfzOdlrR22c8IZpXu+gDSl9vivygnbXhYkISBebide2PFvXWuyrVCXjrZDGqBhBR0dHb93AwaH5TU3evEDj2WHVyTA1sGcIHuGi8gTnwjeGTkrWwC0CsSd2QoZsixrQbExvOwtsqo1akgkJiCq5URjKLcYOLVQF3wX9Ehw7Fl1odVpEK1tEbS0srWhkoVzR1gln8/qInAVSYmaspSMpZ0Vvo8Ah7129Jf4LOIkQ3E2b1j/Pxvr9vO0OiLinXdGzZEWSODjtq1TTKuqpd53fbt74JhLd3LRlw6lqXwzIri/y7Z2eiIBIEQhFBouTapTFCQYHnTyl/vww+9ghdWTwS7pJuXFOWKYyCBtgDDh+eMqB3OltX+ZzT+fyMQiJIB2fGCkRZF3/byM+juA3fOAK0xAqRpEUb9opGBhoPSglfNkQ9ttc4ZzPmdrNtUUG1zBu/q+WIsgLSBUwRHtYItexk/ytIwdx7e7dtad8XvP9/kwM0udUPZSIgGSBy3130dKKt1g2PwkTECltNERKW+l3c0n9FmfGkG0MP/npUBDXehgtcHPyO07nTHAfr2bAKGLNTlTF6bUvlID8sc8udLlcxiluZLdTAwiYCuODk3fZq/dA85ba30e3DWxGfzckQHYQr2YBm9NzkThR9dSlkDLtZHQo7aO7+2y+2V63uRBG8g2PvpCazxSPcXXfzorFMEO14pBZXShdOqqyeyDQxh64O7mgS3gSIz6fy1aNupRrieDoiI8zzCBrSTarKql0O/fAL/Sj6tcGeQBGjbJHI81ZFi1aMY3Vv69Er/HopPdiKRskN3f/+HbqQsxm23sRG4y2NOi+YVIP0/uxV346pXuKS7AeTokLiLKPRcwWQNrL3z8ayXE24j5B0M4HL4TxgHD62I3DEREOn+/js4K29RtQEXyCt1j6//N96eZNvYpFb3M+/CMXSR1GwBhSxYrnlWeJUEe37fq+ITg6IRPUsYSAWA3CAtw28G66vd7BT2yEwigNi/+vmZBC+D4j94Mwpt2oi4pWnhG0g7/mC5Q5nQIRvlu1fMmeSS8gyql4+Ehev5ecahUL1byOQlzJWdAmt1QtWveeOi2N+N4C4MkTgj4TGX4j8ZivED3tgvfyzw/73A2Zx48Pfj8h10xCp/3XC5BCKDYQB3KogaCY731Uur7qPqBaSPM/dCcLx3znGgB3ZojQo6oV8fujBjmHP7t7V6V0cQ0SVs2bL+LPqPpnjARSRrqUb6icZiF1D50WT3rhrO+HpB0tOCnaVFGl7cZ30S1fU27OYdtwjQAEHLEDAcmayv7hKTSEsA9xIWWU2bGygB0YJg4ZpVXmkVIj+6XZ7+whWnX+6tX/u7O6OgxxVMBFRUVeMKdU8im/zKvLI7eF7/BN3V61vPgXsSb27wsbxOru7vdktzc+rZpUL+VI+l5+9kkXEH6L7fz0W5R73W2Zx4dKyi/ppDiIZYUNEQ2FqKa8qqUG/1+G10tTgxLejhyWuELOtgQH6lUbL5kitz05DbJiZQEOUij0T00ufk8ZfVOpAiG6emnuoeNri0v9jXyid3mz0zSGI58cLZIRC0s5eW3eK8jDR53LR1dyQeTlpzi7z0U2khW+YVtT/QHs8yx1a95UgDiHX+ZtapFVrG3Q2wV1EE6OpEvT5PI29s7Y3oiEvth0kDa/8CL2a2XgKGoQ5Tnmw1Ur4b+wqTqiPMHR7GudYxG2QpJhlTjMmTnYz8wiOtgrVyrDQyVEI4mR+4oFCCnyRCOLsa9INzMnSgq/ChHeD11HX9m+fbuFox20YbLAVaiofTbp7zbGbi4ln1DR46C034RRodTiSCYQbKSjdG8j1SMEwUrkbBxH4DqJdU5SPTaA4yANfJ4KZ5/KQjk5OQN7EGLBypVe6AgVcoI2DIrXIG5QIjp1SGydhtKOSFUEKEKRqCbSohWrpolw1yejquYbvPEp/s3nlPNUG65Tn8gRlS38OcAn/PO2LbW/63dXg1RkiU6gc4RLrV1844UwQYVsx44dJhczb0L/ensOJId5/DJvU/k6Qxibef0vp05KJ3VpZUOUY/C2KgsvYMf/p2OqeLdhZPCeT3DmzmMBTNCrQ45do764Nnpu4N7uXvXUKYN9Pp8RaO86D9DkCDU9sm3b+r0wSoZrJ8r5WiVxXNm8+JoR7lrDz0JJ8QlJ4oqWLeuT1ioikczdzi/sMhd0vxpE9zf5v/sGTECqq6tVRizruy0Vo5oIjL8/h7ClIzSoprtDWNqzvasrjK4pV7Oge8kgFyQA+9XYE6YUOGGBSf1UP9UEKhwOq/MGCgoKzNbW1vCMGTNo/6H2B1TzW1brfwVjAKmwymA7ULDdRmVsIr1FLlFnWHIbC4tqhft9ZzfSHS2b178CSST+YX+4nAl3dR7a+tzmE4VlFW1Dex80Y0FzQ+2epUtXfJhcrAlJup5VtW+q7bNnz25nQX8GkkZv3xUlHOp33zvtX2TtoZgr3see31y3GcYAdmEdi+lbSPaLbE2/ztXmd5o31f6i0HfJg1bHkbfd+IHz+Hbm8XW/Erk1uCc367wfA2xIqss+bgHhajjPyPD8pKi0ci/LyuWpbbMRP0q5zTx8eMxHxRgFQz5zVngGGzWEGhvrnYaES8r8R2PPfAzGqxoGpI6srJ5nt7i4ws8eoe9xJmizDKHaOfWYviM6m2l4IOJkUi6onNiR7HT/aQjsM6VlP81epCcXlfpfsl32u2wn4vr6ljNcWdPu5ysVkzNYhXP00yEj4+6amgcSa6AZB4nZDwiXRJu4pT3K5Z6fny937twJEwEuIYd86azZBFLXU5p1t3bTUF1PQ+BaSRJZtaJuU+KNzZtrd8R5Moh5ZjnftLETtp4EzWaNZG1Dw7qD0GecNbvTfchNgZLaZ5qu4edxPUQPYv7K1tIDZ5yW90hURU462s2bYizbDgy1n4Yb1AEjY0PzUh7bTD+HJIA2zI1ozihMt3V10HarIUOv4E8nb7u+sbHuT5AAKI1XwZB/4vO/6i8vquEaot8IJUVFlVPBsK8AEbyJC4Hi6Gal2u1jG+lr2W6rfuPGDcchhZMhaQFJMaxCBWAUcAAsGhFhzxXCDZBcTmN/7M8gohI9SwK+pjrKxXMCtI2XUdA6PjZUvnzh3paWlquys7OtvoPBLeAaymO7r+N/7hYWjLk9xyI8yc6AezJE6LmGhoaoGzu1Nq8WkL4IPJhsvVGoLq5DMFzXWUTxCqtZj6nuqACJxT6GhWAmZ85yUM29UDwuyb63ZdOGBOId7GBorn2XPWBXXHrppXZUKHpUyIXFFQsMA29zZtZCiI0A38EP4Of8oH4QYuM85hwYL7SA9MGDoRsD6Emq21r14RgywTACurVhfSOrYVvvvPNOTMaQnIrS5VXLw5ZdyrfyXk6GvKWutq6rN160mgXTcQ6M2EBXmZw/PeuLllVeZFh0O0SEMDYL8QEW/vtCdvjJ7Vs2vjGapjNjiRaQPnA1rtSfvTCOqD4jw6WJNodIWgbi2kn1oVfC53ov4PQY7FItDyIC2eM5i+v6aozeMLgWkC2+wrGX6yDaz5y/XrJJ/rpl88Z7exJj+oQOtICkGzj+zkErMv2B+uRxBnmosLSyvRZBFpb66yAU2jQwvTHFFUIOub9rmuEpXq+wTsgsVzjY24nLZa4KSjVsEV4dbVXSwTLwgkS4b9umuv/rfzbl6XIkJC1c85NbQJzWakQq+gsThMGG/Uk5luxga0k1y1cDWVf1dDhUwzy5T24IQEE4IUXm4VwJIThhu9xqaj63O+cUZ99LUt7avHXjHwbfndzaMV5GIyDqASY0YHIqYXVE7NjhGLRJDqqNDVx+jvtol02bNrxavKyyDGzMYYfAR/khFkZujgx+nspumNU3PUX61ES6DQzUjhDaOcuvl2rYHhL/5TUCbzVsbhjVwBWpJBEBCfIrvJ31yGZ+WHdBtLNJukJOoPCInCBxQjV19bjXIFEbJzbxpprw5kG1oAJ9i5Z9YqYB0sM1ncmfnqkQbFv17bMMFCLMNQRCWISli2xEI9y8afQNGseL+JuaAHZ0heixl5s2HC4uu+QJfp9pKyCqJTe/xJyAdN/O+jOkM2yaXwSREWvTTR3suZ+o4ByE9xGJzFGYl2Xg54tLKl/mkmJVOrdVjDTjdiaYuQPSnZ7niCdAkzYkomKZnPPuokiQKq2NfMNt3m7Z9sMwQWBjOCMcNhIKyGmSw2gyeNp7wBrrnb7nr8MEQen4mCYBMk0Ek3XzNWohRJAlIDL471jDJeOC2HUGIhD35GaK39XU1CS96XK6o4Uj/TBj+nlyg5e4ANVodYPApWagrVOqaK2aZ0JnEE1aIdRQ8M5w8ABjMMbpKemKXeekD4CHgL5b6PPNAY0mzTCbN9XOVQsLF/pmubzul7kInyHVOF5jCNcSv9u2ue7GgdsXLVo1zfB0NvPFziHLnAvj3A5KoxlIT9TW4/GmPNJs228d57iKCkSpSYc+CBpNmjFoswYhrJTYAq2trZaIju1qGFAEGk2a0UdAeuNT/VUsTLjpAwENp6pR2A6t54RdkmjeypUrUzIVs0YzUoavQcgZ8TsxaPixmoSL2vku1CSCy460d88FjSaN6CMgJ43hHBmBAsU+9s+POEZhgHyp5wQjmPT+rBkz3uF0LzorJJI+T7lGEw890fBZs7Lb9x9u28sSMUOg+Oei0opXpKQQ2OQl4YwsMZJZjHbbwrVsSUlFqVqRgFcOd4Aa22lJWWUTEVRyLOZC0GjSiB4BUeMMLSnzV7PVMJ8Iv6i2JTA3yTwWiwdl/6hj0JBQPcQxasILNXuHGn6yCqKjoGs06UC/9lRWwHhIZMg5rBt9amBCZ4pHcIaVH3wYVTq5mQRvaufE/71164Z1cGooQxjPBKV1hAOHUwsKfNNbWxtGPJmkRpNM+glIS0vN8Xnz5t06c+aHfio8aFgYMdZdIbBY3YqMGenKdFkifPIEf2GzW/WVMSzLsWuIJNqWp7OqavGBpk11Q46AMWNG1pH9h47v4yQfEVnifN40JmO+ajSThuKSikeLSvzBwlL/j0GjSRPGvf9zDCnoFfabubmeObd3di2NZnxJGwERwlD9NiwWkvMWL148FTSaNCBtBKTp2dqnuPbYBWqoGfcHZoNGkwakjYA4CDzCulWugXYJaDRpQFoJCAtHU+QXF4NGkwaY4PONT9/yhgabr21ARweq9iXt7flCSqtTzTRKiGeCRpMGmEWUsRvGg1K/auyLkB1pwTI9yxa8nuusUKQm0WjGGzOJUx8PT5+57zH6xfXH827DmDBD9WgmNyYgfhvSAGfIG9a0bJf3Vw31aw+DRqPRaDQajUajmYz8P5+EKwLJLbE5AAAAAElFTkSuQmCC"},28453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>i});var n=o(96540);const r={},a=n.createContext(r);function s(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/755082c0.5094462f.js b/assets/js/755082c0.5094462f.js
new file mode 100644
index 000000000..d436e54d7
--- /dev/null
+++ b/assets/js/755082c0.5094462f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4355],{59146:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"user/notifications/overview","title":"Notifications Overview","description":"Dappnode Notifications is a built-in system that keeps you informed about important events and updates across your Dappnode setup. Whether it\'s a new software release, a hardware warning, or a consensus sync alert \u2014 notifications are your go-to source for staying up to date.","source":"@site/docs/user/notifications/overview.md","sourceDirName":"user/notifications","slug":"/user/notifications/overview","permalink":"/docs/user/notifications/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/notifications/overview.md","tags":[],"version":"current","frontMatter":{"title":"Notifications Overview","llm_description":"Introduction to Dappnode\'s built-in notification system for monitoring hardware, system, and staking."},"sidebar":"userSidebar","previous":{"title":"Dappnode commands","permalink":"/docs/user/install/dappnode-commands"},"next":{"title":"Notifications List","permalink":"/docs/user/notifications/notifications-list"}}');var o=t(74848),a=t(28453);const s={title:"Notifications Overview",llm_description:"Introduction to Dappnode's built-in notification system for monitoring hardware, system, and staking."},r="Notifications Overview",c={},d=[{value:"Benefits",id:"benefits",level:3},{value:"\ud83d\udda5\ufe0f Monitor Your Hardware and System in one channel",id:"\ufe0f-monitor-your-hardware-and-system-in-one-channel",level:3},{value:"\u2699\ufe0f Customization for Every Package",id:"\ufe0f-customization-for-every-package",level:3},{value:"\ud83d\udcec Direct communication from the Dappnode Team",id:"-direct-communication-from-the-dappnode-team",level:3},{value:"How to Access Notifications",id:"how-to-access-notifications",level:3},{value:"\ud83d\udd14 Bell Icon",id:"-bell-icon",level:3},{value:"\ud83d\udcda Side Menu",id:"-side-menu",level:3}];function l(e){const n={h1:"h1",h3:"h3",header:"header",img:"img",p:"p",strong:"strong",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"notifications-overview",children:"Notifications Overview"})}),"\n",(0,o.jsx)(n.p,{children:"Dappnode Notifications is a built-in system that keeps you informed about important events and updates across your Dappnode setup. Whether it's a new software release, a hardware warning, or a consensus sync alert \u2014 notifications are your go-to source for staying up to date."}),"\n",(0,o.jsx)(n.p,{children:"Notifications are package-based, meaning each package can send its own alerts. To receive notifications, you have the Notifications package installed by default and running on your Dappnode."}),"\n",(0,o.jsx)(n.h3,{id:"benefits",children:"Benefits"}),"\n",(0,o.jsx)(n.h3,{id:"\ufe0f-monitor-your-hardware-and-system-in-one-channel",children:"\ud83d\udda5\ufe0f Monitor Your Hardware and System in one channel"}),"\n",(0,o.jsx)(n.p,{children:"Get real-time alerts about your system health: CPU load, disk space, temperature, and more.\nIt\u2019s like having all the information about your Dappnode and staking setup in one place running 24/7."}),"\n",(0,o.jsx)(n.h3,{id:"\ufe0f-customization-for-every-package",children:"\u2699\ufe0f Customization for Every Package"}),"\n",(0,o.jsx)(n.p,{children:"You can fine-tune notification settings per package, including the thresholds that triggers different alerts in the package."}),"\n",(0,o.jsx)(n.h3,{id:"-direct-communication-from-the-dappnode-team",children:"\ud83d\udcec Direct communication from the Dappnode Team"}),"\n",(0,o.jsxs)(n.p,{children:["Receive ",(0,o.jsx)(n.strong,{children:"direct messages"})," from the Dappnode team for critical network events like chain forks or urgent updates (e.g. the Pectra fork). This aims to stay ahead and take action before it\u2019s too late."]}),"\n",(0,o.jsx)(n.h3,{id:"how-to-access-notifications",children:"How to Access Notifications"}),"\n",(0,o.jsx)(n.h3,{id:"-bell-icon",children:"\ud83d\udd14 Bell Icon"}),"\n",(0,o.jsxs)(n.p,{children:["Find the ",(0,o.jsx)(n.strong,{children:"bell icon"})," at the top right corner of your Dappmanager. Click it to view new or past notifications. The bell icon will show a blue dot when new notifications are triggered."]}),"\n",(0,o.jsx)(n.h3,{id:"-side-menu",children:"\ud83d\udcda Side Menu"}),"\n",(0,o.jsxs)(n.p,{children:["You\u2019ll also find a dedicated ",(0,o.jsx)(n.strong,{children:"Notifications"})," section in the side menu.\n",(0,o.jsx)(n.img,{alt:"Notifications-access",src:t(71598).A+"",width:"1440",height:"766"})]})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},71598:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/notifications_access-f9218821a9933b8293aefa3608551e15.png"},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>r});var i=t(96540);const o={},a=i.createContext(o);function s(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/7661071f.c16fb210.js b/assets/js/7661071f.c16fb210.js
new file mode 100644
index 000000000..1a8193ff5
--- /dev/null
+++ b/assets/js/7661071f.c16fb210.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8737],{34695:(e,o,s)=>{s.r(o),s.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>n,toc:()=>u});var n=s(48811),t=s(74848),l=s(28453);const r={slug:"welcome",title:"Welcome",authors:["slorber","yangshun"],tags:["facebook","hello","docusaurus"]},a=void 0,c={authorsImageUrls:[void 0,void 0]},u=[];function i(e){const o={a:"a",code:"code",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.a,{href:"https://docusaurus.io/docs/blog",children:"Docusaurus blogging features"})," are powered by the ",(0,t.jsx)(o.a,{href:"https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog",children:"blog plugin"}),"."]}),"\n",(0,t.jsxs)(o.p,{children:["Simply add Markdown files (or folders) to the ",(0,t.jsx)(o.code,{children:"blog"})," directory."]}),"\n",(0,t.jsxs)(o.p,{children:["Regular blog authors can be added to ",(0,t.jsx)(o.code,{children:"authors.yml"}),"."]}),"\n",(0,t.jsx)(o.p,{children:"The blog post date can be extracted from filenames, such as:"}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsx)(o.li,{children:(0,t.jsx)(o.code,{children:"2019-05-30-welcome.md"})}),"\n",(0,t.jsx)(o.li,{children:(0,t.jsx)(o.code,{children:"2019-05-30-welcome/index.md"})}),"\n"]}),"\n",(0,t.jsx)(o.p,{children:"A blog post folder can be convenient to co-locate blog post images:"}),"\n",(0,t.jsx)(o.p,{children:(0,t.jsx)(o.img,{alt:"Docusaurus Plushie",src:s(83887).A+"",width:"1500",height:"500"})}),"\n",(0,t.jsx)(o.p,{children:"The blog supports tags as well!"}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"And if you don't want a blog"}),": just delete this directory, and use ",(0,t.jsx)(o.code,{children:"blog: false"})," in your Docusaurus config."]})]})}function d(e={}){const{wrapper:o}={...(0,l.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(i,{...e})}):i(e)}},83887:(e,o,s)=>{s.d(o,{A:()=>n});const n=s.p+"assets/images/docusaurus-plushie-banner-a60f7593abca1e3eef26a9afa244e4fb.jpeg"},28453:(e,o,s)=>{s.d(o,{R:()=>r,x:()=>a});var n=s(96540);const t={},l=n.createContext(t);function r(e){const o=n.useContext(l);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(l.Provider,{value:o},e.children)}},48811:e=>{e.exports=JSON.parse('{"permalink":"/blog/welcome","source":"@site/blog/2021-08-26-welcome/index.md","title":"Welcome","description":"Docusaurus blogging features are powered by the blog plugin.","date":"2021-08-26T00:00:00.000Z","tags":[{"inline":true,"label":"facebook","permalink":"/blog/tags/facebook"},{"inline":true,"label":"hello","permalink":"/blog/tags/hello"},{"inline":true,"label":"docusaurus","permalink":"/blog/tags/docusaurus"}],"readingTime":0.405,"hasTruncateMarker":false,"authors":[{"name":"S\xe9bastien Lorber","title":"Docusaurus maintainer","url":"https://sebastienlorber.com","imageURL":"https://github.com/slorber.png","key":"slorber","page":null},{"name":"Yangshun Tay","title":"Front End Engineer @ Facebook","url":"https://github.com/yangshun","imageURL":"https://github.com/yangshun.png","key":"yangshun","page":null}],"frontMatter":{"slug":"welcome","title":"Welcome","authors":["slorber","yangshun"],"tags":["facebook","hello","docusaurus"]},"unlisted":false,"nextItem":{"title":"MDX Blog Post","permalink":"/blog/mdx-blog-post"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/769f9326.a97b20cd.js b/assets/js/769f9326.a97b20cd.js
new file mode 100644
index 000000000..f6c983150
--- /dev/null
+++ b/assets/js/769f9326.a97b20cd.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1477],{21287:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"user/hardware/temperature","title":"Temperature","description":"Keeping a close eye to your Dappnode\'s temperature is part of the Node Runner\'s basic good practices. Dappnode provides you with metrics \ud83d\udcca in the main dashboard to do so.","source":"@site/docs/user/hardware/temperature.md","sourceDirName":"user/hardware","slug":"/user/hardware/temperature","permalink":"/docs/user/hardware/temperature","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/hardware/temperature.md","tags":[],"version":"current","frontMatter":{"title":"Temperature","llm_description":"How to monitor CPU temperature via dashboard and configure temperature alerts."},"sidebar":"userSidebar","previous":{"title":"Maintenance","permalink":"/docs/user/hardware/maintenance"},"next":{"title":"Earn with Staking","permalink":"/docs/user/staking/overview"}}');var o=n(74848),a=n(28453);const s={title:"Temperature",llm_description:"How to monitor CPU temperature via dashboard and configure temperature alerts."},i="Temperature",c={},d=[];function p(e){const t={a:"a",code:"code",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"temperature",children:"Temperature"})}),"\n",(0,o.jsxs)(t.p,{children:["Keeping a close eye to your Dappnode's temperature is part of the Node Runner's basic good practices. Dappnode provides you with metrics \ud83d\udcca in the ",(0,o.jsx)(t.a,{href:"http://my.dappnode/dashboard",children:"main dashboard"})," to do so."]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{width:"100%",src:"/img/temp_dashboard.png",alt:"CPU_temp"})}),"\n",(0,o.jsx)(t.p,{children:"If you want to configure notifications \ud83d\udd14 for temperature changes, you can find two options:"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["In the ",(0,o.jsx)(t.a,{href:"http://dms.dappnode/dashboards",children:"DMS Dashboard"})," you'll be able to configure Grafana notifications."]}),"\n",(0,o.jsxs)(t.li,{children:["You can also set ",(0,o.jsx)(t.a,{href:"http://my.dappnode/system/notifications",children:"Ethical Metrics"})," up to get email notifications while keeping your privacy."]}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"Some additional tips that will contribute to an optimal temperature are:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["BIOS Adjustments: if you shut your Dappnode down you can access your NUC's BIOS setup with the ",(0,o.jsx)(t.code,{children:"F2"})," key while booting. The UI includes different options that you can check in ",(0,o.jsx)(t.a,{href:"https://www.intel.com/content/www/us/en/support/articles/000096279/intel-nuc.html",children:"Intel's documentation"})," and tweak according to your preferences."]}),"\n",(0,o.jsxs)(t.li,{children:["If you're using an 11th Generation NUC, check its ambient temperature recommendations ",(0,o.jsx)(t.a,{href:"https://www.intel.com/content/dam/support/us/en/documents/intel-nuc/NUC11AT_TechProdSpec.pdf",children:"here"}),"."]}),"\n",(0,o.jsxs)(t.li,{children:["If you're using a 12th Generation NUC, check its ambient temperature recommendations ",(0,o.jsx)(t.a,{href:"https://www.intel.com/content/dam/support/us/en/documents/intel-nuc/NUC12WSK_L10_UserGuide.pdf",children:"here"}),"."]}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>i});var r=n(96540);const o={},a=r.createContext(o);function s(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/773dc9fa.53212e03.js b/assets/js/773dc9fa.53212e03.js
new file mode 100644
index 000000000..75fafada6
--- /dev/null
+++ b/assets/js/773dc9fa.53212e03.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8039],{42629:(o,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>r,metadata:()=>e,toc:()=>h});const e=JSON.parse('{"id":"smooth/subscribe-to-smooth/overview","title":"Subscribing to Smooth","description":"Hello! In this section you will find all the information on how to subscribe your Validators to Smooth. Even though the process is simple, it is important to follow the steps carefully.","source":"@site/docs/smooth/subscribe-to-smooth/overview.md","sourceDirName":"smooth/subscribe-to-smooth","slug":"/smooth/subscribe-to-smooth/overview","permalink":"/docs/smooth/subscribe-to-smooth/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/smooth/subscribe-to-smooth/overview.md","tags":[],"version":"current","frontMatter":{"title":"Subscribing to Smooth","llm_description":"Overview of two subscription methods: automatic and manual, with address info."},"sidebar":"smoothSidebar","previous":{"title":"Validator Consolidations In Smooth","permalink":"/docs/smooth/deep-dive-into-smooth/consolidations"},"next":{"title":"Automatic subscription","permalink":"/docs/smooth/subscribe-to-smooth/automatic"}}');var i=s(74848),n=s(28453);const r={title:"Subscribing to Smooth",llm_description:"Overview of two subscription methods: automatic and manual, with address info."},a="Subscribing to Smooth",d={},h=[];function c(o){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...o.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"subscribing-to-smooth",children:"Subscribing to Smooth"})}),"\n",(0,i.jsxs)(t.p,{children:["Hello! In this section you will find all the information on how to subscribe your Validators to ",(0,i.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),". Even though the process is simple, it is important to follow the steps carefully."]}),"\n",(0,i.jsxs)(t.admonition,{title:"Before subscribing to Smooth!",type:"danger",children:[(0,i.jsxs)(t.p,{children:["Only validators with ETH1 withdrawal addresses can be subscribed to ",(0,i.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),". If you have a validator with a BLS withdrawal address, please update it to an ETH1 withdrawal address before subscribing to ",(0,i.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),"."]}),(0,i.jsxs)(t.p,{children:["Ensure that you have control over the ETH1 withdrawal address of the validators you plan to subscribe to ",(0,i.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),". This address is the one you will need to use when logging into Smooth's website and manage your validators going forward. Only the withdrawal address has the capability to claim rewards generated by your validators from ",(0,i.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),"."]})]}),"\n",(0,i.jsxs)(t.p,{children:["You have ",(0,i.jsx)(t.strong,{children:"two options"})," to subscribe to ",(0,i.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),":"]}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"/docs/smooth/subscribe-to-smooth/automatic",children:(0,i.jsx)(t.strong,{children:"Automatic subscription"})}),": The simplest way to subscribe, change the fee recipient of your validators to Smooth's address and subscribe automatically when proposing your next block!"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"/docs/smooth/subscribe-to-smooth/manual",children:(0,i.jsx)(t.strong,{children:"Manual subscription"})}),": Change the fee recipient of your validators to Smooth's address and use the Smooth's website to subscribe right now, without waiting for your validators to propose a block. Start earning rewards right away!"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.admonition,{type:"info",children:(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Smooth ",(0,i.jsx)(t.strong,{children:"Mainnet"})," Address: ",(0,i.jsx)(t.code,{children:"0xAdFb8D27671F14f297eE94135e266aAFf8752e35"})]}),"\n",(0,i.jsxs)(t.li,{children:["Smooth ",(0,i.jsx)(t.strong,{children:"Testnet"})," (Hoodi) Address: ",(0,i.jsx)(t.code,{children:"0x9CDcc499D53Be0ADb5056355Be774828a593F267"})]}),"\n"]})})]})}function l(o={}){const{wrapper:t}={...(0,n.R)(),...o.components};return t?(0,i.jsx)(t,{...o,children:(0,i.jsx)(c,{...o})}):c(o)}},28453:(o,t,s)=>{s.d(t,{R:()=>r,x:()=>a});var e=s(96540);const i={},n=e.createContext(i);function r(o){const t=e.useContext(n);return e.useMemo((function(){return"function"==typeof o?o(t):{...t,...o}}),[t,o])}function a(o){let t;return t=o.disableParentContext?"function"==typeof o.components?o.components(i):o.components||i:r(o.components),e.createElement(n.Provider,{value:t},o.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/78d28be6.c66665b0.js b/assets/js/78d28be6.c66665b0.js
new file mode 100644
index 000000000..a7327708e
--- /dev/null
+++ b/assets/js/78d28be6.c66665b0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8007],{37801:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>g,frontMatter:()=>i,metadata:()=>t,toc:()=>r});const t=JSON.parse('{"id":"user/packages/understanding-dappnode-packages/config","title":"Config","description":"The Config section provides access to the package\'s settings, available in both simple and advanced modes. You can switch to the advanced mode by clicking the option in the lower-right corner of the screen when it is available. This flexibility allows users to customize package parameters according to their needs, from basic adjustments to more detailed configurations.","source":"@site/docs/user/packages/understanding-dappnode-packages/config.md","sourceDirName":"user/packages/understanding-dappnode-packages","slug":"/user/packages/understanding-dappnode-packages/config","permalink":"/docs/user/packages/understanding-dappnode-packages/config","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/packages/understanding-dappnode-packages/config.md","tags":[],"version":"current","frontMatter":{"title":"Config","llm_description":"Package configuration settings with simple and advanced modes for parameter customization."},"sidebar":"userSidebar","previous":{"title":"Info","permalink":"/docs/user/packages/understanding-dappnode-packages/info"},"next":{"title":"Network","permalink":"/docs/user/packages/understanding-dappnode-packages/network"}}');var s=a(74848),o=a(28453);const i={title:"Config",llm_description:"Package configuration settings with simple and advanced modes for parameter customization."},c="Config",d={},r=[];function p(e){const n={h1:"h1",header:"header",img:"img",p:"p",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"config",children:"Config"})}),"\n",(0,s.jsx)(n.p,{children:"The Config section provides access to the package's settings, available in both simple and advanced modes. You can switch to the advanced mode by clicking the option in the lower-right corner of the screen when it is available. This flexibility allows users to customize package parameters according to their needs, from basic adjustments to more detailed configurations."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"dappnode_packages2",src:a(7312).A+"",width:"1741",height:"1091"})})]})}function g(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},7312:(e,n,a)=>{a.d(n,{A:()=>t});const t=a.p+"assets/images/dappnode_packages2-bfcef9f7947159b0341c2c914f93378e.png"},28453:(e,n,a)=>{a.d(n,{R:()=>i,x:()=>c});var t=a(96540);const s={},o=t.createContext(s);function i(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/793beb66.693456f7.js b/assets/js/793beb66.693456f7.js
new file mode 100644
index 000000000..222e866d6
--- /dev/null
+++ b/assets/js/793beb66.693456f7.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1733],{66646:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"dev/package-development/single-configuration","title":"Single-Variant Package Development","description":"This guide will walk you through the steps to develop a single-variant Dappnode package using a simple example. We\'ll start with initializing a basic package and progress to a more complex setup, using the Holesky Geth package as a reference.","source":"@site/docs/dev/package-development/single-configuration.md","sourceDirName":"dev/package-development","slug":"/dev/package-development/single-configuration","permalink":"/docs/dev/package-development/single-configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/package-development/single-configuration.md","tags":[],"version":"current","frontMatter":{"title":"Single-Variant Package Development","llm_description":"Step-by-step guide for developing single-variant Dappnode packages."},"sidebar":"devSidebar","previous":{"title":"Overview","permalink":"/docs/dev/package-development/overview"},"next":{"title":"Multi-Configuration","permalink":"/docs/dev/package-development/multi-configuration"}}');var t=i(74848),o=i(28453);const s={title:"Single-Variant Package Development",llm_description:"Step-by-step guide for developing single-variant Dappnode packages."},c="Single-Variant Package Development",r={},l=[{value:"Step 1: Initialize the Package",id:"step-1-initialize-the-package",level:2},{value:"Step 2: Customize your Package",id:"step-2-customize-your-package",level:2},{value:"Create a Directory for Container Files",id:"create-a-directory-for-container-files",level:3},{value:"Customize the avatar",id:"customize-the-avatar",level:3},{value:"Key Changes in docker-compose.yml and dappnode_package.json",id:"key-changes-in-docker-composeyml-and-dappnode_packagejson",level:3},{value:"Simplified Dockerfile",id:"simplified-dockerfile",level:3},{value:"Simplified entrypoint.sh",id:"simplified-entrypointsh",level:3},{value:"Step 3: Build the package",id:"step-3-build-the-package",level:2},{value:"Step 4: Publish the package",id:"step-4-publish-the-package",level:2},{value:"Naming conventions for packages",id:"naming-conventions-for-packages",level:3},{value:"Automating Publication with GitHub Actions",id:"automating-publication-with-github-actions",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"single-variant-package-development",children:"Single-Variant Package Development"})}),"\n",(0,t.jsx)(n.p,{children:"This guide will walk you through the steps to develop a single-variant Dappnode package using a simple example. We'll start with initializing a basic package and progress to a more complex setup, using the Holesky Geth package as a reference."}),"\n",(0,t.jsx)(n.h2,{id:"step-1-initialize-the-package",children:"Step 1: Initialize the Package"}),"\n",(0,t.jsx)(n.p,{children:"Start by running the following command to initialize your Dappnode package:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npx @dappnode/dappnodesdk@latest init\n"})}),"\n",(0,t.jsx)(n.p,{children:"This will create the following directory structure:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:".\n\u251c\u2500\u2500 avatar-default.png\n\u251c\u2500\u2500 dappnode_package.json\n\u251c\u2500\u2500 docker-compose.yml\n\u2514\u2500\u2500 Dockerfile\n"})}),"\n",(0,t.jsx)(n.h2,{id:"step-2-customize-your-package",children:"Step 2: Customize your Package"}),"\n",(0,t.jsx)(n.h3,{id:"create-a-directory-for-container-files",children:"Create a Directory for Container Files"}),"\n",(0,t.jsxs)(n.p,{children:["For more complex packages, such as the Holesky Geth package, it is recommended to create a directory (e.g., ",(0,t.jsx)(n.code,{children:"geth"}),") that will contain everything that needs to go inside each Docker container corresponding to a service in the compose file. This includes the ",(0,t.jsx)(n.code,{children:"Dockerfile"}),", an ",(0,t.jsx)(n.code,{children:"entrypoint.sh"})," script, and any security or configuration files. Example:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"geth/\n\u251c\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 entrypoint.sh\n\u2514\u2500\u2500 security/\n \u2514\u2500\u2500 jwtsecret.hex\n"})}),"\n",(0,t.jsx)(n.h3,{id:"customize-the-avatar",children:"Customize the avatar"}),"\n",(0,t.jsxs)(n.p,{children:["Replace the default avatar (",(0,t.jsx)(n.code,{children:"avatar-default.png"}),") with a square ",(0,t.jsx)(n.code,{children:".png"})," image that represents your package (recommended dimensions: width between 200px and 300px). This image will appear in the Dappnode UI, so it's important to choose one that aligns with your package's branding."]}),"\n",(0,t.jsxs)(n.h3,{id:"key-changes-in-docker-composeyml-and-dappnode_packagejson",children:["Key Changes in ",(0,t.jsx)(n.code,{children:"docker-compose.yml"})," and ",(0,t.jsx)(n.code,{children:"dappnode_package.json"})]}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"docker-compose.yml"}),", modify the services section to:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Reference the newly created directory (",(0,t.jsx)(n.code,{children:"geth"})," in this example) where the ",(0,t.jsx)(n.code,{children:"Dockerfile"})," and other container files are stored."]}),"\n",(0,t.jsx)(n.li,{children:"Set up environment variables, ports, and volumes relevant to your service."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"dappnode_package.json"}),", update fields such as:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"name"}),", ",(0,t.jsx)(n.code,{children:"version"}),", ",(0,t.jsx)(n.code,{children:"description"}),", and ",(0,t.jsx)(n.code,{children:"author"})," to reflect your package."]}),"\n",(0,t.jsxs)(n.li,{children:["Add relevant ",(0,t.jsx)(n.code,{children:"categories"}),", ",(0,t.jsx)(n.code,{children:"architectures"}),", and exposed services (e.g., API endpoints)."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"simplified-dockerfile",children:"Simplified Dockerfile"}),"\n",(0,t.jsxs)(n.p,{children:["Here\u2019s a simplified version of the Dockerfile inside the ",(0,t.jsx)(n.code,{children:"geth"})," directory:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-Dockerfile",children:'ARG UPSTREAM_VERSION\n\nFROM ethereum/client-go:${UPSTREAM_VERSION}\n\nCOPY /security /security\nCOPY entrypoint.sh /usr/local/bin/entrypoint.sh\n\n# Additional commands or package installation\n\nENTRYPOINT ["/usr/local/bin/entrypoint.sh"]\n'})}),"\n",(0,t.jsx)(n.h3,{id:"simplified-entrypointsh",children:"Simplified entrypoint.sh"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"entrypoint.sh"})," script is responsible for setting up the environment and running the application. Here\u2019s a simplified version:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/sh\n\n# Additional logic related to JWT token\n\n# Start the Geth process (add any flags you consider relevant)\nexec geth --authrpc.jwtsecret ${JWT_PATH} ${EXTRA_FLAGS}\n"})}),"\n",(0,t.jsx)(n.h2,{id:"step-3-build-the-package",children:"Step 3: Build the package"}),"\n",(0,t.jsx)(n.p,{children:"Once all the necessary customizations are made, you can build your package by running the following command while connected to your Dappnode box:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npx @dappnode/dappnodesdk@latest build\n"})}),"\n",(0,t.jsx)(n.p,{children:"This will package your service, making it ready for installation on a Dappnode machine. Once you get the package hash, you just have to paste it into the Dappstore search bar to download it."}),"\n",(0,t.jsx)(n.h2,{id:"step-4-publish-the-package",children:"Step 4: Publish the package"}),"\n",(0,t.jsx)(n.p,{children:"Publishing the package is optional; you can install and use the package locally after building it. However, if you want the package to be available in the public Dappstore for other users to discover and install, publishing is required. To publish the package, start by running the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npx @dappnode/dappnodesdk@latest publish --type= --eth-provider= --content-provider= --developer-address=\n"})}),"\n",(0,t.jsx)(n.p,{children:"This command will return a link where you can perform the transaction to publish the package."}),"\n",(0,t.jsx)(n.h3,{id:"naming-conventions-for-packages",children:"Naming conventions for packages"}),"\n",(0,t.jsx)(n.p,{children:"All package names must follow this convention:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"..dappnode.eth\n"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"DNP: This suffix is reserved for official Dappnode packages and must be approved by the Dappnode Association."}),"\n",(0,t.jsx)(n.li,{children:"Public: This suffix is for community-contributed packages that can be published by anyone."}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"automating-publication-with-github-actions",children:"Automating Publication with GitHub Actions"}),"\n",(0,t.jsxs)(n.p,{children:["If the package source code is hosted on GitHub, you can automate the publishing process by setting up GitHub Actions. Use the workflows ",(0,t.jsx)(n.a,{href:"/docs/dev/github-actions/overview",children:"here"})," to integrate publishing workflows."]})]})}function p(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>c});var a=i(96540);const t={},o=a.createContext(t);function s(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/79d1f143.95846822.js b/assets/js/79d1f143.95846822.js
new file mode 100644
index 000000000..a9fb94d50
--- /dev/null
+++ b/assets/js/79d1f143.95846822.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[2046],{52828:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>a,default:()=>l,frontMatter:()=>s,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"user/dappnode-app/overview","title":"Overview","description":"The Dappnode app is a new form of interaction with Dappnode from mobile and desktop devices. It helps users to enter the Dappmanager remotely and get notified about the hardware status and the staking performance.","source":"@site/docs/user/dappnode-app/overview.md","sourceDirName":"user/dappnode-app","slug":"/user/dappnode-app/overview","permalink":"/docs/user/dappnode-app/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/dappnode-app/overview.md","tags":[],"version":"current","frontMatter":{"title":"Overview","llm_description":"Dappnode PWA app for mobile/desktop: remote management, notifications, and staking configuration."},"sidebar":"userSidebar","previous":{"title":"Devices","permalink":"/docs/user/notifications/devices"},"next":{"title":"How To Install Dappnode App","permalink":"/docs/user/dappnode-app/how-to-install"}}');var r=t(74848),i=t(28453);const s={title:"Overview",llm_description:"Dappnode PWA app for mobile/desktop: remote management, notifications, and staking configuration."},a="Overview",p={},d=[{value:"Benefits",id:"benefits",level:3}];function c(e){const n={h1:"h1",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"overview",children:"Overview"})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Dappnode app"})," is a new form of interaction with Dappnode from ",(0,r.jsx)(n.strong,{children:"mobile and desktop devices"}),". It helps users to enter the Dappmanager remotely and get notified about the hardware status and the staking performance."]}),"\n",(0,r.jsx)(n.p,{children:"The Dappnode App is a Progressive Web App (PWA) that can be installed as an application in mobile and desktop. It connects to your Dappnode through VPN to let you execute all the actions to manage your Dappnode remotely."}),"\n",(0,r.jsx)(n.h3,{id:"benefits",children:"Benefits"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Use the ",(0,r.jsx)(n.strong,{children:"Dappmanager in your mobile phone"})," in a seamless experience."]}),"\n",(0,r.jsxs)(n.li,{children:["Receive ",(0,r.jsx)(n.strong,{children:"notifications"})," of your Dappnode and your validators to monitor its performance."]}),"\n",(0,r.jsxs)(n.li,{children:["Configure the ",(0,r.jsx)(n.strong,{children:"staking clients remotely"})," from your mobile"]}),"\n"]})]})}function l(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var o=t(96540);const r={},i=o.createContext(r);function s(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/7ac2bc42.a24d0c84.js b/assets/js/7ac2bc42.a24d0c84.js
new file mode 100644
index 000000000..7a15936db
--- /dev/null
+++ b/assets/js/7ac2bc42.a24d0c84.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4555],{16365:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>a,contentTitle:()=>r,default:()=>f,frontMatter:()=>c,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"user/notifications/settings","title":"\ud83d\udee0\ufe0f Notifications Settings","description":"In the settings section you can configure the type of notification you would like to receive per package.","source":"@site/docs/user/notifications/settings.md","sourceDirName":"user/notifications","slug":"/user/notifications/settings","permalink":"/docs/user/notifications/settings","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/notifications/settings.md","tags":[],"version":"current","frontMatter":{"title":"\ud83d\udee0\ufe0f Notifications Settings","llm_description":"Configure notification preferences per package with master switch and threshold sliders."},"sidebar":"userSidebar","previous":{"title":"Inbox","permalink":"/docs/user/notifications/inbox"},"next":{"title":"Legacy","permalink":"/docs/user/notifications/legacy"}}');var s=i(74848),o=i(28453);const c={title:"\ud83d\udee0\ufe0f Notifications Settings",llm_description:"Configure notification preferences per package with master switch and threshold sliders."},r="\ud83d\udee0\ufe0f Notifications Settings",a={},l=[];function d(t){const e={h1:"h1",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.header,{children:(0,s.jsx)(e.h1,{id:"\ufe0f-notifications-settings",children:"\ud83d\udee0\ufe0f Notifications Settings"})}),"\n",(0,s.jsx)(e.p,{children:"In the settings section you can configure the type of notification you would like to receive per package."}),"\n",(0,s.jsxs)(e.p,{children:["\ud83e\udde9 ",(0,s.jsx)(e.strong,{children:"Notifications master switch:"})," Enable/disable all notifications."]}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.strong,{children:"\ud83d\udce6 Package-Level Configuration"})}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:["Package Switch: Enable/disable notifications in the ",(0,s.jsx)(e.strong,{children:"package"})]}),"\n",(0,s.jsx)(e.li,{children:"Customize which types of notifications are active"}),"\n",(0,s.jsxs)(e.li,{children:["Set thresholds with a ",(0,s.jsx)(e.strong,{children:"slider"})," (e.g., temperature limit before alert)"]}),"\n"]}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"Notifications_settings",src:i(77255).A+"",width:"1906",height:"1080"})})]})}function f(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(d,{...t})}):d(t)}},77255:(t,e,i)=>{i.d(e,{A:()=>n});const n=i.p+"assets/images/notifications_settings-f79b6aae5ea6354af4b6f7989fb9268c.png"},28453:(t,e,i)=>{i.d(e,{R:()=>c,x:()=>r});var n=i(96540);const s={},o=n.createContext(s);function c(t){const e=n.useContext(o);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:c(t.components),n.createElement(o.Provider,{value:e},t.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/7adecbd1.24bb4260.js b/assets/js/7adecbd1.24bb4260.js
new file mode 100644
index 000000000..fde4dde4f
--- /dev/null
+++ b/assets/js/7adecbd1.24bb4260.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8244],{97969:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"user/rollups/aztec","title":"\ud83d\ude80 Becoming an Aztec Sequencer with DAppNode","description":"Your comprehensive guide to setting up and joining the Aztec network as a sequencer using DAppNode infrastructure. Let\'s get you sequencing! \ud83c\udfaf","source":"@site/docs/user/rollups/aztec.md","sourceDirName":"user/rollups","slug":"/user/rollups/aztec","permalink":"/docs/user/rollups/aztec","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/rollups/aztec.md","tags":[],"version":"current","frontMatter":{"title":"\ud83d\ude80 Becoming an Aztec Sequencer with DAppNode","llm_description":"Step-by-step guide to becoming an Aztec sequencer using DAppNode infrastructure."},"sidebar":"userSidebar","previous":{"title":"Optimism","permalink":"/docs/user/rollups/optimism"},"next":{"title":"Overview","permalink":"/docs/user/packages/understanding-dappnode-packages/overview"}}');var r=n(74848),o=n(28453);const a={title:"\ud83d\ude80 Becoming an Aztec Sequencer with DAppNode",llm_description:"Step-by-step guide to becoming an Aztec sequencer using DAppNode infrastructure."},i="\ud83d\ude80 Becoming an Aztec Sequencer with DAppNode",c={},d=[{value:"\ud83d\udce6 Phase 1: Install DAppNode Package",id:"-phase-1-install-dappnode-package",level:2},{value:"\ud83d\udd10 Phase 2: Generate Your Keystore",id:"-phase-2-generate-your-keystore",level:2},{value:"Step 1\ufe0f\u20e3: Install Aztec CLI on Your Local Machine",id:"step-1\ufe0f\u20e3-install-aztec-cli-on-your-local-machine",level:3},{value:"Step 2\ufe0f\u20e3: Add Aztec CLI to Your PATH",id:"step-2\ufe0f\u20e3-add-aztec-cli-to-your-path",level:3},{value:"Step 3\ufe0f\u20e3: Generate Your Keystore",id:"step-3\ufe0f\u20e3-generate-your-keystore",level:3},{value:"Step 4\ufe0f\u20e3: Upload Keystore to DAppNode",id:"step-4\ufe0f\u20e3-upload-keystore-to-dappnode",level:3},{value:"\u2705 Phase 3: Approve STAKE Token Spending",id:"-phase-3-approve-stake-token-spending",level:2},{value:"Step 1\ufe0f\u20e3: Execute the Approval Transaction",id:"step-1\ufe0f\u20e3-execute-the-approval-transaction",level:3},{value:"\ud83d\udcb0 Phase 4: Fund Your Attester",id:"-phase-4-fund-your-attester",level:2},{value:"Attester ETH Funding \ud83d\udcb8",id:"attester-eth-funding-",level:3},{value:"\ud83c\udf96\ufe0f Phase 5: Join as a Sequencer",id:"\ufe0f-phase-5-join-as-a-sequencer",level:2},{value:"\ud83d\udd12 Security Best Practices",id:"-security-best-practices",level:2},{value:"\ud83c\udd98 Troubleshooting",id:"-troubleshooting",level:2},{value:"\ud83c\udfaf You've Got This",id:"-youve-got-this",level:2}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"-becoming-an-aztec-sequencer-with-dappnode",children:"\ud83d\ude80 Becoming an Aztec Sequencer with DAppNode"})}),"\n",(0,r.jsx)(t.p,{children:"Your comprehensive guide to setting up and joining the Aztec network as a sequencer using DAppNode infrastructure. Let's get you sequencing! \ud83c\udfaf"}),"\n",(0,r.jsx)(t.hr,{}),"\n",(0,r.jsx)(t.h2,{id:"-phase-1-install-dappnode-package",children:"\ud83d\udce6 Phase 1: Install DAppNode Package"}),"\n",(0,r.jsx)(t.p,{children:"Start by grabbing the Aztec package from the DAppStore. This sets up your sequencer environment all nice and integrated with your DAppNode setup."}),"\n",(0,r.jsx)(t.hr,{}),"\n",(0,r.jsx)(t.h2,{id:"-phase-2-generate-your-keystore",children:"\ud83d\udd10 Phase 2: Generate Your Keystore"}),"\n",(0,r.jsx)(t.h3,{id:"step-1\ufe0f\u20e3-install-aztec-cli-on-your-local-machine",children:"Step 1\ufe0f\u20e3: Install Aztec CLI on Your Local Machine"}),"\n",(0,r.jsx)(t.p,{children:"Download and install the Aztec Command Line Interface (it's quick, I promise):"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"bash -i <(curl -s https://install.aztec.network)\n"})}),"\n",(0,r.jsx)(t.h3,{id:"step-2\ufe0f\u20e3-add-aztec-cli-to-your-path",children:"Step 2\ufe0f\u20e3: Add Aztec CLI to Your PATH"}),"\n",(0,r.jsx)(t.p,{children:"Make the Aztec CLI globally accessible by adding it to your shell configuration:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"echo 'export PATH=\"$HOME/.aztec/bin:$PATH\"' >> ~/.bashrc\nsource ~/.bashrc\n"})}),"\n",(0,r.jsx)(t.h3,{id:"step-3\ufe0f\u20e3-generate-your-keystore",children:"Step 3\ufe0f\u20e3: Generate Your Keystore"}),"\n",(0,r.jsxs)(t.p,{children:["Time to create your secure keystore! \ud83d\udee1\ufe0f You can go with either an automatically generated 12-word mnemonic but ",(0,r.jsx)(t.strong,{children:"we strongly recommend a 24 words mnemonic"})," for maximum security. Treat it like your most prized possession\u2014store it securely in a password manager or encrypted vault and never share it with a soul!"]}),"\n",(0,r.jsxs)(t.p,{children:["For all the details on keystore generation, check out the ",(0,r.jsx)(t.a,{href:"https://docs.aztec.network/devnet/the_aztec_network/operation/keystore",children:"official Aztec keystore documentation"}),"."]}),"\n",(0,r.jsx)(t.p,{children:"Example:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:'aztec validator-keys new \\\n --fee-recipient 0x0000000000000000000000000000000000000000000000000000000000000000 \\\n --staker-output \\\n --gse-address 0xfb243b9112bb65785a4a8edaf32529accf003614 \\ # Check in Aztec\'s documentation for the correct GSE address\n --mnemonic "" \\\n --l1-rpc-urls http://geth.sepolia-geth.dappnode:8545 \\ # or any execution RPC\n --data-dir ./\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Please note that ",(0,r.jsx)(t.code,{children:"--fee-recipient"})," needs to be an Aztec address, not an Ethereum address. It's OK to leave it as 0x00... for now because there are no txs in the Ignition phase (so no tx fees) and can be changed later."]}),"\n",(0,r.jsx)(t.h3,{id:"step-4\ufe0f\u20e3-upload-keystore-to-dappnode",children:"Step 4\ufe0f\u20e3: Upload Keystore to DAppNode"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["Navigate to your ",(0,r.jsx)(t.strong,{children:"DAppNode Packages Tab"})," \ud83d\udcc1"]}),"\n",(0,r.jsxs)(t.li,{children:["Open the ",(0,r.jsx)(t.strong,{children:"Aztec package"})," \ud83e\udd86"]}),"\n",(0,r.jsxs)(t.li,{children:["Access the ",(0,r.jsx)(t.strong,{children:"File Manager"})," tab \ud83d\udcc1"]}),"\n",(0,r.jsxs)(t.li,{children:["Upload your newly generated keystore file to the ",(0,r.jsx)(t.code,{children:"/keystore"})," directory"]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"Boom! \ud83d\udca5 Your keystore is now locked and loaded, ready for your Aztec sequencer to use."}),"\n",(0,r.jsx)(t.p,{children:"If your logs show this error:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-log",children:'[17:55:44.683] WARN: node:blob-sink:client Unable to get blob sidecar for XXXXXXX: Not Found (404) {"status":404,"statusText":"Not Found","body":"{\\"message\\":\\"Block not found: the node does not custody enough data columns to reconstruct blobs - please start the beacon node with the `--subscribe-all-data-subnets` flag to ensure this call to succeed, or retry later if it is already the case\\",\\"code\\":404}"}\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Make sure to add ",(0,r.jsx)(t.code,{children:"--subscribe-all-data-subnets"})," in your Beacon Chain package:"]}),"\n",(0,r.jsx)("img",{width:"1227",height:"528",alt:"Screenshot 2025-11-12 at 15 00 40",src:"https://github.com/user-attachments/assets/2d319f55-72e3-4ba4-a09b-b642b0c02369"}),"\n",(0,r.jsx)("img",{width:"1051",height:"298",alt:"Screenshot 2025-11-12 at 14 58 47",src:"https://github.com/user-attachments/assets/29228b57-ba10-4a59-bb30-fb31a3442e48"}),"\n",(0,r.jsx)(t.hr,{}),"\n",(0,r.jsx)(t.h2,{id:"-phase-3-approve-stake-token-spending",children:"\u2705 Phase 3: Approve STAKE Token Spending"}),"\n",(0,r.jsx)(t.p,{children:"Before you can join the party as a sequencer, you gotta approve the Aztec rollup contract to spend 200,000 STAKE tokens. That's your ticket to the show! \ud83c\udfab"}),"\n",(0,r.jsx)(t.p,{children:"In order to perform this step you will need to install foundry in your computer (there will be a UI later on to perform this step, but for now you'll need to use CLI)."}),"\n",(0,r.jsxs)(t.p,{children:["You can install foundry following ",(0,r.jsx)(t.a,{href:"https://github.com/foundry-rs/foundry",children:"the instructions in their repo"})]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"curl -L https://foundry.paradigm.xyz | bash\n"})}),"\n",(0,r.jsx)(t.h3,{id:"step-1\ufe0f\u20e3-execute-the-approval-transaction",children:"Step 1\ufe0f\u20e3: Execute the Approval Transaction"}),"\n",(0,r.jsx)(t.p,{children:"Now execute the approval transaction from within the container:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:'cast send 0x139d2a7a0881e16332d7D1F8DB383A4507E1Ea7A \\\n "approve(address,uint256)" \\\n 0xebd99ff0ff6677205509ae73f93d0ca52ac85d67 \\\n 200000ether \\\n --private-key "$PRIVATE_KEY_OF_OLD_SEQUENCER" \\\n --rpc-url http://execution.sepolia.dncore.dappnode:8545\n'})}),"\n",(0,r.jsx)(t.p,{children:"Sit tight \u23f3 and wait for the transaction to be confirmed on-chain. Grab some coffee \u2615 while you wait!"}),"\n",(0,r.jsx)(t.hr,{}),"\n",(0,r.jsx)(t.h2,{id:"-phase-4-fund-your-attester",children:"\ud83d\udcb0 Phase 4: Fund Your Attester"}),"\n",(0,r.jsxs)(t.p,{children:["Your attester address has been generated with the command in Step 3\ufe0f\u20e3. Specifically in the ",(0,r.jsx)(t.code,{children:"keyn_attestern_staker_output.json"}),", where ",(0,r.jsx)(t.code,{children:"n"})," is the index of the key you've generated (1, for most of us who only generate 1).\nOpen the ",(0,r.jsx)(t.code,{children:"...staker_output.json"}),' file and you will find the address in the "attester" field.']}),"\n",(0,r.jsx)(t.h3,{id:"attester-eth-funding-",children:"Attester ETH Funding \ud83d\udcb8"}),"\n",(0,r.jsxs)(t.p,{children:["Make sure your Attester Ethereum address has enough ETH to cover gas fees. Grab some from a testnet faucet or transfer from your funded account.\nFaucets for testnet ",(0,r.jsx)(t.a,{href:"https://sepolia-faucet.pk910.de/",children:"here"})," and ",(0,r.jsx)(t.a,{href:"https://cloud.google.com/application/web3/faucet/ethereum/sepolia",children:"here"})]}),"\n",(0,r.jsx)(t.hr,{}),"\n",(0,r.jsx)(t.h2,{id:"\ufe0f-phase-5-join-as-a-sequencer",children:"\ud83c\udf96\ufe0f Phase 5: Join as a Sequencer"}),"\n",(0,r.jsx)(t.p,{children:"Alright, moment of truth! \ud83c\udfac Let's register your validator on the Aztec network using the CLI."}),"\n",(0,r.jsx)(t.p,{children:"Run this bad boy replacing the placeholders with your data and become a sequencer:"}),"\n",(0,r.jsxs)(t.p,{children:["Note: ",(0,r.jsx)(t.code,{children:"bls-secret-key"})," can be found in the file ",(0,r.jsx)(t.code,{children:"key1.json"}),' under the "bls" section.']}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"aztec \\\n add-l1-validator \\\n --l1-rpc-urls http://execution.sepolia.dncore.dappnode:8545 \\\n --network testnet \\\n --private-key $PRIVATE_KEY_OF_OLD_SEQUENCER \\\n --attester $ETH_ATTESTER_ADDRESS \\\n --withdrawer $ANY_ETH_ADDRESS \\\n --bls-secret-key $BLS_ATTESTER_PRIV_KEY \\\n --rollup 0xebd99ff0ff6677205509ae73f93d0ca52ac85d67\n"})}),"\n",(0,r.jsx)(t.p,{children:"Success! \ud83c\udf89 Your sequencer is now registered on the Aztec testnet and ready to start producing blocks. Welcome to the sequencer club! \ud83c\udfc6"}),"\n",(0,r.jsxs)(t.p,{children:["You can check the status of your sequencer in ",(0,r.jsx)(t.a,{href:"https://testnet.dashtec.xyz",children:"Dashtec"}),'. Remember that what is called "Sequencer address" in the dashboard is the "Attester" address in your ',(0,r.jsx)(t.code,{children:"...staker_output.json"})," file."]}),"\n",(0,r.jsx)(t.hr,{}),"\n",(0,r.jsx)(t.h2,{id:"-security-best-practices",children:"\ud83d\udd12 Security Best Practices"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"\ud83d\udeab Never ever share"})," your mnemonic or private keys with anyone, period"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"\ud83d\udd10 Lock down that mnemonic"})," \u2014 use a dedicated password manager or encrypted storage"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"\ud83d\udcbc Hardware wallet time"})," \u2014 consider using hardware wallets for your withdrawal and attester addresses"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"\ud83e\uddea Test first"})," \u2014 run everything through testnet before going anywhere near mainnet"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"\ud83d\udc40 Keep an eye"})," on your sequencer logs regularly through DAppNode's dashboard"]}),"\n"]}),"\n",(0,r.jsx)(t.hr,{}),"\n",(0,r.jsx)(t.h2,{id:"-troubleshooting",children:"\ud83c\udd98 Troubleshooting"}),"\n",(0,r.jsx)(t.p,{children:"Running into issues? Here's a quick troubleshooting guide:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Keystore Upload Fails"})," \ud83d\udce4 \u2014 Make sure the file's in proper JSON format and has the right permissions"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"SSH Connection Failed"})," \ud83d\udd13 \u2014 Verify your DAppNode is running and accessible on your network, check firewall settings"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Docker Container Not Found"})," \ud83d\udc33 \u2014 Ensure the Aztec package is installed and running, check the package name matches your network (e.g., ",(0,r.jsx)(t.code,{children:"aztec-sepolia"}),")"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Approval Transaction Reverts"})," \u274c \u2014 Check that you've got enough ETH for gas and sufficient STAKE balance"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"CLI Connection Errors"})," \ud83d\udd0c \u2014 Verify your ETH RPC URL is actually reachable and the network's responding from within the container"]}),"\n"]}),"\n",(0,r.jsx)(t.hr,{}),"\n",(0,r.jsx)(t.h2,{id:"-youve-got-this",children:"\ud83c\udfaf You've Got This"}),"\n",(0,r.jsx)(t.p,{children:"You're all set to become an Aztec sequencer. Follow these steps carefully, keep your keys safe, and you'll be sequencing like a pro in no time. Happy validating! \ud83d\ude80\u2728"})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>i});var s=n(96540);const r={},o=s.createContext(r);function a(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/7b2e8791.91d4cc08.js b/assets/js/7b2e8791.91d4cc08.js
new file mode 100644
index 000000000..da9563193
--- /dev/null
+++ b/assets/js/7b2e8791.91d4cc08.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[642],{53555:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>r,contentTitle:()=>a,default:()=>c,frontMatter:()=>d,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"dev/sdk/commands","title":"Main commands","description":"This page covers the top three functionalities of DappnodeSDK: init, build, and publish. Each command plays a crucial role in the development and deployment process of dappnode packages (DNPs).","source":"@site/docs/dev/sdk/commands.md","sourceDirName":"dev/sdk","slug":"/dev/sdk/commands","permalink":"/docs/dev/sdk/commands","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/sdk/commands.md","tags":[],"version":"current","frontMatter":{"title":"Main commands","llm_description":"Documentation for SDK init, build, and publish commands with options."},"sidebar":"devSidebar","previous":{"title":"Overview","permalink":"/docs/dev/sdk/overview"},"next":{"title":"SDK-Publish","permalink":"/docs/dev/sdk/sdk-publish"}}');var s=o(74848),t=o(28453);const d={title:"Main commands",llm_description:"Documentation for SDK init, build, and publish commands with options."},a="Main commands",r={},l=[{value:"init",id:"init",level:2},{value:"build",id:"build",level:2},{value:"publish",id:"publish",level:2}];function p(e){const n={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"main-commands",children:"Main commands"})}),"\n",(0,s.jsxs)(n.p,{children:["This page covers the top three functionalities of DappnodeSDK: ",(0,s.jsx)(n.code,{children:"init"}),", ",(0,s.jsx)(n.code,{children:"build"}),", and ",(0,s.jsx)(n.code,{children:"publish"}),". Each command plays a crucial role in the development and deployment process of dappnode packages (DNPs)."]}),"\n",(0,s.jsx)(n.h2,{id:"init",children:(0,s.jsx)(n.code,{children:"init"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"init"})," command allows you to initialize a new DAppNodePackage (DNP) repository. This is the first step when creating a new DNP. To use the ",(0,s.jsx)(n.code,{children:"init"})," command, run the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"npx @dappnode/dappnodesdk init\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The following are all the possible ",(0,s.jsx)(n.code,{children:"init"})," options:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-Options:",children:' --dir, --directory Change the base directory [string] [default: "./"]\n --compose_file_name Compose file for docker-compose\n [string] [default: "docker-compose.yml"]\n --silent Silence output to terminal [boolean]\n --verbose, --debug Show more output to terminal [boolean]\n -y, --yes Answer yes or the default option to all initializatio\n n questions [boolean]\n -f, --force Overwrite previous project if necessary [boolean]\n -h, --help Show help [boolean]\n -v, --version Show version number [boolean]\n'})}),"\n",(0,s.jsx)(n.h2,{id:"build",children:(0,s.jsx)(n.code,{children:"build"})}),"\n",(0,s.jsx)(n.p,{children:"The build command is used to build a new version of a DNP. It generates the IPFS hash for the package. To use the build command, run the following:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"npx @dappnode/dappnodesdk build\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The following are all the possible ",(0,s.jsx)(n.code,{children:"build"})," options:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-Options:",children:' --dir, --directory Change the base directory [string] [default: "./"]\n --compose_file_name Compose file for docker-compose\n [string] [default: "docker-compose.yml"]\n --silent Silence output to terminal [boolean]\n --verbose, --debug Show more output to terminal [boolean]\n -p, --provider Specify an ipfs provider: "dappnode" (default), "infu\n ra", "localhost:5002" [default: "dappnode"]\n -t, --timeout Overrides default build timeout: "15h", "20min 15s",\n "5000". Specs npmjs.com/package/timestring\n [default: "60min"]\n --skip_save For testing only: do not save image to disk [boolean]\n --skip_upload For testing only: do not upload image from disk\n [boolean]\n -h, --help Show help [boolean]\n -v, --version Show version number [boolean]\n'})}),"\n",(0,s.jsx)(n.h2,{id:"publish",children:(0,s.jsx)(n.code,{children:"publish"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"publish"})," command is used to publish a new version of the DNP in an Aragon Package Manager Repository. To use the ",(0,s.jsx)(n.code,{children:"publish"})," command, run the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"npx @dappnode/dappnodesdk publish\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The following are all the possible ",(0,s.jsx)(n.code,{children:"publish"})," options:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-Options:",children:' --dir, --directory Change the base directory [string] [default: "./"]\n --compose_file_name Compose file for docker-compose\n [string] [default: "docker-compose.yml"]\n --silent Silence output to terminal [boolean]\n --verbose, --debug Show more output to terminal [boolean]\n --type Semver update type. Can also be provided with env\n RELEASE_TYPE=[type] or via TRAVIS_TAG=release (pat\n ch), TRAVIS_TAG=release/[type]\n [string] [choices: "major", "minor", "patch"]\n -p, --provider Specify a provider (overwrittes content_provider a\n nd eth_provider): "dappnode" (default), "infura",\n "http://localhost:8545" [string]\n --eth_provider Specify an eth provider: "dappnode" (default), "in\n fura", "localhost:8545"\n [string] [default: "dappnode"]\n --content_provider Specify an ipfs provider: "dappnode" (default), "i\n nfura", "http://localhost:5001"\n [string] [default: "dappnode"]\n --upload_to Specify where to upload the release\n [choices: "ipfs", "swarm"] [default: "ipfs"]\n -a, --developer_address If there is no existing repo for this DNP the publ\n ish command needs a developer address. If it is no\n t provided as an option a prompt will request it\n [string]\n -t, --timeout Overrides default build timeout: "15h", "20min 15s\n ", "5000". Specs npmjs.com/package/timestring\n [string]\n --github_release Publish the release on the Github repo specified i\n n the manifest. Requires a GITHUB_TOKEN ENV to aut\n henticate [boolean]\n --dappnode_team_preset Specific set of options used for internal DAppNode\n releases. Caution: options may change without not\n ice. [boolean]\n -h, --help Show help [boolean]\n -v, --version Show version number [boolean]```\n'})})]})}function c(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},28453:(e,n,o)=>{o.d(n,{R:()=>d,x:()=>a});var i=o(96540);const s={},t=i.createContext(s);function d(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/7ef68c32.38337c9e.js b/assets/js/7ef68c32.38337c9e.js
new file mode 100644
index 000000000..5c96e4776
--- /dev/null
+++ b/assets/js/7ef68c32.38337c9e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8395],{41096:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>u});const i=JSON.parse('{"id":"dao/node-stream","title":"NODEstream","description":"\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\\"","source":"@site/docs/dao/node-stream.md","sourceDirName":"dao","slug":"/dao/node-stream","permalink":"/docs/dao/node-stream","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dao/node-stream.md","tags":[],"version":"current","frontMatter":{"title":"NODEstream","llm_description":"NODEstream vesting program for gradual token distribution to participants."}}');var n=o(74848),a=o(28453);const r={title:"NODEstream",llm_description:"NODEstream vesting program for gradual token distribution to participants."},s="NODEstream",d={},u=[];function c(e){const t={h1:"h1",header:"header",p:"p",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"nodestream",children:"NODEstream"})}),"\n",(0,n.jsx)(t.p,{children:'"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."'})]})}function l(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},28453:(e,t,o)=>{o.d(t,{R:()=>r,x:()=>s});var i=o(96540);const n={},a=i.createContext(n);function r(e){const t=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(a.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/814f3328.9ae4682c.js b/assets/js/814f3328.9ae4682c.js
new file mode 100644
index 000000000..bbb48a24c
--- /dev/null
+++ b/assets/js/814f3328.9ae4682c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[7472],{55513:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Welcome","permalink":"/blog/welcome","unlisted":false,"date":"2021-08-26T00:00:00.000Z"},{"title":"MDX Blog Post","permalink":"/blog/mdx-blog-post","unlisted":false,"date":"2021-08-01T00:00:00.000Z"},{"title":"Long Blog Post","permalink":"/blog/long-blog-post","unlisted":false,"date":"2019-05-29T00:00:00.000Z"},{"title":"First Blog Post","permalink":"/blog/first-blog-post","unlisted":false,"date":"2019-05-28T00:00:00.000Z"}]}')}}]);
\ No newline at end of file
diff --git a/assets/js/82063238.2262047e.js b/assets/js/82063238.2262047e.js
new file mode 100644
index 000000000..2d7be4344
--- /dev/null
+++ b/assets/js/82063238.2262047e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[7181],{81783:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"dev/references/docker-compose","title":"Docker compose file","description":"Dappnode packages are built upon Docker containers. The heart of defining how these containers run and interact lies in the docker-compose.yml file. In this guide, we will explain the typical structure of the docker-compose.yml file for a Dappnode package.","source":"@site/docs/dev/references/docker-compose.md","sourceDirName":"dev/references","slug":"/dev/references/docker-compose","permalink":"/docs/dev/references/docker-compose","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/references/docker-compose.md","tags":[],"version":"current","frontMatter":{"title":"Docker compose file","llm_description":"Reference for docker-compose.yml structure, environment variables, and build arguments."},"sidebar":"devSidebar","previous":{"title":"SDK-Publish","permalink":"/docs/dev/sdk/sdk-publish"},"next":{"title":"Dappnode Manifest","permalink":"/docs/dev/references/manifest"}}');var r=s(74848),o=s(28453);const t={title:"Docker compose file",llm_description:"Reference for docker-compose.yml structure, environment variables, and build arguments."},l="Docker compose file",a={},c=[{value:"Basic Example",id:"basic-example",level:2},{value:"Complex Example",id:"complex-example",level:2},{value:"Notable Features",id:"notable-features",level:3},{value:"Environment Variables",id:"environment-variables",level:4},{value:"The UPSTREAM_VERSION Argument",id:"the-upstream_version-argument",level:4},{value:"The EXTRA_OPTS Environment Variable",id:"the-extra_opts-environment-variable",level:4}];function d(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"docker-compose-file",children:"Docker compose file"})}),"\n",(0,r.jsxs)(n.p,{children:["Dappnode packages are built upon Docker containers. The heart of defining how these containers run and interact lies in the ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file. In this guide, we will explain the typical structure of the ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file for a Dappnode package."]}),"\n",(0,r.jsx)(n.h2,{id:"basic-example",children:"Basic Example"}),"\n",(0,r.jsxs)(n.p,{children:["A simple ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file looks like this:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'version: "3.5"\nservices:\n test.public.dappnode.eth:\n build: .\n image: "test.public.dappnode.eth:0.1.0"\n restart: unless-stopped\n'})}),"\n",(0,r.jsx)(n.p,{children:"This example illustrates the basic elements, which include the version of the docker-compose file, services, and the service's basic attributes."}),"\n",(0,r.jsx)(n.h2,{id:"complex-example",children:"Complex Example"}),"\n",(0,r.jsxs)(n.p,{children:["A more intricate ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file could look like this:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'version: "3.5"\nservices:\n beacon-chain:\n build:\n context: beacon-chain\n args:\n UPSTREAM_VERSION: v4.0.7\n volumes:\n - "beacon-chain-data:/data"\n ports:\n - "12603:12603/tcp"\n - "12603:12603/udp"\n restart: unless-stopped\n environment:\n P2P_PORT: 12603\n CHECKPOINT_SYNC_URL: "https://checkpoints.mainnet.lukso.network"\n EXTRA_OPTS: ""\n LOG_VERBOSITY: info\n MIN_SYNC_PEERS: "0"\n MAX_PEERS: "250"\n SUBSCRIBE_ALL_SUBNETS: "true"\n validator:\n build:\n context: validator\n args:\n UPSTREAM_VERSION: v4.0.7\n volumes:\n - "validator-data:/data"\n restart: unless-stopped\n environment:\n LOG_VERBOSITY: info\n GRAFFITI: validating_from_DAppNode\n ENABLE_DOPPELGANGER: "true"\n EXTRA_OPTS: ""\nvolumes:\n beacon-chain-data: {}\n validator-data: {}\n'})}),"\n",(0,r.jsx)(n.p,{children:"In the complex example, you'll find:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Multiple services (like ",(0,r.jsx)(n.code,{children:"beacon-chain"})," and ",(0,r.jsx)(n.code,{children:"validator"}),")."]}),"\n",(0,r.jsxs)(n.li,{children:["Build arguments, such as the relevant ",(0,r.jsx)(n.code,{children:"UPSTREAM_VERSION"}),"."]}),"\n",(0,r.jsx)(n.li,{children:"Defined volumes, ports, and environment variables."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"notable-features",children:"Notable Features"}),"\n",(0,r.jsx)(n.h4,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["All environment variables (",(0,r.jsx)(n.code,{children:"envs"}),") defined in the ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file will be visible in the package config post-installation. Users can modify these."]}),"\n",(0,r.jsxs)(n.li,{children:["If the package has a ",(0,r.jsx)(n.code,{children:"setup-wizard"}),', those environment variables not set within it will be hidden by default in the configuration. Users can view these by selecting "Show advanced config".']}),"\n"]}),"\n",(0,r.jsxs)(n.h4,{id:"the-upstream_version-argument",children:["The ",(0,r.jsx)(n.code,{children:"UPSTREAM_VERSION"})," Argument"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"UPSTREAM_VERSION"})," argument is mandatory if you wish to leverage GitHub actions that automatically create PRs when there's a new release in the upstream repository."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the Dockerfile, ",(0,r.jsx)(n.code,{children:"UPSTREAM_VERSION"})," is usually declared and used like this:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-dockerfile",children:"ARG UPSTREAM_VERSION\nFROM consensys/teku:$UPSTREAM_VERSION\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.admonition,{type:"note",children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"upstreamVersion"})," and ",(0,r.jsx)(n.code,{children:"upstreamRepo"})," fields need to be defined in the ",(0,r.jsx)(n.code,{children:"dappnode_package.json"})," file for the GitHub actions to work. Here is an example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'{\n ...\n "upstreamVersion": "23.8.0",\n "upstreamRepo": "ConsenSys/teku",\n ...\n}\n'})})]}),"\n",(0,r.jsxs)(n.h4,{id:"the-extra_opts-environment-variable",children:["The ",(0,r.jsx)(n.code,{children:"EXTRA_OPTS"})," Environment Variable"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"EXTRA_OPTS"})," is an environment variable that allows users to add any flags that might not have been included by default."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Here's a typical use case for ",(0,r.jsx)(n.code,{children:"EXTRA_OPTS"})," in the entrypoint script:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"exec /opt/teku/bin/teku \\\n --network=prater \\\n ...(omitting other flags) \\\n --log-destination=CONSOLE \\\n $EXTRA_OPTS\n"})}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>l});var i=s(96540);const r={},o=i.createContext(r);function t(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8228022c.f7a10fbe.js b/assets/js/8228022c.f7a10fbe.js
new file mode 100644
index 000000000..fa992240b
--- /dev/null
+++ b/assets/js/8228022c.f7a10fbe.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[2836],{67759:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"dev/references/notifications","title":"Notifications File Reference (Comming soon)","description":"This document serves as a reference for the Notifications configuration file in DAppNode. It defines the structure, fields, and expected values based on the JSON Schema.","source":"@site/docs/dev/references/notifications.md","sourceDirName":"dev/references","slug":"/dev/references/notifications","permalink":"/docs/dev/references/notifications","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/references/notifications.md","tags":[],"version":"current","frontMatter":{"title":"Notifications File Reference (Comming soon)","llm_description":"Schema reference for notifications.yaml configuration using Gatus endpoints."},"sidebar":"devSidebar","previous":{"title":"Setup Wizard","permalink":"/docs/dev/references/setup-wizard"},"next":{"title":"Overview","permalink":"/docs/dev/package-development/overview"}}');var t=i(74848),o=i(28453);const r={title:"Notifications File Reference (Comming soon)",llm_description:"Schema reference for notifications.yaml configuration using Gatus endpoints."},d="Notifications File Reference (Comming soon)",c={},l=[{value:"Root Object",id:"root-object",level:2},{value:"(Gatus) endpoints (optional)",id:"gatus-endpoints-optional",level:3},{value:"Example (gatus) endpoints",id:"example-gatus-endpoints",level:4},{value:"customEndpoints (optional)",id:"customendpoints-optional",level:3},{value:"Example customEndpoints",id:"example-customendpoints",level:4},{value:"Updating the Notifications File",id:"updating-the-notifications-file",level:2},{value:"Notes",id:"notes",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"notifications-file-reference-comming-soon",children:"Notifications File Reference (Comming soon)"})}),"\n",(0,t.jsxs)(n.p,{children:["This document serves as a reference for the Notifications configuration file in DAppNode. It defines the structure, fields, and expected values based on the ",(0,t.jsx)(n.a,{href:"https://github.com/dappnode/DAppNode/raw/schema/notifications.schema.json",children:"JSON Schema"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h2,{id:"root-object",children:"Root Object"}),"\n",(0,t.jsx)(n.p,{children:"The root object defines the top-level structure and contains the following properties:"}),"\n",(0,t.jsxs)(n.h3,{id:"gatus-endpoints-optional",children:["(Gatus) ",(0,t.jsx)(n.code,{children:"endpoints"})," (optional)"]}),"\n",(0,t.jsxs)(n.p,{children:["The most common and easiest way to configure notifications in DAppNode is by using the ",(0,t.jsx)(n.a,{href:"https://github.com/TwiN/gatus",children:"Gatus"})," standard. To configure notifications using Gatus, you need to create a ",(0,t.jsx)(n.code,{children:"*notifications.yaml"})," file. This file must follow the standard defined in the ",(0,t.jsx)(n.a,{href:"https://docs.dappnode.io/docs/dev/references/notifications",children:"Gatus - notifications file reference"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Gatus monitors the endpoints you define and automatically triggers alerts with the desired notification payload. Additionally, you can benefit from Gatus features."}),"\n",(0,t.jsxs)(n.h4,{id:"example-gatus-endpoints",children:["Example (gatus) ",(0,t.jsx)(n.code,{children:"endpoints"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'endpoints:\n - name: "Mainnet ETH Node Syncing Check" # Notification title\n enabled: true\n group: "ethereum"\n url: "http://geth.dappnode:8545"\n method: "POST"\n body: |\n {"jsonrpc": "2.0", "id": 1, "method": "eth_syncing", "params": []}\n headers:\n Content-Type: "application/json"\n interval: "30s"\n conditions:\n - "[BODY].result == false"\n definition:\n title: "Mainnet ETH Node Synced Check" # Notifications - settings: title of the notification to be configured\n description: "Check if the Mainnet ETH Node is synced. You will receive a notification if the node is syncing and another one when it is synced." # Notifications - settings: description of the notification to be configured\n correlationId: "geth-eth-syncing" # Unique identifier for each notification endpoint\n isBanner: false \n priority: "medium"\n alerts:\n - type: custom\n enabled: true\n description: "Geth Ethereum Node syncing" # Notification description\n failure-threshold: 2\n success-threshold: 1\n send-on-resolved: true\n'})}),"\n",(0,t.jsx)(n.p,{children:"An array of configured notification endpoints. Each endpoint object includes:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"name"})})," (",(0,t.jsx)(n.code,{children:"string"}),", required): Unique name for the endpoint."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"enabled"})})," (",(0,t.jsx)(n.code,{children:"boolean"}),", required): Whether this endpoint is active."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"url"})})," (",(0,t.jsx)(n.code,{children:"string"}),", required): URL to send notifications to. Must match the pattern ",(0,t.jsx)(n.code,{children:"^(https?|ftp)://[^s/$.?#].[^s]*$"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"method"})})," (",(0,t.jsx)(n.code,{children:"string"}),", required): HTTP method to use. One of: ",(0,t.jsx)(n.code,{children:"GET"}),", ",(0,t.jsx)(n.code,{children:"POST"}),", ",(0,t.jsx)(n.code,{children:"PUT"}),", ",(0,t.jsx)(n.code,{children:"DELETE"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"conditions"})})," (",(0,t.jsx)(n.code,{children:"string[]"}),", required): Array of string expressions representing the conditions that trigger the alert."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"interval"})})," (",(0,t.jsx)(n.code,{children:"string"}),", required): Time between checks. Must match the pattern ",(0,t.jsx)(n.code,{children:"^[0-9]+[smhd]$"})," (e.g., ",(0,t.jsx)(n.code,{children:"10s"}),", ",(0,t.jsx)(n.code,{children:"5m"}),", ",(0,t.jsx)(n.code,{children:"1h"}),", ",(0,t.jsx)(n.code,{children:"1d"}),")."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"group"})})," (",(0,t.jsx)(n.code,{children:"string"}),", required): Group to which the endpoint belongs."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"correlationId"})})," (",(0,t.jsx)(n.code,{children:"string"}),", required): It is the unique identifier that links triggered and resolved notifications based on their endpoint."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"isBanner"})})," (",(0,t.jsx)(n.code,{children:"boolean"}),", required): Boolean that controls whether a banner displaying the notification appears at the top of the DAppManager UI. Should be set to ",(0,t.jsx)(n.code,{children:"true"})," only for relevant notifications."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"priority"})})," (",(0,t.jsx)(n.code,{children:"string"}),", required): Priority that will be displayed on the notification. One of: ",(0,t.jsx)(n.code,{children:"low"}),", ",(0,t.jsx)(n.code,{children:"medium"}),", ",(0,t.jsx)(n.code,{children:"high"}),", ",(0,t.jsx)(n.code,{children:"critical"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"alerts"})})," (",(0,t.jsx)(n.code,{children:"array"}),", required): List of alert configurations for this endpoint."]}),"\n",(0,t.jsx)(n.p,{children:"Each alert object includes:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"type"})})," (",(0,t.jsx)(n.code,{children:"string"}),", required): Alert type identifier."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"failure-threshold"})})," (",(0,t.jsx)(n.code,{children:"integer"}),", required): Number of consecutive failures before alert triggers."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"success-threshold"})})," (",(0,t.jsx)(n.code,{children:"integer"}),", required): Number of successful checks to mark alert as resolved."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"send-on-resolved"})})," (",(0,t.jsx)(n.code,{children:"boolean"}),", required): Whether to send a notification when the alert is resolved."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"description"})})," (",(0,t.jsx)(n.code,{children:"string"}),", required): Description of the alert."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"enabled"})})," (",(0,t.jsx)(n.code,{children:"boolean"}),", required): Whether this alert is enabled."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"definition"})})," (",(0,t.jsx)(n.code,{children:"object"}),", required): Defines the endpoint's purpose."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"title"})})," (",(0,t.jsx)(n.code,{children:"string"}),", required): Human-readable name."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"description"})})," (",(0,t.jsx)(n.code,{children:"string"}),", required): Detailed explanation."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"metric"})})," (",(0,t.jsx)(n.code,{children:"object"}),", optional): Optional metadata about the metric."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"min"})})," (",(0,t.jsx)(n.code,{children:"number"}),", optional): Minimum acceptable value."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"max"})})," (",(0,t.jsx)(n.code,{children:"number"}),", optional): Maximum acceptable value."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"unit"})})," (",(0,t.jsx)(n.code,{children:"string"}),", optional): Measurement unit (e.g., ",(0,t.jsx)(n.code,{children:"%"}),", ",(0,t.jsx)(n.code,{children:"ms"}),")."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsxs)(n.h3,{id:"customendpoints-optional",children:[(0,t.jsx)(n.code,{children:"customEndpoints"})," (optional)"]}),"\n",(0,t.jsx)(n.p,{children:"Defines custom metrics that are not covered by built-in endpoints. In cases where Gatus has limitations, you can create custom endpoints. These endpoints are responsible for sending notifications when required to the notifications package."}),"\n",(0,t.jsx)(n.p,{children:"To use custom endpoints, you should retrieve the user settings from the DAppManager API:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"curl -X GET \\\n http://dappmanager.dappnode/package-manifest/dms.dnp.dappnode.eth \\\n -H 'Content-Type: application/json'\n"})}),"\n",(0,t.jsx)(n.p,{children:"The response will include the manifest with user settings for custom endpoints:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "notifications": {\n "customEndpoints": [\n {\n "name": "string", // e.g., "Package updates notifications"\n "description": "string", // e.g., "Receive package updates notifications when a new version is available."\n "enabled": true // e.g., true\n }\n ]\n }\n}\n'})}),"\n",(0,t.jsxs)(n.h4,{id:"example-customendpoints",children:["Example ",(0,t.jsx)(n.code,{children:"customEndpoints"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'customEndpoints:\n - name: "Package updates notifications"\n isBanner: false\n correlationId: "dappmanager-update-pkg"\n description: "Receive package updates notifications when a new version is available."\n enabled: true\n'})}),"\n",(0,t.jsx)(n.p,{children:"Each object includes:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"enabled"})})," (",(0,t.jsx)(n.code,{children:"boolean"}),", required): Whether the custom endpoint is active."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"name"})})," (",(0,t.jsx)(n.code,{children:"string"}),", required): Unique name for the custom metric."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"description"})})," (",(0,t.jsx)(n.code,{children:"string"}),", required): Explanation of the custom metric."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"correlationId"})})," (",(0,t.jsx)(n.code,{children:"string"}),", required): It is the unique identifier that links triggered and resolved notifications based on their endpoint."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"isBanner"})})," (",(0,t.jsx)(n.code,{children:"boolean"}),", required): Boolean that controls whether a banner displaying the notification appears at the top of the DAppManager UI. Should be set to ",(0,t.jsx)(n.code,{children:"true"})," only for relevant notifications."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"metric"})})," (",(0,t.jsx)(n.code,{children:"object"}),", optional): Metric boundaries and unit.","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"treshold"})})," (",(0,t.jsx)(n.code,{children:"number"}),", optional): Threshold value to trigger alert (note: possibly a typo, intended to be ",(0,t.jsx)(n.code,{children:"threshold"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"min"})})," (",(0,t.jsx)(n.code,{children:"number"}),", optional): Minimum acceptable value."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"max"})})," (",(0,t.jsx)(n.code,{children:"number"}),", optional): Maximum acceptable value."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"unit"})})," (",(0,t.jsx)(n.code,{children:"string"}),", optional): Measurement unit."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h2,{id:"updating-the-notifications-file",children:"Updating the Notifications File"}),"\n",(0,t.jsxs)(n.p,{children:["If the package is already published and you want to change the notifications, you need to update the ",(0,t.jsx)(n.code,{children:"*notifications.yaml"})," file in the package repository. After making changes, you must publish a new version of the package for the updates to take effect."]}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsx)(n.p,{children:"Changing the endpoint name will create a new notification and the old one will be removed. This is because the notification is identified by its name, and changing it will create a new entry in the notifications system."})}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h2,{id:"notes",children:"Notes"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Schema draft version: ",(0,t.jsx)(n.a,{href:"http://json-schema.org/draft-07/schema#",children:"JSON Schema Draft-07"})]}),"\n",(0,t.jsxs)(n.li,{children:["Schema ID: ",(0,t.jsx)(n.code,{children:"https://github.com/dappnode/DAppNode/raw/schema/notifications.schema.json"})]}),"\n",(0,t.jsx)(n.li,{children:"Fields not marked as required are considered optional."}),"\n",(0,t.jsx)(n.li,{children:"This schema is extensible to allow future fields and integrations."}),"\n",(0,t.jsxs)(n.li,{children:["The ",(0,t.jsx)(n.code,{children:"*notifications.yaml"})," file will injected in the manifest (",(0,t.jsx)(n.code,{children:"dappnode_package.json"}),") for convenience. You can see the manifest inside the dappmanager container in the path ",(0,t.jsx)(n.code,{children:"/usr/src/app/dnp_repo//dappnode_package.json"})]}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsxs)(n.p,{children:["For examples or more usage details, visit the ",(0,t.jsx)(n.a,{href:"https://docs.dappnode.io",children:"DAppNode developer documentation"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>d});var s=i(96540);const t={},o=s.createContext(t);function r(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8717b14a.389d1e30.js b/assets/js/8717b14a.389d1e30.js
new file mode 100644
index 000000000..c1c4d43dd
--- /dev/null
+++ b/assets/js/8717b14a.389d1e30.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[3694],{72997:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>n,toc:()=>c});var n=o(25802),s=o(74848),l=o(28453);const r={slug:"long-blog-post",title:"Long Blog Post",authors:"endi",tags:["hello","docusaurus"]},i=void 0,a={authorsImageUrls:[void 0]},c=[];function u(e){const t={code:"code",p:"p",...(0,l.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"This is the summary of a very long blog post,"}),"\n",(0,s.jsxs)(t.p,{children:["Use a ",(0,s.jsx)(t.code,{children:"\x3c!--"})," ",(0,s.jsx)(t.code,{children:"truncate"})," ",(0,s.jsx)(t.code,{children:"--\x3e"})," comment to limit blog post size in the list view."]})]})}function p(e={}){const{wrapper:t}={...(0,l.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},28453:(e,t,o)=>{o.d(t,{R:()=>r,x:()=>i});var n=o(96540);const s={},l=n.createContext(s);function r(e){const t=n.useContext(l);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(l.Provider,{value:t},e.children)}},25802:e=>{e.exports=JSON.parse('{"permalink":"/blog/long-blog-post","source":"@site/blog/2019-05-29-long-blog-post.md","title":"Long Blog Post","description":"This is the summary of a very long blog post,","date":"2019-05-29T00:00:00.000Z","tags":[{"inline":true,"label":"hello","permalink":"/blog/tags/hello"},{"inline":true,"label":"docusaurus","permalink":"/blog/tags/docusaurus"}],"readingTime":2.05,"hasTruncateMarker":true,"authors":[{"name":"Endilie Yacop Sucipto","title":"Maintainer of Docusaurus","url":"https://github.com/endiliey","imageURL":"https://github.com/endiliey.png","key":"endi","page":null}],"frontMatter":{"slug":"long-blog-post","title":"Long Blog Post","authors":"endi","tags":["hello","docusaurus"]},"unlisted":false,"prevItem":{"title":"MDX Blog Post","permalink":"/blog/mdx-blog-post"},"nextItem":{"title":"First Blog Post","permalink":"/blog/first-blog-post"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/89600f1f.612de3fc.js b/assets/js/89600f1f.612de3fc.js
new file mode 100644
index 000000000..48d26576f
--- /dev/null
+++ b/assets/js/89600f1f.612de3fc.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5979],{47448:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>l,default:()=>o,frontMatter:()=>r,metadata:()=>d,toc:()=>h});const d=JSON.parse('{"id":"dao/liquidity-mining","title":"Liquidity Mining","description":"Liquidity Mining (LM) launched on Jul 17 2021, 2000 GMT. 5.5% of the total token supply, 5.5 Million NODE, has been allocated to the first LM round of 6 months. NODE reward distribution for the 4 pools available is as follows:","source":"@site/docs/dao/liquidity-mining.md","sourceDirName":"dao","slug":"/dao/liquidity-mining","permalink":"/docs/dao/liquidity-mining","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dao/liquidity-mining.md","tags":[],"version":"current","frontMatter":{"title":"Liquidity Mining","llm_description":"NODE liquidity mining program details: pool allocations, contract addresses, and weekly rewards."},"sidebar":"daoSidebar","previous":{"title":"The NODE Economy","permalink":"/docs/dao/node-basics"},"next":{"title":"Dappnode DAO FAQ","permalink":"/docs/dao/faq"}}');var s=n(74848),t=n(28453);const r={title:"Liquidity Mining",llm_description:"NODE liquidity mining program details: pool allocations, contract addresses, and weekly rewards."},l="Liquidity Mining",c={},h=[{value:"Liquidity Provision Pools Contract Addresses",id:"liquidity-provision-pools-contract-addresses",level:3},{value:"LP Token Addresses (Mainnet)",id:"lp-token-addresses-mainnet",level:3},{value:"Liquidity Mining Contracts",id:"liquidity-mining-contracts",level:2},{value:"Weekly Distribution",id:"weekly-distribution",level:3}];function a(e){const i={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"liquidity-mining",children:"Liquidity Mining"})}),"\n",(0,s.jsx)(i.p,{children:"Liquidity Mining (LM) launched on Jul 17 2021, 20:00:00 GMT. 5.5% of the total token supply, 5.5 Million NODE, has been allocated to the first LM round of 6 months. NODE reward distribution for the 4 pools available is as follows:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Sushiswap NODE/ETH Pool - 40% - 2,200,000 NODE"}),"\n",(0,s.jsx)(i.li,{children:"Uniswap NODE/ETH Pool - 40% - 2,200,000 NODE"}),"\n",(0,s.jsx)(i.li,{children:"NODE Governance Staking xDai - 10% - 550,000 NODE"}),"\n",(0,s.jsx)(i.li,{children:"NODE Governance Staking Mainnet -10% - 550,000 NODE"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"A further 5.5% of the token supply has been reserved for future rounds of LM. At the end of the first round the team will re-assess the Liquidity Mining program, potentially deploying new pools and distribution."}),"\n",(0,s.jsx)(i.h3,{id:"liquidity-provision-pools-contract-addresses",children:"Liquidity Provision Pools Contract Addresses"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Sushiswap NODE/ETH Pool - ",(0,s.jsx)(i.a,{href:"https://etherscan.io/address/0x60cd8dcc7cce0cca6a3743727ce909b6f715b2d8",children:"0x60cd8dcc7cce0cca6a3743727ce909b6f715b2d8"})]}),"\n",(0,s.jsxs)(i.li,{children:["Uniswap NODE/ETH Pool - ",(0,s.jsx)(i.a,{href:"https://etherscan.io/address/0xee3b01b2debd3df95bf24d4aacf8e70373113315",children:"0xee3b01b2debd3df95bf24d4aacf8e70373113315"})]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"lp-token-addresses-mainnet",children:"LP Token Addresses (Mainnet)"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Uniswap v2 ETH/NODE LP - ",(0,s.jsx)(i.a,{href:"https://etherscan.io/address/0xee3b01b2debd3df95bf24d4aacf8e70373113315",children:"0xee3b01b2debd3df95bf24d4aacf8e70373113315"})]}),"\n",(0,s.jsxs)(i.li,{children:["Sushiswap ETH/NODE LP - ",(0,s.jsx)(i.a,{href:"https://etherscan.io/address/0x60cd8dcc7cce0cca6a3743727ce909b6f715b2d8",children:"0x60cd8dcc7cce0cca6a3743727ce909b6f715b2d8"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"liquidity-mining-contracts",children:"Liquidity Mining Contracts"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["NODE Governance Staking Mainnet - ",(0,s.jsx)(i.a,{href:"https://etherscan.io/address/0x19992b52338B7B49De9679ae018A7027803dB1Aa",children:"0x19992b52338B7B49De9679ae018A7027803dB1Aa"})]}),"\n",(0,s.jsxs)(i.li,{children:["NODE Governance Staking xDai - ",(0,s.jsx)(i.a,{href:"https://blockscout.com/xdai/mainnet/address/0xF66823fdc33B9F4C66dB4C3394FF139872C12f16/transactions",children:"0xF66823fdc33B9F4C66dB4C3394FF139872C12f16"})]}),"\n",(0,s.jsxs)(i.li,{children:["Uniswap Liquidity Mining - ",(0,s.jsx)(i.a,{href:"https://etherscan.io/address/0x072115DbD5c8b47E971890357d2951d4569F6B27",children:"0x072115DbD5c8b47E971890357d2951d4569F6B27"})]}),"\n",(0,s.jsxs)(i.li,{children:["Sushiswap Liquidity Mining - ",(0,s.jsx)(i.a,{href:"https://etherscan.io/address/0x89F2e26F20Bf66bBFAc947A3b628b4b4724AaA5c",children:"0x89F2e26F20Bf66bBFAc947A3b628b4b4724AaA5c"})]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"weekly-distribution",children:"Weekly Distribution"}),"\n",(0,s.jsx)(i.p,{children:"Round 1 (26 weeks) weekly NODE rewards distribution percentages based on LM supply are as follows:"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"% per week"}),(0,s.jsx)(i.th,{children:"0.00%"}),(0,s.jsx)(i.th,{children:"3.80%"}),(0,s.jsx)(i.th,{children:"3.80%"}),(0,s.jsx)(i.th,{children:"3.00%"}),(0,s.jsx)(i.th,{children:"3.00%"}),(0,s.jsx)(i.th,{children:"2.50%"}),(0,s.jsx)(i.th,{children:"2.50%"}),(0,s.jsx)(i.th,{children:"2.50%"}),(0,s.jsx)(i.th,{children:"2.50%"}),(0,s.jsx)(i.th,{children:"2.60%"}),(0,s.jsx)(i.th,{children:"2.80%"}),(0,s.jsx)(i.th,{children:"3.00%"}),(0,s.jsx)(i.th,{children:"3.20%"}),(0,s.jsx)(i.th,{children:"3.40%"}),(0,s.jsx)(i.th,{children:"3.60%"}),(0,s.jsx)(i.th,{children:"3.80%"}),(0,s.jsx)(i.th,{children:"4.00%"}),(0,s.jsx)(i.th,{children:"4.20%"}),(0,s.jsx)(i.th,{children:"4.40%"}),(0,s.jsx)(i.th,{children:"4.60%"}),(0,s.jsx)(i.th,{children:"4.80%"}),(0,s.jsx)(i.th,{children:"5.00%"}),(0,s.jsx)(i.th,{children:"5.20%"}),(0,s.jsx)(i.th,{children:"5.40%"}),(0,s.jsx)(i.th,{children:"5.60%"}),(0,s.jsx)(i.th,{children:"5.80%"}),(0,s.jsx)(i.th,{children:"5.00%"})]})}),(0,s.jsx)(i.tbody,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Week"}),(0,s.jsx)(i.td,{children:"0"}),(0,s.jsx)(i.td,{children:"1"}),(0,s.jsx)(i.td,{children:"2"}),(0,s.jsx)(i.td,{children:"3"}),(0,s.jsx)(i.td,{children:"4"}),(0,s.jsx)(i.td,{children:"5"}),(0,s.jsx)(i.td,{children:"6"}),(0,s.jsx)(i.td,{children:"7"}),(0,s.jsx)(i.td,{children:"8"}),(0,s.jsx)(i.td,{children:"9"}),(0,s.jsx)(i.td,{children:"10"}),(0,s.jsx)(i.td,{children:"11"}),(0,s.jsx)(i.td,{children:"12"}),(0,s.jsx)(i.td,{children:"13"}),(0,s.jsx)(i.td,{children:"14"}),(0,s.jsx)(i.td,{children:"15"}),(0,s.jsx)(i.td,{children:"16"}),(0,s.jsx)(i.td,{children:"17"}),(0,s.jsx)(i.td,{children:"18"}),(0,s.jsx)(i.td,{children:"19"}),(0,s.jsx)(i.td,{children:"20"}),(0,s.jsx)(i.td,{children:"21"}),(0,s.jsx)(i.td,{children:"22"}),(0,s.jsx)(i.td,{children:"23"}),(0,s.jsx)(i.td,{children:"24"}),(0,s.jsx)(i.td,{children:"25"}),(0,s.jsx)(i.td,{children:"26"})]})})]})]})}function o(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},28453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>l});var d=n(96540);const s={},t=d.createContext(s);function r(e){const i=d.useContext(t);return d.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),d.createElement(t.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/89b6dee8.ee02532d.js b/assets/js/89b6dee8.ee02532d.js
new file mode 100644
index 000000000..1cee8acdc
--- /dev/null
+++ b/assets/js/89b6dee8.ee02532d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[592],{48451:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"user/videos-and-tutorials/driving-school/initial-setup","title":"1. Initial Dappnode Setup","description":"Welcome to Dappnode Driving School! Here you\'ll find a series of videos that will guide you through the initial setup process. From booting Dappnode from ISO and accessing it through VPN, to setting up your Ethereum node, we\'ve got you covered.","source":"@site/docs/user/videos-and-tutorials/driving-school/initial-setup.md","sourceDirName":"user/videos-and-tutorials/driving-school","slug":"/user/videos-and-tutorials/driving-school/initial-setup","permalink":"/docs/user/videos-and-tutorials/driving-school/initial-setup","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/videos-and-tutorials/driving-school/initial-setup.md","tags":[],"version":"current","frontMatter":{"title":"1. Initial Dappnode Setup","llm_description":"Video tutorials for initial Dappnode setup: ISO boot, UI access, security, VPN, and syncing."},"sidebar":"userSidebar","previous":{"title":"More coming soon","permalink":"/docs/user/dappnode-cloud/providers/coming-soon"},"next":{"title":"Configuration","permalink":"/docs/user/videos-and-tutorials/driving-school/configuration"}}');var r=n(74848),i=n(28453);const s={title:"1. Initial Dappnode Setup",llm_description:"Video tutorials for initial Dappnode setup: ISO boot, UI access, security, VPN, and syncing."},a="1. Initial Dappnode Setup",d={},u=[{value:"\ud83d\udda5\ufe0f 1.1 Booting from the Dappnode ISO",id:"\ufe0f-11-booting-from-the-dappnode-iso",level:2},{value:"\ud83c\udf10 1.2 Accessing the Dappnode User Interface or Dashboard",id:"-12-accessing-the-dappnode-user-interface-or-dashboard",level:2},{value:"\ud83d\udd12 1.3 Setting up Dappnode Security",id:"-13-setting-up-dappnode-security",level:2},{value:"\ud83d\udd17 1.4 Configuring your Dappnode VPN",id:"-14-configuring-your-dappnode-vpn",level:2},{value:"\ud83d\udd04 1.5 Syncing your clients/An overview on node running",id:"-15-syncing-your-clientsan-overview-on-node-running",level:2},{value:"\ud83d\udcbe 1.6 Understanding your Dappnode's Hardware",id:"-16-understanding-your-dappnodes-hardware",level:2}];function c(e){const o={h1:"h1",h2:"h2",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.header,{children:(0,r.jsx)(o.h1,{id:"1-initial-dappnode-setup",children:"1. Initial Dappnode Setup"})}),"\n",(0,r.jsx)(o.p,{children:"Welcome to Dappnode Driving School! Here you'll find a series of videos that will guide you through the initial setup process. From booting Dappnode from ISO and accessing it through VPN, to setting up your Ethereum node, we've got you covered."}),"\n",(0,r.jsx)(o.h2,{id:"\ufe0f-11-booting-from-the-dappnode-iso",children:"\ud83d\udda5\ufe0f 1.1 Booting from the Dappnode ISO"}),"\n",(0,r.jsx)(o.p,{children:"The first step you will need to take when your hardware is ready for installing Dappnode. If you have experience installing Linux you'll know what this is about, but if you don't there's nothing to worry about, as most of the process is automated."}),"\n",(0,r.jsx)("center",{children:(0,r.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/lh5hADm1Iuk",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,r.jsx)("br",{}),"\n",(0,r.jsx)(o.h2,{id:"-12-accessing-the-dappnode-user-interface-or-dashboard",children:"\ud83c\udf10 1.2 Accessing the Dappnode User Interface or Dashboard"}),"\n",(0,r.jsx)(o.p,{children:"The most common way to interact with your dappnode is through a web browser in another computer. This means that Dappnode works as a server, and doesn't have a traditional graphic interface as regular personal computers do, so if you're sitting in front of a login prompt wondering what's next you're doing great so far!"}),"\n",(0,r.jsx)("center",{children:(0,r.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/Z1uDv_J7wlg",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,r.jsx)("br",{}),"\n",(0,r.jsx)(o.h2,{id:"-13-setting-up-dappnode-security",children:"\ud83d\udd12 1.3 Setting up Dappnode Security"}),"\n",(0,r.jsx)(o.p,{children:"Now that you're inside your Dappnode we gotta make sure no unauthorized users have access! There are four kinds of security credentials in Dappnode and we'll go through each one of them in this video."}),"\n",(0,r.jsx)("center",{children:(0,r.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/TZUK39yiZ30",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,r.jsx)("br",{}),"\n",(0,r.jsx)(o.h2,{id:"-14-configuring-your-dappnode-vpn",children:"\ud83d\udd17 1.4 Configuring your Dappnode VPN"}),"\n",(0,r.jsx)(o.p,{children:"The best way to remotely and safely access your Dappnode is through VPN. Discover the options that Dappnode has to offer for VPNs in this Dappnode Driving School lesson!"}),"\n",(0,r.jsx)("center",{children:(0,r.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/qB0sMaNpXpU",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,r.jsx)("br",{}),"\n",(0,r.jsx)(o.h2,{id:"-15-syncing-your-clientsan-overview-on-node-running",children:"\ud83d\udd04 1.5 Syncing your clients/An overview on node running"}),"\n",(0,r.jsx)(o.p,{children:"This is what you came here for! Let's start syncing your clients to get your nodes up and running. Whether you want them for better privacy while exploring web3 or because you're interested in validating, syncing your node is a must in your Dappnode journey."}),"\n",(0,r.jsx)("center",{children:(0,r.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/zJowD3X-MUc",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,r.jsx)("br",{}),"\n",(0,r.jsx)(o.h2,{id:"-16-understanding-your-dappnodes-hardware",children:"\ud83d\udcbe 1.6 Understanding your Dappnode's Hardware"}),"\n",(0,r.jsx)(o.p,{children:"Now that everything is working as expected, here's some information on what keeps Dappnode running the way it's meant to. This video is also great if you're looking into putting your own hardware together, since it goes through the minimum requirements to run Dappnode."}),"\n",(0,r.jsx)("center",{children:(0,r.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/1GW-GbGKs7o?si=DZVO185qWNWiXFl4",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})})]})}function p(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},28453:(e,o,n)=>{n.d(o,{R:()=>s,x:()=>a});var t=n(96540);const r={},i=t.createContext(r);function s(e){const o=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/89e2558e.2ae9dedf.js b/assets/js/89e2558e.2ae9dedf.js
new file mode 100644
index 000000000..cdae0c910
--- /dev/null
+++ b/assets/js/89e2558e.2ae9dedf.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9752],{74016:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"user/dappnode-cloud/providers/aws/set-up-instance","title":"How to Set Up an Instance","description":"To launch a Dappnode AMI instance, follow these steps:","source":"@site/docs/user/dappnode-cloud/providers/aws/set-up-instance.md","sourceDirName":"user/dappnode-cloud/providers/aws","slug":"/user/dappnode-cloud/providers/aws/set-up-instance","permalink":"/docs/user/dappnode-cloud/providers/aws/set-up-instance","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/dappnode-cloud/providers/aws/set-up-instance.md","tags":[],"version":"current","frontMatter":{"title":"How to Set Up an Instance","llm_description":"Step-by-step guide to launch Dappnode on AWS EC2 with Telegram or SSH credential retrieval."},"sidebar":"userSidebar","previous":{"title":"AWS Overview","permalink":"/docs/user/dappnode-cloud/providers/aws/overview"},"next":{"title":"FAQs & Troubleshooting","permalink":"/docs/user/dappnode-cloud/providers/aws/faqs"}}');var i=s(74848),t=s(28453);const o={title:"How to Set Up an Instance",llm_description:"Step-by-step guide to launch Dappnode on AWS EC2 with Telegram or SSH credential retrieval."},a="How to Set Up an Instance",c={},l=[{value:"1. Navigate to AWS Marketplace \ud83e\udded",id:"1-navigate-to-aws-marketplace-",level:3},{value:"2. AWS Account \ud83d\udc64",id:"2-aws-account-",level:3},{value:"3. Subscribe to Dappnode AMI \ud83d\udcc0",id:"3-subscribe-to-dappnode-ami-",level:3},{value:"4. Set Up Telegram for Wireguard Credentials (Optional) \ud83d\udcac",id:"4-set-up-telegram-for-wireguard-credentials-optional-",level:3},{value:"5. Launch Instance \ud83d\ude80",id:"5-launch-instance-",level:3},{value:"6. Get wireguard credentials \ud83d\udd10",id:"6-get-wireguard-credentials-",level:3},{value:"7. Connect via Wireguard \ud83d\udd0c",id:"7-connect-via-wireguard-",level:3},{value:"8. Navigate to Dappnode's UI \ud83c\udfc1",id:"8-navigate-to-dappnodes-ui-",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"how-to-set-up-an-instance",children:"How to Set Up an Instance"})}),"\n",(0,i.jsx)(n.p,{children:"To launch a Dappnode AMI instance, follow these steps:"}),"\n",(0,i.jsxs)(n.h3,{id:"1-navigate-to-aws-marketplace-",children:["1. ",(0,i.jsx)(n.strong,{children:"Navigate to AWS Marketplace"})," \ud83e\udded"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Go to the ",(0,i.jsx)(n.a,{href:"https://aws.amazon.com/marketplace/",children:"AWS Marketplace"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.h3,{id:"2-aws-account-",children:["2. ",(0,i.jsx)(n.strong,{children:"AWS Account"})," \ud83d\udc64"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If you already have an AWS account, log in. If not, create an account. For more information on signing up, you can visit the ",(0,i.jsx)(n.a,{href:"https://docs.aws.amazon.com/SetUp/latest/UserGuide/setup-AWSsignup.html",children:"AWS Sign-Up Documentation"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["In case you end up on another website after signing up, navigate again to the ",(0,i.jsx)(n.a,{href:"https://aws.amazon.com/marketplace/",children:"AWS Marketplace"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.h3,{id:"3-subscribe-to-dappnode-ami-",children:["3. ",(0,i.jsx)(n.strong,{children:"Subscribe to Dappnode AMI"})," \ud83d\udcc0"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Search "Dappnode" in the top search bar and choose the "Dappnode Cloud - Telegram Credentials - By Dappnode" option.'}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'On our Dappnode AMI page, you can check some information about our image. When you are ready, click "Continue to Subscribe".'}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Accept the terms and click "Continue to Configuration".'}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Check the region and click "Continue to Launch" to proceed with the instance launch.'}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'In the "Choose Action" dropdown, select "Launch through EC2" and click "Launch".'}),"\n"]}),"\n"]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/s-ZPmD5471Y",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,i.jsxs)(n.h3,{id:"4-set-up-telegram-for-wireguard-credentials-optional-",children:["4. ",(0,i.jsx)(n.strong,{children:"Set Up Telegram for Wireguard Credentials (Optional)"})," \ud83d\udcac"]}),"\n",(0,i.jsx)(n.p,{children:"This step is only necessary if you are planning to get your Wireguard credentials via Telegram."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Create a new bot using the ",(0,i.jsx)(n.code,{children:"/newbot"})," command via BotFather's chat. It will ask you for a name and username, then generate an authentication token for your new bot. Save this token, as you will need to provide it when launching the AWS instance."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["You will also need to provide your Telegram user ID. You can get it by sending ",(0,i.jsx)(n.code,{children:"/start"})," to a bot such as ",(0,i.jsx)(n.code,{children:"@RawDataBot"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/K2DGBWxCTZk",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,i.jsxs)(n.h3,{id:"5-launch-instance-",children:["5. ",(0,i.jsx)(n.strong,{children:"Launch Instance"})," \ud83d\ude80"]}),"\n",(0,i.jsx)(n.p,{children:'Once in the EC2 "Launch an instance" UI you will have to choose the configuration of your instance. Next steps will explain you what configurations do you need to modify section by section.'}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Name:"})," Give a name to your instance. This name is for you to identify it in the EC2 UI."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Application and OS Images (Amazon Machine Image)"}),": No changes needed, it comes pre-configured according to the Dappnode Image."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Instance type:"})," Choose an instance type. All selectable options are suitable for running Dappnode. For more context based on your requirements, check the ",(0,i.jsx)(n.a,{href:"/docs/user/dappnode-cloud/providers/aws/faqs",children:"FAQs section"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Key Pair:"})," If you already have a key pair linked to your AWS account, you can use it. Alternatively, you can import keys to the EC2 or create a new one. These keys are essential for SSH access to the instance. Losing these keys could result in losing access to your instance."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Network Settings:"})}),"\n",(0,i.jsx)(n.p,{children:"In this section, you will create a security group to allow necessary ports exposure. Follow these steps to ensure your Dappnode instance can perform optimally and access all required services:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Click "Edit" under Network Settings and ensure the "Create security group" option is chosen.'}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'To add a new rule to the group, click the "Add security group rule" button below. Include the following rules:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"SSH:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Type: SSH"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"HTTP:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Type: HTTP"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"HTTPS:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Type: HTTPS"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Wireguard:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Type: Custom UDP"}),"\n",(0,i.jsx)(n.li,{children:"Port Range: 51820"}),"\n",(0,i.jsx)(n.li,{children:"Source: 0.0.0.0/0"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"General TCP:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Type: Custom TCP"}),"\n",(0,i.jsx)(n.li,{children:"Port Range: 1024-65535"}),"\n",(0,i.jsx)(n.li,{children:"Source: 0.0.0.0/0"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"General UDP:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Type: Custom UDP"}),"\n",(0,i.jsx)(n.li,{children:"Port Range: 1024-65535"}),"\n",(0,i.jsx)(n.li,{children:"Source: 0.0.0.0/0"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["For more information about why this Inbound rules are needed and details about each one, visit the ",(0,i.jsx)(n.a,{href:"/docs/user/dappnode-cloud/providers/aws/faqs",children:"FAQs Section"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Storage:"})," Define the amount and type of storage for the instance. The storage requirements depend largely on your intended use."]}),"\n",(0,i.jsxs)(n.p,{children:["For more suggestions and context, refer to the ",(0,i.jsx)(n.a,{href:"/docs/user/dappnode-cloud/providers/aws/faqs",children:"FAQs section"}),"."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"AWS also offers the possibility of extending storage once launched if needed."})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Advanced details (optional):"})," No modifications are needed here unless you plan to get your ",(0,i.jsx)(n.strong,{children:"Wireguard credentials via Telegram"}),'. If so, provide your userID and botToken in the text area at the end of "Advanced details", separated by a comma in the following format: (',(0,i.jsx)(n.code,{children:"userID,botToken"}),").\nExample => ",(0,i.jsx)(n.code,{children:"123456789,1234567890:ABCDEFGHIJKLMNOPQRSTUVWXYZ123456"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Summary:"})," Finally, review your configuration on the 'Summary' section located on the right and click the \"Launch instance\" button. Once clicked, your instance will be launched."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/K8IA5s9bl3g",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,i.jsxs)(n.h3,{id:"6-get-wireguard-credentials-",children:["6. ",(0,i.jsx)(n.strong,{children:"Get wireguard credentials"})," \ud83d\udd10"]}),"\n",(0,i.jsx)(n.p,{children:"To obtain the Wireguard credentials for your instance, you have two different approaches:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Via Telegram Bot"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Ensure you have completed the optional Telegram setup steps mentioned earlier in the guide."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"After launching the instance, go to your new bot's chat using the link provided by BotFather."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Send any message to your bot. If the configuration is correct, you should receive a message saying ",(0,i.jsx)(n.code,{children:"\u2705 Successfully saved channel ID"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Send the command ",(0,i.jsx)(n.code,{children:"/get_wireguard_credentials"})," in the bot chat. The bot should return your Wireguard credentials. Copy them, as the next step will explain how to use these credentials."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/WlJyHS3KUYU",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Via SSH"})}),"\n",(0,i.jsx)(n.p,{children:"This approach is for more experienced users, since you will have to use the terminal."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'After launching the instance, click the "Connect" button in the AWS console.'}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:['Go to the "SSH client" tab where it will provide you with a command like this:\n',(0,i.jsx)(n.code,{children:'ssh -i "yourKeyPair-aws.pem" root@yourInstanceDNS'}),"\nOpen your terminal and modify the command to use the ",(0,i.jsx)(n.code,{children:"ubuntu"})," user and add ",(0,i.jsx)(n.code,{children:"sudo"})," for permissions:"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:'sudo ssh -i "yourKeyPair-aws.pem" ubuntu@yourInstanceDNS\n'})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"Ensure this command is run in the directory where your key pair file is located."})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Once connected to your instance, run the following command:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"dappnode_wireguard\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This command will output your Wireguard credentials. Copy them from your terminal using ",(0,i.jsx)(n.code,{children:"Ctrl+Shift+C"})," / ",(0,i.jsx)(n.code,{children:"\u2318+Shift+C"}),". The next step will explain how to use these credentials."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/k-y8E4G15WI",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsx)(n.p,{children:"The installation of Dappnode on your instance may take a few minutes. If you try to obtain the credentials before the installation is complete, you may not receive them. If this happens, wait a few minutes and try again."}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Via SSH"}),": If you encounter this issue, exit your SSH session with the ",(0,i.jsx)(n.code,{children:"exit"})," command and reconnect as explained above."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Via Telegram Bot"}),": Simply retry the ",(0,i.jsx)(n.code,{children:"/get_wireguard_credentials"})," command after a short wait."]}),"\n"]})]}),"\n",(0,i.jsxs)(n.h3,{id:"7-connect-via-wireguard-",children:["7. ",(0,i.jsx)(n.strong,{children:"Connect via Wireguard"})," \ud83d\udd0c"]}),"\n",(0,i.jsxs)(n.p,{children:["The setup process for connecting via Wireguard will depend on the operating system you are using. Refer to the ",(0,i.jsx)(n.a,{href:"/docs/user/access-your-dappnode/vpn/wireguard#2-installing-wireguard-client",children:"Wireguard documentation section"})," specific to your OS for detailed instructions."]}),"\n",(0,i.jsx)(n.p,{children:"Once you have installed Wireguard and configured it with the credentials you obtained, you will be able to connect to your Dappnode instance securely."}),"\n",(0,i.jsxs)(n.h3,{id:"8-navigate-to-dappnodes-ui-",children:["8. ",(0,i.jsx)(n.strong,{children:"Navigate to Dappnode's UI"})," \ud83c\udfc1"]}),"\n",(0,i.jsxs)(n.p,{children:["Once your Wireguard tunnel is active, simply open your web browser and go to ",(0,i.jsx)(n.a,{href:"http://my.dappnode",children:"http://my.dappnode"})," to begin your journey with Dappnode Cloud!"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>a});var r=s(96540);const i={},t=r.createContext(i);function o(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8ec292b8.e66ca43e.js b/assets/js/8ec292b8.e66ca43e.js
new file mode 100644
index 000000000..9ab314cb0
--- /dev/null
+++ b/assets/js/8ec292b8.e66ca43e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[3078],{64702:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"user/getting-started/setup","title":"Setup","description":"Setting up Dappnode is a straightforward process. This guide will walk you through configuring your Dappnode for the first time.","source":"@site/docs/user/getting-started/setup.md","sourceDirName":"user/getting-started","slug":"/user/getting-started/setup","permalink":"/docs/user/getting-started/setup","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/getting-started/setup.md","tags":[],"version":"current","frontMatter":{"title":"Setup","llm_description":"Initial configuration: repository source, auto-updates, notifications, and host password setup."},"sidebar":"userSidebar","previous":{"title":"Register","permalink":"/docs/user/getting-started/register"},"next":{"title":"Next steps","permalink":"/docs/user/getting-started/next-steps"}}');var o=s(74848),i=s(28453);const a={title:"Setup",llm_description:"Initial configuration: repository source, auto-updates, notifications, and host password setup."},r="Setup",d={},c=[{value:"Choose Repository Source",id:"choose-repository-source",level:2},{value:"Enable/Disable System Auto Updates",id:"enabledisable-system-auto-updates",level:2},{value:"Enable system notifications",id:"enable-system-notifications",level:2},{value:"Change Host User Password",id:"change-host-user-password",level:2},{value:"All Set!",id:"all-set",level:2}];function p(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"setup",children:"Setup"})}),"\n",(0,o.jsx)(t.p,{children:"Setting up Dappnode is a straightforward process. This guide will walk you through configuring your Dappnode for the first time."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"setup-1",src:s(72226).A+"",width:"2388",height:"638"})}),"\n",(0,o.jsx)(t.h2,{id:"choose-repository-source",children:"Choose Repository Source"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"setup-2",src:s(11961).A+"",width:"2422",height:"1358"})}),"\n",(0,o.jsx)(t.p,{children:"Before you dive in, choose the source from which Dappnode retrieves its data:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"Remote Node"}),": Connect your Dappnode to an external Ethereum node. This option is lightweight, as you won't need to host the blockchain data on your machine."]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"Full Node"}),": Have your Dappnode host the complete Ethereum blockchain. This ensures maximum decentralization and independence, but it requires more storage and bandwidth."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(t.admonition,{title:"Why is this important?",type:"info",children:[(0,o.jsx)(t.p,{children:"Dappnode uses smart contracts to publish the dapps that are accessible in the dappstore. For this reason, Dappnode needs access to an Ethereum node to read the contents of said smart contract. Choosing between a remote and a full node directly impacts how decentralized your setup is."}),(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"Decentralization Benefits"}),": By relying less on third-party services, you enhance security, reduce points of failure, and support the Ethereum network's robustness, but it might not work for you if you have limited storage or bandwidth."]})]}),"\n",(0,o.jsx)(t.h2,{id:"enabledisable-system-auto-updates",children:"Enable/Disable System Auto Updates"}),"\n",(0,o.jsx)(t.p,{children:"Dappnode comes with an auto-update feature. This means it will automatically update itself with new releases, ensuring you always have the latest and most secure version. Activate auto-updates to lessen maintenance and better guard against vulnerabilities."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"setup-3",src:s(5712).A+"",width:"2422",height:"948"})}),"\n",(0,o.jsx)(t.admonition,{type:"tip",children:(0,o.jsxs)(t.p,{children:["We ",(0,o.jsx)(t.strong,{children:"strongly"})," recommend activating auto-updates to ensure your Dappnode is always up to date with the latest versions."]})}),"\n",(0,o.jsx)(t.h2,{id:"enable-system-notifications",children:"Enable system notifications"}),"\n",(0,o.jsx)(t.p,{children:"Dappnode can send you notifications about important events, such as your dappnode being offline or high CPU usage. This is a great way to stay on top of your Dappnode's health and performance."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"setup-4",src:s(17935).A+"",width:"1926",height:"886"})}),"\n",(0,o.jsx)(t.h2,{id:"change-host-user-password",children:"Change Host User Password"}),"\n",(0,o.jsxs)(t.p,{children:["Beneath the hood, Dappnode operates on a Linux framework, protected by a password, which will be needed to access your ",(0,o.jsx)(t.a,{href:"/docs/user/access-your-dappnode/terminal",children:"Dappnode's terminal"})," To amplify your Dappnode's defense:"]}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Change"})," the ",(0,o.jsx)(t.strong,{children:"default Linux"})," machine ",(0,o.jsx)(t.strong,{children:"password"})," for user ",(0,o.jsx)(t.code,{children:"dappnode"}),"."]}),"\n",(0,o.jsxs)(t.li,{children:["Choose a ",(0,o.jsx)(t.strong,{children:"strong, unique password"})," that's not easily guessable."]}),"\n",(0,o.jsxs)(t.li,{children:["Remember to ",(0,o.jsx)(t.strong,{children:"store this password in a secure location"}),". If you lose access to this password, you could be locked out of your Dappnode."]}),"\n"]}),"\n",(0,o.jsx)(t.admonition,{type:"caution",children:(0,o.jsx)(t.p,{children:"Always save and backup your password. This is crucial for ensuring uninterrupted access to your Dappnode."})}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"setup-4",src:s(78918).A+"",width:"2422",height:"1180"})}),"\n",(0,o.jsx)(t.h2,{id:"all-set",children:"All Set!"}),"\n",(0,o.jsx)(t.p,{children:"Congratulations! Your Dappnode is now configured and ready for use. Dive into the world of decentralized applications and enjoy the self-hosted, decentralized internet experience."}),"\n",(0,o.jsx)(t.p,{children:"With these steps, your Dappnode should be up and running efficiently. Always refer to the official Dappnode documentation or community for any further queries or support."}),"\n",(0,o.jsx)(t.admonition,{title:"Keep your Dappnode up to date",type:"info",children:(0,o.jsx)(t.p,{children:"Remember to regularly check for updates and best practices to ensure your Dappnode stays secure and efficient."})}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"setup-5",src:s(60125).A+"",width:"2422",height:"804"})})]})}function l(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},72226:(e,t,s)=>{s.d(t,{A:()=>n});const n=s.p+"assets/images/setup-1-20f4539a87a606b2ab7be68a06080912.png"},11961:(e,t,s)=>{s.d(t,{A:()=>n});const n=s.p+"assets/images/setup-2-a5a1f0456cdbb9e861104376a30d3047.png"},5712:(e,t,s)=>{s.d(t,{A:()=>n});const n=s.p+"assets/images/setup-3-6b0500114fc971ac2b4e23aee5e2a6a7.png"},17935:(e,t,s)=>{s.d(t,{A:()=>n});const n=s.p+"assets/images/setup-4-853e6ca7d1d4f5dea03695e39223e572.png"},78918:(e,t,s)=>{s.d(t,{A:()=>n});const n=s.p+"assets/images/setup-5-7ef2fb5a75d77003c5192bafbd656ff8.png"},60125:(e,t,s)=>{s.d(t,{A:()=>n});const n=s.p+"assets/images/setup-6-8ca9deab19513fdc4b62aa78b4a5297c.png"},28453:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>r});var n=s(96540);const o={},i=n.createContext(o);function a(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8f8bba55.45f68762.js b/assets/js/8f8bba55.45f68762.js
new file mode 100644
index 000000000..2944e86e6
--- /dev/null
+++ b/assets/js/8f8bba55.45f68762.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8602],{86734:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>d,contentTitle:()=>p,default:()=>u,frontMatter:()=>c,metadata:()=>s,toc:()=>i});const s=JSON.parse('{"id":"user/packages/understanding-dappnode-packages/backup","title":"Backup","description":"This option will be available in packages that generate any kind of local database that includes sensitive information such as validator keystores. You\'ll have two very self-explanatory options: \\"Backup Now\\" and \\"Restore Backup\\".","source":"@site/docs/user/packages/understanding-dappnode-packages/backup.md","sourceDirName":"user/packages/understanding-dappnode-packages","slug":"/user/packages/understanding-dappnode-packages/backup","permalink":"/docs/user/packages/understanding-dappnode-packages/backup","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/packages/understanding-dappnode-packages/backup.md","tags":[],"version":"current","frontMatter":{"title":"Backup","llm_description":"Backup and restore functionality for packages with sensitive data like validator keystores."},"sidebar":"userSidebar","previous":{"title":"Logs","permalink":"/docs/user/packages/understanding-dappnode-packages/logs"},"next":{"title":"File manager","permalink":"/docs/user/packages/understanding-dappnode-packages/file-manager"}}');var t=n(74848),o=n(28453);const c={title:"Backup",llm_description:"Backup and restore functionality for packages with sensitive data like validator keystores."},p="Backup",d={},i=[];function r(e){const a={h1:"h1",header:"header",img:"img",p:"p",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.header,{children:(0,t.jsx)(a.h1,{id:"backup",children:"Backup"})}),"\n",(0,t.jsx)(a.p,{children:'This option will be available in packages that generate any kind of local database that includes sensitive information such as validator keystores. You\'ll have two very self-explanatory options: "Backup Now" and "Restore Backup".'}),"\n",(0,t.jsx)(a.p,{children:(0,t.jsx)(a.img,{alt:"dappnode_packages5",src:n(3183).A+"",width:"1741",height:"1091"})})]})}function u(e={}){const{wrapper:a}={...(0,o.R)(),...e.components};return a?(0,t.jsx)(a,{...e,children:(0,t.jsx)(r,{...e})}):r(e)}},3183:(e,a,n)=>{n.d(a,{A:()=>s});const s=n.p+"assets/images/dappnode_packages5-dd905b985e061e57968acfccca3cd1f1.png"},28453:(e,a,n)=>{n.d(a,{R:()=>c,x:()=>p});var s=n(96540);const t={},o=s.createContext(t);function c(e){const a=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function p(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),s.createElement(o.Provider,{value:a},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8f981d3f.2d885c12.js b/assets/js/8f981d3f.2d885c12.js
new file mode 100644
index 000000000..cf6560654
--- /dev/null
+++ b/assets/js/8f981d3f.2d885c12.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1930],{88267:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"user/staking/ethereum/dvt-technologies/diva","title":"Diva package for Dappnode","description":"---","source":"@site/docs/user/staking/ethereum/dvt-technologies/diva.md","sourceDirName":"user/staking/ethereum/dvt-technologies","slug":"/user/staking/ethereum/dvt-technologies/diva","permalink":"/docs/user/staking/ethereum/dvt-technologies/diva","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/ethereum/dvt-technologies/diva.md","tags":[],"version":"current","frontMatter":{"title":"Diva package for Dappnode","llm_description":"Run a Diva DVT operator node for liquid staking with distributed validator technology."},"sidebar":"userSidebar","previous":{"title":"SSV","permalink":"/docs/user/staking/ethereum/dvt-technologies/ssv-network"},"next":{"title":"Gnosis Solo Staking","permalink":"/docs/user/staking/gnosis-chain/solo"}}');var o=t(74848),s=t(28453);const r={title:"Diva package for Dappnode",llm_description:"Run a Diva DVT operator node for liquid staking with distributed validator technology."},a="Diva package for Dappnode",d={},l=[{value:"Introduction",id:"introduction",level:3},{value:"Requirements",id:"requirements",level:3},{value:"Registering a Dappnode Diva Operator",id:"registering-a-dappnode-diva-operator",level:3},{value:"Monitoring your Diva nodes",id:"monitoring-your-diva-nodes",level:3}];function c(e){const n={a:"a",admonition:"admonition",h1:"h1",h3:"h3",header:"header",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"diva-package-for-dappnode",children:"Diva package for Dappnode"})}),"\n",(0,o.jsx)(n.hr,{}),"\n",(0,o.jsx)(n.h3,{id:"introduction",children:(0,o.jsx)(n.strong,{children:"Introduction"})}),"\n",(0,o.jsx)(n.p,{children:"Diva is an Ethereum Liquid Staking protocol powered by Distributed Validator Technology (DVT). It extends Ethereum's Proof of Stake providing new functionality for Stakers and Operators:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Liquid Stakers receive divETH, a Liquid Staking Token which generates Ethereum Staking Rewards."}),"\n",(0,o.jsx)(n.li,{children:"Operators run a Distributed Validation node to fulfill staking duties and earn additional Operator Rewards."}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["This package allows you to run a Diva Operator node, and it is available for the ",(0,o.jsx)(n.a,{href:"http://my.dappnode/installer/public/diva-holesky.public.dappnode.eth",children:"Holesky Testnet"}),". The Ethereum mainnet version of this package is still undergoing testing and will be available in the DAppStore soon."]}),"\n",(0,o.jsx)(n.h3,{id:"requirements",children:(0,o.jsx)(n.strong,{children:"Requirements"})}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"The first thing you'll need to do is set up a fully-synced node. This can be done through the Stakers Menu in Dappnode by selecting:"}),"\n"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"1 Execution Client (Geth, Besu, Erigon or Nethermind)"}),"\n",(0,o.jsx)(n.li,{children:"1 Consensus Client (Prysm, Lighhouse, Lodestar, Teku or Nimbus)"}),"\n",(0,o.jsx)(n.li,{children:"MEV Boost (optional)"}),"\n"]}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["Installing the Diva package for Dappnode. This can be done by visiting the ",(0,o.jsx)(n.a,{href:"http://my.dappnode/installer/dnp",children:"DAppStore"})," in the Dappnode UI. You'll be asked to set two passwords when going through the installation process, as well as your operator's address and Discord handle (for testnet purposes)."]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Diva config tab",src:t(33697).A+"",width:"1734",height:"748"})}),"\n",(0,o.jsx)(n.h3,{id:"registering-a-dappnode-diva-operator",children:(0,o.jsx)(n.strong,{children:"Registering a Dappnode Diva Operator"})}),"\n",(0,o.jsx)(n.p,{children:"After successfully installing the Diva package, you'll need to access the package's interface by clicking on UI. This will take you to the Diva app where you'll need to connect your wallet to register your Diva node as an operator. You can register multiple operators using the same wallet."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Diva wizard",src:t(84714).A+"",width:"1548",height:"680"})}),"\n",(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsx)(n.p,{children:"The wallet address used to register the operator is the only address that will hold management permissions for it, so make sure you keep it safe!"})}),"\n",(0,o.jsx)(n.h3,{id:"monitoring-your-diva-nodes",children:(0,o.jsx)(n.strong,{children:"Monitoring your Diva nodes"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://divascan.io",children:"Divascan"})," is a tool developed to monitor Diva nodes and operators. You can enter your operator address to get information on the validators' performances. You can also get more information on the Diva protocol."]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},33697:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/diva-config1-9cd267af6aa4fb06df05a289a197b1c3.png"},84714:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/diva-config2-2e49aba2fbe6e74b845fb85f19d955ea.png"},28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var i=t(96540);const o={},s=i.createContext(o);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/90558919.06274dd4.js b/assets/js/90558919.06274dd4.js
new file mode 100644
index 000000000..08605df50
--- /dev/null
+++ b/assets/js/90558919.06274dd4.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[533],{847:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>l,frontMatter:()=>r,metadata:()=>o,toc:()=>a});const o=JSON.parse('{"id":"user/getting-started/access-dappnode-via-wifi","title":"Access Dappnode via Wi-Fi","description":"After connecting your Dappnode to the router and power, and turning it on, it\'s time to connect to it.","source":"@site/docs/user/getting-started/access-dappnode-via-wifi.md","sourceDirName":"user/getting-started","slug":"/user/getting-started/access-dappnode-via-wifi","permalink":"/docs/user/getting-started/access-dappnode-via-wifi","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/getting-started/access-dappnode-via-wifi.md","tags":[],"version":"current","frontMatter":{"title":"Access Dappnode via Wi-Fi","llm_description":"How to connect to DappnodeWIFI hotspot and access the web interface via browser."},"sidebar":"userSidebar","previous":{"title":"Connect your Dappnode to the router","permalink":"/docs/user/getting-started/connect-dappnode-to-the-router"},"next":{"title":"Register","permalink":"/docs/user/getting-started/register"}}');var s=t(74848),i=t(28453);const r={title:"Access Dappnode via Wi-Fi",llm_description:"How to connect to DappnodeWIFI hotspot and access the web interface via browser."},d="Access Dappnode via Wi-Fi",c={},a=[{value:"1. Connect to DappnodeWIFI:",id:"1-connect-to-dappnodewifi",level:2},{value:"2. Access the Dappnode Interface:",id:"2-access-the-dappnode-interface",level:2},{value:"Troubleshooting:",id:"troubleshooting",level:2}];function p(e){const n={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Details:o}=n;return o||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"access-dappnode-via-wi-fi",children:"Access Dappnode via Wi-Fi"})}),"\n",(0,s.jsx)(n.p,{children:"After connecting your Dappnode to the router and power, and turning it on, it's time to connect to it."}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["You ",(0,s.jsx)(n.strong,{children:"don't need"})," a monitor, keyboard, or mouse to use Dappnode. You just need to plug it to your router and you can access it from your laptop or mobile phone's browser!"]})}),"\n",(0,s.jsxs)(n.h2,{id:"1-connect-to-dappnodewifi",children:["1. ",(0,s.jsx)(n.strong,{children:"Connect to DappnodeWIFI"}),":"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"After a couple of minutes of being turned on, your dappnode will generate a WiFi hotspot"}),"\n",(0,s.jsxs)(n.li,{children:["From the device you wish to connect with, look for the Wi-Fi network named ",(0,s.jsx)(n.strong,{children:"DappnodeWIFI"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Connect using the default password: ",(0,s.jsx)(n.strong,{children:"dappnode"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Connect to Dappnode Wi-Fi",src:t(79090).A+"",width:"912",height:"102"})}),"\n",(0,s.jsxs)(n.h2,{id:"2-access-the-dappnode-interface",children:["2. ",(0,s.jsx)(n.strong,{children:"Access the Dappnode Interface"}),":"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Open your web browser."}),"\n",(0,s.jsxs)(n.li,{children:["Navigate to: ",(0,s.jsx)(n.a,{href:"http://my.dappnode/login",children:"http://my.dappnode/login"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting:"}),"\n",(0,s.jsxs)(o,{children:[(0,s.jsx)("summary",{children:(0,s.jsx)("b",{children:"How can I change my Dappnode Wi-Fi password?"})}),(0,s.jsx)(n.p,{children:"To change the Wi-Fi password:"}),(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["While connected to the Dappnode, go to ",(0,s.jsx)("a",{href:"http://my.dappnode/wireless-network/wifi",children:"Wi-Fi Settings"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:'Enter your new desired password in both the "New Password" and "Confirm New Password" fields.'}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:'Click on "Change Credentials".'}),"\n"]}),"\n"]})]}),"\n",(0,s.jsxs)(o,{children:[(0,s.jsx)("summary",{children:(0,s.jsx)("b",{children:"I can't access my Dappnode via Wi-Fi"})}),(0,s.jsxs)(n.p,{children:["You can explore other methods to access your Dappnode ",(0,s.jsx)("a",{href:"/docs/user/access-your-dappnode/overview",children:"here"}),"."]})]})]})}function l(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},79090:(e,n,t)=>{t.d(n,{A:()=>o});const o=t.p+"assets/images/dappnode-wifi-f5bea29ef163e8454642ea24484c4a55.png"},28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>d});var o=t(96540);const s={},i=o.createContext(s);function r(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/91e54d81.897be6b1.js b/assets/js/91e54d81.897be6b1.js
new file mode 100644
index 000000000..7c4404ba7
--- /dev/null
+++ b/assets/js/91e54d81.897be6b1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8538],{75754:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>r,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"user/packages/signature","title":"Packages\' Signature","description":"Dappnode\'s Packages Signatures","source":"@site/docs/user/packages/signature.md","sourceDirName":"user/packages","slug":"/user/packages/signature","permalink":"/docs/user/packages/signature","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/packages/signature.md","tags":[],"version":"current","frontMatter":{"title":"Packages\' Signature","llm_description":"Package signature verification system with trusted keys management and bypass options."},"sidebar":"userSidebar","previous":{"title":"File manager","permalink":"/docs/user/packages/understanding-dappnode-packages/file-manager"},"next":{"title":"DMS","permalink":"/docs/user/packages/dms"}}');var n=t(74848),i=t(28453);const r={title:"Packages' Signature",llm_description:"Package signature verification system with trusted keys management and bypass options."},o="Packages' Signature",d={},c=[{value:"Dappnode's Packages Signatures",id:"dappnodes-packages-signatures",level:2},{value:"Release trusted keys",id:"release-trusted-keys",level:2},{value:"Bypass trusted signature",id:"bypass-trusted-signature",level:2}];function u(e){const s={a:"a",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"packages-signature",children:"Packages' Signature"})}),"\n",(0,n.jsx)(s.h2,{id:"dappnodes-packages-signatures",children:"Dappnode's Packages Signatures"}),"\n",(0,n.jsx)(s.p,{children:"All Dappnode's packages must be on chain, which means that need a digital signature for verification. This cryptographic signature serves as a stamp of authenticity, enabling users to prove the identity of the package's author and ensuring the integrity of its source. Before installing any package into your Dappnode environment, is essential to ensure that it comes from a trusted author. This measure is vital for safeguarding your Dappnode infrastructure against unauthorized access or potential security breaches."}),"\n",(0,n.jsx)(s.h2,{id:"release-trusted-keys",children:"Release trusted keys"}),"\n",(0,n.jsxs)(s.p,{children:['By default, our software comes with a set of pre-approved keys that have validation by the Dappnode team to ensure their reliability. However, users have the flexibility to manage these trusted keys according to their preferences. If you want to check the addresses trusted by us, or even add an address trusted by yourself, you can do it in the "System" tab on the side menu, within the ',(0,n.jsx)(s.a,{href:"http://my.dappnode/system/advanced",children:'"Advanced" module'}),', in the "Release trusted keys" section.']}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Release trusted keys table",src:t(29177).A+"",width:"1713",height:"583"})}),"\n",(0,n.jsx)(s.p,{children:"This feature could be particularly useful when users intend to install Dappnode packages sourced from alternative providers or even when developing their own packages. Nevertheless, it is strongly advised to have caution when modifying trusted keys and to only incorporate new addresses after thorough verification of their credibility."}),"\n",(0,n.jsx)(s.h2,{id:"bypass-trusted-signature",children:"Bypass trusted signature"}),"\n",(0,n.jsx)(s.p,{children:"If a user attempts to install a package whose signature fails to match any of the trusted keys listed in the system, installation will be automatically blocked. However, is it possible to bypass this safeguard by toggling the trusted signature switch during the installation process. This one is only displayed if advanced options dropdown menu is active before the installation."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Trusted signature switch",src:t(32160).A+"",width:"632",height:"95"})})]})}function p(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},29177:(e,s,t)=>{t.d(s,{A:()=>a});const a=t.p+"assets/images/release-trusted-keys-b7f251d78c925c3b5c2692777afbd842.png"},32160:(e,s,t)=>{t.d(s,{A:()=>a});const a=t.p+"assets/images/signed-safe-switch-e6d549eb68086ef3684269e4c7692474.png"},28453:(e,s,t)=>{t.d(s,{R:()=>r,x:()=>o});var a=t(96540);const n={},i=a.createContext(n);function r(e){const s=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),a.createElement(i.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/925b3f96.90f2e1b2.js b/assets/js/925b3f96.90f2e1b2.js
new file mode 100644
index 000000000..4573940b1
--- /dev/null
+++ b/assets/js/925b3f96.90f2e1b2.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8609],{9420:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>r,contentTitle:()=>u,default:()=>m,frontMatter:()=>n,metadata:()=>s,toc:()=>l});var s=o(12421),i=o(74848),a=o(28453);const n={slug:"first-blog-post",title:"First Blog Post",authors:{name:"Gao Wei",title:"Docusaurus Core Team",url:"https://github.com/wgao19",image_url:"https://github.com/wgao19.png"},tags:["hola","docusaurus"]},u=void 0,r={authorsImageUrls:[void 0]},l=[];function c(t){const e={p:"p",...(0,a.R)(),...t.components};return(0,i.jsx)(e.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"})}function m(t={}){const{wrapper:e}={...(0,a.R)(),...t.components};return e?(0,i.jsx)(e,{...t,children:(0,i.jsx)(c,{...t})}):c(t)}},28453:(t,e,o)=>{o.d(e,{R:()=>n,x:()=>u});var s=o(96540);const i={},a=s.createContext(i);function n(t){const e=s.useContext(a);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function u(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:n(t.components),s.createElement(a.Provider,{value:e},t.children)}},12421:t=>{t.exports=JSON.parse('{"permalink":"/blog/first-blog-post","source":"@site/blog/2019-05-28-first-blog-post.md","title":"First Blog Post","description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet","date":"2019-05-28T00:00:00.000Z","tags":[{"inline":true,"label":"hola","permalink":"/blog/tags/hola"},{"inline":true,"label":"docusaurus","permalink":"/blog/tags/docusaurus"}],"readingTime":0.12,"hasTruncateMarker":false,"authors":[{"name":"Gao Wei","title":"Docusaurus Core Team","url":"https://github.com/wgao19","image_url":"https://github.com/wgao19.png","imageURL":"https://github.com/wgao19.png","socials":{},"key":null,"page":null}],"frontMatter":{"slug":"first-blog-post","title":"First Blog Post","authors":{"name":"Gao Wei","title":"Docusaurus Core Team","url":"https://github.com/wgao19","image_url":"https://github.com/wgao19.png","imageURL":"https://github.com/wgao19.png"},"tags":["hola","docusaurus"]},"unlisted":false,"prevItem":{"title":"Long Blog Post","permalink":"/blog/long-blog-post"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/94131f31.8298f261.js b/assets/js/94131f31.8298f261.js
new file mode 100644
index 000000000..f1db033d3
--- /dev/null
+++ b/assets/js/94131f31.8298f261.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[2701],{28406:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>t,default:()=>h,frontMatter:()=>d,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"dev/references/setup-wizard","title":"Wizard Reference","description":"The setup wizard for Dappnode packages helps automate the package customization and improve its user experience. You can allow users to conveniently edit environment variables, port mappings, and upload files while interacting with a simple web form, right before installing the package.","source":"@site/docs/dev/references/setup-wizard.md","sourceDirName":"dev/references","slug":"/dev/references/setup-wizard","permalink":"/docs/dev/references/setup-wizard","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/references/setup-wizard.md","tags":[],"version":"current","frontMatter":{"llm_description":"Reference for setup-wizard.yml to customize package installation with forms."},"sidebar":"devSidebar","previous":{"title":"Dappnode Manifest","permalink":"/docs/dev/references/manifest"},"next":{"title":"Notifications","permalink":"/docs/dev/references/notifications"}}');var s=i(74848),l=i(28453);const d={llm_description:"Reference for setup-wizard.yml to customize package installation with forms."},t="Wizard Reference",a={},c=[{value:"How to use",id:"how-to-use",level:2},{value:"Example",id:"example",level:2},{value:"version",id:"version",level:2},{value:"fields",id:"fields",level:2},{value:"id",id:"id",level:3},{value:"target",id:"target",level:3},{value:"environment",id:"environment",level:4},{value:"name",id:"name",level:5},{value:"service",id:"service",level:5},{value:"portMapping",id:"portmapping",level:4},{value:"containerPort",id:"containerport",level:5},{value:"service",id:"service-1",level:5},{value:"namedVolumeMountpoint",id:"namedvolumemountpoint",level:4},{value:"volumeName",id:"volumename",level:5},{value:"allNamedVolumesMountpoint",id:"allnamedvolumesmountpoint",level:4},{value:"fileUpload",id:"fileupload",level:4},{value:"path",id:"path",level:5},{value:"service",id:"service-2",level:5},{value:"title",id:"title",level:3},{value:"description",id:"description",level:3},{value:"secret",id:"secret",level:3},{value:"pattern",id:"pattern",level:3},{value:"patternErrorMessage",id:"patternerrormessage",level:3},{value:"enum",id:"enum",level:3},{value:"required",id:"required",level:3},{value:"if",id:"if",level:3}];function o(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"wizard-reference",children:"Wizard Reference"})}),"\n",(0,s.jsx)(n.p,{children:"The setup wizard for Dappnode packages helps automate the package customization and improve its user experience. You can allow users to conveniently edit environment variables, port mappings, and upload files while interacting with a simple web form, right before installing the package."}),"\n",(0,s.jsx)(n.h2,{id:"how-to-use",children:"How to use"}),"\n",(0,s.jsxs)(n.p,{children:["To add this functionality, create a file ",(0,s.jsx)(n.code,{children:"setup-wizard.yml"})," in the root of your Dappnode package directory. Both JSON and YAML formats are supported, but YAML makes writing markdown text blocks much easier (it's used in the ",(0,s.jsx)(n.a,{href:"#description",children:(0,s.jsx)(n.code,{children:"description"})})," property)."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-diff",children:" DappnodePackage-my-package.public.dappnode.eth/\n \u251c\u2500\u2500 build\n \u2502 \u251c\u2500\u2500 ...\n \u2502 \u2514\u2500\u2500 Dockerfile\n \u251c\u2500\u2500 avatar-my-package.png\n \u251c\u2500\u2500 dappnode_package.json\n \u251c\u2500\u2500 docker-compose.yml\n+ \u2514\u2500\u2500 setup-wizard.yml\n"})}),"\n",(0,s.jsx)(n.h2,{id:"example",children:"Example"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'version: "2"\nfields:\n - id: payoutAddress,\n target:\n type: environment\n name: PAYOUT_ADDRESS\n service: service1\n title: Payout address\n description: >-\n Address to send **payouts** too. [More info](https://more.info)\n Supports markdown and multiline\n secret: true\n pattern: "^0x[a-fA-F0-9]{40}$"\n patternErrorMessage: Must be a valid address (0x1fd16a...)\n enum:\n - normal\n - archive\n - advanced\n required: true\n if: { "mode": { "enum": ["advanced"] } }\n'})}),"\n",(0,s.jsx)(n.h2,{id:"version",children:"version"}),"\n",(0,s.jsxs)(n.p,{children:["Identify this setup wizard version. Currently only supports version ",(0,s.jsx)(n.code,{children:'"2"'})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["is ",(0,s.jsx)(n.strong,{children:"required"})]}),"\n",(0,s.jsxs)(n.li,{children:["type: ",(0,s.jsx)(n.code,{children:"string"})]}),"\n",(0,s.jsxs)(n.li,{children:["value: ",(0,s.jsx)(n.code,{children:'"2"'})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"fields",children:"fields"}),"\n",(0,s.jsx)(n.p,{children:"Setup wizard fields. Fields to show in the setup wizard form UI"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["is ",(0,s.jsx)(n.strong,{children:"required"})]}),"\n",(0,s.jsxs)(n.li,{children:["type: Array type: ",(0,s.jsx)(n.code,{children:"object[]"})]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["All items must be of the type: ",(0,s.jsx)(n.code,{children:"object"})," with the following properties:"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Property"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Required"}),(0,s.jsx)(n.th,{children:"Default"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"target"})}),(0,s.jsx)(n.td,{children:"object"}),(0,s.jsx)(n.td,{children:"Optional"}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"id"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Required"})}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"title"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Required"})}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"description"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Required"})}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"secret"})}),(0,s.jsx)(n.td,{children:"boolean"}),(0,s.jsx)(n.td,{children:"Optional"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"false"})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"pattern"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"Optional"}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"patternErrorMessage"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"Optional"}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"enum"})}),(0,s.jsx)(n.td,{children:"array"}),(0,s.jsx)(n.td,{children:"Optional"}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"required"})}),(0,s.jsx)(n.td,{children:"boolean"}),(0,s.jsx)(n.td,{children:"Optional"}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"if"})}),(0,s.jsx)(n.td,{children:"object"}),(0,s.jsx)(n.td,{children:"Optional"}),(0,s.jsx)(n.td,{})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"id",children:"id"}),"\n",(0,s.jsxs)(n.p,{children:["Unique property ID required for internal form parsing, and to use the ",(0,s.jsx)(n.code,{children:"if"})," conditional block."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["is ",(0,s.jsx)(n.strong,{children:"required"})]}),"\n",(0,s.jsxs)(n.li,{children:["type: ",(0,s.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"id: payoutAddress\n"})}),"\n",(0,s.jsx)(n.h3,{id:"target",children:"target"}),"\n",(0,s.jsx)(n.p,{children:"Maps the setup wizard field to a package configuration option. Supports:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#environment",children:(0,s.jsx)(n.code,{children:"environment"})}),": For environment variables"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#portMapping",children:(0,s.jsx)(n.code,{children:"portMapping"})}),": For port mapping"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#namedVolumeMountpoint",children:(0,s.jsx)(n.code,{children:"namedVolumeMountpoint"})}),": To allow hosting a specific package volume into a different drive or mountpoint"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#allNamedVolumesMountpoint",children:(0,s.jsx)(n.code,{children:"allNamedVolumesMountpoint"})}),": To allow hosting all package volumes into a different drive or mountpoint"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#fileUpload",children:(0,s.jsx)(n.code,{children:"fileUpload"})}),": To upload user files to the package container"]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"environment",children:"environment"}),"\n",(0,s.jsx)(n.p,{children:"To customize environment variables with user input. Targeted variables must be declared in the package's docker-compose. You can customize the type of input shown in the UI with this field properties"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#secret",children:(0,s.jsx)(n.code,{children:"secret"})}),": Hides input, to collect sensitive data."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#pattern",children:(0,s.jsx)(n.code,{children:"pattern"})}),": To validate input against any Regex expression."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#enum",children:(0,s.jsx)(n.code,{children:"enum"})}),": Show as a select dropdown menu."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"It exists two ways of defining environment variables.\nThe first one, where you define one environment var for one service, you the format to do it is the following:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"target:\n type: environment\n name: PAYOUT_ADDRESS\n service: service1\n"})}),"\n",(0,s.jsx)(n.p,{children:"In case you want to define an environment variable that is used in multiple services you can define it in the next way:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"target:\n type: environment\n name: PAYOUT_ADDRESS\n service: [service1, service2, service2]\n"})}),"\n",(0,s.jsx)(n.h5,{id:"name",children:"name"}),"\n",(0,s.jsx)(n.p,{children:"The name of the environment variable as declared in the docker-compose."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["is ",(0,s.jsx)(n.strong,{children:"required"})]}),"\n",(0,s.jsxs)(n.li,{children:["type: ",(0,s.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name: PAYOUT_ADDRESS\n"})}),"\n",(0,s.jsx)(n.h5,{id:"service",children:"service"}),"\n",(0,s.jsx)(n.p,{children:"In multi-service package, which service should be targeted with this setting."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["type: ",(0,s.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Examples:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"service: service1\n"})}),"\n",(0,s.jsx)(n.h4,{id:"portmapping",children:"portMapping"}),"\n",(0,s.jsx)(n.p,{children:"To customize port mappings with user input. Targeted container port must be declared in the package's docker-compose."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"target:\n type: portMapping\n containerPort: 9554/UDP\n service: service1\n"})}),"\n",(0,s.jsx)(n.h5,{id:"containerport",children:"containerPort"}),"\n",(0,s.jsxs)(n.p,{children:["Exposed container port to map to. Must follow the format ",(0,s.jsx)(n.code,{children:"{portNumber}"})," or ",(0,s.jsx)(n.code,{children:"{portNumber}/{PROTOCOL}"}),", where PROTOCOL must be ",(0,s.jsx)(n.code,{children:"TCP"})," or ",(0,s.jsx)(n.code,{children:"UDP"})," in all caps."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["is ",(0,s.jsx)(n.strong,{children:"required"})]}),"\n",(0,s.jsxs)(n.li,{children:["type: ",(0,s.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Examples:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"containerPort: 9554\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"containerPort: 9554/TCP\n"})}),"\n",(0,s.jsx)(n.h5,{id:"service-1",children:"service"}),"\n",(0,s.jsxs)(n.p,{children:["See ",(0,s.jsx)(n.a,{href:"#service",children:"service"})]}),"\n",(0,s.jsx)(n.h4,{id:"namedvolumemountpoint",children:"namedVolumeMountpoint"}),"\n",(0,s.jsx)(n.p,{children:"To allow hosting a specific package volume into a different drive or mountpoint"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"target:\n type: namedVolumeMountpoint\n volumeName: blockchain_data\n"})}),"\n",(0,s.jsx)(n.h5,{id:"volumename",children:"volumeName"}),"\n",(0,s.jsxs)(n.p,{children:["Name of the docker volume to allow the user to change its mountpoint. Must have the exact same name as declared in the package's compose ",(0,s.jsx)(n.code,{children:"volumes"})," section."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["is ",(0,s.jsx)(n.strong,{children:"required"})]}),"\n",(0,s.jsxs)(n.li,{children:["type: ",(0,s.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"volumeName: blockchain_data\n"})}),"\n",(0,s.jsx)(n.h4,{id:"allnamedvolumesmountpoint",children:"allNamedVolumesMountpoint"}),"\n",(0,s.jsx)(n.p,{children:"To allow hosting all package volumes into a different drive or mountpoint at once. Use this option if your package has multiple heavy volumes whose mountpoint should be changed at once."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"target:\n type: allNamedVolumesMountpoint\n"})}),"\n",(0,s.jsx)(n.h4,{id:"fileupload",children:"fileUpload"}),"\n",(0,s.jsx)(n.p,{children:"To allow uploading user files to the package container"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"target:\n type: fileUpload\n path: /usr/src/config.json\n service: service1\n"})}),"\n",(0,s.jsx)(n.h5,{id:"path",children:"path"}),"\n",(0,s.jsx)(n.p,{children:"Destination path to upload the file to. Must be a valid absolute path in the package container."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["is ",(0,s.jsx)(n.strong,{children:"required"})]}),"\n",(0,s.jsxs)(n.li,{children:["type: ",(0,s.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"path: /usr/src/config.json\n"})}),"\n",(0,s.jsx)(n.h5,{id:"service-2",children:"service"}),"\n",(0,s.jsxs)(n.p,{children:["See ",(0,s.jsx)(n.a,{href:"#service",children:"service"})]}),"\n",(0,s.jsx)(n.h3,{id:"title",children:"title"}),"\n",(0,s.jsx)(n.p,{children:"The Title Schema"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["is ",(0,s.jsx)(n.strong,{children:"required"})]}),"\n",(0,s.jsxs)(n.li,{children:["default: ",(0,s.jsx)(n.code,{children:'""'})]}),"\n",(0,s.jsxs)(n.li,{children:["type: ",(0,s.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"title: Payout address\n"})}),"\n",(0,s.jsx)(n.h3,{id:"description",children:"description"}),"\n",(0,s.jsx)(n.p,{children:"The Description Schema"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["is ",(0,s.jsx)(n.strong,{children:"required"})]}),"\n",(0,s.jsxs)(n.li,{children:["default: ",(0,s.jsx)(n.code,{children:'""'})]}),"\n",(0,s.jsxs)(n.li,{children:["type: ",(0,s.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"description: >-\n Address to send **payouts** too. [More info](https://more.info)\n Supports markdown and multiline\n"})}),"\n",(0,s.jsx)(n.h3,{id:"secret",children:"secret"}),"\n",(0,s.jsx)(n.p,{children:'Display field input as hidden. Use to collect sensitive data. It will automatically activate if the field name contains "secret" "passphrase" or "password". Only available with target environment.'}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"is optional"}),"\n",(0,s.jsxs)(n.li,{children:["default: ",(0,s.jsx)(n.code,{children:"false"})]}),"\n",(0,s.jsxs)(n.li,{children:["type: ",(0,s.jsx)(n.code,{children:"boolean"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"secret: true\n"})}),"\n",(0,s.jsx)(n.h3,{id:"pattern",children:"pattern"}),"\n",(0,s.jsxs)(n.p,{children:["Enforce this property to satisfy a regex before continuing. Only available with target environment. Use also ",(0,s.jsx)(n.a,{href:"#patternErrorMessage",children:(0,s.jsx)(n.code,{children:"patternErrorMessage"})})," to show a nicer error message when regex validation fails."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"is optional"}),"\n",(0,s.jsxs)(n.li,{children:["type: ",(0,s.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'pattern: "^0x[a-fA-F0-9]{40}$"\n'})}),"\n",(0,s.jsx)(n.h3,{id:"patternerrormessage",children:"patternErrorMessage"}),"\n",(0,s.jsx)(n.p,{children:"Error to show if the regex pattern validation fails. Only available with target environment."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"is optional"}),"\n",(0,s.jsxs)(n.li,{children:["type: ",(0,s.jsx)(n.code,{children:"string"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Examples:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"patternErrorMessage: Must be a valid address (0x1fd16a...)\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"patternErrorMessage: Must be at least 8 characters long\n"})}),"\n",(0,s.jsx)(n.h3,{id:"enum",children:"enum"}),"\n",(0,s.jsx)(n.p,{children:"List valid options. Will automatically display the input as a select menu. Only available with target environment."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"is optional"}),"\n",(0,s.jsxs)(n.li,{children:["type: Array type: ",(0,s.jsx)(n.code,{children:"string[]"})]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["All items must be of the type: ",(0,s.jsx)(n.code,{children:"string"})]}),"\n",(0,s.jsx)(n.p,{children:"Examples"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"enum:\n - normal\n - archive\n - advanced\n"})}),"\n",(0,s.jsx)(n.h3,{id:"required",children:"required"}),"\n",(0,s.jsx)(n.p,{children:"Enforce this property to be provided before continuing"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"is optional"}),"\n",(0,s.jsxs)(n.li,{children:["type: ",(0,s.jsx)(n.code,{children:"boolean"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Examples"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"required: true\n"})}),"\n",(0,s.jsx)(n.h3,{id:"if",children:"if"}),"\n",(0,s.jsxs)(n.p,{children:["Only display the field property if the ",(0,s.jsx)(n.code,{children:"if"})," schema is valid against the current form data provided by the user. The form data is an object with the structure ",(0,s.jsx)(n.code,{children:"{ [field.id]: JSONSchema }"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"is optional"}),"\n",(0,s.jsxs)(n.li,{children:["type: ",(0,s.jsx)(n.code,{children:"object"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Examples:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'if: { "mode": { "enum": ["advanced"] } }\n'})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'if: { "mode": { "enum": ["archive"] } }\n'})})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>d,x:()=>t});var r=i(96540);const s={},l=r.createContext(s);function d(e){const n=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),r.createElement(l.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/950718c7.39b2e4a0.js b/assets/js/950718c7.39b2e4a0.js
new file mode 100644
index 000000000..0483ac47e
--- /dev/null
+++ b/assets/js/950718c7.39b2e4a0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[2919],{45276:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>d,metadata:()=>t,toc:()=>s});const t=JSON.parse('{"id":"dev","title":"Welcome to the Developer Documentation!","description":"Welcome to the Dappnode\'s developer docs! This documentation is your comprehensive guide to using the tools and resources that enable you to create, deploy, and manage your own custom dappnode packages (DNP). Whether you\'re new to the project or an experienced developer, this documentation will help you navigate the intricacies of developing in the dappnode environment.","source":"@site/docs/dev.md","sourceDirName":".","slug":"/dev","permalink":"/docs/dev","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev.md","tags":[],"version":"current","frontMatter":{"title":"Welcome to the Developer Documentation!","sidebar_label":"Introduction","llm_description":"Introduction to Dappnode developer docs for creating, deploying, and managing custom packages."},"sidebar":"devSidebar","next":{"title":"Overview","permalink":"/docs/dev/sdk/overview"}}');var i=n(74848),r=n(28453);const d={title:"Welcome to the Developer Documentation!",sidebar_label:"Introduction",llm_description:"Introduction to Dappnode developer docs for creating, deploying, and managing custom packages."},a="Welcome to the Developer Documentation!",c={},s=[{value:"Contributing",id:"contributing",level:2},{value:"Feedback and Support",id:"feedback-and-support",level:2}];function p(e){const o={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"welcome-to-the-developer-documentation",children:"Welcome to the Developer Documentation!"})}),"\n",(0,i.jsx)(o.p,{children:"Welcome to the Dappnode's developer docs! This documentation is your comprehensive guide to using the tools and resources that enable you to create, deploy, and manage your own custom dappnode packages (DNP). Whether you're new to the project or an experienced developer, this documentation will help you navigate the intricacies of developing in the dappnode environment."}),"\n",(0,i.jsx)(o.admonition,{type:"caution",children:(0,i.jsxs)(o.p,{children:["This documentation is for experienced people in the dappnode ecosystem or developers who want to contribute to dappnode by creating new packages. If you're new to dappnode, we recommend starting with the ",(0,i.jsx)(o.a,{href:"/docs/user/getting-started/choose-your-path",children:"User Documentation"}),"."]})}),"\n",(0,i.jsx)(o.h2,{id:"contributing",children:"Contributing"}),"\n",(0,i.jsx)(o.p,{children:"We welcome contributions from the community! If you'd like to contribute to Dappnode, please review our [Contributing Guidelines] to understand how you can get involved."}),"\n",(0,i.jsx)(o.h2,{id:"feedback-and-support",children:"Feedback and Support"}),"\n",(0,i.jsx)(o.p,{children:"We're here to help! If you encounter any issues, have questions, or want to provide feedback, feel free to:"}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Join our community on ",(0,i.jsx)(o.a,{href:"https://discord.com/invite/dappnode",children:"Discord"})]}),"\n",(0,i.jsxs)(o.li,{children:["Open an issue on ",(0,i.jsx)(o.a,{href:"https://github.com/dappnode",children:"GitHub"})]}),"\n"]})]})}function l(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},28453:(e,o,n)=>{n.d(o,{R:()=>d,x:()=>a});var t=n(96540);const i={},r=t.createContext(i);function d(e){const o=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),t.createElement(r.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/9970.63eaff9f.js b/assets/js/9970.63eaff9f.js
new file mode 100644
index 000000000..0cfa8cdfe
--- /dev/null
+++ b/assets/js/9970.63eaff9f.js
@@ -0,0 +1 @@
+(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9970],{52362:(e,t,n)=>{"use strict";n.d(t,{A:()=>S});var s=n(96540),a=n(74848);function o(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),o=t.filter((e=>e!==n)),c=n?.props.children;return{mdxAdmonitionTitle:c,rest:o.length>0?(0,a.jsx)(a.Fragment,{children:o}):null}}(e.children),o=e.title??t;return{...e,...o&&{title:o},children:n}}var c=n(18215),r=n(50539),i=n(204);const l="admonition_xJq3",d="admonitionHeading_Gvgb",u="admonitionIcon_Rf37",m="admonitionContent_BuS1";function h(e){let{type:t,className:n,children:s}=e;return(0,a.jsx)("div",{className:(0,c.A)(i.G.common.admonition,i.G.common.admonitionType(t),l,n),children:s})}function p(e){let{icon:t,title:n}=e;return(0,a.jsxs)("div",{className:d,children:[(0,a.jsx)("span",{className:u,children:t}),n]})}function f(e){let{children:t}=e;return t?(0,a.jsx)("div",{className:m,children:t}):null}function g(e){const{type:t,icon:n,title:s,children:o,className:c}=e;return(0,a.jsxs)(h,{type:t,className:c,children:[s||n?(0,a.jsx)(p,{title:s,icon:n}):null,(0,a.jsx)(f,{children:o})]})}function x(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const j={icon:(0,a.jsx)(x,{}),title:(0,a.jsx)(r.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function b(e){return(0,a.jsx)(g,{...j,...e,className:(0,c.A)("alert alert--secondary",e.className),children:e.children})}function v(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,a.jsx)(v,{}),title:(0,a.jsx)(r.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function N(e){return(0,a.jsx)(g,{...y,...e,className:(0,c.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const k={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(r.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function B(e){return(0,a.jsx)(g,{...k,...e,className:(0,c.A)("alert alert--info",e.className),children:e.children})}function C(e){return(0,a.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const w={icon:(0,a.jsx)(C,{}),title:(0,a.jsx)(r.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function _(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const E={icon:(0,a.jsx)(_,{}),title:(0,a.jsx)(r.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const T={icon:(0,a.jsx)(C,{}),title:(0,a.jsx)(r.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const L={...{note:b,tip:N,info:B,warning:function(e){return(0,a.jsx)(g,{...w,...e,className:(0,c.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,a.jsx)(g,{...E,...e,className:(0,c.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,a.jsx)(b,{title:"secondary",...e}),important:e=>(0,a.jsx)(B,{title:"important",...e}),success:e=>(0,a.jsx)(N,{title:"success",...e}),caution:function(e){return(0,a.jsx)(g,{...T,...e,className:(0,c.A)("alert alert--warning",e.className),children:e.children})}}};function S(e){const t=o(e),n=(s=t.type,L[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),L.info));var s;return(0,a.jsx)(n,{...t})}},5783:(e,t,n)=>{"use strict";n.d(t,{A:()=>g});n(96540);var s=n(18215),a=n(50539),o=n(204),c=n(56289);const r={iconEdit:"iconEdit_Z9Sw"};var i=n(74848);function l(e){let{className:t,...n}=e;return(0,i.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,s.A)(r.iconEdit,t),"aria-hidden":"true",...n,children:(0,i.jsx)("g",{children:(0,i.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function d(e){let{editUrl:t}=e;return(0,i.jsxs)(c.A,{to:t,className:o.G.common.editThisPage,children:[(0,i.jsx)(l,{}),(0,i.jsx)(a.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var u=n(98569);function m(e){let{lastUpdatedAt:t}=e;const n=new Date(t),s=(0,u.i)({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(n);return(0,i.jsx)(a.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,i.jsx)("b",{children:(0,i.jsx)("time",{dateTime:n.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function h(e){let{lastUpdatedBy:t}=e;return(0,i.jsx)(a.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,i.jsx)("b",{children:t})},children:" by {user}"})}function p(e){let{lastUpdatedAt:t,lastUpdatedBy:n}=e;return(0,i.jsxs)("span",{className:o.G.common.lastUpdated,children:[(0,i.jsx)(a.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t?(0,i.jsx)(m,{lastUpdatedAt:t}):"",byUser:n?(0,i.jsx)(h,{lastUpdatedBy:n}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const f={lastUpdated:"lastUpdated_JAkA"};function g(e){let{className:t,editUrl:n,lastUpdatedAt:a,lastUpdatedBy:o}=e;return(0,i.jsxs)("div",{className:(0,s.A)("row",t),children:[(0,i.jsx)("div",{className:"col",children:n&&(0,i.jsx)(d,{editUrl:n})}),(0,i.jsx)("div",{className:(0,s.A)("col",f.lastUpdated),children:(a||o)&&(0,i.jsx)(p,{lastUpdatedAt:a,lastUpdatedBy:o})})]})}},900:(e,t,n)=>{"use strict";n.d(t,{A:()=>me});var s=n(96540),a=n(28453),o=n(27143),c=n(9136),r=n(18215),i=n(8532),l=n(53115);function d(){const{prism:e}=(0,l.p)(),{colorMode:t}=(0,i.G)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var u=n(204),m=n(18426),h=n.n(m);const p=/title=(?["'])(?.*?)\1/,f=/\{(?[\d,-]+)\}/,g={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},x={...g,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},j=Object.keys(g);function b(e,t){const n=e.map((e=>{const{start:n,end:s}=x[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${s})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function v(e,t){let n=e.replace(/\n$/,"");const{language:s,magicComments:a,metastring:o}=t;if(o&&f.test(o)){const e=o.match(f).groups.range;if(0===a.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${o}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=a[0].className,s=h()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(s),code:n}}if(void 0===s)return{lineClassNames:{},code:n};const c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return b(["js","jsBlock"],t);case"jsx":case"tsx":return b(["js","jsBlock","jsx"],t);case"html":return b(["js","jsBlock","html"],t);case"python":case"py":case"bash":return b(["bash"],t);case"markdown":case"md":return b(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return b(["tex"],t);case"lua":case"haskell":return b(["lua"],t);case"sql":return b(["lua","jsBlock"],t);case"wasm":return b(["wasm"],t);case"vb":case"vba":case"visual-basic":return b(["vb","rem"],t);case"vbnet":return b(["vbnet","rem"],t);case"batch":return b(["rem"],t);case"basic":return b(["rem","f90"],t);case"fsharp":return b(["js","ml"],t);case"ocaml":case"sml":return b(["ml"],t);case"fortran":return b(["f90"],t);case"cobol":return b(["cobol"],t);default:return b(j,t)}}(s,a),r=n.split("\n"),i=Object.fromEntries(a.map((e=>[e.className,{start:0,range:""}]))),l=Object.fromEntries(a.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;hvoid 0!==e));l[t]?i[l[t]].range+=`${h},`:d[t]?i[d[t]].start=h:u[t]&&(i[u[t]].range+=`${i[u[t]].start}-${h-1},`),r.splice(h,1)}n=r.join("\n");const m={};return Object.entries(i).forEach((e=>{let[t,{range:n}]=e;h()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const y="codeBlockContainer_Ckt0";var N=n(74848);function A(e){let{as:t,...n}=e;const s=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[s,a]=e;const o=t[s];o&&"string"==typeof a&&(n[o]=a)})),n}(d());return(0,N.jsx)(t,{...n,style:s,className:(0,r.A)(n.className,y,u.G.common.codeBlock)})}const k={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function B(e){let{children:t,className:n}=e;return(0,N.jsx)(A,{as:"pre",tabIndex:0,className:(0,r.A)(k.codeBlockStandalone,"thin-scrollbar",n),children:(0,N.jsx)("code",{className:k.codeBlockLines,children:t})})}var C=n(26849);const w={attributes:!0,characterData:!0,childList:!0,subtree:!0};function _(e,t){const[n,a]=(0,s.useState)(),o=(0,s.useCallback)((()=>{a(e.current?.closest("[role=tabpanel][hidden]"))}),[e,a]);(0,s.useEffect)((()=>{o()}),[o]),function(e,t,n){void 0===n&&(n=w);const a=(0,C._q)(t),o=(0,C.Be)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(a);return e&&t.observe(e,o),()=>t.disconnect()}),[e,a,o])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),o())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var E=n(78181);const T="codeLine_lJS_",L="codeLineNumber_Tfdd",S="codeLineContent_feaV";function U(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:a,getTokenProps:o}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const c=a({line:t,className:(0,r.A)(n,s&&T)}),i=t.map(((e,t)=>(0,N.jsx)("span",{...o({token:e})},t)));return(0,N.jsxs)("span",{...c,children:[s?(0,N.jsxs)(N.Fragment,{children:[(0,N.jsx)("span",{className:L}),(0,N.jsx)("span",{className:S,children:i})]}):i,(0,N.jsx)("br",{})]})}var M=n(50539);function z(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function R(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const H={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function I(e){let{code:t,className:n}=e;const[a,o]=(0,s.useState)(!1),c=(0,s.useRef)(void 0),i=(0,s.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const s=document.createElement("textarea"),a=document.activeElement;s.value=e,s.setAttribute("readonly",""),s.style.contain="strict",s.style.position="absolute",s.style.left="-9999px",s.style.fontSize="12pt";const o=document.getSelection(),c=o.rangeCount>0&&o.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let r=!1;try{r=document.execCommand("copy")}catch{}s.remove(),c&&(o.removeAllRanges(),o.addRange(c)),a&&a.focus()}(t),o(!0),c.current=window.setTimeout((()=>{o(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),(0,N.jsx)("button",{type:"button","aria-label":a?(0,M.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,M.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,M.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,r.A)("clean-btn",n,H.copyButton,a&&H.copyButtonCopied),onClick:i,children:(0,N.jsxs)("span",{className:H.copyButtonIcons,"aria-hidden":"true",children:[(0,N.jsx)(z,{className:H.copyButtonIcon}),(0,N.jsx)(R,{className:H.copyButtonSuccessIcon})]})})}function V(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const $="wordWrapButtonIcon_Bwma",D="wordWrapButtonEnabled_EoeP";function P(e){let{className:t,onClick:n,isEnabled:s}=e;const a=(0,M.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,N.jsx)("button",{type:"button",onClick:n,className:(0,r.A)("clean-btn",t,s&&D),"aria-label":a,title:a,children:(0,N.jsx)(V,{className:$,"aria-hidden":"true"})})}function W(e){let{children:t,className:n="",metastring:a,title:o,showLineNumbers:c,language:i}=e;const{prism:{defaultLanguage:u,magicComments:m}}=(0,l.p)(),h=function(e){return e?.toLowerCase()}(i??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??u),f=d(),g=function(){const[e,t]=(0,s.useState)(!1),[n,a]=(0,s.useState)(!1),o=(0,s.useRef)(null),c=(0,s.useCallback)((()=>{const n=o.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[o,e]),r=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=o.current,n=e>t||o.current.querySelector("code").hasAttribute("style");a(n)}),[o]);return _(o,r),(0,s.useEffect)((()=>{r()}),[e,r]),(0,s.useEffect)((()=>(window.addEventListener("resize",r,{passive:!0}),()=>{window.removeEventListener("resize",r)})),[r]),{codeBlockRef:o,isEnabled:e,isCodeScrollable:n,toggle:c}}(),x=function(e){return e?.match(p)?.groups.title??""}(a)||o,{lineClassNames:j,code:b}=v(t,{metastring:a,language:h,magicComments:m}),y=c??function(e){return Boolean(e?.includes("showLineNumbers"))}(a);return(0,N.jsxs)(A,{as:"div",className:(0,r.A)(n,h&&!n.includes(`language-${h}`)&&`language-${h}`),children:[x&&(0,N.jsx)("div",{className:k.codeBlockTitle,children:x}),(0,N.jsxs)("div",{className:k.codeBlockContent,children:[(0,N.jsx)(E.f4,{theme:f,code:b,language:h??"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:a,getTokenProps:o}=e;return(0,N.jsx)("pre",{tabIndex:0,ref:g.codeBlockRef,className:(0,r.A)(t,k.codeBlock,"thin-scrollbar"),style:n,children:(0,N.jsx)("code",{className:(0,r.A)(k.codeBlockLines,y&&k.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,N.jsx)(U,{line:e,getLineProps:a,getTokenProps:o,classNames:j[t],showLineNumbers:y},t)))})})}}),(0,N.jsxs)("div",{className:k.buttonGroup,children:[(g.isEnabled||g.isCodeScrollable)&&(0,N.jsx)(P,{className:k.codeButton,onClick:()=>g.toggle(),isEnabled:g.isEnabled}),(0,N.jsx)(I,{className:k.codeButton,code:b})]})]})]})}function G(e){let{children:t,...n}=e;const a=(0,c.A)(),o=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),r="string"==typeof o?W:B;return(0,N.jsx)(r,{...n,children:o},String(a))}function q(e){return(0,N.jsx)("code",{...e})}var O=n(56289);var F=n(15066),Z=n(25246),J=n(33535);const Y="details_lb9f",K="isBrowser_bmU9",Q="collapsibleContent_i85q";function X(e){return!!e&&("SUMMARY"===e.tagName||X(e.parentElement))}function ee(e,t){return!!e&&(e===t||ee(e.parentElement,t))}function te(e){let{summary:t,children:n,...a}=e;(0,Z.A)().collectAnchor(a.id);const o=(0,c.A)(),r=(0,s.useRef)(null),{collapsed:i,setCollapsed:l}=(0,J.u)({initialState:!a.open}),[d,u]=(0,s.useState)(a.open),m=s.isValidElement(t)?t:(0,N.jsx)("summary",{children:t??"Details"});return(0,N.jsxs)("details",{...a,ref:r,open:d,"data-collapsed":i,className:(0,F.A)(Y,o&&K,a.className),onMouseDown:e=>{X(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;X(t)&&ee(t,r.current)&&(e.preventDefault(),i?(l(!1),u(!0)):l(!0))},children:[m,(0,N.jsx)(J.N,{lazy:!1,collapsed:i,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{l(e),u(!e)},children:(0,N.jsx)("div",{className:Q,children:n})})]})}const ne="details_b_Ee";function se(e){let{...t}=e;return(0,N.jsx)(te,{...t,className:(0,r.A)("alert alert--info",ne,t.className)})}function ae(e){const t=s.Children.toArray(e.children),n=t.find((e=>s.isValidElement(e)&&"summary"===e.type)),a=(0,N.jsx)(N.Fragment,{children:t.filter((e=>e!==n))});return(0,N.jsx)(se,{...e,summary:n,children:a})}var oe=n(9303);function ce(e){return(0,N.jsx)(oe.A,{...e})}const re="containsTaskList_mC6p";function ie(e){if(void 0!==e)return(0,r.A)(e,e?.includes("contains-task-list")&&re)}const le="img_ev3q";var de=n(52362);const ue={Head:o.A,details:ae,Details:ae,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,N.jsx)(q,{...e}):(0,N.jsx)(G,{...e})},a:function(e){return(0,N.jsx)(O.A,{...e})},pre:function(e){return(0,N.jsx)(N.Fragment,{children:e.children})},ul:function(e){return(0,N.jsx)("ul",{...e,className:ie(e.className)})},li:function(e){return(0,Z.A)().collectAnchor(e.id),(0,N.jsx)("li",{...e})},img:function(e){return(0,N.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,r.A)(t,le))});var t},h1:e=>(0,N.jsx)(ce,{as:"h1",...e}),h2:e=>(0,N.jsx)(ce,{as:"h2",...e}),h3:e=>(0,N.jsx)(ce,{as:"h3",...e}),h4:e=>(0,N.jsx)(ce,{as:"h4",...e}),h5:e=>(0,N.jsx)(ce,{as:"h5",...e}),h6:e=>(0,N.jsx)(ce,{as:"h6",...e}),admonition:de.A,mermaid:()=>null};function me(e){let{children:t}=e;return(0,N.jsx)(a.x,{components:ue,children:t})}},11865:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});n(96540);var s=n(18215),a=n(56289),o=n(74848);function c(e){const{permalink:t,title:n,subLabel:c,isNext:r}=e;return(0,o.jsxs)(a.A,{className:(0,s.A)("pagination-nav__link",r?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[c&&(0,o.jsx)("div",{className:"pagination-nav__sublabel",children:c}),(0,o.jsx)("div",{className:"pagination-nav__label",children:n})]})}},23953:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});n(96540);var s=n(18215),a=n(56289);const o={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var c=n(74848);function r(e){let{permalink:t,label:n,count:r,description:i}=e;return(0,c.jsxs)(a.A,{href:t,title:i,className:(0,s.A)(o.tag,r?o.tagWithCount:o.tagRegular),children:[n,r&&(0,c.jsx)("span",{children:r})]})}},56239:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});n(96540);var s=n(18215),a=n(50539),o=n(23953);const c={tags:"tags_jXut",tag:"tag_QGVx"};var r=n(74848);function i(e){let{tags:t}=e;return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("b",{children:(0,r.jsx)(a.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,r.jsx)("ul",{className:(0,s.A)(c.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,r.jsx)("li",{className:c.tag,children:(0,r.jsx)(o.A,{...e})},e.permalink)))})]})}},98569:(e,t,n)=>{"use strict";n.d(t,{i:()=>a});var s=n(40797);function a(e){void 0===e&&(e={});const{i18n:{currentLocale:t}}=(0,s.A)(),n=function(){const{i18n:{currentLocale:e,localeConfigs:t}}=(0,s.A)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:n,...e})}},18426:(e,t)=>{function n(e){let t,n=[];for(let s of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(s))n.push(parseInt(s,10));else if(t=s.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,s,a,o]=t;if(s&&o){s=parseInt(s),o=parseInt(o);const e=s{"use strict";n.d(t,{R:()=>c,x:()=>r});var s=n(96540);const a={},o=s.createContext(a);function c(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:c(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/9c6c90aa.8fba3fea.js b/assets/js/9c6c90aa.8fba3fea.js
new file mode 100644
index 000000000..6c675ab29
--- /dev/null
+++ b/assets/js/9c6c90aa.8fba3fea.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5187],{17369:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"dev/github-actions/staker-packages/web3signer","title":"Web3Signer Workflows","description":"The CI workflows for Web3Signer packages are currently being designed. This documentation will be updated once the workflows are finalized.","source":"@site/docs/dev/github-actions/staker-packages/web3signer.md","sourceDirName":"dev/github-actions/staker-packages","slug":"/dev/github-actions/staker-packages/web3signer","permalink":"/docs/dev/github-actions/staker-packages/web3signer","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/github-actions/staker-packages/web3signer.md","tags":[],"version":"current","frontMatter":{"title":"Web3Signer Workflows","sidebar_label":"Web3Signer","llm_description":"GitHub Actions workflows for the Dappnode Web3Signer package (to be designed)."},"sidebar":"devSidebar","previous":{"title":"Consensus Clients","permalink":"/docs/dev/github-actions/staker-packages/consensus-clients"}}');var t=i(74848),r=i(28453);const o={title:"Web3Signer Workflows",sidebar_label:"Web3Signer",llm_description:"GitHub Actions workflows for the Dappnode Web3Signer package (to be designed)."},d="Web3Signer Workflows",l={},c=[{value:"Overview",id:"overview",level:2},{value:"Planned Workflows",id:"planned-workflows",level:2},{value:"Testing Considerations",id:"testing-considerations",level:2},{value:"Contributing",id:"contributing",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"web3signer-workflows",children:"Web3Signer Workflows"})}),"\n",(0,t.jsx)(n.admonition,{title:"Work in Progress",type:"caution",children:(0,t.jsx)(n.p,{children:"The CI workflows for Web3Signer packages are currently being designed. This documentation will be updated once the workflows are finalized."})}),"\n",(0,t.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,t.jsx)(n.p,{children:"Web3Signer is a critical component in the staking stack that handles validator key management and signing. The CI workflows for Web3Signer will need to verify:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Proper key import functionality"}),"\n",(0,t.jsx)(n.li,{children:"Signing operations work correctly"}),"\n",(0,t.jsx)(n.li,{children:"Integration with both execution and consensus client pairs"}),"\n",(0,t.jsx)(n.li,{children:"Slashing protection database handling"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"planned-workflows",children:"Planned Workflows"}),"\n",(0,t.jsx)(n.p,{children:"The following workflows are being considered for Web3Signer packages:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Workflow"}),(0,t.jsx)(n.th,{children:"Status"}),(0,t.jsx)(n.th,{children:"Purpose"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"auto_check.yml"})}),(0,t.jsx)(n.td,{children:"\ud83d\udd04 TBD"}),(0,t.jsx)(n.td,{children:"Check for upstream updates"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"sync-test.yml"})}),(0,t.jsx)(n.td,{children:"\ud83d\udd04 TBD"}),(0,t.jsx)(n.td,{children:"Test package changes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"release.yml"})}),(0,t.jsx)(n.td,{children:"\ud83d\udd04 TBD"}),(0,t.jsx)(n.td,{children:"Release with integration test"})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"testing-considerations",children:"Testing Considerations"}),"\n",(0,t.jsx)(n.p,{children:"Web3Signer testing presents unique challenges:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Key Management"}),": Tests need to handle validator keys securely"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Slashing Protection"}),": Must verify slashing protection DB is working correctly"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Client Compatibility"}),": Should test with multiple execution/consensus client combinations"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"API Verification"}),": Web3Signer's remote signing API should be validated"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"contributing",children:"Contributing"}),"\n",(0,t.jsx)(n.p,{children:"If you have ideas or want to contribute to the Web3Signer CI workflow design, please:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Join the discussion on ",(0,t.jsx)(n.a,{href:"https://discord.com/invite/dappnode",children:"Discord"})]}),"\n",(0,t.jsxs)(n.li,{children:["Open an issue on ",(0,t.jsx)(n.a,{href:"https://github.com/dappnode",children:"GitHub"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>d});var s=i(96540);const t={},r=s.createContext(t);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/9c8bdb8f.b3ef9ab2.js b/assets/js/9c8bdb8f.b3ef9ab2.js
new file mode 100644
index 000000000..1094e1ec0
--- /dev/null
+++ b/assets/js/9c8bdb8f.b3ef9ab2.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[893],{33837:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"dev/github-actions/staker-packages/consensus-clients","title":"Consensus Client Workflows","description":"Consensus client packages (Lodestar, Teku, Prysm, Nimbus, Lighthouse) use three GitHub Actions workflows. Unlike execution clients, consensus clients do not need a sync.yml workflow because they use checkpoint sync, which doesn\'t require pre-synced volumes.","source":"@site/docs/dev/github-actions/staker-packages/consensus-clients.md","sourceDirName":"dev/github-actions/staker-packages","slug":"/dev/github-actions/staker-packages/consensus-clients","permalink":"/docs/dev/github-actions/staker-packages/consensus-clients","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/github-actions/staker-packages/consensus-clients.md","tags":[],"version":"current","frontMatter":{"title":"Consensus Client Workflows","sidebar_label":"Consensus Clients","llm_description":"GitHub Actions workflows for Dappnode consensus client packages including sync-test and release workflows."},"sidebar":"devSidebar","previous":{"title":"Execution Clients","permalink":"/docs/dev/github-actions/staker-packages/execution-clients"},"next":{"title":"Web3Signer","permalink":"/docs/dev/github-actions/staker-packages/web3signer"}}');var r=s(74848),i=s(28453);const o={title:"Consensus Client Workflows",sidebar_label:"Consensus Clients",llm_description:"GitHub Actions workflows for Dappnode consensus client packages including sync-test and release workflows."},c="Consensus Client Workflows",l={},d=[{value:"Workflow Overview",id:"workflow-overview",level:2},{value:"1. Auto Check for Upstream Updates (auto_check.yml)",id:"1-auto-check-for-upstream-updates-auto_checkyml",level:2},{value:"2. Sync Test (sync-test.yml)",id:"2-sync-test-sync-testyml",level:2},{value:"Workflow File",id:"workflow-file",level:3},{value:"Key Differences from Execution Client Workflows",id:"key-differences-from-execution-client-workflows",level:3},{value:"PR Report",id:"pr-report",level:3},{value:"3. Release (release.yml)",id:"3-release-releaseyml",level:2},{value:"Workflow File",id:"workflow-file-1",level:3},{value:"Features",id:"features",level:3},{value:"Checkpoint Sync",id:"checkpoint-sync",level:2},{value:"Environment Variables",id:"environment-variables",level:2}];function a(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"consensus-client-workflows",children:"Consensus Client Workflows"})}),"\n",(0,r.jsxs)(n.p,{children:["Consensus client packages (Lodestar, Teku, Prysm, Nimbus, Lighthouse) use three GitHub Actions workflows. Unlike execution clients, consensus clients ",(0,r.jsxs)(n.strong,{children:["do not need a ",(0,r.jsx)(n.code,{children:"sync.yml"})," workflow"]})," because they use checkpoint sync, which doesn't require pre-synced volumes."]}),"\n",(0,r.jsx)(n.h2,{id:"workflow-overview",children:"Workflow Overview"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Workflow"}),(0,r.jsx)(n.th,{children:"Trigger"}),(0,r.jsx)(n.th,{children:"Purpose"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"auto_check.yml"})}),(0,r.jsx)(n.td,{children:"Scheduled (every 4h)"}),(0,r.jsx)(n.td,{children:"Check for upstream updates"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"sync-test.yml"})}),(0,r.jsx)(n.td,{children:"Pull requests + manual"}),(0,r.jsx)(n.td,{children:"Test package changes"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"release.yml"})}),(0,r.jsx)(n.td,{children:"Push to main + manual"}),(0,r.jsx)(n.td,{children:"Release with attestation test"})]})]})]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Consensus clients don't have a ",(0,r.jsx)(n.code,{children:"sync.yml"})," workflow because they use ",(0,r.jsx)(n.strong,{children:"checkpoint sync"}),". This allows them to sync quickly from a trusted checkpoint rather than from genesis, eliminating the need for pre-synced volumes."]})}),"\n",(0,r.jsxs)(n.h2,{id:"1-auto-check-for-upstream-updates-auto_checkyml",children:["1. Auto Check for Upstream Updates (",(0,r.jsx)(n.code,{children:"auto_check.yml"}),")"]}),"\n",(0,r.jsx)(n.p,{children:"Same as standard packages - checks for upstream updates and creates PRs when new versions are available."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'name: Bump upstream version\n\non:\n schedule:\n - cron: "00 */4 * * *"\n push:\n branches:\n - "master"\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v3\n - run: npx @dappnode/dappnodesdk github-action bump-upstream\n env:\n GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n PINATA_API_KEY: ${{ secrets.PINATA_API_KEY }}\n PINATA_SECRET_API_KEY: ${{ secrets.PINATA_SECRET_API_KEY }}\n'})}),"\n",(0,r.jsxs)(n.h2,{id:"2-sync-test-sync-testyml",children:["2. Sync Test (",(0,r.jsx)(n.code,{children:"sync-test.yml"}),")"]}),"\n",(0,r.jsx)(n.p,{children:"Triggered on PRs to test package changes. Builds the consensus client package, uploads it to the local IPFS node, and runs a sync test paired with an execution client."}),"\n",(0,r.jsx)(n.h3,{id:"workflow-file",children:"Workflow File"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'name: Consensus Client Sync Test\n\non:\n workflow_dispatch:\n inputs:\n execution_client:\n description: "Execution Client"\n required: true\n type: choice\n options: [geth, reth, nethermind, besu, erigon]\n pull_request:\n branches:\n - "main"\n paths-ignore:\n - "README.md"\n\njobs:\n build:\n runs-on: staking-test-hoodi\n name: Build\n outputs:\n ipfs_hash: ${{ steps.extract_hash.outputs.ipfs_hash }}\n steps:\n - uses: actions/checkout@v6\n - name: Build and upload\n run: npx @dappnode/dappnodesdk build --provider=http://$(docker inspect DAppNodeCore-ipfs.dnp.dappnode.eth --format \'{{.NetworkSettings.Networks.dncore_network.IPAddress}}\'):5001 --variant=hoodi\n - name: Extract IPFS hash from releases.json\n id: extract_hash\n run: |\n # Get the last key\'s hash from releases.json\n IPFS_HASH=$(jq -r \'to_entries | last | .value.hash\' package_variants/hoodi/releases.json)\n echo "ipfs_hash=$IPFS_HASH" >> $GITHUB_OUTPUT\n echo "Extracted IPFS hash: $IPFS_HASH"\n\n sync-test:\n runs-on: staking-test-hoodi\n name: Consensus Client Sync Test\n needs: [build]\n steps:\n - name: Run sync\n run: |\n docker run --rm --pull=always --network dncore_network \\\n -v /var/run/docker.sock:/var/run/docker.sock \\\n -e MODE=sync \\\n -e CONSENSUS_CLIENT=\'teku\' \\\n -e IPFS_HASH=${{ needs.build.outputs.ipfs_hash }} \\\n -e EXECUTION_CLIENT=${{ github.event.inputs.execution_client }} \\\n -e GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} \\\n -e GITHUB_REPOSITORY=${{ github.repository }} \\\n -e GITHUB_PR_NUMBER=${{ github.event.pull_request.number }} \\\n -e GITHUB_RUN_ID=${{ github.run_id }} \\\n -e GITHUB_SERVER_URL=${{ github.server_url }} \\\n ghcr.io/dappnode/staker-test-util/test-runner:latest\n'})}),"\n",(0,r.jsx)(n.h3,{id:"key-differences-from-execution-client-workflows",children:"Key Differences from Execution Client Workflows"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"CONSENSUS_CLIENT"})})," is set to the package being tested (e.g., ",(0,r.jsx)(n.code,{children:"teku"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"EXECUTION_CLIENT"})})," is the input parameter for selecting which execution client to pair with"]}),"\n",(0,r.jsx)(n.li,{children:"The IPFS hash refers to the consensus client package being tested"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"pr-report",children:"PR Report"}),"\n",(0,r.jsx)(n.p,{children:"After the test completes, a report is posted to the PR including:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Clients used and versions (before/after install)"}),"\n",(0,r.jsx)(n.li,{children:"Timing measurements for each operation"}),"\n",(0,r.jsx)(n.li,{children:"Container error logs (if any)"}),"\n",(0,r.jsx)(n.li,{children:"Link to full CI logs"}),"\n"]}),"\n",(0,r.jsxs)(n.h2,{id:"3-release-releaseyml",children:["3. Release (",(0,r.jsx)(n.code,{children:"release.yml"}),")"]}),"\n",(0,r.jsx)(n.p,{children:"Triggered on push to main. Runs a full attestation test before releasing the package."}),"\n",(0,r.jsx)(n.h3,{id:"workflow-file-1",children:"Workflow File"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'name: "Release"\n\non:\n workflow_dispatch:\n inputs:\n execution_client:\n description: "Execution Client"\n required: true\n type: choice\n options: [geth, reth, nethermind, besu, erigon]\n push:\n branches:\n - "main"\n paths-ignore:\n - "README.md"\n\njobs:\n build:\n runs-on: staking-test-hoodi\n name: Build\n outputs:\n ipfs_hash: ${{ steps.extract_hash.outputs.ipfs_hash }}\n steps:\n - uses: actions/checkout@v6\n - name: Build and upload\n run: npx @dappnode/dappnodesdk build --provider=http://$(docker inspect DAppNodeCore-ipfs.dnp.dappnode.eth --format \'{{.NetworkSettings.Networks.dncore_network.IPAddress}}\'):5001 --variant=hoodi\n - name: Extract IPFS hash from releases.json\n id: extract_hash\n run: |\n # Get the last key\'s hash from releases.json\n IPFS_HASH=$(jq -r \'to_entries | last | .value.hash\' package_variants/hoodi/releases.json)\n echo "ipfs_hash=$IPFS_HASH" >> $GITHUB_OUTPUT\n echo "Extracted IPFS hash: $IPFS_HASH"\n\n test:\n name: Test\n runs-on: staking-test-hoodi\n needs: [build]\n steps:\n - uses: actions/checkout@v6\n - name: Run staker test runner\n run: |\n docker run --rm --pull=always \\\n --network dncore_network \\\n -v /var/run/docker.sock:/var/run/docker.sock \\\n -e MODE=test \\\n -e IPFS_HASH=${{ needs.build.outputs.ipfs_hash }} \\\n -e CONSENSUS_CLIENT=\'teku\' \\\n -e EXECUTION_CLIENT=${{ github.event.inputs.execution_client }} \\\n -e GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} \\\n -e GITHUB_REPOSITORY=${{ github.repository }} \\\n -e GITHUB_PR_NUMBER=${{ github.event.pull_request.number }} \\\n -e GITHUB_RUN_ID=${{ github.run_id }} \\\n -e GITHUB_SERVER_URL=${{ github.server_url }} \\\n ghcr.io/dappnode/staker-test-util/test-runner:latest\n\n release:\n name: Release\n runs-on: ipfs-dev-gateway\n needs: [test]\n steps:\n - uses: actions/checkout@v6\n - uses: actions/setup-node@v6\n with:\n node-version: "22"\n - name: Publish\n run: npx @dappnode/dappnodesdk publish patch --content_provider=http://10.200.200.7:5001 --eth_provider=https://web3.dappnode.net --timeout 2h --all-variants\n env:\n GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n DEVELOPER_ADDRESS: "0xf35960302a07022aba880dffaec2fdd64d5bf1c1"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"features",children:"Features"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Proof of Attestation Test"}),": The test job uses ",(0,r.jsx)(n.code,{children:"MODE=test"})," which:","\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Syncs execution and consensus clients (consensus uses checkpoint sync)"}),"\n",(0,r.jsx)(n.li,{children:"Imports validators into web3signer"}),"\n",(0,r.jsx)(n.li,{children:"Waits for validators to become live on the beacon chain"}),"\n",(0,r.jsx)(n.li,{children:"Confirms successful attestation"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Three-stage pipeline"}),": Build \u2192 Test \u2192 Release"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Different runners"}),": Test runs on ",(0,r.jsx)(n.code,{children:"staking-test-hoodi"}),", release on ",(0,r.jsx)(n.code,{children:"ipfs-dev-gateway"})]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"checkpoint-sync",children:"Checkpoint Sync"}),"\n",(0,r.jsxs)(n.p,{children:["Consensus clients benefit from ",(0,r.jsx)(n.strong,{children:"checkpoint sync"}),", which allows them to:"]}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Start syncing from a recent finalized checkpoint instead of genesis"}),"\n",(0,r.jsx)(n.li,{children:"Sync in minutes rather than hours or days"}),"\n",(0,r.jsx)(n.li,{children:"Avoid the need for pre-synced volumes on the self-hosted runner"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["This is why consensus client packages don't need a dedicated ",(0,r.jsx)(n.code,{children:"sync.yml"})," workflow to maintain a synced state."]}),"\n",(0,r.jsx)(n.h2,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Variable"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"MODE"})}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"sync"})," for sync only, ",(0,r.jsx)(n.code,{children:"test"})," for full attestation test"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"CONSENSUS_CLIENT"})}),(0,r.jsxs)(n.td,{children:["The consensus client name being tested (e.g., ",(0,r.jsx)(n.code,{children:"teku"}),", ",(0,r.jsx)(n.code,{children:"lighthouse"}),")"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"EXECUTION_CLIENT"})}),(0,r.jsx)(n.td,{children:"The execution client to pair with"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"IPFS_HASH"})}),(0,r.jsx)(n.td,{children:"The IPFS hash of the built package to test"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"NETWORK"})}),(0,r.jsxs)(n.td,{children:["The network to use (e.g., ",(0,r.jsx)(n.code,{children:"hoodi"}),")"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"GITHUB_TOKEN"})}),(0,r.jsx)(n.td,{children:"For PR commenting and GitHub API access"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"GITHUB_REPOSITORY"})}),(0,r.jsx)(n.td,{children:"Repository name for PR comments"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"GITHUB_PR_NUMBER"})}),(0,r.jsx)(n.td,{children:"PR number for posting reports"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"GITHUB_RUN_ID"})}),(0,r.jsx)(n.td,{children:"Run ID for linking to CI logs"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"GITHUB_SERVER_URL"})}),(0,r.jsx)(n.td,{children:"GitHub server URL for links"})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>c});var t=s(96540);const r={},i=t.createContext(r);function o(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/9e4087bc.69c3bc18.js b/assets/js/9e4087bc.69c3bc18.js
new file mode 100644
index 000000000..e8af4de0f
--- /dev/null
+++ b/assets/js/9e4087bc.69c3bc18.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[2711],{14750:(e,r,t)=>{t.r(r),t.d(r,{default:()=>m});t(96540);var a=t(56289),n=t(50539),s=t(81082),i=t(98569),c=t(99795),l=t(9303),o=t(74848);function d(e){let{year:r,posts:t}=e;const n=(0,i.i)({day:"numeric",month:"long",timeZone:"UTC"});return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(l.A,{as:"h3",id:r,children:r}),(0,o.jsx)("ul",{children:t.map((e=>{return(0,o.jsx)("li",{children:(0,o.jsxs)(a.A,{to:e.metadata.permalink,children:[(r=e.metadata.date,n.format(new Date(r)))," - ",e.metadata.title]})},e.metadata.date);var r}))})]})}function h(e){let{years:r}=e;return(0,o.jsx)("section",{className:"margin-vert--lg",children:(0,o.jsx)("div",{className:"container",children:(0,o.jsx)("div",{className:"row",children:r.map(((e,r)=>(0,o.jsx)("div",{className:"col col--4 margin-vert--lg",children:(0,o.jsx)(d,{...e})},r)))})})})}function m(e){let{archive:r}=e;const t=(0,n.T)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),a=(0,n.T)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),i=function(e){const r=e.reduce(((e,r)=>{const t=r.metadata.date.split("-")[0],a=e.get(t)??[];return e.set(t,[r,...a])}),new Map);return Array.from(r,(e=>{let[r,t]=e;return{year:r,posts:t}}))}(r.blogPosts);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.be,{title:t,description:a}),(0,o.jsxs)(c.A,{children:[(0,o.jsx)("header",{className:"hero hero--primary",children:(0,o.jsxs)("div",{className:"container",children:[(0,o.jsx)(l.A,{as:"h1",className:"hero__title",children:t}),(0,o.jsx)("p",{className:"hero__subtitle",children:a})]})}),(0,o.jsx)("main",{children:i.length>0&&(0,o.jsx)(h,{years:i})})]})]})}},98569:(e,r,t)=>{t.d(r,{i:()=>n});var a=t(40797);function n(e){void 0===e&&(e={});const{i18n:{currentLocale:r}}=(0,a.A)(),t=function(){const{i18n:{currentLocale:e,localeConfigs:r}}=(0,a.A)();return r[e].calendar}();return new Intl.DateTimeFormat(r,{calendar:t,...e})}}}]);
\ No newline at end of file
diff --git a/assets/js/9e93dc42.3825ef58.js b/assets/js/9e93dc42.3825ef58.js
new file mode 100644
index 000000000..bcc531fa6
--- /dev/null
+++ b/assets/js/9e93dc42.3825ef58.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[6524],{49127:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"user/install/iso","title":"ISO Installation","description":"When you want to perform a clean installation by installing the base operating system and Dappnode. Installing from an ISO will wipe the machine data and install Dappnode over Debian.","source":"@site/docs/user/install/iso.md","sourceDirName":"user/install","slug":"/user/install/iso","permalink":"/docs/user/install/iso","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/install/iso.md","tags":[],"version":"current","frontMatter":{"title":"ISO Installation","llm_description":"Guide to install Dappnode from ISO: download, burn to USB, boot, and follow prompts."},"sidebar":"userSidebar","previous":{"title":"Overview","permalink":"/docs/user/install/overview"},"next":{"title":"Script","permalink":"/docs/user/install/script"}}');var s=t(74848),o=t(28453);const l={title:"ISO Installation",llm_description:"Guide to install Dappnode from ISO: download, burn to USB, boot, and follow prompts."},r="ISO Installation",a={},d=[{value:"Get the ISO",id:"get-the-iso",level:2},{value:"Burn the ISO in a USB",id:"burn-the-iso-in-a-usb",level:2},{value:"Boot from the USB",id:"boot-from-the-usb",level:2},{value:"Follow the Installation Prompts",id:"follow-the-installation-prompts",level:2},{value:"Final Steps",id:"final-steps",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"iso-installation",children:"ISO Installation"})}),"\n",(0,s.jsx)(n.p,{children:"When you want to perform a clean installation by installing the base operating system and Dappnode. Installing from an ISO will wipe the machine data and install Dappnode over Debian."}),"\n",(0,s.jsx)(n.h2,{id:"get-the-iso",children:"Get the ISO"}),"\n",(0,s.jsxs)(n.p,{children:["You can get the image downloading directly from ",(0,s.jsx)(n.a,{href:"https://github.com/dappnode/Dappnode/releases",children:"Dappnode ISO"})," or if you prefer you can build it from the ",(0,s.jsx)(n.a,{href:"https://github.com/dappnode/Dappnode#install-dappnode-with-iso",children:"source"}),"."]}),"\n",(0,s.jsxs)(n.admonition,{title:"Attended VS Unattended ISO",type:"note",children:[(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Attended ISO"}),": An attended ISO installation involves a manual setup process where the user must be present to make choices, answer prompts, and guide the installation through its various stages. It provides more control over the configuration, allowing for customization based on specific needs."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Unattended ISO"}),": The unattended ISO installation is an automated process where pre-defined settings are used to install Dappnode without user intervention. This is ideal for straightforward installations where default configurations are preferred. It speeds up the process and ensures consistency in the setup."]}),"\n"]}),"\n"]}),(0,s.jsx)(n.p,{children:"Consider your specific requirements and the level of customization you need when deciding between these two installation methods."})]}),"\n",(0,s.jsx)(n.h2,{id:"burn-the-iso-in-a-usb",children:"Burn the ISO in a USB"}),"\n",(0,s.jsxs)(n.p,{children:["Burn the ISO to a USB stick. To do so we recommend using ",(0,s.jsx)(n.a,{href:"https://www.balena.io/etcher/",children:"Balena Etcher"})," for the OS with which you will prepare the USB to boot from your server and install Dappnode."]}),"\n",(0,s.jsx)(n.admonition,{type:"danger",children:(0,s.jsx)(n.p,{children:"If you trigger the installation in a machine containing data, all existing data will be erased."})}),"\n",(0,s.jsx)(n.h2,{id:"boot-from-the-usb",children:"Boot from the USB"}),"\n",(0,s.jsx)(n.p,{children:"After burning the ISO to the USB stick:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Insert"})," the USB stick into the machine where you want to install Dappnode."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Reboot"})," the machine."]}),"\n",(0,s.jsxs)(n.li,{children:["During the boot process, access the ",(0,s.jsx)(n.strong,{children:"boot menu"})," (the key to press varies depending on the machine manufacturer; commonly used keys include F2, F10, F12, ESC, or DEL)."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Select"})," the USB stick as the boot device."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"The machine should now boot from the USB, and you'll see the Dappnode installation interface."}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"Make sure that an Ethernet cable is plugged in to your device during the installation process, otherwise it will fail."})}),"\n",(0,s.jsx)(n.h2,{id:"follow-the-installation-prompts",children:"Follow the Installation Prompts"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["If you've chosen the ",(0,s.jsx)(n.strong,{children:"Attended ISO"}),", you'll be presented with a series of prompts asking for configuration details and preferences. Follow the on-screen instructions and provide the necessary input to proceed."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["If you've opted for the ",(0,s.jsx)(n.strong,{children:"Unattended ISO"}),", the installation will proceed automatically, using predefined settings."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.admonition,{title:"Default Credentials",type:"tip",children:[(0,s.jsx)(n.p,{children:"If you're using the Unattended ISO, the default credentials are:"}),(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"user"}),": ",(0,s.jsx)(n.code,{children:"dappnode"})]}),(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"pass"}),": ",(0,s.jsx)(n.code,{children:"dappnode.s0"})]})]}),"\n",(0,s.jsx)(n.h2,{id:"final-steps",children:"Final Steps"}),"\n",(0,s.jsx)(n.p,{children:"Once the installation is complete:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Remove"})," the USB stick."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Reboot"})," the machine (you might need to do this twice)"]}),"\n",(0,s.jsxs)(n.li,{children:["On startup, Dappnode should be running. You can check it by executing ",(0,s.jsx)(n.code,{children:"docker ps"})," in the terminal and some of the ",(0,s.jsx)(n.a,{href:"/docs/user/install/dappnode-commands",children:"Dappnode Commands"})]}),"\n",(0,s.jsx)(n.li,{children:"Finally, you can begin the post-installation setup and configuration."}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"Remember to keep your Dappnode running 24/7 for optimal performance, especially if you are hosting blockchain nodes or other continuous services."})}),"\n",(0,s.jsx)(n.p,{children:"Congratulations! You've successfully installed Dappnode using the ISO method. For any further assistance or troubleshooting, always refer to the official Dappnode documentation or community support."})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>r});var i=t(96540);const s={},o=i.createContext(s);function l(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a22f54b8.6bf3ff64.js b/assets/js/a22f54b8.6bf3ff64.js
new file mode 100644
index 000000000..fa12ca73f
--- /dev/null
+++ b/assets/js/a22f54b8.6bf3ff64.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[7323],{22786:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>i,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>t,toc:()=>p});const t=JSON.parse('{"id":"user/packages/understanding-dappnode-packages/file-manager","title":"File Manager","description":"Also handy whenever your package has a database you\'ll need to access or modify, but without going through a terminal. Download and upload files in an easy way with the File Manager.","source":"@site/docs/user/packages/understanding-dappnode-packages/file-manager.md","sourceDirName":"user/packages/understanding-dappnode-packages","slug":"/user/packages/understanding-dappnode-packages/file-manager","permalink":"/docs/user/packages/understanding-dappnode-packages/file-manager","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/packages/understanding-dappnode-packages/file-manager.md","tags":[],"version":"current","frontMatter":{"title":"File Manager","llm_description":"File Manager for downloading and uploading files to package databases without terminal."},"sidebar":"userSidebar","previous":{"title":"Backup","permalink":"/docs/user/packages/understanding-dappnode-packages/backup"},"next":{"title":"Packages\' signature","permalink":"/docs/user/packages/signature"}}');var s=n(74848),d=n(28453);const r={title:"File Manager",llm_description:"File Manager for downloading and uploading files to package databases without terminal."},o="File Manager",i={},p=[];function c(e){const a={h1:"h1",header:"header",img:"img",p:"p",...(0,d.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.header,{children:(0,s.jsx)(a.h1,{id:"file-manager",children:"File Manager"})}),"\n",(0,s.jsx)(a.p,{children:"Also handy whenever your package has a database you'll need to access or modify, but without going through a terminal. Download and upload files in an easy way with the File Manager."}),"\n",(0,s.jsx)(a.p,{children:(0,s.jsx)(a.img,{alt:"dappnode_packages6",src:n(28692).A+"",width:"1741",height:"1091"})})]})}function l(e={}){const{wrapper:a}={...(0,d.R)(),...e.components};return a?(0,s.jsx)(a,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28692:(e,a,n)=>{n.d(a,{A:()=>t});const t=n.p+"assets/images/dappnode_packages6-3da72f7cab4ec4f639799523d3274ff8.png"},28453:(e,a,n)=>{n.d(a,{R:()=>r,x:()=>o});var t=n(96540);const s={},d=t.createContext(s);function r(e){const a=t.useContext(d);return t.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function o(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(d.Provider,{value:a},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a2f2eb75.1d2cee3e.js b/assets/js/a2f2eb75.1d2cee3e.js
new file mode 100644
index 000000000..52a869543
--- /dev/null
+++ b/assets/js/a2f2eb75.1d2cee3e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1371],{56194:(o,e,t)=>{t.r(e),t.d(e,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>i,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"smooth/deep-dive-into-smooth/consolidations","title":"Consolidations","description":"Since the Pectra update on May 7, 2025, validators can stake up to 2048 ETH. Instead of having to manage multiple 32 ETH validators, users can now choose to stake an arbitrary amount of ETH in a single validator.","source":"@site/docs/smooth/deep-dive-into-smooth/consolidations.md","sourceDirName":"smooth/deep-dive-into-smooth","slug":"/smooth/deep-dive-into-smooth/consolidations","permalink":"/docs/smooth/deep-dive-into-smooth/consolidations","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/smooth/deep-dive-into-smooth/consolidations.md","tags":[],"version":"current","frontMatter":{"title":"Consolidations","llm_description":"How Smooth handles Pectra validator consolidations and transfers pending rewards automatically."},"sidebar":"smoothSidebar","previous":{"title":"Avoid proposing Vanilla Blocks","permalink":"/docs/smooth/deep-dive-into-smooth/vanilla-blocks"},"next":{"title":"Overview","permalink":"/docs/smooth/subscribe-to-smooth/overview"}}');var n=t(74848),s=t(28453);const i={title:"Consolidations",llm_description:"How Smooth handles Pectra validator consolidations and transfers pending rewards automatically."},r="Consolidations",d={},l=[{value:"How Smooth manages consolidations",id:"how-smooth-manages-consolidations",level:2},{value:"As a Smooth user, what do I need to do?",id:"as-a-smooth-user-what-do-i-need-to-do",level:2}];function h(o){const e={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,s.R)(),...o.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.header,{children:(0,n.jsx)(e.h1,{id:"consolidations",children:"Consolidations"})}),"\n",(0,n.jsxs)(e.p,{children:["Since the ",(0,n.jsx)(e.a,{href:"https://ethereum.org/en/history/#pectra",children:"Pectra"})," update on May 7, 2025, validators can stake up to 2048 ETH. Instead of having to manage multiple 32 ETH validators, users can now choose to stake an arbitrary amount of ETH in a single validator."]}),"\n",(0,n.jsxs)(e.p,{children:["To make a validator able to stake more than 32 ETH, users will have to ",(0,n.jsx)(e.strong,{children:"upgrade the validator's withdrawal credentials"}),": From 0x01 to 0x02. You can do it in the ",(0,n.jsx)(e.a,{href:"https://launchpad.ethereum.org/en/",children:"Staking Launchpad"})," interface."]}),"\n",(0,n.jsxs)(e.p,{children:["It is also possible to ",(0,n.jsx)(e.strong,{children:"consolidate"})," multiple 32 ETH validators into a single validator with a higher stake. This requires an extra step: a ",(0,n.jsx)(e.strong,{children:"consolidation"}),". In a consolidation, two validators are merged into a single one. The ",(0,n.jsx)(e.em,{children:'"source"'})," validator will exit the chain, transferring its stake to the ",(0,n.jsx)(e.em,{children:'"target"'})," validator."]}),"\n",(0,n.jsxs)(e.p,{children:["Consolidations can also be done through the ",(0,n.jsx)(e.a,{href:"https://launchpad.ethereum.org/en/",children:"Staking Launchpad"})," interface."]}),"\n",(0,n.jsx)(e.h2,{id:"how-smooth-manages-consolidations",children:"How Smooth manages consolidations"}),"\n",(0,n.jsxs)(e.p,{children:["Smooth will automatically detect when a validator is the source of a consolidation. Upon doing so, it will transfer all the ",(0,n.jsx)(e.em,{children:"pending rewards"})," from the source validator to the target validator. This way, no pending rewards will be lost during the consolidation process. Smooth will also remove the source validator from the pool."]}),"\n",(0,n.jsx)(e.h2,{id:"as-a-smooth-user-what-do-i-need-to-do",children:"As a Smooth user, what do I need to do?"}),"\n",(0,n.jsx)(e.p,{children:"Consolidation is not required\u2014Smooth will continue to work normally even if you don\u2019t consolidate your validators."}),"\n",(0,n.jsxs)(e.p,{children:["However, if you want to consolidate any of your validators, you will need to upgrade your validator\u2019s withdrawal credentials to 0x02 and perform the consolidation through the ",(0,n.jsx)(e.a,{href:"https://launchpad.ethereum.org/en/",children:"Staking Launchpad"})," interface. You will not need to do anything else; Smooth will take care of the rest. ",(0,n.jsx)(e.strong,{children:'Please ensure that the "target" validator of your consolidation is already subscribed to Smooth.'})]}),"\n",(0,n.jsx)(e.admonition,{type:"danger",children:(0,n.jsx)(e.p,{children:"DO NOT manually unsubscribe any validator. Manually unsubscribing a validator will remove its pending rewards and Smooth will not be able to transfer them to the target validator. Smooth will automatically unsubscribe the source validator once the consolidation is complete."})}),"\n",(0,n.jsxs)(e.p,{children:["A consolidation may take a few days to complete. Once your source validator exits the chain, Smooth will transfer the pending rewards to the target validator. We recommend checking ",(0,n.jsx)(e.a,{href:"https://smooth.dappnode.io/dashboard",children:"Smooth's dashboard"})," to see if the transfer was successful."]})]})}function c(o={}){const{wrapper:e}={...(0,s.R)(),...o.components};return e?(0,n.jsx)(e,{...o,children:(0,n.jsx)(h,{...o})}):h(o)}},28453:(o,e,t)=>{t.d(e,{R:()=>i,x:()=>r});var a=t(96540);const n={},s=a.createContext(n);function i(o){const e=a.useContext(s);return a.useMemo((function(){return"function"==typeof o?o(e):{...e,...o}}),[e,o])}function r(o){let e;return e=o.disableParentContext?"function"==typeof o.components?o.components(n):o.components||n:i(o.components),a.createElement(s.Provider,{value:e},o.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a33eb6a8.f464b280.js b/assets/js/a33eb6a8.f464b280.js
new file mode 100644
index 000000000..37525aa26
--- /dev/null
+++ b/assets/js/a33eb6a8.f464b280.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[3384],{1755:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"user/staking/ethereum/lsd-pools/stakewise","title":"StakeWise","description":"---","source":"@site/docs/user/staking/ethereum/lsd-pools/stakewise.md","sourceDirName":"user/staking/ethereum/lsd-pools","slug":"/user/staking/ethereum/lsd-pools/stakewise","permalink":"/docs/user/staking/ethereum/lsd-pools/stakewise","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/ethereum/lsd-pools/stakewise.md","tags":[],"version":"current","frontMatter":{"title":"StakeWise","llm_description":"StakeWise liquid staking setup on Dappnode with solo or pooled staking options."},"sidebar":"userSidebar","previous":{"title":"Rocketpool","permalink":"/docs/user/staking/ethereum/lsd-pools/rocketpool"},"next":{"title":"Stakehouse","permalink":"/docs/user/staking/ethereum/lsd-pools/stakehouse"}}');var i=n(74848),r=n(28453);const a={title:"StakeWise",llm_description:"StakeWise liquid staking setup on Dappnode with solo or pooled staking options."},o="StakeWise",l={},d=[{value:"StakeWise Overview",id:"stakewise-overview",level:3},{value:"Package Key Features",id:"package-key-features",level:3},{value:"First Steps to Start Staking with StakeWise and Dappnode",id:"first-steps-to-start-staking-with-stakewise-and-dappnode",level:3}];function c(e){const s={h1:"h1",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"stakewise",children:"StakeWise"})}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h3,{id:"stakewise-overview",children:(0,i.jsx)(s.strong,{children:"StakeWise Overview"})}),"\n",(0,i.jsx)(s.p,{children:"StakeWise is an LSD network service that allows anyone to benefit from the yields available on the Ethereum Beacon Chain. StakeWise runs secure and stable institutional-grade infrastructure, combined with unique tokenomics, to provide the highest possible staking yields for its users. As a liquid staking platform, users are free to un-stake at any time or utilise their staked ETH capital to earn enhanced yields throughout DeFi. There is no minimum ETH requirement to stake with StakeWise and the platform fees are the lowest seen across the industry."}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h3,{id:"package-key-features",children:(0,i.jsx)(s.strong,{children:"Package Key Features"})}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Solo and Pooled Staking:"})," StakeWise allows users the flexibility to choose between solo staking and joining a staking pool."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Tokenized Staking Rewards:"})," StakeWise tokenizes staking rewards, which users can trade, providing liquidity and flexibility."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Comprehensive Dashboard:"})," Users have access to a detailed dashboard that displays staking performance, rewards, and other essential metrics."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Transparent Fee Structure:"})," StakeWise prides itself on transparent fees with no hidden charges, ensuring users retain maximum rewards."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Integrated with DappNode:"})," Easy setup, monitoring, and management of StakeWise directly from your DappNode interface."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Active Community Engagement:"})," StakeWise boasts an active community, ensuring users get timely support and updates."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h3,{id:"first-steps-to-start-staking-with-stakewise-and-dappnode",children:(0,i.jsx)(s.strong,{children:"First Steps to Start Staking with StakeWise and Dappnode"})}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Package Installation:"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Go to the DappNode Admin UI."}),"\n",(0,i.jsx)(s.li,{children:"In the 'Packages' section, search for the StakeWise package."}),"\n",(0,i.jsx)(s.li,{children:"Click 'Install'. Once installed, StakeWise should appear in your installed packages list."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Setting up the Environment:"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Ensure you have connected your DappNode to the Ethereum network."}),"\n",(0,i.jsx)(s.li,{children:"For best results, secure a stable and fast internet connection for your DappNode."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Beginning the Staking Process:"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Navigate to the StakeWise dashboard in the DappNode UI."}),"\n",(0,i.jsx)(s.li,{children:"Decide between solo staking or joining a staking pool."}),"\n",(0,i.jsx)(s.li,{children:"Specify the amount of ETH you wish to stake."}),"\n",(0,i.jsx)(s.li,{children:"Follow the on-screen instructions to initiate your staking."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Funding your Staking:"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Transfer your chosen ETH amount to the provided staking address. Be sure to safely store and remember this address."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Monitoring and Management:"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"With staking active, use the StakeWise dashboard on DappNode to oversee performance, track rewards, and manage other staking aspects."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.p,{children:"Staking on Ethereum 2.0, though potentially profitable, isn't without risks. While StakeWise makes the process user-friendly, it's vital to understand all potential implications and prioritize your investments' security."}),"\n",(0,i.jsx)(s.p,{children:"For more in-depth insights and assistance, consider exploring StakeWise's official documentation and joining the discussions on DappNode's community forums."})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},28453:(e,s,n)=>{n.d(s,{R:()=>a,x:()=>o});var t=n(96540);const i={},r=t.createContext(i);function a(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a5f12663.6c2deaa1.js b/assets/js/a5f12663.6c2deaa1.js
new file mode 100644
index 000000000..7064f83ec
--- /dev/null
+++ b/assets/js/a5f12663.6c2deaa1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[7876],{8806:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>r,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"dev/github-actions/overview","title":"GitHub Actions for Dappnode Packages","description":"GitHub Actions help automate workflows around your projects on GitHub. For Dappnode packages, we utilize specific GitHub Actions to manage updates, testing, and releases.","source":"@site/docs/dev/github-actions/overview.md","sourceDirName":"dev/github-actions","slug":"/dev/github-actions/overview","permalink":"/docs/dev/github-actions/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/github-actions/overview.md","tags":[],"version":"current","frontMatter":{"title":"GitHub Actions for Dappnode Packages","sidebar_label":"Overview","llm_description":"Overview of GitHub Actions workflows for automating upstream updates, testing, and releases in Dappnode packages."},"sidebar":"devSidebar","previous":{"title":"Package DNS","permalink":"/docs/dev/dns"},"next":{"title":"Standard Packages","permalink":"/docs/dev/github-actions/standard-packages"}}');var t=s(74848),i=s(28453);const r={title:"GitHub Actions for Dappnode Packages",sidebar_label:"Overview",llm_description:"Overview of GitHub Actions workflows for automating upstream updates, testing, and releases in Dappnode packages."},o="GitHub Actions for Dappnode Packages",c={},d=[{value:"Types of Dappnode Packages",id:"types-of-dappnode-packages",level:2},{value:"Standard Packages",id:"standard-packages",level:3},{value:"Staker Packages",id:"staker-packages",level:3},{value:"Common Requirements",id:"common-requirements",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"github-actions-for-dappnode-packages",children:"GitHub Actions for Dappnode Packages"})}),"\n",(0,t.jsx)(n.p,{children:"GitHub Actions help automate workflows around your projects on GitHub. For Dappnode packages, we utilize specific GitHub Actions to manage updates, testing, and releases."}),"\n",(0,t.jsx)(n.h2,{id:"types-of-dappnode-packages",children:"Types of Dappnode Packages"}),"\n",(0,t.jsx)(n.p,{children:"Dappnode packages fall into two main categories, each with different CI/CD requirements:"}),"\n",(0,t.jsx)(n.h3,{id:"standard-packages",children:"Standard Packages"}),"\n",(0,t.jsx)(n.p,{children:"Standard packages (e.g., Rotki, IPFS, etc.) use a simpler CI workflow that includes:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Upstream version checking"}),": Automatically detects new upstream releases"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Build and pre-release"}),": Builds packages and creates pre-releases on PRs and pushes"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["See ",(0,t.jsx)(n.a,{href:"/docs/dev/github-actions/standard-packages",children:"Standard Packages CI"})," for detailed workflow configurations."]}),"\n",(0,t.jsx)(n.h3,{id:"staker-packages",children:"Staker Packages"}),"\n",(0,t.jsx)(n.p,{children:"Staker packages require more complex CI that includes integration testing on real Dappnode hardware. These packages include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Execution clients"})," (Geth, Reth, Nethermind, Besu, Erigon)"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Consensus clients"})," (Lodestar, Teku, Prysm, Nimbus, Lighthouse)"]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.strong,{children:"Web3Signer"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.strong,{children:"MEV-Boost"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The staker package CI runs on a GitHub self-hosted runner with Dappnode pre-installed and running with ",(0,t.jsx)(n.code,{children:"DEV=true"}),", which enables the WebSocket frontend-backend RPC as an API. This allows the CI to use the same RPC calls a user would make to configure a staker setup."]}),"\n",(0,t.jsxs)(n.p,{children:["See ",(0,t.jsx)(n.a,{href:"/docs/dev/github-actions/staker-packages/overview",children:"Staker Packages CI"})," for detailed information about:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"/docs/dev/github-actions/staker-packages/execution-clients",children:"Execution Client Workflows"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"/docs/dev/github-actions/staker-packages/consensus-clients",children:"Consensus Client Workflows"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"/docs/dev/github-actions/staker-packages/web3signer",children:"Web3Signer Workflows"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"common-requirements",children:"Common Requirements"}),"\n",(0,t.jsx)(n.p,{children:"All Dappnode package workflows require:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"GITHUB_TOKEN"})}),": Automatically provided by GitHub for authentication"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"PINATA_API_KEY"})})," and ",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"PINATA_SECRET_API_KEY"})}),": For interfacing with the IPFS pinning service Pinata (standard packages)"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Staker packages additionally require:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Access to a self-hosted runner with Dappnode installed"}),"\n",(0,t.jsx)(n.li,{children:"Pre-synced execution client volumes for faster test execution"}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>o});var a=s(96540);const t={},i=a.createContext(t);function r(e){const n=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),a.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a6aa9e1f.c51b5bd7.js b/assets/js/a6aa9e1f.c51b5bd7.js
new file mode 100644
index 000000000..ef379132e
--- /dev/null
+++ b/assets/js/a6aa9e1f.c51b5bd7.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[7643],{55631:(e,t,a)=>{a.r(t),a.d(t,{default:()=>j});a(96540);var s=a(18215),n=a(40797),r=a(81082),i=a(204),l=a(60569),o=a(17448),c=a(37220),d=a(14005),m=a(27143),g=a(83750),u=a(74848);function h(e){const t=(0,g.kJ)(e);return(0,u.jsx)(m.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function p(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,n.A)(),{blogDescription:s,blogTitle:i,permalink:l}=t,o="/"===l?a:i;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(r.be,{title:o,description:s}),(0,u.jsx)(c.A,{tag:"blog_posts_list"})]})}function x(e){const{metadata:t,items:a,sidebar:s}=e;return(0,u.jsxs)(l.A,{sidebar:s,children:[(0,u.jsx)(d.A,{items:a}),(0,u.jsx)(o.A,{metadata:t})]})}function j(e){return(0,u.jsxs)(r.e3,{className:(0,s.A)(i.G.wrapper.blogPages,i.G.page.blogListPage),children:[(0,u.jsx)(p,{...e}),(0,u.jsx)(h,{...e}),(0,u.jsx)(x,{...e})]})}},17448:(e,t,a)=>{a.d(t,{A:()=>i});a(96540);var s=a(50539),n=a(11865),r=a(74848);function i(e){const{metadata:t}=e,{previousPage:a,nextPage:i}=t;return(0,r.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[a&&(0,r.jsx)(n.A,{permalink:a,title:(0,r.jsx)(s.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer entries"})}),i&&(0,r.jsx)(n.A,{permalink:i,title:(0,r.jsx)(s.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},18189:(e,t,a)=>{a.d(t,{A:()=>C});a(96540);var s=a(18215),n=a(83750),r=a(74848);function i(e){let{children:t,className:a}=e;return(0,r.jsx)("article",{className:a,children:t})}var l=a(56289);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:i}=(0,n.e7)(),{permalink:c,title:d}=a,m=i?"h1":"h2";return(0,r.jsx)(m,{className:(0,s.A)(o.title,t),children:i?d:(0,r.jsx)(l.A,{to:c,children:d})})}var d=a(50539),m=a(81430),g=a(98569);const u={container:"container_mt6G"};function h(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,m.W)();return t=>{const a=Math.ceil(t);return e(a,(0,d.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,r.jsx)(r.Fragment,{children:a(t)})}function p(e){let{date:t,formattedDate:a}=e;return(0,r.jsx)("time",{dateTime:t,children:a})}function x(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function j(e){let{className:t}=e;const{metadata:a}=(0,n.e7)(),{date:i,readingTime:l}=a,o=(0,g.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,s.A)(u.container,"margin-vert--md",t),children:[(0,r.jsx)(p,{date:i,formattedDate:(c=i,o.format(new Date(c)))}),void 0!==l&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(x,{}),(0,r.jsx)(h,{readingTime:l})]})]});var c}var A=a(95921);const b={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function f(e){let{className:t}=e;const{metadata:{authors:a},assets:i}=(0,n.e7)();if(0===a.length)return null;const l=a.every((e=>{let{name:t}=e;return!t})),o=1===a.length;return(0,r.jsx)("div",{className:(0,s.A)("margin-top--md margin-bottom--sm",l?b.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,r.jsx)("div",{className:(0,s.A)(!l&&(o?"col col--12":"col col--6"),l?b.imageOnlyAuthorCol:b.authorCol),children:(0,r.jsx)(A.A,{author:{...e,imageURL:i.authorsImageUrls[t]??e.imageURL}})},t)))})}function v(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(j,{}),(0,r.jsx)(f,{})]})}var N=a(30099),T=a(900);function w(e){let{children:t,className:a}=e;const{isBlogPostPage:i}=(0,n.e7)();return(0,r.jsx)("div",{id:i?N.LU:void 0,className:(0,s.A)("markdown",a),children:(0,r.jsx)(T.A,{children:t})})}var y=a(204),_=a(5783),k=a(56239);function P(){return(0,r.jsx)("b",{children:(0,r.jsx)(d.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function U(e){const{blogPostTitle:t,...a}=e;return(0,r.jsx)(l.A,{"aria-label":(0,d.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,r.jsx)(P,{})})}function R(){const{metadata:e,isBlogPostPage:t}=(0,n.e7)(),{tags:a,title:i,editUrl:l,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,m=!t&&o,g=a.length>0;if(!(g||m||l))return null;if(t){const e=!!(l||d||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[g&&(0,r.jsx)("div",{className:(0,s.A)("row","margin-top--sm",y.G.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(k.A,{tags:a})})}),e&&(0,r.jsx)(_.A,{className:(0,s.A)("margin-top--sm",y.G.blog.blogFooterEditMetaRow),editUrl:l,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[g&&(0,r.jsx)("div",{className:(0,s.A)("col",{"col--9":m}),children:(0,r.jsx)(k.A,{tags:a})}),m&&(0,r.jsx)("div",{className:(0,s.A)("col text--right",{"col--3":g}),children:(0,r.jsx)(U,{blogPostTitle:i,to:e.permalink})})]})}function C(e){let{children:t,className:a}=e;const l=function(){const{isBlogPostPage:e}=(0,n.e7)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(i,{className:(0,s.A)(l,a),children:[(0,r.jsx)(v,{}),(0,r.jsx)(w,{children:t}),(0,r.jsx)(R,{})]})}},14005:(e,t,a)=>{a.d(t,{A:()=>i});a(96540);var s=a(83750),n=a(18189),r=a(74848);function i(e){let{items:t,component:a=n.A}=e;return(0,r.jsx)(r.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,r.jsx)(s.in,{content:t,children:(0,r.jsx)(a,{children:(0,r.jsx)(t,{})})},t.metadata.permalink)}))})}}}]);
\ No newline at end of file
diff --git a/assets/js/a7456010.1fcdb44e.js b/assets/js/a7456010.1fcdb44e.js
new file mode 100644
index 000000000..14a215b0d
--- /dev/null
+++ b/assets/js/a7456010.1fcdb44e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1235],{88552:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]);
\ No newline at end of file
diff --git a/assets/js/a7bd4aaa.ec6c698d.js b/assets/js/a7bd4aaa.ec6c698d.js
new file mode 100644
index 000000000..b5425ff72
--- /dev/null
+++ b/assets/js/a7bd4aaa.ec6c698d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[7098],{15047:(n,e,s)=>{s.r(e),s.d(e,{default:()=>l});s(96540);var o=s(81082),r=s(23716),t=s(21858),c=s(22831),i=s(37220),d=s(74848);function a(n){const{version:e}=n;return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(i.A,{version:e.version,tag:(0,r.k)(e.pluginId,e.version)}),(0,d.jsx)(o.be,{children:e.noIndex&&(0,d.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function u(n){const{version:e,route:s}=n;return(0,d.jsx)(o.e3,{className:e.className,children:(0,d.jsx)(t.n,{version:e,children:(0,c.v)(s.routes)})})}function l(n){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(a,{...n}),(0,d.jsx)(u,{...n})]})}}}]);
\ No newline at end of file
diff --git a/assets/js/a830b4cf.84a3fa01.js b/assets/js/a830b4cf.84a3fa01.js
new file mode 100644
index 000000000..61fb09c31
--- /dev/null
+++ b/assets/js/a830b4cf.84a3fa01.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4496],{88374:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>d,default:()=>c,frontMatter:()=>i,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"user/staking/ethereum/lsd-pools/lido/register","title":"**Become a Lido Node Operator with Dappnode**","description":"Dappnode provides an easy-to-use and intuitive interface for most of the infrastructure needed to become a Lido Node Operator. The process is straightforward and requires only a few steps to set up a node operator and start earning rewards. An overview of the process is how the Lido CSM UI will greet you when first connecting your wallet to the dApp:","source":"@site/docs/user/staking/ethereum/lsd-pools/lido/register.md","sourceDirName":"user/staking/ethereum/lsd-pools/lido","slug":"/user/staking/ethereum/lsd-pools/lido/register","permalink":"/docs/user/staking/ethereum/lsd-pools/lido/register","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/ethereum/lsd-pools/lido/register.md","tags":[],"version":"current","frontMatter":{"title":"**Become a Lido Node Operator with Dappnode**","llm_description":"Step-by-step guide to register as a new Lido CSM node operator on Dappnode."},"sidebar":"userSidebar","previous":{"title":"Overview","permalink":"/docs/user/staking/ethereum/lsd-pools/lido/overview"},"next":{"title":"I am already a Node Operator","permalink":"/docs/user/staking/ethereum/lsd-pools/lido/already-node-operator"}}');var s=o(74848),r=o(28453);const i={title:"**Become a Lido Node Operator with Dappnode**",llm_description:"Step-by-step guide to register as a new Lido CSM node operator on Dappnode."},d="Become a Lido Node Operator with Dappnode",a={},l=[{value:"First Steps to create a Node Operator in Dappnode",id:"first-steps-to-create-a-node-operator-in-dappnode",level:2},{value:"1. Getting your Dappnode ready",id:"1-getting-your-dappnode-ready",level:3},{value:"2. Create the Keystores & Deposit Data",id:"2-create-the-keystores--deposit-data",level:3},{value:"3. Install the Lido CSM package",id:"3-install-the-lido-csm-package",level:3},{value:"4. Register as Node Operator",id:"4-register-as-node-operator",level:3},{value:"4.1 Connect your wallet",id:"41-connect-your-wallet",level:4},{value:"4.2 Ensure you have the requirements",id:"42-ensure-you-have-the-requirements",level:4},{value:"4.3 Setup notifications",id:"43-setup-notifications",level:4},{value:"4.4 Submit register & Upload your validators' keys",id:"44-submit-register--upload-your-validators-keys",level:4}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",hr:"hr",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"become-a-lido-node-operator-with-dappnode",children:(0,s.jsx)(t.strong,{children:"Become a Lido Node Operator with Dappnode"})})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Dappnode"})," provides an easy-to-use and intuitive interface for most of the infrastructure needed to become a Lido Node Operator. The process is straightforward and requires only a few steps to set up a node operator and start earning rewards. An overview of the process is how the Lido CSM UI will greet you when first connecting your wallet to the dApp:"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Lido-CSM1",src:o(90503).A+"",width:"1892",height:"941"})}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"first-steps-to-create-a-node-operator-in-dappnode",children:(0,s.jsx)(t.strong,{children:"First Steps to create a Node Operator in Dappnode"})}),"\n",(0,s.jsxs)(t.h3,{id:"1-getting-your-dappnode-ready",children:["1. ",(0,s.jsx)(t.strong,{children:"Getting your Dappnode ready"})]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Navigate to ",(0,s.jsx)(t.a,{href:"http://my.dappnode/stakers/ethereum",children:"Dappnode Staking for Ethereum"})," or ",(0,s.jsx)(t.a,{href:"http://my.dappnode/stakers/hoodi",children:"Dappnode Staking for Hoodi"}),"."]}),"\n",(0,s.jsx)(t.li,{children:"Select your desired execution and consensus clients."}),"\n",(0,s.jsx)(t.li,{children:"Choose Web3Signer to upload the keystores."}),"\n",(0,s.jsxs)(t.li,{children:["Configure MEV Boost with as many relays as possible. For additional info on MEV in CSM, check the ",(0,s.jsx)(t.a,{href:"https://operatorportal.lido.fi/modules/community-staking-module",children:"Lido CSM Docs"}),".","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Mainnet relays see ",(0,s.jsx)(t.code,{children:"get_relays"})," from ",(0,s.jsx)(t.a,{href:"https://etherscan.io/address/0xf95f069f9ad107938f6ba802a3da87892298610e#readContract",children:"Mainnet"})]}),"\n",(0,s.jsxs)(t.li,{children:["Hoodi relays see ",(0,s.jsx)(t.code,{children:"get_relays"})," from ",(0,s.jsx)(t.a,{href:"https://hoodi.etherscan.io/address/0x279d3A456212a1294DaEd0faEE98675a52E8A4Bf#readContract#F4",children:"Hoodi"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.admonition,{type:"warning",children:(0,s.jsx)(t.p,{children:'It is mandatory to choose at least one relay to ensure the node operator does not propose vanilla blocks. When uploading the keystores with the "Lido" tag, this requirement will be automatically checked. As a Lido Node Operator, it is your responsibility to ensure that your infrastructure is properly using MEV Boost.'})}),"\n",(0,s.jsxs)(t.h3,{id:"2-create-the-keystores--deposit-data",children:["2. ",(0,s.jsx)(t.strong,{children:"Create the Keystores & Deposit Data"})]}),"\n",(0,s.jsx)(t.admonition,{type:"info",children:(0,s.jsxs)(t.p,{children:["In order to run a validator, you need to generate the necessary keystores and deposit data. The keystores ",(0,s.jsx)(t.strong,{children:"must"})," be created with the withdrawal credential of Lido:"]})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Ethereum: ",(0,s.jsx)(t.code,{children:"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["Hoodi: ",(0,s.jsx)(t.code,{children:"0x4473dCDDbf77679A643BdB654dbd86D67F8d32f2"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["We recommend using official tools like ",(0,s.jsx)(t.a,{href:"https://github.com/ethereum/staking-deposit-cli",children:"Staking-Deposit-CLI"})," or the ",(0,s.jsx)(t.a,{href:"https://wagyu.gg/",children:"Wagyu Key Gen Tool"})," to create the keystores. This step is crucial and mandatory."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The validator Keystores will be used to run the validators on the Ethereum network, while the deposit data will be used to register the validators in the Lido protocol."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Lido-CSM2",src:o(23468).A+"",width:"949",height:"784"})}),"\n",(0,s.jsx)(t.admonition,{type:"warning",children:(0,s.jsx)(t.p,{children:"Make sure you correcly set the withdrawal address up, otherwise the Lido CSM won't let you move forward with the validator deposits."})}),"\n",(0,s.jsx)(t.h3,{id:"3-install-the-lido-csm-package",children:"3. Install the Lido CSM package"}),"\n",(0,s.jsx)(t.p,{children:"To install the Lido CSM package, select the variant that suits your needs:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"http://my.dappnode/installer/dnp/lido-csm-hoodi.dnp.dappnode.eth",children:"Hoodi package"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"http://my.dappnode/installer/dnp/lido-csm-mainnet.dnp.dappnode.eth",children:"Ethereum package"})}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"4-register-as-node-operator",children:"4. Register as Node Operator"}),"\n",(0,s.jsx)(t.h4,{id:"41-connect-your-wallet",children:"4.1 Connect your wallet"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Open the Lido CSM package UI."}),"\n",(0,s.jsx)(t.li,{children:"Connect your wallet."}),"\n",(0,s.jsx)(t.li,{children:"Click the Register Node Operator button."}),"\n"]}),"\n",(0,s.jsx)(t.h4,{id:"42-ensure-you-have-the-requirements",children:"4.2 Ensure you have the requirements"}),"\n",(0,s.jsx)(t.p,{children:"While registering as a node operator, the UI will verify that you meet the following requirements:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Stake Requirement: You need either 2.4 ETH or 1.5 ETH, or an equivalent amount in stETH or wstETH for the first validator."}),"\n",(0,s.jsxs)(t.li,{children:["Infrastructure Setup: Your Dappnode must be running:","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"An execution client."}),"\n",(0,s.jsx)(t.li,{children:"A consensus client."}),"\n",(0,s.jsx)(t.li,{children:"Web3Signer."}),"\n",(0,s.jsx)(t.li,{children:"MEV relay subscriptions."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.h4,{id:"43-setup-notifications",children:["4.3 ",(0,s.jsx)(t.strong,{children:"Setup notifications"})]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Use the ",(0,s.jsx)(t.a,{href:"https://core.telegram.org/bots/tutorial#obtain-your-bot-token",children:"Telegram BotFather"})," to create bot and get its token."]}),"\n",(0,s.jsx)(t.li,{children:"Start the chat with your bot."}),"\n"]}),"\n",(0,s.jsx)(t.admonition,{type:"warning",children:(0,s.jsxs)(t.p,{children:["You must start the conversation with the bot using ",(0,s.jsx)(t.code,{children:"/start"})," so it can send you notifications."]})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Use ",(0,s.jsx)(t.a,{href:"https://t.me/userinfobot",children:"userinfobot"})," to retrieve your user ID."]}),"\n",(0,s.jsx)(t.li,{children:"Introduce your bot token and user ID in the UI and confirm."}),"\n",(0,s.jsx)(t.li,{children:"You should receive a confirmation message from the bot."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"lido-notifications-onboarding",src:o(62650).A+"",width:"1900",height:"926"})}),"\n",(0,s.jsxs)(t.h4,{id:"44-submit-register--upload-your-validators-keys",children:["4.4 ",(0,s.jsx)(t.strong,{children:"Submit register & Upload your validators' keys"})]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Navigate to the Lido CSM UI and complete the deposit process by submitting the ",(0,s.jsx)(t.code,{children:"deposit_data.json"})," file you generated with your keystore(s).\n",(0,s.jsx)(t.img,{alt:"Lido-CSM4",src:o(83034).A+"",width:"1905",height:"964"})]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"If your validator keys are not already uploaded to Web3Signer, you can import them directly through the Lido CSM package UI."}),"\n",(0,s.jsxs)(t.p,{children:["Automatically, after providing the ",(0,s.jsx)(t.code,{children:"deposit_data.json"})," a prompt will appear in the UI, allowing you to:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Select or drag-and-drop the keystore files associated with your ",(0,s.jsx)(t.code,{children:"deposit_data.json"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["Enter the password for the keys in the provided field.\n",(0,s.jsx)(t.img,{alt:"Lido-CSM4",src:o(72867).A+"",width:"1900",height:"926"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"You'll be prompted to sign an ETH bond depending on the number of validators you're submitting to the CSM."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Once the deposit has been confirmed, the CSM and then the Beacon Chain will process your deposit. Keep in mind you'll have to wait 16-24 hours plus the Becaon Chain's entry queue for your validators to activate. Your node operator setup is now complete!"}),"\n"]}),"\n"]})]})}function c(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},90503:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/lido-csm-ss-docs1-032f26e141f28c01d7bd345801acc174.png"},23468:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/lido-csm-ss-docs2-c66d0577d30534e1c30998b48a96a0b5.png"},83034:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/lido-csm-ss-docs4-55dc8306e52af58aca69e3f573a2d345.png"},72867:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/lido-csm-ss-docs5-01fdabc27d6d6c62a2df11162754ed3e.png"},62650:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/lido-notifications-onboarding-ef5563fe24897cd96567072cde6ad1d2.png"},28453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>d});var n=o(96540);const s={},r=n.createContext(s);function i(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a83bdfda.014d6c62.js b/assets/js/a83bdfda.014d6c62.js
new file mode 100644
index 000000000..3d668c021
--- /dev/null
+++ b/assets/js/a83bdfda.014d6c62.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[3416],{55096:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"dao/faq","title":"Dappnode DAO FAQ","description":"What is a DAO?","source":"@site/docs/dao/faq.md","sourceDirName":"dao","slug":"/dao/faq","permalink":"/docs/dao/faq","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dao/faq.md","tags":[],"version":"current","frontMatter":{"title":"Dappnode DAO FAQ","llm_description":"FAQ explaining what a DAO is and Dappnode DAO\'s mission for decentralized infrastructure."},"sidebar":"daoSidebar","previous":{"title":"Liquidity Mining","permalink":"/docs/dao/liquidity-mining"}}');var a=t(74848),i=t(28453);const s={title:"Dappnode DAO FAQ",llm_description:"FAQ explaining what a DAO is and Dappnode DAO's mission for decentralized infrastructure."},r=void 0,d={},c=[];function p(e){const n={p:"p",...(0,i.R)(),...e.components},{Details:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(t,{children:[(0,a.jsx)("summary",{children:(0,a.jsx)("b",{children:"What is a DAO?"})}),(0,a.jsx)(n.p,{children:"A DAO, or Decentralized Autonomous Organization, is an organization represented by rules encoded as a computer program that is transparent, controlled by the organization members, and not influenced by a centralized government. It operates autonomously and can execute actions such as making decisions and managing resources based on pre-defined rules or through a consensus mechanism."})]}),"\n",(0,a.jsxs)(t,{children:[(0,a.jsxs)("summary",{children:[(0,a.jsx)("b",{children:"What is the purpose and mission of the Dappnode DAO?"})," "]}),(0,a.jsx)(n.p,{children:"DappNode's DAO aims to promote and simplify the use of decentralized infrastructure. It aspires to create a more decentralized web by providing tools that make running nodes, DApps, and blockchain-related software more user-friendly and accessible to a wider audience. By establishing a DAO, DappNode ensures that its mission and direction are decided collectively by its community, allowing for a more democratic and transparent decision-making process. The DappNode DAO encourages collaboration, fostering a community that is actively involved in the project's evolution, and ensuring the sustainability and success of the platform in the decentralized space."})]})]})}function l(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(p,{...e})}):p(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>r});var o=t(96540);const a={},i=o.createContext(a);function s(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a8add524.a47496d6.js b/assets/js/a8add524.a47496d6.js
new file mode 100644
index 000000000..161cfc52a
--- /dev/null
+++ b/assets/js/a8add524.a47496d6.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[2664],{5302:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"user/access-your-dappnode/vpn/tailscale","title":"Connect to Your Dappnode Using Tailscale","description":"Tailscale is a secure, peer-to-peer VPN solution that simplifies connecting to your Dappnode without requiring complex port forwarding, solving issues such as UPnP not being recognized, routers behind CGNAT, or other port forwarding challenges. This guide walks you through setting up Tailscale to access your Dappnode.","source":"@site/docs/user/access-your-dappnode/vpn/tailscale.md","sourceDirName":"user/access-your-dappnode/vpn","slug":"/user/access-your-dappnode/vpn/tailscale","permalink":"/docs/user/access-your-dappnode/vpn/tailscale","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/access-your-dappnode/vpn/tailscale.md","tags":[],"version":"current","frontMatter":{"title":"Connect to Your Dappnode Using Tailscale","llm_description":"Setup Tailscale VPN for easy access without port forwarding; solves UPnP and CGNAT issues."},"sidebar":"userSidebar","previous":{"title":"Overview","permalink":"/docs/user/access-your-dappnode/vpn/overview"},"next":{"title":"Wireguard","permalink":"/docs/user/access-your-dappnode/vpn/wireguard"}}');var o=s(74848),t=s(28453);const a={title:"Connect to Your Dappnode Using Tailscale",llm_description:"Setup Tailscale VPN for easy access without port forwarding; solves UPnP and CGNAT issues."},l="Connect to Your Dappnode Using Tailscale",r={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Setting Up Tailscale",id:"setting-up-tailscale",level:2},{value:"1. Create an Auth Key",id:"1-create-an-auth-key",level:3},{value:"2. Install Tailscale on Your Dappnode",id:"2-install-tailscale-on-your-dappnode",level:3},{value:"3. Configure Tailscale to Connect to Dappnode Internal Networks",id:"3-configure-tailscale-to-connect-to-dappnode-internal-networks",level:3},{value:"a. Accept Advertised Routes from Your Dappnode",id:"a-accept-advertised-routes-from-your-dappnode",level:4},{value:"b. Add Dappnode Custom Nameservers",id:"b-add-dappnode-custom-nameservers",level:4},{value:"4. Connecting to Dappnode with Tailscale",id:"4-connecting-to-dappnode-with-tailscale",level:3},{value:"5. Do you have two Dappnodes?",id:"5-do-you-have-two-dappnodes",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",hr:"hr",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"connect-to-your-dappnode-using-tailscale",children:"Connect to Your Dappnode Using Tailscale"})}),"\n",(0,o.jsx)(n.p,{children:"Tailscale is a secure, peer-to-peer VPN solution that simplifies connecting to your Dappnode without requiring complex port forwarding, solving issues such as UPnP not being recognized, routers behind CGNAT, or other port forwarding challenges. This guide walks you through setting up Tailscale to access your Dappnode."}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsx)(n.p,{children:"Using Tailscale is an excellent alternative if you're experiencing issues with UPnP, CGNAT, or port forwarding. It's easy to set up and ensures a seamless connection to your Dappnode."})}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsxs)(n.p,{children:["When updating or reinstalling Tailscale, a new auth key might be required if the previous one is no longed valid (expired). You can check your current auth key status in the ",(0,o.jsx)(n.a,{href:"https://login.tailscale.com/admin/settings/keys",children:"Tailscale Admin Settings"}),". If you encounter issues, generate a new auth key and update it in your Dappnode's Tailscale package settings."]})}),"\n",(0,o.jsx)(n.hr,{}),"\n",(0,o.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,o.jsx)(n.p,{children:"Before starting, ensure you have:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Access to your ",(0,o.jsx)(n.a,{href:"http://my.dappnode",children:"Dappnode's Admin UI"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["A ",(0,o.jsx)(n.a,{href:"https://tailscale.com/",children:"Tailscale account"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Tailscale installed on the device you want to access your Dappnode from. Download ",(0,o.jsx)(n.a,{href:"https://tailscale.com/download",children:"here"}),"."]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"setting-up-tailscale",children:"Setting Up Tailscale"}),"\n",(0,o.jsx)(n.h3,{id:"1-create-an-auth-key",children:"1. Create an Auth Key"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Log in to Tailscale and navigate to ",(0,o.jsx)(n.a,{href:"https://login.tailscale.com/admin/settings/keys",children:"Tailscale Admin Settings"}),". Click on ",(0,o.jsx)(n.strong,{children:(0,o.jsx)(n.em,{children:"Generate auth key"})}),"."]}),"\n"]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{width:"80%",src:"/img/authkey1.png"})}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsx)(n.li,{children:'Create a new auth key. Any name will work. We recommend activating the "Reusable" option so you can use the same key multiple times.'}),"\n"]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{width:"50%",src:"/img/authkey2.png"})}),"\n",(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsx)(n.li,{children:"Save the key for the next step. Do not share this key with anyone."}),"\n"]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{width:"50%",src:"/img/authkey3.png"})}),"\n",(0,o.jsx)(n.h3,{id:"2-install-tailscale-on-your-dappnode",children:"2. Install Tailscale on Your Dappnode"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Access your ",(0,o.jsx)(n.a,{href:"https://my.dappnode",children:"Dappnode's Admin UI"})]}),"\n",(0,o.jsxs)(n.li,{children:["Navigate to ",(0,o.jsx)(n.strong,{children:"Dappstore"})," and search for the ",(0,o.jsx)(n.code,{children:"Tailscale"})," package."]}),"\n",(0,o.jsxs)(n.li,{children:["Click ",(0,o.jsx)(n.strong,{children:"Install"})]}),"\n",(0,o.jsxs)(n.li,{children:["Go to the Tailscale package in ",(0,o.jsx)(n.strong,{children:"Packages"})," tab and enter the auth key you created during installation."]}),"\n"]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{width:"80%",src:"/img/authkey4.png"})}),"\n",(0,o.jsx)(n.p,{children:"Once installed, Tailscale will run as as any other package on your Dappnode. In order to connect to your Dappnode with Tailscale, this package will need to be running."}),"\n",(0,o.jsx)(n.h3,{id:"3-configure-tailscale-to-connect-to-dappnode-internal-networks",children:"3. Configure Tailscale to Connect to Dappnode Internal Networks"}),"\n",(0,o.jsx)(n.p,{children:"To ensure you can access your Dappnode's internal networks and services, you need to configure Tailscale to accept routes and set up custom DNS servers. There are two main steps to complete this configuration. Accepting advertised routes and adding custom nameservers (DNS)."}),"\n",(0,o.jsx)(n.h4,{id:"a-accept-advertised-routes-from-your-dappnode",children:"a. Accept Advertised Routes from Your Dappnode"}),"\n",(0,o.jsx)(n.p,{children:"Dappnode advertises its internal networks through Tailscale, allowing you to access services like the Dappnode Admin UI and other packages. To ensure these routes are accepted:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Go to your ",(0,o.jsx)(n.a,{href:"https://login.tailscale.com/admin/machines",children:"Tailscale Machines Dashboard"}),"."]}),"\n"]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{width:"80%",src:"/img/machinelist.png"})}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsx)(n.li,{children:"Find your Dappnode device in the list of machines"}),"\n",(0,o.jsx)(n.li,{children:'Open the "Edit Route Settings" modal and check the Subnet Route that appears.'}),"\n"]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{width:"50%",src:"/img/subnetcheck.png"})}),"\n",(0,o.jsx)(n.h4,{id:"b-add-dappnode-custom-nameservers",children:"b. Add Dappnode Custom Nameservers"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Go to your ",(0,o.jsx)(n.a,{href:"https://login.tailscale.com/admin/dns",children:"Tailscale DNS Admin Panel"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Find the Nameservers section, click on ",(0,o.jsx)(n.strong,{children:'"Add nameserver"'})," and add a custom nameserver."]}),"\n"]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{width:"50%",src:"/img/customserver.png"})}),"\n",(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Fill the popup with:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Nameserver IP:"})," ",(0,o.jsx)(n.code,{children:"10.20.0.2"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:'Click and activate the "Override DNS servers" switch.'}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"The end result should look like this, with two nameservers active:"}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{width:"50%",src:"/img/tailscalednsconfignormal.png"})}),"\n",(0,o.jsx)(n.p,{children:"That's it! You've successfully configured Tailscale to connect to your Dappnode. All that's left is to install Tailscale on the device you want to access your Dappnode from."}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsx)(n.p,{children:"If you were already connected to your Dappnode with Tailscale, you may need to disconnect and reconnect to apply the new DNS settings."})}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:(0,o.jsx)("b",{children:"Advanced DNS configuration"})}),(0,o.jsx)(n.p,{children:"If you don't want to use the default Dappnode DNS server for everything, you can set up Dappnode's DNS server to only resolve Dappnode services. For this, you will need to add a custom DNS server for each dappnode service, restricted to a specific domain."}),(0,o.jsxs)(n.p,{children:["The following screenshot shows a configuration that only uses Dappnode's DNS server for services under the ",(0,o.jsx)(n.code,{children:"dappnode"}),", ",(0,o.jsx)(n.code,{children:"dappnode.private"})," and ",(0,o.jsx)(n.code,{children:"dyndns.dappnode"})," domains, while using the default Tailscale DNS server for everything else."]}),(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{width:"50%",src:"/img/tailscalednsadvanced.png"})})]}),"\n",(0,o.jsx)(n.h3,{id:"4-connecting-to-dappnode-with-tailscale",children:"4. Connecting to Dappnode with Tailscale"}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:(0,o.jsx)("b",{children:"macOS"})}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Open tailscale app in your finder"}),"\n",(0,o.jsx)(n.li,{children:"Go to the top bar and click the tailscale logo (9 dots)"}),"\n"]}),(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{width:"50%",src:"/img/tailscale-2.png"})}),(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsx)(n.li,{children:"Activate the switch to connect."}),"\n"]})]}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsxs)("summary",{children:[" ",(0,o.jsx)("b",{children:"Linux"})]}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Open up a terminal and run the following command:"}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo tailscale up --accept-routes\n"})}),(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["If it's your first time using Tailscale in this device, a browser window may open asking to connect this device to your Tailscale account. Click on ",(0,o.jsx)(n.strong,{children:'"Connect"'}),". That's it! You're now connected to your Dappnode."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"To stop Tailscale in any moment, run the following command:"}),"\n"]}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo tailscale down\n"})}),(0,o.jsxs)(n.admonition,{type:"note",children:[(0,o.jsx)(n.mdxAdmonitionTitle,{}),(0,o.jsxs)(n.p,{children:["Having trouble using Tailscale on Linux? Check out the ",(0,o.jsx)(n.a,{href:"https://tailscale.com/kb/1031/install-linux",children:"Tailscale Linux documentation"})," for more information."]})]})]}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:(0,o.jsx)("b",{children:"Windows"})}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Once installed, Tailscale's icon will appear in your system tray. Click on it."}),"\n",(0,o.jsxs)(n.li,{children:["If it's your first time using Tailscale in this device, a browser window may open asking to connect this device to your Tailscale account. Click on ",(0,o.jsx)(n.strong,{children:'"Connect"'}),". That's it! You're now connected to your Dappnode."]}),"\n"]}),(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{width:"50%",src:"/img/tailscalewindows.png"})}),(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsx)(n.li,{children:"To disconnect tailscale, right click on the icon on the system tray and log out or exit the application."}),"\n"]}),(0,o.jsxs)(n.admonition,{type:"note",children:[(0,o.jsx)(n.mdxAdmonitionTitle,{}),(0,o.jsxs)(n.p,{children:["Having trouble using Tailscale on Windows? Check out the ",(0,o.jsx)(n.a,{href:"https://tailscale.com/kb/1022/install-windows",children:"Tailscale Windows documentation"})," for more information."]})]})]}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:(0,o.jsx)("b",{children:"iOS"})}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Download Tailscale from the ",(0,o.jsx)(n.a,{href:"https://apps.apple.com/us/app/tailscale/id1470499037",children:"App Store"}),"."]}),"\n",(0,o.jsx)(n.li,{children:"Open your Tailscale app and Log in"}),"\n",(0,o.jsx)(n.li,{children:'Connect to your dappnode by clicking on the "Connect" button.'}),"\n"]}),(0,o.jsxs)(n.admonition,{type:"note",children:[(0,o.jsx)(n.mdxAdmonitionTitle,{}),(0,o.jsxs)(n.p,{children:["Having trouble installing Tailscale on iOS? Check out the ",(0,o.jsx)(n.a,{href:"https://tailscale.com/kb/1020/install-ios",children:"Tailscale iOS documentation"})," for more information."]})]})]}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:(0,o.jsx)("b",{children:"Android"})}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Download Tailscale from the ",(0,o.jsx)(n.a,{href:"https://play.google.com/store/apps/details?id=com.tailscale.ipn",children:"Google Play Store"}),"."]}),"\n",(0,o.jsx)(n.li,{children:"Open your Tailscale app and Log in"}),"\n",(0,o.jsx)(n.li,{children:'Connect to your dappnode by clicking on the "Connect" button.'}),"\n"]}),(0,o.jsxs)(n.admonition,{type:"note",children:[(0,o.jsx)(n.mdxAdmonitionTitle,{}),(0,o.jsxs)(n.p,{children:["Having trouble installing Tailscale on Android? Check out the ",(0,o.jsx)(n.a,{href:"https://tailscale.com/kb/1079/install-android",children:"Tailscale Android documentation"})," for more information."]})]})]}),"\n",(0,o.jsx)("br",{}),"\n",(0,o.jsx)(n.h3,{id:"5-do-you-have-two-dappnodes",children:"5. Do you have two Dappnodes?"}),"\n",(0,o.jsx)(n.p,{children:"It won't work automatically and you won't be able to choose which one connects."}),"\n",(0,o.jsx)(n.p,{children:"You have to go to the machines that you don't want to access and disable subnet routes. Your tailscale will direct you to the one that does have the subnets activated."}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{width:"50%",src:"/img/connect-two-dappnodes.png"})}),"\n",(0,o.jsxs)(n.p,{children:["If you encounter any issues or need further assistance, refer to Dappnode's ",(0,o.jsx)(n.a,{href:"https://discord.gg/dappnode",children:"Discord"}),", the ",(0,o.jsx)(n.a,{href:"https://forum.dappnode.io/",children:"Dappnode Community Forums"}),", or ",(0,o.jsx)(n.a,{href:"https://tailscale.com/support/",children:"Tailscale Support"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>l});var i=s(96540);const o={},t=i.createContext(o);function a(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a9241739.4766c1d3.js b/assets/js/a9241739.4766c1d3.js
new file mode 100644
index 000000000..ff6af8466
--- /dev/null
+++ b/assets/js/a9241739.4766c1d3.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[6203],{3288:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"user/ethical-metrics/troubleshooting","title":"Troubleshooting","description":"Experiencing trouble when setting your notifications up? Check this FAQ. If your issue isn\'t listed, please pay us a visit in the Dappnode Discord and we\'ll be happy to assist you!","source":"@site/docs/user/ethical-metrics/troubleshooting.md","sourceDirName":"user/ethical-metrics","slug":"/user/ethical-metrics/troubleshooting","permalink":"/docs/user/ethical-metrics/troubleshooting","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/ethical-metrics/troubleshooting.md","tags":[],"version":"current","frontMatter":{"title":"Troubleshooting","llm_description":"FAQ for Ethical Metrics: verifying registration, testing alerts, and unregistering from monitoring."},"sidebar":"userSidebar","previous":{"title":"Metrics collected","permalink":"/docs/user/ethical-metrics/metrics"},"next":{"title":"Overview","permalink":"/docs/user/dappnode-cloud/overview"}}');var o=t(74848),s=t(28453);const r={title:"Troubleshooting",llm_description:"FAQ for Ethical Metrics: verifying registration, testing alerts, and unregistering from monitoring."},a="Troubleshooting",c={},l=[];function d(e){const i={a:"a",h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components},{Details:t}=i;return t||function(e,i){throw new Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"troubleshooting",children:"Troubleshooting"})}),"\n",(0,o.jsxs)(i.p,{children:["Experiencing trouble when setting your notifications up? Check this FAQ. If your issue isn't listed, please pay us a visit in the ",(0,o.jsx)(i.a,{href:"https://discord.gg/dappnode",children:"Dappnode Discord"})," and we'll be happy to assist you!"]}),"\n",(0,o.jsxs)(t,{children:[(0,o.jsx)("summary",{children:(0,o.jsx)("strong",{children:"How can I make sure my Dappnode is registered?"})}),(0,o.jsxs)(i.p,{children:[(0,o.jsx)("b",{children:"Email:"})," Upon registering, an email will be sent to your configured email address. If you don't receive this email, please check your spam folder. ",(0,o.jsx)("br",{})]}),(0,o.jsxs)(i.p,{children:[(0,o.jsx)("b",{children:"Telegram:"}),' Once your bot has been set up, you can press the "Send Test Notification" button to see if everything is working as expected.']})]}),"\n",(0,o.jsxs)(t,{children:[(0,o.jsx)("summary",{children:(0,o.jsx)("strong",{children:'How can I test a "Dappnode down" notification?'})}),(0,o.jsx)(i.p,{children:'There are various ways to test a "Dappnode down" notification. The easiest way is to stop your Dappnode temporarily, but you can also test it by stopping the "Prometheus" service of your Ethical Metrics package. After an hour, you should receive a "Dappnode down" notification in your Email and/or Telegram.'})]}),"\n",(0,o.jsxs)(t,{children:[(0,o.jsx)("summary",{children:(0,o.jsx)("strong",{children:"How can I unregister from the Ethical Metrics monitoring system?"})}),(0,o.jsxs)("p",{children:[(0,o.jsx)("strong",{children:" 1. Using the Dappnode Interface:"})," From the active Dappnode, simply navigate to ",(0,o.jsx)("a",{href:"http://my.dappnode/system/notifications",children:"System > Notifications"})," and toggle off ",(0,o.jsx)("b",{children:"Ethical Metrics"}),". This will stop all notifications and halt metric collection from your Dappnode. As long as Ethical Metrics notifications are enabled in the Dappnode UI, your device remains registered in our monitoring system."]}),(0,o.jsxs)("p",{children:[(0,o.jsx)("strong",{children:"2. For Inactive Dappnodes:"})," If your Dappnode is no longer accessible, locate the ",(0,o.jsx)("b",{children:"unregister link"})," in the welcome email you received upon registration. Keep in mind that using this method won't employ our IP hiding measures, but you can enhance security using tools like a VPN. Please keep in mind that if your Dappnode is still up and running with Ethical Metrics notifications turned on, it'll register again by itself."]}),(0,o.jsxs)("p",{children:[(0,o.jsx)("strong",{children:"3. Manual Unregistration:"})," Lost the welcome email? You can also unregister by inputting the following URL into your browser: ",(0,o.jsxs)("code",{children:[(0,o.jsx)(i.a,{href:"https://ethical-metrics.dappnode.io/unregister-from-email/?instance=",children:"https://ethical-metrics.dappnode.io/unregister-from-email/?instance="}),(0,o.jsx)("i",{children:"YOUR_INSTANCE"}),".onion%3A9090"]}),". Make sure to replace ",(0,o.jsx)("i",{children:"YOUR_INSTANCE"}),' with the unique identifier for your Dappnode, excluding ".onion:9090", which is already included in the provided URL.']})]})]})}function h(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},28453:(e,i,t)=>{t.d(i,{R:()=>r,x:()=>a});var n=t(96540);const o={},s=n.createContext(o);function r(e){const i=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a94703ab.2e42b37c.js b/assets/js/a94703ab.2e42b37c.js
new file mode 100644
index 000000000..84e6358a8
--- /dev/null
+++ b/assets/js/a94703ab.2e42b37c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9048],{91841:(e,t,n)=>{n.r(t),n.d(t,{default:()=>pe});var a=n(96540),o=n(18215),i=n(81082),s=n(204),l=n(93751),r=n(22306),c=n(50539),d=n(65627),u=n(77685);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(74848);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(84924),x=n(56347),f=n(86682),j=n(53115),_=n(12862);function v(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const g="collapseSidebarButton_PEFL",A="collapseSidebarButtonIcon_kv0_";function C(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",g),onClick:t,children:(0,b.jsx)(v,{className:A})})}var k=n(23380),S=n(26849);const T=Symbol("EmptyContext"),N=a.createContext(T);function I(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(N.Provider,{value:i,children:t})}var y=n(33535),B=n(30214),w=n(56289),L=n(9136);function E(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:a})}function M(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.p)(),_=function(e){const t=(0,L.A)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.Nr)(e):void 0),[e,t])}(t),v=(0,l.w8)(t,i),g=(0,B.ys)(x,i),{collapsed:A,setCollapsed:C}=(0,y.u)({initialState:()=>!!h&&(!v&&t.collapsed)}),{expandedItem:k,setExpandedItem:I}=function(){const e=(0,a.useContext)(N);if(e===T)throw new S.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=function(e){void 0===e&&(e=!A),I(e?null:c),C(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,S.ZC)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:v,collapsed:A,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=k&&k!==c&&f&&C(!0)}),[h,k,c,C,f]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":A},p),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":g}),children:[(0,b.jsx)(w.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":v}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":g?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!A:void 0,href:h?_??"#":_,...d,children:m}),x&&h&&(0,b.jsx)(E,{collapsed:A,categoryLabel:m,onClick:e=>{e.preventDefault(),M()}})]}),(0,b.jsx)(y.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:A,children:(0,b.jsx)(V,{items:u,tabIndex:A?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var H=n(22887),G=n(15891);const P="menuExternalLink_NmtK";function R(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l.w8)(t,a),x=(0,H.A)(d);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(w.A,{className:(0,o.A)("menu__link",!x&&P,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(G.A,{})]})},u)}const W="menuHtmlItem_M9Kj";function D(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(n),l&&[W,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function F(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(M,{item:t,...n});case"html":return(0,b.jsx)(D,{item:t,...n});default:return(0,b.jsx)(R,{item:t,...n})}}function U(e){let{items:t,...n}=e;const a=(0,l.Y)(t,n.activePath);return(0,b.jsx)(I,{children:a.map(((e,t)=>(0,b.jsx)(F,{item:e,index:t,...n},t)))})}const V=(0,a.memo)(U),Y="menu_SIkG",K="menuWithAnnouncementBar_GW3s";function z(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,k.M)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",Y,l&&K,i),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:n,activePath:t,level:1})})})}const q="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",J="sidebarHidden_VK0M",Q="sidebarLogo_isFc";function X(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,j.p)();return(0,b.jsxs)("div",{className:(0,o.A)(q,s&&O,i&&J),children:[s&&(0,b.jsx)(_.A,{tabIndex:-1,className:Q}),(0,b.jsx)(z,{path:t,sidebar:n}),l&&(0,b.jsx)(C,{onClick:a})]})}const Z=a.memo(X);var $=n(63065),ee=n(44635);const te=e=>{let{sidebar:t,path:n}=e;const a=(0,ee.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ne(e){return(0,b.jsx)($.GX,{component:te,props:e})}const ae=a.memo(ne);function oe(e){const t=(0,f.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(Z,{...e}),a&&(0,b.jsx)(ae,{...e})]})}const ie={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function se(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ie.expandButton,title:(0,c.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(v,{className:ie.expandButtonIcon})})}const le={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function re(e){let{children:t}=e;const n=(0,r.t)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function ce(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,le.docSidebarContainer,n&&le.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(le.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(re,{children:(0,b.jsxs)("div",{className:(0,o.A)(le.sidebarViewport,r&&le.sidebarViewportHidden),children:[(0,b.jsx)(oe,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(se,{toggleSidebar:d})]})})})}const de={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ue(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.t)();return(0,b.jsx)("main",{className:(0,o.A)(de.docMainContainer,(t||!a)&&de.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",de.docItemWrapper,t&&de.docItemWrapperEnhanced),children:n})})}const me={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function be(e){let{children:t}=e;const n=(0,r.t)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:me.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:me.docRoot,children:[n&&(0,b.jsx)(ce,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ue,{hiddenSidebarContainer:o,children:t})]})]})}var he=n(65932);function pe(e){const t=(0,l.B5)(e);if(!t)return(0,b.jsx)(he.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(r.V,{name:a,items:c,children:(0,b.jsx)(be,{children:n})})})}},65932:(e,t,n)=>{n.d(t,{A:()=>l});n(96540);var a=n(18215),o=n(50539),i=n(9303),s=n(74848);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]);
\ No newline at end of file
diff --git a/assets/js/a960b763.0235fb7c.js b/assets/js/a960b763.0235fb7c.js
new file mode 100644
index 000000000..bb931398c
--- /dev/null
+++ b/assets/js/a960b763.0235fb7c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[2319],{47051:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"user/packages/swarm","title":"Guide to Installing Bee Node on Dappnode","description":"Introduction to Swarm","source":"@site/docs/user/packages/swarm.md","sourceDirName":"user/packages","slug":"/user/packages/swarm","permalink":"/docs/user/packages/swarm","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/packages/swarm.md","tags":[],"version":"current","frontMatter":{"title":"Guide to Installing Bee Node on Dappnode","llm_description":"Guide to installing and running a Swarm Bee node on Dappnode for decentralized storage."},"sidebar":"userSidebar","previous":{"title":"Monero","permalink":"/docs/user/packages/monero"},"next":{"title":"Ethereum","permalink":"/docs/user/repository/ethereum"}}');var a=t(74848),o=t(28453);const s={title:"Guide to Installing Bee Node on Dappnode",llm_description:"Guide to installing and running a Swarm Bee node on Dappnode for decentralized storage."},r="Guide to Installing Bee Node on Dappnode",d={},l=[{value:"Introduction to Swarm",id:"introduction-to-swarm",level:2},{value:"Introduction to Dappnode",id:"introduction-to-dappnode",level:2},{value:"Gnosis Chain",id:"gnosis-chain",level:2},{value:"Installing a Bee node",id:"installing-a-bee-node",level:2},{value:"Engage in Storage Incentives by Staking Your BZZ",id:"engage-in-storage-incentives-by-staking-your-bzz",level:3}];function c(e){const n={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"guide-to-installing-bee-node-on-dappnode",children:"Guide to Installing Bee Node on Dappnode"})}),"\n",(0,a.jsx)(n.h2,{id:"introduction-to-swarm",children:"Introduction to Swarm"}),"\n",(0,a.jsx)(n.p,{children:"Swarm is a decentralized data storage and distribution technology. Ready to power the next generation of censorship-resistant, unstoppable, serverless dApps."}),"\n",(0,a.jsxs)(n.p,{children:["Node operators can ",(0,a.jsx)(n.a,{href:"https://docs.ethswarm.org/docs/bee/working-with-bee/staking/#stake-your-node-with-bee",children:"stake BZZ"})," to participate in the redistribution of funds, allowing Bee node operators to receive BZZ in return for providing storage and bandwidth."]}),"\n",(0,a.jsx)(n.p,{children:"Node operators are rewarded with BZZ tokens, the native ERC-20 token."}),"\n",(0,a.jsx)(n.p,{children:"Beyond earning rewards, the Bee node serves as your personalized gateway to the Swarm network, offering you interactive access to content and dApps hosted on Swarm. The app enables you to:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Securely store (upload and download) files on Swarm's decentralized storage."}),"\n",(0,a.jsx)(n.li,{children:"Share files privately and securely with others."}),"\n",(0,a.jsx)(n.li,{children:"Host and manage HTML websites conveniently."}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"introduction-to-dappnode",children:"Introduction to Dappnode"}),"\n",(0,a.jsx)(n.p,{children:"DappNode is a decentralized platform that serves as critical infrastructure for launching and managing decentralized applications (dApps) with an essence of providing users with self-sovereign data management and secure, uncensorable application interfaces."}),"\n",(0,a.jsx)(n.p,{children:"Node operators on DappNode can gain enhanced control over their participation in various blockchain networks and ensure that their activities, whether it be validating transactions, participating in consensus mechanisms, or supporting network security, are conducted in a seamless, autonomous manner."}),"\n",(0,a.jsx)(n.p,{children:"The unique DappNode ecosystem ensures:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Seamless deployment and management of decentralized applications and nodes."}),"\n",(0,a.jsx)(n.li,{children:"Enhanced user control over data and privacy."}),"\n",(0,a.jsx)(n.li,{children:"Autonomous and secure participation in various blockchain networks."}),"\n",(0,a.jsx)(n.li,{children:"Simplification of running blockchain nodes, reducing technical barriers for participants."}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"gnosis-chain",children:"Gnosis Chain"}),"\n",(0,a.jsxs)(n.p,{children:["Swarm uses ",(0,a.jsx)(n.a,{href:"https://www.gnosis.io/",children:"Gnosis Chain"}),", formerly known as xDai, for managing its incentives."]}),"\n",(0,a.jsx)(n.p,{children:"Therefore, the Swarm Bee client necessitates a connection to the Gnosis Chain. As such, we recommend installing Nethermind (direct Dappnode install link) as your RPC endpoint."}),"\n",(0,a.jsx)(n.h2,{id:"installing-a-bee-node",children:"Installing a Bee node"}),"\n",(0,a.jsxs)(n.p,{children:["Step 1: Navigate to the package installer \u2014 ",(0,a.jsx)(n.a,{href:"http://my.dappnode/installer/public/swarm.public.dappnode.eth",children:"Install Swarm"}),"(direct Dappnode install link). Click Install to initiate the installation."]}),"\n",(0,a.jsx)(n.p,{children:"Step 2: Setup optional parameters:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Swap RPC Endpoint (Gnosis Chain)"})," \u2014 if you installed Nethermind and are running your own node, you can leave the default settings. Otherwise, if you use an external RPC endpoint, this is where you should set it."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"ENS resolver RPC (Ethereum Mainnet)"})," \u2014 As bee can resolve ENS (a special type of blockchain name), it requires an Ethereum mainnet RPC endpoint. Install links are available for a variety of clients, or you can use an Infura RPC endpoint, or alternatively leave it blank to disable the ENS resolver."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Initial chequebook deposit (xBZZ)"})," \u2014 is the amount of xBZZ the bee node must have deposited to its address in order to deploy the chequebook. You have the option to set this to 0 and deposit BZZ into the chequebook later via the UI."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Welcome message"})," \u2014 some graffiti that you can admire at Swarm Scan or if you happen to be peering through the logs"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Full node mode"})," \u2014 must be set to true or false, in order to stake and participate in storage incentives, and subsequently be rewarded, it should be set to true"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Storage data mountpoint"})," \u2014 for advanced users; recommended to leave at default."]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"engage-in-storage-incentives-by-staking-your-bzz",children:"Engage in Storage Incentives by Staking Your BZZ"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsx)(n.li,{children:"Import your gift code into Metamask or another web3 wallet on Gnosis chain. Remember, the gift code is a private key that holds 12 BZZ and 0.12xDAI."}),"\n",(0,a.jsxs)(n.li,{children:["Transfer funds to your Node wallet address, which can be found in the logs or at Swarm UI/Account/",(0,a.jsx)(n.a,{href:"http://dashboard.swarm.public.dappnode/#/account/wallet",children:"Wallet"}),"."]}),"\n",(0,a.jsxs)(n.li,{children:["Visit Account/",(0,a.jsx)(n.a,{href:"http://dashboard.swarm.public.dappnode/#/account/staking",children:"Staking"}),"."]}),"\n",(0,a.jsx)(n.li,{children:"Click on 'Stake', input an amount of 10 BZZ, and then press the 'Stake' button."}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>r});var i=t(96540);const a={},o=i.createContext(a);function s(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/aba21aa0.8072c7b3.js b/assets/js/aba21aa0.8072c7b3.js
new file mode 100644
index 000000000..57b8bf048
--- /dev/null
+++ b/assets/js/aba21aa0.8072c7b3.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5742],{27093:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]);
\ No newline at end of file
diff --git a/assets/js/acecf23e.78beabef.js b/assets/js/acecf23e.78beabef.js
new file mode 100644
index 000000000..f1b27efbe
--- /dev/null
+++ b/assets/js/acecf23e.78beabef.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1903],{1912:s=>{s.exports=JSON.parse('{"blogBasePath":"/blog","blogTitle":"Blog","authorsListPath":"/blog/authors"}')}}]);
\ No newline at end of file
diff --git a/assets/js/af26485d.97675ce0.js b/assets/js/af26485d.97675ce0.js
new file mode 100644
index 000000000..2c9f54da8
--- /dev/null
+++ b/assets/js/af26485d.97675ce0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5553],{51915:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"user/repository/ipfs","title":"IPFS repository","description":"Dappnode leverages IPFS for distributing packages available in the Dappstore. To download these packages, your Dappnode requires a connection to an IPFS node. When it comes to connecting to the IPFS network, you have two primary choices:","source":"@site/docs/user/repository/ipfs.md","sourceDirName":"user/repository","slug":"/user/repository/ipfs","permalink":"/docs/user/repository/ipfs","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/repository/ipfs.md","tags":[],"version":"current","frontMatter":{"title":"IPFS repository","llm_description":"Configure local or remote IPFS nodes for downloading Dappnode packages from the Dappstore."},"sidebar":"userSidebar","previous":{"title":"Ethereum","permalink":"/docs/user/repository/ethereum"},"next":{"title":"Overview","permalink":"/docs/user/install/overview"}}');var t=n(74848),i=n(28453);const r={title:"IPFS repository",llm_description:"Configure local or remote IPFS nodes for downloading Dappnode packages from the Dappstore."},a="IPFS repository",d={},c=[{value:"Run your own IPFS node",id:"run-your-own-ipfs-node",level:2},{value:"Use a remote IPFS node",id:"use-a-remote-ipfs-node",level:2},{value:"Troubleshooting",id:"troubleshooting",level:3}];function l(e){const o={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Details:s}=o;return s||function(e,o){throw new Error("Expected "+(o?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"ipfs-repository",children:"IPFS repository"})}),"\n",(0,t.jsx)(o.p,{children:"Dappnode leverages IPFS for distributing packages available in the Dappstore. To download these packages, your Dappnode requires a connection to an IPFS node. When it comes to connecting to the IPFS network, you have two primary choices:"}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsxs)(o.li,{children:[(0,t.jsx)(o.strong,{children:"Run Your Own IPFS Node"}),": By opting for this, you maintain full control, ensuring that you directly access the distributed packages without intermediaries. However, it might require some disk space."]}),"\n",(0,t.jsxs)(o.li,{children:[(0,t.jsx)(o.strong,{children:"Use a Remote Node"}),": This is a convenient option, but it comes with the caveat of needing to trust the remote node operator. It is really useful in case your own IPFS node becomes unreliable or unavailable. For this option, Dappnode offers its gateway ",(0,t.jsx)(o.code,{children:"https://gateway.ipfs.dappnode.io/"}),", but you're welcome to change the URL to any other gateway if you prefer."]}),"\n"]}),"\n",(0,t.jsx)(o.admonition,{type:"tip",children:(0,t.jsxs)(o.p,{children:["To configure your dappnode IPFS repository go to ",(0,t.jsx)(o.a,{href:"http://my.dappnode/system/ipfs",children:"http://my.dappnode/system/ipfs"})]})}),"\n",(0,t.jsx)(o.h2,{id:"run-your-own-ipfs-node",children:"Run your own IPFS node"}),"\n",(0,t.jsxs)(o.p,{children:["You can run your own IPFS node to connect to the IPFS network. This is the recommended option for those users who want to have full control over their dappnode. Dappnode comes with an IPFS node preinstalled and configured. You can access the ",(0,t.jsx)(o.a,{href:"http://ipfs.dappnode:5001/webui",children:"IPFS Web UI"})," while connected to your Dappnode."]}),"\n",(0,t.jsx)(o.p,{children:(0,t.jsx)(o.img,{alt:"ipfs-remote-local",src:n(78906).A+"",width:"1686",height:"503"})}),"\n",(0,t.jsx)(o.admonition,{type:"caution",children:(0,t.jsxs)(o.p,{children:["Running your own IPFS node may affect your internet connection. If you don't want to run your own IPFS node, you can use a remote IPFS node. Consider stopping your IPFS node if you are not using it at ",(0,t.jsx)(o.a,{href:"http://my.dappnode/packages/system/ipfs.dnp.dappnode.eth/info",children:"IPFS Package"})]})}),"\n",(0,t.jsx)(o.h2,{id:"use-a-remote-ipfs-node",children:"Use a remote IPFS node"}),"\n",(0,t.jsxs)(o.p,{children:["You can use a remote IPFS node gateway to connect to the IPFS network. You will need to trust the node operator. Dappnode provides an ",(0,t.jsx)(o.a,{href:"https://gateway.ipfs.dappnode.io",children:"Official IPFS gateway"})," by default, but you can choose any other IPFS gateway."]}),"\n",(0,t.jsx)(o.p,{children:(0,t.jsx)(o.img,{alt:"ipfs-remote-node",src:n(69969).A+"",width:"1686",height:"503"})}),"\n",(0,t.jsxs)(o.admonition,{title:"IPFS gateways and security",type:"note",children:[(0,t.jsxs)(o.p,{children:["Connecting to IPFS remote gateways could entail security risks. For example, the gateway could attempt to serve malicious content to the user. We mitigate this risk by verifying the content downloaded with ",(0,t.jsx)(o.a,{href:"https://docs.ipfs.io/concepts/content-addressing/",children:"CID technology"}),"."]}),(0,t.jsxs)(o.p,{children:["If the Dappnode IPFS gateway is not available (we make no uptime guarantees and we offer it on a best-effort basis) the user can set another IPFS gateway in the input field as last resort. Check out all the ",(0,t.jsx)(o.a,{href:"https://ipfs.github.io/public-gateway-checker/",children:"IPFS gateways available"})]})]}),"\n",(0,t.jsx)("hr",{}),"\n",(0,t.jsx)(o.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:(0,t.jsx)("b",{children:"I can't see the logos of the packages in the Dappstore/Stakers tab. Why?"})}),(0,t.jsxs)("p",{children:[(0,t.jsx)(o.p,{children:"This might be related to an issue with IPFS. Try the following solutions:"}),(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"IPFS Mode"}),":"]}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsxs)(o.li,{children:["Navigate to the ",(0,t.jsx)(o.a,{href:"http://my.dappnode/repository/ipfs",children:"repository"}),"."]}),"\n",(0,t.jsxs)(o.li,{children:["Toggle between ",(0,t.jsx)(o.code,{children:"local"})," and ",(0,t.jsx)(o.code,{children:"remote"})," IPFS modes to see which one works."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"IPFS Package Status"}),":"]}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsxs)(o.li,{children:["If your IPFS mode is set to ",(0,t.jsx)(o.code,{children:"local"}),", ensure that the IPFS package is running."]}),"\n",(0,t.jsxs)(o.li,{children:["Visit ",(0,t.jsx)(o.a,{href:"http://my.dappnode/packages/system/ipfs.dnp.dappnode.eth/info",children:"IPFS Package"}),' to verify its status and click on "Start" if it is stopped.']}),"\n",(0,t.jsx)(o.li,{children:"If it's restarting, consider updating the IPFS package to its latest version. Post update, remove its volumes to address any potential database migration issues."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"Gateway Validity"}),":"]}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsxs)(o.li,{children:["For ",(0,t.jsx)(o.code,{children:"remote"})," IPFS mode, make sure the gateway URL in the ",(0,t.jsx)(o.a,{href:"http://my.dappnode/repository/ipfs",children:"repository"})," is correct."]}),"\n"]}),"\n"]}),"\n"]})]})]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:(0,t.jsx)("b",{children:"I'm using local IPFS and encountering issues downloading packages. What should I do?"})}),(0,t.jsxs)("p",{children:[(0,t.jsx)(o.p,{children:"This could arise from various factors:"}),(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"Internet Connection"}),":"]}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsxs)(o.li,{children:["Your connection might be unstable. Consider switching your IPFS node mode to ",(0,t.jsx)(o.code,{children:"lowpower"})," by accessing ",(0,t.jsx)(o.a,{href:"http://my.dappnode/packages/system/ipfs.dnp.dappnode.eth/config",children:"IPFS config"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"Disk Space"}),":"]}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsx)(o.li,{children:"Your local IPFS node might be out of storage."}),"\n",(0,t.jsxs)(o.li,{children:['Clear the storage by opting for "Remove volumes" at ',(0,t.jsx)(o.a,{href:"http://my.dappnode/packages/system/ipfs.dnp.dappnode.eth/info",children:"IPFS package info"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"Dappnode Official Gateway as Peer"}),":"]}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsx)(o.li,{children:"Ensure that the Dappnode Official Gateway is added as a peer to your local IPFS."}),"\n",(0,t.jsxs)(o.li,{children:["You can add it directly by clicking ",(0,t.jsx)(o.a,{href:"http://my.dappnode/system/add-ipfs-peer/%2Fdns4%2Fipfs.dappnode.io%2Ftcp%2F4001%2Fipfs%2FQmfB6dT5zxUq1BXiXisgcZKYkvjywdDYBK5keRaqDKH633",children:"here"}),"."]}),"\n"]}),"\n"]}),"\n"]}),(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"Tip"}),": If these solutions don't resolve the issue, switch to the ",(0,t.jsx)(o.code,{children:"remote IPFS mode"})," at ",(0,t.jsx)(o.a,{href:"http://my.dappnode/repository/ipfs",children:"IPFS repository"}),"."]})]})]})]})}function p(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},78906:(e,o,n)=>{n.d(o,{A:()=>s});const s=n.p+"assets/images/repository-ipfs-local-ba4ff0f2389c7a6acfc1dd18a92b5769.png"},69969:(e,o,n)=>{n.d(o,{A:()=>s});const s=n.p+"assets/images/repository-ipfs-remote-63afc9cdd838ed399994b7563390b7b4.png"},28453:(e,o,n)=>{n.d(o,{R:()=>r,x:()=>a});var s=n(96540);const t={},i=s.createContext(t);function r(e){const o=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(i.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/b1a9ae1f.084b6f40.js b/assets/js/b1a9ae1f.084b6f40.js
new file mode 100644
index 000000000..7b62a5575
--- /dev/null
+++ b/assets/js/b1a9ae1f.084b6f40.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1849],{17488:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"dev/package-development/overview","title":"Package Development","description":"Welcome to the Package Development section! This guide will help you create your own Dappnode packages. In Dappnode, packages are applications that you can download and install on your Dappnode machine, allowing you to enhance its functionality.","source":"@site/docs/dev/package-development/overview.md","sourceDirName":"dev/package-development","slug":"/dev/package-development/overview","permalink":"/docs/dev/package-development/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/package-development/overview.md","tags":[],"version":"current","frontMatter":{"title":"Package Development","llm_description":"Overview of single-config and multi-config package repository types."},"sidebar":"devSidebar","previous":{"title":"Notifications","permalink":"/docs/dev/references/notifications"},"next":{"title":"Single Configuration","permalink":"/docs/dev/package-development/single-configuration"}}');var i=o(74848),a=o(28453);const s={title:"Package Development",llm_description:"Overview of single-config and multi-config package repository types."},r="Package Development",c={},l=[{value:"Types of Package Repositories",id:"types-of-package-repositories",level:3},{value:"Developing Packages",id:"developing-packages",level:3}];function p(e){const n={a:"a",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"package-development",children:"Package Development"})}),"\n",(0,i.jsxs)(n.p,{children:["Welcome to the ",(0,i.jsx)(n.strong,{children:"Package Development"})," section! This guide will help you create your own Dappnode packages. In Dappnode, packages are applications that you can download and install on your Dappnode machine, allowing you to enhance its functionality."]}),"\n",(0,i.jsx)(n.h3,{id:"types-of-package-repositories",children:"Types of Package Repositories"}),"\n",(0,i.jsx)(n.p,{children:"There are two main types of package repositories:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Standard Package Repository"}),": Used to generate a single package, tailored for a specific configuration."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Multi-Configuration (Generic) Package Repository"}),": Used to generate multiple packages with varying configurations, such as different networks or client setups. For example, a multi-configuration repository could be used to build packages for both ",(0,i.jsx)(n.strong,{children:"Holesky Nethermind"})," and ",(0,i.jsx)(n.strong,{children:"Mainnet Nethermind"}),", which differ in their configurations."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"developing-packages",children:"Developing Packages"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Single-Configuration Package"}),": If you want to develop a package with a single configuration, like ",(0,i.jsx)(n.a,{href:"https://github.com/dappnode/DAppNodePackage-rotki",children:"Rotki"}),", follow the instructions ",(0,i.jsx)(n.a,{href:"/docs/dev/package-development/single-configuration",children:"here"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Multi-Configuration Package"}),": For packages with multiple configurations, like ",(0,i.jsx)(n.a,{href:"https://github.com/dappnode/DAppNodePackage-lodestar-generic",children:"Lodestar"}),", refer to ",(0,i.jsx)(n.a,{href:"/docs/dev/package-development/multi-configuration",children:"this guide"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"By following these guides, you'll be able to create and contribute your own packages to the Dappnode ecosystem."})]})}function d(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},28453:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>r});var t=o(96540);const i={},a=t.createContext(i);function s(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/b3edc04f.f520434c.js b/assets/js/b3edc04f.f520434c.js
new file mode 100644
index 000000000..9280a973f
--- /dev/null
+++ b/assets/js/b3edc04f.f520434c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8138],{830:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>p,contentTitle:()=>c,default:()=>d,frontMatter:()=>o,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"dev/package-publishing/publish-packages-clients","title":"Publish your packages seamlessly","description":"The aim of this guide is to help you publish the new packages of your product in Dappnode seamlessly. We created a new UI to ease the publication of your packages in a few minutes.","source":"@site/docs/dev/package-publishing/publish-packages-clients.md","sourceDirName":"dev/package-publishing","slug":"/dev/package-publishing/publish-packages-clients","permalink":"/docs/dev/package-publishing/publish-packages-clients","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/package-publishing/publish-packages-clients.md","tags":[],"version":"current","frontMatter":{"title":"Publish your packages seamlessly","llm_description":"Step-by-step guide for publishing packages using the SDK-publish UI."},"sidebar":"devSidebar","previous":{"title":"Multi-Configuration","permalink":"/docs/dev/package-development/multi-configuration"},"next":{"title":"Package Ownership","permalink":"/docs/dev/package-publishing/package-ownership"}}');var i=t(74848),a=t(28453);const o={title:"Publish your packages seamlessly",llm_description:"Step-by-step guide for publishing packages using the SDK-publish UI."},c="Publish your packages seamlessly",p={},l=[{value:"Publishing process",id:"publishing-process",level:3}];function r(e){const s={a:"a",h1:"h1",h3:"h3",header:"header",img:"img",p:"p",strong:"strong",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"publish-your-packages-seamlessly",children:"Publish your packages seamlessly"})}),"\n",(0,i.jsx)(s.p,{children:"The aim of this guide is to help you publish the new packages of your product in Dappnode seamlessly. We created a new UI to ease the publication of your packages in a few minutes."}),"\n",(0,i.jsxs)("aside",{children:[(0,i.jsx)(s.p,{children:"\ud83d\udc40"}),(0,i.jsx)(s.p,{children:"In this guide we are using images of a test repository to exemplify the process of publishing the packages. The actual screens may vary slightly."})]}),"\n",(0,i.jsx)(s.h3,{id:"publishing-process",children:"Publishing process"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Step 1."})," Go to ",(0,i.jsx)(s.a,{href:"https://github.com/dappnode",children:"Dappnode Github"})," and search for the generic repository of your product. You will find it with the name of ",(0,i.jsx)(s.strong,{children:"DAppNodePackage-yourproduct-generic."})]}),"\n",(0,i.jsx)(s.p,{children:"If your product is not listed and you want it to be included in Dappnode, contact us in Discord or Telegram."}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Step 2."})," Click on the ",(0,i.jsx)(s.strong,{children:"Releases"})," title section on the right side column (highlighted in red)"]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Step2",src:t(2379).A+"",width:"2878",height:"1374"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Step 3."})," In the releases section you can see all the packages of your product in the different blockchains. Select the package and click on \ud83d\udce3\xa0Publish."]}),"\n",(0,i.jsx)(s.p,{children:"Ideally you should have tested the package before publishing. You can use the IPFS hash from the release to install the package without having to publish it."}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Step3",src:t(38722).A+"",width:"2880",height:"1334"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Step 4."})," Once in this screen, click Connect wallet. Remember that the publishing wallet needs to be ",(0,i.jsx)(s.strong,{children:"whitelisted"})," by Dappnode. If your wallet is not whitelisted yet, contact us in Discord / Telegram."]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Step4_connect",src:t(82898).A+"",width:"2874",height:"1018"})}),"\n",(0,i.jsx)(s.p,{children:'Your wallet is mainly used for two tasks: to authenticate that you are eligible to publish in the APM SmartContracts and to sign the package to be published. This signature is used in the dappnode to verify that the package was actually signed by a "trusted key"'}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Step 5."})," Configure your custom IPFS settings. If you do not change it, default settings shown will be applied. Click Next button."]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Step5",src:t(10388).A+"",width:"2880",height:"1446"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Step 6."})," Specify the details of your release.\nDappnode package name: You can find it in dappnode_package.json file in the package.\nDeveloper address: In case you want to add a developer address to publish future versions a part from the owner.\nNext version: You can find it in dappnode_package.json file in the package.\nRelease hash: You find it in the release table in Step3.\nClick Next button"]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Step6",src:t(32847).A+"",width:"2880",height:"1554"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Step 7."})," Check the details of the package and sign the transaction with your wallet. The wallet must be connected in Ethereum mainnet to sign the transaction (even if the package is from other blockchain)."]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Step7",src:t(64102).A+"",width:"2876",height:"1352"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Step 8."})," After signing the first transaction, you need to click the Publish button and sign again with your wallet. This time you need ETH (gas) to sign the transaction."]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Step8",src:t(3905).A+"",width:"2878",height:"1318"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Step 9."})," Your package was successfully published! Congrats! \ud83c\udf89\xa0\nIf your product has a community of dappnode users, we invite you to announce it in our Discord community. Every user with this package installed and auto-updates enabled will auto update it within less than 3 days."]}),"\n",(0,i.jsx)(s.p,{children:"Thanks for reading the guide! If you found some problem in the process, do not hesitate to contact us in Discord / Telegram."})]})}function d(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(r,{...e})}):r(e)}},2379:(e,s,t)=>{t.d(s,{A:()=>n});const n=t.p+"assets/images/Step2-03f05ed784550e23e5fb8676be75147d.png"},38722:(e,s,t)=>{t.d(s,{A:()=>n});const n=t.p+"assets/images/Step3-a070005931f77f2357f9de8eaf9cc716.png"},82898:(e,s,t)=>{t.d(s,{A:()=>n});const n=t.p+"assets/images/Step4_connect-68c51fec5a0dc82814d430cce6312a23.png"},10388:(e,s,t)=>{t.d(s,{A:()=>n});const n=t.p+"assets/images/Step5-cd8431bff08d3d816fc1dd6312569187.png"},32847:(e,s,t)=>{t.d(s,{A:()=>n});const n=t.p+"assets/images/Step6-b17dacf439a9c28c78bdf9adb184c369.png"},64102:(e,s,t)=>{t.d(s,{A:()=>n});const n=t.p+"assets/images/Step7-9f2a6741f351d8f164d4bf37b6e94d8d.png"},3905:(e,s,t)=>{t.d(s,{A:()=>n});const n=t.p+"assets/images/Step8-54a0af96b92605467d1f50f3e8132f60.png"},28453:(e,s,t)=>{t.d(s,{R:()=>o,x:()=>c});var n=t(96540);const i={},a=n.createContext(i);function o(e){const s=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(a.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/b4800274.fff2f9ac.js b/assets/js/b4800274.fff2f9ac.js
new file mode 100644
index 000000000..323ab4694
--- /dev/null
+++ b/assets/js/b4800274.fff2f9ac.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1558],{47010:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>c,frontMatter:()=>i,metadata:()=>o,toc:()=>u});const o=JSON.parse('{"id":"user/rollups/overview","title":"Ethereum Rollups: An Overview","description":"Rollups are advanced layer-2 scaling solutions designed to increase the throughput of the Ethereum network. By executing and storing transaction data off the main Ethereum chain while keeping a cryptographic commitment on-chain, Rollups enhance scalability and reduce fees. Rollups can be broadly categorized into two types: Optimistic Rollups and zk-Rollups, each with its unique approach and trade-offs.","source":"@site/docs/user/rollups/overview.md","sourceDirName":"user/rollups","slug":"/user/rollups/overview","permalink":"/docs/user/rollups/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/rollups/overview.md","tags":[],"version":"current","frontMatter":{"title":"Ethereum Rollups: An Overview","llm_description":"Overview of Ethereum rollups as Layer 2 scaling solutions and how to enable them in Dappnode."},"sidebar":"userSidebar","previous":{"title":"Starknet Solo Staking","permalink":"/docs/user/staking/starknet/solo"},"next":{"title":"Optimism","permalink":"/docs/user/rollups/optimism"}}');var r=t(74848),s=t(28453);const i={title:"Ethereum Rollups: An Overview",llm_description:"Overview of Ethereum rollups as Layer 2 scaling solutions and how to enable them in Dappnode."},l="Ethereum Rollups: An Overview",a={},u=[{value:"Enable rollups",id:"enable-rollups",level:2}];function p(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"ethereum-rollups-an-overview",children:"Ethereum Rollups: An Overview"})}),"\n",(0,r.jsx)(n.p,{children:"Rollups are advanced layer-2 scaling solutions designed to increase the throughput of the Ethereum network. By executing and storing transaction data off the main Ethereum chain while keeping a cryptographic commitment on-chain, Rollups enhance scalability and reduce fees. Rollups can be broadly categorized into two types: Optimistic Rollups and zk-Rollups, each with its unique approach and trade-offs."}),"\n",(0,r.jsx)(n.p,{children:"Currently, we support:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/user/rollups/optimism",children:(0,r.jsxs)(n.strong,{children:["\ud83c\udf40"," Optimism"]})}),": An optimistic Layer 2 solution for Ethereum, enhancing speed and efficiency."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"enable-rollups",children:"Enable rollups"}),"\n",(0,r.jsx)(n.p,{children:"To enable this feature, you need to switch on the rollups module in the top bar of the Dappnode UI (Dappmanager):"}),"\n",(0,r.jsx)("p",{align:"center",children:(0,r.jsx)("img",{width:"70%",src:"/img/rollups-module.png"})})]})}function c(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var o=t(96540);const r={},s=o.createContext(r);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/b9b44023.f3770036.js b/assets/js/b9b44023.f3770036.js
new file mode 100644
index 000000000..6d6916b1a
--- /dev/null
+++ b/assets/js/b9b44023.f3770036.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9575],{69045:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>d,default:()=>c,frontMatter:()=>r,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"user/videos-and-tutorials/guides/migrating-from-avado","title":"Transitioning To Dappnode","description":"Important: Before following this guide to install DappnodeOS on your Avado device, make sure to first backup any data if you are running a validator or any other dApp.","source":"@site/docs/user/videos-and-tutorials/guides/migrating-from-avado.md","sourceDirName":"user/videos-and-tutorials/guides","slug":"/user/videos-and-tutorials/guides/migrating-from-avado","permalink":"/docs/user/videos-and-tutorials/guides/migrating-from-avado","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/videos-and-tutorials/guides/migrating-from-avado.md","tags":[],"version":"current","frontMatter":{"title":"Transitioning To Dappnode","llm_description":"Step-by-step guide to migrate Avado hardware to DAppnodeOS using a bootable USB."},"sidebar":"userSidebar","previous":{"title":"How to connect a wallet to my node","permalink":"/docs/user/videos-and-tutorials/guides/connect-node"},"next":{"title":"FAQs","permalink":"/docs/user/faqs"}}');var s=o(74848),t=o(28453);const r={title:"Transitioning To Dappnode",llm_description:"Step-by-step guide to migrate Avado hardware to DAppnodeOS using a bootable USB."},d="Transitioning To Dappnode",a={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Why Migrate to Dappnode?",id:"why-migrate-to-dappnode",level:3},{value:"Important Considerations",id:"important-considerations",level:3},{value:"Prerequisites",id:"prerequisites",level:3},{value:"How To Migrate Your Avado Node To A Dappnode",id:"how-to-migrate-your-avado-node-to-a-dappnode",level:3},{value:"Additional Steps To Troubleshoot Your Installation",id:"additional-steps-to-troubleshoot-your-installation",level:3},{value:"Login Using SSH",id:"login-using-ssh",level:3},{value:"Login Using An External Monitor and Keyboard",id:"login-using-an-external-monitor-and-keyboard",level:3},{value:"Complete Installation",id:"complete-installation",level:3},{value:"How To Find Your Device's Internal IP Address",id:"how-to-find-your-devices-internal-ip-address",level:3},{value:"How To Re-Install Dappnode",id:"how-to-re-install-dappnode",level:3},{value:"Additional Step If You Still See Your Avado Wifi After Migrating",id:"additional-step-if-you-still-see-your-avado-wifi-after-migrating",level:3},{value:"Next Steps",id:"next-steps",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"transitioning-to-dappnode",children:"Transitioning To Dappnode"})}),"\n",(0,s.jsx)(n.admonition,{title:"Warning",type:"caution",children:(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Important:"})," Before following this guide to install DappnodeOS on your Avado device, make sure to first backup any data if you are running a validator or any other dApp.\n",(0,s.jsx)(n.strong,{children:"The migration process will otherwise wipe all existing data."})]})}),"\n",(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsxs)(n.p,{children:["This guide was adapted from the original ",(0,s.jsx)(n.a,{href:"https://github.com/hoprnet/hopr-docs/blob/d8d1ec05e5938eb29254188b711eec47a71a92ab/versioned_docs/version-v2.1.3/node/using-avado.md",children:"HOPR Migration Guide"})," & will walk you through the process of migrating your Avado hardware to DappnodeOS, due to the discontinuation of support for HOPR from AVADO."]}),"\n",(0,s.jsx)(n.p,{children:"By following these steps, you'll be able to transition your existing Avado hardware to run DappnodeOS, allowing you to take advantage of Dappnode's features and ecosystem."}),"\n",(0,s.jsx)(n.h3,{id:"why-migrate-to-dappnode",children:"Why Migrate to Dappnode?"}),"\n",(0,s.jsx)(n.p,{children:"Migrating to Dappnode offers several benefits:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Wider range of dApps"}),": Access to Dappnode's extensive library of decentralized applications."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Regular updates"}),": Benefit from Dappnode's frequent software updates and improvements. ",(0,s.jsx)(n.em,{children:"This is the most common reason for change."})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Community support"}),": Join the active Dappnode community for assistance and collaboration."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Enhanced features"}),": Utilize Dappnode-specific features for node management and monitoring."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"important-considerations",children:"Important Considerations"}),"\n",(0,s.jsx)(n.p,{children:"Before proceeding with the migration:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Backup your data"}),": If you're running a validator or any critical dApps, ensure you have a complete backup of your data."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Understand the process"}),": This migration will replace your Avado OS with DappnodeOS, wiping existing data on the device."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Time commitment"}),": The process requires about 20-30 minutes of active work, plus waiting times for installation and setup."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"By following this guide, you'll be able to repurpose your Avado hardware to run as a full-fledged Dappnode, opening up new possibilities in the world of decentralized infrastructure."}),"\n",(0,s.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsx)(n.p,{children:"To complete the transition, you will need the following:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"An empty USB with at least 2 GB of space"}),"\n",(0,s.jsx)(n.li,{children:"Physical access to your Avado device"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"how-to-migrate-your-avado-node-to-a-dappnode",children:"How To Migrate Your Avado Node To A Dappnode"}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"1"}),") Create a bootable USB from ",(0,s.jsx)(n.a,{href:"https://github.com/dappnode/DAppNode/releases/download/v0.2.94/DAppNode-v0.2.94-debian-bookworm-amd64-unattended.iso",children:"this ISO file"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["We strongly recommend using ",(0,s.jsx)(n.a,{href:"https://etcher.balena.io/#download-etcher",children:"Etcher"})," to create a bootable USB, as it will ensure a smooth migration process."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Note:"})," The following instructions show how to use Etcher to create a bootable USB. But you can use any tool for this."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"2"}),") Download Etcher; you can download it ",(0,s.jsx)(n.a,{href:"https://etcher.balena.io/#download-etcher",children:"here."})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Download Etcher",src:o(19551).A+"",width:"2332",height:"649"})}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"3"}),") Plug your USB stick into your computer and open Etcher."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Open Etcher",src:o(59447).A+"",width:"1197",height:"595"})}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"4"}),") Press the ",(0,s.jsx)(n.code,{children:"Flash from file"})," button and select the ",(0,s.jsx)(n.a,{href:"https://github.com/dappnode/DAppNode/releases/download/v0.2.94/DAppNode-v0.2.94-debian-bookworm-amd64-unattended.iso",children:"Dappnode ISO file"})," when prompted."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"5"}),") Then press ",(0,s.jsx)(n.code,{children:"Flash!"})," and wait for the download to complete."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Loading Flash",src:o(28716).A+"",width:"1195",height:"649"})}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"6"}),") Once the download completes, you can remove the USB and use it to upgrade your Avado node's software."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"7"}),") Turn off your Avado device by holding the power button at the front."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"8"}),") Attach the bootable USB to any Avado USB port and connect an Ethernet cable to provide internet to the Avado device."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"9"}),") With the USB attached, turn on the Avado device and ",(0,s.jsx)(n.strong,{children:"wait 15 minutes"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"10"}),") ",(0,s.jsx)(n.strong,{children:"After 15 minutes"}),", turn off the Avado device by holding the power button and waiting until the red light goes off."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"11"}),") Now remove the USB, turn the Avado device back on, and ",(0,s.jsx)(n.strong,{children:"wait 5 minutes"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"12"}),") After 5 minutes have passed, check if ",(0,s.jsx)(n.code,{children:"DappNodeWifi"})," has appeared on your computer's wifi list. If it has, try and log in with the Wifi password: ",(0,s.jsx)(n.code,{children:"dappnode"})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Dappnode Wifi",src:o(33796).A+"",width:"1921",height:"223"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"If you cannot find the Dappnode wifi"})," follow ",(0,s.jsx)(n.a,{href:"/docs/user/videos-and-tutorials/guides/migrating-from-avado#additional-steps-to-troubleshoot-your-installation",children:"these additional steps"})," to complete the installation."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"If you cannot find the Dappnode wifi and still see your Avado wifi"})," follow ",(0,s.jsx)(n.a,{href:"/docs/user/videos-and-tutorials/guides/migrating-from-avado#additional-step-if-you-still-see-your-avado-wifi-after-migrating",children:"these additional steps"})," to complete the installation."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"13"}),") Once connected to the Dappnode wifi, access the Dappnode Dashboard at: ",(0,s.jsx)(n.a,{href:"http://my.dappnode/",children:"http://my.dappnode/"}),", and you can follow the instructions ",(0,s.jsx)(n.a,{href:"/docs/user/videos-and-tutorials/overview",children:"here to set up your Dappnode."})]}),"\n",(0,s.jsx)(n.h3,{id:"additional-steps-to-troubleshoot-your-installation",children:"Additional Steps To Troubleshoot Your Installation"}),"\n",(0,s.jsxs)(n.admonition,{title:"INFO",type:"info",children:[(0,s.jsxs)(n.p,{children:["These are additional steps to be followed in case you cannot find the Dappnode wifi after following the ",(0,s.jsx)(n.a,{href:"/docs/user/videos-and-tutorials/guides/migrating-from-avado#how-to-migrate-your-avado-node-to-a-dappnode",children:"above instructions"}),"."]}),(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Note:"}),' If you can see the wifi network "DappNodeWifi" on your computer\'s list of available networks, you do not have to complete these additional steps.']})]}),"\n",(0,s.jsx)(n.p,{children:"To login to your new Dappnode, you will need either:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"An external monitor, external keyboard & HDMI cable."}),"\n",(0,s.jsxs)(n.li,{children:["Or, the ",(0,s.jsx)(n.a,{href:"/docs/user/videos-and-tutorials/guides/migrating-from-avado#how-to-find-your-internal-ip-address",children:"internal IP of your connected Avado/Dappnode"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["If you have the internal IP address of your device you can ",(0,s.jsx)(n.a,{href:"/docs/user/videos-and-tutorials/guides/migrating-from-avado#login-using-ssh",children:"login using SSH"}),", otherwise you can ",(0,s.jsx)(n.a,{href:"/docs/user/videos-and-tutorials/guides/migrating-from-avado#login-using-an-external-monitor-and-keyboard",children:"use an external monitor and keyboard"})," to interact with your Avado/Dappnode directly."]}),"\n",(0,s.jsx)(n.h3,{id:"login-using-ssh",children:"Login Using SSH"}),"\n",(0,s.jsxs)(n.p,{children:["To complete the installation using SSH, you will need to make sure you know your device's internal IP address. You can follow ",(0,s.jsx)(n.a,{href:"/docs/user/videos-and-tutorials/guides/migrating-from-avado#how-to-find-your-internal-ip-address",children:"these steps"})," to find your internal IP address if you haven't already."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"1"}),") Connect to your now converted dappnode by entering the following command into your terminal:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ssh dappnode@[INSERT_YourInternalIPAddress]\n"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Note:"})," replace ",(0,s.jsx)(n.code,{children:"[INSERT_YourInternalIPAddress]"})," with your devices' internal IP address E.g. ",(0,s.jsx)(n.code,{children:"192.xxx.x.xxx"}),"."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Dappnode Login",src:o(80461).A+"",width:"1336",height:"351"})}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"2"}),") You will then be asked to log in. Use the following default credentials to log in:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"Username: dappnode\nPassword: dappnode.s0\n"})}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"3"}),") Once you've logged in, complete the installation through the terminal as documented ",(0,s.jsx)(n.a,{href:"/docs/user/videos-and-tutorials/guides/migrating-from-avado#complete-installation",children:"here."})]}),"\n",(0,s.jsx)(n.h3,{id:"login-using-an-external-monitor-and-keyboard",children:"Login Using An External Monitor and Keyboard"}),"\n",(0,s.jsx)(n.p,{children:"You can log in to your node using an external monitor & keyboard."}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"1"}),") Plug in your monitor to your Avado/Dappnode using an HDMI cable."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"2"}),") Plug in your external keyboard to your Avado/Dappnode device."]}),"\n",(0,s.jsx)(n.p,{children:"Your monitor should display a screen asking for your login details."}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"3"}),") Use the following default credentials to log in:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"Username: dappnode\nPassword: dappnode.s0\n"})}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"4"}),") Once you've logged in, complete the installation through the terminal as documented ",(0,s.jsx)(n.a,{href:"/docs/user/videos-and-tutorials/guides/migrating-from-avado#complete-installation",children:"here."})]}),"\n",(0,s.jsx)(n.h3,{id:"complete-installation",children:"Complete Installation"}),"\n",(0,s.jsxs)(n.p,{children:["These are additional steps to complete the installation of Dappnode software in case you cannot find the Dappnode wifi after following the ",(0,s.jsx)(n.a,{href:"/docs/user/videos-and-tutorials/guides/migrating-from-avado#how-to-migrate-your-avado-node-to-a-dappnode",children:"above instructions"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Follow these steps after having logged into your now semi-transitioned Avado device. You should see the following screen:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Dappnode Screen",src:o(29863).A+"",width:"1318",height:"507"})}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"1"}),") Install the following package and enter the password ",(0,s.jsx)(n.code,{children:"dappnode.s0"})," if prompted."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo apt-get install -y kbd\n"})}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"2"}),") Install the prerequisites using the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo wget -O - https://prerequisites.dappnode.io | sudo bash\n"})}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"3"}),") Install the dappnode package using the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo wget -O - https://installer.dappnode.io | sudo bash\n"})}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"4"}),") Finally, run the command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo reboot \n"})}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"4"}),") Wait a few minutes and check if ",(0,s.jsx)(n.code,{children:"DappNodeWifi"})," has appeared in your computer's wifi list. Wifi password: ",(0,s.jsx)(n.code,{children:"dappnode"})]}),"\n",(0,s.jsx)(n.h3,{id:"how-to-find-your-devices-internal-ip-address",children:"How To Find Your Device's Internal IP Address"}),"\n",(0,s.jsx)(n.p,{children:"To find your Device's internal IP address, you need to look through the connected devices in your browser's UI. Where this is located on your UI will depend on your internet provider, but the general format can be followed as is below."}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"1"}),") Find your Router's IP address. For Windows and macOS users, you can use ",(0,s.jsx)(n.a,{href:"https://www.hellotech.com/guide/for/how-do-i-find-my-router-ip-address",children:"this guide."})]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"2"}),") Log in to your router's UI by entering your IP address into your browser. You will be greeted with a screen similar to the following (this will vary depending on your provider):"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Browser UI Login",src:o(25296).A+"",width:"2560",height:"790"})}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"3"}),") Login to your browser's UI, and then locate the connected devices panel. Here you should find the device ",(0,s.jsx)(n.code,{children:"dappnode"})," along with the IP address of the device."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Dappnode internal IP",src:o(23362).A+"",width:"1216",height:"202"})}),"\n",(0,s.jsx)(n.h3,{id:"how-to-re-install-dappnode",children:"How To Re-Install Dappnode"}),"\n",(0,s.jsx)(n.p,{children:"These are instructions to re-install Dappnode software on your Avado. This is only for troubleshooting a failed previous installation."}),"\n",(0,s.jsx)(n.p,{children:"To do this, you will need:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Physical access to your Avado device"}),"\n",(0,s.jsx)(n.li,{children:"A micro screwdriver"}),"\n",(0,s.jsx)(n.li,{children:"A bootable USB with Dappnode software"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"1"}),") Remove the power cable and any other cables from your Avado device."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"2"}),") Remove the bottom of your Avado (you will need a micro screwdriver for this)."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"3"}),") Now detach the RAM module by gently pulling the two pins outwards. The module should pop upwards without any pressure. Remove the erected module, and you should see a circular battery underneath."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"4"}),") Remove the battery and wait ",(0,s.jsx)(n.strong,{children:"10 minutes."})]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"5"}),") Then add the battery and any other detached modules back to the device and screw back on the bottom."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"5"}),") Re-attach the power supply and ethernet cable."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"6"}),") Turn on the Avado device for 2 minutes, and then turn the device back off."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"7"}),") Plug in the USB stick, and turn the device back on."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"8"}),") Wait for ",(0,s.jsx)(n.strong,{children:"15 minutes"}),", then turn off the device."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"9"}),") Detach the USB and turn on your device."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"10"}),") Wait for ",(0,s.jsx)(n.strong,{children:"5 minutes"})," and check if ",(0,s.jsx)(n.code,{children:"DappNodeWifi"})," has appeared in your computer's wifi list. Wifi password: ",(0,s.jsx)(n.code,{children:"dappnode"})]}),"\n",(0,s.jsx)(n.h3,{id:"additional-step-if-you-still-see-your-avado-wifi-after-migrating",children:"Additional Step If You Still See Your Avado Wifi After Migrating"}),"\n",(0,s.jsxs)(n.p,{children:["If after having completed the ",(0,s.jsx)(n.a,{href:"/docs/user/videos-and-tutorials/guides/migrating-from-avado#how-to-migrate-your-avado-node-to-a-dappnode",children:"migration steps"})," you still see your Avado wifi instead of ",(0,s.jsx)(n.code,{children:"DappNodeWifi"}),". Then, there is likely an issue with your USB's boot options."]}),"\n",(0,s.jsx)(n.p,{children:"To solve this issue with the instructions below, you will need access to the following:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"An external keyboard"}),"\n",(0,s.jsx)(n.li,{children:"An external monitor"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"If you do not have an external monitor & keyboard"})," Follow the instructions ",(0,s.jsx)(n.a,{href:"/docs/user/videos-and-tutorials/guides/migrating-from-avado#how-to-re-install-dappnode",children:"here"})," instead."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"1"}),") Turn off your Avado device."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"2"}),") Attach the external keyboard using one of the USB ports on the Avado. And attach the external monitor to the Avado using an HDMI cable."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"3"}),") With your external monitor & keyboard connected, plug in the bootable USB you created earlier."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"4"}),") Now turn on the Avado, and start pressing the ",(0,s.jsx)(n.code,{children:"Esc"})," key until you enter the BIOS. This should be visible on the monitor you have connected."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"5"}),") Use the arrow keys to navigate to the ",(0,s.jsx)(n.code,{children:"Boot"})," tab."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"6"}),") Here, under ",(0,s.jsx)(n.code,{children:"Boot Option Priorities"}),", select ",(0,s.jsx)(n.code,{children:"Boot Option #"})," and then change it to your attached USB."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"7"}),") Now, using your arrow keys, navigate to the ",(0,s.jsx)(n.code,{children:"Save & Exit"})," tab and save your settings."]}),"\n",(0,s.jsxs)(n.p,{children:["(",(0,s.jsx)(n.strong,{children:"8"}),") Your device should now restart and begin booting from your attached USB. You can now resume the ",(0,s.jsx)(n.a,{href:"/docs/user/videos-and-tutorials/guides/migrating-from-avado#how-to-migrate-your-avado-node-to-a-dappnode",children:"initial installation method"})," but now starting directly from the 10th step."]}),"\n",(0,s.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,s.jsxs)(n.p,{children:["Once you've migrated your Avado device to run Dappnode software, you should follow the instructions under our Dappnode section to set up and configure your node. You can view these instructions ",(0,s.jsx)(n.a,{href:"/docs/user/videos-and-tutorials/overview",children:"here"}),"."]})]})}function c(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},23362:(e,n,o)=>{o.d(n,{A:()=>i});const i=o.p+"assets/images/Dappnode_internal_IP-0dca768bdb66aa7a6864317c32179f64.png"},29863:(e,n,o)=>{o.d(n,{A:()=>i});const i=o.p+"assets/images/Dappnode_screen-9e04bbbfdaa9c21537262e2865da7312.png"},80461:(e,n,o)=>{o.d(n,{A:()=>i});const i=o.p+"assets/images/Dappnode_ssh-1d42c3fbfaf6c60cf3089cd6c688a44f.png"},33796:(e,n,o)=>{o.d(n,{A:()=>i});const i=o.p+"assets/images/Dappnode_wifi-60fa9cb414184bf4b7173f5c645f6352.png"},19551:(e,n,o)=>{o.d(n,{A:()=>i});const i=o.p+"assets/images/Download_Etcher-0e12704b9c93a696acfeaba23299fe53.png"},28716:(e,n,o)=>{o.d(n,{A:()=>i});const i=o.p+"assets/images/Loading_flash-6235ba645fffabe9050c09369e18578e.png"},59447:(e,n,o)=>{o.d(n,{A:()=>i});const i=o.p+"assets/images/Open_Etcher-12e395df66269c455643f183b70e6bb1.png"},25296:(e,n,o)=>{o.d(n,{A:()=>i});const i=o.p+"assets/images/browser_UI_login-841c35bddd014d58dd22fc19751657d8.png"},28453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>d});var i=o(96540);const s={},t=i.createContext(s);function r(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/b9c10046.be509574.js b/assets/js/b9c10046.be509574.js
new file mode 100644
index 000000000..9f00c4ac4
--- /dev/null
+++ b/assets/js/b9c10046.be509574.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5838],{92897:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>n,default:()=>l,frontMatter:()=>r,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"smooth/subscribe-to-smooth/automatic","title":"Automatic Subscription","description":"This is the simplest way to subscribe to Smooth. It consists of changing the fee recipient of your validator to Smooth\'s address and subscribing automatically when proposing your next block.","source":"@site/docs/smooth/subscribe-to-smooth/automatic.md","sourceDirName":"smooth/subscribe-to-smooth","slug":"/smooth/subscribe-to-smooth/automatic","permalink":"/docs/smooth/subscribe-to-smooth/automatic","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/smooth/subscribe-to-smooth/automatic.md","tags":[],"version":"current","frontMatter":{"title":"Automatic Subscription","llm_description":"Auto-subscribe by setting fee recipient to Smooth address and proposing a block."},"sidebar":"smoothSidebar","previous":{"title":"Overview","permalink":"/docs/smooth/subscribe-to-smooth/overview"},"next":{"title":"Manual subscription","permalink":"/docs/smooth/subscribe-to-smooth/manual"}}');var i=o(74848),a=o(28453);const r={title:"Automatic Subscription",llm_description:"Auto-subscribe by setting fee recipient to Smooth address and proposing a block."},n="Automatic Subscription",d={},c=[{value:"Step 1: Change your fee recipient to Smooth's address.",id:"step-1-change-your-fee-recipient-to-smooths-address",level:3},{value:"Step 2: Check your subscription status!",id:"step-2-check-your-subscription-status",level:3}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h3:"h3",header:"header",img:"img",p:"p",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"automatic-subscription",children:"Automatic Subscription"})}),"\n",(0,i.jsxs)(t.p,{children:["This is the simplest way to subscribe to ",(0,i.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),". It consists of changing the fee recipient of your validator to Smooth's address and subscribing automatically when proposing your next block."]}),"\n",(0,i.jsxs)(t.admonition,{title:"Before automatically subscribing to Smooth!",type:"danger",children:[(0,i.jsx)(t.p,{children:"Only validators with ETH1 withdrawal addresses can be subscribed to Smooth. If you have a validator with a BLS withdrawal address, please update it to an ETH1 withdrawal address before subscribing to Smooth."}),(0,i.jsx)(t.p,{children:"Ensure that you have control over the ETH1 withdrawal address of the validators you plan to subscribe to Smooth. This address is the one you will need to use when logging into Smooth's website and manage your validators going forward. Only the withdrawal address has the capability to claim rewards generated by your validators from Smooth."})]}),"\n",(0,i.jsx)(t.h3,{id:"step-1-change-your-fee-recipient-to-smooths-address",children:"Step 1: Change your fee recipient to Smooth's address."}),"\n",(0,i.jsxs)(t.p,{children:["Go to your dappnode's ",(0,i.jsx)(t.a,{href:"http://brain.web3signer.dappnode/",children:"staking brain"})," and change the fee recipient of the validators you want to subscribe to Smooth's address (",(0,i.jsx)(t.code,{children:"0xAdFb8D27671F14f297eE94135e266aAFf8752e35"}),"). Once ",(0,i.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," receives the rewards from your validator, it will automatically subscribe your validator, and you will start receiving rewards from other members.\n",(0,i.jsx)(t.img,{alt:"fee_recipient",src:o(65320).A+"",width:"2728",height:"552"})]}),"\n",(0,i.jsx)(t.admonition,{title:"Keep the fee recipient set to Smooth's address!",type:"danger",children:(0,i.jsxs)(t.p,{children:["It is extremely important that you keep the fee recipient of your validator set to Smooth's address (",(0,i.jsx)(t.code,{children:"0xAdFb8D27671F14f297eE94135e266aAFf8752e35"}),") as long as it is subscribed to ",(0,i.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),". If, at any point, you change the fee recipient of your validator and propose a block without unsubscribing first, you will be banned from ",(0,i.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," and will not be able to participate in it again."]})}),"\n",(0,i.jsx)(t.h3,{id:"step-2-check-your-subscription-status",children:"Step 2: Check your subscription status!"}),"\n",(0,i.jsxs)(t.p,{children:["Go to ",(0,i.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth's website"})," and log in with your wallet. A list of all the validators with the same withdrawal address as your logged in wallet will appear. Once the validator proposes a block, it will appear as subscribed. We recommend you familiarize yourself with this website! It is the place where you will manage your validators going forward."]})]})}function l(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},65320:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/smooth_fee_recipient-9a97308ed0c601ccc84b0295efe34cd4.png"},28453:(e,t,o)=>{o.d(t,{R:()=>r,x:()=>n});var s=o(96540);const i={},a=s.createContext(i);function r(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function n(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/bb9993f2.89a8bb83.js b/assets/js/bb9993f2.89a8bb83.js
new file mode 100644
index 000000000..ce6696263
--- /dev/null
+++ b/assets/js/bb9993f2.89a8bb83.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9597],{49590:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>p,default:()=>c,frontMatter:()=>s,metadata:()=>o,toc:()=>a});const o=JSON.parse('{"id":"user/dappnode-premium/premium-overview","title":"Dappnode Premium","description":"What is Dappnode Premium?","source":"@site/docs/user/dappnode-premium/premium-overview.md","sourceDirName":"user/dappnode-premium","slug":"/user/dappnode-premium/premium-overview","permalink":"/docs/user/dappnode-premium/premium-overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/dappnode-premium/premium-overview.md","tags":[],"version":"current","frontMatter":{"title":"Dappnode Premium","llm_description":"Dappnode Premium: paid services including monitoring, support, and beacon node backup."},"sidebar":"userSidebar","previous":{"title":"How To Install Dappnode App","permalink":"/docs/user/dappnode-app/how-to-install"},"next":{"title":"Premium services","permalink":"/docs/user/dappnode-premium/premium-services"}}');var r=i(74848),t=i(28453);const s={title:"Dappnode Premium",llm_description:"Dappnode Premium: paid services including monitoring, support, and beacon node backup."},p=void 0,d={},a=[{value:"What is Dappnode Premium?",id:"what-is-dappnode-premium",level:3},{value:"How to subscribe to Premium",id:"how-to-subscribe-to-premium",level:3}];function u(e){const n={a:"a",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h3,{id:"what-is-dappnode-premium",children:"What is Dappnode Premium?"}),"\n",(0,r.jsxs)(n.p,{children:["A new suite of services in Dappnode to ",(0,r.jsx)(n.strong,{children:"improve node runners' experience"})," including advanced monitoring, personalized support and Beacon node backup."]}),"\n",(0,r.jsxs)(n.p,{children:["Dappnode Premium is an additional layer of services built on top of Dappnode's open-source software, which ",(0,r.jsx)(n.strong,{children:"will continue to be free"})," and evolve as it always has."]}),"\n",(0,r.jsxs)(n.p,{children:["Dappnode Premium helps us to ",(0,r.jsx)(n.strong,{children:"support and sustain"})," the continued development of our ",(0,r.jsx)(n.strong,{children:"open-source software"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"how-to-subscribe-to-premium",children:"How to subscribe to Premium"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Go to the ",(0,r.jsx)(n.strong,{children:"Dappnode Premium website"}),", choose your prefered plan and buy the subscription."]}),"\n",(0,r.jsxs)(n.li,{children:["After buying the subscription, log in to ",(0,r.jsx)(n.a,{href:"http://my.dappnode",children:"http://my.dappnode"})," and click in the ",(0,r.jsx)(n.strong,{children:"Premium tab"})," in the left menu."]}),"\n",(0,r.jsxs)(n.li,{children:["With your purchase, you received an ",(0,r.jsx)(n.strong,{children:"email with your activation code"}),", copy and paste it in the Premium activation section and click Activate."]}),"\n",(0,r.jsxs)(n.li,{children:["If your activation was successful, you will see the ",(0,r.jsx)(n.strong,{children:"Activated"})," label at the top of the screen and you will be ready to use the Dappnode Premium services."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Enjoy Dappnode Premium!"})]})}function c(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>p});var o=i(96540);const r={},t=o.createContext(r);function s(e){const n=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function p(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/be56890f.b329e6ef.js b/assets/js/be56890f.b329e6ef.js
new file mode 100644
index 000000000..e08350ba4
--- /dev/null
+++ b/assets/js/be56890f.b329e6ef.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[6630],{46221:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>o,metadata:()=>s,toc:()=>a});const s=JSON.parse('{"id":"user/notifications/devices","title":"Devices management","description":"To receive push notifications in Dappnode, users need to subscribe their devices.","source":"@site/docs/user/notifications/devices.md","sourceDirName":"user/notifications","slug":"/user/notifications/devices","permalink":"/docs/user/notifications/devices","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/notifications/devices.md","tags":[],"version":"current","frontMatter":{"title":"Devices management","llm_description":"How to subscribe desktop/mobile devices to receive push notifications in Dappnode."},"sidebar":"userSidebar","previous":{"title":"Legacy","permalink":"/docs/user/notifications/legacy"},"next":{"title":"Overview","permalink":"/docs/user/dappnode-app/overview"}}');var t=n(74848),c=n(28453);const o={title:"Devices management",llm_description:"How to subscribe desktop/mobile devices to receive push notifications in Dappnode."},r="Devices management",d={},a=[{value:"\ud83d\udda5\ufe0f Subscribe your device",id:"\ufe0f-subscribe-your-device",level:3},{value:"\ud83d\udee0\ufe0f Manage your subscription",id:"\ufe0f-manage-your-subscription",level:3}];function u(e){const i={h1:"h1",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,c.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"devices-management",children:"Devices management"})}),"\n",(0,t.jsx)(i.p,{children:"To receive push notifications in Dappnode, users need to subscribe their devices.\nBoth desktop and mobile devices can be subscribed using different browsers, such as Chrome, Brave or Safari."}),"\n",(0,t.jsx)(i.h3,{id:"\ufe0f-subscribe-your-device",children:"\ud83d\udda5\ufe0f Subscribe your device"}),"\n",(0,t.jsx)(i.p,{children:"To subscribe a device, you need to:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Go to the Notification section in the navigation menu"}),"\n",(0,t.jsx)(i.li,{children:"In notifications, go to the Devices tab"}),"\n",(0,t.jsx)(i.li,{children:"Click the Subscribe Device button."}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Subscribe-device",src:n(89868).A+"",width:"2876",height:"1530"})}),"\n",(0,t.jsx)(i.p,{children:"Your device will be shown in the Subcribed devices section."}),"\n",(0,t.jsx)(i.h3,{id:"\ufe0f-manage-your-subscription",children:"\ud83d\udee0\ufe0f Manage your subscription"}),"\n",(0,t.jsx)(i.p,{children:"Once the device is subscribed, you can do several actions:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"You can send a test notification to your subscribed device."}),"\n",(0,t.jsx)(i.li,{children:"You can edit your subscription name."}),"\n",(0,t.jsx)(i.li,{children:"You can cancel your device subcription."}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Notifications-devices",src:n(76521).A+"",width:"2878",height:"1800"})})]})}function l(e={}){const{wrapper:i}={...(0,c.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},76521:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/notifications-devices-4e142bb7f529e71931fc7438fc353f71.png"},89868:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/subscribe-device-82abf205c19d63ada5e9c5c6f1836e03.png"},28453:(e,i,n)=>{n.d(i,{R:()=>o,x:()=>r});var s=n(96540);const t={},c=s.createContext(t);function o(e){const i=s.useContext(c);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(c.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/bebe2ff8.1231db8e.js b/assets/js/bebe2ff8.1231db8e.js
new file mode 100644
index 000000000..6906425b3
--- /dev/null
+++ b/assets/js/bebe2ff8.1231db8e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[25],{23180:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"user/packages/understanding-dappnode-packages/info","title":"Info","description":"The Info section provides a comprehensive overview of the package\'s status and essential details. This section is crucial for understanding the current state of the package and managing its basic operations. Below are the key features you\'ll find in the Info section:","source":"@site/docs/user/packages/understanding-dappnode-packages/info.md","sourceDirName":"user/packages/understanding-dappnode-packages","slug":"/user/packages/understanding-dappnode-packages/info","permalink":"/docs/user/packages/understanding-dappnode-packages/info","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/packages/understanding-dappnode-packages/info.md","tags":[],"version":"current","frontMatter":{"title":"Info","llm_description":"Package info section showing version, status, links, and management options like remove/restart."},"sidebar":"userSidebar","previous":{"title":"Overview","permalink":"/docs/user/packages/understanding-dappnode-packages/overview"},"next":{"title":"Config","permalink":"/docs/user/packages/understanding-dappnode-packages/config"}}');var t=s(74848),o=s(28453);const i={title:"Info",llm_description:"Package info section showing version, status, links, and management options like remove/restart."},r="Info",c={},d=[];function p(e){const n={h1:"h1",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"info",children:"Info"})}),"\n",(0,t.jsx)(n.p,{children:"The Info section provides a comprehensive overview of the package's status and essential details. This section is crucial for understanding the current state of the package and managing its basic operations. Below are the key features you'll find in the Info section:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Version"}),": Displays both the package's version and its upstream version."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Getting Started"}),": Provides essential information needed to run the package. You can remove this section if it's not needed anymore."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Links"}),": Offers various options, including bundled package UI/Dashboards, related tools such as Launchpads, and external documentation."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Package Status Indicator"}),": Indicates the current status of the package (e.g., running, crashed, restarting)."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Package Status Manager"}),": Allows you to play/pause or restart the package for management and troubleshooting purposes."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Remove Volumes"}),": Wipes all package data. For blockchain nodes/clients, this will force the package to start syncing from scratch (or from a checkpoint if a proper URL has been set). This option is represented by a gray trash bin icon."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Remove Package"}),": Completely removes the package from your Dappnode. You can choose to either keep or delete any data associated with it. This option is represented by a red trash bin icon."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"dappnode_packages1",src:s(78603).A+"",width:"1741",height:"1091"})})]})}function l(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}},78603:(e,n,s)=>{s.d(n,{A:()=>a});const a=s.p+"assets/images/dappnode_packages1-9986b39b271ef6adbc6d4a98e907f5c7.png"},28453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>r});var a=s(96540);const t={},o=a.createContext(t);function i(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/c15d9823.40bb63ad.js b/assets/js/c15d9823.40bb63ad.js
new file mode 100644
index 000000000..b4429f155
--- /dev/null
+++ b/assets/js/c15d9823.40bb63ad.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8146],{29328:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/c38c9aa9.941f1677.js b/assets/js/c38c9aa9.941f1677.js
new file mode 100644
index 000000000..c22a44097
--- /dev/null
+++ b/assets/js/c38c9aa9.941f1677.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[582],{71130:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"user/install/overview","title":"Installation Overview","description":"Specifications & Minimum Requirements","source":"@site/docs/user/install/overview.md","sourceDirName":"user/install","slug":"/user/install/overview","permalink":"/docs/user/install/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/install/overview.md","tags":[],"version":"current","frontMatter":{"title":"Installation Overview","llm_description":"Installation overview: minimum hardware specs and comparison of ISO vs script methods."},"sidebar":"userSidebar","previous":{"title":"IPFS","permalink":"/docs/user/repository/ipfs"},"next":{"title":"ISO","permalink":"/docs/user/install/iso"}}');var t=i(74848),o=i(28453);const a={title:"Installation Overview",llm_description:"Installation overview: minimum hardware specs and comparison of ISO vs script methods."},r="Installation Overview",l={},d=[{value:"Specifications & Minimum Requirements",id:"specifications--minimum-requirements",level:2},{value:"Installation Methods",id:"installation-methods",level:2},{value:"1. ISO Installation",id:"1-iso-installation",level:3},{value:"2. Script Installation over Debian-based Distribution",id:"2-script-installation-over-debian-based-distribution",level:3}];function c(e){const n={a:"a",admonition:"admonition",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"installation-overview",children:"Installation Overview"})}),"\n",(0,t.jsx)(n.h2,{id:"specifications--minimum-requirements",children:"Specifications & Minimum Requirements"}),"\n",(0,t.jsx)(n.p,{children:"Dappnode is a Debian-based OS, which makes it friendly with most available commercial hardware. Depending on what you intend to run in your Dappnode you might need higher specifications, but a great number of available features can be used with the following recommendations:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Intel Core i5/i7"}),"\n",(0,t.jsx)(n.li,{children:"32 GB RAM"}),"\n",(0,t.jsx)(n.li,{children:"4 TB NVMe storage"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"As minimum requirements we recommend:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Intel Core i3"}),"\n",(0,t.jsx)(n.li,{children:"16 GB RAM"}),"\n",(0,t.jsx)(n.li,{children:"2 TB NVMe or fast SSD storage"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If you don't have enough technical experience to customize your own hardware, remember you can always get a plug n play ",(0,t.jsx)(n.a,{href:"https://dappnode.com/collections/all",children:"Dappnode Home"})," in our online shop."]}),"\n",(0,t.jsx)(n.h2,{id:"installation-methods",children:"Installation Methods"}),"\n",(0,t.jsx)(n.p,{children:"Installing Dappnode can be achieved through two primary methods:"}),"\n",(0,t.jsxs)(n.h3,{id:"1-iso-installation",children:["1. ",(0,t.jsx)(n.a,{href:"/docs/user/install/iso",children:"ISO Installation"})]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Description"}),": This method involves downloading the Dappnode ISO file and using it to directly install Dappnode on your system."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Best for"}),": Most users as it provides a comprehensive setup designed specifically for Dappnode."]}),"\n"]}),"\n",(0,t.jsxs)(n.h3,{id:"2-script-installation-over-debian-based-distribution",children:["2. ",(0,t.jsx)(n.a,{href:"/docs/user/install/script",children:"Script Installation"})," over Debian-based Distribution"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Description"}),": If you're already running a Debian-based distribution, you can utilize the Dappnode script to facilitate the installation process."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Best for"}),": Users who want to install Dappnode on a cloud server, ARM device (where it's the only option), or those who desire a specific Debian-based distro."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsx)(n.p,{children:"For ARM-based systems, only the script installation method is available."})}),"\n",(0,t.jsx)(n.p,{children:"Choose the method that best fits your needs and system setup. Make sure to follow the respective installation instructions carefully for a smooth and successful Dappnode deployment."}),"\n",(0,t.jsxs)(n.admonition,{title:"Continuous Uptime",type:"caution",children:[(0,t.jsx)(n.p,{children:"Dappnode is designed to run 24/7. Many features and functions within Dappnode, especially blockchain nodes, rely on continuous uptime to maintain their state, sync, and functionality. For instance:"}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Blockchain Nodes"}),": If you have a synced blockchain node and you turn off Dappnode, the node will lose its sync. This means when you turn it back on, it'll take time to catch up to the latest state, which can be resource-intensive and time-consuming."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Validator Nodes"}),": For users staking on certain blockchain networks, continuous uptime is crucial. Being offline might result in missed opportunities or even penalties."]}),"\n"]}),"\n"]}),(0,t.jsx)(n.p,{children:"Considering these aspects, it's recommended to ensure your Dappnode device remains powered on and running at all times."})]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>r});var s=i(96540);const t={},o=s.createContext(t);function a(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/c75934c3.a8a3dd18.js b/assets/js/c75934c3.a8a3dd18.js
new file mode 100644
index 000000000..dca604493
--- /dev/null
+++ b/assets/js/c75934c3.a8a3dd18.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[912],{31e3:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"dev/sdk/sdk-publish","title":"SDK-Publish","description":"The SDK-Publish tool is a component of the Dappnode Software Development Kit (dappnodesdk). This tool simplifies the process of signing and publishing Dappnode package releases, utilizing your wallet for secure and efficient transaction management.","source":"@site/docs/dev/sdk/sdk-publish.md","sourceDirName":"dev/sdk","slug":"/dev/sdk/sdk-publish","permalink":"/docs/dev/sdk/sdk-publish","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/sdk/sdk-publish.md","tags":[],"version":"current","frontMatter":{"title":"SDK-Publish","llm_description":"Guide for using SDK-Publish tool to sign and publish package releases."},"sidebar":"devSidebar","previous":{"title":"Commands","permalink":"/docs/dev/sdk/commands"},"next":{"title":"Docker Compose","permalink":"/docs/dev/references/docker-compose"}}');var t=s(74848),o=s(28453);const l={title:"SDK-Publish",llm_description:"Guide for using SDK-Publish tool to sign and publish package releases."},r="SDK-Publish",d={},a=[{value:"How it works?",id:"how-it-works",level:2}];function p(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"sdk-publish",children:"SDK-Publish"})}),"\n",(0,t.jsx)(n.p,{children:"The SDK-Publish tool is a component of the Dappnode Software Development Kit (dappnodesdk). This tool simplifies the process of signing and publishing Dappnode package releases, utilizing your wallet for secure and efficient transaction management."}),"\n",(0,t.jsx)(n.p,{children:"With SDK-Publish, developers can ensure their Dappnode packages are authenticated and ready for deployment, enhancing the security and integrity of their releases. Whether you are a seasoned developer or new to Dappnode, SDK-Publish provides an intuitive interface to facilitate the package release process, making it an essential tool for anyone involved in Dappnode Packages development."}),"\n",(0,t.jsx)(n.h2,{id:"how-it-works",children:"How it works?"}),"\n",(0,t.jsx)(n.p,{children:"Below you have a step-by-step guide about the package releases publishing process."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"@dappnode/dappnodesdk publish"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"npx @dappnode/dappnodesdk publish [type]\n"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Execute ",(0,t.jsx)(n.code,{children:"npx @dappnode/dappnodesdk publish"})," in your package directory to generate a pre-filled URL with the parameters for the sdk-publish WebApp."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Providing the ",(0,t.jsx)(n.code,{children:"[type]"})," will also be necessary. Choose between ",(0,t.jsx)(n.code,{children:"patch | minor | major"}),", according to your package release. If you are pretending to upload the package to developing dappnode's IPFS node instead of your own IPFS node, make sure to include ",(0,t.jsx)(n.code,{children:"--provider=remote"})," flag."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Navigate to the outputed URL to begin the publishing process in the WebApp."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Connect Wallet"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Once in the SDK-Publish UI you will have to connect to your wallet provider. Click 'Connect wallet' to link your wallet. A permission pop-up will appear in your provider."}),"\n",(0,t.jsx)(n.li,{children:"If your wallet network isn't set to 'Ethereum Mainnet', a 'Switch network' button will appear. This button will prompt your wallet to switch to Mainnet, after which the WebApp will refresh."}),"\n",(0,t.jsx)(n.li,{children:"If already connected and set to 'Ethereum Mainnet', this step will be skipped."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Edit IPFS settings"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Edit your IPFS settings for release propagation if desired. If not, the IPFS dappnode-dev node will be used.","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IPFS API URLs"})," => accepts multiple IPFS API URLs to facilitate the propagation of the signed release"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IPFS Gateway URL"})," => accepts a single IPFS Gateway URL to ensure the IPFS hash has propagated."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Release Details"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Complete the form with your package release information. If accessed via the pre-filled URL from ",(0,t.jsx)(n.a,{href:"https://github.com/dappnode/DAppNodeSDK",children:"@dappnode/dappnodesdk"}),", the form will be auto-filled. (For new repos, provide the developer address too)."]}),"\n",(0,t.jsx)(n.li,{children:"It checks if the input values are valid, determines if it's a new repo deployment or an update, and verifies that the manifest information matches the provided hash manifest. If all checks pass, the 'Continue' button will be enabled."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Sign and Publish"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Allows to sign the release and publishing after it, confirming actions via wallet pop-ups."}),"\n",(0,t.jsx)(n.li,{children:"Before the sign, it verifies your address is whitelisted to publish a new version if deploying an update from an existing package."}),"\n",(0,t.jsx)(n.li,{children:"Feedback on loading, errors, or success will be provided throughout the process."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Release Published"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"By this step, your transaction will be successfully queued! It will be processed\nsooner or later based on the gas fee you provided. You will receive confirmation and the transaction hash for the package deployment."}),"\n"]}),"\n"]}),"\n"]})]})}function c(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>l,x:()=>r});var i=s(96540);const t={},o=i.createContext(t);function l(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/c7a466cb.5c10c350.js b/assets/js/c7a466cb.5c10c350.js
new file mode 100644
index 000000000..d7d296e53
--- /dev/null
+++ b/assets/js/c7a466cb.5c10c350.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4693],{20268:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"user/getting-started/register","title":"Register","description":"1. Register as New User","source":"@site/docs/user/getting-started/register.md","sourceDirName":"user/getting-started","slug":"/user/getting-started/register","permalink":"/docs/user/getting-started/register","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/getting-started/register.md","tags":[],"version":"current","frontMatter":{"title":"Register","llm_description":"Guide to create a Dappnode account, secure recovery token, and log in to the interface."},"sidebar":"userSidebar","previous":{"title":"Access your Dappnode via WiFi","permalink":"/docs/user/getting-started/access-dappnode-via-wifi"},"next":{"title":"Setup","permalink":"/docs/user/getting-started/setup"}}');var t=r(74848),o=r(28453);const i={title:"Register",llm_description:"Guide to create a Dappnode account, secure recovery token, and log in to the interface."},c="Register",d={},l=[{value:"1. Register as New User",id:"1-register-as-new-user",level:2},{value:"2. Secure Your Recovery Token",id:"2-secure-your-recovery-token",level:2},{value:"3. Logging In",id:"3-logging-in",level:2},{value:"Troubleshooting",id:"troubleshooting",level:3}];function a(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components},{Details:r}=n;return r||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"register",children:"Register"})}),"\n",(0,t.jsx)(n.h2,{id:"1-register-as-new-user",children:"1. Register as New User"}),"\n",(0,t.jsx)(n.p,{children:"Start by setting up your new account:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Input"})," your desired ",(0,t.jsx)(n.strong,{children:"Username"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Select a secure password"}),". It should include a combination of characters, numbers, and special symbols for optimal security."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Confirm your password"})," to ensure accuracy."]}),"\n",(0,t.jsxs)(n.li,{children:["Click the ",(0,t.jsx)(n.strong,{children:"Register"})," button."]}),"\n"]}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{width:"50%",src:"/img/register.png",alt:"Register"})}),"\n",(0,t.jsx)(n.h2,{id:"2-secure-your-recovery-token",children:"2. Secure Your Recovery Token"}),"\n",(0,t.jsx)(n.p,{children:"Upon successful registration, you'll be provided with a Recovery Token. This token is crucial for:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Retrieving your password if forgotten."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Regaining account access if needed."}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"To safeguard your token"}),":"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:'Click the button or link labeled "View Recovery Token".'}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Diligently copy the token and store it in a safe location."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"caution",children:(0,t.jsx)(n.p,{children:"We recommend that you store your token in both digital (encrypted) and physical forms (noted and stored securely). If you lose access to both your password and token, you will lose access to your account."})}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{width:"50%",src:"/img/register-token.png",alt:"Recovery Token"})}),"\n",(0,t.jsx)(n.h2,{id:"3-logging-in",children:"3. Logging In"}),"\n",(0,t.jsx)(n.p,{children:"With your account ready and Recovery Token secured:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Proceed to the ",(0,t.jsx)(n.strong,{children:"Login"})," page."]}),"\n",(0,t.jsxs)(n.li,{children:["Input your ",(0,t.jsx)(n.strong,{children:"Username"})," and ",(0,t.jsx)(n.strong,{children:"Password"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Press the ",(0,t.jsx)(n.strong,{children:"Login"})," button to dive into your Dappnode account."]}),"\n"]}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{width:"50%",src:"/img/register-login.png",alt:"Login"})}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:(0,t.jsx)("b",{children:"Want to change your password?"})}),(0,t.jsxs)(n.p,{children:["Visit ",(0,t.jsx)("a",{href:"http://my.dappnode/system/profile",children:"Profile Settings"})," to reset it."]})]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:(0,t.jsx)("b",{children:"Forgot your password?"})}),(0,t.jsxs)(n.p,{children:["Go to the ",(0,t.jsx)("a",{href:"http://my.dappnode/",children:"Login"})," page and click on \"Forgot your password?\". You'll be prompted to enter the recovery token you saved during registration. Once entered, you'll be able to reset your password."]})]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:(0,t.jsx)("b",{children:"Lost your recovery token?"})}),(0,t.jsxs)(n.p,{children:["If you've lost your recovery token, there is still a chance to regain access to the Dappmanager UI. However, you will require ",(0,t.jsx)("a",{href:"/docs/user/access-your-dappnode/terminal",children:"accessing via terminal"}),". Once you are in, you can get your recovery token by running the following command:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cat /usr/src/dappnode/DNCORE/admin-recovery-token.txt\n"})})]})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},28453:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>c});var s=r(96540);const t={},o=s.createContext(t);function i(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/c9627cbc.7e687801.js b/assets/js/c9627cbc.7e687801.js
new file mode 100644
index 000000000..b2af59a7f
--- /dev/null
+++ b/assets/js/c9627cbc.7e687801.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9524],{585:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>n,metadata:()=>r,toc:()=>u});const r=JSON.parse('{"id":"user/videos-and-tutorials/crash-course","title":"Crash Course","description":"Want to learn more about Dappnode through video tutorials? Check out our Dappnode Driving School!","source":"@site/docs/user/videos-and-tutorials/crash-course.md","sourceDirName":"user/videos-and-tutorials","slug":"/user/videos-and-tutorials/crash-course","permalink":"/docs/user/videos-and-tutorials/crash-course","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/videos-and-tutorials/crash-course.md","tags":[],"version":"current","frontMatter":{"title":"Crash Course","llm_description":"Collection of YouTube workshop recordings covering Dappnode setup, validators, and staking."},"sidebar":"userSidebar","previous":{"title":"Configuration","permalink":"/docs/user/videos-and-tutorials/driving-school/configuration"},"next":{"title":"How to connect a wallet to my node","permalink":"/docs/user/videos-and-tutorials/guides/connect-node"}}');var s=t(74848),a=t(28453);const n={title:"Crash Course",llm_description:"Collection of YouTube workshop recordings covering Dappnode setup, validators, and staking."},i="Crash Course",d={},u=[{value:"1. How to set up Dappnode from scratch using your own hardware",id:"1-how-to-set-up-dappnode-from-scratch-using-your-own-hardware",level:2},{value:"2. How to set up a validator",id:"2-how-to-set-up-a-validator",level:2},{value:"3. How to setup Stakehouse node operator",id:"3-how-to-setup-stakehouse-node-operator",level:2},{value:"4. How to withdraw your staked ETH",id:"4-how-to-withdraw-your-staked-eth",level:2},{value:"5. How to subscribe your validator to Smooth \ud83d\ude0e",id:"5-how-to-subscribe-your-validator-to-smooth-",level:2},{value:"6. How to earn rewards with your Dappnode without investing",id:"6-how-to-earn-rewards-with-your-dappnode-without-investing",level:2}];function c(e){const o={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.header,{children:(0,s.jsx)(o.h1,{id:"crash-course",children:"Crash Course"})}),"\n",(0,s.jsx)(o.admonition,{type:"info",children:(0,s.jsxs)(o.p,{children:["Want to learn more about Dappnode through video tutorials? Check out our ",(0,s.jsx)(o.strong,{children:(0,s.jsx)(o.a,{href:"/docs/user/videos-and-tutorials/driving-school/initial-setup",children:"Dappnode Driving School!"})})]})}),"\n",(0,s.jsx)(o.p,{children:"Every now and then we get together in our Dappnode Discord Community to offer live workshops on how to achieve different features and tricks with your Dappnode. These sessions are uploaded to our YouTube channel, so you can watch them at your own pace. Here are a few past editions you might find interesting!"}),"\n",(0,s.jsx)(o.h2,{id:"1-how-to-set-up-dappnode-from-scratch-using-your-own-hardware",children:"1. How to set up Dappnode from scratch using your own hardware"}),"\n",(0,s.jsx)("center",{children:(0,s.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/VBUIIV8Jo_U",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,s.jsx)(o.h2,{id:"2-how-to-set-up-a-validator",children:"2. How to set up a validator"}),"\n",(0,s.jsx)("center",{children:(0,s.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/Bc6FomfhkbI",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,s.jsx)(o.h2,{id:"3-how-to-setup-stakehouse-node-operator",children:"3. How to setup Stakehouse node operator"}),"\n",(0,s.jsx)("center",{children:(0,s.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/tQwy096M8L8",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,s.jsx)(o.h2,{id:"4-how-to-withdraw-your-staked-eth",children:"4. How to withdraw your staked ETH"}),"\n",(0,s.jsx)("center",{children:(0,s.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/1uxOIcR92uQ",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,s.jsx)(o.h2,{id:"5-how-to-subscribe-your-validator-to-smooth-",children:"5. How to subscribe your validator to Smooth \ud83d\ude0e"}),"\n",(0,s.jsx)("center",{children:(0,s.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/1ZJUEiAFtSw",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})}),"\n",(0,s.jsx)(o.h2,{id:"6-how-to-earn-rewards-with-your-dappnode-without-investing",children:"6. How to earn rewards with your Dappnode without investing"}),"\n",(0,s.jsx)("center",{children:(0,s.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/nLH4632sAKg",frameborder:"0",allow:"accelerometer; autoplay; fullscreen"})})]})}function h(e={}){const{wrapper:o}={...(0,a.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453:(e,o,t)=>{t.d(o,{R:()=>n,x:()=>i});var r=t(96540);const s={},a=r.createContext(s);function n(e){const o=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:n(e.components),r.createElement(a.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/cbc5934e.55d78218.js b/assets/js/cbc5934e.55d78218.js
new file mode 100644
index 000000000..a2fcd05ad
--- /dev/null
+++ b/assets/js/cbc5934e.55d78218.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[7253],{16104:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"dao","title":"DAO","description":"DAO information","source":"@site/docs/dao.md","sourceDirName":".","slug":"/dao","permalink":"/docs/dao","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dao.md","tags":[],"version":"current","frontMatter":{"title":"DAO","description":"DAO information","llm_description":"Dappnode DAO governance overview: NODE token addresses, mission, Snapshot voting, and ValidatorDAO."},"sidebar":"daoSidebar","next":{"title":"The NODE Economy","permalink":"/docs/dao/node-basics"}}');var i=o(74848),s=o(28453);const a={title:"DAO",description:"DAO information",llm_description:"Dappnode DAO governance overview: NODE token addresses, mission, Snapshot voting, and ValidatorDAO."},r="Governance",d={},c=[{value:"Token Addresses",id:"token-addresses",level:3},{value:"Mission & Membership",id:"mission--membership",level:3},{value:"Architecture",id:"architecture",level:3},{value:"DAO Projects",id:"dao-projects",level:3}];function l(e){const n={a:"a",admonition:"admonition",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.admonition,{title:"Documentation alert",type:"danger",children:(0,i.jsxs)(n.p,{children:["The DAO section of our documentation is currently outdated due to a security incident. For a detailed explanation of the issue and our response plan, please refer to our ",(0,i.jsx)(n.a,{href:"https://discourse.dappnode.io/t/node-hack-post-mortem-and-recovery-plan/1826",children:"post-mortem report on the node hack"}),"."]})}),"\n",(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"governance",children:"Governance"})}),"\n",(0,i.jsx)(n.h3,{id:"token-addresses",children:"Token Addresses"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["NODE Mainnet - ",(0,i.jsx)(n.a,{href:"https://etherscan.io/address/0xDa007777D86AC6d989cC9f79A73261b3fC5e0DA0",children:"0xDa007777D86AC6d989cC9f79A73261b3fC5e0DA0"})]}),"\n",(0,i.jsxs)(n.li,{children:["NODE xDai - ",(0,i.jsx)(n.a,{href:"https://blockscout.com/xdai/mainnet/address/0xc60e38C6352875c051B481Cbe79Dd0383AdB7817/transactions",children:"0xc60e38C6352875c051B481Cbe79Dd0383AdB7817"})]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"mission--membership",children:"Mission & Membership"}),"\n",(0,i.jsx)(n.p,{children:"The Dappnode DAO will be an inclusive hub in which Dappnode\u2019s community will carry on its mission to keep the web decentralized, uncensored and resilient. Active DAO members will have the opportunity to vote on Dappnode\u2019s future projects and on how to expand its array of hardware and software solutions."}),"\n",(0,i.jsx)(n.p,{children:"To get involved in Governance, DAO aspirants will need to make contributions to the ecosystem and help kick-start the NODE economy. Those who provide liquidity in the sanctioned pools (Uniswap and Sushiswap) or commit NODE to Governance Staking on Ethereum Mainnet or xDai will be granted voting powers proportional to their contributions. This way we can ensure that those with a voice are also those with a stake, and are not merely speculating with the token."}),"\n",(0,i.jsx)(n.h3,{id:"architecture",children:"Architecture"}),"\n",(0,i.jsxs)(n.p,{children:["DAppnode has tapped ",(0,i.jsx)(n.a,{href:"https://snapshot.org/#/",children:"Snapshot"})," technology to build its Governance structure. Snapshot is a novel piece of technology that allows off-chain voting for on-chain actions. It removes the prohibitive gas costs of participating in on-chain governance by taking snapshots of members\u2019 NODE currently being staked. Voting and creating proposals with Snapshot is done with a simple crypto wallet signature, no gas needed."]}),"\n",(0,i.jsx)(n.h3,{id:"dao-projects",children:"DAO Projects"}),"\n",(0,i.jsxs)(n.p,{children:["The first Dappnode project post-launch will be the hotly awaited ValidatorDAO. You can read this ",(0,i.jsx)(n.a,{href:"https://medium.com/dappnode/guardians-of-ethereum-a-validator-dao-proposal-d82e76231b45",children:"Medium article"})," to learn more about how ValidatorDAO is poised to revolutionize the relationship between Validators and Nominators!"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},28453:(e,n,o)=>{o.d(n,{R:()=>a,x:()=>r});var t=o(96540);const i={},s=t.createContext(i);function a(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/ccc49370.de368b15.js b/assets/js/ccc49370.de368b15.js
new file mode 100644
index 000000000..441a57d50
--- /dev/null
+++ b/assets/js/ccc49370.de368b15.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[3249],{18189:(e,t,n)=>{n.d(t,{A:()=>O});n(96540);var a=n(18215),s=n(83750),r=n(74848);function i(e){let{children:t,className:n}=e;return(0,r.jsx)("article",{className:n,children:t})}var l=n(56289);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:n,isBlogPostPage:i}=(0,s.e7)(),{permalink:c,title:d}=n,m=i?"h1":"h2";return(0,r.jsx)(m,{className:(0,a.A)(o.title,t),children:i?d:(0,r.jsx)(l.A,{to:c,children:d})})}var d=n(50539),m=n(81430),u=n(98569);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const n=function(){const{selectMessage:e}=(0,m.W)();return t=>{const n=Math.ceil(t);return e(n,(0,d.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:n}))}}();return(0,r.jsx)(r.Fragment,{children:n(t)})}function f(e){let{date:t,formattedDate:n}=e;return(0,r.jsx)("time",{dateTime:t,children:n})}function x(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function p(e){let{className:t}=e;const{metadata:n}=(0,s.e7)(),{date:i,readingTime:l}=n,o=(0,u.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,a.A)(h.container,"margin-vert--md",t),children:[(0,r.jsx)(f,{date:i,formattedDate:(c=i,o.format(new Date(c)))}),void 0!==l&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(x,{}),(0,r.jsx)(g,{readingTime:l})]})]});var c}var v=n(95921);const j={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function b(e){let{className:t}=e;const{metadata:{authors:n},assets:i}=(0,s.e7)();if(0===n.length)return null;const l=n.every((e=>{let{name:t}=e;return!t})),o=1===n.length;return(0,r.jsx)("div",{className:(0,a.A)("margin-top--md margin-bottom--sm",l?j.imageOnlyAuthorRow:"row",t),children:n.map(((e,t)=>(0,r.jsx)("div",{className:(0,a.A)(!l&&(o?"col col--12":"col col--6"),l?j.imageOnlyAuthorCol:j.authorCol),children:(0,r.jsx)(v.A,{author:{...e,imageURL:i.authorsImageUrls[t]??e.imageURL}})},t)))})}function A(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(p,{}),(0,r.jsx)(b,{})]})}var N=n(30099),L=n(900);function y(e){let{children:t,className:n}=e;const{isBlogPostPage:i}=(0,s.e7)();return(0,r.jsx)("div",{id:i?N.LU:void 0,className:(0,a.A)("markdown",n),children:(0,r.jsx)(L.A,{children:t})})}var _=n(204),C=n(5783),T=n(56239);function H(){return(0,r.jsx)("b",{children:(0,r.jsx)(d.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function k(e){const{blogPostTitle:t,...n}=e;return(0,r.jsx)(l.A,{"aria-label":(0,d.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...n,children:(0,r.jsx)(H,{})})}function w(){const{metadata:e,isBlogPostPage:t}=(0,s.e7)(),{tags:n,title:i,editUrl:l,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,m=!t&&o,u=n.length>0;if(!(u||m||l))return null;if(t){const e=!!(l||d||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[u&&(0,r.jsx)("div",{className:(0,a.A)("row","margin-top--sm",_.G.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(T.A,{tags:n})})}),e&&(0,r.jsx)(C.A,{className:(0,a.A)("margin-top--sm",_.G.blog.blogFooterEditMetaRow),editUrl:l,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[u&&(0,r.jsx)("div",{className:(0,a.A)("col",{"col--9":m}),children:(0,r.jsx)(T.A,{tags:n})}),m&&(0,r.jsx)("div",{className:(0,a.A)("col text--right",{"col--3":u}),children:(0,r.jsx)(k,{blogPostTitle:i,to:e.permalink})})]})}function O(e){let{children:t,className:n}=e;const l=function(){const{isBlogPostPage:e}=(0,s.e7)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(i,{className:(0,a.A)(l,n),children:[(0,r.jsx)(A,{}),(0,r.jsx)(y,{children:t}),(0,r.jsx)(w,{})]})}},37191:(e,t,n)=>{n.r(t),n.d(t,{default:()=>j});n(96540);var a=n(18215),s=n(81082),r=n(204),i=n(83750),l=n(60569),o=n(18189),c=n(50539),d=n(11865),m=n(74848);function u(e){const{nextItem:t,prevItem:n}=e;return(0,m.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.T)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[n&&(0,m.jsx)(d.A,{...n,subLabel:(0,m.jsx)(c.A,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer post"})}),t&&(0,m.jsx)(d.A,{...t,subLabel:(0,m.jsx)(c.A,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older post"}),isNext:!0})]})}function h(){const{assets:e,metadata:t}=(0,i.e7)(),{title:n,description:a,date:r,tags:l,authors:o,frontMatter:c}=t,{keywords:d}=c,u=e.image??c.image;return(0,m.jsxs)(s.be,{title:c.title_meta??n,description:a,keywords:d,image:u,children:[(0,m.jsx)("meta",{property:"og:type",content:"article"}),(0,m.jsx)("meta",{property:"article:published_time",content:r}),o.some((e=>e.url))&&(0,m.jsx)("meta",{property:"article:author",content:o.map((e=>e.url)).filter(Boolean).join(",")}),l.length>0&&(0,m.jsx)("meta",{property:"article:tag",content:l.map((e=>e.label)).join(",")})]})}var g=n(27143);function f(){const e=(0,i.J_)();return(0,m.jsx)(g.A,{children:(0,m.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}var x=n(97959),p=n(52075);function v(e){let{sidebar:t,children:n}=e;const{metadata:a,toc:s}=(0,i.e7)(),{nextItem:r,prevItem:c,frontMatter:d}=a,{hide_table_of_contents:h,toc_min_heading_level:g,toc_max_heading_level:f}=d;return(0,m.jsxs)(l.A,{sidebar:t,toc:!h&&s.length>0?(0,m.jsx)(x.A,{toc:s,minHeadingLevel:g,maxHeadingLevel:f}):void 0,children:[(0,m.jsx)(p.A,{metadata:a}),(0,m.jsx)(o.A,{children:n}),(r||c)&&(0,m.jsx)(u,{nextItem:r,prevItem:c})]})}function j(e){const t=e.content;return(0,m.jsx)(i.in,{content:e.content,isBlogPostPage:!0,children:(0,m.jsxs)(s.e3,{className:(0,a.A)(r.G.wrapper.blogPages,r.G.page.blogPostPage),children:[(0,m.jsx)(h,{}),(0,m.jsx)(f,{}),(0,m.jsx)(v,{sidebar:e.sidebar,children:(0,m.jsx)(t,{})})]})})}},40665:(e,t,n)=>{n.d(t,{A:()=>c});n(96540);var a=n(18215),s=n(27289),r=n(204),i=n(52362),l=n(74848);function o(e){let{className:t}=e;return(0,l.jsx)(i.A,{type:"caution",title:(0,l.jsx)(s.Rc,{}),className:(0,a.A)(t,r.G.common.unlistedBanner),children:(0,l.jsx)(s.Uh,{})})}function c(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(s.AE,{}),(0,l.jsx)(o,{...e})]})}},52075:(e,t,n)=>{n.d(t,{A:()=>d});n(96540);var a=n(18215),s=n(27289),r=n(204),i=n(52362),l=n(74848);function o(e){let{className:t}=e;return(0,l.jsx)(i.A,{type:"caution",title:(0,l.jsx)(s.Yh,{}),className:(0,a.A)(t,r.G.common.draftBanner),children:(0,l.jsx)(s.TT,{})})}var c=n(40665);function d(e){let{metadata:t}=e;const{unlisted:n,frontMatter:a}=t;return(0,l.jsxs)(l.Fragment,{children:[(n||a.unlisted)&&(0,l.jsx)(c.A,{}),a.draft&&(0,l.jsx)(o,{})]})}},97959:(e,t,n)=>{n.d(t,{A:()=>c});n(96540);var a=n(18215),s=n(71021);const r={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var i=n(74848);const l="table-of-contents__link toc-highlight",o="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,i.jsx)("div",{className:(0,a.A)(r.tableOfContents,"thin-scrollbar",t),children:(0,i.jsx)(s.A,{...n,linkClassName:l,linkActiveClassName:o})})}},71021:(e,t,n)=>{n.d(t,{A:()=>f});var a=n(96540),s=n(53115);function r(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...s}=e;n>=0?t[n].children.push(s):a.push(s)})),a}function i(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=i({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function l(e){const t=e.getBoundingClientRect();return t.top===t.bottom?l(e.parentNode):t}function o(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>l(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,a.useRef)(void 0),n=c();(0,a.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:s,minHeadingLevel:r,maxHeadingLevel:i}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),l=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let s=t;s<=n;s+=1)a.push(`h${s}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:r,maxHeadingLevel:i}),c=o(l,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(s),e.classList.add(s),t.current=e):e.classList.remove(s)}(e,e===d)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,n])}var m=n(56289),u=n(74848);function h(e){let{toc:t,className:n,linkClassName:a,isChild:s}=e;return t.length?(0,u.jsx)("ul",{className:s?void 0:n,children:t.map((e=>(0,u.jsxs)("li",{children:[(0,u.jsx)(m.A,{to:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,u.jsx)(h,{isChild:!0,toc:e.children,className:n,linkClassName:a})]},e.id)))}):null}const g=a.memo(h);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:l="table-of-contents__link",linkActiveClassName:o,minHeadingLevel:c,maxHeadingLevel:m,...h}=e;const f=(0,s.p)(),x=c??f.tableOfContents.minHeadingLevel,p=m??f.tableOfContents.maxHeadingLevel,v=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return(0,a.useMemo)((()=>i({toc:r(t),minHeadingLevel:n,maxHeadingLevel:s})),[t,n,s])}({toc:t,minHeadingLevel:x,maxHeadingLevel:p});return d((0,a.useMemo)((()=>{if(l&&o)return{linkClassName:l,linkActiveClassName:o,minHeadingLevel:x,maxHeadingLevel:p}}),[l,o,x,p])),(0,u.jsx)(g,{toc:v,className:n,linkClassName:l,...h})}},27289:(e,t,n)=>{n.d(t,{AE:()=>o,Rc:()=>i,TT:()=>d,Uh:()=>l,Yh:()=>c});n(96540);var a=n(50539),s=n(27143),r=n(74848);function i(){return(0,r.jsx)(a.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,r.jsx)(a.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function o(){return(0,r.jsx)(s.A,{children:(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,r.jsx)(a.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,r.jsx)(a.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]);
\ No newline at end of file
diff --git a/assets/js/cdc6bc37.e7d2c7b6.js b/assets/js/cdc6bc37.e7d2c7b6.js
new file mode 100644
index 000000000..0de982951
--- /dev/null
+++ b/assets/js/cdc6bc37.e7d2c7b6.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8826],{69363:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>n,contentTitle:()=>i,default:()=>c,frontMatter:()=>d,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"smooth/deep-dive-into-smooth/rewards","title":"Rewards","description":"Receiving and distributing rewards is one of the core functionalities of Smooth. In this section we will explain how rewards are handled by Smooth and how they are distributed to validators, as well as how users can claim their rewards.","source":"@site/docs/smooth/deep-dive-into-smooth/rewards.md","sourceDirName":"smooth/deep-dive-into-smooth","slug":"/smooth/deep-dive-into-smooth/rewards","permalink":"/docs/smooth/deep-dive-into-smooth/rewards","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/smooth/deep-dive-into-smooth/rewards.md","tags":[],"version":"current","frontMatter":{"title":"Rewards","llm_description":"How Smooth distributes rewards based on effective balance and converts pending to claimable."},"sidebar":"smoothSidebar","previous":{"title":"Overview","permalink":"/docs/smooth/deep-dive-into-smooth/overview"},"next":{"title":"Validator States","permalink":"/docs/smooth/deep-dive-into-smooth/states"}}');var a=o(74848),r=o(28453);const d={title:"Rewards",llm_description:"How Smooth distributes rewards based on effective balance and converts pending to claimable."},i="Rewards",n={},l=[{value:"Smooth's source of rewards",id:"smooths-source-of-rewards",level:2},{value:"How rewards are distributed",id:"how-rewards-are-distributed",level:2},{value:"How rewards are claimed",id:"how-rewards-are-claimed",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"rewards",children:"Rewards"})}),"\n",(0,a.jsxs)(t.p,{children:["Receiving and distributing rewards is one of the core functionalities of ",(0,a.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),". In this section we will explain how rewards are handled by ",(0,a.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," and how they are distributed to validators, as well as how users can claim their rewards."]}),"\n",(0,a.jsx)(t.h2,{id:"smooths-source-of-rewards",children:"Smooth's source of rewards"}),"\n",(0,a.jsxs)(t.p,{children:["A ",(0,a.jsx)(t.code,{children:"Reward"})," is considered to be any balance denominated in ETH that is sent to Smooth's address. When received, it is shared fairly among all the participants in the pool."]}),"\n",(0,a.jsx)(t.p,{children:"There are 2 main sources of rewards in Smooth:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Block Proposal rewards"}),": These rewards are generated by validators within the pool. Whenever a validator successfully proposes a block, it sends the block reward to Smooth's address."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Donations"}),": These are the rewards that are sent to Smooth's address by anyone who wants to support the project. ",(0,a.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," only accepts donations in ETH."]}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"how-rewards-are-distributed",children:"How rewards are distributed"}),"\n",(0,a.jsxs)(t.p,{children:["When a validator has an active subscription to the pool (",(0,a.jsx)(t.code,{children:"Active"})," or ",(0,a.jsx)(t.code,{children:"YellowCard"})," state) it is eligible for rewards, meaning that it will receive a given share of each reward that is sent to the pool. Validators in ",(0,a.jsx)(t.code,{children:"RedCard"})," are considered subscribed, but don't earn rewards until they become active again."]}),"\n",(0,a.jsx)("div",{align:"center",children:(0,a.jsx)("strong",{children:(0,a.jsx)(t.p,{children:"Validator Share = (Validator Effective Balance / Total Effective Balance) \xd7 Rewards to Distribute"})})}),"\n",(0,a.jsx)(t.p,{children:"Where:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Validator Effective Balance"}),": The staked amount of ETH of the validator."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Total Effective Balance"}),": The sum of all the effective balances of eligible validators in the pool (in ",(0,a.jsx)(t.code,{children:"Active"})," or ",(0,a.jsx)(t.code,{children:"YellowCard"})," state)."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Rewards to Distribute"}),": The amount of rewards that entered the pool. Normally, these come from block proposals or donations."]}),"\n"]}),"\n",(0,a.jsx)(t.admonition,{type:"info",children:(0,a.jsx)(t.p,{children:"Since the Pectra Fork on May 7, 2025 (10:05:11 UTC), validators can stake up to 2,048 ETH. The more ETH a validator stakes, the more frequently they are expected to be selected to propose blocks. In Smooth, this directly affects how rewards are distributed: for example, a validator staking 64 ETH will earn twice as much as one staking 32 ETH. This applies to all types of rewards, including donations."})}),"\n",(0,a.jsxs)(t.p,{children:["Smooth's distributes rewards to the validators as ",(0,a.jsx)(t.code,{children:"Pending Rewards"}),". These are rewards that are not ",(0,a.jsx)(t.em,{children:"consolidated"})," yet, meaning that they belong to the validator but they can not be claimed yet, until a valid block proposal is sent to ",(0,a.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," by that validator."]}),"\n",(0,a.jsxs)(t.p,{children:["Later on, when a validator sends a valid block proposal to ",(0,a.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),", all its ",(0,a.jsx)(t.code,{children:"Pending Rewards"})," are transformed into ",(0,a.jsx)(t.code,{children:"Accumulated Rewards"}),". These rewards are consolidated and can be claimed by the validator."]}),"\n",(0,a.jsx)(t.p,{children:"Therefore, we consider that a validator has 2 types of rewards:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Pending Rewards"}),": Rewards that are not consolidated yet. They can not be claimed."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Accumulated Rewards"}),": Rewards that are consolidated and can be claimed by the validator."]}),"\n"]}),"\n",(0,a.jsx)(t.admonition,{type:"info",children:(0,a.jsxs)(t.p,{children:["Dappnode receives a ",(0,a.jsx)(t.strong,{children:"7%"})," fee of all rewards distributed by ",(0,a.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"}),". This fee is automatically deducted from the rewards before they are distributed to validators. This fee serves to support the development and sustainability of ",(0,a.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," and Dappnode!"]})}),"\n",(0,a.jsx)(t.h2,{id:"how-rewards-are-claimed",children:"How rewards are claimed"}),"\n",(0,a.jsxs)(t.p,{children:["As a ",(0,a.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," user, you have a third type of reward: ",(0,a.jsx)(t.code,{children:"Claimable Rewards"}),". These are the sum of all your validator's ",(0,a.jsx)(t.code,{children:"Accumulated Rewards"})," with the same withdrawal address that you have not already claimed."]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Claimable Rewards"}),": Rewards that you can claim as a ",(0,a.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," user. Sum of all your validator's unclaimed ",(0,a.jsx)(t.code,{children:"Accumulated Rewards"}),"."]}),"\n"]}),"\n",(0,a.jsxs)(t.p,{children:["Smooth's users can claim their rewards by visiting ",(0,a.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth's website"})," and clicking on the ",(0,a.jsx)(t.code,{children:"Claim All"})," button once logged in. This trigger a transaction that will send all claimable rewards to the user's address."]}),"\n",(0,a.jsx)(t.admonition,{type:"tip",children:(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.a,{href:"https://smooth.dappnode.io/",children:"Smooth"})," identifies users through an ETH1 address, which serves as the withdrawal address for all your validators. If you have multiple validators associated with distinct withdrawal addresses, you will need to claim your rewards for each of them separately."]})})]})}function c(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},28453:(e,t,o)=>{o.d(t,{R:()=>d,x:()=>i});var s=o(96540);const a={},r=s.createContext(a);function d(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:d(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/d267b4aa.e0629e76.js b/assets/js/d267b4aa.e0629e76.js
new file mode 100644
index 000000000..6c5c8e53d
--- /dev/null
+++ b/assets/js/d267b4aa.e0629e76.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[6396],{69712:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"user/getting-started/next-steps","title":"Next Steps","description":"Now that your DAppNode is set up and ready to go, it\'s time to explore further configurations and features to get the most out of your experience. Here are some of the most common next steps:","source":"@site/docs/user/getting-started/next-steps.md","sourceDirName":"user/getting-started","slug":"/user/getting-started/next-steps","permalink":"/docs/user/getting-started/next-steps","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/getting-started/next-steps.md","tags":[],"version":"current","frontMatter":{"title":"Next Steps","llm_description":"Suggested actions after setup: configure VPN access, start staking, and enable Ethical Metrics."},"sidebar":"userSidebar","previous":{"title":"Setup","permalink":"/docs/user/getting-started/setup"},"next":{"title":"Overview","permalink":"/docs/user/access-your-dappnode/overview"}}');var o=s(74848),n=s(28453);const a={title:"Next Steps",llm_description:"Suggested actions after setup: configure VPN access, start staking, and enable Ethical Metrics."},i="Next Steps",c={},d=[];function u(e){const t={a:"a",h1:"h1",header:"header",p:"p",strong:"strong",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"next-steps",children:"Next Steps"})}),"\n",(0,o.jsx)(t.p,{children:"Now that your DAppNode is set up and ready to go, it's time to explore further configurations and features to get the most out of your experience. Here are some of the most common next steps:"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"/docs/user/access-your-dappnode/vpn/overview",children:(0,o.jsx)(t.strong,{children:"\ud83d\udd10 Configure VPN access"})}),": Using either Wireguard or OpenVPN, you will be able to connect to your Dappnode from wherever you are in the world. You will be able to access your dappnode outside of the range of the wifi, while on holidays or during your commute!"]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"/docs/user/staking/overview",children:(0,o.jsx)(t.strong,{children:"\ud83d\udcb0 Start Staking and Earning Rewards"})}),": You can start validating Proof-of-Stake networks like Ethereum, Gnosis Chain or LUKSO and earn rewards for securing the network."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"/docs/user/ethical-metrics/overview",children:(0,o.jsx)(t.strong,{children:"\ud83d\udd14 Configure Ethical Metrics"})}),": Ethical metrics is a privacy-focused monitoring tool for Dappnode. You will be able to receive alerts related to your Dappnode's performance and health."]})]})}function p(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},28453:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>i});var r=s(96540);const o={},n=r.createContext(o);function a(e){const t=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(n.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/d36fd63a.78677f96.js b/assets/js/d36fd63a.78677f96.js
new file mode 100644
index 000000000..6b6a304d6
--- /dev/null
+++ b/assets/js/d36fd63a.78677f96.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[6874],{21373:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>i,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"user/staking/lukso/solo","title":"LUKSO","description":"LUKSO is the next-gen blockchain designed with creative industries in mind. Imagine a digital realm where the spirit of Ethereum meets the world of fashion, art, and design. That\'s LUKSO for you!","source":"@site/docs/user/staking/lukso/solo.md","sourceDirName":"user/staking/lukso","slug":"/user/staking/lukso/solo","permalink":"/docs/user/staking/lukso/solo","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/lukso/solo.md","tags":[],"version":"current","frontMatter":{"title":"LUKSO","llm_description":"Complete guide to solo staking on LUKSO: install packages, generate keys, deposit 32 LYX."},"sidebar":"userSidebar","previous":{"title":"Consolidate Gnosis Validators","permalink":"/docs/user/staking/gnosis-chain/consolidation-gnosis"},"next":{"title":"Starknet Solo Staking","permalink":"/docs/user/staking/starknet/solo"}}');var o=n(74848),a=n(28453);const i={title:"LUKSO",llm_description:"Complete guide to solo staking on LUKSO: install packages, generate keys, deposit 32 LYX."},r="LUKSO",l={},d=[{value:"What Makes LUKSO Special?",id:"what-makes-lukso-special",level:2},{value:"Joining LUKSO as a validator",id:"joining-lukso-as-a-validator",level:2},{value:"1. Install the necessary LUKSO packages on Dappnode.",id:"1-install-the-necessary-lukso-packages-on-dappnode",level:2},{value:"2. Creating validator keys for LUKSO",id:"2-creating-validator-keys-for-lukso",level:2},{value:"3: Deposit LYX into the LUKSO deposit contract",id:"3-deposit-lyx-into-the-lukso-deposit-contract",level:2},{value:"3. Adding a Withdrawal Address to your LUKSO validator",id:"3-adding-a-withdrawal-address-to-your-lukso-validator",level:2}];function h(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"lukso",children:"LUKSO"})}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.strong,{children:"LUKSO"})," is the next-gen blockchain designed with creative industries in mind. Imagine a digital realm where the spirit of Ethereum meets the world of fashion, art, and design. That's LUKSO for you!"]}),"\n",(0,o.jsx)(s.h2,{id:"what-makes-lukso-special",children:"What Makes LUKSO Special?"}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.strong,{children:"Universal Profiles (UPs)"}),", supported by the ERC-725 standard, are LUKSO's magic trick. They act like digital passports in the LUKSO universe, ensuring that every creation and transaction carries the unique signature of its creator."]}),"\n",(0,o.jsx)(s.h2,{id:"joining-lukso-as-a-validator",children:"Joining LUKSO as a validator"}),"\n",(0,o.jsx)(s.p,{children:"LUKSO shares more than just roots with Ethereum. It uses the same trusted tools to run its network. Some of the main Ethereum clients are also compatible with LUKSO. For becoming a validator in LUKSO, you'll need to:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsx)(s.li,{children:"Install the necessary LUKSO packages on Dappnode."}),"\n",(0,o.jsx)(s.li,{children:"Create validator keys for LUKSO."}),"\n",(0,o.jsx)(s.li,{children:"Deposit LYX into the LUKSO Consensus Chain deposit contract."}),"\n"]}),"\n",(0,o.jsx)(s.h2,{id:"1-install-the-necessary-lukso-packages-on-dappnode",children:"1. Install the necessary LUKSO packages on Dappnode."}),"\n",(0,o.jsx)(s.p,{children:"Similar to Ethereum mainnet, Dappnode makes it very easy to set up your LUKSO validator. Here's what the Stakers UI looks like for LUKSO:"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.img,{alt:"Stakers",src:n(42200).A+"",width:"2846",height:"1512"})}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:"Execution Clients"})," (Choose one):","\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:"Lukso Geth"}),"\n",(0,o.jsx)(s.li,{children:"Lukso Erigon (Coming soon to Dappnode)"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:"Consensus Clients"})," (Choose one):","\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:"Prysm Lukso"}),"\n",(0,o.jsx)(s.li,{children:"Teku Lukso\n-Web3Signer LUKSO"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(s.admonition,{title:"Checkpoint Sync is your friend for syncing Consensus Clients",type:"tip",children:(0,o.jsx)(s.p,{children:'Execution clients take a long time to sync. Hence, once you start staking with one you will most likely stick with it. However, you can switch consensus clients at any time thanks to the magic of "checkpoint sync". Make sure to toggle the "use checksync" option when installing your consensus client, and you can change at any point from one to another with barely any downtime.'})}),"\n",(0,o.jsx)(s.p,{children:"After syncing your consensus client, the execution client starts its synchronization process. This can take a few hours, so patience is essential. For clarity or troubleshooting, consult your execution client's logs."}),"\n",(0,o.jsx)(s.h2,{id:"2-creating-validator-keys-for-lukso",children:"2. Creating validator keys for LUKSO"}),"\n",(0,o.jsx)(s.admonition,{type:"info",children:(0,o.jsxs)(s.p,{children:["This guide will use the ",(0,o.jsx)(s.a,{href:"https://github.com/lukso-network/tools-wagyu-key-gen/releases",children:"LUKSO Wagyu Keygen Tool"})," to generate your validator keys. This is a fork of the ",(0,o.jsx)(s.a,{href:"https://github.com/stake-house/wagyu-key-gen/releases",children:"Wagyu Keygen tool"})," for Ethereum mainnet."]})}),"\n",(0,o.jsxs)(s.admonition,{title:"What are all these keys?",type:"caution",children:[(0,o.jsxs)(s.p,{children:["\ud83d\udd12 ",(0,o.jsx)(s.strong,{children:"Validator keys"})," will be online (stored in your Dappnode) and signing the blocks of the LUKSO blockchain. You will create them from a ",(0,o.jsx)(s.strong,{children:"mnemonic phrase"}),", which is important to keep safe as it's the ",(0,o.jsx)(s.strong,{children:"only way"})," to regenerate these validator keys if you lose them."]}),(0,o.jsxs)(s.p,{children:["\ud83d\udee1\ufe0f The damage of getting your ",(0,o.jsx)(s.strong,{children:"mnemonic phrase"})," compromised has been reduced dramatically since withdrawals are already activated in LUKSO (Shapella upgrade), as you can create the keystores with a set withdrawal address and nobody can change that after, even if they get to your ",(0,o.jsx)(s.strong,{children:"mnemonic phrase"}),". Nevertheless, if you lose the keystore and the mnemonic, you will not be able to sign an exit message and you will be forced to validate forever."]}),(0,o.jsxs)(s.p,{children:["\ud83d\udd11 ",(0,o.jsx)(s.strong,{children:"Withdrawal address"})," this brings us to the withdrawal address, which is the address that will receive all the balance above 32 LYX while your validator is active, and all your balance above 32 LYX when you exit the validator set. You need to keep this address safe as it's where your LYX will go, and cannot be changed."]})]}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsxs)(s.p,{children:["Download the latest release of the LUKSO Wagyu Keygen Tool from ",(0,o.jsx)(s.a,{href:"https://github.com/lukso-network/tools-wagyu-key-gen/releases",children:"here"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(s.li,{children:["\n",(0,o.jsx)(s.p,{children:"Disconnect from the internet, so it will be harder to have any leaks on the information you use, and open the LUKSO Wagyu Keygen Tool. You will be given 2 options, either create a new mnemonic or import an existing mnemonic. The GUI is very user friendly and explains all steps along the way."}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.img,{alt:"LUKSO Wagyu - 1st screen",src:n(66586).A+"",width:"1896",height:"1606"})}),"\n",(0,o.jsx)(s.p,{children:"You will be shown your Mnemonic Phrase. Keep it safe, as it is used to recreate the validator keys! We recommend copying it in an encrypted volume or in paper stored in a safe place."}),"\n",(0,o.jsx)(s.p,{children:"To ensure that you have copied it somewhere, it will ask you to type it again."}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.img,{alt:"LUKSO Wagyu - 2nd screen",src:n(91249).A+"",width:"1896",height:"1606"})}),"\n",(0,o.jsx)(s.p,{children:"Choose 1) How many keys you want to create, 2) the password to protect the keys and 3) the Withdrawal Address where your Consensus Layer profits will be sent."}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.img,{alt:"LUKSO Wagyu - 3rd screen",src:n(89416).A+"",width:"1888",height:"1430"})}),"\n",(0,o.jsx)(s.p,{children:"Select a folder where to save the keys."}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.img,{alt:"LUKSO Wagyu - 4th screen",src:n(83281).A+"",width:"1886",height:"1424"})}),"\n",(0,o.jsx)(s.p,{children:"Wait for the keys to be generated."}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.img,{alt:"LUKSO Wagyu - 5th screen",src:n(78522).A+"",width:"1888",height:"1426"})}),"\n",(0,o.jsx)(s.p,{children:"And you are done! You will find your keys in the folder you selected."}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.img,{alt:"LUKSO Wagyu - 6th screen",src:n(26275).A+"",width:"1886",height:"1430"})}),"\n",(0,o.jsx)(s.p,{children:"You are now done with the key generation process, and your generated keys and deposit data are in the folder/directory chosen, and displayed at the top of the final page."}),"\n",(0,o.jsx)(s.admonition,{type:"tip",children:(0,o.jsxs)(s.p,{children:["\ud83d\udca1 *",(0,o.jsx)(s.code,{children:"Want to learn more about Ethereum keys and key generation?"}),"*\ud83d\udca1",(0,o.jsx)(s.a,{href:"https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/keys/#two-types-of-keys",children:"Learn more"})]})}),"\n",(0,o.jsx)(s.p,{children:"Now that you\u2019ve generated your deposit data and keystores, go ahead and upload your keystores to Web3Signer LUKSO, the package that you installed during step 1."}),"\n",(0,o.jsxs)(s.p,{children:["Return to the Dappnode UI and navigate to the Stakers > LUKSO menu. Your Web3Signer will have a link saying ",(0,o.jsx)(s.code,{children:"Upload Keystores"})," . If it doesn\u2019t, make sure that you have waited enough time since step 1 for all the packages to be installed (around 5 minutes) and refresh the page."]}),"\n",(0,o.jsxs)(s.p,{children:["Then click on the ",(0,o.jsx)(s.code,{children:"Import Keystores"})," button on the lower part of the Web3Signer LUKSO UI."]}),"\n",(0,o.jsx)(s.p,{children:"Here browse for the keystore file(s) you generated in the previous step and enter them along with the password you chose to secure your keystores."}),"\n",(0,o.jsx)(s.p,{children:"You are now ready to fund these validator accounts and start validating in LUKSO!"}),"\n",(0,o.jsx)(s.h2,{id:"3-deposit-lyx-into-the-lukso-deposit-contract",children:"3: Deposit LYX into the LUKSO deposit contract"}),"\n",(0,o.jsx)(s.p,{children:"The final step is to fund your validator with the 32 LYX necessary to register as a validator and start receiving validation work!"}),"\n",(0,o.jsx)(s.p,{children:"To do this, you will need to send 32 LYX to the LUKSO deposit contract. We will be using the official LUKSO launchpad for this."}),"\n",(0,o.jsxs)(s.p,{children:["Navigate to ",(0,o.jsx)(s.a,{href:"https://deposit.mainnet.lukso.network/en/",children:"the LUKSO launchpad"})]}),"\n",(0,o.jsx)(s.p,{children:"Read all the advisories... they contain important information that will help you understand the whole process!"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.img,{alt:"LUKSO Launchpad 1",src:n(99661).A+"",width:"2218",height:"1460"})}),"\n",(0,o.jsx)(s.p,{children:"Because we are using Dappnode and we take care of the infrastructure and the software installation, we can skip the next sections:"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.img,{alt:"LUKSO Launchpad 2",src:n(67894).A+"",width:"2878",height:"1480"})}),"\n",(0,o.jsx)(s.p,{children:'We continue until the "Upload Deposit Data" section.'}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.img,{alt:"LUKSO Launchpad 3",src:n(21695).A+"",width:"2602",height:"1502"})}),"\n",(0,o.jsxs)(s.p,{children:["Here we will upload the deposit data that we generated in the previous step. You can find it in the folder you chose when generating the keys. It will be a file called ",(0,o.jsx)(s.code,{children:"deposit_data-*.json"})]}),"\n",(0,o.jsxs)(s.p,{children:["The moment to do the deposit is here! Connect your wallet with the 32 LYX and ",(0,o.jsx)(s.a,{href:"https://chainlist.org/chain/42",children:"make sure"})," you're in the LUKSO network."]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.img,{alt:"LUKSO Launchpad 4",src:n(93664).A+"",width:"2602",height:"1502"})}),"\n",(0,o.jsx)(s.p,{children:"And follow the steps to send the 32 LYX to the deposit contract!"}),"\n",(0,o.jsx)(s.admonition,{type:"warning",children:(0,o.jsx)(s.p,{children:"Please review your deposit address! MAKE SURE YOU ARE SENDING THE 32 LYX TO THE RIGHT DEPOSIT ADDRESS!"})}),"\n",(0,o.jsxs)(s.p,{children:["After the deposit is done, you will be able to check the progress of your deposit by searching for your validator key in the ",(0,o.jsx)(s.a,{href:"https://explorer.consensus.mainnet.lukso.network/",children:"LUKSO Consensus Explorer"}),". You can get a direct link to this by clicking on the ",(0,o.jsx)(s.code,{children:"View in Beaconcha.in"})," button in the upper, right corner of the Dappnode Web3signer LUKSO UI, where you uploaded the keystores"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.img,{alt:"LUKSO Web3Signer",src:n(31883).A+"",width:"2822",height:"1398"})}),"\n",(0,o.jsx)(s.h2,{id:"3-adding-a-withdrawal-address-to-your-lukso-validator",children:"3. Adding a Withdrawal Address to your LUKSO validator"}),"\n",(0,o.jsx)(s.admonition,{type:"info",children:(0,o.jsxs)(s.p,{children:["This step is only necessary if your validator doesn't have a withdrawal address configured. In the ",(0,o.jsx)(s.a,{href:"https://explorer.consensus.mainnet.lukso.network/",children:"consensus explorer"}),", it shows as an address that starts with a ",(0,o.jsx)(s.code,{children:"0x00"})," and needs to be upgraded to a ",(0,o.jsx)(s.code,{children:"0x01"}),". If your validator already shows a ",(0,o.jsx)(s.code,{children:"0x01"})," address, you DON'T need to follow these steps."]})}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.strong,{children:"Step 1"}),": Open the ",(0,o.jsx)(s.a,{href:"https://github.com/lukso-network/tools-wagyu-key-gen/releases",children:"LUKSO Wagyu Keygen tool"}),' and click "Use existing recovery phrase", then you\'ll need to select "Generate your BLS to Execution change" option. Type in your seed phrase and follow the steps to generate a JSON file you\'ll need in step 3. Make sure you are offline during this step!']}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.strong,{children:"Step 2"}),": You'll have to locate your LUKSO consensus client's container IP. If you're using Prysm, you can find it ",(0,o.jsx)(s.a,{href:"http://my.dappnode/packages/my/prysm-lukso.dnp.dappnode.eth/network",children:"here"})," under the service box in the upper part, and if you're using Teku, you'll be able to find it ",(0,o.jsx)(s.a,{href:"http://my.dappnode/packages/my/teku-lukso.dnp.dappnode.eth/network",children:"here"})," in the same location."]}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.strong,{children:"Step 3"}),": Open a terminal window where you'll need to input:\n",(0,o.jsx)(s.code,{children:"curl -X 'POST' \\ '/eth/v1/beacon/pool/bls_to_execution_changes' \\ -H 'accept: */*' \\ -H 'Content-Type: application/json' \\ -d ''"}),"\nWhere ",(0,o.jsx)(s.code,{children:""})," is your LUKSO consensus client's container IP, and ",(0,o.jsx)(s.code,{children:""})," the JSON file you generated in step 1."]}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.strong,{children:"Step 4"}),": After successfully broadcasting the message, check your validator in the ",(0,o.jsx)(s.a,{href:"https://explorer.consensus.mainnet.lukso.network/",children:"LUKSO Consensus Explorer"}),", where you should now be able to see a ",(0,o.jsx)(s.code,{children:"0x01"})," withdrawal address."]}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.strong,{children:"Remember"}),": Embarking on the staking journey requires diligence. Always keep abreast of developments and make informed decisions."]})]})}function c(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},99661:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/lukso-launchpad1-feee8e797237cfdda9065a0778c87e82.png"},67894:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/lukso-launchpad2-a06471841b30d5377c567417d618aa98.png"},21695:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/lukso-launchpad3-bca6aef08176b4d71d978494ad6c947e.png"},93664:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/lukso-launchpad4-fda4750d49c92053aff1fe0e3a0a02f2.png"},42200:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/lukso-staking-screenshot-605e7ed6329f5a73b11a6b8cc4015c9c.png"},66586:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/lukso-wagyu1-e38f326b1d87e8192b3cfe2193d5c8ed.png"},91249:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/lukso-wagyu2-118e3f6a51c4c39294effac0a4a6afe3.png"},31883:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/lukso-web3signer-31c35566a88612cb0658f7eade5b358a.png"},89416:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/wagyu4-0673a83463eb844993339ecfdcc59b41.png"},83281:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/wagyu5-644261c1588e13ba1177d70aef9ecf19.png"},78522:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/wagyu6-d5538d2bbd5a01f47d94c6c5b29b3abf.png"},26275:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/wagyu7-8c346a2c9519b98a530d1005a69247f2.png"},28453:(e,s,n)=>{n.d(s,{R:()=>i,x:()=>r});var t=n(96540);const o={},a=t.createContext(o);function i(e){const s=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),t.createElement(a.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/d47e1b16.2e55b078.js b/assets/js/d47e1b16.2e55b078.js
new file mode 100644
index 000000000..0a1479ebe
--- /dev/null
+++ b/assets/js/d47e1b16.2e55b078.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5027],{2461:(n,e,o)=>{o.r(e),o.d(e,{assets:()=>s,contentTitle:()=>c,default:()=>l,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"user/packages/bitcoin","title":"Bitcoin","description":"Exploring Bitcoin: The Pioneer of Cryptocurrency","source":"@site/docs/user/packages/bitcoin.md","sourceDirName":"user/packages","slug":"/user/packages/bitcoin","permalink":"/docs/user/packages/bitcoin","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/packages/bitcoin.md","tags":[],"version":"current","frontMatter":{"title":"Bitcoin","llm_description":"Running a Bitcoin node on Dappnode to validate transactions and support network decentralization."},"sidebar":"userSidebar","previous":{"title":"DMS","permalink":"/docs/user/packages/dms"},"next":{"title":"Eth Classic","permalink":"/docs/user/packages/ethclassic"}}');var i=o(74848),a=o(28453);const r={title:"Bitcoin",llm_description:"Running a Bitcoin node on Dappnode to validate transactions and support network decentralization."},c="Bitcoin",s={},d=[{value:"Exploring Bitcoin: The Pioneer of Cryptocurrency",id:"exploring-bitcoin-the-pioneer-of-cryptocurrency",level:2},{value:"Running a Bitcoin Node on Dappnode and Supporting the Network",id:"running-a-bitcoin-node-on-dappnode-and-supporting-the-network",level:2},{value:"Bitcoin\u2019s Role in Decentralization: A Decade of Innovation",id:"bitcoins-role-in-decentralization-a-decade-of-innovation",level:2}];function p(n){const e={h1:"h1",h2:"h2",header:"header",p:"p",...(0,a.R)(),...n.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(e.header,{children:(0,i.jsx)(e.h1,{id:"bitcoin",children:"Bitcoin"})}),"\n",(0,i.jsx)(e.h2,{id:"exploring-bitcoin-the-pioneer-of-cryptocurrency",children:"Exploring Bitcoin: The Pioneer of Cryptocurrency"}),"\n",(0,i.jsx)(e.p,{children:"Bitcoin, the first and most well-known cryptocurrency, is a digital asset that introduced the concept of blockchain technology to the world. Created by an anonymous person or group under the pseudonym Satoshi Nakamoto, Bitcoin revolutionized the financial landscape by offering a decentralized and borderless form of value transfer."}),"\n",(0,i.jsx)(e.h2,{id:"running-a-bitcoin-node-on-dappnode-and-supporting-the-network",children:"Running a Bitcoin Node on Dappnode and Supporting the Network"}),"\n",(0,i.jsx)(e.p,{children:"Running a Bitcoin node on Dappnode allows you to actively participate in the Bitcoin network\u2019s operations. As a node operator, you help validate transactions, maintain a copy of the blockchain, and contribute to the network\u2019s overall security and resilience. Operating a Bitcoin node not only benefits the network by enhancing its decentralization but also provides you with an opportunity to engage with the technology that powers the cryptocurrency revolution."}),"\n",(0,i.jsx)(e.h2,{id:"bitcoins-role-in-decentralization-a-decade-of-innovation",children:"Bitcoin\u2019s Role in Decentralization: A Decade of Innovation"}),"\n",(0,i.jsx)(e.p,{children:"Bitcoin\u2019s journey over the past decade has been marked by remarkable advancements and widespread adoption. As the original cryptocurrency, Bitcoin has demonstrated the potential of blockchain technology to disrupt traditional financial systems. Its decentralized nature, limited supply, and transparent ledger have positioned it as a store of value and a medium of exchange. By running a Bitcoin node on Dappnode, you contribute to the continued success and decentralization of the Bitcoin network."})]})}function l(n={}){const{wrapper:e}={...(0,a.R)(),...n.components};return e?(0,i.jsx)(e,{...n,children:(0,i.jsx)(p,{...n})}):p(n)}},28453:(n,e,o)=>{o.d(e,{R:()=>r,x:()=>c});var t=o(96540);const i={},a=t.createContext(i);function r(n){const e=t.useContext(a);return t.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function c(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:r(n.components),t.createElement(a.Provider,{value:e},n.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/d508510a.b1b4228b.js b/assets/js/d508510a.b1b4228b.js
new file mode 100644
index 000000000..51ac4e808
--- /dev/null
+++ b/assets/js/d508510a.b1b4228b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[6853],{54738:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>a,contentTitle:()=>d,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>u});const i=JSON.parse('{"id":"user/videos-and-tutorials/overview","title":"Videos and Tutorials","description":"Welcome to the Videos and Tutorials section! Here, you\'ll find a curated list of videos and written tutorials designed to help you get the most out of Dappnode. Whether you\'re a beginner or an advanced user, there\'s something here for everyone.","source":"@site/docs/user/videos-and-tutorials/overview.md","sourceDirName":"user/videos-and-tutorials","slug":"/user/videos-and-tutorials/overview","permalink":"/docs/user/videos-and-tutorials/overview","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/videos-and-tutorials/overview.md","tags":[],"version":"current","frontMatter":{"title":"Videos and Tutorials","llm_description":"Overview of Dappnode video tutorials and guides for beginners and advanced users."}}');var t=n(74848),s=n(28453);const r={title:"Videos and Tutorials",llm_description:"Overview of Dappnode video tutorials and guides for beginners and advanced users."},d="Videos and Tutorials",a={},u=[{value:"Tutorial docs",id:"tutorial-docs",level:2},{value:"Dappnode Driving School",id:"dappnode-driving-school",level:2},{value:"I. Initial Dappnode Setup",id:"i-initial-dappnode-setup",level:3},{value:"II. Configuring your Dappnode",id:"ii-configuring-your-dappnode",level:3},{value:"III. Dappnode Troubleshooting",id:"iii-dappnode-troubleshooting",level:3}];function p(e){const o={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"videos-and-tutorials",children:"Videos and Tutorials"})}),"\n",(0,t.jsx)(o.p,{children:"Welcome to the Videos and Tutorials section! Here, you'll find a curated list of videos and written tutorials designed to help you get the most out of Dappnode. Whether you're a beginner or an advanced user, there's something here for everyone."}),"\n",(0,t.jsx)(o.h2,{id:"tutorial-docs",children:"Tutorial docs"}),"\n",(0,t.jsx)(o.p,{children:"In this section, you will find comprehensive written guides that provide step-by-step instructions on various topics related to Dappnode. These documents are a valuable resource for anyone looking to deepen their understanding and enhance their Dappnode experience."}),"\n",(0,t.jsxs)(o.p,{children:["\ud83d\udd17 ",(0,t.jsx)(o.a,{href:"/docs/user/videos-and-tutorials/guides/connect-node",children:"How to connect a wallet to my node"})]}),"\n",(0,t.jsx)(o.h2,{id:"dappnode-driving-school",children:"Dappnode Driving School"}),"\n",(0,t.jsxs)(o.p,{children:["The Dappnode Driving School is a set of video tutorials that will help you understand the basics about setting up your Dappnode for the first time. These videos are made for newcommers and non-technical users, but if you have questions don't hesitate to drop by our ",(0,t.jsx)(o.a,{href:"https://discord.gg/dappnode",children:"Dappnode Discord Community"}),", where the community will be happy to provide as much help as you need."]}),"\n",(0,t.jsx)(o.h3,{id:"i-initial-dappnode-setup",children:"I. Initial Dappnode Setup"}),"\n",(0,t.jsxs)(o.p,{children:["\ud83d\udda5\ufe0f ",(0,t.jsx)(o.a,{href:"https://youtu.be/lh5hADm1Iuk",children:"Booting from the Dappnode ISO"})]}),"\n",(0,t.jsxs)(o.p,{children:["\ud83c\udf10 ",(0,t.jsx)(o.a,{href:"https://youtu.be/Z1uDv_J7wlg",children:"Accessing the Dappnode User Interface (UI)/Dashboard"})]}),"\n",(0,t.jsxs)(o.p,{children:["\ud83d\udd12 ",(0,t.jsx)(o.a,{href:"https://youtu.be/TZUK39yiZ30",children:"Setting up Dappnode Security"})]}),"\n",(0,t.jsxs)(o.p,{children:["\ud83d\udd17 ",(0,t.jsx)(o.a,{href:"https://youtu.be/qB0sMaNpXpU",children:"Configuring your Dappnode VPN"})]}),"\n",(0,t.jsxs)(o.p,{children:["\ud83d\udd04 ",(0,t.jsx)(o.a,{href:"https://youtu.be/zJowD3X-MUc",children:"Syncing your clients/An overview on node running"})]}),"\n",(0,t.jsxs)(o.p,{children:["\ud83d\udcbe ",(0,t.jsx)(o.a,{href:"https://youtu.be/1GW-GbGKs7o",children:"Understanding your Dappnode's Hardware"})]}),"\n",(0,t.jsx)(o.h3,{id:"ii-configuring-your-dappnode",children:"II. Configuring your Dappnode"}),"\n",(0,t.jsx)(o.p,{children:"\ud83d\udee0\ufe0f Coming soon..."}),"\n",(0,t.jsx)(o.h3,{id:"iii-dappnode-troubleshooting",children:"III. Dappnode Troubleshooting"}),"\n",(0,t.jsx)(o.p,{children:"\ud83d\udd27 Coming soon..."})]})}function l(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}},28453:(e,o,n)=>{n.d(o,{R:()=>r,x:()=>d});var i=n(96540);const t={},s=i.createContext(t);function r(e){const o=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function d(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(s.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/d61c7726.d867bc2e.js b/assets/js/d61c7726.d867bc2e.js
new file mode 100644
index 000000000..a71fac152
--- /dev/null
+++ b/assets/js/d61c7726.d867bc2e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[2767],{46763:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"user/install/arm","title":"Install - ARM","description":"Hardware Recommendations","source":"@site/docs/user/install/arm.md","sourceDirName":"user/install","slug":"/user/install/arm","permalink":"/docs/user/install/arm","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/install/arm.md","tags":[],"version":"current","frontMatter":{"title":"Install - ARM","llm_description":"ARM installation guide using script method, plus instructions to add external SSD storage."},"sidebar":"userSidebar","previous":{"title":"Script","permalink":"/docs/user/install/script"},"next":{"title":"Dappnode commands","permalink":"/docs/user/install/dappnode-commands"}}');var d=t(74848),i=t(28453);const r={title:"Install - ARM",llm_description:"ARM installation guide using script method, plus instructions to add external SSD storage."},a="Install - ARM",l={},o=[{value:"Hardware Recommendations",id:"hardware-recommendations",level:2},{value:"Install Dappnode via Script",id:"install-dappnode-via-script",level:2},{value:"Add an external SSD",id:"add-an-external-ssd",level:2}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.header,{children:(0,d.jsx)(n.h1,{id:"install---arm",children:"Install - ARM"})}),"\n",(0,d.jsx)(n.h2,{id:"hardware-recommendations",children:"Hardware Recommendations"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsx)(n.li,{children:"8 Gb RAM memory"}),"\n",(0,d.jsx)(n.li,{children:"Screen and keyboard (Only for the first installation)"}),"\n",(0,d.jsx)(n.li,{children:"Wired connection to the Dappnode"}),"\n"]}),"\n",(0,d.jsx)(n.h2,{id:"install-dappnode-via-script",children:"Install Dappnode via Script"}),"\n",(0,d.jsxs)(n.p,{children:["Follow the instructions you can find in ",(0,d.jsx)(n.a,{href:"/docs/user/install/script",children:"Script Installation"})]}),"\n",(0,d.jsx)(n.h2,{id:"add-an-external-ssd",children:"Add an external SSD"}),"\n",(0,d.jsx)(n.p,{children:"In case you have installed Dappnode in a Raspberry using a SD card and you want to add an external SSD you should mount docker data in it. To do this, follow the next steps:"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:["Stop Docker service\n",(0,d.jsx)(n.code,{children:"systemctl stop docker"})]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:["Create a new mountpoint for docker data. As an example:\n",(0,d.jsx)(n.code,{children:"mkdir /data"})]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:["Add your partition on the new device to ",(0,d.jsx)(n.code,{children:"/etc/fstab"}),". You can identify its UUID using the ",(0,d.jsx)(n.code,{children:"blkid"})," tool. Make sure your device is properly partitioned first. Your line in ",(0,d.jsx)(n.code,{children:"/etc/fstab"})," should look like this:\n",(0,d.jsx)(n.code,{children:"UUID=b311b983-bda6-4e9f-835c-266d40d64f07 /data/ ext4 defaults 0 0"})]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:["Mount your SSD drive\n",(0,d.jsx)(n.code,{children:"mount /data"})]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:["Move docker data to the mountpoint\n",(0,d.jsx)(n.code,{children:"mv /var/lib/docker/* /data/"})]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:["Edit Docker settings to use the alternative location. Edit ",(0,d.jsx)(n.code,{children:"/etc/docker/daemon.json"})," as follows:"]}),"\n"]}),"\n"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "data-root": "/data"\n}\n'})}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsx)(n.li,{children:"Restart docker"}),"\n"]}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.code,{children:"systemctl start docker"})})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(c,{...e})}):c(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var s=t(96540);const d={},i=s.createContext(d);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/d6c02fb6.23833280.js b/assets/js/d6c02fb6.23833280.js
new file mode 100644
index 000000000..f1fbc1f48
--- /dev/null
+++ b/assets/js/d6c02fb6.23833280.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[372],{77194:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>r,default:()=>c,frontMatter:()=>a,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"user/staking/ethereum/solo/mainnet","title":"Ethereum mainnet","description":"Ethereum stands as a titan in the realm of smart contract platforms. Its monumental shift from Proof of Work (PoW) to Proof of Stake (PoS) has opened up opportunities for individuals to participate in Ethereum\'s block production by staking ETH.","source":"@site/docs/user/staking/ethereum/solo/mainnet.md","sourceDirName":"user/staking/ethereum/solo","slug":"/user/staking/ethereum/solo/mainnet","permalink":"/docs/user/staking/ethereum/solo/mainnet","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/ethereum/solo/mainnet.md","tags":[],"version":"current","frontMatter":{"title":"Ethereum mainnet","llm_description":"Complete guide to solo staking on Ethereum mainnet: setup, key generation, and deposits."},"sidebar":"userSidebar","previous":{"title":"Switch staking clients","permalink":"/docs/user/staking/switch-clients"},"next":{"title":"Testnet","permalink":"/docs/user/staking/ethereum/solo/holesky"}}');var i=n(74848),o=n(28453);const a={title:"Ethereum mainnet",llm_description:"Complete guide to solo staking on Ethereum mainnet: setup, key generation, and deposits."},r="Ethereum mainnet",h={},d=[{value:"1. Install the necessary packages on Dappnode",id:"1-install-the-necessary-packages-on-dappnode",level:2},{value:"2. Creating the keys for your validator",id:"2-creating-the-keys-for-your-validator",level:2},{value:"3: Deposit ETH into the Ethereum deposit contract",id:"3-deposit-eth-into-the-ethereum-deposit-contract",level:2},{value:"Additional Opportunities: MEV Boost",id:"additional-opportunities-mev-boost",level:2},{value:"Withdrawing my ETH",id:"withdrawing-my-eth",level:2},{value:"Opening your Web3Signer UI.",id:"opening-your-web3signer-ui",level:3}];function l(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"ethereum-mainnet",children:"Ethereum mainnet"})}),"\n",(0,i.jsx)(t.p,{children:"Ethereum stands as a titan in the realm of smart contract platforms. Its monumental shift from Proof of Work (PoW) to Proof of Stake (PoS) has opened up opportunities for individuals to participate in Ethereum's block production by staking ETH."}),"\n",(0,i.jsxs)(t.p,{children:["Dappnode simplifies your journey to becoming a ",(0,i.jsx)(t.strong,{children:"Solo Staker"})," and start earning. You will need to do 3 main tasks, broken down below:"]}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsx)(t.li,{children:"Install the necessary packages on Dappnode"}),"\n",(0,i.jsx)(t.li,{children:"Create validator keys"}),"\n",(0,i.jsx)(t.li,{children:"Deposit ETH into the Ethereum deposit contract"}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"1-install-the-necessary-packages-on-dappnode",children:"1. Install the necessary packages on Dappnode"}),"\n",(0,i.jsx)(t.p,{children:"Dappnode makes it super simple to install everything you need to run a validator. Via the Stakers UI you will be able to install the following packages:"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Stakers",src:n(7115).A+"",width:"2072",height:"1618"})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Execution Client"})," (Choose one): Geth, Nethermind, Erigon, or Besu."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Consensus Client"})," (Choose one): Prysm, Lighthouse, Teku, Nimbus, or Lodestar."]}),"\n"]}),"\n",(0,i.jsx)(t.admonition,{title:"Choosing the right Execution Client",type:"caution",children:(0,i.jsx)(t.p,{children:"Erigon is an execution client that focuses on retrieving and storing more data than the default options of other clients. This is useful to run historical queries or to use apps that require tracing/archive nodes like Otterscan or Trueblocks. Make sure you have at least 3 TB free in your hard drive to run Erigon."})}),"\n",(0,i.jsx)(t.admonition,{title:"Checkpoint Sync is your friend for syncing Consensus Clients",type:"tip",children:(0,i.jsx)(t.p,{children:'Execution clients take a long time to sync. Hence, once you start staking with one you will most likely stick with it. However, you can switch consensus clients at any time thanks to the magic of "checkpoint sync". Make sure to toggle the "use checksync" option when installing your consensus client, and you can change at any point from one to another with barely any downtime.'})}),"\n",(0,i.jsx)(t.p,{children:"After syncing your consensus client, the execution client starts its synchronization process. This can take a few hours, so patience is essential. For clarity or troubleshooting, consult your execution client's logs."}),"\n",(0,i.jsx)(t.admonition,{title:"MEV BOOST",type:"info",children:(0,i.jsx)(t.p,{children:'MEV Boost is an extra piece of software not belonging to the core Ethereum stack. It allows your validator to receive blocks that have been created by special "block builders" that try to extract MEV from the network, and receive extra rewards for including them in the chain when it\'s your turn to propose a block. However, it is very new technology and can be risky to use.'})}),"\n",(0,i.jsx)(t.h2,{id:"2-creating-the-keys-for-your-validator",children:"2. Creating the keys for your validator"}),"\n",(0,i.jsx)(t.admonition,{type:"info",children:(0,i.jsx)(t.p,{children:"This guide will use the Wagyu keygen tool to generate your validator keys. There are other options like a command-line tool by the Ethereum Foundation, but they are harder to use."})}),"\n",(0,i.jsxs)(t.admonition,{title:"What are all these keys?",type:"caution",children:[(0,i.jsxs)(t.p,{children:["\ud83d\udd12 ",(0,i.jsx)(t.strong,{children:"Validator keys"})," will be online (stored in your Dappnode) and signing the blocks of the chain. You will create them from a ",(0,i.jsx)(t.strong,{children:"mnemonic phrase"}),", which is important to keep safe as it's the only way to regenerate these validator keys if you lose them."]}),(0,i.jsxs)(t.p,{children:["\ud83d\udee1\ufe0f The damage of getting your ",(0,i.jsx)(t.strong,{children:"mnemonic phrase"})," compromised has been reduced dramatically since withdrawals have been activated, as you can create the keystores with a set withdrawal address and nobody can change that after, even if they get to your ",(0,i.jsx)(t.strong,{children:"mnemonic phrase"}),". Nevertheless, if you lose the keystore and the mnemonic, you will not be able to sign an exit message and you will be forced to validate forever."]}),(0,i.jsxs)(t.p,{children:["\ud83d\udd11 ",(0,i.jsx)(t.strong,{children:"Withdrawal address"})," this brings us to the withdrawal address, which is the address that will receive all the balance above 32 ETH while your validator is active, and all your balance above 0 ETH when you exit the validator set. You need to keep this address safe as it's where your ETH will go, and cannot be changed."]})]}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Download the latest release of the Wagyu Key Gen from ",(0,i.jsx)(t.a,{href:"https://wagyu.gg",children:"here"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Disconnect from the internet, so it will be harder to have any leaks on the information you use, and open the program. You will be given 2 options, either create a new mnemonic or import an existing mnemonic, and you will be able to choose the network for which you are generating the keys. The GUI is very user friendly and explains all steps along the way."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.img,{alt:"Wagyu - 1st screen",src:n(2293).A+"",width:"1882",height:"1422"}),"\n",(0,i.jsx)(t.img,{alt:"Wagyu - 2nd screen",src:n(16542).A+"",width:"1886",height:"1426"})]}),"\n",(0,i.jsx)(t.p,{children:"You will be shown your Mnemonic Phrase. Keep it safe, as it is used to recreate the validator keys! We recommend copying it in an encrypted volume or in paper stored in a safe place."}),"\n",(0,i.jsx)(t.p,{children:"To ensure that you have copied it somewhere, it will ask you to type it again."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Wagyu - 3rd screen",src:n(69031).A+"",width:"1882",height:"1434"})}),"\n",(0,i.jsx)(t.p,{children:"Choose 1) How many keys you want to create, 2) the password to protect the keys and 3) the Withdrawal Address where your Consensus Layer profits will be sent."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Wagyu - 4th screen",src:n(89416).A+"",width:"1888",height:"1430"})}),"\n",(0,i.jsx)(t.p,{children:"Select a folder where to save the keys"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Wagyu - 5th screen",src:n(83281).A+"",width:"1886",height:"1424"})}),"\n",(0,i.jsx)(t.p,{children:"Wait for the keys to be generated"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Wagyu - 6th screen",src:n(78522).A+"",width:"1888",height:"1426"})}),"\n",(0,i.jsx)(t.p,{children:"And you are done! You will find your keys in the folder you selected."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Wagyu - 7th screen",src:n(26275).A+"",width:"1886",height:"1430"})}),"\n",(0,i.jsx)(t.p,{children:"You are now done with the key generation process, and your generated keys and deposit data are in the folder/directory chosen, and displayed at the top of the final page."}),"\n",(0,i.jsx)(t.admonition,{type:"tip",children:(0,i.jsxs)(t.p,{children:["\ud83d\udca1 *",(0,i.jsx)(t.code,{children:"Want to learn more about Ethereum keys and key generation?"}),"*\ud83d\udca1",(0,i.jsx)(t.a,{href:"https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/keys/#two-types-of-keys",children:"Learn more"})]})}),"\n",(0,i.jsx)(t.p,{children:"Now that you\u2019ve generated your deposit data and keystores, go ahead and upload your keystores to the Web3signer that you installed during step 1."}),"\n",(0,i.jsxs)(t.p,{children:["Return to the Dappnode UI and navigate to the Stakers > Ethereum menu. Your Web3Signer will have a link saying ",(0,i.jsx)(t.code,{children:"Upload Keystores"})," . If it doesn\u2019t, make sure that you have waited enough time since step 1 for all the packages to be installed (around 5 minutes) and refresh the page."]}),"\n",(0,i.jsxs)(t.p,{children:["Then click on the ",(0,i.jsx)(t.code,{children:"Import Keystores"})," button on the lower part of the Web3Signer UI."]}),"\n",(0,i.jsx)(t.p,{children:"Here browse for the keystore file(s) you generated in the previous step and enter them along with the password you chose to secure your keystores."}),"\n",(0,i.jsx)(t.p,{children:"You are now ready to fund these validator accounts and start validating!"}),"\n",(0,i.jsx)(t.h2,{id:"3-deposit-eth-into-the-ethereum-deposit-contract",children:"3: Deposit ETH into the Ethereum deposit contract"}),"\n",(0,i.jsx)(t.p,{children:"The final step is to fund your validator with the 32 ETH necessary to register as a validator and start receiving validation work!"}),"\n",(0,i.jsx)(t.p,{children:"To do this, you will need to send 32 ETH to the Ethereum deposit contract. We will be using the official Ethereum launchpad for this."}),"\n",(0,i.jsxs)(t.p,{children:["Navigate to ",(0,i.jsx)(t.a,{href:"https://launchpad.ethereum.org/",children:"the launchpad"})]}),"\n",(0,i.jsx)(t.p,{children:"Read all the advisories... they contain important information that will help you understand the whole process!"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Launchpad 1",src:n(27254).A+"",width:"2154",height:"1704"})}),"\n",(0,i.jsx)(t.p,{children:"Because we are using Dappnode and we take care of the infrastructure and the software installation, we can skip the next sections:"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Launchpad 2",src:n(41229).A+"",width:"2226",height:"1504"})}),"\n",(0,i.jsx)(t.p,{children:'We continue until the "Upload Deposit Data" section.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Launchpad 3",src:n(87332).A+"",width:"2996",height:"1714"})}),"\n",(0,i.jsxs)(t.p,{children:["Here we will upload the deposit data that we generated in the previous step. You can find it in the folder you chose when generating the keys. It will be a file called ",(0,i.jsx)(t.code,{children:"deposit_data-*.json"})]}),"\n",(0,i.jsx)(t.p,{children:"The moment to do the deposit is here! Connect your wallet (yes, the one that has the 32 ETH!)."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Launchpad 4",src:n(51195).A+"",width:"2206",height:"1290"})}),"\n",(0,i.jsx)(t.p,{children:"And follow the steps to send the 32 ETH to the deposit contract!"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Launchpad 5",src:n(36370).A+"",width:"2168",height:"1310"})}),"\n",(0,i.jsx)(t.admonition,{type:"warning",children:(0,i.jsx)(t.p,{children:"You will be prompted to review the deposit address in the next step. PLEASE DO SO! MAKE SURE YOU ARE SENDING THE 32 ETH TO THE RIGHT DEPOSIT ADDRESS!"})}),"\n",(0,i.jsxs)(t.p,{children:["After the deposit is gone, you will be able to check the progress of your deposit by searching for your validator key in the ",(0,i.jsx)(t.a,{href:"https://beaconcha.in/",children:"beaconcha.in"})," explorer. You can get a direct link to this by clicking on the ",(0,i.jsx)(t.code,{children:"View in Beaconcha.in"})," button in the Dappnode Web3signer UI, where you uploaded the keystores."]}),"\n",(0,i.jsx)(t.p,{children:"[PENDING SCREENSHOT]"}),"\n",(0,i.jsx)(t.h2,{id:"additional-opportunities-mev-boost",children:"Additional Opportunities: MEV Boost"}),"\n",(0,i.jsx)(t.p,{children:"Considering MEV Boost? It allows your validator node to propose different relays when it's its turn. However, before diving in, a thorough understanding of the relays and any local regulations is paramount."}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Remember"}),": Embarking on the staking journey requires diligence. Always keep abreast of developments and make informed decisions."]}),"\n",(0,i.jsx)(t.h2,{id:"withdrawing-my-eth",children:"Withdrawing my ETH"}),"\n",(0,i.jsx)(t.p,{children:"Once you want to finish your staking journey, you will need to withdraw your ETH from the Beacon Chain. This process consists of exiting the validator from the Dappnode UI."}),"\n",(0,i.jsx)(t.admonition,{title:"Ethereum withdrawals are state changes in the execution layer",type:"info",children:(0,i.jsxs)(t.p,{children:["This means that once you reach the end of the Beacon Chain's exit queue, your 32 ETH will show up in your withdrawal address as a state change in the blockchain, and not as a deposit. You can find more info ",(0,i.jsx)(t.a,{href:"https://ethereum.org/en/staking/withdrawals/#exiting-staking-entirely",children:"here"}),"."]})}),"\n",(0,i.jsx)(t.h3,{id:"opening-your-web3signer-ui",children:"Opening your Web3Signer UI."}),"\n",(0,i.jsxs)(t.p,{children:["Navigate to the Stakers > Ethereum menu and click on the ",(0,i.jsx)(t.code,{children:"Upload Keystores"})," button on the Web3Signer card.\nOnce you are in the Web3Signer UI, select the validators you want to exit and click on the ",(0,i.jsx)(t.code,{children:"Exit Validator"})," button on the top right part of the UI."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Ethereum Withdrawals",src:n(37318).A+"",width:"1879",height:"562"})}),"\n",(0,i.jsxs)(t.p,{children:['Follow the instructions and type "I want to exit", followed by ',(0,i.jsx)(t.code,{children:"Exit"}),"."]}),"\n",(0,i.jsx)(t.p,{children:"Now the message to exit will be broadcasted to the network."}),"\n",(0,i.jsx)(t.admonition,{title:"Withdrawal queue",type:"caution",children:(0,i.jsxs)(t.p,{children:["Your validator will not exit immediately. It will be queued to exit and you can track when it's due in the ",(0,i.jsx)(t.a,{href:"https://beaconcha.in/",children:"Beacon Chain Explorer"}),". Please be patient as the Beacon Chain exit queue can get long and wait times might take up to several weeks."]})}),"\n",(0,i.jsx)(t.p,{children:"Voil\xe0! Your ETH will appear on your withdrawal address!"})]})}function c(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},37318:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/ethereum-exit-validator-cbe5bd9d4de4ba3ec4c69d377062fe52.png"},7115:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/ethereum-staking-screenshot-d41fdd2a5a44f0e9e7f4094c41ea9e2d.png"},27254:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/launchpad1-a753b28ed2a802d489461a7c94e0c961.png"},41229:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/launchpad2-3e282073fa021d7180e64c524e0921b9.png"},87332:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/launchpad3-9bd7c8a0bc7f1c0f0d4e3112ae2eb9ce.png"},51195:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/launchpad4-94bbe5bce7aade2be65583c0ddae47a6.png"},36370:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/launchpad5-961c3c6447f15d0a12e87a8eb7c7d732.png"},2293:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/wagyu1-e570b05560adf66a1fe0d5c75961cf84.png"},16542:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/wagyu2-56f62ea0d459fc876917956e12a5310c.png"},69031:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/wagyu3-c924247c89934873bbccd3d4867afdce.png"},89416:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/wagyu4-0673a83463eb844993339ecfdcc59b41.png"},83281:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/wagyu5-644261c1588e13ba1177d70aef9ecf19.png"},78522:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/wagyu6-d5538d2bbd5a01f47d94c6c5b29b3abf.png"},26275:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/wagyu7-8c346a2c9519b98a530d1005a69247f2.png"},28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>r});var s=n(96540);const i={},o=s.createContext(i);function a(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/d912498a.89db7413.js b/assets/js/d912498a.89db7413.js
new file mode 100644
index 000000000..cb3fa0855
--- /dev/null
+++ b/assets/js/d912498a.89db7413.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8627],{32361:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"user/repository/ethereum","title":"Ethereum repository","description":"Dappnode uses smart contracts to distribute Dappnode\'s packages available in the Dappstore and the Stakers tab. These smart contracts are deployed on the Ethereum blockchain, and the execution client interacts with them to get the list of available packages and download them.","source":"@site/docs/user/repository/ethereum.md","sourceDirName":"user/repository","slug":"/user/repository/ethereum","permalink":"/docs/user/repository/ethereum","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/repository/ethereum.md","tags":[],"version":"current","frontMatter":{"title":"Ethereum repository","llm_description":"How Dappnode connects to Ethereum nodes for package distribution via smart contracts."},"sidebar":"userSidebar","previous":{"title":"Swarm","permalink":"/docs/user/packages/swarm"},"next":{"title":"IPFS","permalink":"/docs/user/repository/ipfs"}}');var r=n(74848),s=n(28453);const a={title:"Ethereum repository",llm_description:"How Dappnode connects to Ethereum nodes for package distribution via smart contracts."},i="Ethereum repository",d={},c=[{value:"How the connection works",id:"how-the-connection-works",level:2},{value:"Overwrite Dappnode's remote Ethereum node",id:"overwrite-dappnodes-remote-ethereum-node",level:2}];function p(e){const t={a:"a",br:"br",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"ethereum-repository",children:"Ethereum repository"})}),"\n",(0,r.jsx)(t.p,{children:"Dappnode uses smart contracts to distribute Dappnode's packages available in the Dappstore and the Stakers tab. These smart contracts are deployed on the Ethereum blockchain, and the execution client interacts with them to get the list of available packages and download them."}),"\n",(0,r.jsx)(t.p,{children:"Your Dappnode will therefore need access to an Ethereum node in order to read the smart contracts and fetch the packages."}),"\n",(0,r.jsx)(t.h2,{id:"how-the-connection-works",children:"How the connection works"}),"\n",(0,r.jsxs)(t.p,{children:["Dappnode automatically manages the connection between ",(0,r.jsx)(t.strong,{children:"local"})," and ",(0,r.jsx)(t.strong,{children:"remote"})," Ethereum nodes:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["If you have a ",(0,r.jsx)(t.strong,{children:"healthy Ethereum node"})," running locally, Dappnode will use it."]}),"\n",(0,r.jsxs)(t.li,{children:["If your local node is ",(0,r.jsx)(t.strong,{children:"syncing, unavailable, or unhealthy"}),", Dappnode will automatically fall back to a ",(0,r.jsx)(t.strong,{children:"remote node"})," to ensure uninterrupted access to the packages."]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"This means you no longer need to manually toggle between local and remote. Dappnode takes care of it for you."}),"\n",(0,r.jsx)(t.h2,{id:"overwrite-dappnodes-remote-ethereum-node",children:"Overwrite Dappnode's remote Ethereum node"}),"\n",(0,r.jsxs)(t.p,{children:["When remote mode is used, by default Dappnode connects to the ",(0,r.jsx)(t.strong,{children:"official Dappnode Ethereum node"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["If desired, you can ",(0,r.jsx)(t.strong,{children:"overwrite the RPC endpoint"})," by configuring it in the Dappmanager\u2019s package settings:",(0,r.jsx)(t.br,{}),"\n",(0,r.jsx)(t.a,{href:"http://my.dappnode/packages/system/dappmanager.dnp.dappnode.eth/config",children:"http://my.dappnode/packages/system/dappmanager.dnp.dappnode.eth/config"}),"\n",(0,r.jsx)(t.img,{alt:"Overwrite remote ethereum RPC",src:n(5357).A+"",width:"2100",height:"1187"})]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},5357:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/overwrite-remote-eth-rpc-dc10cf27dca37dd9b6eda81dcad60092.png"},28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>i});var o=n(96540);const r={},s=o.createContext(r);function a(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/d9f32620.6eda82f6.js b/assets/js/d9f32620.6eda82f6.js
new file mode 100644
index 000000000..bfe378edf
--- /dev/null
+++ b/assets/js/d9f32620.6eda82f6.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5557],{9701:(e,o,s)=>{s.r(o),s.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>n,toc:()=>u});var n=s(48811),t=s(74848),l=s(28453);const r={slug:"welcome",title:"Welcome",authors:["slorber","yangshun"],tags:["facebook","hello","docusaurus"]},a=void 0,c={authorsImageUrls:[void 0,void 0]},u=[];function i(e){const o={a:"a",code:"code",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.a,{href:"https://docusaurus.io/docs/blog",children:"Docusaurus blogging features"})," are powered by the ",(0,t.jsx)(o.a,{href:"https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog",children:"blog plugin"}),"."]}),"\n",(0,t.jsxs)(o.p,{children:["Simply add Markdown files (or folders) to the ",(0,t.jsx)(o.code,{children:"blog"})," directory."]}),"\n",(0,t.jsxs)(o.p,{children:["Regular blog authors can be added to ",(0,t.jsx)(o.code,{children:"authors.yml"}),"."]}),"\n",(0,t.jsx)(o.p,{children:"The blog post date can be extracted from filenames, such as:"}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsx)(o.li,{children:(0,t.jsx)(o.code,{children:"2019-05-30-welcome.md"})}),"\n",(0,t.jsx)(o.li,{children:(0,t.jsx)(o.code,{children:"2019-05-30-welcome/index.md"})}),"\n"]}),"\n",(0,t.jsx)(o.p,{children:"A blog post folder can be convenient to co-locate blog post images:"}),"\n",(0,t.jsx)(o.p,{children:(0,t.jsx)(o.img,{alt:"Docusaurus Plushie",src:s(83887).A+"",width:"1500",height:"500"})}),"\n",(0,t.jsx)(o.p,{children:"The blog supports tags as well!"}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"And if you don't want a blog"}),": just delete this directory, and use ",(0,t.jsx)(o.code,{children:"blog: false"})," in your Docusaurus config."]})]})}function d(e={}){const{wrapper:o}={...(0,l.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(i,{...e})}):i(e)}},83887:(e,o,s)=>{s.d(o,{A:()=>n});const n=s.p+"assets/images/docusaurus-plushie-banner-a60f7593abca1e3eef26a9afa244e4fb.jpeg"},28453:(e,o,s)=>{s.d(o,{R:()=>r,x:()=>a});var n=s(96540);const t={},l=n.createContext(t);function r(e){const o=n.useContext(l);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(l.Provider,{value:o},e.children)}},48811:e=>{e.exports=JSON.parse('{"permalink":"/blog/welcome","source":"@site/blog/2021-08-26-welcome/index.md","title":"Welcome","description":"Docusaurus blogging features are powered by the blog plugin.","date":"2021-08-26T00:00:00.000Z","tags":[{"inline":true,"label":"facebook","permalink":"/blog/tags/facebook"},{"inline":true,"label":"hello","permalink":"/blog/tags/hello"},{"inline":true,"label":"docusaurus","permalink":"/blog/tags/docusaurus"}],"readingTime":0.405,"hasTruncateMarker":false,"authors":[{"name":"S\xe9bastien Lorber","title":"Docusaurus maintainer","url":"https://sebastienlorber.com","imageURL":"https://github.com/slorber.png","key":"slorber","page":null},{"name":"Yangshun Tay","title":"Front End Engineer @ Facebook","url":"https://github.com/yangshun","imageURL":"https://github.com/yangshun.png","key":"yangshun","page":null}],"frontMatter":{"slug":"welcome","title":"Welcome","authors":["slorber","yangshun"],"tags":["facebook","hello","docusaurus"]},"unlisted":false,"nextItem":{"title":"MDX Blog Post","permalink":"/blog/mdx-blog-post"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/db6178e4.d8e2ec7e.js b/assets/js/db6178e4.d8e2ec7e.js
new file mode 100644
index 000000000..88ac2c5a5
--- /dev/null
+++ b/assets/js/db6178e4.d8e2ec7e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[508],{67992:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"user/staking/ethereum/lsd-pools/lido/notifications","title":"Notifications & Warnings","description":"The DAppNodePackage-lido-csm provides notifications and warnings to help you monitor your infraestructure and validator performance. You will be able to setup your notifications either during the onboarding process if you are registering as a new Node Operator and from the UI navigating to /notifications.","source":"@site/docs/user/staking/ethereum/lsd-pools/lido/notifications.md","sourceDirName":"user/staking/ethereum/lsd-pools/lido","slug":"/user/staking/ethereum/lsd-pools/lido/notifications","permalink":"/docs/user/staking/ethereum/lsd-pools/lido/notifications","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/ethereum/lsd-pools/lido/notifications.md","tags":[],"version":"current","frontMatter":{"title":"Notifications & Warnings","llm_description":"Configure Telegram notifications and UI warnings for Lido CSM validator monitoring."},"sidebar":"userSidebar","previous":{"title":"Validators performance","permalink":"/docs/user/staking/ethereum/lsd-pools/lido/performance"},"next":{"title":"Rocketpool","permalink":"/docs/user/staking/ethereum/lsd-pools/rocketpool"}}');var o=t(74848),s=t(28453);const r={title:"Notifications & Warnings",llm_description:"Configure Telegram notifications and UI warnings for Lido CSM validator monitoring."},a="Notifications & Warnings",l={},c=[{value:"UI Warnings",id:"ui-warnings",level:2},{value:"Telegram notifications",id:"telegram-notifications",level:2}];function d(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"notifications--warnings",children:"Notifications & Warnings"})}),"\n",(0,o.jsxs)(i.p,{children:["The DAppNodePackage-lido-csm provides notifications and warnings to help you monitor your infraestructure and validator performance. You will be able to setup your notifications either during the onboarding process if you are registering as a new Node Operator and from the UI navigating to ",(0,o.jsx)(i.code,{children:"/notifications"}),"."]}),"\n",(0,o.jsx)(i.h2,{id:"ui-warnings",children:(0,o.jsx)(i.strong,{children:"UI Warnings"})}),"\n",(0,o.jsx)(i.p,{children:"The UI will display in the dashboard the following warnings:"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["\n",(0,o.jsx)(i.p,{children:"Infraestructure healthcheck:"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"Execution client health: you will be able to check the status of your execution client, either if its installed, running and syncing."}),"\n",(0,o.jsx)(i.li,{children:"Consensus client health: you will be able to check the status of your consensus client, either if its installed, running and syncing."}),"\n",(0,o.jsx)(i.li,{children:"Web3signer: you will be able to check the status of your web3signer, either if its installed and running."}),"\n",(0,o.jsx)(i.li,{children:"MEV Boost: you will be able to check the status of your MEV Boost, either if its installed and running."}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"lido-csm-infra-healthcheck",src:t(56433).A+"",width:"558",height:"224"})}),"\n"]}),"\n",(0,o.jsxs)(i.li,{children:["\n",(0,o.jsx)(i.p,{children:"Relays (comming soon):"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"Blocklisted relay: you will be able to check if your validator is using a blocklisted relay."}),"\n",(0,o.jsx)(i.li,{children:"No mandatory relay: you will be able to check if your validator is not using any mandatory relay."}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(i.li,{children:["\n",(0,o.jsx)(i.p,{children:"Attestations performance (comming soon): you will be able to check if your validator is not performing as expected according to the Lido tresholds."}),"\n"]}),"\n",(0,o.jsxs)(i.li,{children:["\n",(0,o.jsx)(i.p,{children:"Keystores not imported: you will be able to check if there are 1 or more keystores that belongs to your Node Operator and are not imported in the web3signer."}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"lido-csm-exit-requested",src:t(70040).A+"",width:"538",height:"228"})}),"\n"]}),"\n",(0,o.jsxs)(i.li,{children:["\n",(0,o.jsx)(i.p,{children:"Exit requested: you will be able to check if you have to exit any of your validators manually if the ejector fails at auto-exiting"}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"lido-csm-exit-requested",src:t(81971).A+"",width:"538",height:"190"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(i.h2,{id:"telegram-notifications",children:(0,o.jsx)(i.strong,{children:"Telegram notifications"})}),"\n",(0,o.jsxs)(i.p,{children:["You will be able to setup your notifications either during the onboarding process if you are registering as a new Node Operator and from the UI navigating to ",(0,o.jsx)(i.code,{children:"/notifications"}),". You must provide:"]}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["Bot token: this is the secret token from a bot that you must create. You can get it from the Telegram BotFather. See the ",(0,o.jsx)(i.a,{href:"https://core.telegram.org/bots/tutorial#obtain-your-bot-token",children:"obtain your bot token"})," section."]}),"\n",(0,o.jsxs)(i.li,{children:["User ID: this is your Telegram user ID. You can get it from the ",(0,o.jsx)(i.a,{href:"https://t.me/userinfobot",children:"userinfobot"})," typing ",(0,o.jsx)(i.code,{children:"/start"}),"."]}),"\n"]}),"\n",(0,o.jsx)(i.admonition,{type:"warning",children:(0,o.jsxs)(i.p,{children:["You must start the conversation with the bot using ",(0,o.jsx)(i.code,{children:"/start"})," so it can send you notifications."]})}),"\n",(0,o.jsx)(i.admonition,{type:"info",children:(0,o.jsx)(i.p,{children:"Once you setup your notifications, you will receive a test notification to confirm that everything is working properly."})}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"lido-csm-telegram-update",src:t(42659).A+"",width:"724",height:"74"})}),"\n",(0,o.jsx)(i.p,{children:"Once your notifications are setup, you will receive notificatios for the following events:"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["Lido Smart Contract events:","\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.a,{href:"https://docs.lido.fi/run-on-lido/csm/alerts-and-monitoring/expert-custom-alerts/#contract-vebo",children:"Lido VEBO events"}),": the most important event to remark is the validator exit request event, that will trigger the Ejector to exit the validator.\n",(0,o.jsx)(i.img,{alt:"lido-csm-report-submitted",src:t(61250).A+"",width:"724",height:"74"})]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.a,{href:"https://docs.lido.fi/run-on-lido/csm/alerts-and-monitoring/expert-custom-alerts/#contract-csm",children:"Lido CSM events"}),": check the Lido documentation for more details."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.a,{href:"https://docs.lido.fi/run-on-lido/csm/alerts-and-monitoring/expert-custom-alerts#contract-csfeedistributor",children:"Lido CSFeeDistributor"}),": check the Lido documentation for more details."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(i.li,{children:["Validator exit:","\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["Exit requested: you will receive a notification when the validator exit has been requested.\n",(0,o.jsx)(i.img,{alt:"lido-csm-exit-requested",src:t(42155).A+"",width:"898",height:"108"})]}),"\n",(0,o.jsxs)(i.li,{children:["Successful exit: you will receive a notification when the validator has been successfully exited.\n",(0,o.jsx)(i.img,{alt:"lido-csm-exit-success",src:t(86186).A+"",width:"761",height:"66"})]}),"\n",(0,o.jsxs)(i.li,{children:["Failed exit: you will receive a notification when the validator exit has failed, letting you know that a manual exit is required.\n",(0,o.jsx)(i.img,{alt:"lido-csm-exit-failed",src:t(58780).A+"",width:"676",height:"510"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(i.li,{children:["Performance:","\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["Above the treshold: you will receive a notification when your validator is performing above the treshold.\n",(0,o.jsx)(i.img,{alt:"lido-csm-performance-notification-above",src:t(3350).A+"",width:"942",height:"278"})]}),"\n",(0,o.jsxs)(i.li,{children:["Below the treshold: you will receive a notification when your validator is performing below the treshold.\n",(0,o.jsx)(i.img,{alt:"lido-csm-performance-notification-below",src:t(77250).A+"",width:"942",height:"278"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(i.li,{children:["Operator stuck: you will receive a notification when your operator is stuck indicating the epoch range.\n",(0,o.jsx)(i.img,{alt:"lido-csm-stuck",src:t(52922).A+"",width:"940",height:"92"})]}),"\n",(0,o.jsxs)(i.li,{children:["Relays (comming soon):","\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["Blocklisted relay: you will receive a notification when your validator is using a blocklisted relay.\n",(0,o.jsx)(i.img,{alt:"lido-csm-relay-notification",src:t(93177).A+"",width:"958",height:"296"})]}),"\n",(0,o.jsx)(i.li,{children:"No relay: you will receive a notification when your validator is not using any relay."}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(i.li,{children:["Keystores not imported (comming soon):","\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"You will receive a notification when there are 1 or more keystores that belongs to your Node Operator and are not imported in the web3signer."}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},58780:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/lido-csm-exit-failed-c1a40f5e57d23aa055d6db230d3daa23.png"},81971:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/lido-csm-exit-request-warning-97bca18fffa89f3a29d75f5d92ce1928.png"},42155:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/lido-csm-exit-requested-c87d4dfaa31dedc26b98549748d0f509.png"},86186:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/lido-csm-exit-success-adc6c34aafd934e61358307adedc9822.png"},56433:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/lido-csm-infra-healthcheck-a604a0e68905d8ddba967d23dac1316a.png"},70040:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/lido-csm-keys-not-imported-warning-412139481617c883e7d334ef1014a6a2.png"},3350:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/lido-csm-performance-notification-above-96c382868f77fb2730c7ae422a8b31a9.png"},77250:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/lido-csm-performance-notification-below-5bc1e36ef158f678a3227b740ae18369.png"},93177:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/lido-csm-relay-notification-73cbde5feb7836ee255249095b97b054.png"},61250:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/lido-csm-report-submitted-92821ceb721fb8d41d56cdc1c8625f3f.png"},52922:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/lido-csm-stuck-ff03ce02cda4e6cc730d5bc9c7498e26.png"},42659:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/lido-csm-telegram-update-1a46e5289a71e893d1df3724694c461e.png"},28453:(e,i,t)=>{t.d(i,{R:()=>r,x:()=>a});var n=t(96540);const o={},s=n.createContext(o);function r(e){const i=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/de66584d.0c06b23e.js b/assets/js/de66584d.0c06b23e.js
new file mode 100644
index 000000000..1b201a444
--- /dev/null
+++ b/assets/js/de66584d.0c06b23e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8641],{4302:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"user/staking/gnosis-chain/consolidate-gnosis-validators","title":"Consolidate your Gnosis validators","description":"After the Pectra hard fork, validator consolidations are ready to use in Gnosis chain.","source":"@site/docs/user/staking/gnosis-chain/consolidate-gnosis-validators.md","sourceDirName":"user/staking/gnosis-chain","slug":"/user/staking/gnosis-chain/consolidate-gnosis-validators","permalink":"/docs/user/staking/gnosis-chain/consolidate-gnosis-validators","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/gnosis-chain/consolidate-gnosis-validators.md","tags":[],"version":"current","frontMatter":{"title":"Consolidate your Gnosis validators","llm_description":"Guide to merge multiple Gnosis validators into fewer ones after Pectra hard fork."}}');var t=i(74848),o=i(28453);const a={title:"Consolidate your Gnosis validators",llm_description:"Guide to merge multiple Gnosis validators into fewer ones after Pectra hard fork."},r="Consolidate your Gnosis validators",d={},l=[{value:"Why should I consolidate my Gnosis validators?",id:"why-should-i-consolidate-my-gnosis-validators",level:2},{value:"1. Simplify Operations",id:"1-simplify-operations",level:4},{value:"2. Optimize Costs",id:"2-optimize-costs",level:4},{value:"3. Better Reward Management",id:"3-better-reward-management",level:4},{value:"4. Safe process",id:"4-safe-process",level:4},{value:"How do I consolidate my Gnosis validators?",id:"how-do-i-consolidate-my-gnosis-validators",level:2}];function c(e){const s={a:"a",h1:"h1",h2:"h2",h4:"h4",header:"header",img:"img",p:"p",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"consolidate-your-gnosis-validators",children:"Consolidate your Gnosis validators"})}),"\n",(0,t.jsx)(s.p,{children:"After the Pectra hard fork, validator consolidations are ready to use in Gnosis chain."}),"\n",(0,t.jsx)(s.h2,{id:"why-should-i-consolidate-my-gnosis-validators",children:"Why should I consolidate my Gnosis validators?"}),"\n",(0,t.jsx)(s.p,{children:"If you\u2019ve been running multiple validators on Gnosis Chain, consolidation can simplify your setup and bring several advantages:"}),"\n",(0,t.jsx)(s.h4,{id:"1-simplify-operations",children:"1. Simplify Operations"}),"\n",(0,t.jsx)(s.p,{children:"Managing many validator keys and clients can become complex over time. Consolidating them into fewer validators helps reduce:"}),"\n",(0,t.jsx)(s.p,{children:"Configuration overhead"}),"\n",(0,t.jsx)(s.p,{children:"Monitoring burden"}),"\n",(0,t.jsx)(s.p,{children:"Risk of mistakes during upgrades or restarts"}),"\n",(0,t.jsx)(s.h4,{id:"2-optimize-costs",children:"2. Optimize Costs"}),"\n",(0,t.jsx)(s.p,{children:"Each validator requires independent infrastructure resources. By consolidating:"}),"\n",(0,t.jsx)(s.p,{children:"You use less disk space, bandwidth, and processing power"}),"\n",(0,t.jsx)(s.p,{children:"You reduce maintenance costs and time"}),"\n",(0,t.jsx)(s.p,{children:"Fewer fees are required for transactions like reward claims"}),"\n",(0,t.jsx)(s.h4,{id:"3-better-reward-management",children:"3. Better Reward Management"}),"\n",(0,t.jsx)(s.p,{children:"Instead of tracking rewards across many validators:"}),"\n",(0,t.jsx)(s.p,{children:"You centralize rewards into one or a few validator balances"}),"\n",(0,t.jsx)(s.p,{children:"Easier accounting and reporting"}),"\n",(0,t.jsx)(s.p,{children:"Less gas spent claiming rewards"}),"\n",(0,t.jsx)(s.h4,{id:"4-safe-process",children:"4. Safe process"}),"\n",(0,t.jsx)(s.p,{children:"Consolidation does not change your withdrawal address or risk your funds. It simply merges balances and validator responsibilities in a protocol-safe way."}),"\n",(0,t.jsx)(s.h2,{id:"how-do-i-consolidate-my-gnosis-validators",children:"How do I consolidate my Gnosis validators?"}),"\n",(0,t.jsxs)(s.p,{children:["Step 1: Go to ",(0,t.jsx)(s.a,{href:"https://consolidate.gnosischain.com/",children:"https://consolidate.gnosischain.com/"})]}),"\n",(0,t.jsxs)(s.p,{children:["Step 2: Connect your wallet. Remember to use the same address with which you did the staking deposit of your validators.\n",(0,t.jsx)(s.img,{alt:"Continue",src:i(76176).A+"",width:"1016",height:"556"})]}),"\n",(0,t.jsxs)(s.p,{children:["Step 3: You will see a list of your active validators in the UI.\n",(0,t.jsx)(s.img,{alt:"summary",src:i(84043).A+"",width:"1590",height:"1386"}),"\nStep 4: Click Summary button"]}),"\n",(0,t.jsxs)(s.p,{children:["Step 5: Check the validator list and the target validator. The target validator will stay and the rest will be exited. Click Consolidate Batch\n",(0,t.jsx)(s.img,{alt:"List_validators",src:i(63097).A+"",width:"1140",height:"846"})]}),"\n",(0,t.jsxs)(s.p,{children:["Step 6: The transaction was sent, click Finish. You can check the transaction in the explorer link.\n",(0,t.jsx)(s.img,{alt:"Finish",src:i(50406).A+"",width:"2266",height:"890"})]}),"\n",(0,t.jsxs)(s.p,{children:["Step 7: To have more details, go to gnosischa.in to check the consolidation progress.\n",(0,t.jsx)(s.img,{alt:"deposits_validator",src:i(37161).A+"",width:"2880",height:"1570"})]}),"\n",(0,t.jsxs)(s.p,{children:["Step 8: Write your address in the search field highlighted.\n",(0,t.jsx)(s.img,{alt:"write_address",src:i(53267).A+"",width:"2880",height:"1570"}),"\nStep 9. Click in the target validator key (the only one that has not exited status).\n",(0,t.jsx)(s.img,{alt:"validator_key",src:i(68341).A+"",width:"2878",height:"876"})]}),"\n",(0,t.jsxs)(s.p,{children:["Step 10. Review the consolidation process.\n",(0,t.jsx)(s.img,{alt:"consolidation_click",src:i(20262).A+"",width:"1850",height:"986"})]}),"\n",(0,t.jsx)(s.p,{children:"The consolidation process might take 2-3 days. It depends on the consolidation queue at the moment of consolidation."}),"\n",(0,t.jsx)(s.p,{children:"Now you are ready to consolidate your Gnosis validators.\nGood luck!"})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},20262:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/consolidation_click-59fc7856b8aa231fa0e97ef4f4b84d7d.png"},76176:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/continue-712da0a4fd0eafc3f60fdf675ea4b8a1.png"},37161:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/deposits_validator-bb581fea4e765c978db1fd81197c1dff.png"},50406:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/finish-2df0f97cc1f35bd520ee8762e6d83acd.png"},63097:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/list_validators-dbbb41ed0798116b9b8166e25bb284b3.png"},84043:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/summary-870e3e69d7251dfc3ee105fa46c3f73f.png"},68341:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/validator_key-0892560f7194edf59ce029e943258418.png"},53267:(e,s,i)=>{i.d(s,{A:()=>n});const n=i.p+"assets/images/write_address-5d1edf9e42b1c5dfad9c06777e8cd26e.png"},28453:(e,s,i)=>{i.d(s,{R:()=>a,x:()=>r});var n=i(96540);const t={},o=n.createContext(t);function a(e){const s=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/df56bb67.bea422a8.js b/assets/js/df56bb67.bea422a8.js
new file mode 100644
index 000000000..bc3eec2a7
--- /dev/null
+++ b/assets/js/df56bb67.bea422a8.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[7961],{75206:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>i,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"user/packages/understanding-dappnode-packages/network","title":"Network","description":"The Network section allows you to manage and configure the network settings for your packages. This includes adjusting network settings for individual services, changing port mappings, and setting up domain mappings to expose your package to the internet.","source":"@site/docs/user/packages/understanding-dappnode-packages/network.md","sourceDirName":"user/packages/understanding-dappnode-packages","slug":"/user/packages/understanding-dappnode-packages/network","permalink":"/docs/user/packages/understanding-dappnode-packages/network","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/packages/understanding-dappnode-packages/network.md","tags":[],"version":"current","frontMatter":{"title":"Network","llm_description":"Network configuration for packages: port mapping, HTTPS domains, and basic authentication."},"sidebar":"userSidebar","previous":{"title":"Config","permalink":"/docs/user/packages/understanding-dappnode-packages/config"},"next":{"title":"Logs","permalink":"/docs/user/packages/understanding-dappnode-packages/logs"}}');var o=t(74848),a=t(28453);const i={title:"Network",llm_description:"Network configuration for packages: port mapping, HTTPS domains, and basic authentication."},r="Network",d={},c=[];function p(e){const n={a:"a",admonition:"admonition",h1:"h1",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"network",children:"Network"})}),"\n",(0,o.jsx)(n.p,{children:"The Network section allows you to manage and configure the network settings for your packages. This includes adjusting network settings for individual services, changing port mappings, and setting up domain mappings to expose your package to the internet."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"dappnode_packages3",src:t(13561).A+"",width:"1741",height:"1091"})}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Service"}),": Some packages may have multiple services running as part of the same container. This option will allow you to adjust each of their network settings separately."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Public port mapping"}),": Need to change your package's port mapping? You can change this setting in this field as well as its protocol between TCP and UDP. Remember that Dappnode features UPnP technology, so if this protocol is enabled in your router, the port opened here will be forwarded in the router, too."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"HTTPs domain mapping"}),": Do you want to expose your package to the internet? You'll be able to add multiple public domains to your package here. This is a great way to share your node's RPC with friends and family!"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)("u",{children:"From subdomain"}),": the domain name you want to set for the mapping. It will be appended to your dappnode dynDNS domain."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)("u",{children:"To port"}),": The container port you want to map to the domain. Double check you have chosen correctly the port you want to map. These ports are commonly used:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"80: Exposing UIs"}),"\n",(0,o.jsx)(n.li,{children:"8545: Ethereum RPC APIs"}),"\n",(0,o.jsx)(n.li,{children:"8551: Ethereum Engine endpoints"}),"\n",(0,o.jsx)(n.li,{children:"3500: Beacon chain or validator API in Dappnode."}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)("u",{children:"Basic auth"}),": This parameter is optional and allows you to set a basic authentication for the domain. It will be required to access the domain, learn more about basic authentication ",(0,o.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication",children:"here"}),". The basic auth is composed of fields ",(0,o.jsx)(n.strong,{children:"User"})," and ",(0,o.jsx)(n.strong,{children:"Password"})]}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsx)(n.p,{children:"For security reasons, the password is not stored in plain text. This means it cannot be recovered if lost. In such case, you will have to re-create the port mapping with a new password."})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"dappnode_packages3",src:t(75148).A+"",width:"1040",height:"725"})})]})}function l(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},75148:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/dappnode_package_network-1b01955ff706cc5c39314bb407adf170.png"},13561:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/dappnode_packages3-96bce25fad6818075d28d1f51529b442.png"},28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>r});var s=t(96540);const o={},a=s.createContext(o);function i(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/dfbda110.0db81aa3.js b/assets/js/dfbda110.0db81aa3.js
new file mode 100644
index 000000000..793489135
--- /dev/null
+++ b/assets/js/dfbda110.0db81aa3.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[7902],{20384:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"user/packages/avalanche","title":"Avalanche","description":"Avalanche: A Revolutionary Consensus Protocol","source":"@site/docs/user/packages/avalanche.md","sourceDirName":"user/packages","slug":"/user/packages/avalanche","permalink":"/docs/user/packages/avalanche","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/packages/avalanche.md","tags":[],"version":"current","frontMatter":{"title":"Avalanche","llm_description":"Running Avalanche nodes on Dappnode for network decentralization and AVAX staking rewards."},"sidebar":"userSidebar","previous":{"title":"Eth Classic","permalink":"/docs/user/packages/ethclassic"},"next":{"title":"Monero","permalink":"/docs/user/packages/monero"}}');var t=a(74848),r=a(28453);const i={title:"Avalanche",llm_description:"Running Avalanche nodes on Dappnode for network decentralization and AVAX staking rewards."},s="Avalanche",c={},l=[{value:"Avalanche: A Revolutionary Consensus Protocol",id:"avalanche-a-revolutionary-consensus-protocol",level:2},{value:"AVAX Staking on Dappnode: Earn Rewards while supporting Avalanche Network",id:"avax-staking-on-dappnode-earn-rewards-while-supporting-avalanche-network",level:2}];function d(e){const n={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"avalanche",children:"Avalanche"})}),"\n",(0,t.jsx)(n.h2,{id:"avalanche-a-revolutionary-consensus-protocol",children:"Avalanche: A Revolutionary Consensus Protocol"}),"\n",(0,t.jsx)(n.p,{children:"Avalanche is an innovative open-source platform designed for launching decentralized finance applications and enterprise blockchain deployments within a single, highly scalable ecosystem. Developers leveraging Avalanche\u2019s capabilities can effortlessly craft robust, secure applications and tailor-made blockchain networks. This platform empowers them to construct intricate rulesets or build atop existing private or public subnets, ultimately driving the creation of reliable and impactful solutions."}),"\n",(0,t.jsx)(n.h2,{id:"avax-staking-on-dappnode-earn-rewards-while-supporting-avalanche-network",children:"AVAX Staking on Dappnode: Earn Rewards while supporting Avalanche Network"}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["A guide to running an Avalanche validator node on Dappnode is coming soon. In the meantime, you can find more information on the ",(0,t.jsx)(n.a,{href:"https://www.avalabs.org/",children:"Avalanche website"}),"."]})}),"\n",(0,t.jsx)(n.p,{children:"By running an Avalanche node on Dappnode, you actively participate in the decentralization of the network. Through this engagement, you contribute to the security and reliability of Avalanche\u2019s consensus model."}),"\n",(0,t.jsx)(n.p,{children:"Engage in AVAX staking to contribute to the security and decentralization of the Avalanche network. Stake your AVAX tokens to become a delegator or validator, and in return, earn rewards for your participation in the Proof of Stake consensus mechanism. With a minimum of 2000 AVAX tokens required to start a validator, AVAX staking presents an opportunity to support the network while earning rewards."})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},28453:(e,n,a)=>{a.d(n,{R:()=>i,x:()=>s});var o=a(96540);const t={},r=o.createContext(t);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/dfcea9c7.aa6e303a.js b/assets/js/dfcea9c7.aa6e303a.js
new file mode 100644
index 000000000..167b9a4f9
--- /dev/null
+++ b/assets/js/dfcea9c7.aa6e303a.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[6485],{979:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>a,metadata:()=>i,toc:()=>p});const i=JSON.parse('{"id":"user/access-your-dappnode/wifi","title":"Wi-Fi Access to Dappnode","description":"If you bought a Dappnode from our store, or installed Dappnode on a computer with a built-in Wi-Fi chip, you can easily connect to the Dappmanager (Dappnode web UI) using the Dappnode\'s Wi-Fi hotspot.","source":"@site/docs/user/access-your-dappnode/wifi.md","sourceDirName":"user/access-your-dappnode","slug":"/user/access-your-dappnode/wifi","permalink":"/docs/user/access-your-dappnode/wifi","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/access-your-dappnode/wifi.md","tags":[],"version":"current","frontMatter":{"title":"Wi-Fi Access to Dappnode","llm_description":"Connect to Dappnode via built-in WiFi hotspot (SSID: DappnodeWIFI, password: dappnode)."},"sidebar":"userSidebar","previous":{"title":"Overview","permalink":"/docs/user/access-your-dappnode/overview"},"next":{"title":"Overview","permalink":"/docs/user/access-your-dappnode/vpn/overview"}}');var t=o(74848),s=o(28453);const a={title:"Wi-Fi Access to Dappnode",llm_description:"Connect to Dappnode via built-in WiFi hotspot (SSID: DappnodeWIFI, password: dappnode)."},r="Wi-Fi Access to Dappnode",d={},p=[{value:"Connecting to Dappnode Wi-Fi",id:"connecting-to-dappnode-wi-fi",level:2},{value:"Wi-Fi Settings in Dappmanager",id:"wi-fi-settings-in-dappmanager",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"wi-fi-access-to-dappnode",children:"Wi-Fi Access to Dappnode"})}),"\n",(0,t.jsxs)(n.p,{children:["If you bought a Dappnode from our store, or installed Dappnode on a computer with a built-in Wi-Fi chip, you can easily connect to the ",(0,t.jsx)(n.strong,{children:"Dappmanager"})," (Dappnode web UI) using the Dappnode's Wi-Fi hotspot."]}),"\n",(0,t.jsx)(n.p,{children:"For those who got their hardware elsewhere, there's a chance the Wi-Fi card might not be recognized by the operating system. If this happens, you might need to install the required firmware. Since the steps vary based on the hardware, please contact our support on Discord if you face any issues."}),"\n",(0,t.jsx)(n.h2,{id:"connecting-to-dappnode-wi-fi",children:"Connecting to Dappnode Wi-Fi"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\ud83d\udcf1 On a device of your choice, navigate to the ",(0,t.jsx)(n.strong,{children:"Wi-Fi settings"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["\ud83d\udd0d Search and select the network labeled as ",(0,t.jsx)(n.code,{children:"DappnodeWIFI"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["\ud83d\udd11 Enter the password: ",(0,t.jsx)(n.code,{children:"dappnode"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["\ud83c\udf10 Open a browser and go to ",(0,t.jsx)(n.a,{href:"http://my.dappnode/",children:"http://my.dappnode/"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"caution",children:(0,t.jsxs)(n.p,{children:["After connecting for the first time, go to the Wi-Fi section in the left menu of ",(0,t.jsx)(n.strong,{children:"Dappmanager"})," and change the hotspot password to something only you know."]})}),"\n",(0,t.jsx)(n.h2,{id:"wi-fi-settings-in-dappmanager",children:"Wi-Fi Settings in Dappmanager"}),"\n",(0,t.jsx)(n.p,{children:"Once in the Wi-Fi section, you'll find two main options:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Toggle Wi-Fi"}),": Here, you can turn the Wi-Fi feature on or off."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Wi-Fi Credentials"}),": Set a new network name (SSID) and password for your Dappnode's Wi-Fi. We strongly advise you to change the default settings for better security."]}),"\n"]})]})}function l(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},28453:(e,n,o)=>{o.d(n,{R:()=>a,x:()=>r});var i=o(96540);const t={},s=i.createContext(t);function a(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/e26c9afe.311d1182.js b/assets/js/e26c9afe.311d1182.js
new file mode 100644
index 000000000..23c1ee4b5
--- /dev/null
+++ b/assets/js/e26c9afe.311d1182.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8682],{68139:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>h});const o=JSON.parse('{"id":"user/staking/ethereum/lsd-pools/stakehouse","title":"Stakehouse","description":"---","source":"@site/docs/user/staking/ethereum/lsd-pools/stakehouse.md","sourceDirName":"user/staking/ethereum/lsd-pools","slug":"/user/staking/ethereum/lsd-pools/stakehouse","permalink":"/docs/user/staking/ethereum/lsd-pools/stakehouse","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/ethereum/lsd-pools/stakehouse.md","tags":[],"version":"current","frontMatter":{"title":"Stakehouse","llm_description":"Become a Stakehouse node runner with 4 ETH using Web3Signer integration."},"sidebar":"userSidebar","previous":{"title":"Stakewise","permalink":"/docs/user/staking/ethereum/lsd-pools/stakewise"},"next":{"title":"Obol","permalink":"/docs/user/staking/ethereum/dvt-technologies/obol-network"}}');var n=t(74848),r=t(28453);const i={title:"Stakehouse",llm_description:"Become a Stakehouse node runner with 4 ETH using Web3Signer integration."},a="Stakehouse",l={},h=[{value:"Stakehouse Overview",id:"stakehouse-overview",level:3},{value:"Package Key Features",id:"package-key-features",level:3},{value:"First Steps to become a Node Runner with Stakehouse and Dappnode",id:"first-steps-to-become-a-node-runner-with-stakehouse-and-dappnode",level:3}];function d(e){const s={a:"a",h1:"h1",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"stakehouse",children:"Stakehouse"})}),"\n",(0,n.jsx)(s.hr,{}),"\n",(0,n.jsx)(s.h3,{id:"stakehouse-overview",children:(0,n.jsx)(s.strong,{children:"Stakehouse Overview"})}),"\n",(0,n.jsx)(s.p,{children:"Stakehouse\u2019s mission is to bring the benefits of ETH staking to the mainstream user. To do this Blockswap developed a public benefit infrastructure favoring solo stakers. Those who are most important to the Ethereum blockchain now have access to the Stakehouse middle layer which is like ETH staking with superpowers. Not only are solo stakers empowered, but anybody who touches staked ETH or its peripheries can benefit from a protocol that creates multichain ETH without a bridge, doesn\u2019t pool users\u2019 assets, doesn\u2019t collect a commission, doesn\u2019t require a particular node, and doesn\u2019t use an oracle."}),"\n",(0,n.jsx)(s.hr,{}),"\n",(0,n.jsx)(s.h3,{id:"package-key-features",children:(0,n.jsx)(s.strong,{children:"Package Key Features"})}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"Integration with Web3Signer:"}),' When being a node operator, you can import your keystores into Web3Signer and select Stakehouse under the "Staking Protocol" field. Web3Signer takes care of the rest!']}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"Staking Inclusion:"})," Users can run a validator for 4 ETH or provide liquidity with as little as 0.001 ETH, to earn Ethereum consensus rewards. The users of LSD Networks can range from DAOs to node operators to general users who have ETH to stake."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(s.hr,{}),"\n",(0,n.jsx)(s.h3,{id:"first-steps-to-become-a-node-runner-with-stakehouse-and-dappnode",children:(0,n.jsx)(s.strong,{children:"First Steps to become a Node Runner with Stakehouse and Dappnode"})}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Setup your LSD:"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Go to ",(0,n.jsx)(s.a,{href:"https://lsd.joinstakehouse.com/",children:"Stakehouse's LSD wizard"}),' and click "Deposit" under "Node Operator".']}),"\n",(0,n.jsxs)(s.li,{children:["Follow the steps to ",(0,n.jsx)(s.a,{href:"https://help.joinstakehouse.com/en/articles/6597493-how-do-i-generate-my-validator-keys-using-wagyu-keygen-mainnet-testnet",children:"generate your key"}),"."]}),"\n",(0,n.jsx)(s.li,{children:"Make the initial 4 ETH deposit."}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Import your keystore file into Web3Signer:"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:'When you import your keystore, make sure you select Stakehouse under "Staking protocol". This will automatically set your Fee Recipient address and point it to your LSD.'}),"\n",(0,n.jsx)(s.li,{children:"Pay special attention to this, since failing to properly configure the Fee Recipient may incur in penalties for the Node Runner."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(s.hr,{}),"\n",(0,n.jsx)(s.p,{children:"Staking, though lucrative, also comes with inherent risks. Stakehouse simplifies the process but doesn't eliminate the risks. It's essential to conduct thorough research and always prioritize safety."}),"\n",(0,n.jsxs)(s.p,{children:["For further guidance and details, refer to ",(0,n.jsx)(s.a,{href:"https://docs.joinstakehouse.com/protocol/learn/Stakehouse",children:"Stakehouse's official documentation"}),", or drop by ",(0,n.jsx)(s.a,{href:"https://discord.gg/dappnode",children:"Dappnode's Discord server"})," for support."]})]})}function u(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},28453:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>a});var o=t(96540);const n={},r=o.createContext(n);function i(e){const s=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),o.createElement(r.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/e273c56f.4daf7118.js b/assets/js/e273c56f.4daf7118.js
new file mode 100644
index 000000000..9ec7ec170
--- /dev/null
+++ b/assets/js/e273c56f.4daf7118.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[9328],{94304:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>r,contentTitle:()=>u,default:()=>m,frontMatter:()=>n,metadata:()=>s,toc:()=>l});var s=o(12421),i=o(74848),a=o(28453);const n={slug:"first-blog-post",title:"First Blog Post",authors:{name:"Gao Wei",title:"Docusaurus Core Team",url:"https://github.com/wgao19",image_url:"https://github.com/wgao19.png"},tags:["hola","docusaurus"]},u=void 0,r={authorsImageUrls:[void 0]},l=[];function c(t){const e={p:"p",...(0,a.R)(),...t.components};return(0,i.jsx)(e.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"})}function m(t={}){const{wrapper:e}={...(0,a.R)(),...t.components};return e?(0,i.jsx)(e,{...t,children:(0,i.jsx)(c,{...t})}):c(t)}},28453:(t,e,o)=>{o.d(e,{R:()=>n,x:()=>u});var s=o(96540);const i={},a=s.createContext(i);function n(t){const e=s.useContext(a);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function u(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:n(t.components),s.createElement(a.Provider,{value:e},t.children)}},12421:t=>{t.exports=JSON.parse('{"permalink":"/blog/first-blog-post","source":"@site/blog/2019-05-28-first-blog-post.md","title":"First Blog Post","description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet","date":"2019-05-28T00:00:00.000Z","tags":[{"inline":true,"label":"hola","permalink":"/blog/tags/hola"},{"inline":true,"label":"docusaurus","permalink":"/blog/tags/docusaurus"}],"readingTime":0.12,"hasTruncateMarker":false,"authors":[{"name":"Gao Wei","title":"Docusaurus Core Team","url":"https://github.com/wgao19","image_url":"https://github.com/wgao19.png","imageURL":"https://github.com/wgao19.png","socials":{},"key":null,"page":null}],"frontMatter":{"slug":"first-blog-post","title":"First Blog Post","authors":{"name":"Gao Wei","title":"Docusaurus Core Team","url":"https://github.com/wgao19","image_url":"https://github.com/wgao19.png","imageURL":"https://github.com/wgao19.png"},"tags":["hola","docusaurus"]},"unlisted":false,"prevItem":{"title":"Long Blog Post","permalink":"/blog/long-blog-post"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/e28e223d.e17e3bb6.js b/assets/js/e28e223d.e17e3bb6.js
new file mode 100644
index 000000000..db8ba39d2
--- /dev/null
+++ b/assets/js/e28e223d.e17e3bb6.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[2238],{85586:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"user/access-your-dappnode/vpn/wireguard","title":"WireGuard Access to Dappnode","description":"WireGuard is a modern, high-performance VPN protocol that offers a simple and streamlined approach for securely accessing your Dappnode. This guide will walk you through setting up WireGuard with your Dappnode.","source":"@site/docs/user/access-your-dappnode/vpn/wireguard.md","sourceDirName":"user/access-your-dappnode/vpn","slug":"/user/access-your-dappnode/vpn/wireguard","permalink":"/docs/user/access-your-dappnode/vpn/wireguard","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/access-your-dappnode/vpn/wireguard.md","tags":[],"version":"current","frontMatter":{"title":"WireGuard Access to Dappnode","llm_description":"WireGuard VPN setup guide with credential retrieval and multi-platform client configuration."},"sidebar":"userSidebar","previous":{"title":"Tailscale","permalink":"/docs/user/access-your-dappnode/vpn/tailscale"},"next":{"title":"OpenVPN","permalink":"/docs/user/access-your-dappnode/vpn/openvpn"}}');var t=i(74848),l=i(28453);const s={title:"WireGuard Access to Dappnode",llm_description:"WireGuard VPN setup guide with credential retrieval and multi-platform client configuration."},o="WireGuard Access to Dappnode",a={},d=[{value:"Setting Up WireGuard",id:"setting-up-wireguard",level:2},{value:"1. Get VPN Credentials",id:"1-get-vpn-credentials",level:3},{value:"Option 1: Via Dappmanager UI",id:"option-1-via-dappmanager-ui",level:4},{value:"Option 2: Via Dappnode Terminal",id:"option-2-via-dappnode-terminal",level:4},{value:"2. Installing WireGuard Client",id:"2-installing-wireguard-client",level:3},{value:"3. Setting Up WireGuard Client",id:"3-setting-up-wireguard-client",level:3},{value:"4. Connecting to Dappnode via WireGuard",id:"4-connecting-to-dappnode-via-wireguard",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...e.components},{Details:r}=n;return r||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"wireguard-access-to-dappnode",children:"WireGuard Access to Dappnode"})}),"\n",(0,t.jsx)(n.p,{children:"WireGuard is a modern, high-performance VPN protocol that offers a simple and streamlined approach for securely accessing your Dappnode. This guide will walk you through setting up WireGuard with your Dappnode."}),"\n",(0,t.jsx)(n.p,{children:"You will need:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Your dappnode"}),"\n",(0,t.jsx)(n.li,{children:"A Wireguard client installed on your usual device (laptop, mobile, etc.)"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"setting-up-wireguard",children:"Setting Up WireGuard"}),"\n",(0,t.jsx)(n.h3,{id:"1-get-vpn-credentials",children:"1. Get VPN Credentials"}),"\n",(0,t.jsx)(n.p,{children:"There are two primary methods to obtain your VPN credentials:"}),"\n",(0,t.jsx)(n.h4,{id:"option-1-via-dappmanager-ui",children:"Option 1: Via Dappmanager UI"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"VPN_credentials",src:i(76773).A+"",width:"3016",height:"812"})}),"\n",(0,t.jsx)(n.p,{children:"If you have access to the Dappmanager:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Navigate to ",(0,t.jsx)(n.strong,{children:"VPN > WireGuard"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"If you don't see any device added to the list:"})}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Provide a name for your device."}),"\n",(0,t.jsx)(n.li,{children:"Click on 'Add New Device'."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"To retrieve the credentials:"})}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Click on the 'Get link' button on the credentials column."}),"\n",(0,t.jsxs)(n.li,{children:["You will be shown 3 different ways of retrieving the credentials:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.em,{children:"Download config:"})," it will download a .txt file with the credentials in plaintext"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.em,{children:"Copy config:"})," it will copy the credentials in your clipboard so you can paste them in your wireguard client"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.em,{children:"Show config QR code:"})," it will generate a QR that you can scan with a wireguard mobile client to add the config directly"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:"Please, see step 3. Setting up Wireguard client to see how to use this config once you have a client in your device (desktop/laptop/phone)"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"For Local Access Credentials:"})}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Click on 'Show Local Credentials'."}),"\n",(0,t.jsx)(n.li,{children:"Copy the local credentials displayed."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"option-2-via-dappnode-terminal",children:"Option 2: Via Dappnode Terminal"}),"\n",(0,t.jsx)(n.p,{children:"If you can't access the Dappmanager, you'll need to get the credentials via the Dappnode terminal:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Access the Dappnode terminal, as explained ",(0,t.jsx)(n.a,{href:"/docs/user/access-your-dappnode/terminal",children:"here"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Execute the command: ",(0,t.jsx)(n.code,{children:"dappnode_wireguard"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"The credentials will be displayed directly on the terminal. Copy these credentials."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"For Local Access Credentials:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Execute the command: ",(0,t.jsx)(n.code,{children:"dappnode_wireguard --local"}),"."]}),"\n",(0,t.jsx)(n.li,{children:"Copy the local credentials displayed."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.admonition,{title:"Local Credentials Explained",type:"info",children:[(0,t.jsx)(n.p,{children:"Local credentials allow you to establish a connection to your Dappnode when you are on the same local network. They are especially useful when remote credentials might not work due to certain network restrictions or configurations."}),(0,t.jsx)(n.p,{children:"While remote credentials enable access from outside your local network, local credentials ensure a reliable connection within your home or office network. It's recommended to use local credentials when you are in proximity to your Dappnode to guarantee a stable and swift connection."}),(0,t.jsxs)(n.p,{children:["Always remember: Local credentials ",(0,t.jsx)(n.strong,{children:"only work inside your own network"}),". If you're trying to access your Dappnode from a different location or network, you'll need to use the remote credentials."]})]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsx)(n.p,{children:"Ensure you store these credentials securely. They provide direct access to your Dappnode. Treat them with the same level of caution as you would a password."})}),"\n",(0,t.jsx)(n.h3,{id:"2-installing-wireguard-client",children:"2. Installing WireGuard Client"}),"\n",(0,t.jsxs)(n.p,{children:["After obtaining your VPN credentials, the next step is to install the WireGuard client. You can download the one that's compatible with the device you are going to use to connect to the Dappnode machine from the ",(0,t.jsx)(n.a,{href:"https://www.wireguard.com/install/",children:"WireGuard website"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"3-setting-up-wireguard-client",children:"3. Setting Up WireGuard Client"}),"\n",(0,t.jsx)(n.p,{children:"After installing the client:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Launch the WireGuard application."}),"\n",(0,t.jsx)(n.li,{children:"Click on 'Add Tunnel' or 'Import Tunnel from File' based on your platform."}),"\n",(0,t.jsx)(n.li,{children:"Import the credentials you obtained in the earlier steps."}),"\n",(0,t.jsx)(n.li,{children:"Once imported, connect to your Dappnode by activating the tunnel."}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{title:"Connection Status",type:"tip",children:(0,t.jsx)(n.p,{children:"You can verify your connection status within the WireGuard application. It will display if the tunnel is active, as well as data transfer rates."})}),"\n",(0,t.jsx)(n.h3,{id:"4-connecting-to-dappnode-via-wireguard",children:"4. Connecting to Dappnode via WireGuard"}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:(0,t.jsx)("b",{children:"Android"})}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Launch the OpenVPN for Android app."}),"\n",(0,t.jsx)(n.li,{children:'Tap on "+" icon.'}),"\n",(0,t.jsx)(n.li,{children:"Select the option that fits you best to import the credentials: Scan QR code, Import file or Paste from clipboard to an empty profile."}),"\n"]}),(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/wireguard_android.jpg",alt:"Import file in Android",style:{width:"20em"}})})]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:(0,t.jsx)("b",{children:"iPhone/iPad"})}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Launch the OpenVPN for Android app."}),"\n",(0,t.jsx)(n.li,{children:'Tap on "Add a tunnel".'}),"\n",(0,t.jsx)(n.li,{children:"Select the option that fits you best to import the credentials: Scan QR code, Import file or Paste from clipboard to an empty profile."}),"\n"]}),(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/wireguard_ios_tunnel.jpeg",alt:"Import file in iPhone",style:{width:"20em"}})})]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsxs)("summary",{children:[" ",(0,t.jsx)("b",{children:"Linux"})]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Create a file for your credentials: ",(0,t.jsx)(n.code,{children:"sudo nano /etc/wireguard/wg0.conf"})]}),"\n",(0,t.jsx)(n.li,{children:"Paste your credentials there and save the file (Ctrl+Shift+V, Ctrl+O, Ctrl+X)."}),"\n",(0,t.jsxs)(n.li,{children:["Activate the tunnel: ",(0,t.jsx)(n.code,{children:"sudo wg-quick up wg0"})]}),"\n"]}),(0,t.jsx)(n.admonition,{title:"Tunnel Deactivation",type:"note",children:(0,t.jsxs)(n.p,{children:["To deactivate the tunnel, execute the command: ",(0,t.jsx)(n.code,{children:"sudo wg-quick down wg0"}),"."]})})]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:(0,t.jsx)("b",{children:"macOS"})}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"In the list of Applications, search for WireGuard and launch it."}),"\n",(0,t.jsx)(n.li,{children:'Click on "Manage Tunnels".'}),"\n",(0,t.jsx)(n.li,{children:'Click on the "+" button.'}),"\n",(0,t.jsx)(n.li,{children:'Select "Add empty tunnel".'}),"\n",(0,t.jsx)(n.li,{children:"Paste the credentials you obtained earlier."}),"\n",(0,t.jsx)(n.li,{children:'Give a name to this profile and click on "Save".'}),"\n",(0,t.jsx)(n.li,{children:'Click on "Activate" to connect to your Dappnode.'}),"\n"]}),(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/wireguard_macos_tunnel.png",alt:"Manage tunnels in macOS",style:{width:"40em"}})}),(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/wireguard_macos_credentials.png",alt:"Credentials in macOS",style:{width:"40em"}})})]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:(0,t.jsx)("b",{children:"Windows"})}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Launch the OpenVPN for Windows app."}),"\n",(0,t.jsx)(n.li,{children:'Click on "Add Tunnel".'}),"\n",(0,t.jsx)(n.li,{children:"Paste the credentials you obtained earlier and save."}),"\n",(0,t.jsx)(n.li,{children:"Activate the tunnel."}),"\n"]}),(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/wireguard_windows.png",alt:"Import file in Windows",style:{width:"40em"}})}),(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/wireguard_windows_tunnel.png",alt:"Import file in Windows",style:{width:"40em"}})}),(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/img/wireguard_windows_activate.png",alt:"Import file in Windows",style:{width:"40em"}})})]}),"\n",(0,t.jsx)("br",{}),"\n",(0,t.jsx)(n.admonition,{title:"Testing Your Connection",type:"tip",children:(0,t.jsxs)(n.p,{children:["Once connected, you can directly type ",(0,t.jsx)(n.a,{href:"http://my.dappnode",children:"http://my.dappnode"})," in your browser to access the Dappmanager."]})})]})}function p(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},76773:(e,n,i)=>{i.d(n,{A:()=>r});const r=i.p+"assets/images/vpn-1-6287a68b939ea706930361adde9259e2.png"},28453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>o});var r=i(96540);const t={},l=r.createContext(t);function s(e){const n=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),r.createElement(l.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/e5aefb32.3f6dec77.js b/assets/js/e5aefb32.3f6dec77.js
new file mode 100644
index 000000000..c9c3301fc
--- /dev/null
+++ b/assets/js/e5aefb32.3f6dec77.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[3276],{58539:a=>{a.exports=JSON.parse('{"tag":{"label":"facebook","permalink":"/blog/tags/facebook","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/facebook","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/e7ae4afa.9f36bc90.js b/assets/js/e7ae4afa.9f36bc90.js
new file mode 100644
index 000000000..4c8c20945
--- /dev/null
+++ b/assets/js/e7ae4afa.9f36bc90.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5199],{94992:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"user/packages/ethclassic","title":"Ethereum Classic","description":"Introducing Ethereum Classic: Preserving Blockchain Principles","source":"@site/docs/user/packages/ethclassic.md","sourceDirName":"user/packages","slug":"/user/packages/ethclassic","permalink":"/docs/user/packages/ethclassic","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/packages/ethclassic.md","tags":[],"version":"current","frontMatter":{"title":"Ethereum Classic","llm_description":"Running Ethereum Classic nodes on Dappnode to support blockchain immutability principles."},"sidebar":"userSidebar","previous":{"title":"Bitcoin","permalink":"/docs/user/packages/bitcoin"},"next":{"title":"Avalanche","permalink":"/docs/user/packages/avalanche"}}');var i=s(74848),c=s(28453);const r={title:"Ethereum Classic",llm_description:"Running Ethereum Classic nodes on Dappnode to support blockchain immutability principles."},a="Ethereum Classic",o={},l=[{value:"Introducing Ethereum Classic: Preserving Blockchain Principles",id:"introducing-ethereum-classic-preserving-blockchain-principles",level:2},{value:"Ethereum Classic on Dappnode: Supporting Decentralization",id:"ethereum-classic-on-dappnode-supporting-decentralization",level:2}];function p(e){const n={h1:"h1",h2:"h2",header:"header",p:"p",...(0,c.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"ethereum-classic",children:"Ethereum Classic"})}),"\n",(0,i.jsx)(n.h2,{id:"introducing-ethereum-classic-preserving-blockchain-principles",children:"Introducing Ethereum Classic: Preserving Blockchain Principles"}),"\n",(0,i.jsx)(n.p,{children:"Ethereum Classic, a steadfast blockchain, emerged from the Ethereum chain split, committed to upholding the unwavering principles of blockchain immutability. Ethereum Classic champions the preservation of transaction history and decentralized governance."}),"\n",(0,i.jsx)(n.h2,{id:"ethereum-classic-on-dappnode-supporting-decentralization",children:"Ethereum Classic on Dappnode: Supporting Decentralization"}),"\n",(0,i.jsx)(n.p,{children:"Step into the Ethereum Classic universe and become a steward of its principles. Ethereum Classic\u2019s commitment to blockchain origins offers a space for decentralized ideals to thrive. Through an Ethereum Classic node on Dappnode, you contribute to the preservation of an ecosystem where code remains law and history remains unaltered."})]})}function u(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var t=s(96540);const i={},c=t.createContext(i);function r(e){const n=t.useContext(c);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(c.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/e7fcc526.c2449a73.js b/assets/js/e7fcc526.c2449a73.js
new file mode 100644
index 000000000..39b2ffc0d
--- /dev/null
+++ b/assets/js/e7fcc526.c2449a73.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[7290],{7388:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>c,frontMatter:()=>i,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"user/staking/ethereum/dvt-technologies/ssv-network","title":"SSV Distributed Validator package for Dappnode","description":"---","source":"@site/docs/user/staking/ethereum/dvt-technologies/ssv-network.md","sourceDirName":"user/staking/ethereum/dvt-technologies","slug":"/user/staking/ethereum/dvt-technologies/ssv-network","permalink":"/docs/user/staking/ethereum/dvt-technologies/ssv-network","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/ethereum/dvt-technologies/ssv-network.md","tags":[],"version":"current","frontMatter":{"title":"SSV Distributed Validator package for Dappnode","llm_description":"Register and run an SSV distributed validator operator node on Dappnode."},"sidebar":"userSidebar","previous":{"title":"Obol","permalink":"/docs/user/staking/ethereum/dvt-technologies/obol-network"},"next":{"title":"Diva","permalink":"/docs/user/staking/ethereum/dvt-technologies/diva"}}');var r=t(74848),o=t(28453);const i={title:"SSV Distributed Validator package for Dappnode",llm_description:"Register and run an SSV distributed validator operator node on Dappnode."},a="SSV Distributed Validator package for Dappnode",d={},l=[{value:"Introduction",id:"introduction",level:3},{value:"Requirements",id:"requirements",level:3},{value:"Registering a Dappnode SSV Node as an Operator",id:"registering-a-dappnode-ssv-node-as-an-operator",level:3},{value:"Exposing your DKG service",id:"exposing-your-dkg-service",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"ssv-distributed-validator-package-for-dappnode",children:"SSV Distributed Validator package for Dappnode"})}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.h3,{id:"introduction",children:(0,r.jsx)(n.strong,{children:"Introduction"})}),"\n",(0,r.jsxs)(n.p,{children:["SSV is a network of validators that use a decentralized network of operators to run their validators. This package allows you to run an SSV Operator Node. The package is available for ",(0,r.jsx)(n.a,{href:"http://my.dappnode/installer/dnp/ssv.dnp.dappnode.eth",children:"Ethereum Mainnet"})," and the ",(0,r.jsx)(n.a,{href:"http://my.dappnode/installer/dnp/ssv-holesky.dnp.dappnode.eth",children:"Holesky Testnet"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"A Distributed Validator is one or more logical 32 ETH validators being operated across a number of nodes that are all online simultaneously and that all control a subset of each validator\u2019s private keys. Dividing a validator across a group of nodes allows for fault tolerant validators that can remain online and validating despite a subset of its nodes experiencing an outage.\nThe SSV network allows both users and operators to diversify staking risks, optimize performance, and promote decentralization across the Ethereum consensus layer with a wide range of configuration options."}),"\n",(0,r.jsx)(n.h3,{id:"requirements",children:(0,r.jsx)(n.strong,{children:"Requirements"})}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"The first thing you'll need to do is set up a fully-synced node. This can be done through the Stakers Menu in Dappnode by selecting:"}),"\n"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"1 Execution Client (Geth, Besu, Erigon or Nethermind)"}),"\n",(0,r.jsx)(n.li,{children:"1 Consensus Client (Prysm, Lighhouse, Lodestar, Teku or Nimbus)"}),"\n",(0,r.jsx)(n.li,{children:"MEV Boost (optional)"}),"\n"]}),"\n",(0,r.jsxs)(n.ol,{start:"2",children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Installing the SSV package for Dappnode. This can be done by visiting the ",(0,r.jsx)(n.a,{href:"http://my.dappnode/installer/dnp",children:"DAppStore"})," in the Dappnode UI and installing the SSV (Ethereum Mainnet) or SSV Holesky package."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Plus, you'll need to get the following information:"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Operator public key"}),": Shown in your SSV package's Info tab after installing it."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Operator fee"}),": The fee charged by the operator per each managed validator. You can find ",(0,r.jsx)(n.a,{href:"https://docs.ssv.network/learn/protocol-overview/tokenomics/fees",children:"more info about this"})," in the SSV documentation. Keep in mind this fee can be changed later on if needed."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"registering-a-dappnode-ssv-node-as-an-operator",children:(0,r.jsx)(n.strong,{children:"Registering a Dappnode SSV Node as an Operator"})}),"\n",(0,r.jsxs)(n.p,{children:["After successfully installing the SSV package, an operator must register it to the SSV Network in order to be discoverable by validators. You'll be able to do so in the SSV network ",(0,r.jsx)(n.a,{href:"https://app.ssv.network",children:"web app"}),"."]}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(n.p,{children:"The wallet address used to register the operator is the only address that will hold management permissions for it, so make sure you keep it safe!"})}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Make sure to connect your Web3 wallet with the WebApp, and that the address corresponds with the one you want to manage your Operators with."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["If you are connecting for the first time, you should see a screen like the image below. Select ",(0,r.jsx)(n.em,{children:"Join as Operator"}),".\n",(0,r.jsx)(n.img,{alt:"SSV-Launchpad1",src:t(81958).A+"",width:"2304",height:"847"})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the following screen, select ",(0,r.jsx)(n.em,{children:"Register Operator"}),".\n",(0,r.jsx)(n.img,{alt:"SSV-Launchpad2",src:t(42036).A+"",width:"2304",height:"795"})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["The next screen will ask you to input the Operator's public key and provide a confirmation of the Operator owner address. As mentioned earlier, this Operator's public key is shown in your SSV package's Info tab after installing it.\n",(0,r.jsx)(n.img,{alt:"Dappnode-SSV1",src:t(18804).A+"",width:"2846",height:"1500"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{type:"caution",children:(0,r.jsx)(n.p,{children:"Please verify once more that the owner address correspond to the wallet address you want to manage your operators with."})}),"\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.em,{children:"Next"})," when ready."]}),"\n",(0,r.jsxs)(n.ol,{start:"5",children:["\n",(0,r.jsxs)(n.li,{children:["In the following screen you'll be asked to set the Operator Fee, which is the fee charged by the operator per each managed validator. You can find ",(0,r.jsx)(n.a,{href:"https://docs.ssv.network/learn/protocol-overview/tokenomics/fees",children:"more info about this"})," in the SSV documentation. Keep in mind this fee can be changed later on if needed."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Enter a number and click ",(0,r.jsx)(n.em,{children:"Next"})," when ready.\n",(0,r.jsx)(n.img,{alt:"SSV-Launchpad4",src:t(17794).A+"",width:"2304",height:"1059"})]}),"\n",(0,r.jsxs)(n.ol,{start:"6",children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["This confirmation screen presents a recap of the information input so far. Double check everything and click ",(0,r.jsx)(n.em,{children:"Register Operator"})," when ready. This will generate a blockchain transaction you'll need to confirm to complete the Operator registration.\n",(0,r.jsx)(n.img,{alt:"SSV-Launchpad5",src:t(91947).A+"",width:"2304",height:"946"})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Once the transaction goes through your Operator is successfully registered, and stakers could now choose it to operate their validators.\n",(0,r.jsx)(n.img,{alt:"SSV-Launchpad7",src:t(84377).A+"",width:"2304",height:"1031"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{type:"warning",children:(0,r.jsx)(n.p,{children:"In SSV you may or you may not be an operator in the cluster where you'll be validating. Keep this in mind for good security practices when splitting validator keys."})}),"\n",(0,r.jsx)(n.h3,{id:"exposing-your-dkg-service",children:"Exposing your DKG service"}),"\n",(0,r.jsxs)(n.p,{children:["If you want to run the ",(0,r.jsx)(n.code,{children:"dkg"})," service, make sure the operator is registered in the SSV network and check the service is not stopped in the ",(0,r.jsx)(n.a,{href:"http://my.dappnode/packages/my/ssv-holesky.dnp.dappnode.eth/info",children:"SSV Info Tab"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Add your node as a DKG endpoint in the ",(0,r.jsx)(n.a,{href:"https://app.ssv.network/",children:"SSV App Operator Config"}),". You must set: ",(0,r.jsx)(n.code,{children:"http://:14515"}),". Make sure your ",(0,r.jsx)(n.code,{children:"14515"})," port is open in your router setup."]}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsxs)(n.p,{children:["You can get your public IP by clicking on the avatar in the upper-right corner of the Dappnode UI. If you're having trouble using your public IP, you can also use your Dappnode's dynDNS domain in the same format: ",(0,r.jsx)(n.code,{children:"http://:14515"}),"."]})}),"\n",(0,r.jsx)(n.admonition,{title:"It's important that you understand that the requirements of the DV node runner are not the same as a Solo Stakers'. This technology facilitates the creation of Distributed Validators between a group of independent people. This means you are placing significant trust in the participants you'll run this Distributed Validator with.",type:"tip",children:(0,r.jsx)(n.p,{children:"You need to ensure every operator in the Cluster is competent and trustworthy before sharing this responsibility."})}),"\n",(0,r.jsxs)(n.p,{children:["If you have any questions, don't hesitate to drop by the ",(0,r.jsx)(n.a,{href:"https://discord.gg/dappnode",children:"Dappnode Discord server"}),"."]})]})}function c(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},18804:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/dappnode-ssv1-950c580e50f6f6f677341512ce02bd75.png"},81958:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/registering_operator_0-e647e1e4829436efc11a050874d93a09.png"},42036:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/registering_operator_2-38c04daca0578311df35d8deb7cb0611.png"},17794:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/registering_operator_4-29fc3b3d2323081a17696a69e65e0b72.png"},91947:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/registering_operator_5-a32b9a74cd2e40125d144a64ba459e3e.png"},84377:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/registering_operator_7-78eba980f52e82ad4d8e2bd4cf0af1c5.png"},28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(96540);const r={},o=s.createContext(r);function i(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/ebe6ca12.8e94509d.js b/assets/js/ebe6ca12.8e94509d.js
new file mode 100644
index 000000000..b89058844
--- /dev/null
+++ b/assets/js/ebe6ca12.8e94509d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[738],{29820:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"dev/github-actions/standard-packages","title":"Standard Packages CI","description":"Standard Dappnode packages (e.g., Rotki, IPFS) use a straightforward CI workflow consisting of two main GitHub Actions: upstream version checking and build/release automation.","source":"@site/docs/dev/github-actions/standard-packages.md","sourceDirName":"dev/github-actions","slug":"/dev/github-actions/standard-packages","permalink":"/docs/dev/github-actions/standard-packages","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dev/github-actions/standard-packages.md","tags":[],"version":"current","frontMatter":{"title":"Standard Packages CI","sidebar_label":"Standard Packages","llm_description":"GitHub Actions workflows for standard Dappnode packages including upstream version checking and release automation."},"sidebar":"devSidebar","previous":{"title":"Overview","permalink":"/docs/dev/github-actions/overview"},"next":{"title":"Overview","permalink":"/docs/dev/github-actions/staker-packages/overview"}}');var t=s(74848),r=s(28453);const i={title:"Standard Packages CI",sidebar_label:"Standard Packages",llm_description:"GitHub Actions workflows for standard Dappnode packages including upstream version checking and release automation."},d="Standard Packages CI",o={},c=[{value:"1. Auto Check for Upstream Updates (auto_check.yml)",id:"1-auto-check-for-upstream-updates-auto_checkyml",level:2},{value:"Workflow File",id:"workflow-file",level:3},{value:"Features",id:"features",level:3},{value:"2. Main Build and Pre-release (main.yml)",id:"2-main-build-and-pre-release-mainyml",level:2},{value:"Workflow File",id:"workflow-file-1",level:3},{value:"Features",id:"features-1",level:3}];function l(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"standard-packages-ci",children:"Standard Packages CI"})}),"\n",(0,t.jsx)(n.p,{children:"Standard Dappnode packages (e.g., Rotki, IPFS) use a straightforward CI workflow consisting of two main GitHub Actions: upstream version checking and build/release automation."}),"\n",(0,t.jsxs)(n.h2,{id:"1-auto-check-for-upstream-updates-auto_checkyml",children:["1. Auto Check for Upstream Updates (",(0,t.jsx)(n.code,{children:"auto_check.yml"}),")"]}),"\n",(0,t.jsx)(n.p,{children:"This action checks if there's an available update from the upstream repository. If an update is found, it creates a Pull Request with the new version."}),"\n",(0,t.jsx)(n.h3,{id:"workflow-file",children:"Workflow File"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Filename:"})," ",(0,t.jsx)(n.code,{children:"auto_check.yml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'name: Bump upstream version\n\non:\n schedule:\n - cron: "00 */4 * * *"\n push:\n branches:\n - "master"\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v3\n - run: npx @dappnode/dappnodesdk github-action bump-upstream\n env:\n GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n PINATA_API_KEY: ${{ secrets.PINATA_API_KEY }}\n PINATA_SECRET_API_KEY: ${{ secrets.PINATA_SECRET_API_KEY }}\n'})}),"\n",(0,t.jsx)(n.h3,{id:"features",children:"Features"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Scheduled Runs"}),": The action runs every 4 hours (as per the cron setting)."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Environment Variables"}),": Uses ",(0,t.jsx)(n.code,{children:"GITHUB_TOKEN"})," for authentication, and ",(0,t.jsx)(n.code,{children:"PINATA_API_KEY"})," and ",(0,t.jsx)(n.code,{children:"PINATA_SECRET_API_KEY"})," for interfacing with the IPFS pinning service Pinata."]}),"\n"]}),"\n",(0,t.jsxs)(n.h2,{id:"2-main-build-and-pre-release-mainyml",children:["2. Main Build and Pre-release (",(0,t.jsx)(n.code,{children:"main.yml"}),")"]}),"\n",(0,t.jsx)(n.p,{children:"This action builds the Dappnode package and creates a pre-release that's ready to be published."}),"\n",(0,t.jsx)(n.h3,{id:"workflow-file-1",children:"Workflow File"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Filename:"})," ",(0,t.jsx)(n.code,{children:"main.yml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'name: "Main"\non:\n pull_request:\n push:\n branches:\n - "main"\n - "master"\n - "v[0-9]+.[0-9]+.[0-9]+"\n paths-ignore:\n - "README.md"\n\njobs:\n build-test:\n runs-on: ubuntu-latest\n name: Build test\n if: github.event_name != \'push\'\n steps:\n - uses: actions/checkout@v3\n - run: npx @dappnode/dappnodesdk build --skip_save\n\n release:\n name: Release\n runs-on: ubuntu-latest\n if: github.event_name == \'push\'\n steps:\n - uses: actions/checkout@v3\n - name: Publish\n run: npx @dappnode/dappnodesdk publish patch --dappnode_team_preset\n env:\n GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n DEVELOPER_ADDRESS: "0xf35960302a07022aba880dffaec2fdd64d5bf1c1"\n'})}),"\n",(0,t.jsx)(n.h3,{id:"features-1",children:"Features"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Branch Filters"}),": The action only triggers on the ",(0,t.jsx)(n.code,{children:"main"}),", ",(0,t.jsx)(n.code,{children:"master"}),", and version tags (e.g., ",(0,t.jsx)(n.code,{children:"v1.0.0"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Paths Ignore"}),": Ignores changes solely related to ",(0,t.jsx)(n.code,{children:"README.md"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Conditional Runs"}),": Different steps are executed based on the event that triggered the workflow (e.g., push event or pull request)."]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>d});var a=s(96540);const t={},r=a.createContext(t);function i(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/ed77d0ad.5018516d.js b/assets/js/ed77d0ad.5018516d.js
new file mode 100644
index 000000000..4553a4eff
--- /dev/null
+++ b/assets/js/ed77d0ad.5018516d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5273],{57965:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"user/staking/ethereum/lsd-pools/rocketpool","title":"Rocketpool","description":"---","source":"@site/docs/user/staking/ethereum/lsd-pools/rocketpool.md","sourceDirName":"user/staking/ethereum/lsd-pools","slug":"/user/staking/ethereum/lsd-pools/rocketpool","permalink":"/docs/user/staking/ethereum/lsd-pools/rocketpool","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/ethereum/lsd-pools/rocketpool.md","tags":[],"version":"current","frontMatter":{"title":"Rocketpool","llm_description":"Run Rocketpool minipools on Dappnode with as little as 8 or 16 ETH."},"sidebar":"userSidebar","previous":{"title":"Notifications & Warnings","permalink":"/docs/user/staking/ethereum/lsd-pools/lido/notifications"},"next":{"title":"Stakewise","permalink":"/docs/user/staking/ethereum/lsd-pools/stakewise"}}');var s=o(74848),i=o(28453);const r={title:"Rocketpool",llm_description:"Run Rocketpool minipools on Dappnode with as little as 8 or 16 ETH."},l="Rocketpool",a={},c=[{value:"Rocketpool Overview",id:"rocketpool-overview",level:3},{value:"Package Key Features",id:"package-key-features",level:3},{value:"First Steps to Start a Minipool with Rocketpool and Dappnode",id:"first-steps-to-start-a-minipool-with-rocketpool-and-dappnode",level:3}];function d(e){const n={a:"a",h1:"h1",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"rocketpool",children:"Rocketpool"})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h3,{id:"rocketpool-overview",children:(0,s.jsx)(n.strong,{children:"Rocketpool Overview"})}),"\n",(0,s.jsx)(n.p,{children:'Rocketpool is a decentralized Ethereum staking solution that allows users to earn rewards by staking their Ether (ETH). It\'s designed to be inclusive, allowing those without the full 32 ETH required for an Ethereum validator to be able to participate. Rocketpool achieves this through its innovative "minipool" concept, which facilitates pooled staking among multiple participants.'}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h3,{id:"package-key-features",children:(0,s.jsx)(n.strong,{children:"Package Key Features"})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Decentralized Staking:"})," The Rocketpool package ensures that staking remains decentralized by using your Dappnode's local Ethereum node, safeguarding the core principles of the Ethereum network. Rocketpool also operates on smart contracts, ensuring that operations are transparent, auditable, and free from centralized control."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Minipools:"})," Users can start a minipool with as little as 16 or 8 ETH, allowing for broader participation in Ethereum's block creation."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Integrated with DappNode:"})," Easy setup, monitoring, and management of Rocketpool directly from your Dappnode interface."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h3,{id:"first-steps-to-start-a-minipool-with-rocketpool-and-dappnode",children:(0,s.jsx)(n.strong,{children:"First Steps to Start a Minipool with Rocketpool and Dappnode"})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Package Installation:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"In your Dappnode's UI, navigate to the DAppStore."}),"\n",(0,s.jsxs)(n.li,{children:["Find the ",(0,s.jsx)(n.a,{href:"http://my.dappnode/installer/dnp/rocketpool.dnp.dappnode.eth",children:"Rocketpool package"}),"."]}),"\n",(0,s.jsx)(n.li,{children:"Click 'Install'. Once installed, the Rocketpool package should appear in your installed packages list."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Setting up the Environment:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Ensure you're running a full, synced Ethereum node (Execution client + Consensus client)."}),"\n",(0,s.jsxs)(n.li,{children:["If you are not running a full Ethereum node yet, go to the ",(0,s.jsx)(n.a,{href:"http://my.dappnode/stakers/ethereum",children:"Stakers Menu"}),", select your clients and apply the configuration to start synchronization."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Starting a Minipool:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Navigate to the Rocketpool package dashboard."}),"\n",(0,s.jsx)(n.li,{children:"Choose the amount of ETH you wish to stake. Remember, you can start a minipool with as little as 16 or 8 ETH."}),"\n",(0,s.jsx)(n.li,{children:"Follow the on-screen instructions to initialize your minipool."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Funding your Minipool:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Send the amount of ETH you\u2019ve chosen to the provided address. Make sure you keep track of this address, as it will be the address of your minipool."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Monitoring and Management:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Once your minipool is active, you can monitor its performance, rewards, and other details with Dappnode's ",(0,s.jsx)(n.a,{href:"/docs/user/packages/dms",children:"DMS"}),"."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.p,{children:"It's essential to remember that while Rocketpool simplifies the staking process, it's crucial to understand the risks involved. Always make sure to do thorough research and ensure the security of your investments."})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},28453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>l});var t=o(96540);const s={},i=t.createContext(s);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/eef43c71.47d7e714.js b/assets/js/eef43c71.47d7e714.js
new file mode 100644
index 000000000..b9d80645f
--- /dev/null
+++ b/assets/js/eef43c71.47d7e714.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[221],{90352:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>h,contentTitle:()=>r,default:()=>c,frontMatter:()=>a,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"user/staking/gnosis-chain/solo","title":"Gnosis Chain","description":"Gnosis Chain stands as a sentinel, functioning as a canary chain for Ethereum. It\'s operated and nurtured by the GnosisDAO community. With over 10% of its validators being home stakers via Dappnode, it\'s a testament to its popularity and accessibility.","source":"@site/docs/user/staking/gnosis-chain/solo.md","sourceDirName":"user/staking/gnosis-chain","slug":"/user/staking/gnosis-chain/solo","permalink":"/docs/user/staking/gnosis-chain/solo","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/staking/gnosis-chain/solo.md","tags":[],"version":"current","frontMatter":{"title":"Gnosis Chain","llm_description":"Complete guide to solo staking on Gnosis Chain: install packages, generate keys, deposit 1 GNO."},"sidebar":"userSidebar","previous":{"title":"Diva","permalink":"/docs/user/staking/ethereum/dvt-technologies/diva"},"next":{"title":"Gnosis Incentive Program","permalink":"/docs/user/staking/gnosis-chain/incentive-program"}}');var i=s(74848),o=s(28453);const a={title:"Gnosis Chain",llm_description:"Complete guide to solo staking on Gnosis Chain: install packages, generate keys, deposit 1 GNO."},r="Gnosis Chain",h={},d=[{value:"Joining the Gnosis Chain as a Validator",id:"joining-the-gnosis-chain-as-a-validator",level:2},{value:"1. Install the necessary packages on Dappnode",id:"1-install-the-necessary-packages-on-dappnode",level:2},{value:"2. Creating validator keys for Gnosis Chain",id:"2-creating-validator-keys-for-gnosis-chain",level:2},{value:"3: Deposit GNO into the Gnosis Chain deposit contract",id:"3-deposit-gno-into-the-gnosis-chain-deposit-contract",level:2},{value:"Withdrawing my GNO",id:"withdrawing-my-gno",level:2},{value:"1. Exit the validator from the Dappnode UI",id:"1-exit-the-validator-from-the-dappnode-ui",level:3},{value:"2. Claim your GNO from the deposit contract",id:"2-claim-your-gno-from-the-deposit-contract",level:3}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"gnosis-chain",children:"Gnosis Chain"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Gnosis Chain"})," stands as a sentinel, functioning as a canary chain for Ethereum. It's operated and nurtured by the ",(0,i.jsx)(n.strong,{children:"GnosisDAO community"}),". With over 10% of its validators being home stakers via Dappnode, it's a testament to its popularity and accessibility."]}),"\n",(0,i.jsx)(n.h2,{id:"joining-the-gnosis-chain-as-a-validator",children:"Joining the Gnosis Chain as a Validator"}),"\n",(0,i.jsxs)(n.p,{children:["Staking on the Gnosis Chain is both easy and economical. All it takes is ",(0,i.jsx)(n.strong,{children:"1 GNO"})," to kickstart your journey as a Gnosis Chain validator. This low barrier to entry ensures that anyone, regardless of their financial position, can participate actively in the network as a block proposer. You will need to do 3 main tasks, broken down below:"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Install the necessary packages on Dappnode"}),"\n",(0,i.jsx)(n.li,{children:"Create validator keys for Gnosis Chain"}),"\n",(0,i.jsx)(n.li,{children:"Deposit GNO into the Gnosis Beacon Chain deposit contract"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"1-install-the-necessary-packages-on-dappnode",children:"1. Install the necessary packages on Dappnode"}),"\n",(0,i.jsx)(n.p,{children:"Similar to Ethereum mainnet, Dappnode makes it very easy to set up you Gnosis Chain validator. You need to be running a Gnosis Chain node in order to validate. A node consists of an Execution Layer Client (EL) and a Consensus Layer Client (CL) + Validator."}),"\n",(0,i.jsx)(n.p,{children:"Here's what the Stakers UI looks like for Gnosis Chain:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Stakers",src:s(5671).A+"",width:"2056",height:"1586"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Execution Client"})," (Choose one):","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Nethermind Xdai (Available now)"}),"\n",(0,i.jsx)(n.li,{children:"Gnosis Erigon (Coming soon!)"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Consensus Client"})," (Choose one):","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Lighthouse Gnosis"}),"\n",(0,i.jsx)(n.li,{children:"Teku Gnosis"}),"\n",(0,i.jsx)(n.li,{children:"Lodestar Gnosis"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.strong,{children:"Web3Signer Gnosis"})}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"After you\u2019ve chosen from the 3 columns (EL, CL and Remote Signer), click on accept changes."}),"\n",(0,i.jsx)(n.admonition,{title:"Checkpoint Sync is your friend for syncing Consensus Clients",type:"tip",children:(0,i.jsx)(n.p,{children:'Execution clients take a long time to sync. Hence, once you start staking with one you will most likely stick with it. However, you can switch consensus clients at any time thanks to the magic of "checkpoint sync". Make sure to toggle the "use checksync" option when installing your consensus client, and you can change at any point from one to another with barely any downtime.'})}),"\n",(0,i.jsx)(n.p,{children:"After syncing your consensus client, the execution client starts its synchronization process. This can take a few hours, so patience is essential. For clarity or troubleshooting, consult your execution client's logs."}),"\n",(0,i.jsx)(n.h2,{id:"2-creating-validator-keys-for-gnosis-chain",children:"2. Creating validator keys for Gnosis Chain"}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["This guide will use the ",(0,i.jsx)(n.a,{href:"https://github.com/alexpeterson91/Gnosis-Wagyu-Key-Gen/releases",children:"Gnosis Wagyu keygen tool"})," to generate your validator keys. This is a fork of the ",(0,i.jsx)(n.a,{href:"https://github.com/stake-house/wagyu-key-gen/releases",children:"Wagyu Keygen tool"})," for Ethereum mainnet."]})}),"\n",(0,i.jsxs)(n.admonition,{title:"What are all these keys?",type:"caution",children:[(0,i.jsxs)(n.p,{children:["\ud83d\udd12 ",(0,i.jsx)(n.strong,{children:"Validator keys"})," will be online (stored in your Dappnode) and signing the blocks of the Gnosis Chain. You will create them from a ",(0,i.jsx)(n.strong,{children:"mnemonic phrase"}),", which is important to keep safe as it's the ",(0,i.jsx)(n.strong,{children:"only way"})," to regenerate these validator keys if you lose them."]}),(0,i.jsxs)(n.p,{children:["\ud83d\udee1\ufe0f The damage of getting your ",(0,i.jsx)(n.strong,{children:"mnemonic phrase"})," compromised has been reduced dramatically since withdrawals have been activated, as you can create the keystores with a set withdrawal address and nobody can change that after, even if they get to your ",(0,i.jsx)(n.strong,{children:"mnemonic phrase"}),". Nevertheless, if you lose the keystore and the mnemonic, you will not be able to sign an exit message and you will be forced to validate forever."]}),(0,i.jsxs)(n.p,{children:["\ud83d\udd11 ",(0,i.jsx)(n.strong,{children:"Withdrawal address"})," this brings us to the withdrawal address, which is the address that will receive all the balance above 1 GNO while your validator is active, and all your balance above 0 GNO when you exit the validator set. You need to keep this address safe as it's where your GNO will go, and cannot be changed."]})]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Download the latest release of the Gnosis Wagyu Key Gen from ",(0,i.jsx)(n.a,{href:"https://github.com/alexpeterson91/Gnosis-Wagyu-Key-Gen/releases",children:"here"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Disconnect from the internet, so it will be harder to have any leaks on the information you use, and open the Gnosis Wagyu keygen tool. You will be given 2 options, either create a new mnemonic or import an existing mnemonic. The GUI is very user friendly and explains all steps along the way."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Gnosis Wagyu - 1st screen",src:s(11683).A+"",width:"1865",height:"1441"})}),"\n",(0,i.jsx)(n.p,{children:"You will be shown your Mnemonic Phrase. Keep it safe, as it is used to recreate the validator keys! We recommend copying it in an encrypted volume or in paper stored in a safe place."}),"\n",(0,i.jsx)(n.p,{children:"To ensure that you have copied it somewhere, it will ask you to type it again."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Gnosis Wagyu - 2nd screen",src:s(58472).A+"",width:"1898",height:"1438"})}),"\n",(0,i.jsx)(n.p,{children:"Choose 1) How many keys you want to create, 2) the password to protect the keys and 3) the Withdrawal Address where your Consensus Layer profits will be sent."}),"\n",(0,i.jsx)(n.admonition,{title:"GNO Incentive program:",type:"warning",children:(0,i.jsxs)(n.p,{children:["If you are running this program to generate keys within the context of the DGNO Incentive program, make sure to generate the right amount of validators ",(0,i.jsx)(n.strong,{children:"3"})," (",(0,i.jsx)(n.strong,{children:"4"})," if you have participated in Dappcon program) and to fill in the ETH1 Withdrawal Address Field with the withdrawal address that has been provided. Also make sure to choose a directory that reflects the folder where you want the files to be saved."]})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Gnosis Wagyu - 3rd screen",src:s(89416).A+"",width:"1888",height:"1430"})}),"\n",(0,i.jsx)(n.p,{children:"Select a folder where to save the keys."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Gnosis Wagyu - 4th screen",src:s(83281).A+"",width:"1886",height:"1424"})}),"\n",(0,i.jsx)(n.p,{children:"Wait for the keys to be generated."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Gnosis Wagyu - 5th screen",src:s(78522).A+"",width:"1888",height:"1426"})}),"\n",(0,i.jsx)(n.p,{children:"And you are done! You will find your keys in the folder you selected."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Gnosis Wagyu - 6th screen",src:s(26275).A+"",width:"1886",height:"1430"})}),"\n",(0,i.jsx)(n.p,{children:"You are now done with the key generation process, and your generated keys and deposit data are in the folder/directory chosen, and displayed at the top of the final page."}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["\ud83d\udca1 *",(0,i.jsx)(n.code,{children:"Want to learn more about Ethereum keys and key generation?"}),"*\ud83d\udca1",(0,i.jsx)(n.a,{href:"https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/keys/#two-types-of-keys",children:"Learn more"})]})}),"\n",(0,i.jsx)(n.p,{children:"Now that you\u2019ve generated your deposit data and keystores, go ahead and upload your keystores to Web3Signer Gnosis, the package that you installed during step 1."}),"\n",(0,i.jsxs)(n.p,{children:["Return to the Dappnode UI and navigate to the Stakers > Gnosis Chain menu. Your Web3Signer will have a link saying ",(0,i.jsx)(n.code,{children:"Upload Keystores"})," . If it doesn\u2019t, make sure that you have waited enough time since step 1 for all the packages to be installed (around 5 minutes) and refresh the page."]}),"\n",(0,i.jsxs)(n.p,{children:["Then click on the ",(0,i.jsx)(n.code,{children:"Import Keystores"})," button on the lower part of the Web3Signer Gnosis UI."]}),"\n",(0,i.jsx)(n.p,{children:"Here browse for the keystore file(s) you generated in the previous step and enter them along with the password you chose to secure your keystores."}),"\n",(0,i.jsx)(n.p,{children:"You are now ready to fund these validator accounts and start validating!"}),"\n",(0,i.jsx)(n.h2,{id:"3-deposit-gno-into-the-gnosis-chain-deposit-contract",children:"3: Deposit GNO into the Gnosis Chain deposit contract"}),"\n",(0,i.jsx)(n.p,{children:"The final step is to fund your validator with 1 GNO necessary to register as a validator and start receiving validation work!"}),"\n",(0,i.jsx)(n.p,{children:"To do this, you will need to send 1 GNO to the Gnosis Chain deposit contract."}),"\n",(0,i.jsxs)(n.p,{children:["Follow the official instructions in the ",(0,i.jsx)(n.a,{href:"https://docs.gnosischain.com/node/manual/validator/deposit",children:"Gnosis Chain documentation"})," to deposit your GNO into the deposit contract."]}),"\n",(0,i.jsxs)(n.p,{children:["After the deposit is gone, you will be able to check the progress of your deposit by searching for your validator key in the ",(0,i.jsx)(n.a,{href:"https://gnosischa.in/",children:"Gnosis Beacon Chain Explorer"}),", which is a fork of the ",(0,i.jsx)(n.a,{href:"https://beaconcha.in/",children:"Ethereum Beaconcha.in"})," explorer. You can get a direct link to this by clicking on the ",(0,i.jsx)(n.code,{children:"View in Beaconcha.in"})," button in the upper, right corner of the Dappnode Web3signer Gnosis UI, where you uploaded the keystores."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Remember"}),": Embarking on the staking journey requires diligence. Always keep abreast of developments and make informed decisions."]}),"\n",(0,i.jsx)(n.h2,{id:"withdrawing-my-gno",children:"Withdrawing my GNO"}),"\n",(0,i.jsx)(n.p,{children:"Once you want to finish your staking journey, you will need to withdraw your GNO from the Gnosis Chain. This is a 2 step process of exiting the validator from the Dappnode UI and claiming the GNO from the deposit contract."}),"\n",(0,i.jsx)(n.admonition,{title:"Gnosis Chain withdrawals \u2260 Ethereum withdrawals",type:"info",children:(0,i.jsxs)(n.p,{children:["Because the native token of Gnosis Chain is xDAI (you pay fees in it), but the staking token is GNO, withdrawals work differently than in the Ethereum chain and do not happen automatically. You must claim your withdrawn tokens from the Deposit Contract. More info ",(0,i.jsx)(n.a,{href:"https://docs.gnosischain.com/node/management/withdrawals",children:"here"}),"."]})}),"\n",(0,i.jsx)(n.h3,{id:"1-exit-the-validator-from-the-dappnode-ui",children:"1. Exit the validator from the Dappnode UI"}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsxs)(n.p,{children:["It is recommended to update your withdrawal credentials to the ",(0,i.jsx)(n.code,{children:"0x01"})," type before exiting your validator. Updating your withdrawal credentials later, when your node is stopped, is more difficult. To check if you already have updated withdrawal credentials you can check your validators in the ",(0,i.jsx)(n.a,{href:"https://gnosischa.in/",children:"consensus explorer"}),", if your withdrawal address shows as an address that starts with a ",(0,i.jsx)(n.code,{children:"0x00"})," it means that your withdrawal address needs to be upgraded to a ",(0,i.jsx)(n.code,{children:"0x01"}),", please refer to the guide in the ",(0,i.jsx)(n.a,{href:"https://docs.gnosischain.com/node/management/withdrawals#how-to-change-the-withdrawal-credential",children:"Gnosis Chain documentation"}),". If your validator already shows a ",(0,i.jsx)(n.code,{children:"0x01"})," address, you DON'T need to follow these steps."]})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Gnosis Withdrawals",src:s(34747).A+"",width:"1884",height:"729"})}),"\n",(0,i.jsxs)(n.p,{children:["Navigate to the Stakers > Gnosis Chain menu and click on the ",(0,i.jsx)(n.code,{children:"Upload Keystores"})," button on the Web3Signer card.\nOnce you are in the Web3Signer UI, select the validators you want to exit and click on the ",(0,i.jsx)(n.code,{children:"Exit Validator"}),' button on the top right part of the UI.\nFollow the instructions and type "I want to exit", followed by ',(0,i.jsx)(n.code,{children:"Exit"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Now the message to exit will be broadcasted to the network."}),"\n",(0,i.jsx)(n.admonition,{title:"Withdrawal queue",type:"caution",children:(0,i.jsxs)(n.p,{children:["Your validator will not exit immediately. It will be queued to exit and you can track when it's due in the ",(0,i.jsx)(n.a,{href:"https://gnosischa.in/",children:"Gnosis Beacon Chain Explorer"}),".\nEven then, you will need to claim your GNO from the deposit contract as per the next step."]})}),"\n",(0,i.jsx)(n.h3,{id:"2-claim-your-gno-from-the-deposit-contract",children:"2. Claim your GNO from the deposit contract"}),"\n",(0,i.jsx)(n.p,{children:"As soon as your withdrawal has been processed by the Beacon Chain, you will be able to claim your GNO from the deposit contract. You can claim from any of your wallets that hold xDAI to pay gas fees."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Go to the ",(0,i.jsx)(n.a,{href:"https://gnosisscan.io/address/0x0b98057ea310f4d31f2a452b414647007d1645d9#writeProxyContract#F3",children:"Gnosis Chain Deposit Contract page in Gnosisscan.io"})," and navigate to the ",(0,i.jsx)(n.code,{children:"Write as Proxy"})," tab,"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Connect your wallet with the ",(0,i.jsx)(n.code,{children:"Connect to Web3"})," button and then locate the ",(0,i.jsx)(n.code,{children:"3. claimWithdrawal"})," function."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Type your withdrawal address in the field and click ",(0,i.jsx)(n.code,{children:"Write"}),". A transaction should trigger on your wallet. Approve it and wait for it to be included in a block."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Claiming from the Smart Contract",src:s(37184).A+"",width:"1392",height:"575"})}),"\n",(0,i.jsx)(n.p,{children:"Voil\xe0! Your GNO will appear on your withdrawal address!"})]})}function c(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},11683:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/gnosis-wagyu1-c67da68262d9f9650ee5eb477a7b2589.png"},58472:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/gnosis-wagyu2-e9f88c7e6ee959624f14fcb8516753c6.png"},5671:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/gnosischain-staking-f003eff94194ebf3febf7e770f7e538f.png"},34747:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/gnosiswithdrawals1-3319c9298d63c9bdc640b84a94bc4db3.png"},37184:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/gnosiswithdrawals2-a2f7f743a00c32f88e9b341c9f7b0e58.png"},89416:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/wagyu4-0673a83463eb844993339ecfdcc59b41.png"},83281:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/wagyu5-644261c1588e13ba1177d70aef9ecf19.png"},78522:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/wagyu6-d5538d2bbd5a01f47d94c6c5b29b3abf.png"},26275:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/wagyu7-8c346a2c9519b98a530d1005a69247f2.png"},28453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>r});var t=s(96540);const i={},o=t.createContext(i);function a(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/ef41a71b.9a232afe.js b/assets/js/ef41a71b.9a232afe.js
new file mode 100644
index 000000000..9405e86c3
--- /dev/null
+++ b/assets/js/ef41a71b.9a232afe.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[5222],{25556:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>o,toc:()=>r});const o=JSON.parse('{"id":"user/install/dappnode-commands","title":"Dappnode commands","description":"Dappnode comes with a set of commands that can be used to manage the system. These commands can be used directly from the command line.","source":"@site/docs/user/install/dappnode-commands.md","sourceDirName":"user/install","slug":"/user/install/dappnode-commands","permalink":"/docs/user/install/dappnode-commands","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/install/dappnode-commands.md","tags":[],"version":"current","frontMatter":{"title":"Dappnode commands","llm_description":"Reference list of CLI commands: wifi, VPN credentials, status, start, and stop Dappnode."},"sidebar":"userSidebar","previous":{"title":"ARM","permalink":"/docs/user/install/arm"},"next":{"title":"Overview","permalink":"/docs/user/notifications/overview"}}');var d=s(74848),t=s(28453);const a={title:"Dappnode commands",llm_description:"Reference list of CLI commands: wifi, VPN credentials, status, start, and stop Dappnode."},i="Dappnode commands",c={},r=[];function p(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components},{Details:o}=n;return o||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.header,{children:(0,d.jsx)(n.h1,{id:"dappnode-commands",children:"Dappnode commands"})}),"\n",(0,d.jsx)(n.p,{children:"Dappnode comes with a set of commands that can be used to manage the system. These commands can be used directly from the command line."}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.img,{alt:"commands-welcome-message",src:s(82760).A+"",width:"1690",height:"672"})}),"\n",(0,d.jsx)(n.admonition,{type:"tip",children:(0,d.jsxs)(n.p,{children:["Go to the ",(0,d.jsx)(n.a,{href:"/docs/user/access-your-dappnode/terminal",children:"Access your Dappnode's terminal"})," section to learn more about how to access the terminal."]})}),"\n",(0,d.jsx)(n.p,{children:"Below is a list of available commands in Dappnode:"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.code,{children:"dappnode_help"}),": prints out this message"]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.code,{children:"dappnode_wifi"}),": get wifi credentials (SSID and password)"]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.code,{children:"dappnode_openvpn"}),": get Open VPN credentials"]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.code,{children:"dappnode_wireguard"}),": get Wireguard VPN credentials. Use ",(0,d.jsx)(n.code,{children:"dappnode_wireguard --help"})," for more info"]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.code,{children:"dappnode_connect"}),": check connectivity methods available in Dappnode"]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.code,{children:"dappnode_status"}),": get status of dappnode containers"]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.code,{children:"dappnode_start"}),": start dappnode containers"]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.code,{children:"dappnode_stop"}),": stop dappnode containers"]}),"\n"]}),"\n"]}),"\n",(0,d.jsx)(n.p,{children:"To run a command, enter it in your Dappnode terminal. For example:"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-bash",children:"dappnode_help\n"})}),"\n",(0,d.jsxs)(o,{children:[(0,d.jsx)("summary",{children:(0,d.jsx)("b",{children:'I get the error "command not found"'})}),(0,d.jsxs)(n.p,{children:["If you get the error ",(0,d.jsx)(n.code,{children:"command not found"})," when trying to execute a dappnode command, it means that the command is not available in your system. You need to load the dappnode profile as follows:"]}),(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-bash",children:"source /usr/src/dappnode/DNCORE/.dappnode_profile\n"})})]})]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(p,{...e})}):p(e)}},82760:(e,n,s)=>{s.d(n,{A:()=>o});const o=s.p+"assets/images/commands_welcome_message-222154c662349b505e3cc94f59951d79.png"},28453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>i});var o=s(96540);const d={},t=o.createContext(d);function a(e){const n=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:a(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/ef8b811a.67fe7d11.js b/assets/js/ef8b811a.67fe7d11.js
new file mode 100644
index 000000000..aad098db6
--- /dev/null
+++ b/assets/js/ef8b811a.67fe7d11.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8947],{56600:e=>{e.exports=JSON.parse('{"authors":[{"name":"Endilie Yacop Sucipto","title":"Maintainer of Docusaurus","url":"https://github.com/endiliey","imageURL":"https://github.com/endiliey.png","key":"endi","page":null,"count":1},{"name":"Yangshun Tay","title":"Front End Engineer @ Facebook","url":"https://github.com/yangshun","imageURL":"https://github.com/yangshun.png","key":"yangshun","page":null,"count":1},{"name":"S\xe9bastien Lorber","title":"Docusaurus maintainer","url":"https://sebastienlorber.com","imageURL":"https://github.com/slorber.png","key":"slorber","page":null,"count":2}]}')}}]);
\ No newline at end of file
diff --git a/assets/js/f4f34a3a.a594d2f0.js b/assets/js/f4f34a3a.a594d2f0.js
new file mode 100644
index 000000000..a69626042
--- /dev/null
+++ b/assets/js/f4f34a3a.a594d2f0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[3637],{17810:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>u});var s=o(41632),n=o(74848),r=o(28453);const a={slug:"mdx-blog-post",title:"MDX Blog Post",authors:["slorber"],tags:["docusaurus"]},l=void 0,c={authorsImageUrls:[void 0]},u=[];function i(e){const t={a:"a",admonition:"admonition",code:"code",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["Blog posts support ",(0,n.jsx)(t.a,{href:"https://docusaurus.io/docs/markdown-features",children:"Docusaurus Markdown features"}),", such as ",(0,n.jsx)(t.a,{href:"https://mdxjs.com/",children:"MDX"}),"."]}),"\n",(0,n.jsxs)(t.admonition,{type:"tip",children:[(0,n.jsx)(t.p,{children:"Use the power of React to create interactive blog posts."}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-js",children:"\n"})}),(0,n.jsx)("button",{onClick:()=>alert("button clicked!"),children:"Click me!"})]})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(i,{...e})}):i(e)}},28453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>l});var s=o(96540);const n={},r=s.createContext(n);function a(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),s.createElement(r.Provider,{value:t},e.children)}},41632:e=>{e.exports=JSON.parse('{"permalink":"/blog/mdx-blog-post","source":"@site/blog/2021-08-01-mdx-blog-post.mdx","title":"MDX Blog Post","description":"Blog posts support Docusaurus Markdown features, such as MDX.","date":"2021-08-01T00:00:00.000Z","tags":[{"inline":true,"label":"docusaurus","permalink":"/blog/tags/docusaurus"}],"readingTime":0.175,"hasTruncateMarker":false,"authors":[{"name":"S\xe9bastien Lorber","title":"Docusaurus maintainer","url":"https://sebastienlorber.com","imageURL":"https://github.com/slorber.png","key":"slorber","page":null}],"frontMatter":{"slug":"mdx-blog-post","title":"MDX Blog Post","authors":["slorber"],"tags":["docusaurus"]},"unlisted":false,"prevItem":{"title":"Welcome","permalink":"/blog/welcome"},"nextItem":{"title":"Long Blog Post","permalink":"/blog/long-blog-post"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/f557db91.567d5ada.js b/assets/js/f557db91.567d5ada.js
new file mode 100644
index 000000000..c2e19add1
--- /dev/null
+++ b/assets/js/f557db91.567d5ada.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[116],{51861:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>s,contentTitle:()=>d,default:()=>p,frontMatter:()=>a,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"dao/node-drop","title":"NODEdrop","description":"\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\\"","source":"@site/docs/dao/node-drop.md","sourceDirName":"dao","slug":"/dao/node-drop","permalink":"/docs/dao/node-drop","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/dao/node-drop.md","tags":[],"version":"current","frontMatter":{"title":"NODEdrop","llm_description":"NODEdrop airdrop program for early Dappnode supporters and community members."}}');var i=t(74848),r=t(28453);const a={title:"NODEdrop",llm_description:"NODEdrop airdrop program for early Dappnode supporters and community members."},d="NODEdrop",s={},u=[];function c(e){const o={h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"nodedrop",children:"NODEdrop"})}),"\n",(0,i.jsx)(o.p,{children:'"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."'})]})}function p(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},28453:(e,o,t)=>{t.d(o,{R:()=>a,x:()=>d});var n=t(96540);const i={},r=n.createContext(i);function a(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function d(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/f744a4d0.476133e5.js b/assets/js/f744a4d0.476133e5.js
new file mode 100644
index 000000000..42e70a109
--- /dev/null
+++ b/assets/js/f744a4d0.476133e5.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[1097],{3294:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"user/videos-and-tutorials/guides/connect-node","title":"How to Connect to My Blockchain Node","description":"When you\'ve set up your Dappnode, you might want to connect various applications to your blockchain node. This process can vary depending on which blockchain you\'ve selected. Below is a guide on how to do this:","source":"@site/docs/user/videos-and-tutorials/guides/connect-node.md","sourceDirName":"user/videos-and-tutorials/guides","slug":"/user/videos-and-tutorials/guides/connect-node","permalink":"/docs/user/videos-and-tutorials/guides/connect-node","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/videos-and-tutorials/guides/connect-node.md","tags":[],"version":"current","frontMatter":{"title":"How to Connect to My Blockchain Node","llm_description":"How to connect applications and Metamask to your Dappnode blockchain node via RPC."},"sidebar":"userSidebar","previous":{"title":"Crash Course","permalink":"/docs/user/videos-and-tutorials/crash-course"},"next":{"title":"Migrating from Avado","permalink":"/docs/user/videos-and-tutorials/guides/migrating-from-avado"}}');var s=o(74848),i=o(28453);const r={title:"How to Connect to My Blockchain Node",llm_description:"How to connect applications and Metamask to your Dappnode blockchain node via RPC."},c="How to Connect to My Blockchain Node",d={},a=[{value:"Ethereum Mainnet Node",id:"ethereum-mainnet-node",level:2},{value:"Other Nodes in Stakers tab",id:"other-nodes-in-stakers-tab",level:2},{value:"Connecting to Metamask",id:"connecting-to-metamask",level:2},{value:"Important Reminders",id:"important-reminders",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"how-to-connect-to-my-blockchain-node",children:"How to Connect to My Blockchain Node"})}),"\n",(0,s.jsx)(n.p,{children:"When you've set up your Dappnode, you might want to connect various applications to your blockchain node. This process can vary depending on which blockchain you've selected. Below is a guide on how to do this:"}),"\n",(0,s.jsx)(n.h2,{id:"ethereum-mainnet-node",children:"Ethereum Mainnet Node"}),"\n",(0,s.jsxs)(n.p,{children:["If you've selected an Ethereum mainnet node in ",(0,s.jsx)(n.strong,{children:"Repository > Ethereum"})," or ",(0,s.jsx)(n.strong,{children:"Stakers > Ethereum"}),", here's how to connect:"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"The Execution client you have selected will expose its RPC at:"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"http://fullnode.dappnode:8545\n"})}),"\n",(0,s.jsxs)(n.ol,{start:"2",children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Do note that this domain is only accessible when you're connected to Dappnode either via WiFi or VPN."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"If you intend to use the RPC externally (i.e., without needing to connect to Dappnode), you'll need to refer to our tutorial on How to expose an RPC externally."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"other-nodes-in-stakers-tab",children:"Other Nodes in Stakers tab"}),"\n",(0,s.jsx)(n.p,{children:"For blockchain nodes other than Ethereum mainnet:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Identify the specific network for your node, e.g., ",(0,s.jsx)(n.code,{children:"lukso"}),", ",(0,s.jsx)(n.code,{children:"gnosis"}),", or ",(0,s.jsx)(n.code,{children:"prater"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"The endpoint for these nodes will be:"}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"http://.fullnode.dappnode:8545\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Replace ",(0,s.jsx)(n.code,{children:""})," with your specific blockchain network name."]}),"\n",(0,s.jsxs)(n.ol,{start:"3",children:["\n",(0,s.jsxs)(n.li,{children:["Ensure that the node is correctly set in ",(0,s.jsxs)(n.strong,{children:["Stakers > ",(0,s.jsx)(n.code,{children:""})]}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"connecting-to-metamask",children:"Connecting to Metamask"}),"\n",(0,s.jsx)(n.p,{children:"To connect your node to Metamask:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"You will need to provide the Chain ID of the blockchain you're connecting to."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Chain IDs for various blockchains can be found at ",(0,s.jsx)(n.a,{href:"https://chainlist.org/",children:"Chainlist"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["In Metamask, navigate to ",(0,s.jsx)(n.strong,{children:"Settings > Networks > Add Network"}),". Input the RPC URL (",(0,s.jsx)(n.code,{children:"http://.fullnode.dappnode:8545"}),") and the Chain ID from Chainlist."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"important-reminders",children:"Important Reminders"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Your node needs to be fully synced to function correctly. This ensures that the latest state of the blockchain and its transactions are available for your applications."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Always ensure the safety and privacy of your Dappnode by not unnecessarily exposing ports or services that might be targets for malicious actors."}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},28453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>c});var t=o(96540);const s={},i=t.createContext(s);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/f81c1134.e3b852f3.js b/assets/js/f81c1134.e3b852f3.js
new file mode 100644
index 000000000..2dcc42664
--- /dev/null
+++ b/assets/js/f81c1134.e3b852f3.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8130],{77735:e=>{e.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"welcome","metadata":{"permalink":"/blog/welcome","source":"@site/blog/2021-08-26-welcome/index.md","title":"Welcome","description":"Docusaurus blogging features are powered by the blog plugin.","date":"2021-08-26T00:00:00.000Z","tags":[{"inline":true,"label":"facebook","permalink":"/blog/tags/facebook"},{"inline":true,"label":"hello","permalink":"/blog/tags/hello"},{"inline":true,"label":"docusaurus","permalink":"/blog/tags/docusaurus"}],"readingTime":0.405,"hasTruncateMarker":false,"authors":[{"name":"S\xe9bastien Lorber","title":"Docusaurus maintainer","url":"https://sebastienlorber.com","imageURL":"https://github.com/slorber.png","key":"slorber","page":null},{"name":"Yangshun Tay","title":"Front End Engineer @ Facebook","url":"https://github.com/yangshun","imageURL":"https://github.com/yangshun.png","key":"yangshun","page":null}],"frontMatter":{"slug":"welcome","title":"Welcome","authors":["slorber","yangshun"],"tags":["facebook","hello","docusaurus"]},"unlisted":false,"nextItem":{"title":"MDX Blog Post","permalink":"/blog/mdx-blog-post"}},"content":"[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog).\\n\\nSimply add Markdown files (or folders) to the `blog` directory.\\n\\nRegular blog authors can be added to `authors.yml`.\\n\\nThe blog post date can be extracted from filenames, such as:\\n\\n- `2019-05-30-welcome.md`\\n- `2019-05-30-welcome/index.md`\\n\\nA blog post folder can be convenient to co-locate blog post images:\\n\\n\\n\\nThe blog supports tags as well!\\n\\n**And if you don\'t want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config."},{"id":"mdx-blog-post","metadata":{"permalink":"/blog/mdx-blog-post","source":"@site/blog/2021-08-01-mdx-blog-post.mdx","title":"MDX Blog Post","description":"Blog posts support Docusaurus Markdown features, such as MDX.","date":"2021-08-01T00:00:00.000Z","tags":[{"inline":true,"label":"docusaurus","permalink":"/blog/tags/docusaurus"}],"readingTime":0.175,"hasTruncateMarker":false,"authors":[{"name":"S\xe9bastien Lorber","title":"Docusaurus maintainer","url":"https://sebastienlorber.com","imageURL":"https://github.com/slorber.png","key":"slorber","page":null}],"frontMatter":{"slug":"mdx-blog-post","title":"MDX Blog Post","authors":["slorber"],"tags":["docusaurus"]},"unlisted":false,"prevItem":{"title":"Welcome","permalink":"/blog/welcome"},"nextItem":{"title":"Long Blog Post","permalink":"/blog/long-blog-post"}},"content":"Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/).\\n\\n:::tip\\n\\nUse the power of React to create interactive blog posts.\\n\\n```js\\n\\n```\\n\\n\\n\\n:::"},{"id":"long-blog-post","metadata":{"permalink":"/blog/long-blog-post","source":"@site/blog/2019-05-29-long-blog-post.md","title":"Long Blog Post","description":"This is the summary of a very long blog post,","date":"2019-05-29T00:00:00.000Z","tags":[{"inline":true,"label":"hello","permalink":"/blog/tags/hello"},{"inline":true,"label":"docusaurus","permalink":"/blog/tags/docusaurus"}],"readingTime":2.05,"hasTruncateMarker":true,"authors":[{"name":"Endilie Yacop Sucipto","title":"Maintainer of Docusaurus","url":"https://github.com/endiliey","imageURL":"https://github.com/endiliey.png","key":"endi","page":null}],"frontMatter":{"slug":"long-blog-post","title":"Long Blog Post","authors":"endi","tags":["hello","docusaurus"]},"unlisted":false,"prevItem":{"title":"MDX Blog Post","permalink":"/blog/mdx-blog-post"},"nextItem":{"title":"First Blog Post","permalink":"/blog/first-blog-post"}},"content":"This is the summary of a very long blog post,\\n\\nUse a `\x3c!--` `truncate` `--\x3e` comment to limit blog post size in the list view.\\n\\n\x3c!--truncate--\x3e\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"},{"id":"first-blog-post","metadata":{"permalink":"/blog/first-blog-post","source":"@site/blog/2019-05-28-first-blog-post.md","title":"First Blog Post","description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet","date":"2019-05-28T00:00:00.000Z","tags":[{"inline":true,"label":"hola","permalink":"/blog/tags/hola"},{"inline":true,"label":"docusaurus","permalink":"/blog/tags/docusaurus"}],"readingTime":0.12,"hasTruncateMarker":false,"authors":[{"name":"Gao Wei","title":"Docusaurus Core Team","url":"https://github.com/wgao19","image_url":"https://github.com/wgao19.png","imageURL":"https://github.com/wgao19.png","socials":{},"key":null,"page":null}],"frontMatter":{"slug":"first-blog-post","title":"First Blog Post","authors":{"name":"Gao Wei","title":"Docusaurus Core Team","url":"https://github.com/wgao19","image_url":"https://github.com/wgao19.png","imageURL":"https://github.com/wgao19.png"},"tags":["hola","docusaurus"]},"unlisted":false,"prevItem":{"title":"Long Blog Post","permalink":"/blog/long-blog-post"}},"content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}]}}')}}]);
\ No newline at end of file
diff --git a/assets/js/f82cd581.a4fabfe8.js b/assets/js/f82cd581.a4fabfe8.js
new file mode 100644
index 000000000..e38d58f63
--- /dev/null
+++ b/assets/js/f82cd581.a4fabfe8.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[4584],{44035:l=>{l.exports=JSON.parse('{"tag":{"label":"hello","permalink":"/blog/tags/hello","allTagsPath":"/blog/tags","count":2,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/hello","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/fcb270fb.9ac5526e.js b/assets/js/fcb270fb.9ac5526e.js
new file mode 100644
index 000000000..62d7c7fc2
--- /dev/null
+++ b/assets/js/fcb270fb.9ac5526e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[6747],{79622:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>t,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"user/dappnode-cloud/providers/aws/faqs","title":"FAQs & Troubleshooting","description":"Which machine should I choose?","source":"@site/docs/user/dappnode-cloud/providers/aws/faqs.md","sourceDirName":"user/dappnode-cloud/providers/aws","slug":"/user/dappnode-cloud/providers/aws/faqs","permalink":"/docs/user/dappnode-cloud/providers/aws/faqs","draft":false,"unlisted":false,"editUrl":"https://github.com/dappnode/DappnodeDocs/edit/master/docs/user/dappnode-cloud/providers/aws/faqs.md","tags":[],"version":"current","frontMatter":{"title":"FAQs & Troubleshooting","llm_description":"AWS FAQs: machine selection, storage requirements, security groups, Telegram setup, troubleshooting."},"sidebar":"userSidebar","previous":{"title":"How to set up an Instance","permalink":"/docs/user/dappnode-cloud/providers/aws/set-up-instance"},"next":{"title":"More coming soon","permalink":"/docs/user/dappnode-cloud/providers/coming-soon"}}');var i=s(74848),r=s(28453);const t={title:"FAQs & Troubleshooting",llm_description:"AWS FAQs: machine selection, storage requirements, security groups, Telegram setup, troubleshooting."},a="FAQs & Troubleshooting",d={},c=[];function l(e){const n={admonition:"admonition",code:"code",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"faqs--troubleshooting",children:"FAQs & Troubleshooting"})}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)("strong",{children:"Which machine should I choose?"})}),(0,i.jsx)(n.p,{children:"All available machines on AWS when launching an instance are suitable for running Dappnode. However, the best choice depends on your specific needs and intentions. Here's a general guide to help you decide:"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Basic Testing and Development:"})," For basic testing or development purposes, where you don't need high performance or large storage, a smaller instance with 2 vCPUs and 4 GB RAM should be sufficient. This setup allows you to explore Dappnode functionalities without significant resource investment."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Running a Node"}),": For running a full node in any network, a more powerful instance is required. We recommend an instance with at least 2 vCPUs and 8 GB RAM, but to handle the heavy computational, an instance with 4 vCPUs, 16 GB RAM would be the perfect option."]}),"\n"]}),"\n"]}),(0,i.jsx)(n.p,{children:"Evaluate your use case and choose an instance that aligns with your performance and scalability requirements."})]}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)("strong",{children:"How much storage do I need?"})}),(0,i.jsx)(n.p,{children:"The storage requirements for your Dappnode instance depend largely on your intended use. Here are some guidelines for different scenarios:"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Dappnode Testing:"})," For basic testing purposes, a minimum of 30 GB of disk space is recommended. This is sufficient for exploring the Dappnode environment and testing small applications without significant data storage needs."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Running a Node in Mainnet:"})," If you plan to run a full node in the Ethereum mainnet, you will need approximately 1.4 TB (1304 GiB)"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Running a Node in Holesky:"})," For running a node in the Holesky testnet, you should allocate around 180 GB (168 GiB)"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Running a Node in Lukso:"})," If your goal is to run a node in the Lukso network, you will need about 40 GB (38 GiB)"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Running a Node in Gnosis:"})," To run a node in the Gnosis network, you should provision around 503 GB (469 GiB)"]}),"\n"]}),"\n"]}),(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"Regardless of your initial choice, AWS EC2 allows you to scale your storage as needed after the instance is launched. You can easily adjust the storage size through the AWS EC2 UI to meet your growing needs."})})]}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)("strong",{children:"Is it safe to have those security groups? Why are they needed?"})}),(0,i.jsxs)(n.p,{children:["Setting the security groups as explained in the ",(0,i.jsx)("a",{href:"/docs/user/dappnode-cloud/providers/aws/set-up-instance#instance-configuration",children:"Launch an instance"})," section does not automatically open the specified ports. This configuration allows services from your Dappnode to open the specified ports when needed. It's crucial to understand that having these inbound rules does not mean those ports are constantly exposed."]}),(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"SSH (Port 22):"})}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Purpose: Allows you to securely connect to your instance via SSH."}),"\n",(0,i.jsx)(n.li,{children:"Why Needed: Essential for remote management and troubleshooting of your instance."}),"\n"]}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"HTTP (Port 80):"})}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Purpose: Enables HTTP traffic to your instance."}),"\n",(0,i.jsx)(n.li,{children:"Why Needed: Required for accessing web services and interfaces hosted on your Dappnode."}),"\n"]}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"HTTPS (Port 443):"})}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Purpose: Enables HTTPS traffic, providing secure access to web services."}),"\n",(0,i.jsx)(n.li,{children:"Why Needed: Ensures secure connections to web interfaces and services, protecting data in transit."}),"\n"]}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Wireguard (Port 51820):"})}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Purpose: Facilitates Wireguard VPN connections."}),"\n",(0,i.jsx)(n.li,{children:"Why Needed: Necessary for establishing secure VPN connections to your Dappnode instance."}),"\n"]}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"General TCP (Ports 1024-65535):"})}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Purpose: Allows various TCP services to communicate over a wide range of ports."}),"\n",(0,i.jsx)(n.li,{children:"Why Needed: Ensures that your Dappnode instance can communicate effectively with other nodes and services, enhancing overall performance."}),"\n"]}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"General UDP (Ports 1024-65535):"})}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Purpose: Allows various UDP services to communicate over a wide range of ports."}),"\n",(0,i.jsx)(n.li,{children:"Why Needed: Similar to TCP, but for UDP traffic, this rule ensures that your Dappnode instance can efficiently handle peer-to-peer connections and other UDP-based communications.\\"}),"\n"]}),(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"We recommend including all the ports mentioned in your security group inbound rules. This ensures that your Dappnode instance can perform optimally and access all necessary services. However, if you are an experienced user, you can customize these rules to suit your specific needs. You can control which ports to expose based on your security preferences and operational requirements."})})]}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)("strong",{children:"Why is it necessary to provide my Telegram user ID if I also provide my bot token?"})}),(0,i.jsx)("p",{children:"If you want to run commands to your Dappnode via Telegram is it essential to provide your Telegram user ID. Even if you already provide the bot token, anyone with the bot's username could send messages (and running commands so) to your dappnode. This could lead on someone getting the wireguard credentials of your Dappnode and connecting to it."}),(0,i.jsx)("p",{children:"That is why its mandatory to provide it, so your bot only listens to commands given by the account linked to your Telegram user ID."})]}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)("strong",{children:"Why do I want to connect via SSH to my Dappnode?"})}),(0,i.jsx)(n.p,{children:"Connecting via SSH to your Dappnode allows you to access your instance's terminal directly. Even if you have obtained your Wireguard credentials via Telegram, having SSH access is important for several reasons:"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Full Control:"})," SSH access gives you complete control over your Dappnode instance, allowing you to perform advanced configurations and manage the system directly."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Troubleshooting:"})," In case of potential issues or errors, accessing the terminal via SSH enables you to diagnose and fix problems efficiently."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Advanced Management:"})," You can run commands, update software, monitor system performance, and manage services that may not be accessible through the standard Dappnode UI."]}),"\n"]}),"\n"]}),(0,i.jsx)(n.p,{children:"Having SSH access is crucial for maintaining and managing your Dappnode instance effectively, ensuring you can handle any technical challenges that arise."})]}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)("strong",{children:"I've already launched my instance and I'm not getting my Wireguard credentials"})}),(0,i.jsx)(n.p,{children:"If you are not receiving your Wireguard credentials immediately after launching your instance, the Dappnode Image might still be installing. If this happens, wait a few minutes and try again."}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Via SSH"}),": If you encounter this issue, exit your SSH session with the ",(0,i.jsx)(n.code,{children:"exit"})," command in your instance terminal and reconnect as explained in the guide."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Via Telegram Bot"}),": Simply retry the ",(0,i.jsx)(n.code,{children:"/get_wireguard_credentials"})," command after a short wait."]}),"\n"]}),(0,i.jsx)(n.p,{children:"Additionally, ensure that your instance storage has not filled up during the installation. For a testing Dappnode (a Dappnode not intended to run a node in any network), we recommend at least 30 GB of storage."})]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>a});var o=s(96540);const i={},r=o.createContext(i);function t(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/main.eaafc2ff.js b/assets/js/main.eaafc2ff.js
new file mode 100644
index 000000000..7eb6cf477
--- /dev/null
+++ b/assets/js/main.eaafc2ff.js
@@ -0,0 +1,2 @@
+/*! For license information please see main.eaafc2ff.js.LICENSE.txt */
+(self.webpackChunkd_app_node_docs=self.webpackChunkd_app_node_docs||[]).push([[8792],{60463:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t{"use strict";n.d(t,{A:()=>p});n(96540);var r=n(60463),o=n.n(r),a=n(84054);const i={"0058b4c6":[()=>n.e(849).then(n.t.bind(n,86164,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-175.json",86164],"0085f636":[()=>n.e(9589).then(n.bind(n,70424)),"@site/docs/user/rollups/optimism.md",70424],"00b2d067":[()=>n.e(6018).then(n.bind(n,40123)),"@site/docs/user/staking/gnosis-chain/consolidation-gnosis.md",40123],"01337eae":[()=>n.e(3150).then(n.bind(n,40369)),"@site/docs/user/notifications/notifications-list.md",40369],"01a85c17":[()=>Promise.all([n.e(1869),n.e(8209)]).then(n.bind(n,4941)),"@theme/BlogTagsListPage",4941],"027d004c":[()=>n.e(1699).then(n.bind(n,28361)),"@site/docs/dao/node-basics.md",28361],"0429b4a1":[()=>n.e(9572).then(n.bind(n,84133)),"@site/docs/user/dappnode-cloud/providers/aws/overview.md",84133],"042eff12":[()=>n.e(7849).then(n.bind(n,73929)),"@site/docs/user/staking/switch-clients.md",73929],"058440e4":[()=>n.e(2933).then(n.bind(n,66086)),"@site/docs/user/staking/overview.md",66086],"065f9932":[()=>n.e(1937).then(n.bind(n,3965)),"@site/docs/dev/dns.md",3965],"090ba480":[()=>n.e(8027).then(n.bind(n,48790)),"@site/docs/smooth/deep-dive-into-smooth/overview.md",48790],"0af727f1":[()=>n.e(181).then(n.bind(n,29996)),"@site/docs/smooth/faq-glossary.md",29996],"0f7f07eb":[()=>n.e(9372).then(n.bind(n,13342)),"@site/docs/user/access-your-dappnode/terminal.md",13342],"10626e9c":[()=>n.e(8083).then(n.bind(n,14408)),"@site/docs/dev/github-actions/staker-packages/overview.md",14408],"138e0e15":[()=>n.e(4921).then(n.t.bind(n,41597,19)),"@generated/@easyops-cn/docusaurus-search-local/default/__plugin.json",41597],"14c20d3a":[()=>n.e(5635).then(n.bind(n,59688)),"@site/docs/user/staking/ethereum/solo/holesky.md",59688],17896441:[()=>Promise.all([n.e(1869),n.e(9970),n.e(8401)]).then(n.bind(n,79148)),"@theme/DocItem",79148],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,71738)),"@theme/SearchPage",71738],"1df93b7f":[()=>Promise.all([n.e(1869),n.e(4583)]).then(n.bind(n,77944)),"@site/src/pages/index.tsx",77944],"1e4f1bb9":[()=>n.e(4541).then(n.bind(n,25159)),"@site/docs/user/packages/dms.md",25159],"1ee5c5d2":[()=>n.e(8177).then(n.bind(n,60743)),"@site/docs/smooth/deep-dive-into-smooth/oracle-sm.md",60743],20034248:[()=>n.e(8012).then(n.bind(n,27945)),"@site/docs/user/ethical-metrics/overview.md",27945],"2057bc77":[()=>n.e(586).then(n.bind(n,6252)),"@site/docs/user/hardware/maintenance.md",6252],"22a3df87":[()=>n.e(2170).then(n.bind(n,31354)),"@site/docs/user/install/script.md",31354],25229465:[()=>n.e(8384).then(n.bind(n,25910)),"@site/docs/user/ethical-metrics/metrics.md",25910],"29689ead":[()=>n.e(3619).then(n.bind(n,48502)),"@site/docs/smooth/deep-dive-into-smooth/vanilla-blocks.md",48502],"2a82f816":[()=>n.e(3057).then(n.bind(n,37541)),"@site/docs/dev/references/manifest.md",37541],"2c509ddc":[()=>n.e(1065).then(n.bind(n,69568)),"@site/docs/smooth/subscribe-to-smooth/manual.md",69568],"2da4a763":[()=>n.e(2635).then(n.bind(n,37440)),"@site/docs/user/notifications/legacy.md",37440],"3093fe32":[()=>n.e(1842).then(n.bind(n,14245)),"@site/docs/user/dappnode-cloud/overview.md",14245],"31f84294":[()=>n.e(5332).then(n.bind(n,50617)),"@site/docs/user/staking/gnosis-chain/incentive-program.md",50617],"3217192f":[()=>n.e(8462).then(n.t.bind(n,8174,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-docusaurus-f20.json",8174],"342f5eb1":[()=>n.e(6111).then(n.bind(n,56337)),"@site/docs/user/staking/ethereum/lsd-pools/lido/overview.md",56337],"34d45c9f":[()=>n.e(7087).then(n.bind(n,89634)),"@site/docs/smooth.md",89634],"36994c47":[()=>n.e(9858).then(n.t.bind(n,45516,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",45516],"3a2db09e":[()=>n.e(8121).then(n.t.bind(n,68070,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-df9.json",68070],"3d867185":[()=>n.e(9913).then(n.bind(n,90224)),"@site/docs/dev/metrics.md",90224],"3f7aee3c":[()=>n.e(4532).then(n.bind(n,38320)),"@site/docs/user/access-your-dappnode/overview.md",38320],"3fac1d53":[()=>n.e(9071).then(n.bind(n,47356)),"@site/docs/smooth/deep-dive-into-smooth/states.md",47356],"3fd5908e":[()=>n.e(4767).then(n.bind(n,42180)),"@site/docs/user/notifications/inbox.md",42180],"429a0bc8":[()=>n.e(6636).then(n.bind(n,11741)),"@site/docs/user/staking/starknet/solo.md",11741],48096941:[()=>n.e(8756).then(n.bind(n,255)),"@site/docs/dev/notifications.md",255],"4bb29089":[()=>n.e(5495).then(n.bind(n,33127)),"@site/docs/user/packages/understanding-dappnode-packages/overview.md",33127],"4c4b1a63":[()=>n.e(1577).then(n.bind(n,82616)),"@site/docs/user/videos-and-tutorials/driving-school/configuration.md",82616],"4d8f6977":[()=>n.e(2616).then(n.bind(n,95152)),"@site/docs/user/staking/ethereum/dvt-technologies/obol-network.md",95152],"504e39d9":[()=>n.e(5932).then(n.bind(n,87846)),"@site/docs/dev/package-publishing/package-ownership.md",87846],"51a190f1":[()=>n.e(4007).then(n.bind(n,66882)),"@site/docs/user/staking/ethereum/lsd-pools/lido/already-node-operator.md",66882],"536a4320":[()=>n.e(7689).then(n.bind(n,85604)),"@site/docs/user/faqs.md",85604],"53ed655b":[()=>n.e(4866).then(n.bind(n,86712)),"@site/docs/user/packages/monero.md",86712],"5456a9ed":[()=>n.e(3704).then(n.bind(n,29186)),"@site/docs/user/access-your-dappnode/local.md",29186],"56fab60b":[()=>n.e(3787).then(n.bind(n,1730)),"@site/docs/user/dappnode-app/how-to-install.md",1730],59362658:[()=>n.e(9325).then(n.bind(n,37358)),"@site/blog/2021-08-01-mdx-blog-post.mdx",37358],"59a51c52":[()=>n.e(4566).then(n.bind(n,43612)),"@site/docs/user/ethical-metrics/setup.md",43612],"5b35db5e":[()=>n.e(54).then(n.bind(n,24722)),"@site/docs/user/access-your-dappnode/vpn/openvpn.md",24722],"5bbd2a48":[()=>n.e(1355).then(n.bind(n,88324)),"@site/docs/dev/github-actions/staker-packages/execution-clients.md",88324],"5d0a1dad":[()=>n.e(4301).then(n.bind(n,43605)),"@site/docs/user/getting-started/choose-your-path.md",43605],"5d665ce0":[()=>n.e(1939).then(n.bind(n,84206)),"@site/docs/user/hardware/overview.md",84206],"5e90a9b3":[()=>n.e(8025).then(n.t.bind(n,27134,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-hola-73f.json",27134],"5e95c892":[()=>n.e(9647).then(n.bind(n,18122)),"@theme/DocsRoot",18122],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"5f141bf4":[()=>n.e(2422).then(n.bind(n,99940)),"@site/docs/user/packages/understanding-dappnode-packages/logs.md",99940],"5f877448":[()=>n.e(5364).then(n.bind(n,12992)),"@site/docs/user/access-your-dappnode/vpn/overview.md",12992],"621db11d":[()=>Promise.all([n.e(1869),n.e(4622),n.e(4212)]).then(n.bind(n,30217)),"@theme/Blog/Pages/BlogAuthorsListPage",30217],"6696a323":[()=>n.e(9091).then(n.bind(n,37362)),"@site/docs/dev/package-development/multi-configuration.md",37362],"67625ece":[()=>n.e(4156).then(n.bind(n,24768)),"@site/docs/dev/sdk/overview.md",24768],"6875c492":[()=>Promise.all([n.e(1869),n.e(9970),n.e(4622),n.e(4813)]).then(n.bind(n,26956)),"@theme/BlogTagsPostsPage",26956],"6e504cb9":[()=>n.e(3099).then(n.bind(n,33428)),"@site/docs/user/dappnode-cloud/providers/coming-soon.md",33428],"6e93d9f5":[()=>n.e(186).then(n.bind(n,96034)),"@site/docs/smooth/unsubscribe-from-smooth.md",96034],"722b075e":[()=>n.e(3189).then(n.bind(n,41473)),"@site/docs/user/staking/ethereum/lsd-pools/lido/performance.md",41473],"73664a40":[()=>n.e(1972).then(n.bind(n,68371)),"@site/blog/2019-05-29-long-blog-post.md",68371],"7381b33d":[()=>n.e(4255).then(n.bind(n,51212)),"@site/docs/user/dappnode-premium/premium-services.md",51212],"747b92bf":[()=>n.e(5988).then(n.bind(n,53080)),"@site/docs/user/getting-started/connect-dappnode-to-the-router.md",53080],"755082c0":[()=>n.e(4355).then(n.bind(n,59146)),"@site/docs/user/notifications/overview.md",59146],"7661071f":[()=>n.e(8737).then(n.bind(n,34695)),"@site/blog/2021-08-26-welcome/index.md?truncated=true",34695],"769f9326":[()=>n.e(1477).then(n.bind(n,21287)),"@site/docs/user/hardware/temperature.md",21287],"773dc9fa":[()=>n.e(8039).then(n.bind(n,42629)),"@site/docs/smooth/subscribe-to-smooth/overview.md",42629],"78d28be6":[()=>n.e(8007).then(n.bind(n,37801)),"@site/docs/user/packages/understanding-dappnode-packages/config.md",37801],"793beb66":[()=>n.e(1733).then(n.bind(n,66646)),"@site/docs/dev/package-development/single-configuration.md",66646],"79d1f143":[()=>n.e(2046).then(n.bind(n,52828)),"@site/docs/user/dappnode-app/overview.md",52828],"7ac2bc42":[()=>n.e(4555).then(n.bind(n,16365)),"@site/docs/user/notifications/settings.md",16365],"7adecbd1":[()=>n.e(8244).then(n.bind(n,97969)),"@site/docs/user/rollups/aztec.md",97969],"7b2e8791":[()=>n.e(642).then(n.bind(n,53555)),"@site/docs/dev/sdk/commands.md",53555],"7ef68c32":[()=>n.e(8395).then(n.bind(n,41096)),"@site/docs/dao/node-stream.md",41096],"814f3328":[()=>n.e(7472).then(n.t.bind(n,55513,19)),"~blog/default/blog-post-list-prop-default.json",55513],82063238:[()=>n.e(7181).then(n.bind(n,81783)),"@site/docs/dev/references/docker-compose.md",81783],"8228022c":[()=>n.e(2836).then(n.bind(n,67759)),"@site/docs/dev/references/notifications.md",67759],"8717b14a":[()=>n.e(3694).then(n.bind(n,72997)),"@site/blog/2019-05-29-long-blog-post.md?truncated=true",72997],"89600f1f":[()=>n.e(5979).then(n.bind(n,47448)),"@site/docs/dao/liquidity-mining.md",47448],"89b6dee8":[()=>n.e(592).then(n.bind(n,48451)),"@site/docs/user/videos-and-tutorials/driving-school/initial-setup.md",48451],"89e2558e":[()=>n.e(9752).then(n.bind(n,74016)),"@site/docs/user/dappnode-cloud/providers/aws/set-up-instance.md",74016],"8ec292b8":[()=>n.e(3078).then(n.bind(n,64702)),"@site/docs/user/getting-started/setup.md",64702],"8f8bba55":[()=>n.e(8602).then(n.bind(n,86734)),"@site/docs/user/packages/understanding-dappnode-packages/backup.md",86734],"8f981d3f":[()=>n.e(1930).then(n.bind(n,88267)),"@site/docs/user/staking/ethereum/dvt-technologies/diva.md",88267],90558919:[()=>n.e(533).then(n.bind(n,847)),"@site/docs/user/getting-started/access-dappnode-via-wifi.md",847],"91e54d81":[()=>n.e(8538).then(n.bind(n,75754)),"@site/docs/user/packages/signature.md",75754],"925b3f96":[()=>n.e(8609).then(n.bind(n,9420)),"@site/blog/2019-05-28-first-blog-post.md?truncated=true",9420],"94131f31":[()=>n.e(2701).then(n.bind(n,28406)),"@site/docs/dev/references/setup-wizard.md",28406],"950718c7":[()=>n.e(2919).then(n.bind(n,45276)),"@site/docs/dev.md",45276],"9c6c90aa":[()=>n.e(5187).then(n.bind(n,17369)),"@site/docs/dev/github-actions/staker-packages/web3signer.md",17369],"9c8bdb8f":[()=>n.e(893).then(n.bind(n,33837)),"@site/docs/dev/github-actions/staker-packages/consensus-clients.md",33837],"9e4087bc":[()=>n.e(2711).then(n.bind(n,14750)),"@theme/BlogArchivePage",14750],"9e93dc42":[()=>n.e(6524).then(n.bind(n,49127)),"@site/docs/user/install/iso.md",49127],a22f54b8:[()=>n.e(7323).then(n.bind(n,22786)),"@site/docs/user/packages/understanding-dappnode-packages/file-manager.md",22786],a2f2eb75:[()=>n.e(1371).then(n.bind(n,56194)),"@site/docs/smooth/deep-dive-into-smooth/consolidations.md",56194],a33eb6a8:[()=>n.e(3384).then(n.bind(n,1755)),"@site/docs/user/staking/ethereum/lsd-pools/stakewise.md",1755],a5f12663:[()=>n.e(7876).then(n.bind(n,8806)),"@site/docs/dev/github-actions/overview.md",8806],a6aa9e1f:[()=>Promise.all([n.e(1869),n.e(9970),n.e(4622),n.e(7643)]).then(n.bind(n,55631)),"@theme/BlogListPage",55631],a7456010:[()=>n.e(1235).then(n.t.bind(n,88552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",88552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,15047)),"@theme/DocVersionRoot",15047],a830b4cf:[()=>n.e(4496).then(n.bind(n,88374)),"@site/docs/user/staking/ethereum/lsd-pools/lido/register.md",88374],a83bdfda:[()=>n.e(3416).then(n.bind(n,55096)),"@site/docs/dao/faq.md",55096],a8add524:[()=>n.e(2664).then(n.bind(n,5302)),"@site/docs/user/access-your-dappnode/vpn/tailscale.md",5302],a9241739:[()=>n.e(6203).then(n.bind(n,3288)),"@site/docs/user/ethical-metrics/troubleshooting.md",3288],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,91841)),"@theme/DocRoot",91841],a960b763:[()=>n.e(2319).then(n.bind(n,47051)),"@site/docs/user/packages/swarm.md",47051],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,27093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",27093],acecf23e:[()=>n.e(1903).then(n.t.bind(n,1912,19)),"~blog/default/blogMetadata-default.json",1912],af26485d:[()=>n.e(5553).then(n.bind(n,51915)),"@site/docs/user/repository/ipfs.md",51915],b1a9ae1f:[()=>n.e(1849).then(n.bind(n,17488)),"@site/docs/dev/package-development/overview.md",17488],b3edc04f:[()=>n.e(8138).then(n.bind(n,830)),"@site/docs/dev/package-publishing/publish-packages-clients.md",830],b4800274:[()=>n.e(1558).then(n.bind(n,47010)),"@site/docs/user/rollups/overview.md",47010],b9b44023:[()=>n.e(9575).then(n.bind(n,69045)),"@site/docs/user/videos-and-tutorials/guides/migrating-from-avado.md",69045],b9c10046:[()=>n.e(5838).then(n.bind(n,92897)),"@site/docs/smooth/subscribe-to-smooth/automatic.md",92897],bb9993f2:[()=>n.e(9597).then(n.bind(n,49590)),"@site/docs/user/dappnode-premium/premium-overview.md",49590],be56890f:[()=>n.e(6630).then(n.bind(n,46221)),"@site/docs/user/notifications/devices.md",46221],bebe2ff8:[()=>n.e(25).then(n.bind(n,23180)),"@site/docs/user/packages/understanding-dappnode-packages/info.md",23180],c15d9823:[()=>n.e(8146).then(n.t.bind(n,29328,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json",29328],c38c9aa9:[()=>n.e(582).then(n.bind(n,71130)),"@site/docs/user/install/overview.md",71130],c75934c3:[()=>n.e(912).then(n.bind(n,31e3)),"@site/docs/dev/sdk/sdk-publish.md",31e3],c7a466cb:[()=>n.e(4693).then(n.bind(n,20268)),"@site/docs/user/getting-started/register.md",20268],c9627cbc:[()=>n.e(9524).then(n.bind(n,585)),"@site/docs/user/videos-and-tutorials/crash-course.md",585],cbc5934e:[()=>n.e(7253).then(n.bind(n,16104)),"@site/docs/dao.md",16104],ccc49370:[()=>Promise.all([n.e(1869),n.e(9970),n.e(4622),n.e(3249)]).then(n.bind(n,37191)),"@theme/BlogPostPage",37191],cdc6bc37:[()=>n.e(8826).then(n.bind(n,69363)),"@site/docs/smooth/deep-dive-into-smooth/rewards.md",69363],d267b4aa:[()=>n.e(6396).then(n.bind(n,69712)),"@site/docs/user/getting-started/next-steps.md",69712],d36fd63a:[()=>n.e(6874).then(n.bind(n,21373)),"@site/docs/user/staking/lukso/solo.md",21373],d47e1b16:[()=>n.e(5027).then(n.bind(n,2461)),"@site/docs/user/packages/bitcoin.md",2461],d508510a:[()=>n.e(6853).then(n.bind(n,54738)),"@site/docs/user/videos-and-tutorials/overview.md",54738],d61c7726:[()=>n.e(2767).then(n.bind(n,46763)),"@site/docs/user/install/arm.md",46763],d6c02fb6:[()=>n.e(372).then(n.bind(n,77194)),"@site/docs/user/staking/ethereum/solo/mainnet.md",77194],d912498a:[()=>n.e(8627).then(n.bind(n,32361)),"@site/docs/user/repository/ethereum.md",32361],d9f32620:[()=>n.e(5557).then(n.bind(n,9701)),"@site/blog/2021-08-26-welcome/index.md",9701],db6178e4:[()=>n.e(508).then(n.bind(n,67992)),"@site/docs/user/staking/ethereum/lsd-pools/lido/notifications.md",67992],de66584d:[()=>n.e(8641).then(n.bind(n,4302)),"@site/docs/user/staking/gnosis-chain/consolidate-gnosis-validators.md",4302],df56bb67:[()=>n.e(7961).then(n.bind(n,75206)),"@site/docs/user/packages/understanding-dappnode-packages/network.md",75206],dfbda110:[()=>n.e(7902).then(n.bind(n,20384)),"@site/docs/user/packages/avalanche.md",20384],dfcea9c7:[()=>n.e(6485).then(n.bind(n,979)),"@site/docs/user/access-your-dappnode/wifi.md",979],e26c9afe:[()=>n.e(8682).then(n.bind(n,68139)),"@site/docs/user/staking/ethereum/lsd-pools/stakehouse.md",68139],e273c56f:[()=>n.e(9328).then(n.bind(n,94304)),"@site/blog/2019-05-28-first-blog-post.md",94304],e28e223d:[()=>n.e(2238).then(n.bind(n,85586)),"@site/docs/user/access-your-dappnode/vpn/wireguard.md",85586],e5aefb32:[()=>n.e(3276).then(n.t.bind(n,58539,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-facebook-f47.json",58539],e7ae4afa:[()=>n.e(5199).then(n.bind(n,94992)),"@site/docs/user/packages/ethclassic.md",94992],e7fcc526:[()=>n.e(7290).then(n.bind(n,7388)),"@site/docs/user/staking/ethereum/dvt-technologies/ssv-network.md",7388],ebe6ca12:[()=>n.e(738).then(n.bind(n,29820)),"@site/docs/dev/github-actions/standard-packages.md",29820],ed77d0ad:[()=>n.e(5273).then(n.bind(n,57965)),"@site/docs/user/staking/ethereum/lsd-pools/rocketpool.md",57965],eef43c71:[()=>n.e(221).then(n.bind(n,90352)),"@site/docs/user/staking/gnosis-chain/solo.md",90352],ef41a71b:[()=>n.e(5222).then(n.bind(n,25556)),"@site/docs/user/install/dappnode-commands.md",25556],ef8b811a:[()=>n.e(8947).then(n.t.bind(n,56600,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-790.json",56600],f4f34a3a:[()=>n.e(3637).then(n.bind(n,17810)),"@site/blog/2021-08-01-mdx-blog-post.mdx?truncated=true",17810],f557db91:[()=>n.e(116).then(n.bind(n,51861)),"@site/docs/dao/node-drop.md",51861],f744a4d0:[()=>n.e(1097).then(n.bind(n,3294)),"@site/docs/user/videos-and-tutorials/guides/connect-node.md",3294],f81c1134:[()=>n.e(8130).then(n.t.bind(n,77735,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json",77735],f82cd581:[()=>n.e(4584).then(n.t.bind(n,44035,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-hello-f96.json",44035],fcb270fb:[()=>n.e(6747).then(n.bind(n,79622)),"@site/docs/user/dappnode-cloud/providers/aws/faqs.md",79622]};var s=n(74848);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(13722),u=n(75313);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(3042).then(n.bind(n,73042)),modules:["@theme/NotFound"],webpack:()=>[73042],render(e,t){const n=e.default;return(0,s.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],h=(0,c.A)(r);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const l=o.__props;return delete o.__props,(0,s.jsx)(u.W,{value:i,children:(0,s.jsx)(a,{...o,...l,...n})})}})}const p=[{path:"/blog",component:d("/blog","b2f"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","182"),exact:!0},{path:"/blog/authors",component:d("/blog/authors","0b7"),exact:!0},{path:"/blog/first-blog-post",component:d("/blog/first-blog-post","89a"),exact:!0},{path:"/blog/long-blog-post",component:d("/blog/long-blog-post","9ad"),exact:!0},{path:"/blog/mdx-blog-post",component:d("/blog/mdx-blog-post","e9f"),exact:!0},{path:"/blog/tags",component:d("/blog/tags","287"),exact:!0},{path:"/blog/tags/docusaurus",component:d("/blog/tags/docusaurus","704"),exact:!0},{path:"/blog/tags/facebook",component:d("/blog/tags/facebook","858"),exact:!0},{path:"/blog/tags/hello",component:d("/blog/tags/hello","299"),exact:!0},{path:"/blog/tags/hola",component:d("/blog/tags/hola","00d"),exact:!0},{path:"/blog/welcome",component:d("/blog/welcome","d2b"),exact:!0},{path:"/search",component:d("/search","822"),exact:!0},{path:"/docs",component:d("/docs","182"),routes:[{path:"/docs",component:d("/docs","905"),routes:[{path:"/docs",component:d("/docs","5fd"),routes:[{path:"/docs/dao",component:d("/docs/dao","852"),exact:!0,sidebar:"daoSidebar"},{path:"/docs/dao/faq",component:d("/docs/dao/faq","0ed"),exact:!0,sidebar:"daoSidebar"},{path:"/docs/dao/liquidity-mining",component:d("/docs/dao/liquidity-mining","b30"),exact:!0,sidebar:"daoSidebar"},{path:"/docs/dao/node-basics",component:d("/docs/dao/node-basics","93b"),exact:!0,sidebar:"daoSidebar"},{path:"/docs/dao/node-drop",component:d("/docs/dao/node-drop","005"),exact:!0},{path:"/docs/dao/node-stream",component:d("/docs/dao/node-stream","47c"),exact:!0},{path:"/docs/dev",component:d("/docs/dev","8f3"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/dns",component:d("/docs/dev/dns","ead"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/github-actions/overview",component:d("/docs/dev/github-actions/overview","297"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/github-actions/staker-packages/consensus-clients",component:d("/docs/dev/github-actions/staker-packages/consensus-clients","61f"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/github-actions/staker-packages/execution-clients",component:d("/docs/dev/github-actions/staker-packages/execution-clients","f49"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/github-actions/staker-packages/overview",component:d("/docs/dev/github-actions/staker-packages/overview","02d"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/github-actions/staker-packages/web3signer",component:d("/docs/dev/github-actions/staker-packages/web3signer","5db"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/github-actions/standard-packages",component:d("/docs/dev/github-actions/standard-packages","506"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/metrics",component:d("/docs/dev/metrics","804"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/notifications",component:d("/docs/dev/notifications","0d8"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/package-development/multi-configuration",component:d("/docs/dev/package-development/multi-configuration","7d1"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/package-development/overview",component:d("/docs/dev/package-development/overview","baa"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/package-development/single-configuration",component:d("/docs/dev/package-development/single-configuration","094"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/package-publishing/package-ownership",component:d("/docs/dev/package-publishing/package-ownership","1c1"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/package-publishing/publish-packages-clients",component:d("/docs/dev/package-publishing/publish-packages-clients","60f"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/references/docker-compose",component:d("/docs/dev/references/docker-compose","5dc"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/references/manifest",component:d("/docs/dev/references/manifest","78a"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/references/notifications",component:d("/docs/dev/references/notifications","87b"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/references/setup-wizard",component:d("/docs/dev/references/setup-wizard","4bb"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/sdk/commands",component:d("/docs/dev/sdk/commands","2e5"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/sdk/overview",component:d("/docs/dev/sdk/overview","e68"),exact:!0,sidebar:"devSidebar"},{path:"/docs/dev/sdk/sdk-publish",component:d("/docs/dev/sdk/sdk-publish","b02"),exact:!0,sidebar:"devSidebar"},{path:"/docs/smooth",component:d("/docs/smooth","e98"),exact:!0,sidebar:"smoothSidebar"},{path:"/docs/smooth/deep-dive-into-smooth/consolidations",component:d("/docs/smooth/deep-dive-into-smooth/consolidations","b08"),exact:!0,sidebar:"smoothSidebar"},{path:"/docs/smooth/deep-dive-into-smooth/oracle-sm",component:d("/docs/smooth/deep-dive-into-smooth/oracle-sm","151"),exact:!0,sidebar:"smoothSidebar"},{path:"/docs/smooth/deep-dive-into-smooth/overview",component:d("/docs/smooth/deep-dive-into-smooth/overview","d3f"),exact:!0,sidebar:"smoothSidebar"},{path:"/docs/smooth/deep-dive-into-smooth/rewards",component:d("/docs/smooth/deep-dive-into-smooth/rewards","3c4"),exact:!0,sidebar:"smoothSidebar"},{path:"/docs/smooth/deep-dive-into-smooth/states",component:d("/docs/smooth/deep-dive-into-smooth/states","216"),exact:!0,sidebar:"smoothSidebar"},{path:"/docs/smooth/deep-dive-into-smooth/vanilla-blocks",component:d("/docs/smooth/deep-dive-into-smooth/vanilla-blocks","607"),exact:!0,sidebar:"smoothSidebar"},{path:"/docs/smooth/faq-glossary",component:d("/docs/smooth/faq-glossary","b02"),exact:!0,sidebar:"smoothSidebar"},{path:"/docs/smooth/subscribe-to-smooth/automatic",component:d("/docs/smooth/subscribe-to-smooth/automatic","a79"),exact:!0,sidebar:"smoothSidebar"},{path:"/docs/smooth/subscribe-to-smooth/manual",component:d("/docs/smooth/subscribe-to-smooth/manual","fc0"),exact:!0,sidebar:"smoothSidebar"},{path:"/docs/smooth/subscribe-to-smooth/overview",component:d("/docs/smooth/subscribe-to-smooth/overview","34d"),exact:!0,sidebar:"smoothSidebar"},{path:"/docs/smooth/unsubscribe-from-smooth",component:d("/docs/smooth/unsubscribe-from-smooth","cc5"),exact:!0,sidebar:"smoothSidebar"},{path:"/docs/user/access-your-dappnode/local",component:d("/docs/user/access-your-dappnode/local","082"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/access-your-dappnode/overview",component:d("/docs/user/access-your-dappnode/overview","c96"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/access-your-dappnode/terminal",component:d("/docs/user/access-your-dappnode/terminal","754"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/access-your-dappnode/vpn/openvpn",component:d("/docs/user/access-your-dappnode/vpn/openvpn","fbc"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/access-your-dappnode/vpn/overview",component:d("/docs/user/access-your-dappnode/vpn/overview","317"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/access-your-dappnode/vpn/tailscale",component:d("/docs/user/access-your-dappnode/vpn/tailscale","ae5"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/access-your-dappnode/vpn/wireguard",component:d("/docs/user/access-your-dappnode/vpn/wireguard","8ca"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/access-your-dappnode/wifi",component:d("/docs/user/access-your-dappnode/wifi","a5e"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/dappnode-app/how-to-install",component:d("/docs/user/dappnode-app/how-to-install","367"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/dappnode-app/overview",component:d("/docs/user/dappnode-app/overview","ef3"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/dappnode-cloud/overview",component:d("/docs/user/dappnode-cloud/overview","4a2"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/dappnode-cloud/providers/aws/faqs",component:d("/docs/user/dappnode-cloud/providers/aws/faqs","637"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/dappnode-cloud/providers/aws/overview",component:d("/docs/user/dappnode-cloud/providers/aws/overview","b21"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/dappnode-cloud/providers/aws/set-up-instance",component:d("/docs/user/dappnode-cloud/providers/aws/set-up-instance","ea8"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/dappnode-cloud/providers/coming-soon",component:d("/docs/user/dappnode-cloud/providers/coming-soon","2a2"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/dappnode-premium/premium-overview",component:d("/docs/user/dappnode-premium/premium-overview","dc1"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/dappnode-premium/premium-services",component:d("/docs/user/dappnode-premium/premium-services","5c0"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/ethical-metrics/metrics",component:d("/docs/user/ethical-metrics/metrics","4bd"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/ethical-metrics/overview",component:d("/docs/user/ethical-metrics/overview","73b"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/ethical-metrics/setup",component:d("/docs/user/ethical-metrics/setup","1bd"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/ethical-metrics/troubleshooting",component:d("/docs/user/ethical-metrics/troubleshooting","a0f"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/faqs",component:d("/docs/user/faqs","33c"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/getting-started/access-dappnode-via-wifi",component:d("/docs/user/getting-started/access-dappnode-via-wifi","3c6"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/getting-started/choose-your-path",component:d("/docs/user/getting-started/choose-your-path","d86"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/getting-started/connect-dappnode-to-the-router",component:d("/docs/user/getting-started/connect-dappnode-to-the-router","5d2"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/getting-started/next-steps",component:d("/docs/user/getting-started/next-steps","bb8"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/getting-started/register",component:d("/docs/user/getting-started/register","810"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/getting-started/setup",component:d("/docs/user/getting-started/setup","9f7"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/maintenance",component:d("/docs/user/hardware/maintenance","26b"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/overview",component:d("/docs/user/hardware/overview","930"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/temperature",component:d("/docs/user/hardware/temperature","760"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/install/arm",component:d("/docs/user/install/arm","3f9"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/install/dappnode-commands",component:d("/docs/user/install/dappnode-commands","d21"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/install/iso",component:d("/docs/user/install/iso","0a8"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/install/overview",component:d("/docs/user/install/overview","796"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/install/script",component:d("/docs/user/install/script","b83"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/notifications/devices",component:d("/docs/user/notifications/devices","7d6"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/notifications/inbox",component:d("/docs/user/notifications/inbox","521"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/notifications/legacy",component:d("/docs/user/notifications/legacy","46a"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/notifications/notifications-list",component:d("/docs/user/notifications/notifications-list","85b"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/notifications/overview",component:d("/docs/user/notifications/overview","f42"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/notifications/settings",component:d("/docs/user/notifications/settings","c1c"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/packages/avalanche",component:d("/docs/user/packages/avalanche","016"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/packages/bitcoin",component:d("/docs/user/packages/bitcoin","3ce"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/packages/dms",component:d("/docs/user/packages/dms","d4f"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/packages/ethclassic",component:d("/docs/user/packages/ethclassic","b2a"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/packages/monero",component:d("/docs/user/packages/monero","2c1"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/packages/signature",component:d("/docs/user/packages/signature","992"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/packages/swarm",component:d("/docs/user/packages/swarm","0e7"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/packages/understanding-dappnode-packages/backup",component:d("/docs/user/packages/understanding-dappnode-packages/backup","634"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/packages/understanding-dappnode-packages/config",component:d("/docs/user/packages/understanding-dappnode-packages/config","600"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/packages/understanding-dappnode-packages/file-manager",component:d("/docs/user/packages/understanding-dappnode-packages/file-manager","0e9"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/packages/understanding-dappnode-packages/info",component:d("/docs/user/packages/understanding-dappnode-packages/info","41f"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/packages/understanding-dappnode-packages/logs",component:d("/docs/user/packages/understanding-dappnode-packages/logs","047"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/packages/understanding-dappnode-packages/network",component:d("/docs/user/packages/understanding-dappnode-packages/network","355"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/packages/understanding-dappnode-packages/overview",component:d("/docs/user/packages/understanding-dappnode-packages/overview","f16"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/repository/ethereum",component:d("/docs/user/repository/ethereum","465"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/repository/ipfs",component:d("/docs/user/repository/ipfs","9e0"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/rollups/aztec",component:d("/docs/user/rollups/aztec","85c"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/rollups/optimism",component:d("/docs/user/rollups/optimism","1f8"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/rollups/overview",component:d("/docs/user/rollups/overview","5cc"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/ethereum/dvt-technologies/diva",component:d("/docs/user/staking/ethereum/dvt-technologies/diva","c8c"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/ethereum/dvt-technologies/obol-network",component:d("/docs/user/staking/ethereum/dvt-technologies/obol-network","e1e"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/ethereum/dvt-technologies/ssv-network",component:d("/docs/user/staking/ethereum/dvt-technologies/ssv-network","569"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/ethereum/lsd-pools/lido/already-node-operator",component:d("/docs/user/staking/ethereum/lsd-pools/lido/already-node-operator","cf6"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/ethereum/lsd-pools/lido/notifications",component:d("/docs/user/staking/ethereum/lsd-pools/lido/notifications","185"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/ethereum/lsd-pools/lido/overview",component:d("/docs/user/staking/ethereum/lsd-pools/lido/overview","3fd"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/ethereum/lsd-pools/lido/performance",component:d("/docs/user/staking/ethereum/lsd-pools/lido/performance","c05"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/ethereum/lsd-pools/lido/register",component:d("/docs/user/staking/ethereum/lsd-pools/lido/register","ebe"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/ethereum/lsd-pools/rocketpool",component:d("/docs/user/staking/ethereum/lsd-pools/rocketpool","aa6"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/ethereum/lsd-pools/stakehouse",component:d("/docs/user/staking/ethereum/lsd-pools/stakehouse","3b0"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/ethereum/lsd-pools/stakewise",component:d("/docs/user/staking/ethereum/lsd-pools/stakewise","4ab"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/ethereum/solo/holesky",component:d("/docs/user/staking/ethereum/solo/holesky","b41"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/ethereum/solo/mainnet",component:d("/docs/user/staking/ethereum/solo/mainnet","1d7"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/gnosis-chain/consolidate-gnosis-validators",component:d("/docs/user/staking/gnosis-chain/consolidate-gnosis-validators","818"),exact:!0},{path:"/docs/user/staking/gnosis-chain/consolidation-gnosis",component:d("/docs/user/staking/gnosis-chain/consolidation-gnosis","f84"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/gnosis-chain/incentive-program",component:d("/docs/user/staking/gnosis-chain/incentive-program","793"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/gnosis-chain/solo",component:d("/docs/user/staking/gnosis-chain/solo","df5"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/lukso/solo",component:d("/docs/user/staking/lukso/solo","8b2"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/overview",component:d("/docs/user/staking/overview","9bc"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/starknet/solo",component:d("/docs/user/staking/starknet/solo","2aa"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/staking/switch-clients",component:d("/docs/user/staking/switch-clients","b2d"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/videos-and-tutorials/crash-course",component:d("/docs/user/videos-and-tutorials/crash-course","284"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/videos-and-tutorials/driving-school/configuration",component:d("/docs/user/videos-and-tutorials/driving-school/configuration","048"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/videos-and-tutorials/driving-school/initial-setup",component:d("/docs/user/videos-and-tutorials/driving-school/initial-setup","6d5"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/videos-and-tutorials/guides/connect-node",component:d("/docs/user/videos-and-tutorials/guides/connect-node","9f4"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/videos-and-tutorials/guides/migrating-from-avado",component:d("/docs/user/videos-and-tutorials/guides/migrating-from-avado","752"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/videos-and-tutorials/overview",component:d("/docs/user/videos-and-tutorials/overview","a22"),exact:!0}]}]}]},{path:"/",component:d("/","e5f"),exact:!0},{path:"*",component:d("*")}]},84974:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(96540),o=n(74848);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},45161:(e,t,n)=>{"use strict";var r=n(96540),o=n(5338),a=n(80545),i=n(54625),s=n(4784),l=n(61934);const c=[n(67378),n(77264),n(78867),n(82094)];var u=n(48912),d=n(56347),p=n(22831),f=n(74848);function h(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var m=n(27143),g=n(40797),b=n(29030),v=n(53115),y=n(81082),w=n(67976),k=n(67788);var x=n(30099),S=n(37220);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.A)(),r=(0,w.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,f.jsxs)(m.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function E(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.A)(),{pathname:r}=(0,d.zy)();return e+(0,x.Ks)((0,b.Ay)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,f.jsxs)(m.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:o}),(0,f.jsx)("link",{rel:"canonical",href:o})]})}function C(){const{i18n:{currentLocale:e}}=(0,g.A)(),{metadata:t,image:n}=(0,v.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(m.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:k.w})]}),n&&(0,f.jsx)(y.be,{image:n}),(0,f.jsx)(E,{}),(0,f.jsx)(_,{}),(0,f.jsx)(S.A,{tag:"default",locale:e}),(0,f.jsx)(m.A,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const T=new Map;var A=n(84974),j=n(46193),L=n(50372);function P(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const R=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,L.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),P("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function N(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class O extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.canUseDOM?P("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=P("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),N(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(R,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.qh,{location:t,render:()=>e})})}}const D=O,I="__docusaurus-base-url-issue-banner-suggestion-container";function F(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '__docusaurus-base-url-issue-banner-container';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
+
+
\ No newline at end of file
diff --git a/blog/atom.xml b/blog/atom.xml
new file mode 100644
index 000000000..b992a18d9
--- /dev/null
+++ b/blog/atom.xml
@@ -0,0 +1,99 @@
+
+
+ https://docs.dappnode.io/blog
+ Dappnode Blog
+ 2021-08-26T00:00:00.000Z
+ https://github.com/jpmonette/feed
+
+ Dappnode Blog
+ https://docs.dappnode.io/img/logo.png
+
+
+ https://docs.dappnode.io/blog/welcome
+
+ 2021-08-26T00:00:00.000Z
+
+ Docusaurus blogging features are powered by the blog plugin.
+
Simply add Markdown files (or folders) to the blog directory.
+
Regular blog authors can be added to authors.yml.
+
The blog post date can be extracted from filenames, such as:
+
+
2019-05-30-welcome.md
+
2019-05-30-welcome/index.md
+
+
A blog post folder can be convenient to co-locate blog post images:
+
+
The blog supports tags as well!
+
And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.
]]>
+
+ Sébastien Lorber
+ https://sebastienlorber.com
+
+
+ Yangshun Tay
+ https://github.com/yangshun
+
+
+
+
+
+
+
+ https://docs.dappnode.io/blog/mdx-blog-post
+
+ 2021-08-01T00:00:00.000Z
+
+ Blog posts support Docusaurus Markdown features, such as MDX.
+
tip
Use the power of React to create interactive blog posts.
]]>
+
+ Sébastien Lorber
+ https://sebastienlorber.com
+
+
+
+
+
+ https://docs.dappnode.io/blog/long-blog-post
+
+ 2019-05-29T00:00:00.000Z
+
+ This is the summary of a very long blog post,
+
Use a <!--truncate--> comment to limit blog post size in the list view.
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
]]>
+
+ Endilie Yacop Sucipto
+ https://github.com/endiliey
+
+
+
+
+
+
+ https://docs.dappnode.io/blog/first-blog-post
+
+ 2019-05-28T00:00:00.000Z
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet]]>
+
+ Gao Wei
+ https://github.com/wgao19
+
+
+
+
+
\ No newline at end of file
diff --git a/blog/authors.yml b/blog/authors.yml
deleted file mode 100644
index bcb299156..000000000
--- a/blog/authors.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-endi:
- name: Endilie Yacop Sucipto
- title: Maintainer of Docusaurus
- url: https://github.com/endiliey
- image_url: https://github.com/endiliey.png
-
-yangshun:
- name: Yangshun Tay
- title: Front End Engineer @ Facebook
- url: https://github.com/yangshun
- image_url: https://github.com/yangshun.png
-
-slorber:
- name: Sébastien Lorber
- title: Docusaurus maintainer
- url: https://sebastienlorber.com
- image_url: https://github.com/slorber.png
diff --git a/blog/authors/index.html b/blog/authors/index.html
new file mode 100644
index 000000000..28ff4ffb4
--- /dev/null
+++ b/blog/authors/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+Authors | Dappnode
+
+
+
+
+
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
+
\ No newline at end of file
diff --git a/blog/index.html b/blog/index.html
new file mode 100644
index 000000000..0fdca2725
--- /dev/null
+++ b/blog/index.html
@@ -0,0 +1,27 @@
+
+
+
+
+
+Blog | Dappnode
+
+
+
+
+
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
+
\ No newline at end of file
diff --git a/blog/long-blog-post/index.html b/blog/long-blog-post/index.html
new file mode 100644
index 000000000..280da5d1f
--- /dev/null
+++ b/blog/long-blog-post/index.html
@@ -0,0 +1,31 @@
+
+
+
+
+
+Long Blog Post | Dappnode
+
+
+
+
+
+
Use a <!--truncate--> comment to limit blog post size in the list view.
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
+
\ No newline at end of file
diff --git a/blog/mdx-blog-post/index.html b/blog/mdx-blog-post/index.html
new file mode 100644
index 000000000..3bbfcbfed
--- /dev/null
+++ b/blog/mdx-blog-post/index.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+MDX Blog Post | Dappnode
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/blog/rss.xml b/blog/rss.xml
new file mode 100644
index 000000000..ddc3306c4
--- /dev/null
+++ b/blog/rss.xml
@@ -0,0 +1,81 @@
+
+
+
+ Dappnode Blog
+ https://docs.dappnode.io/blog
+ Dappnode Blog
+ Thu, 26 Aug 2021 00:00:00 GMT
+ https://validator.w3.org/feed/docs/rss2.html
+ https://github.com/jpmonette/feed
+ en
+
+
+ https://docs.dappnode.io/blog/welcome
+ https://docs.dappnode.io/blog/welcome
+ Thu, 26 Aug 2021 00:00:00 GMT
+
+ Docusaurus blogging features are powered by the blog plugin.
+
Simply add Markdown files (or folders) to the blog directory.
+
Regular blog authors can be added to authors.yml.
+
The blog post date can be extracted from filenames, such as:
+
+
2019-05-30-welcome.md
+
2019-05-30-welcome/index.md
+
+
A blog post folder can be convenient to co-locate blog post images:
+
+
The blog supports tags as well!
+
And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.
]]>
+ facebook
+ hello
+ docusaurus
+
+
+
+ https://docs.dappnode.io/blog/mdx-blog-post
+ https://docs.dappnode.io/blog/mdx-blog-post
+ Sun, 01 Aug 2021 00:00:00 GMT
+
+ Blog posts support Docusaurus Markdown features, such as MDX.
+
tip
Use the power of React to create interactive blog posts.
]]>
+ docusaurus
+
+
+
+ https://docs.dappnode.io/blog/long-blog-post
+ https://docs.dappnode.io/blog/long-blog-post
+ Wed, 29 May 2019 00:00:00 GMT
+
+ This is the summary of a very long blog post,
+
Use a <!--truncate--> comment to limit blog post size in the list view.
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
]]>
+ hello
+ docusaurus
+
+
+
+ https://docs.dappnode.io/blog/first-blog-post
+ https://docs.dappnode.io/blog/first-blog-post
+ Tue, 28 May 2019 00:00:00 GMT
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet]]>
+ hola
+ docusaurus
+
+
+
\ No newline at end of file
diff --git a/blog/tags/docusaurus/index.html b/blog/tags/docusaurus/index.html
new file mode 100644
index 000000000..f1b46fe53
--- /dev/null
+++ b/blog/tags/docusaurus/index.html
@@ -0,0 +1,27 @@
+
+
+
+
+
+4 posts tagged with "docusaurus" | Dappnode
+
+
+
+
+
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
+
\ No newline at end of file
diff --git a/blog/tags/facebook/index.html b/blog/tags/facebook/index.html
new file mode 100644
index 000000000..d4002f244
--- /dev/null
+++ b/blog/tags/facebook/index.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+One post tagged with "facebook" | Dappnode
+
+
+
+
+
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
+
+
\ No newline at end of file
diff --git a/blog/tags/index.html b/blog/tags/index.html
new file mode 100644
index 000000000..e128c4178
--- /dev/null
+++ b/blog/tags/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+Tags | Dappnode
+
+
+
+
+
+
Simply add Markdown files (or folders) to the blog directory.
+
Regular blog authors can be added to authors.yml.
+
The blog post date can be extracted from filenames, such as:
+
+
2019-05-30-welcome.md
+
2019-05-30-welcome/index.md
+
+
A blog post folder can be convenient to co-locate blog post images:
+
+
The blog supports tags as well!
+
And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.
+
+
\ No newline at end of file
diff --git a/docs/dao.md b/docs/dao.md
index e9f4d57a1..507f444b6 100644
--- a/docs/dao.md
+++ b/docs/dao.md
@@ -1,7 +1,7 @@
----
-title: DAO
-description: DAO information
-llm_description: "Dappnode DAO governance overview: NODE token addresses, mission, Snapshot voting, and ValidatorDAO."
+> ## Documentation Index
+> Fetch the complete documentation index at: https://docs.dappnode.io/llms.txt
+> Use this file to discover all available pages before exploring further.
+
---
:::danger Documentation alert
diff --git a/docs/dao/faq.md b/docs/dao/faq.md
index 1f0ab9e36..3f78b9a44 100644
--- a/docs/dao/faq.md
+++ b/docs/dao/faq.md
@@ -1,7 +1,9 @@
+> ## Documentation Index
+> Fetch the complete documentation index at: https://docs.dappnode.io/llms.txt
+> Use this file to discover all available pages before exploring further.
+
---
-title: Dappnode DAO FAQ
-llm_description: FAQ explaining what a DAO is and Dappnode DAO's mission for decentralized infrastructure.
----
+
What is a DAO?
diff --git a/docs/dao/faq/index.html b/docs/dao/faq/index.html
new file mode 100644
index 000000000..5f5b52121
--- /dev/null
+++ b/docs/dao/faq/index.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+Dappnode DAO FAQ | Dappnode
+
+
+
+
+
+
A DAO, or Decentralized Autonomous Organization, is an organization represented by rules encoded as a computer program that is transparent, controlled by the organization members, and not influenced by a centralized government. It operates autonomously and can execute actions such as making decisions and managing resources based on pre-defined rules or through a consensus mechanism.
+What is the purpose and mission of the Dappnode DAO?
DappNode's DAO aims to promote and simplify the use of decentralized infrastructure. It aspires to create a more decentralized web by providing tools that make running nodes, DApps, and blockchain-related software more user-friendly and accessible to a wider audience. By establishing a DAO, DappNode ensures that its mission and direction are decided collectively by its community, allowing for a more democratic and transparent decision-making process. The DappNode DAO encourages collaboration, fostering a community that is actively involved in the project's evolution, and ensuring the sustainability and success of the platform in the decentralized space.
+
+
\ No newline at end of file
diff --git a/docs/dao/index.html b/docs/dao/index.html
new file mode 100644
index 000000000..4614c1695
--- /dev/null
+++ b/docs/dao/index.html
@@ -0,0 +1,27 @@
+
+
+
+
+
+DAO | Dappnode
+
+
+
+
+
+
The DAO section of our documentation is currently outdated due to a security incident. For a detailed explanation of the issue and our response plan, please refer to our post-mortem report on the node hack.
The Dappnode DAO will be an inclusive hub in which Dappnode’s community will carry on its mission to keep the web decentralized, uncensored and resilient. Active DAO members will have the opportunity to vote on Dappnode’s future projects and on how to expand its array of hardware and software solutions.
+
To get involved in Governance, DAO aspirants will need to make contributions to the ecosystem and help kick-start the NODE economy. Those who provide liquidity in the sanctioned pools (Uniswap and Sushiswap) or commit NODE to Governance Staking on Ethereum Mainnet or xDai will be granted voting powers proportional to their contributions. This way we can ensure that those with a voice are also those with a stake, and are not merely speculating with the token.
DAppnode has tapped Snapshot technology to build its Governance structure. Snapshot is a novel piece of technology that allows off-chain voting for on-chain actions. It removes the prohibitive gas costs of participating in on-chain governance by taking snapshots of members’ NODE currently being staked. Voting and creating proposals with Snapshot is done with a simple crypto wallet signature, no gas needed.
The first Dappnode project post-launch will be the hotly awaited ValidatorDAO. You can read this Medium article to learn more about how ValidatorDAO is poised to revolutionize the relationship between Validators and Nominators!
Liquidity Mining (LM) launched on Jul 17 2021, 20:00:00 GMT. 5.5% of the total token supply, 5.5 Million NODE, has been allocated to the first LM round of 6 months. NODE reward distribution for the 4 pools available is as follows:
A further 5.5% of the token supply has been reserved for future rounds of LM. At the end of the first round the team will re-assess the Liquidity Mining program, potentially deploying new pools and distribution.
90% of the entire initial supply of NODE has been allocated to the "NODEstream" which is set to flow for a period of 3 years (36 months - i.e. until July 2024). This is essentially a continuous stream of NODE that flows out of the "Reservoir" and into the "Claimable" section of the dashboard. NODEstream distribution can be roughly tracked as follows:
+
Table for Eth
+
Date
Month
Claimable
Held in Reservoir
Jul 17 2021, 22:00:00 GMT+0200 (Central European Summer Time)
0
10%
90%
Apr 17 2022, 22:00:00 GMT+0200 (Central European Summer Time)
9
32.5%
67.5%
Jan 17 2023, 22:00:00 GMT+0200 (Central European Summer Time)
18
55%
45%
Oct 17 2023, 22:00:00 GMT+0200 (Central European Summer Time)
27
77.5%
22.5%
Jul 17 2024, 16:00:00 GMT+0200 (Central European Summer Time)
36
100%
0%
+
Table for xDai
+
Date
Month
Claimable
Held in Reservoir
Jul 17 2021, 22:00:00 GMT+0200 (Central European Summer Time)
0
0%
100%
Apr 17 2022, 22:00:00 GMT+0200 (Central European Summer Time)
9
25%
75%
Jan 17 2023, 22:00:00 GMT+0200 (Central European Summer Time)
18
50%
50%
Oct 17 2023, 22:00:00 GMT+0200 (Central European Summer Time)
27
75%
35%
Jul 17 2024, 16:00:00 GMT+0200 (Central European Summer Time)
36
100%
0%
+
The NODEstream works on a time-based linear function, meaning the reservoir will gradually hold a smaller percentage of your NODE and thus more NODE is made instantly available from your staking rewards. At the end of the NODEstream The reservoir will no longer hold any NODE and 100% of your staking rewards will be instantly claimable.
+
This chart show how the function works in Etherum network.
+
+
This chart show how the function works in dao network. In Ethereum 10% was available at the beginning. In xdai is different, initially it was not available any % token.
+
+
The NODEstream has been designed to encourage long-term participation in the NODE Economy. As the NODE Economy grows and the Dappnode universe expands, our community is awarded even more NODE to use in DAO governance.
+
+
Recipients of the NODEdrop on xDai Network are granted the NODEstream, whereas on Mainnet the NODEdrop does not include the NODEstream automatically. In order to receive and augment the flow of NODE you must provide liquidity in any of the eligible pools. Some part of the rewards earned from NODEstaking are claimable immediately, where as the other part is allocated to the reservoir for NODEstreaming.
+
+
\ No newline at end of file
diff --git a/docs/dao/node-drop.md b/docs/dao/node-drop.md
index 41a39114f..e3283167b 100644
--- a/docs/dao/node-drop.md
+++ b/docs/dao/node-drop.md
@@ -1,6 +1,7 @@
----
-title: NODEdrop
-llm_description: NODEdrop airdrop program for early Dappnode supporters and community members.
+> ## Documentation Index
+> Fetch the complete documentation index at: https://docs.dappnode.io/llms.txt
+> Use this file to discover all available pages before exploring further.
+
---
# NODEdrop
diff --git a/docs/dao/node-drop/index.html b/docs/dao/node-drop/index.html
new file mode 100644
index 000000000..053dbc9e9
--- /dev/null
+++ b/docs/dao/node-drop/index.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+NODEdrop | Dappnode
+
+
+
+
+
+
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+
+
\ No newline at end of file
diff --git a/docs/dao/node-stream.md b/docs/dao/node-stream.md
index fb9ef9dcd..1cdfe725b 100644
--- a/docs/dao/node-stream.md
+++ b/docs/dao/node-stream.md
@@ -1,6 +1,7 @@
----
-title: NODEstream
-llm_description: NODEstream vesting program for gradual token distribution to participants.
+> ## Documentation Index
+> Fetch the complete documentation index at: https://docs.dappnode.io/llms.txt
+> Use this file to discover all available pages before exploring further.
+
---
# NODEstream
diff --git a/docs/dao/node-stream/index.html b/docs/dao/node-stream/index.html
new file mode 100644
index 000000000..42e93df16
--- /dev/null
+++ b/docs/dao/node-stream/index.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+NODEstream | Dappnode
+
+
+
+
+
+
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+
+
\ No newline at end of file
diff --git a/docs/dev.md b/docs/dev.md
index a02ba9b59..307d407d3 100644
--- a/docs/dev.md
+++ b/docs/dev.md
@@ -1,7 +1,7 @@
----
-title: "Welcome to the Developer Documentation!"
-sidebar_label: Introduction
-llm_description: "Introduction to Dappnode developer docs for creating, deploying, and managing custom packages."
+> ## Documentation Index
+> Fetch the complete documentation index at: https://docs.dappnode.io/llms.txt
+> Use this file to discover all available pages before exploring further.
+
---
# Welcome to the Developer Documentation!
diff --git a/docs/dev/dns.md b/docs/dev/dns.md
index cd59362f8..89796b647 100644
--- a/docs/dev/dns.md
+++ b/docs/dev/dns.md
@@ -1,6 +1,7 @@
----
-title: "🌐 DNS"
-llm_description: "DNS-based service discovery and domain naming conventions for DAppNode packages."
+> ## Documentation Index
+> Fetch the complete documentation index at: https://docs.dappnode.io/llms.txt
+> Use this file to discover all available pages before exploring further.
+
---
# 🌐 DNS
diff --git a/docs/dev/dns/index.html b/docs/dev/dns/index.html
new file mode 100644
index 000000000..bf7b78bbd
--- /dev/null
+++ b/docs/dev/dns/index.html
@@ -0,0 +1,74 @@
+
+
+
+
+
+🌐 DNS | Dappnode
+
+
+
+
+
+
By default, every DAppNode package runs on Docker networks that provide DNS-based service discovery. The main network is dncore_network, which uses a public IP range, and starting from core version 0.3.2, there is also a dnprivate_network with the private IP range 10.20.0.0/24. Both networks allow packages to communicate and resolve service names, but dnprivate_network adds a security layer by restricting access to a private IP range, making it ideal for accessing sensitive UIs and services.
+
During installation, each package is assigned a unique domain name (apart from the ones set by default by Docker: container name, service name, etc.) that can be used to access the services running inside the package. The aliasing convention is the same for both networks, with one key difference: domains in dncore_network end with .dappnode, while in dnprivate_network they end with .dappnode.private.
+
This document provides a comprehensive guide on how to access services running inside a package using the assigned domain names in both networks.
In multiservice packages, the naming convention is: <serviceName>.<shortDnpName>.dappnode (for dncore_network) or <serviceName>.<shortDnpName>.dappnode.private (for dnprivate_network), where serviceName is the name of the service running inside the package and shortDnpName is the name of the package. For example, if you have a package named my-package running a service named my-service, the domain names to access the service would be:
+
+
On dncore_network: my-service.my-package.dappnode
+
On dnprivate_network: my-service.my-package.dappnode.private
+
+
info
The short DNP name is derived from the first part of the DNP name, which corresponds to the package name. For example, if the DNP name is my-package.dnp.dappnode.eth, the short DNP name would be my-package.
beacon-chain service: beacon-chain.prysm.dnp.dappnode (public) and beacon-chain.prysm.dnp.dappnode.private (private)
+
validator service: validator.prysm.dnp.dappnode (public) and validator.prysm.dnp.dappnode.private (private)
+
+
tip
A main service can be defined in a multiservice package. This service will be the one used to access the package. For example, if you have a package named my-package running a service named my-service and you want to access the package using the domain name my-package.dappnode or my-package.dappnode.private, you can define the service my-service as the main service. See manifest file reference - mainService for details on how to define the main service.
In monoservice packages, the domain name is the same as the package name. For example, if you have a package named my-package, the domain names to access the service would be:
+
+
On dncore_network: my-package.dappnode
+
On dnprivate_network: my-package.dappnode.private
+
+
It also follows the same convention as the multiservice packages. For example, if you have a package named my-package running only one service named my-service, the domain names to access the service would be:
+
+
On dncore_network: my-service.my-package.dappnode or my-package.dappnode
+
On dnprivate_network: my-service.my-package.dappnode.private or my-package.dappnode.private
Staker packages are a special case in DAppNode. They follow the same DNS conventions mentioned above, with some additional features:
+
+
EVMs dedicated Docker networks: Each EVM network supported in DAppNode has a dedicated Docker network that is used by the staker packages to communicate with each other. The Docker network name follows the convention <network>_network, e.g., hoodi_network for the Hoodi network or mainnet_network for the Mainnet network.
+
Fullnode aliases: The selected Execution and Consensus client has an extra domain name to indicate that it is the client selected by the user. This domain name can be used by other packages to query the RPC node, the validator API, the beacon chain API, etc. (in some cases, it might require authentication). The naming convention is:
+
+
Execution: execution.<network>.dncore.dappnode (public) and execution.<network>.dncore.dappnode.private (private)
+
Consensus:
+
+
Beacon-chain: beacon-chain.<network>.dncore.dappnode (public) and beacon-chain.<network>.dncore.dappnode.private (private)
+
Validator: validator.<network>.dncore.dappnode (public) and validator.<network>.dncore.dappnode.private (private)
+
+
+
+
+
+
info
The fullnode alias is added to both Docker networks, dncore_network and <network>_network, as well as to dnprivate_network, so it can be accessed from any package running in the DAppNode, using either the public or private domain.
GitHub Actions help automate workflows around your projects on GitHub. For Dappnode packages, we utilize specific GitHub Actions to manage updates, testing, and releases.
The staker package CI runs on a GitHub self-hosted runner with Dappnode pre-installed and running with DEV=true, which enables the WebSocket frontend-backend RPC as an API. This allows the CI to use the same RPC calls a user would make to configure a staker setup.
Consensus client packages (Lodestar, Teku, Prysm, Nimbus, Lighthouse) use three GitHub Actions workflows. Unlike execution clients, consensus clients do not need a sync.yml workflow because they use checkpoint sync, which doesn't require pre-synced volumes.
Consensus clients don't have a sync.yml workflow because they use checkpoint sync. This allows them to sync quickly from a trusted checkpoint rather than from genesis, eliminating the need for pre-synced volumes.
+
1. Auto Check for Upstream Updates (auto_check.yml)
+
Same as standard packages - checks for upstream updates and creates PRs when new versions are available.
Triggered on PRs to test package changes. Builds the consensus client package, uploads it to the local IPFS node, and runs a sync test paired with an execution client.
This workflow keeps the execution client synced on the self-hosted runner. By maintaining a synced state, other workflows (sync-test, release) complete much faster.
+
+
\ No newline at end of file
diff --git a/docs/dev/github-actions/staker-packages/overview.md b/docs/dev/github-actions/staker-packages/overview.md
index 537b188db..9b6cb21e0 100644
--- a/docs/dev/github-actions/staker-packages/overview.md
+++ b/docs/dev/github-actions/staker-packages/overview.md
@@ -1,7 +1,7 @@
----
-title: "Staker Packages CI Overview"
-sidebar_label: Overview
-llm_description: "Overview of CI/CD workflows for Dappnode staker packages including execution clients, consensus clients, and web3signer."
+> ## Documentation Index
+> Fetch the complete documentation index at: https://docs.dappnode.io/llms.txt
+> Use this file to discover all available pages before exploring further.
+
---
# Staker Packages CI Overview
diff --git a/docs/dev/github-actions/staker-packages/overview/index.html b/docs/dev/github-actions/staker-packages/overview/index.html
new file mode 100644
index 000000000..5408eff42
--- /dev/null
+++ b/docs/dev/github-actions/staker-packages/overview/index.html
@@ -0,0 +1,78 @@
+
+
+
+
+
+Staker Packages CI Overview | Dappnode
+
+
+
+
+
+
Staker packages require more complex CI than standard packages because they need integration testing on real Dappnode hardware. This ensures that execution clients, consensus clients, web3signer, and MEV-boost work correctly together in a real staking environment.
Each test runs on a fresh Dappnode instance that is always kept up to date with the latest versions of all core packages. When a test starts, no staker packages are installed - the environment is completely clean, ensuring consistent and reproducible test results.
The Dappmanager runs with DEV=true, which enables the WebSocket frontend-backend RPC as an API
+
The CI uses the same RPC calls a user would make through the UI to configure their staker setup (installing execution clients, consensus clients, web3signer, etc.)
+
This ensures tests are as close to real user interactions as possible
Pre-synced execution client databases are stored in their respective volumes on the runner, enabling fast sync without waiting hours for a full sync from scratch
+
Consensus clients use checkpoint sync, so no pre-synced volume is required
Web3Signer is a critical component in the staking stack that handles validator key management and signing. The CI workflows for Web3Signer will need to verify:
+
+
Proper key import functionality
+
Signing operations work correctly
+
Integration with both execution and consensus client pairs
+
+
\ No newline at end of file
diff --git a/docs/dev/github-actions/standard-packages.md b/docs/dev/github-actions/standard-packages.md
index 5cf46384e..de665b7c3 100644
--- a/docs/dev/github-actions/standard-packages.md
+++ b/docs/dev/github-actions/standard-packages.md
@@ -1,7 +1,7 @@
----
-title: "Standard Packages CI"
-sidebar_label: Standard Packages
-llm_description: "GitHub Actions workflows for standard Dappnode packages including upstream version checking and release automation."
+> ## Documentation Index
+> Fetch the complete documentation index at: https://docs.dappnode.io/llms.txt
+> Use this file to discover all available pages before exploring further.
+
---
# Standard Packages CI
diff --git a/docs/dev/github-actions/standard-packages/index.html b/docs/dev/github-actions/standard-packages/index.html
new file mode 100644
index 000000000..de49a0129
--- /dev/null
+++ b/docs/dev/github-actions/standard-packages/index.html
@@ -0,0 +1,36 @@
+
+
+
+
+
+Standard Packages CI | Dappnode
+
+
+
+
+
+
Standard Dappnode packages (e.g., Rotki, IPFS) use a straightforward CI workflow consisting of two main GitHub Actions: upstream version checking and build/release automation.
+
1. Auto Check for Upstream Updates (auto_check.yml)
+
This action checks if there's an available update from the upstream repository. If an update is found, it creates a Pull Request with the new version.
Scheduled Runs: The action runs every 4 hours (as per the cron setting).
+
Environment Variables: Uses GITHUB_TOKEN for authentication, and PINATA_API_KEY and PINATA_SECRET_API_KEY for interfacing with the IPFS pinning service Pinata.
Welcome to the Dappnode's developer docs! This documentation is your comprehensive guide to using the tools and resources that enable you to create, deploy, and manage your own custom dappnode packages (DNP). Whether you're new to the project or an experienced developer, this documentation will help you navigate the intricacies of developing in the dappnode environment.
+
caution
This documentation is for experienced people in the dappnode ecosystem or developers who want to contribute to dappnode by creating new packages. If you're new to dappnode, we recommend starting with the User Documentation.
We welcome contributions from the community! If you'd like to contribute to Dappnode, please review our [Contributing Guidelines] to understand how you can get involved.
This framework enables package developers to expose useful metrics and provide prebuilt dashboards to monitor their services.
+
tip
🧠 What is DMS?
+The DMS (DAppNode Monitoring Stack) package collects metrics using Prometheus and visualizes them through Grafana. It automatically discovers and injects metrics configurations from installed packages.
These files must follow specific naming conventions and formats:
+
+
Grafana dashboard files:
+
+
Name: Must follow this naming pattern /.*grafana-dashboard.json$/ and be placed in the root directory of your package (or within the variant directory).
+
Max size: 10MB
+
Multiple files: You can include multiple dashboard files, and they will be merged into a single dashboard in Grafana.
+
+
+
Prometheus targets file:
+
+
Name: Must follow this naming pattern /.*prometheus-targets.(json|yaml|yml)$/ and be placed in the root directory of your package (or within the variant directory).
+
Max size: 1MB
+
Only one file: You can only include one targets file.
+
+
+
+
tip
💡 Need the DNS name of a service to configure Prometheus targets?
+Refer to the Package DNS documentation to learn how to reference services within your Prometheus targets.
The DMS package includes default dashboards and Prometheus targets for cadvisor and node_exporter. These dashboards provide metrics about the host and Docker containers running on the host.
Notifications are a way to inform users about events happening in the DAppNode. They are displayed in the notifications tab within the DAppNode UI. Notifications are sent by third-party software, "Gatus," which monitors the services running in the DAppNode or arbitrary services that send notifications. Users can configure the notifications they want to receive and set thresholds (if applicable) for these notifications.
+
info
It is mandatory for users to install the Notifications package to receive notifications.
Each notification has a structure that includes the following fields:
+
+
title: The title of the notification. Part of the notification payload.
+
body: The body of the notification. Part of the notification payload.
+
category: The category of the notification, used to group notifications by type. Part of the notification payload.
+
dnpName: The DNP name of the package that sent the notification, used to identify the source package. Part of the notification payload.
+
seen: A boolean value indicating whether the notification has been seen by the user. This is handled automatically by the notifications package, with a default value of false. It is set to true once the user views the notification.
+
timestamp: The timestamp of when the notification was sent, used to sort notifications by date. This is automatically set by the notifications package when the notification is received.
+
callToAction: An optional field that includes a title and a URL, providing a link for the user to take action on the notification. Part of the notification payload.
+
+
title: The title of the call to action.
+
url: The URL for the call to action.
+
+
+
errors: An optional field that includes an error message, providing additional information about the notification. If provided, the notification will not be shown in the inbox. Part of the notification payload.
+
icon: An optional field that includes an icon URL, used to display an icon for the notification. If not provided, the icon of the package that sent the notification will be used. Part of the notification payload.
The notifications package exposes an API that allows other packages to send notifications. This API is a simple HTTP POST request that includes the notification structure as the body of the request. The API is available at the following URL:
The notifications inbox is a place where users can see all the notifications that have been sent to them. Notifications are grouped by category and can be filtered by date, dnpName, and category. Users can also mark notifications as read or delete them.
The notifications settings allow users to configure the notifications they want to receive. Users can enable or disable notifications for each category and set thresholds for each notification. Thresholds determine when a notification should be sent. For example, if a user wants to receive a notification when CPU usage exceeds 80%, they can set the threshold to 80%. If the CPU usage goes above 80%, a notification will be sent.
+
In order to have a slider in the UI to adjust the threshold of the notification, the (gatus) endpoint must have a metric object. Yo can see it in the Notifications file reference section.
+
info
Only a threshold per endpoint is supported. The value it will be extracted from the first entry from the conditions array. Updating the value of the slider in the UI will update also the value of that condition.
+
+
Furthermore, the notifications settings can be configured also during the installation process of the dappnode package.
+
+
tip
The notifications settings are persisted during the automatic update of the package.
Currently, the only communication channel available is the DAppNode UI. However, there are plans to implement additional communication channels, with the following priorities:
+
+
Web push notifications
+
Telegram
+
+
+
Thanks for reading the guide! If you found some problem in the process, do not hesitate to contact us in Discord / Telegram.
+
+
\ No newline at end of file
diff --git a/docs/dev/package-development/multi-configuration.md b/docs/dev/package-development/multi-configuration.md
index 422c221e4..b76c30c67 100644
--- a/docs/dev/package-development/multi-configuration.md
+++ b/docs/dev/package-development/multi-configuration.md
@@ -1,6 +1,7 @@
----
-title: "Multi-Config Package Development"
-llm_description: "Guide for developing multi-variant packages supporting different networks from one codebase."
+> ## Documentation Index
+> Fetch the complete documentation index at: https://docs.dappnode.io/llms.txt
+> Use this file to discover all available pages before exploring further.
+
---
# Multi-Config Package Development
diff --git a/docs/dev/package-development/multi-configuration/index.html b/docs/dev/package-development/multi-configuration/index.html
new file mode 100644
index 000000000..836880deb
--- /dev/null
+++ b/docs/dev/package-development/multi-configuration/index.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+Multi-Config Package Development | Dappnode
+
+
+
+
+
+
This guide will walk you through the steps to develop a multi-config Dappnode package, allowing you to create multiple package configurations from a single source. We'll use the Lodestar Generic package as a reference, which builds multiple variants for different networks like Mainnet, Holesky, and Gnosis.
Each variant of your package will have its own configuration files under package_variants. For example, if you have mainnet and testnet variants, you will find the following:
The contents within each variant directory include the fields that differ from one variant to another. When building a specific variant, such as testnet, the data from these variant-specific files is merged with the root-level dappnode_package.json and docker-compose.yml. This ensures that only the necessary variant-specific changes are applied, while the common configuration remains consistent across all variants.
+
You can add more variants as needed by creating additional directories and files following this structure.
Replace the default avatar (avatar-default.png) with a square .png image that represents your package (recommended dimensions: width between 200px and 300px). This image will appear in the Dappnode UI, so it's important to choose one that aligns with your package's branding. The avatar is common for each of the variants.
+
Key Changes in docker-compose.yml and dappnode_package.json
+
In the root-level docker-compose.yml and dappnode_package.json, specify the general configuration that applies across all variants.
+
Each variant in package_variants will have its own docker-compose.yml and dappnode_package.json, tailored to the network or environment it is intended for.
+
For example, package_variants/mainnet/docker-compose.yml could define services using NETWORK=mainnet, while package_variants/testnet/docker-compose.yml would use NETWORK=testnet.
+
Example of a variant-specific dappnode_package.json:
Here’s an example of the Dockerfile used for the Lodestar Generic package. This Dockerfile is responsible for configuring the Lodestar Ethereum client and handling multiple variants.
+
ARG UPSTREAM_VERSION FROM chainsafe/lodestar:${UPSTREAM_VERSION} ARG NETWORK ARG STAKER_SCRIPTS_VERSION # Additional envs ENV STAKER_SCRIPTS_URL=https://github.com/dappnode/staker-package-scripts/releases/download/${STAKER_SCRIPTS_VERSION} COPY entrypoint.sh /usr/local/bin/entrypoint.sh # These scripts provide useful tools for the entrypoint ADD ${STAKER_SCRIPTS_URL}/consensus_tools.sh /etc/profile.d/ RUN chmod +rx /etc/profile.d/consensus_tools.sh # Additional commands or package installation # This environment variable sets the variant (e.g., mainnet, testnet) ENV NETWORK=${NETWORK} ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
The entrypoint.sh script for the Lodestar client manages different network setups (e.g., Holesky, Gnosis, Mainnet) and configures runtime flags accordingly. Here’s a simplified version:
+
#!/bin/sh SUPPORTED_NETWORKS="gnosis holesky mainnet" MEVBOOST_FLAG_KEY="--builder" CLIENT="lodestar" # Load the tools scripts . /etc/profile # Get the necessary environment variables for the beacon node ENGINE_URL="http://execution.${NETWORK}.staker.dappnode:8551" VALID_FEE_RECIPIENT=$(get_valid_fee_recipient "${FEE_RECIPIENT}") MEVBOOST_FLAG=$(get_mevboost_flag "${NETWORK}" "${MEVBOOST_FLAG_KEY}") JWT_SECRET=$(get_jwt_secret_by_network "${NETWORK}") echo "${JWT_SECRET}" >"${JWT_FILE_PATH}" # Start the beacon node with the appropriate flags echo "[INFO - entrypoint] Running beacon node" FLAGS="beacon \ --network=${NETWORK} \ --suggestedFeeRecipient=${VALID_FEE_RECIPIENT} \ --jwt-secret=${JWT_FILE_PATH} \ --execution.urls=${ENGINE_URL} \ # ... Additional flags here --logFileDailyRotate=5 $MEVBOOST_FLAG $EXTRA_OPTS" # Run the Lodestar client with the specified flags exec ${CLIENT_BIN} $FLAGS
In multi-variant packages, you can use a common Grafana dashboard located at the root level, while each variant can have its own Prometheus targets. These are stored in variant-specific directories like package_variants/gnosis/prometheus-targets.json.
+
By following this guide, you’ll be able to create multi-variant packages that support different networks or configurations within a single source code base.
Once you have built your variants, you can choose to publish them. While publishing is optional if you only want to use the package locally, it is required if you want your package to be available in the public Dappstore for other users to discover and install.
+
The publish command allows you to specify which variants you want to publish, using the same --variants flag as the build command. You can publish one or more variants as follows:
+
npx @dappnode/dappnodesdk@latest publish --type=<patch/minor/major> --variants=<comma-separated-list-of-variants> --eth-provider=<your ETH RPC> --content-provider=<your IPFS API> --developer-address=<the address to sign>
+
If you want to generate all variants publish links at once, you can use the following command:
If your package source code is hosted on GitHub, you can automate the publishing process by setting up GitHub Actions. Use the workflows here to integrate publishing workflows, ensuring your package builds and publishes automatically.
+
By following these steps, you'll be able to develop, build, and publish multi-variant packages on Dappnode, making it easier to support multiple configurations from a single codebase.
+
+
\ No newline at end of file
diff --git a/docs/dev/package-development/overview.md b/docs/dev/package-development/overview.md
index abd2336d7..e83e946b9 100644
--- a/docs/dev/package-development/overview.md
+++ b/docs/dev/package-development/overview.md
@@ -1,6 +1,7 @@
----
-title: "Package Development"
-llm_description: "Overview of single-config and multi-config package repository types."
+> ## Documentation Index
+> Fetch the complete documentation index at: https://docs.dappnode.io/llms.txt
+> Use this file to discover all available pages before exploring further.
+
---
# Package Development
diff --git a/docs/dev/package-development/overview/index.html b/docs/dev/package-development/overview/index.html
new file mode 100644
index 000000000..6c564427a
--- /dev/null
+++ b/docs/dev/package-development/overview/index.html
@@ -0,0 +1,27 @@
+
+
+
+
+
+Package Development | Dappnode
+
+
+
+
+
+
Welcome to the Package Development section! This guide will help you create your own Dappnode packages. In Dappnode, packages are applications that you can download and install on your Dappnode machine, allowing you to enhance its functionality.
Standard Package Repository: Used to generate a single package, tailored for a specific configuration.
+
Multi-Configuration (Generic) Package Repository: Used to generate multiple packages with varying configurations, such as different networks or client setups. For example, a multi-configuration repository could be used to build packages for both Holesky Nethermind and Mainnet Nethermind, which differ in their configurations.
This guide will walk you through the steps to develop a single-variant Dappnode package using a simple example. We'll start with initializing a basic package and progress to a more complex setup, using the Holesky Geth package as a reference.
For more complex packages, such as the Holesky Geth package, it is recommended to create a directory (e.g., geth) that will contain everything that needs to go inside each Docker container corresponding to a service in the compose file. This includes the Dockerfile, an entrypoint.sh script, and any security or configuration files. Example:
Replace the default avatar (avatar-default.png) with a square .png image that represents your package (recommended dimensions: width between 200px and 300px). This image will appear in the Dappnode UI, so it's important to choose one that aligns with your package's branding.
+
Key Changes in docker-compose.yml and dappnode_package.json
+
In the docker-compose.yml, modify the services section to:
+
+
Reference the newly created directory (geth in this example) where the Dockerfile and other container files are stored.
+
Set up environment variables, ports, and volumes relevant to your service.
+
+
In the dappnode_package.json, update fields such as:
+
+
name, version, description, and author to reflect your package.
+
Add relevant categories, architectures, and exposed services (e.g., API endpoints).
The entrypoint.sh script is responsible for setting up the environment and running the application. Here’s a simplified version:
+
#!/bin/sh # Additional logic related to JWT token # Start the Geth process (add any flags you consider relevant) exec geth --authrpc.jwtsecret ${JWT_PATH} ${EXTRA_FLAGS}
Once all the necessary customizations are made, you can build your package by running the following command while connected to your Dappnode box:
+
npx @dappnode/dappnodesdk@latest build
+
This will package your service, making it ready for installation on a Dappnode machine. Once you get the package hash, you just have to paste it into the Dappstore search bar to download it.
Publishing the package is optional; you can install and use the package locally after building it. However, if you want the package to be available in the public Dappstore for other users to discover and install, publishing is required. To publish the package, start by running the following command:
+
npx @dappnode/dappnodesdk@latest publish --type=<patch/minor/major> --eth-provider=<your ETH RPC> --content-provider=<your IPFS API> --developer-address=<the address to sign>
+
This command will return a link where you can perform the transaction to publish the package.
If the package source code is hosted on GitHub, you can automate the publishing process by setting up GitHub Actions. Use the workflows here to integrate publishing workflows.
This guide outlines the role permission system used in Dappnode package management, powered by Aragon’s ACL (Access Control List) smart contracts. It explains how to check and modify roles such as permission managers and developers.
+
Whether you're assigning roles or verifying access, this doc walks you through each step clearly and effectively.
Dappnode package permissions are managed via the smart contract ACL of their respective package repositories.
+
info
In Aragon, the ACL (Access Control List) is a core smart contract that manages permissions. It determines which address (or entity) can call which function on which app (smart contract).
Our package publishing UI includes an "Ownership" tab that allows you to check the current role of an address for a specified package and perform actions based on that role.
The manager is typically the address that published the first version of the package. It is the only address that can transfer management rights, as well as grant or revoke developer permissions.
+
info
A package can only have one address as its package manager.
Changing the manager will transfer full control of the package to the specified address, revoking all manager permissions from the current manager. This action is irreversible.
+
To change the manager address, provide the new manager address and click "Transfer Manager Role" in the "Change Manager" section.
+
+
info
Transferring the manager role does not automatically grant developer permissions to the new address. If you want to provide publishing access, you must grant developer rights separately.
+
+
\ No newline at end of file
diff --git a/docs/dev/package-publishing/publish-packages-clients.md b/docs/dev/package-publishing/publish-packages-clients.md
index d18107831..54ea624a3 100644
--- a/docs/dev/package-publishing/publish-packages-clients.md
+++ b/docs/dev/package-publishing/publish-packages-clients.md
@@ -1,6 +1,7 @@
----
-title: Publish your packages seamlessly
-llm_description: "Step-by-step guide for publishing packages using the SDK-publish UI."
+> ## Documentation Index
+> Fetch the complete documentation index at: https://docs.dappnode.io/llms.txt
+> Use this file to discover all available pages before exploring further.
+
---
# Publish your packages seamlessly
diff --git a/docs/dev/package-publishing/publish-packages-clients/index.html b/docs/dev/package-publishing/publish-packages-clients/index.html
new file mode 100644
index 000000000..c5d366b32
--- /dev/null
+++ b/docs/dev/package-publishing/publish-packages-clients/index.html
@@ -0,0 +1,43 @@
+
+
+
+
+
+Publish your packages seamlessly | Dappnode
+
+
+
+
+
+
The aim of this guide is to help you publish the new packages of your product in Dappnode seamlessly. We created a new UI to ease the publication of your packages in a few minutes.
Step 1. Go to Dappnode Github and search for the generic repository of your product. You will find it with the name of DAppNodePackage-yourproduct-generic.
+
If your product is not listed and you want it to be included in Dappnode, contact us in Discord or Telegram.
+
Step 2. Click on the Releases title section on the right side column (highlighted in red)
+
+
Step 3. In the releases section you can see all the packages of your product in the different blockchains. Select the package and click on 📣 Publish.
+
Ideally you should have tested the package before publishing. You can use the IPFS hash from the release to install the package without having to publish it.
+
+
Step 4. Once in this screen, click Connect wallet. Remember that the publishing wallet needs to be whitelisted by Dappnode. If your wallet is not whitelisted yet, contact us in Discord / Telegram.
+
+
Your wallet is mainly used for two tasks: to authenticate that you are eligible to publish in the APM SmartContracts and to sign the package to be published. This signature is used in the dappnode to verify that the package was actually signed by a "trusted key"
+
Step 5. Configure your custom IPFS settings. If you do not change it, default settings shown will be applied. Click Next button.
+
+
Step 6. Specify the details of your release.
+Dappnode package name: You can find it in dappnode_package.json file in the package.
+Developer address: In case you want to add a developer address to publish future versions a part from the owner.
+Next version: You can find it in dappnode_package.json file in the package.
+Release hash: You find it in the release table in Step3.
+Click Next button
+
+
Step 7. Check the details of the package and sign the transaction with your wallet. The wallet must be connected in Ethereum mainnet to sign the transaction (even if the package is from other blockchain).
+
+
Step 8. After signing the first transaction, you need to click the Publish button and sign again with your wallet. This time you need ETH (gas) to sign the transaction.
+
+
Step 9. Your package was successfully published! Congrats! 🎉
+If your product has a community of dappnode users, we invite you to announce it in our Discord community. Every user with this package installed and auto-updates enabled will auto update it within less than 3 days.
+
Thanks for reading the guide! If you found some problem in the process, do not hesitate to contact us in Discord / Telegram.
Dappnode packages are built upon Docker containers. The heart of defining how these containers run and interact lies in the docker-compose.yml file. In this guide, we will explain the typical structure of the docker-compose.yml file for a Dappnode package.
All environment variables (envs) defined in the docker-compose.yml file will be visible in the package config post-installation. Users can modify these.
+
If the package has a setup-wizard, those environment variables not set within it will be hidden by default in the configuration. Users can view these by selecting "Show advanced config".
The UPSTREAM_VERSION argument is mandatory if you wish to leverage GitHub actions that automatically create PRs when there's a new release in the upstream repository.
+
+
+
In the Dockerfile, UPSTREAM_VERSION is usually declared and used like this:
+
ARG UPSTREAM_VERSION FROM consensys/teku:$UPSTREAM_VERSION
+
+
+
note
The upstreamVersion and upstreamRepo fields need to be defined in the dappnode_package.json file for the GitHub actions to work. Here is an example:
{ "name": "ipfs.dnp.dappnode.eth", "version": "0.2.0", "upstreamVersion": "2.6.0-beta", "shortDescription": "Distributed file system for storing and accessing data.", "description": "Welcome! IPFS is a distributed system for storing and accessing files, websites, applications, and data. If you’re new to IPFS, check our [introductory page](https://ipfs.io/#why) for an easy overview. \n\nWith this node you can upload and download files from IPFS using it own fancy web console at [http://ipfs.dappnode:5001/webui](http://ipfs.dappnode:5001/webui). Other Dappnode Packages and external applications can use its API at the endpoint `http://ipfs.dappnode:5001/api`. Go to the [IPFS HTTP API full reference](https://docs.ipfs.io/reference/api/http/) to check all the features of the API.", "type": "service", "chain": "ethereum", "mainService": "webserver", "dockerTimeout": "5min", "dependencies": { "bitcoin.dnp.dappnode.eth": "^0.1.2", "swarm.dnp.dappnode.eth": "latest" }, "requirements": { "minimumDappnodeVersion": "0.2.0" }, "globalEnvs": { "all": "true" }, "architectures": ["linux/amd64", "linux/arm64"], "backup": [ { "name": "keystore", "path": "/root/.raiden/secret/keystore", "service": "validator" } ], "changelog": "Brief summary of the most relevant changes that the user must known before installing", "warnings": { "onInstall": "You must set the PASSWORD ENV before installing the Dappnode Package in order for the setup to work correctly.", "onUpdate": "Your VPN connection will be lost when the VPN finalizes updating. Leave 1-2 minutes after executing the update and then reconnect and refresh this site.", "onReset": "You MUST properly close your open channels before resetting this Dappnode Package or you may lose your funds.", "onRemove": "You MUST properly close your open channels before removing this Dappnode Package or you may lose your funds." }, "updateAlerts": [ { "from": "0.1.x", "to": "0.1.x", "message": "Major update to OpenVPN: This update breaks compatibility with the last VPN version. Please read the migration guide: https://migration020.dappnode.io" } ], "disclaimer": { "message": "This software is experimental, presented “as is” and inherently carries risks." }, "style": { "featuredBackground": "linear-gradient(to right, #323131, #395353)", "featuredColor": "white", "featuredAvatarFilter": "invert(1)" }, "exposable": [ { "name": "Geth JSON RPC", "description": "JSON RPC endpoint for Geth mainnet", "serviceName": "beacon_chain", "port": 80 } ], "author": "Dappnode Association <admin@dappnode.io> (https://github.com/dappnode)", "contributors": [ "Michael First <developerHanlder@project.io> (https://github.com/developerHanlder)", "Michael Second <developerHanlder@project.io> (https://github.com/developerHanlder)" ], "categories": ["Developer tools", "Blockchain"], "keywords": ["DappnodeCore"], "links": { "homepage": "https://github.com/dappnode/DNP_IPFS#readme", "ui": "http://ipfs.dappnode:5001/webui", "api": "http://ipfs.dappnode:5001/api/v0", "gateway": "http://ipfs.dappnode:8080/ipfs" }, "repository": { "type": "git", "url": "https://github.com/dappnode/DNP_IPFS.git", "directory": "packages/react-dom" }, "bugs": { "url": "https://github.com/dappnode/DNP_IPFS/issues" }, "license": "GPL-3.0" }
For Dappnode Packages that only wrap existing software (i.e. Bitcoin node, Ethereum node), the underlying software
+version can be specified here. It will be shown in the admin UI alongside the field version.
Short Dappnode Package description, 6-8 words sentence briefly describing the purpose of this Dappnode Package. The
+purpose is to quickly grab users' attention and clearly define its purpose. Markdown is discouraged as it will NOT be
+rendered on the Dappnode Package store view.
+
+
is optional
+
type: string
+
+
Example:
+
"Distributed file system for storing and accessing data."
Dappnode Package description. Markdown and links are allowed and ecouraged to give users the option to read more
+information about this Dappnode Package.
+
+
is required
+
type: string
+
+
Example:
+
"Welcome! IPFS is a distributed system for storing and accessing files, websites, applications, and data. If you’re new to IPFS, check our [introductory page](https://ipfs.io/#why) for an easy overview. \n\nWith this node you can upload and download files from IPFS using it own fancy web console at [http://ipfs.dappnode:5001/webui](http://ipfs.dappnode:5001/webui). Other Dappnode Packages and external applications can use its API at the endpoint `http://ipfs.dappnode:5001/api`. Go to the [IPFS HTTP API full reference](https://docs.ipfs.io/reference/api/http/) to check all the features of the API."
Modify the default Docker timeout of 10 seconds. It affects package updates, removals, container restarts, start and
+stop, updating config environments and port mappings. You can either pass a numerical value in seconds or a string
+representation parsed with timestring. Available from DAPPMANAGER v0.2.36
Dappnode Package dependencies. Must be an object where the keys are the Dappnode Package's ENS. The values must be a
+semantic range, i.e. '0.2.0', '^0.2.1', '*', 'latest',
+'/ipfs/QmWwMb3XhuCH6JnCF6m6EQzA4mW9pHHtg7rqAfhDr2ofi8'.
Allows users to download and restore a backup of key files of this package. If this property is non-empty array, a new
+view will be available in the admin UI for this Dappnode Package. The files or directories specified in the array will
+be bundled in a tarball. As long as the name properties stay the same, their associated paths can change in future
+versions. Then, when restoring an old backup, the new paths will be associated to files stored under the same name
+keys. Note: it is recommended to only backup lightweight files such as configs, keys or passwords.
+
+
is optional
+
type: Array type: object[]
+
+
All items must be of the type: object with the following properties:
Will be shown before updating the Dappnode Package, not in the first installation.
+
+
is optional
+
type: string
+
+
Example:
+
"Your VPN connection will be lost when the VPN finalizes updating. Leave 1-2 minutes after executing the update and then reconnect and refresh this site."
Alert message to be shown when from and to ranges are satisfied.
+
+
is required
+
type: string
+
minimum length: 1 characters
+
+
Example:
+
"Major update to OpenVPN: This update breaks compatibility with the last VPN version. Please read the migration guide: https://migration020.dappnode.io"
CSS background property to be applied to the Dappnode Package card in the Dappnode Package store if featured. Go to the
+Mozilla CSS background reference for valid values.