diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000000..e69de29bb2d diff --git a/404.html b/404.html new file mode 100644 index 00000000000..12570d323ba --- /dev/null +++ b/404.html @@ -0,0 +1,26 @@ + + + + + +Page Not Found | Cosmos Hub + + + + + + + + + + + + + + +
+
Skip to main content

Page Not Found

We could not find what you were looking for.

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/404/index.html b/404/index.html new file mode 100644 index 00000000000..f5f9be2956c --- /dev/null +++ b/404/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 00000000000..e35dc443923 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +hub.cosmos.network diff --git a/assets/css/styles.df8f7e0f.css b/assets/css/styles.df8f7e0f.css new file mode 100644 index 00000000000..f03ca66773a --- /dev/null +++ b/assets/css/styles.df8f7e0f.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))}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,.hash-link{-webkit-user-select:none}.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);--docsearch-searchbox-shadow:inset 0 0 0 1px var(--docsearch-primary-color)}.markdown li,body{word-wrap:break-word}pre,table{overflow:auto}.button,code{vertical-align:middle}html .menu__link:hover,html .table-of-contents__link--active,html .table-of-contents__link:hover{text-shadow:.1px .1px 0 var(--ifm-font-color-base),-.1px -.1px 0 var(--ifm-font-color-base),.1px -.1px 0 var(--ifm-font-color-base),-.1px .1px 0 var(--ifm-font-color-base),-.1px 0 0 var(--ifm-font-color-base),.1px 0 0 var(--ifm-font-color-base),0 .1px 0 var(--ifm-font-color-base),0 -.1px 0 var(--ifm-font-color-base)}html .navbar,html .pagination-nav>a:hover,html[data-theme=dark] .navbar-sidebar__brand{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.markdown,html .markdown{--ifm-heading-vertical-rhythm-bottom:1}*,.DocSearch-Container,.DocSearch-Container *,:after,:before{box-sizing:border-box}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}: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}.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{-webkit-font-smoothing:antialiased;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);text-rendering:optimizelegibility}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)}progress,sub,sup{vertical-align:initial}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[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}.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 ul,ul ol,ul ul{margin:0}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}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);color:inherit;text-decoration:inherit}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]){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)}.clean-btn,hr{color:inherit}.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}.lowercase,.text--lowercase{text-transform:lowercase}.admonitionHeading_tbUL,.alert__heading,.text--uppercase,.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;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{list-style:none;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}.close,html .github-icon:hover{opacity:.5}.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{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),html .DocSearch-Button .DocSearch-Search-Icon,html .DocSearch-Hits mark{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);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;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.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);display:flex;flex-direction:column;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);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;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}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.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;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;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)}.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);text-decoration:none}.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_S0QG>:last-child,.collapsibleContent_i85q>:last-child,.footer__items,html .theme-doc-markdown li:last-child li:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox],dialog,fieldset,legend{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{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{list-style:none;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);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";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{opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;bottom:0;top:0;left: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);text-decoration:none}.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,blockquote,dd,dl,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html .theme-doc-sidebar-container>div:first-child>a,p,pre{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)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.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{-webkit-appearance:none;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:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.pills__item,.tabs__item,[role=button],button{cursor:pointer}.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__link:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;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);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.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;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);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)}.px-5,html .theme-doc-sidebar-menu li li li{padding-left:1rem}.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;--ifm-color-primary:#fff;--ifm-color-primary-dark:#e6e6e6;--ifm-color-primary-darker:#d9d9d9;--ifm-color-primary-darkest:#b3b3b3;--ifm-color-primary-light:#fff;--ifm-color-primary-lighter:#fff;--ifm-color-primary-lightest:#fff;--ifm-background-color:#000;--docusaurus-highlighted-code-line-bg:#00000054;--docsearch-modal-background:#000!important;--docsearch-highlight-color:#ffffff70!important;--docsearch-hit-background:#181818ab!important;--docsearch-key-gradient:linear-gradient(-26.5deg,#5d5d5d,#3c3c3c)!important;--docsearch-key-shadow:inset 0 -2px 0 0 #353535,inset 0 0 1px 1px #7a7a7b,0 2px 2px 0 #2d2d2d4d!important;--docsearch-text-color:#f5f6f7;--docsearch-container-background:#090a11cc;--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 #0304094d;--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 rgba(3,4,9,.302);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 #494c6a80,0 -4px 8px 0 #0003;--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}:root{--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#5064fb;--ifm-color-primary-dark:#000;--ifm-color-primary-darker:#000;--ifm-color-primary-darkest:#000;--ifm-color-primary-light:#000;--ifm-color-primary-lighter:#000;--ifm-color-primary-lightest:#000;--ifm-code-font-size:95%;--ifm-breadcrumb-item-background-active:#0000;--ifm-breadcrumb-padding-horizontal:0;--ifm-list-paragraph-margin:0;--ifm-spacing-horizontal:2rem;--ifm-blockquote-border-color:#000;--ifm-menu-link-padding-vertical:0.6rem;--ifm-background-color:#fff;--ifm-footer-link-color:var(--ifm-font-color-base);--ifm-menu-link-sublist-icon:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJtMSAxIDQgNCA0LTQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9Ii42NjciIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiLz48L3N2Zz4=);--docsearch-searchbox-background:#f7f7f7;--docsearch-modal-background:#f7f7f7!important;--ifm-navbar-height:5.563rem;--ifm-navbar-sidebar-width:100vw;--docsearch-highlight-color:#181818ab!important;--aa-primary-color-rgb:0,0,0;--ifm-menu-color-background-active:none;--ifm-menu-color-background-hover:none;--docusaurus-highlighted-code-line-bg:#0000001a;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:#656c85cc;--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px #1e235a66;--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 #1e235a66;--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 #45629b1f;--docsearch-primary-color:var(--ifm-color-primary);--docsearch-text-color:var(--ifm-font-color-base);--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}#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}*,:after,:before{border:0 solid;margin:0}hr,html .footer{border-top-width:1px}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;tab-size:4}body{line-height:inherit;margin:0}hr{height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.DocSearch-Container a,.tag_zVej:hover{text-decoration:none}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{display:block;margin-bottom:var(--ifm-spacing-vertical);border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0;padding:0}.admonitionHeading_tbUL code,button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}html,html .navbar{background-color:var(--ifm-background-color)}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden],html .DocSearch-Button .DocSearch-Button-Keys,html .breadcrumbs__item:first-child>a>svg{display:none}html{font-feature-settings:"kern","liga","calt","zero" 0;-webkit-font-feature-settings:"kern","liga","calt","zero" 0;-webkit-text-size-adjust:100%;text-size-adjust:100%;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;font-family:Inter,ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-kerning:normal;font-variant-ligatures:contextual common-ligatures;text-rendering:optimizeLegibility}@supports (font-variation-settings:normal){html{font-family:Inter var,ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}}.tags_jXut,svg{display:inline}::selection{background-color:var(--ifm-color-primary);color:#fff}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:400;src:url(/assets/fonts/Inter-Regular-c8ba52b05a9ef10f47584d08ece2ec5c.woff2) format("woff2"),url(/assets/fonts/Inter-Regular-8c206db99195777c67691cbba9d64393.woff) format("woff")}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:500;src:url(/assets/fonts/Inter-Medium-293fd13dbca5a3e450ef1ebfb232a299.woff2) format("woff2"),url(/assets/fonts/Inter-Medium-9053572c46aeb4b16caafd643a543b8d.woff) format("woff")}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:700;src:url(/assets/fonts/Inter-Bold-ec64ea577b0349e055ad6646c1d8797a.woff2) format("woff2"),url(/assets/fonts/Inter-Bold-93c1301bd9f486c573b3d9001c6ec0e4.woff) format("woff")}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:900;src:url(/assets/fonts/Inter-Black-15ca31c0a2a68f76d2d12055bdf97bd0.woff2) format("woff2"),url(/assets/fonts/Inter-Black-c6938660eec019fefd684894b6d00900.woff) format("woff")}@font-face{font-display:swap;font-family:Inter var;font-style:oblique 0deg 10deg;font-weight:100 900;src:url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400;src:url(/assets/fonts/JetBrainsMono-Regular-1e66c47aca088de94ae789a48719cb00.woff2) format("woff2")}.fixed{position:fixed}.relative{position:relative}.block,.tocCollapsibleContent_vkbj a{display:block}.table{display:table}.contents{display:contents}.px-5{padding-right:1rem}.px-5\.5{padding-left:1.25rem;padding-right:1.25rem}.text-left,html .pagination-nav .pagination-nav__link--next{text-align:left}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}html #__docusaurus>div[role=banner]{--tw-text-opacity:1;background-color:#00000008;color:rgb(0 0 0/var(--tw-text-opacity));font-weight:400}html #__docusaurus>div[role=banner] a{font-size:.8125rem;text-decoration-line:none;width:100%}html .navbar{border-bottom-color:var(--ifm-color-emphasis-200);border-bottom-width:1px;height:auto;padding-bottom:.375rem;padding-top:.375rem}html .DocSearch-Button,html .navbar__toggle{--tw-bg-opacity:1;background-color:rgb(247 247 247/var(--tw-bg-opacity));height:3rem;width:3rem}html .navbar__toggle{align-items:center;border-end-start-radius:1rem;border-radius:.5rem;border-start-start-radius:1rem;display:flex;justify-content:center}html .navbar__brand+*{margin-left:auto}html .menu__link,html .navbar__link--active{--tw-text-opacity:1;color:rgb(85 85 85/var(--tw-text-opacity))}html .navbar__items:not(:last-child){justify-content:space-between}html .navbar__items:not(:last-child) button{margin-right:0;order:2}html .navbar__items--right>:last-child{right:3.25rem}html[data-theme=dark] .menu__link,html[data-theme=dark] .navbar__item,html[data-theme=light] .footer__copyright,html[data-theme=light] .footer__link-item,html[data-theme=light] .footer__title,html[data-theme=light] .pagination-nav__sublabel{color:#ffffffab}html[data-theme=dark] .navbar__toggle,html[data-theme=dark] .pagination-nav>a,html[data-theme=dark] .theme-doc-toc-mobile{background-color:#181818ab}html .DocSearch-Button{border-radius:.625rem;color:#00000054;justify-content:center;margin-right:.5rem}html .navbar-sidebar__close,html[data-theme=dark] .DocSearch-Footer,html[data-theme=dark] .DocSearch-Modal,html[data-theme=dark] .navbar-sidebar{background-color:rgb(0 0 0/var(--tw-bg-opacity));--tw-bg-opacity:1}html .DocSearch-Button .DocSearch-Button-Placeholder{padding-right:6rem}.algoliaLogoPathFill_WdUC,html .DocSearch-Logo path{fill:var(--ifm-font-color-base)}html .navbar-sidebar{width:100%}html .navbar-sidebar__brand{height:auto;padding-left:1.5rem;padding-right:1.5rem}html .navbar-sidebar__item{padding-left:1.5rem;padding-right:1.5rem;width:100%}html .navbar-sidebar__back{display:none;padding-left:0;padding-right:0}html .navbar-sidebar__close{align-items:center;border-end-start-radius:1rem;border-radius:.5rem;border-start-start-radius:1rem;display:flex;height:3rem;justify-content:center;margin-left:0;width:3rem}html .navbar-sidebar__close>svg>g{stroke:#fff}html[data-theme=dark] .navbar-sidebar__brand{position:relative}html[data-theme=dark] .navbar-sidebar__brand:after{--tw-bg-opacity:1;background-color:rgb(85 85 85/var(--tw-bg-opacity));bottom:0;content:"";display:block;height:1px;left:0;margin-left:1.5rem;margin-right:1.5rem;position:absolute;right:.5rem}html[data-theme=dark] .navbar-sidebar__close{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}html[data-theme=dark] .navbar-sidebar__close>svg>g{stroke:#000}html[data-theme=dark] .DocSearch-Button{background-color:#181818ab;color:#ffffff70}html[data-theme=dark] .DocSearch-Button-Key{border-color:#ffffff70;color:#ffffff70}html .breadcrumbs__item:first-child>a:after{content:"Docs"}html .breadcrumbs__item:not(:last-child):after{background-image:none;content:">"}html .theme-doc-toc-mobile{--tw-bg-opacity:1;background-color:rgb(247 247 247/var(--tw-bg-opacity));border-radius:1rem;padding:1.25rem 1.5rem 0}html .theme-doc-toc-mobile>button{display:flex;justify-content:space-between;padding:0 0 1.25rem}html .theme-doc-toc-mobile>button:after{background-image:var(--ifm-menu-link-sublist-icon);background-size:70%;margin-left:1rem;order:9999}html .theme-doc-toc-mobile ul li{margin:1rem 0}html[data-theme=dark] .theme-doc-sidebar-menu .menu__list:before{background-color:#ffffff70}html .theme-doc-sidebar-menu{font-weight:400}html .theme-doc-sidebar-menu .menu__list{padding-left:0;position:relative}html .theme-doc-sidebar-menu .menu__list:before{background-color:#00000012;content:"";display:block;height:100%;left:.5rem;position:absolute;top:0;width:2px}html .footer__col:first-child .footer__title,html .footer__link-item>svg,html .menu__caret,html .menu__link>svg,html .theme-doc-sidebar-menu .menu__list ul:before,html li li .menu__link--sublist-caret:after{display:none}html .theme-doc-sidebar-menu .menu__link{padding-left:0;padding-right:1rem}html .theme-doc-sidebar-menu .menu__link--active:not(.menu__link--sublist){color:var(--ifm-font-color-base);font-weight:500}html .theme-doc-sidebar-menu li li{padding-left:2rem}html .theme-doc-sidebar-menu li li .menu__link--active:not(.menu__link--sublist){color:var(--ifm-font-color-base);font-weight:500;position:relative}html .theme-doc-sidebar-menu li li .menu__link--active:not(.menu__link--sublist):before{background-color:var(--ifm-font-color-base);content:"";display:block;height:100%;left:-1.5rem;position:absolute;top:0;width:2px}html .theme-doc-sidebar-menu li li li .menu__link--active:not(.menu__link--sublist):before{left:-2.5rem}html .theme-doc-sidebar-menu li li li li .menu__link--active:not(.menu__link--sublist):before{left:-3.5rem}html .theme-doc-sidebar-menu li li li li li .menu__link--active:not(.menu__link--sublist):before{left:-4.5rem}html .theme-doc-sidebar-menu li li li li li li .menu__link--active:not(.menu__link--sublist):before{left:-5.5rem}html .theme-doc-sidebar-menu li li li li li li li .menu__link--active:not(.menu__link--sublist):before{left:-6.5rem}html .theme-doc-sidebar-item-link .menu__link[target=_blank]:after{content:"\2197";margin-left:.25rem}html .menu__link:hover{color:var(--ifm-font-color-base)}html .pagination-nav .pagination-nav__sublabel,html[data-theme=dark] .footer__copyright,html[data-theme=dark] .footer__link-item,html[data-theme=dark] .footer__title,html[data-theme=dark] .pagination-nav__sublabel{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}html .menu__link--sublist-caret{display:flex}html .menu__link--sublist-caret:after{background-repeat:no-repeat;background-size:16px;margin-left:0;margin-right:.75rem;order:-9999}html .menu__list-item--collapsed .menu__caret:before,html .menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(0)}html .pagination-nav{margin-top:4rem;padding-bottom:2rem}html .pagination-nav>a{border-color:#0000;border-radius:1rem;box-shadow:0 0 80px #00000012;grid-column:span 2/span 2;padding:1.5rem 1.5rem 3.25rem}html .pagination-nav .pagination-nav__sublabel{font-size:1rem;margin-bottom:.625rem}html .pagination-nav .pagination-nav__label{font-size:1.3125rem;font-weight:600}html .footer{background-color:var(--ifm-font-color-base);border-top-color:var(--ifm-color-emphasis-200);padding-top:6rem}html .footer__link-item:hover,html .theme-doc-markdown a:hover{text-decoration-line:underline}html .footer__bottom{margin:0 calc(var(--ifm-spacing-horizontal)*-1)}html .footer__copyright{font-size:.8125rem;margin-top:4rem;text-align:center}html .footer__col:not(:first-child){flex-basis:50%}html .theme-back-to-top-button{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}html .theme-back-to-top-button:after{width:50%}html .theme-code-block{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;margin-top:.5rem}html .markdown{--ifm-h1-vertical-rhythm-bottom:1}html .theme-doc-markdown{border-bottom-color:#00000012;border-bottom-width:1px;margin-top:2rem;padding-bottom:3rem}html .theme-doc-markdown h1{font-size:2.375rem;font-weight:700;letter-spacing:-.025em;line-height:2.5rem}html .theme-doc-markdown h2{font-size:2rem;font-weight:700;letter-spacing:-.025em;line-height:2.25rem}html .theme-doc-markdown h3{font-size:1.3125rem;font-weight:600;letter-spacing:-.025em;line-height:2rem}html .theme-doc-markdown h4{font-size:1rem;font-weight:600;letter-spacing:-.025em;line-height:1.75rem}html .theme-doc-markdown h5{font-size:1rem;font-weight:600;letter-spacing:.025em;line-height:1.5rem}html .theme-doc-markdown p{line-height:1.625}html .theme-doc-markdown blockquote,html .theme-doc-markdown ol,html .theme-doc-markdown p,html .theme-doc-markdown ul{font-size:1rem}html .theme-doc-markdown code{border-width:0;font-weight:400;padding-left:.5rem;padding-right:.5rem;vertical-align:initial}html .theme-doc-markdown blockquote{margin-bottom:2rem;margin-top:2rem}html .theme-doc-markdown a{text-decoration-line:none;color:var(--ifm-color-primary)}html .theme-doc-markdown ol,html .theme-doc-markdown ul{margin-bottom:1.5rem;margin-top:1.5rem}html .theme-doc-markdown ul li{margin-bottom:.75rem;padding-left:1.5rem;position:relative}html .theme-doc-markdown ul li:before{background-color:currentColor;content:var(--tw-content);display:block;height:4px;left:0;position:absolute;top:.5em;width:4px}html .theme-doc-markdown ul li li:before{background-color:initial;border-color:currentColor;border-width:1px;content:var(--tw-content)}html .theme-doc-markdown ul li li:last-child{margin-bottom:1.5rem}html .theme-doc-markdown ol{counter-reset:a;list-style-type:none}html .theme-doc-markdown ol>li{margin-bottom:1.25rem;padding-left:3rem;position:relative}html .theme-doc-markdown ol>li:before{content:counters(a,".",decimal-leading-zero) ".";counter-increment:a;display:flex;font-size:1rem;font-weight:600;left:0;letter-spacing:-.025em;position:absolute;top:.2rem}html .theme-doc-markdown ol ol{counter-reset:b}html .theme-doc-markdown ol ol>li:before{content:counters(b,".",decimal-leading-zero) ".";counter-increment:b}html .theme-doc-markdown li>ol,html .theme-doc-markdown li>ul{margin-bottom:1rem;margin-top:1rem}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.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_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vwxv{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}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.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}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.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);user-select:none}.hash-link:before{content:"#"}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.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:c;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(c);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{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;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}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.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;list-style:none;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)}.containsTaskList_mC6p{list-style:none}:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.img_ev3q{height:auto}.admonition_LlT9{margin-bottom:1em}.admonitionHeading_tbUL{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.3rem}.admonitionIcon_kALy{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_kALy svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.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}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:0}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Hit-Tree,.DocSearch-Hit-action,.DocSearch-Hit-icon,.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Input,.DocSearch-Link{-webkit-appearance:none;font:inherit}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}.DocSearch--active{overflow:hidden!important}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Hit[aria-selected=true] mark,.content_knG7 a{text-decoration:underline}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:#0000;border:0;color:var(--docsearch-text-color);flex:1;font-size:1.2em;height:100%;outline:0;padding:0 0 0 8px;width:80%}.DocSearch-Hit-action-button,.DocSearch-Reset{-webkit-appearance:none;border:0;cursor:pointer}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Cancel,.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator,.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset{animation:.1s ease-in forwards a;appearance:none;background:none;border-radius:50%;color:var(--docsearch-icon-color);padding:2px;right:0}.DocSearch-Help,.DocSearch-HitsFooter,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:#0000}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}.DocSearch-Hit--deleting{opacity:0;transition:.25s linear}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:.25s linear .25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border-radius:50%;color:inherit;padding:2px}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_b6E3,.sidebarLogo_isFc,.themedImage_ToTc,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j,svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:0;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands li,.DocSearch-Commands-Key{align-items:center;display:flex}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@keyframes a{0%{opacity:0}to{opacity:1}}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.DocSearch-Container,.skipToContent_fXgn{z-index:calc(var(--ifm-z-index-fixed) + 1)}.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}.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;text-align:center}.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)}.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] .themedImage--dark_i4oU,[data-theme=light] .themedImage--light_HNdA,html:not([data-theme]) .themedComponent--light_NU7w{display:initial}.iconExternalLink_nPIU{margin-left:.3rem}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.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}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.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%}.searchQueryInput_u2C7,.searchVersionInput_m0Ui{background:var(--docsearch-searchbox-focus-background);border:2px solid var(--ifm-toc-border-color);border-radius:var(--ifm-global-radius);color:var(--docsearch-text-color);font:var(--ifm-font-size-base) var(--ifm-font-family-base);margin-bottom:.5rem;padding:.8rem;transition:border var(--ifm-transition-fast) ease;width:100%}.searchQueryInput_u2C7:focus,.searchVersionInput_m0Ui:focus{border-color:var(--docsearch-primary-color);outline:0}.searchQueryInput_u2C7::placeholder{color:var(--docsearch-muted-color)}.searchResultsColumn_JPFH{font-size:.9rem;font-weight:700}.algoliaLogo_rT1R{max-width:150px}.searchResultItem_Tv2o{border-bottom:1px solid var(--ifm-toc-border-color);padding:1rem 0}.searchResultItemHeading_KbCB{font-weight:400;margin-bottom:0}.searchResultItemPath_lhe1{--ifm-breadcrumb-separator-size-multiplier:1;color:var(--ifm-color-content-secondary);font-size:.8rem}.searchResultItemSummary_AEaO{font-style:italic;margin:.5rem 0 0}.loadingSpinner_XVxU{animation:1s linear infinite b;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}@keyframes b{to{transform:rotate(1turn)}}.loader_vvXV{margin-top:2rem}.search-result-match{background:#ffd78e40;color:var(--docsearch-hit-color);padding:.09em 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}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.docMainContainer_gTbr,.docPage__5DB{display:flex;width:100%}.docPage__5DB{flex:1 0}.docsWrapper_BCFX{display:flex;flex:1 0 auto}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_m80_{background-color:var(--docusaurus-collapse-button-bg)}.tocMobile_ITEo,html .navbar__toggle{display:none}html .navbar__items:not(:last-child){justify-content:flex-start;padding-left:.5rem;padding-right:.5rem}html .DocSearch-Button{justify-content:space-between;width:auto}html .theme-doc-breadcrumbs{padding-top:1rem}html .theme-doc-sidebar-container{border-right-color:var(--ifm-color-emphasis-200);border-right-width:1px;margin-left:.75rem}html .pagination-nav>a{grid-column:span 1/span 1}.lastUpdated_vwxv,html .pagination-nav .pagination-nav__link--next{text-align:right}html .footer__col:not(:first-child){flex-basis:0}.docItemCol_VOVn{max-width:75%!important}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.searchBox_ZlJk{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.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_BlDH,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_m80_:focus,.expandButton_m80_: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);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_m80_{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_BlDH{transform:rotate(180deg)}.docSidebarContainer_b6E3{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);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_b3ry{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_Xe31{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_gTbr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_Uz_u{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_czyv{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!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,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.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}.docItemContainer_F8PC{padding:0 .3rem}.searchBox_ZlJk{position:absolute;right:var(--ifm-navbar-padding-horizontal)}}@media only screen and (max-width:996px){.searchQueryColumn_RTkw,.searchResultsColumn_JPFH{max-width:60%!important}.searchLogoColumn_rJIA,.searchVersionColumn_ypXd{max-width:40%!important}.searchLogoColumn_rJIA{padding-left:0!important}}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder,.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%;max-height:calc(var(--docsearch-vh,1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Cancel{-webkit-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:0;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}}@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}}@media screen and (max-width:576px){.searchQueryColumn_RTkw{max-width:100%!important}.searchVersionColumn_ypXd{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-color-scheme:dark){html .pagination-nav .pagination-nav__sublabel{color:var(--ifm-font-color-base)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width);animation:none;-webkit-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0}.DocSearch-Hit--deleting,.DocSearch-Hit--favoriting{transition:none}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}@media screen and (prefers-reduced-motion){:root{transition:none}}@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/assets/fonts/Inter-Black-15ca31c0a2a68f76d2d12055bdf97bd0.woff2 b/assets/fonts/Inter-Black-15ca31c0a2a68f76d2d12055bdf97bd0.woff2 new file mode 100644 index 00000000000..68f64c9ed98 Binary files /dev/null and b/assets/fonts/Inter-Black-15ca31c0a2a68f76d2d12055bdf97bd0.woff2 differ diff --git a/assets/fonts/Inter-Black-c6938660eec019fefd684894b6d00900.woff b/assets/fonts/Inter-Black-c6938660eec019fefd684894b6d00900.woff new file mode 100644 index 00000000000..a18593a096e Binary files /dev/null and b/assets/fonts/Inter-Black-c6938660eec019fefd684894b6d00900.woff differ diff --git a/assets/fonts/Inter-Bold-93c1301bd9f486c573b3d9001c6ec0e4.woff b/assets/fonts/Inter-Bold-93c1301bd9f486c573b3d9001c6ec0e4.woff new file mode 100644 index 00000000000..eaf3d4bfd7d Binary files /dev/null and b/assets/fonts/Inter-Bold-93c1301bd9f486c573b3d9001c6ec0e4.woff differ diff --git a/assets/fonts/Inter-Bold-ec64ea577b0349e055ad6646c1d8797a.woff2 b/assets/fonts/Inter-Bold-ec64ea577b0349e055ad6646c1d8797a.woff2 new file mode 100644 index 00000000000..2846f29cc8a Binary files /dev/null and b/assets/fonts/Inter-Bold-ec64ea577b0349e055ad6646c1d8797a.woff2 differ diff --git a/assets/fonts/Inter-Medium-293fd13dbca5a3e450ef1ebfb232a299.woff2 b/assets/fonts/Inter-Medium-293fd13dbca5a3e450ef1ebfb232a299.woff2 new file mode 100644 index 00000000000..f92498a2ecf Binary files /dev/null and b/assets/fonts/Inter-Medium-293fd13dbca5a3e450ef1ebfb232a299.woff2 differ diff --git a/assets/fonts/Inter-Medium-9053572c46aeb4b16caafd643a543b8d.woff b/assets/fonts/Inter-Medium-9053572c46aeb4b16caafd643a543b8d.woff new file mode 100644 index 00000000000..d546843f283 Binary files /dev/null and b/assets/fonts/Inter-Medium-9053572c46aeb4b16caafd643a543b8d.woff differ diff --git a/assets/fonts/Inter-Regular-8c206db99195777c67691cbba9d64393.woff b/assets/fonts/Inter-Regular-8c206db99195777c67691cbba9d64393.woff new file mode 100644 index 00000000000..62d3a618710 Binary files /dev/null and b/assets/fonts/Inter-Regular-8c206db99195777c67691cbba9d64393.woff differ diff --git a/assets/fonts/Inter-Regular-c8ba52b05a9ef10f47584d08ece2ec5c.woff2 b/assets/fonts/Inter-Regular-c8ba52b05a9ef10f47584d08ece2ec5c.woff2 new file mode 100644 index 00000000000..6c2b6893d59 Binary files /dev/null and b/assets/fonts/Inter-Regular-c8ba52b05a9ef10f47584d08ece2ec5c.woff2 differ diff --git a/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2 b/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2 new file mode 100644 index 00000000000..365eedc50cd Binary files /dev/null and b/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2 differ diff --git a/assets/fonts/JetBrainsMono-Regular-1e66c47aca088de94ae789a48719cb00.woff2 b/assets/fonts/JetBrainsMono-Regular-1e66c47aca088de94ae789a48719cb00.woff2 new file mode 100644 index 00000000000..8c862e334da Binary files /dev/null and b/assets/fonts/JetBrainsMono-Regular-1e66c47aca088de94ae789a48719cb00.woff2 differ diff --git a/assets/images/cosmos-hub-image-64b35193bcb3998afd27f30060ed5ab5.jpg b/assets/images/cosmos-hub-image-64b35193bcb3998afd27f30060ed5ab5.jpg new file mode 100644 index 00000000000..2c3cb5cf7c9 Binary files /dev/null and b/assets/images/cosmos-hub-image-64b35193bcb3998afd27f30060ed5ab5.jpg differ diff --git a/assets/images/ledger-tuto-dev-mode-c4e394fda2491363a287cbf1fc82ab39.png b/assets/images/ledger-tuto-dev-mode-c4e394fda2491363a287cbf1fc82ab39.png new file mode 100644 index 00000000000..0973355c7d1 Binary files /dev/null and b/assets/images/ledger-tuto-dev-mode-c4e394fda2491363a287cbf1fc82ab39.png differ diff --git a/assets/images/ledger-tuto-manager-f0a3a54c10bfa2405995efaed78536f1.png b/assets/images/ledger-tuto-manager-f0a3a54c10bfa2405995efaed78536f1.png new file mode 100644 index 00000000000..561028128a8 Binary files /dev/null and b/assets/images/ledger-tuto-manager-f0a3a54c10bfa2405995efaed78536f1.png differ diff --git a/assets/images/ledger-tuto-search-d4d718ef5efa0fb720af125ef8819fd5.png b/assets/images/ledger-tuto-search-d4d718ef5efa0fb720af125ef8819fd5.png new file mode 100644 index 00000000000..ae651dbaf7c Binary files /dev/null and b/assets/images/ledger-tuto-search-d4d718ef5efa0fb720af125ef8819fd5.png differ diff --git a/assets/images/ledger_1-333b5a02b13138ef329933950ec162af.jpg b/assets/images/ledger_1-333b5a02b13138ef329933950ec162af.jpg new file mode 100644 index 00000000000..100175e1a7f Binary files /dev/null and b/assets/images/ledger_1-333b5a02b13138ef329933950ec162af.jpg differ diff --git a/assets/images/ledger_2-0fe258512b66899f1a60ffb8986ebb48.jpg b/assets/images/ledger_2-0fe258512b66899f1a60ffb8986ebb48.jpg new file mode 100644 index 00000000000..9c6fa6b1a65 Binary files /dev/null and b/assets/images/ledger_2-0fe258512b66899f1a60ffb8986ebb48.jpg differ diff --git a/assets/js/0b65cac9.f1102805.js b/assets/js/0b65cac9.f1102805.js new file mode 100644 index 00000000000..4da6e74c759 --- /dev/null +++ b/assets/js/0b65cac9.f1102805.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[8070],{5680:(e,n,o)=>{o.d(n,{xA:()=>p,yg:()=>u});var i=o(6540);function a(e,n,o){return n in e?Object.defineProperty(e,n,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[n]=o,e}function t(e,n){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);n&&(i=i.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),o.push.apply(o,i)}return o}function r(e){for(var n=1;n=0||(a[o]=e[o]);return a}(e,n);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(a[o]=e[o])}return a}var l=i.createContext({}),m=function(e){var n=i.useContext(l),o=n;return e&&(o="function"==typeof e?e(n):r(r({},n),e)),o},p=function(e){var n=m(e.components);return i.createElement(l.Provider,{value:n},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return i.createElement(i.Fragment,{},n)}},g=i.forwardRef((function(e,n){var o=e.components,a=e.mdxType,t=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=m(o),g=a,u=d["".concat(l,".").concat(g)]||d[g]||c[g]||t;return o?i.createElement(u,r(r({ref:n},p),{},{components:o})):i.createElement(u,r({ref:n},p))}));function u(e,n){var o=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var t=o.length,r=new Array(t);r[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[d]="string"==typeof e?e:a,r[1]=s;for(var m=2;m{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>t,metadata:()=>s,toc:()=>m});var i=o(8168),a=(o(6540),o(5680));const t={},r="ADR 002: Globalfee Module",s={unversionedId:"architecture/adr/adr-002-globalfee",id:"architecture/adr/adr-002-globalfee",title:"ADR 002: Globalfee Module",description:"Changelog",source:"@site/docs/architecture/adr/adr-002-globalfee.md",sourceDirName:"architecture/adr",slug:"/architecture/adr/adr-002-globalfee",permalink:"/main/architecture/adr/adr-002-globalfee",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"adr-001-interchain-accounts",permalink:"/main/architecture/adr/adr-001-interchain-accounts"},next:{title:"ADR 003: Interchain Accounts Controller Module",permalink:"/main/architecture/adr/adr-003-ica-controller"}},l={},m=[{value:"Changelog",id:"changelog",level:2},{value:"Status",id:"status",level:2},{value:"Context",id:"context",level:2},{value:"Decision",id:"decision",level:2},{value:"ZeroCoins in MinimumGasPricesParam",id:"zerocoins-in-minimumgaspricesparam",level:3},{value:"Coins Split",id:"coins-split",level:4},{value:"Fee Checks",id:"fee-checks",level:4},{value:"Bypass Message Types",id:"bypass-message-types",level:3},{value:"Fee Checks in DeliverTx",id:"fee-checks-in--delivertx",level:3},{value:"Consequences",id:"consequences",level:2},{value:"Positive",id:"positive",level:3},{value:"Negative",id:"negative",level:3},{value:"References",id:"references",level:2}],p={toc:m},d="wrapper";function c(e){let{components:n,...o}=e;return(0,a.yg)(d,(0,i.A)({},p,o,{components:n,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"adr-002-globalfee-module"},"ADR 002: Globalfee Module"),(0,a.yg)("h2",{id:"changelog"},"Changelog"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"2023-06-12: Initial Draft"),(0,a.yg)("li",{parentName:"ul"},"2024-06-06: Change status to deprecated")),(0,a.yg)("h2",{id:"status"},"Status"),(0,a.yg)("p",null,"Deprecated"),(0,a.yg)("h2",{id:"context"},"Context"),(0,a.yg)("p",null,"The globalfee module was created to manage a parameter called ",(0,a.yg)("inlineCode",{parentName:"p"},"MinimumGasPricesParam"),", which sets a network-wide minimum fee requirement. The intention was to stop random denominations from entering fee collections and to reduce the time validators take to check a long list of transaction fees. To address scenarios where no fee payment is required but the denominations for volunteered paid fees are still restricted, the zero coins was introduced to serve as a means of limiting the denoms. Nevertheless, the initial version of the globalfee module had some issues:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},"In the globalfee module, several Cosmos SDK coins methods were redefined because of the allowance of zero-value coins in the ",(0,a.yg)("inlineCode",{parentName:"p"},"MinimumGasPricesParam"),". The ",(0,a.yg)("inlineCode",{parentName:"p"},"MinimumGasPricesParam")," is of ",(0,a.yg)("inlineCode",{parentName:"p"},"sdk.DecCoins")," type. In the Cosmos SDK, ",(0,a.yg)("inlineCode",{parentName:"p"},"sdk.DecCoins")," are ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/cosmos/cosmos-sdk/blob/67f04e629623d4691c4b2e48806f7793a3aa211e/types/dec_coin.go#L160-L177"},"sanitized")," to remove zero-value coins. As a result, several methods from ",(0,a.yg)("inlineCode",{parentName:"p"},"sdk.Coins")," were ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/cosmos/gaia/blob/890ab3aa2e5788537b0d2ebc9bafdc968340e0e5/x/globalfee/ante/fee_utils.go#L46-L104"},"redefined in the Gaia fee antehandler"),".")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"BypassMinFeeMsgTypes")," exists in ",(0,a.yg)("inlineCode",{parentName:"p"},"app.toml"),", which means each node can define its own value. Thus, it's not clear whether a transaction containing bypass-messages will be exempted from paying a fee.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},"The fee check logic is only executed in ",(0,a.yg)("inlineCode",{parentName:"p"},"CheckTx"),". This could enable malicious validators to change the fee check code and propose transactions that do not meet the fee requirement."))),(0,a.yg)("h2",{id:"decision"},"Decision"),(0,a.yg)("p",null,"To fix these problems, the following changes are added to the globalfee module:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"ZeroCoins in ",(0,a.yg)("inlineCode",{parentName:"strong"},"MinimumGasPricesParam"),":"),"\\\nRefactor the fee check logics, in order to use the Cosmos SDK coins' methods instead of the redefined methods."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Bypass Message Types:"),"\\\n",(0,a.yg)("inlineCode",{parentName:"li"},"BypassMinFeeMsgTypes")," is refactored to be a param of the globalfee module, in order to make the bypass messages deterministic."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Check Fees in ",(0,a.yg)("inlineCode",{parentName:"strong"},"DeliverTx"),":"),"\\\nThe fee check is factored to executed in both ",(0,a.yg)("inlineCode",{parentName:"li"},"DeliverTx")," and ",(0,a.yg)("inlineCode",{parentName:"li"},"CheckTx"),". This is to prevent malicious validators from changing the fee check logic and allowing any transactions to pass fee check. As a consequence, ",(0,a.yg)("inlineCode",{parentName:"li"},"MinimumGasPricesParam")," is introduced as a globalfee param.")),(0,a.yg)("h3",{id:"zerocoins-in-minimumgaspricesparam"},"ZeroCoins in ",(0,a.yg)("inlineCode",{parentName:"h3"},"MinimumGasPricesParam")),(0,a.yg)("h4",{id:"coins-split"},"Coins Split"),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"CombinedFeeRequirement")," refers to the fee requirement that takes into account both ",(0,a.yg)("inlineCode",{parentName:"p"},"globalFees")," (",(0,a.yg)("inlineCode",{parentName:"p"},"MinimumGasPricesParam")," in the globalfee module) and ",(0,a.yg)("inlineCode",{parentName:"p"},"localFees")," (",(0,a.yg)("inlineCode",{parentName:"p"},"minimum-gas-prices")," in ",(0,a.yg)("inlineCode",{parentName:"p"},"app.toml"),"). This requirement is calculated as the maximum value between ",(0,a.yg)("inlineCode",{parentName:"p"},"globalFees")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"localFees")," for denomination exists ",(0,a.yg)("inlineCode",{parentName:"p"},"globalFees"),".\nThe allowance of zero coins in the ",(0,a.yg)("inlineCode",{parentName:"p"},"MinimumGasPricesParam")," within the globalfee module implies that ",(0,a.yg)("inlineCode",{parentName:"p"},"CombinedFeeRequirement(globalFees, localFees)")," also permits zero coins. Therefore, the ",(0,a.yg)("inlineCode",{parentName:"p"},"CombinedFeeRequirement")," doesn't meet the requirements of certain ",(0,a.yg)("inlineCode",{parentName:"p"},"sdk.Coins")," methods. For instance, the ",(0,a.yg)("inlineCode",{parentName:"p"},"DenomsSubsetOf")," method requires coins that do not contain zero coins."),(0,a.yg)("p",null,"To address this issue, the ",(0,a.yg)("inlineCode",{parentName:"p"},"CombinedFeeRequirement")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"feeCoins")," are split as shown in the chart below."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-mermaid"},"---\ntitle: Fee Requirements and Fee Splits\n---\nflowchart TD\n subgraph feeReq\n A[CombinedFeeRequirement]--\x3eB[/Split zero/nonzero coins/]\n B--\x3e|zero coins| C[zeroCoinFeesDenomReq];\n B--\x3e|nonzero coins| D[nonzeroCoinFeesDenomReq];\n\n end\n\n subgraph feeCoin\n E[feeCoins]--\x3eF[/Split by the denoms in zero/nonzero CoinFeesDenomReq/]\n F--\x3e|denoms in zeroCoinFeesDenomReq set| G[feeCoinsZeroDenom]\n F--\x3e|denoms in nonzeroCoinFeesDenomReq set| H[feeCoinsNonZeroDenom]\n end\n")),(0,a.yg)("p",null,"The ",(0,a.yg)("inlineCode",{parentName:"p"},"CombinedFeeRequirement")," is split into zero and non-zero coins, forming ",(0,a.yg)("inlineCode",{parentName:"p"},"nonZeroCoinFeesReq")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"zeroCoinFeesDenomReq"),". Similarly, the paid fees (feeCoins) are split into ",(0,a.yg)("inlineCode",{parentName:"p"},"feeCoinsNonZeroDenom")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"feeCoinsZeroDenom"),", based on the denominations of ",(0,a.yg)("inlineCode",{parentName:"p"},"nonZeroCoinFeesReq")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"zeroCoinFeesDenomReq")," as shown in the following code snippet."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-go"}," nonZeroCoinFeesReq, zeroCoinFeesDenomReq := getNonZeroFees(feeRequired)\n\n // feeCoinsNonZeroDenom contains non-zero denominations from the feeRequired\n // feeCoinsNonZeroDenom is used to check if the fees meets the requirement imposed by nonZeroCoinFeesReq\n // when feeCoins does not contain zero coins' denoms in feeRequired\n feeCoinsNonZeroDenom, feeCoinsZeroDenom := splitCoinsByDenoms(feeCoins, zeroCoinFeesDenomReq)\n\n")),(0,a.yg)("h4",{id:"fee-checks"},"Fee Checks"),(0,a.yg)("p",null,"The Workflow of feeCheck is shown below:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-mermaid"},"---\ntitle: Fee Check\n---\nflowchart TD\n\nA[feeCoinsNonZeroDenom]--\x3eB[/DenomsSubsetOf_nonZeroCoinFeesReq/];\nB--\x3e|yes|C[is_bypass_msg];\nB--\x3e|no|D((reject));\n\nC--\x3e|yes|pass1((pass));\nC--\x3e|no|D[/contain_zeroCoinFeesDenomReq_denom/];\n\nD--\x3e|yes|pass2((pass));\nD--\x3e|no|E[/feeCoinsZeroDenom_nonEmpty/];\n\n\nE--\x3e|yes|pass3((pass));\nE--\x3e|no|F[/IsAnyGTE_nonZeroCoinFeesDenomReq/];\n\nF--\x3e|yes|pass4((pass));\nF--\x3e|no|reject2((reject));\n")),(0,a.yg)("p",null,"The split enable checking ",(0,a.yg)("inlineCode",{parentName:"p"},"feeCoinsNonZeroDenom")," against ",(0,a.yg)("inlineCode",{parentName:"p"},"nonZeroCoinFeesReq"),", and ",(0,a.yg)("inlineCode",{parentName:"p"},"feeCoinsZeroDenom")," against\n",(0,a.yg)("inlineCode",{parentName:"p"},"zeroCoinFeesDenomReq")," (as shown in the following code snippet). In the check of ",(0,a.yg)("inlineCode",{parentName:"p"},"feeCoinsNonZeroDenom")," against ",(0,a.yg)("inlineCode",{parentName:"p"},"nonZeroCoinFeesReq"),", the Cosmos SDK coins' methods can be used since zero coins are removed from the ",(0,a.yg)("inlineCode",{parentName:"p"},"nonZeroCoinFeesReq"),", while in the check ",(0,a.yg)("inlineCode",{parentName:"p"},"feeCoinsZeroDenom")," against ",(0,a.yg)("inlineCode",{parentName:"p"},"zeroCoinFeesDenomReq"),", only denoms need to be checked."),(0,a.yg)("p",null,"Checking ",(0,a.yg)("inlineCode",{parentName:"p"},"feeCoinsNonZeroDenom")," against ",(0,a.yg)("inlineCode",{parentName:"p"},"nonZeroCoinFeesReq"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-go"},' if !feeCoinsNonZeroDenom.IsAnyGTE(nonZeroCoinFeesReq) {\n return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "insufficient fees; got: %s required: %s", feeCoins.String(), feeRequired.String())\n }\n')),(0,a.yg)("p",null,"Here is an example of how the coins split and checked in fee antehandler:"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"assumption"),":"),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"globalfee=[1photon, 0uatom, 1stake]")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"local min-gas-prices=[0.5stake]")),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"fee requirement"),":"),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"combinedFeeRequirement=[1photon, 0uatom, 1stake]")),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"split fee requirement"),":"),(0,a.yg)("p",null,"the ",(0,a.yg)("inlineCode",{parentName:"p"},"combinedFeeRequirement")," into ",(0,a.yg)("inlineCode",{parentName:"p"},"nonZeroCoinFeesReq=[0uatom]"),", and ",(0,a.yg)("inlineCode",{parentName:"p"},"nonZeroCoinFeesReq=[1photon, 1stake]")),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"split the paid fees"),":"),(0,a.yg)("p",null,"if ",(0,a.yg)("inlineCode",{parentName:"p"},"paidFee=[1uatom, 0.5photon]"),",\nthe ",(0,a.yg)("inlineCode",{parentName:"p"},"splitCoinsByDenoms")," splits the paidFee into ",(0,a.yg)("inlineCode",{parentName:"p"},"feeCoinsZeroDenom=[1uatom]")," (the same denom as zero coins in ",(0,a.yg)("inlineCode",{parentName:"p"},"combinedFeeRequirement"),"), and ",(0,a.yg)("inlineCode",{parentName:"p"},"feeCoinsNonZeroDenom=[0.5stake]"),"\nthen ",(0,a.yg)("inlineCode",{parentName:"p"},"feeCoinsZeroDenom=[1uatom]")," is checked by ",(0,a.yg)("inlineCode",{parentName:"p"},"nonZeroCoinFeesReq=[1photon, 1stake]"),"."),(0,a.yg)("p",null,"Please note that ",(0,a.yg)("inlineCode",{parentName:"p"},"feeCoins")," does not contain zero coins. The fee coins are split according to the denoms in ",(0,a.yg)("inlineCode",{parentName:"p"},"zeroCoinFeesDenomReq")," or ",(0,a.yg)("inlineCode",{parentName:"p"},"nonZeroCoinFeesDenomReq"),". If feeCoins contains coins not in both ",(0,a.yg)("inlineCode",{parentName:"p"},"zeroCoinFeesDenomReq")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"nonZeroCoinFeesDenomReq"),", the transaction should be rejected. On the contrary, if feeCoins' denoms are in either ",(0,a.yg)("inlineCode",{parentName:"p"},"zeroCoinFeesDenomReq")," or ",(0,a.yg)("inlineCode",{parentName:"p"},"nonZeroCoinFeesDenomReq"),", and ",(0,a.yg)("inlineCode",{parentName:"p"},"len(zeroCoinFeesDenomReq)!=0"),", the transaction can directly pass, otherwise, the fee amount need to be checked."),(0,a.yg)("h3",{id:"bypass-message-types"},"Bypass Message Types"),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"BypassMinFeeMsgTypes")," was a setup in ",(0,a.yg)("inlineCode",{parentName:"p"},"config/app.toml")," before the refactor. ",(0,a.yg)("inlineCode",{parentName:"p"},"BypassMinFeeMsgTypes")," is refactored to be a param of the globalfee module to get a network level agreement. Correspondingly,",(0,a.yg)("inlineCode",{parentName:"p"},"MaxTotalBypassMinFeeMsgGasUsage")," is also introduced as a globalfee param."),(0,a.yg)("h3",{id:"fee-checks-in--delivertx"},"Fee Checks in ",(0,a.yg)("inlineCode",{parentName:"h3"},"DeliverTx")),(0,a.yg)("p",null,"Implementing fee checks within the ",(0,a.yg)("inlineCode",{parentName:"p"},"DeliverTx")," function introduces a few requirements:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Deterministic Minimum Fee Requirement"),": For the ",(0,a.yg)("inlineCode",{parentName:"li"},"DeliverTx")," process, it is essential to have a deterministic minimum fee requirement. In ",(0,a.yg)("inlineCode",{parentName:"li"},"CheckTx"),", fee is checked by the ",(0,a.yg)("inlineCode",{parentName:"li"},"CombinedFeeRequirement(globalFees, localFees)"),", which considers both ",(0,a.yg)("inlineCode",{parentName:"li"},"minimum-gas-prices")," from ",(0,a.yg)("inlineCode",{parentName:"li"},"config/app.toml")," and ",(0,a.yg)("inlineCode",{parentName:"li"},"MinimumGasPricesParam")," from the globalfee Params (For more details, see ",(0,a.yg)("a",{parentName:"li",href:"../../modules/globalfee.md"},"globalfee"),"). ",(0,a.yg)("inlineCode",{parentName:"li"},"CombinedFeeRequirement")," contains non-deterministic part: ",(0,a.yg)("inlineCode",{parentName:"li"},"minimum-gas-prices")," from ",(0,a.yg)("inlineCode",{parentName:"li"},"app.toml"),". Therefore, ",(0,a.yg)("inlineCode",{parentName:"li"},"CombinedFeeRequirement")," cannot be used in ",(0,a.yg)("inlineCode",{parentName:"li"},"DeliverTx"),". In ",(0,a.yg)("inlineCode",{parentName:"li"},"DeliverTx"),", only ",(0,a.yg)("inlineCode",{parentName:"li"},"MinimumGasPricesParam")," in globalfee Params is used for fee verification. The code implementation is shown below. ")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-go"},'func (mfd FeeDecorator) GetTxFeeRequired(ctx sdk.Context, tx sdk.FeeTx) (sdk.Coins, error) {\n // Get required global fee min gas prices\n // Note that it should never be empty since its default value is set to coin={"StakingBondDenom", 0}\n globalFees, err := mfd.GetGlobalFee(ctx, tx)\n if err != nil {\n return sdk.Coins{}, err\n }\n\n // In DeliverTx, the global fee min gas prices are the only tx fee requirements.\n if !ctx.IsCheckTx() {\n return globalFees, nil\n }\n\n // In CheckTx mode, the local and global fee min gas prices are combined\n // to form the tx fee requirements\n\n // Get local minimum-gas-prices\n localFees := GetMinGasPrice(ctx, int64(tx.GetGas()))\n\n // Return combined fee requirements\n return CombinedFeeRequirement(globalFees, localFees)\n}\n')),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deterministic Bypass Parameters"),": The decision of whether a message can bypass the minimum fee has to be deterministic as well. To ensure this, ",(0,a.yg)("inlineCode",{parentName:"p"},"BypassMinFeeMsgTypes")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"MaxTotalBypassMinFeeMsgGasUsage")," parameters are moved to a persistent store.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Module Initialization Order"),": The genutils module must be initialized before the globalfee module. This is due to the ",(0,a.yg)("inlineCode",{parentName:"p"},"DeliverGenTxs")," in the genutils module, is called during ",(0,a.yg)("inlineCode",{parentName:"p"},"initGenesis"),". This function executes ",(0,a.yg)("inlineCode",{parentName:"p"},"DeliverTx"),", which subsequently calls the AnteHandle in FeeDecorator, triggering the fee check in ",(0,a.yg)("inlineCode",{parentName:"p"},"DeliverTx"),".\nTo prevent the ",(0,a.yg)("inlineCode",{parentName:"p"},"DeliverGenTxs")," go through a fee check, the initialization of the globalfee module should occur after the genutils module. This sequencing ensures that all necessary components are in place when the fee check occurs. See ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/cosmos/gaia/issues/2489"},"Gaia Issue #2489")," for more context."))),(0,a.yg)("h2",{id:"consequences"},"Consequences"),(0,a.yg)("h3",{id:"positive"},"Positive"),(0,a.yg)("p",null,"This refactor results in code that is easier to maintain. It prevents malicious validators from escaping fee checks and make the bypass messages work at network level."),(0,a.yg)("h3",{id:"negative"},"Negative"),(0,a.yg)("p",null,"The introduction of FeeDecorator has replaced the usage of ",(0,a.yg)("inlineCode",{parentName:"p"},"MempoolFeeDecorator")," in the Cosmos SDK. Currently, if both FeeDecorator and MempoolFeeDecorator are added to the AnteDecorator chain, it will result in redundant checks. However, there's potential for FeeDecorator and MempoolFeeDecorator to become incompatible in the future, depending on updates to the Cosmos SDK."),(0,a.yg)("h2",{id:"references"},"References"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"../../modules/globalfee"},"Documentation of the globalfee module"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0ce6bca3.7f4755fc.js b/assets/js/0ce6bca3.7f4755fc.js new file mode 100644 index 00000000000..16e4701e345 --- /dev/null +++ b/assets/js/0ce6bca3.7f4755fc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[4036],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>g});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),u=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},p=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),c=u(a),m=r,g=c["".concat(s,".").concat(m)]||c[m]||d[m]||i;return a?n.createElement(g,l(l({ref:t},p),{},{components:a})):n.createElement(g,l({ref:t},p))}));function g(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[c]="string"==typeof e?e:r,l[1]=o;for(var u=2;u{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>o,toc:()=>u});var n=a(8168),r=(a(6540),a(5680));const i={title:"ADR Creation Process",order:2},l=void 0,o={unversionedId:"architecture/PROCESS",id:"architecture/PROCESS",title:"ADR Creation Process",description:"1. Copy the adr-template.md file. Use the following filename pattern: adr-next_number-title.md",source:"@site/docs/architecture/PROCESS.md",sourceDirName:"architecture",slug:"/architecture/PROCESS",permalink:"/main/architecture/PROCESS",draft:!1,tags:[],version:"current",frontMatter:{title:"ADR Creation Process",order:2},sidebar:"tutorialSidebar",previous:{title:"adr-template",permalink:"/main/architecture/templates/adr-template"},next:{title:"Gaia Modules",permalink:"/main/modules/"}},s={},u=[{value:"ADR life cycle",id:"adr-life-cycle",level:2},{value:"ADR status",id:"adr-status",level:3},{value:"Consensus Status",id:"consensus-status",level:4},{value:"Language used in ADR",id:"language-used-in-adr",level:2}],p={toc:u},c="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(c,(0,n.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Copy the ",(0,r.yg)("inlineCode",{parentName:"li"},"adr-template.md")," file. Use the following filename pattern: ",(0,r.yg)("inlineCode",{parentName:"li"},"adr-next_number-title.md")),(0,r.yg)("li",{parentName:"ol"},"Create a draft Pull Request and solicit input from the stewarding team, if you want to get an early feedback."),(0,r.yg)("li",{parentName:"ol"},"Make sure that the problem, the context and a recommended solution is clear and well documented. Be sure to document alternate solution spaces and give reasons why they have been discarded."),(0,r.yg)("li",{parentName:"ol"},"Add an entry to a list in the README file ",(0,r.yg)("a",{parentName:"li",href:"/main/architecture/#adr-table-of-contents"},"Table of Contents"),"."),(0,r.yg)("li",{parentName:"ol"},"Create a Pull Request to propose a new ADR.")),(0,r.yg)("h2",{id:"adr-life-cycle"},"ADR life cycle"),(0,r.yg)("p",null,"ADR creation is an ",(0,r.yg)("strong",{parentName:"p"},"iterative")," process. Instead of trying to solve all decisions in a single ADR pull request, we MUST firstly understand the problem and collect feedback through a GitHub Issue."),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},"Every proposal SHOULD start with a new GitHub Issue or be a result of existing Issues. The Issue should contain just a brief proposal summary.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},"Once the motivation is validated, a GitHub Pull Request (PR) is created with a new document based on the ",(0,r.yg)("inlineCode",{parentName:"p"},"adr-template.md"),".")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},"An ADR doesn't have to arrive to ",(0,r.yg)("inlineCode",{parentName:"p"},"main")," with an ",(0,r.yg)("em",{parentName:"p"},"accepted")," status in a single PR. If the motivation is clear and the solution is sound, we SHOULD be able to merge it and keep a ",(0,r.yg)("em",{parentName:"p"},"proposed")," status. It's preferable to have an iterative approach rather than long, not merged Pull Requests.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},"If a ",(0,r.yg)("em",{parentName:"p"},"proposed")," ADR is merged, then it should clearly document outstanding issues either in ADR document notes or in a GitHub Issue.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},"The PR SHOULD always be merged. In the case of a faulty ADR, we still prefer to merge it with a ",(0,r.yg)("em",{parentName:"p"},"rejected")," status. The only time the ADR SHOULD NOT be merged is if the author abandons it.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},"Merged ADRs SHOULD NOT be deleted."))),(0,r.yg)("h3",{id:"adr-status"},"ADR status"),(0,r.yg)("p",null,"Status has two components:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"{CONSENSUS STATUS} {IMPLEMENTATION STATUS}\n")),(0,r.yg)("p",null,"IMPLEMENTATION STATUS is either ",(0,r.yg)("inlineCode",{parentName:"p"},"Implemented")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"Not Implemented"),"."),(0,r.yg)("h4",{id:"consensus-status"},"Consensus Status"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-mermaid"},"flowchart TD\n A[DRAFT] --\x3e B[PROPOSED]\n B --\x3e C[LAST CALL YYYY-MM-DD]\n B --\x3e D[ABANDONED]\n C --\x3e E[ACCEPTED or REJECTED]\n E --\x3e F[SUPERSEDED by ADR-xxx]\n")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"DRAFT"),": ","[optional]"," an ADR which is work in progress, not being ready for a general review. This is to present an early work and get an early feedback in a Draft Pull Request form."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"PROPOSED"),": an ADR covering a full solution architecture and still in the review - project stakeholders haven't reached an agreement yet."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"LAST CALL "),": ","[optional]"," clear notify that we are close to accept updates. Changing a status to ",(0,r.yg)("inlineCode",{parentName:"li"},"LAST CALL")," means that social consensus (of Cosmos SDK maintainers) has been reached and we still want to give it a time to let the community react or analyze."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"ACCEPTED"),": ADR which will represent a currently implemented or to be implemented architecture design."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"REJECTED"),": ADR can go from PROPOSED or ACCEPTED to rejected if the consensus among project stakeholders will decide so."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"SUPERSEEDED by ADR-xxx"),": ADR which has been superseded by a new ADR."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"ABANDONED"),": the ADR is no longer pursued by the original authors.")),(0,r.yg)("h2",{id:"language-used-in-adr"},"Language used in ADR"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"The context/background should be written in the present tense."),(0,r.yg)("li",{parentName:"ul"},"Avoid using a first, personal form.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1094a517.78d19757.js b/assets/js/1094a517.78d19757.js new file mode 100644 index 00000000000..62d4bab230e --- /dev/null +++ b/assets/js/1094a517.78d19757.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[8637],{5680:(e,t,o)=>{o.d(t,{xA:()=>m,yg:()=>d});var a=o(6540);function n(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function s(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,a)}return o}function r(e){for(var t=1;t=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var l=a.createContext({}),p=function(e){var t=a.useContext(l),o=t;return e&&(o="function"==typeof e?e(t):r(r({},t),e)),o},m=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var o=e.components,n=e.mdxType,s=e.originalType,l=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),c=p(o),h=n,d=c["".concat(l,".").concat(h)]||c[h]||u[h]||s;return o?a.createElement(d,r(r({ref:t},m),{},{components:o})):a.createElement(d,r({ref:t},m))}));function d(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var s=o.length,r=new Array(s);r[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:n,r[1]=i;for(var p=2;p{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>p});var a=o(8168),n=(o(6540),o(5680));const s={title:"Formatting a Proposal",order:4},r=void 0,i={unversionedId:"governance/formatting",id:"governance/formatting",title:"Formatting a Proposal",description:"Many proposals allow for long form text to be included, usually under the key description. These provide the opportunity to include markdown if formatted correctly, as well as line breaks with \\n.",source:"@site/docs/governance/formatting.md",sourceDirName:"governance",slug:"/governance/formatting",permalink:"/main/governance/formatting",draft:!1,tags:[],version:"current",frontMatter:{title:"Formatting a Proposal",order:4},sidebar:"tutorialSidebar",previous:{title:"Off-Chain Proposal Process",permalink:"/main/governance/best-practices"},next:{title:"On-Chain Proposal Process",permalink:"/main/governance/process"}},l={},p=[{value:"Text",id:"text",level:2},{value:"Real example",id:"real-example",level:3},{value:"Community Pool Spend",id:"community-pool-spend",level:2},{value:"Real example",id:"real-example-1",level:3},{value:"Legacy Param Change",id:"legacy-param-change",level:2},{value:"Real example",id:"real-example-2",level:3}],m={toc:p},c="wrapper";function u(e){let{components:t,...o}=e;return(0,n.yg)(c,(0,a.A)({},m,o,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("p",null,"Many proposals allow for long form text to be included, usually under the key ",(0,n.yg)("inlineCode",{parentName:"p"},"description"),". These provide the opportunity to include ",(0,n.yg)("a",{parentName:"p",href:"https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax"},"markdown")," if formatted correctly, as well as line breaks with ",(0,n.yg)("inlineCode",{parentName:"p"},"\\n"),". "),(0,n.yg)("p",null,"Beware, however, that if you are using the CLI to create a proposal, and setting ",(0,n.yg)("inlineCode",{parentName:"p"},"description")," using a flag, the text will be ",(0,n.yg)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Escape_sequences_in_C"},"escaped")," which may have undesired effects. "),(0,n.yg)("p",null,"Formatting a proposal can be a trial-and-error process, which is why first submitting to the ",(0,n.yg)("a",{parentName:"p",href:"/main/governance/submitting#submitting-your-proposal-to-the-testnet"},"testnet")," is recommended. "),(0,n.yg)("p",null,"The examples shown below are of the text in a ",(0,n.yg)("inlineCode",{parentName:"p"},"json")," file packaged into a ",(0,n.yg)("inlineCode",{parentName:"p"},"submit-proposal")," transaction sent on-chain. More details about how to submit a proposal are in the ",(0,n.yg)("a",{parentName:"p",href:"/main/governance/submitting"},"Submitting a Governance Proposal")," section, but for now just be aware that the examples are the contents of a file separate from the transaction. As a general rule, any flags specific to a proposal (e.g., Title, description, deposit, parameters, recipient) can be placed in a ",(0,n.yg)("inlineCode",{parentName:"p"},"json")," file, while flags general to a transaction of any kind (e.g., chain-id, node-id, gas, fees) can remain in the CLI."),(0,n.yg)("h2",{id:"text"},"Text"),(0,n.yg)("p",null,"Text proposals are used by delegators to agree to a certain strategy, plan, commitment, future upgrade, or any other statement in the form of text. Aside from having a record of the proposal outcome on the Cosmos Hub chain, a text proposal has no direct effect on the change Cosmos Hub."),(0,n.yg)("p",null,"There are four components:"),(0,n.yg)("ol",null,(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Title")," - the distinguishing name of the proposal, typically the way that explorers list proposals"),(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Summary")," - the body of the proposal that further describes what is being proposed and details surrounding the proposal"),(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Deposit"),' - the amount that will be contributed to the deposit (in micro-ATOMs "uatom") from the account submitting the proposal'),(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Metadata")," - usually a link to an off-chain resource")),(0,n.yg)("h3",{id:"real-example"},"Real example"),(0,n.yg)("p",null,(0,n.yg)("a",{parentName:"p",href:"https://www.mintscan.io/cosmos/proposals/12"},"Proposal 12")," asked if the Cosmos Hub community of validators charging 0% commission was harmful to the success of the Cosmos Hub."),(0,n.yg)("p",null,"You can use ",(0,n.yg)("inlineCode",{parentName:"p"},"gaiad tx gov draft-proposal")," and choose ",(0,n.yg)("inlineCode",{parentName:"p"},"text")," to create the proposal file."),(0,n.yg)("p",null,"You must submit the proposal using ",(0,n.yg)("inlineCode",{parentName:"p"},"gaiad tx gov submit-proposal "),"."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-json"},'{\n "title": "Are Validators Charging 0% Commission Harmful to the Success of the Cosmos Hub?",\n "summary": "This governance proposal is intended to act purely as a signalling proposal. Throughout this history of the Cosmos Hub, there has been much debate about the impact that validators charging 0% commission has on the Cosmos Hub, particularly with respect to the decentralization of the Cosmos Hub and the sustainability for validator operations. Discussion around this topic has taken place in many places including numerous threads on the Cosmos Forum, public Telegram channels, and in-person meetups. Because this has been one of the primary discussion points in off-chain Cosmos governance discussions, we believe it is important to get a signal on the matter from the on-chain governance process of the Cosmos Hub. There have been past discussions on the Cosmos Forum about placing an in-protocol restriction on validators from charging 0% commission. https://forum.cosmos.network/t/governance-limit-validators-from-0-commission-fee/2182 This proposal is NOT proposing a protocol-enforced minimum. It is merely a signalling proposal to query the viewpoint of the bonded Atom holders as a whole. We encourage people to discuss the question behind this governance proposal in the associated Cosmos Hub forum post here: https://forum.cosmos.network/t/proposal-are-validators-charging-0-commission-harmful-to-the-success-of-the-cosmos-hub/2505 Also, for voters who believe that 0% commission rates are harmful to the network, we encourage optionally sharing your belief on what a healthy minimum commission rate for the network using the memo field of their vote transaction on this governance proposal or linking to a longer written explanation such as a Forum or blog post. The question on this proposal is \u201cAre validators charging 0% commission harmful to the success of the Cosmos Hub?\u201d. A Yes vote is stating that they ARE harmful to the network\'s success, and a No vote is a statement that they are NOT harmful.",\n "deposit": "100000uatom",\n "metadata": "ipfs://CID",\n}\n')),(0,n.yg)("h2",{id:"community-pool-spend"},"Community Pool Spend"),(0,n.yg)("p",null,"There are five (5) components:"),(0,n.yg)("ol",null,(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Title")," - the distinguishing name of the proposal, typically the way that explorers list proposals"),(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Summary")," - the body of the proposal that further describes what is being proposed and details surrounding the proposal"),(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Recipient")," - the Cosmos Hub (bech32-based) address that will receive funding from the Community Pool"),(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Amount")," - the amount of funding that the recipient will receive in micro-ATOMs (uatom)"),(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Deposit"),' - the amount that will be contributed to the deposit (in micro-ATOMs "uatom") from the account submitting the proposal')),(0,n.yg)("p",null,"If the description says that a certain address will receive a certain number of ATOMs, it should also be programmed to do that, but it's possible that that's not the case (accidentally or otherwise). Check that the description aligns with the 'recipient' address."),(0,n.yg)("h3",{id:"real-example-1"},"Real example"),(0,n.yg)("p",null,"The ",(0,n.yg)("inlineCode",{parentName:"p"},"amount")," is ",(0,n.yg)("inlineCode",{parentName:"p"},"1000000000uatom"),". 1,000,000 micro-ATOM is equal to 1 ATOM, so ",(0,n.yg)("inlineCode",{parentName:"p"},"recipient")," address ",(0,n.yg)("inlineCode",{parentName:"p"},"cosmos1xf2qwf6g6xvuttpf37xwrgp08qq984244952ze")," will receive 1000 ATOM if this proposal is passed."),(0,n.yg)("p",null,"The ",(0,n.yg)("inlineCode",{parentName:"p"},'deposit": "1000000uatom')," results in 1 ATOM being used from the proposal submitter's account."),(0,n.yg)("p",null,"You can use the ",(0,n.yg)("inlineCode",{parentName:"p"},"gaiad tx gov draft-proposal")," utility and choose ",(0,n.yg)("inlineCode",{parentName:"p"},"/cosmos.distribution.v1beta1.MsgCommunityPoolSpend")," to create a draft proposal file."),(0,n.yg)("p",null,"You must use ",(0,n.yg)("inlineCode",{parentName:"p"},"gaiad tx gov submit-proposal ")," to submit the proposal. The proposal cannot be submitted using ",(0,n.yg)("inlineCode",{parentName:"p"},"submit-legacy-proposal"),"."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-json"},'{\n "messages":[\n {\n "@type": "/cosmos.distribution.v1beta1.MsgCommunityPoolSpend",\n "authority": "cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn",\n "recipient": "cosmos00af8sd0a9dfansdfoiasf0a9ssd9fa09i99990",\n "amount": [{\n "denom": "uatom",\n "amount": "10000000000"\n }]\n }\n ],\n "deposit": "100000uatom",\n "proposer": "cosmos12xpdapokdfpsodf32das75sokdaadapsokd1sa",\n "metadata": "Community Pool Spend Proposal Example",\n "title": "Activate governance discussions on the Discourse forum using community pool funds",\n "summary": "## Summary\\nProposal to request for 1000 ATOM from the community spending pool to be sent to a multisig who will put funds towards stewardship of the Discourse forum to make it an authoritative record of governance decisions as well as a vibrant space to draft and discuss proposals.\\n## Details\\nWe are requesting 1000 ATOM from the community spending pool to activate and steward the Cosmos Hub (Discourse) forum for the next six months.\\n\\nOff-chain governance conversations are currently highly fragmented, with no shared public venue for discussing proposals as they proceed through the process of being drafted and voted on. It means there is no record of discussion that voters can confidently point to for context, potentially leading to governance decisions becoming delegitimized by stakeholders.\\n\\nThe requested amount will be sent to a multisig comprising individuals (members listed below) who can ensure that the tokens are spent judiciously. We believe stewardship of the forum requires:\\n\\n* **Moderation**: Format, edit, and categorize posts; Standardize titles and tags; Monitor and approve new posts; Archive posts.\\n* **Facilitation**: Ask clarifying questions in post threads; Summarize discussions; Provide historical precedence to discussions.\\n* **Engagement**: Circulate important posts on other social channels to increase community participation; Solicit input from key stakeholders.\\n* **Guidance**: Orient and assist newcomers; Guide proposers through governance process; Answer questions regarding the forum or Cosmos ecosystem.\\nThe work to steward the forum will be carried out by members of [Hypha Worker Co-op](https://hypha.coop/) and individuals selected from the community to carry out scoped tasks in exchange for ATOM from this budget.\\n## Multisig Members\\n* Hypha: Mai Ishikawa Sutton (Hypha Co-op)\\n* Validator: Daniel Hwang (Stakefish)\\n* Cosmos Hub developer: Lauren Gallinaro (Interchain Berlin)\\n\\nWe feel the membership of the multisig should be rotated following the six-month pilot period to preserve insight from the distinct specializations (i.e., Cosmos Hub validators and developers).\\n## Timeline and Deliverables\\nWe estimate the total work to take 250-300 hours over six months where we hope to produce:\\n* **Moving summaries:** Provide succinct summaries of the proposals and include all publicly stated reasons why various entities are choosing to vote for/against a given proposal. These summaries will be written objectively, not siding with any one entity.\\n* **Validator platforms:** Create a section of the Forum where we collate all validators\' visions for Cosmos Hub governance to allow them to state their positions publicly. We will work with the smaller validators to ensure they are equally represented.\\n* **Regular check-ins with the Cosmonaut DAO:** Collaborate with the future Cosmonaut DAO to ensure maximal accessibility and engagement. Community management is a critical, complementary aspect of increasing participation in governance.\\n* **Announcement channel:** Create a read-only announcement channel in the Cosmos Community Discord, so that new proposals and major discussions can be easily followed.\\n* **Tooling friendly posts:** Tag and categorize posts so that they can be easily ingested into existing tooling that validators have setup.\\n* **Neutral moderation framework:** Document and follow transparent standards for how the forum is moderated.\\n\\nAt the end of the period, we will produce a report reflecting on our successes and failures, and recommendations for how the work of maintaining a governance venue can be continuously sustained (e.g., through a DAO). We see this initiative as a process of discovery, where we are learning by doing.\\n\\nFor more context, you can read through the discussions on this [proposal on the Discourse forum](https://forum.cosmos.network/t/proposal-draft-activate-governance-discussions-on-the-discourse-forum-using-community-pool-funds/5833).\\n\\n## Governance Votes\\nThe following items summarize the voting options and what it means for this proposal:\\n**YES** - You approve this community spend proposal to deposit 1000 ATOM to a multisig that will spend them to improve governance discussions in the Discourse forum.\\n**NO** - You disapprove of this community spend proposal in its current form (please indicate why in the Cosmos Forum).\\n**NO WITH VETO** - You are strongly opposed to this change and will exit the network if passed.\\n**ABSTAIN** - You are impartial to the outcome of the proposal.\\n## Recipient\\ncosmos1xf2qwf6g6xvuttpf37xwrgp08qq984244952ze\\n## Amount\\n1000 ATOM\\n\\n***Disclosure**: Hypha has an existing contract with the Interchain Foundation focused on the testnet program and improving documentation. This work is beyond the scope of that contract and is focused on engaging the community in governance.*\\n\\nIPFS pin of proposal on-forum: (https://ipfs.io/ipfs/Qmaq7ftqWccgYCo8U1KZfEnjvjUDzSEGpMxcRy61u8gf2Y)",\n}\n')),(0,n.yg)("h2",{id:"legacy-param-change"},"Legacy Param Change"),(0,n.yg)("admonition",{type:"tip"},(0,n.yg)("p",{parentName:"admonition"},"Legacy parameter change proposals are not available for cosmos-sdk modules."),(0,n.yg)("p",{parentName:"admonition"},"You can update these CosmosHub modules using ",(0,n.yg)("inlineCode",{parentName:"p"},"submit-legacy-proposal"),":"),(0,n.yg)("ul",{parentName:"admonition"},(0,n.yg)("li",{parentName:"ul"},"ibc (transfer, interchain-accounts)"),(0,n.yg)("li",{parentName:"ul"},"provider"))),(0,n.yg)("p",null,(0,n.yg)("strong",{parentName:"p"},"Note:")," The changes outlined here must be submitted using ",(0,n.yg)("inlineCode",{parentName:"p"},"submit-legacy-proposal"),"."),(0,n.yg)("p",null,"For ",(0,n.yg)("inlineCode",{parentName:"p"},"param-change")," proposals, there are arguably seven (7) components, though three are nested beneath 'Changes':"),(0,n.yg)("ol",null,(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Title")," - the distinguishing name of the proposal, typically the way that explorers list proposals"),(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Description")," - the body of the proposal that further describes what is being proposed and details surrounding the proposal"),(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Changes")," - a component containing "),(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Subspace")," - the Cosmos Hub module with the parameter that is being changed"),(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Key")," - the parameter that will be changed"),(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Value")," - the value of the parameter that will be changed by the governance mechanism"),(0,n.yg)("li",{parentName:"ol"},(0,n.yg)("strong",{parentName:"li"},"Deposit"),' - the amount that will be contributed to the deposit (in micro-ATOMs "uatom") from the account submitting the proposal')),(0,n.yg)("p",null,"The components must be presented as shown in the example."),(0,n.yg)("admonition",{type:"info"},(0,n.yg)("p",{parentName:"admonition"},"To update any of the cosmos-sdk modules you must use ",(0,n.yg)("inlineCode",{parentName:"p"},"gaiad tx gov submit-proposal")," with a correctly formatted proposal file containing a ",(0,n.yg)("inlineCode",{parentName:"p"},"MsgUpdateParams"),"."),(0,n.yg)("p",{parentName:"admonition"},"When using ",(0,n.yg)("inlineCode",{parentName:"p"},"MsgUpdateParams")," please note that ",(0,n.yg)("strong",{parentName:"p"},"all")," fields must always be specified (",(0,n.yg)("inlineCode",{parentName:"p"},"PUT")," semantics). Please be careful to not accidentally submit a proposal\nthat changes more parameters than was intended. The parameters that you do not want to change you can simply copy from existing module params.")),(0,n.yg)("h3",{id:"real-example-2"},"Real example"),(0,n.yg)("p",null,"This example is 'real', because it was put on-chain using the Theta testnet and can be seen in the block explorer ",(0,n.yg)("a",{parentName:"p",href:"https://explorer.theta-testnet.polypore.xyz/proposals/87"},"here"),"."),(0,n.yg)("p",null,"Not all explorers will show the proposed parameter changes that are coded into the proposal, so ensure that you verify that the description aligns with what the governance proposal is programmed to enact. If the description says that a certain parameter will be increased, it should also be programmed to do that, but it's possible that that's not the case (accidentally or otherwise)."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-json"},' {\n "title": "Doc update test: Param change for transfer/SendEnabled",\n "description": "Testing the proposal format for enabling IBC transfers on our chain",\n "changes": [\n {\n "subspace": "transfer",\n "key": "transfer",\n "value": true\n }\n ],\n "deposit": "100000uatom"\n}\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/12e4c223.ed97c2bf.js b/assets/js/12e4c223.ed97c2bf.js new file mode 100644 index 00000000000..d7b756eeb22 --- /dev/null +++ b/assets/js/12e4c223.ed97c2bf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[7999],{5680:(e,t,n)=>{n.d(t,{xA:()=>d,yg:()=>h});var r=n(6540);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(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},c="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),c=u(n),m=a,h=c["".concat(l,".").concat(m)]||c[m]||p[m]||i;return n?r.createElement(h,o(o({ref:t},d),{},{components:n})):r.createElement(h,o({ref:t},d))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:a,o[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var r=n(8168),a=(n(6540),n(5680));const i={title:"LSM Staking",order:1},o=void 0,s={unversionedId:"modules/lsm-staking",id:"modules/lsm-staking",title:"LSM Staking",description:"The x/staking module used by the Hub includes extensions that enable liquid staking",source:"@site/docs/modules/lsm-staking.md",sourceDirName:"modules",slug:"/modules/lsm-staking",permalink:"/main/modules/lsm-staking",draft:!1,tags:[],version:"current",frontMatter:{title:"LSM Staking",order:1},sidebar:"tutorialSidebar",previous:{title:"Gaia Modules",permalink:"/main/modules/"},next:{title:"Metaprotocol",permalink:"/main/modules/metaprotocols"}},l={},u=[{value:"What are LSM shares",id:"what-are-lsm-shares",level:2},{value:"Benefits",id:"benefits",level:2}],d={toc:u},c="wrapper";function p(e){let{components:t,...n}=e;return(0,a.yg)(c,(0,r.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("p",null,"The ",(0,a.yg)("inlineCode",{parentName:"p"},"x/staking")," module used by the Hub includes extensions that enable liquid staking\nYou can read more about it in our ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/cosmos/cosmos-sdk/tree/v0.50.9-lsm/x/staking#totalliquidstakedtokens"},"LSM documentation"),"."),(0,a.yg)("h2",{id:"what-are-lsm-shares"},"What are LSM shares"),(0,a.yg)("p",null,'LSM shares are derivatives of the delegation shares. They are tied to a delegator and a validator pair and they represent the underlying delegation shares.\nBy issuing LSM shares, the underlying staked ATOM can become "liquid" while still being slashable. The LSM shares are tokens that can be used in various DeFi protocols and transferred between users or between chains via IBC.'),(0,a.yg)("p",null,"LSM shares are not fungible (as they are tied to a delegator/validator pair) and are issued by the Hub directly and thus don't depend on the security of any entity other than the Cosmos Hub itself."),(0,a.yg)("h2",{id:"benefits"},"Benefits"),(0,a.yg)("p",null,"By tokenizing your staked ATOM into LSM shares, you maintain the benefits of staking while gaining flexibility in using these shares in DeFi protcols and platforms."),(0,a.yg)("p",null,"The LSM shares issued by the Hub are powering liquid staking derivatives like stATOM or dATOM and they are the backbone of the Hydro plaftorm."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1774.97f6cb51.js b/assets/js/1774.97f6cb51.js new file mode 100644 index 00000000000..7fd3bafc9ac --- /dev/null +++ b/assets/js/1774.97f6cb51.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[1774],{1774:(e,t,n)=>{n.r(t),n.d(t,{default:()=>c});var a=n(6540),o=n(1312),l=n(9024),r=n(8511);function c(){return a.createElement(a.Fragment,null,a.createElement(l.be,{title:(0,o.T)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.A,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"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/17896441.c0ae458d.js b/assets/js/17896441.c0ae458d.js new file mode 100644 index 00000000000..20915721f61 --- /dev/null +++ b/assets/js/17896441.c0ae458d.js @@ -0,0 +1 @@ +(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[8401],{5680:(e,t,n)=>{"use strict";n.d(t,{xA:()=>d,yg:()=>f});var a=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var i=a.createContext({}),s=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=s(e.components);return a.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},p=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,d=c(e,["components","mdxType","originalType","parentName"]),u=s(n),p=o,f=u["".concat(i,".").concat(p)]||u[p]||m[p]||r;return n?a.createElement(f,l(l({ref:t},d),{},{components:n})):a.createElement(f,l({ref:t},d))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,l=new Array(r);l[0]=p;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[u]="string"==typeof e?e:o,l[1]=c;for(var s=2;se.reference?o.default.createElement(r.default,{...e}):o.default.createElement(l.default,{...e}))},8599:function(e,t,n){"use strict";var a=this&&this.__createBinding||(Object.create?function(e,t,n,a){void 0===a&&(a=n),Object.defineProperty(e,a,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,a){void 0===a&&(a=n),e[a]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&a(t,e,n);return o(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.codeReducer=t.parseReference=void 0;const c=r(n(6540)),i=l(n(2355)),s={code:"loading...",error:null,loading:null},d={fontSize:".9em",fontWeight:600,color:"#0E75DD",textAlign:"center",paddingBottom:"13px",textDecoration:"underline"};function u(e){const t=e.slice(e.indexOf("https"),-1),[n,a]=t.split("#"),o=globalThis||{};o.URL||(o.URL=URL);const[r,l,c,i,...s]=new o.URL(n).pathname.split("/").slice(1),[d,u]=a?a.split("-").map((e=>parseInt(e.slice(1),10)-1)):[0,1/0];return{url:`https://raw.githubusercontent.com/${r}/${l}/${i}/${s.join("/")}`,fromLine:d,toLine:u,title:s.join("/")}}function m(e,{type:t,value:n}){switch(t){case"reset":return s;case"loading":return{...e,loading:!0};case"loaded":return{...e,code:n,loading:!1};case"error":return{...e,error:n,loading:!1};default:return e}}t.parseReference=u,t.codeReducer=m,t.default=function(e){var t,n,a;const[o,r]=c.useReducer(m,s),l=u(e.children);!1!==o.loading&&async function({url:e,fromLine:t,toLine:n},a){let o;try{o=await fetch(e)}catch(c){return a({type:"error",value:c})}if(200!==o.status)return a({type:"error",value:await o.text()});const r=(await o.text()).split("\n").slice(t,(n||t)+1),l=r.reduce(((e,t)=>{if(0===t.length)return e;const n=t.match(/^\s+/);return n?Math.min(e,n[0].length):0}),1/0);a({type:"loaded",value:r.map((e=>e.slice(l))).join("\n")})}(l,r);const p=null===(t=e.metastring)||void 0===t?void 0:t.match(/title="(?.*)"/),f={...e,metastring:(null===(n=null==p?void 0:p.groups)||void 0===n?void 0:n.title)?` title="${null===(a=null==p?void 0:p.groups)||void 0===a?void 0:a.title}"`:` title="${l.title}"`,children:s.code};return c.default.createElement("div",null,c.default.createElement(i.default,{...f},o.code),c.default.createElement("div",{style:d},c.default.createElement("a",{href:e.children,target:"_blank"},"See full example on GitHub")))}},2355:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>F});var a=n(8168),o=n(6540),r=n(2303),l=n(53),c=n(5293),i=n(6342);function s(){const{prism:e}=(0,i.p)(),{colorMode:t}=(0,c.G)(),n=e.theme,a=e.darkTheme||n;return"dark"===t?a:n}var d=n(7559),u=n(8426),m=n.n(u);const p=/title=(?<quote>["'])(?<title>.*?)\1/,f=/\{(?<range>[\d,-]+)\}/,h={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}};function g(e,t){const n=e.map((e=>{const{start:n,end:a}=h[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${a})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function b(e,t){let n=e.replace(/\n$/,"");const{language:a,magicComments:o,metastring:r}=t;if(r&&f.test(r)){const e=r.match(f).groups.range;if(0===o.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${r}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=o[0].className,a=m()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(a),code:n}}if(void 0===a)return{lineClassNames:{},code:n};const l=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return g(["js","jsBlock"],t);case"jsx":case"tsx":return g(["js","jsBlock","jsx"],t);case"html":return g(["js","jsBlock","html"],t);case"python":case"py":case"bash":return g(["bash"],t);case"markdown":case"md":return g(["html","jsx","bash"],t);default:return g(Object.keys(h),t)}}(a,o),c=n.split("\n"),i=Object.fromEntries(o.map((e=>[e.className,{start:0,range:""}]))),s=Object.fromEntries(o.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let m=0;m<c.length;){const e=c[m].match(l);if(!e){m+=1;continue}const t=e.slice(1).find((e=>void 0!==e));s[t]?i[s[t]].range+=`${m},`:d[t]?i[d[t]].start=m:u[t]&&(i[u[t]].range+=`${i[u[t]].start}-${m-1},`),c.splice(m,1)}n=c.join("\n");const p={};return Object.entries(i).forEach((e=>{let[t,{range:n}]=e;m()(n).forEach((e=>{p[e]??=[],p[e].push(t)}))})),{lineClassNames:p,code:n}}const v={codeBlockContainer:"codeBlockContainer_Ckt0"};function E(e){let{as:t,...n}=e;const r=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[a,o]=e;const r=t[a];r&&"string"==typeof o&&(n[r]=o)})),n}(s());return o.createElement(t,(0,a.A)({},n,{style:r,className:(0,l.A)(n.className,v.codeBlockContainer,d.G.common.codeBlock)}))}const y={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function k(e){let{children:t,className:n}=e;return o.createElement(E,{as:"pre",tabIndex:0,className:(0,l.A)(y.codeBlockStandalone,"thin-scrollbar",n)},o.createElement("code",{className:y.codeBlockLines},t))}var N=n(9532);const A={attributes:!0,characterData:!0,childList:!0,subtree:!0};function C(e,t){const[n,a]=(0,o.useState)(),r=(0,o.useCallback)((()=>{a(e.current?.closest("[role=tabpanel][hidden]"))}),[e,a]);(0,o.useEffect)((()=>{r()}),[r]),function(e,t,n){void 0===n&&(n=A);const a=(0,N._q)(t),r=(0,N.Be)(n);(0,o.useEffect)((()=>{const t=new MutationObserver(a);return e&&t.observe(e,r),()=>t.disconnect()}),[e,a,r])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),r())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}const L={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]};var _={Prism:n(1258).A,theme:L};function T(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function w(){return w=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},w.apply(this,arguments)}var x=/\r\n|\r|\n/,B=function(e){0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},O=function(e,t){var n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)};function j(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&-1===t.indexOf(a)&&(n[a]=e[a]);return n}var H=function(e){function t(){for(var t=this,n=[],a=arguments.length;a--;)n[a]=arguments[a];e.apply(this,n),T(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?function(e,t){var n=e.plain,a=Object.create(null),o=e.styles.reduce((function(e,n){var a=n.languages,o=n.style;return a&&!a.includes(t)||n.types.forEach((function(t){var n=w({},e[t],o);e[t]=n})),e}),a);return o.root=n,o.plain=w({},n,{backgroundColor:null}),o}(e.theme,e.language):void 0;return t.themeDict=n})),T(this,"getLineProps",(function(e){var n=e.key,a=e.className,o=e.style,r=w({},j(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),l=t.getThemeDict(t.props);return void 0!==l&&(r.style=l.plain),void 0!==o&&(r.style=void 0!==r.style?w({},r.style,o):o),void 0!==n&&(r.key=n),a&&(r.className+=" "+a),r})),T(this,"getStyleForToken",(function(e){var n=e.types,a=e.empty,o=n.length,r=t.getThemeDict(t.props);if(void 0!==r){if(1===o&&"plain"===n[0])return a?{display:"inline-block"}:void 0;if(1===o&&!a)return r[n[0]];var l=a?{display:"inline-block"}:{},c=n.map((function(e){return r[e]}));return Object.assign.apply(Object,[l].concat(c))}})),T(this,"getTokenProps",(function(e){var n=e.key,a=e.className,o=e.style,r=e.token,l=w({},j(e,["key","className","style","token"]),{className:"token "+r.types.join(" "),children:r.content,style:t.getStyleForToken(r),key:void 0});return void 0!==o&&(l.style=void 0!==l.style?w({},l.style,o):o),void 0!==n&&(l.key=n),a&&(l.className+=" "+a),l})),T(this,"tokenize",(function(e,t,n,a){var o={code:t,grammar:n,language:a,tokens:[]};e.hooks.run("before-tokenize",o);var r=o.tokens=e.tokenize(o.code,o.grammar,o.language);return e.hooks.run("after-tokenize",o),r}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,a=e.code,o=e.children,r=this.getThemeDict(this.props),l=t.languages[n];return o({tokens:function(e){for(var t=[[]],n=[e],a=[0],o=[e.length],r=0,l=0,c=[],i=[c];l>-1;){for(;(r=a[l]++)<o[l];){var s=void 0,d=t[l],u=n[l][r];if("string"==typeof u?(d=l>0?d:["plain"],s=u):(d=O(d,u.type),u.alias&&(d=O(d,u.alias)),s=u.content),"string"==typeof s){var m=s.split(x),p=m.length;c.push({types:d,content:m[0]});for(var f=1;f<p;f++)B(c),i.push(c=[]),c.push({types:d,content:m[f]})}else l++,t.push(d),n.push(s),a.push(0),o.push(s.length)}l--,t.pop(),n.pop(),a.pop(),o.pop()}return B(c),i}(void 0!==l?this.tokenize(t,a,l,n):[a]),className:"prism-code language-"+n,style:void 0!==r?r.root:{},getLineProps:this.getLineProps,getTokenProps:this.getTokenProps})},t}(o.Component);const M=H,S={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function P(e){let{line:t,classNames:n,showLineNumbers:r,getLineProps:c,getTokenProps:i}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const s=c({line:t,className:(0,l.A)(n,r&&S.codeLine)}),d=t.map(((e,t)=>o.createElement("span",(0,a.A)({key:t},i({token:e,key:t})))));return o.createElement("span",s,r?o.createElement(o.Fragment,null,o.createElement("span",{className:S.codeLineNumber}),o.createElement("span",{className:S.codeLineContent},d)):d,o.createElement("br",null))}var I=n(1312);function U(e){return o.createElement("svg",(0,a.A)({viewBox:"0 0 24 24"},e),o.createElement("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 D(e){return o.createElement("svg",(0,a.A)({viewBox:"0 0 24 24"},e),o.createElement("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))}const R={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function V(e){let{code:t,className:n}=e;const[a,r]=(0,o.useState)(!1),c=(0,o.useRef)(void 0),i=(0,o.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 a=document.createElement("textarea"),o=document.activeElement;a.value=e,a.setAttribute("readonly",""),a.style.contain="strict",a.style.position="absolute",a.style.left="-9999px",a.style.fontSize="12pt";const r=document.getSelection(),l=r.rangeCount>0&&r.getRangeAt(0);n.append(a),a.select(),a.selectionStart=0,a.selectionEnd=e.length;let c=!1;try{c=document.execCommand("copy")}catch{}a.remove(),l&&(r.removeAllRanges(),r.addRange(l)),o&&o.focus()}(t),r(!0),c.current=window.setTimeout((()=>{r(!1)}),1e3)}),[t]);return(0,o.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),o.createElement("button",{type:"button","aria-label":a?(0,I.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,I.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,I.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,l.A)("clean-btn",n,R.copyButton,a&&R.copyButtonCopied),onClick:i},o.createElement("span",{className:R.copyButtonIcons,"aria-hidden":"true"},o.createElement(U,{className:R.copyButtonIcon}),o.createElement(D,{className:R.copyButtonSuccessIcon})))}function z(e){return o.createElement("svg",(0,a.A)({viewBox:"0 0 24 24"},e),o.createElement("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 W={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function $(e){let{className:t,onClick:n,isEnabled:a}=e;const r=(0,I.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return o.createElement("button",{type:"button",onClick:n,className:(0,l.A)("clean-btn",t,a&&W.wordWrapButtonEnabled),"aria-label":r,title:r},o.createElement(z,{className:W.wordWrapButtonIcon,"aria-hidden":"true"}))}function G(e){let{children:t,className:n="",metastring:r,title:c,showLineNumbers:d,language:u}=e;const{prism:{defaultLanguage:m,magicComments:f}}=(0,i.p)(),h=u??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??m,g=s(),v=function(){const[e,t]=(0,o.useState)(!1),[n,a]=(0,o.useState)(!1),r=(0,o.useRef)(null),l=(0,o.useCallback)((()=>{const n=r.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[r,e]),c=(0,o.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=r.current,n=e>t||r.current.querySelector("code").hasAttribute("style");a(n)}),[r]);return C(r,c),(0,o.useEffect)((()=>{c()}),[e,c]),(0,o.useEffect)((()=>(window.addEventListener("resize",c,{passive:!0}),()=>{window.removeEventListener("resize",c)})),[c]),{codeBlockRef:r,isEnabled:e,isCodeScrollable:n,toggle:l}}(),k=function(e){return e?.match(p)?.groups.title??""}(r)||c,{lineClassNames:N,code:A}=b(t,{metastring:r,language:h,magicComments:f}),L=d??function(e){return Boolean(e?.includes("showLineNumbers"))}(r);return o.createElement(E,{as:"div",className:(0,l.A)(n,h&&!n.includes(`language-${h}`)&&`language-${h}`)},k&&o.createElement("div",{className:y.codeBlockTitle},k),o.createElement("div",{className:y.codeBlockContent},o.createElement(M,(0,a.A)({},_,{theme:g,code:A,language:h??"text"}),(e=>{let{className:t,tokens:n,getLineProps:a,getTokenProps:r}=e;return o.createElement("pre",{tabIndex:0,ref:v.codeBlockRef,className:(0,l.A)(t,y.codeBlock,"thin-scrollbar")},o.createElement("code",{className:(0,l.A)(y.codeBlockLines,L&&y.codeBlockLinesWithNumbering)},n.map(((e,t)=>o.createElement(P,{key:t,line:e,getLineProps:a,getTokenProps:r,classNames:N[t],showLineNumbers:L})))))})),o.createElement("div",{className:y.buttonGroup},(v.isEnabled||v.isCodeScrollable)&&o.createElement($,{className:y.codeButton,onClick:()=>v.toggle(),isEnabled:v.isEnabled}),o.createElement(V,{className:y.codeButton,code:A}))))}function F(e){let{children:t,...n}=e;const l=(0,r.A)(),c=function(e){return o.Children.toArray(e).some((e=>(0,o.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),i="string"==typeof c?G:k;return o.createElement(i,(0,a.A)({key:String(l)},n),c)}},6140:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>Xe});var a=n(6540),o=n(9024),r=n(9532);const l=a.createContext(null);function c(e){let{children:t,content:n}=e;const o=function(e){return(0,a.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return a.createElement(l.Provider,{value:o},t)}function i(){const e=(0,a.useContext)(l);if(null===e)throw new r.dV("DocProvider");return e}function s(){const{metadata:e,frontMatter:t,assets:n}=i();return a.createElement(o.be,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var d=n(53),u=n(4581),m=n(8168),p=n(1312),f=n(5489);function h(e){const{permalink:t,title:n,subLabel:o,isNext:r}=e;return a.createElement(f.A,{className:(0,d.A)("pagination-nav__link",r?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},o&&a.createElement("div",{className:"pagination-nav__sublabel"},o),a.createElement("div",{className:"pagination-nav__label"},n))}function g(e){const{previous:t,next:n}=e;return a.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,p.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&a.createElement(h,(0,m.A)({},t,{subLabel:a.createElement(p.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),n&&a.createElement(h,(0,m.A)({},n,{subLabel:a.createElement(p.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}function b(){const{metadata:e}=i();return a.createElement(g,{previous:e.previous,next:e.next})}var v=n(4586),E=n(4070),y=n(7559),k=n(5597),N=n(2252);const A={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(p.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:a.createElement("b",null,n.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(p.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:a.createElement("b",null,n.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function C(e){const t=A[e.versionMetadata.banner];return a.createElement(t,e)}function L(e){let{versionLabel:t,to:n,onClick:o}=e;return a.createElement(p.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:a.createElement("b",null,a.createElement(f.A,{to:n,onClick:o},a.createElement(p.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function _(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:o}}=(0,v.A)(),{pluginId:r}=(0,E.vT)({failfast:!0}),{savePreferredVersionName:l}=(0,k.g1)(r),{latestDocSuggestion:c,latestVersionSuggestion:i}=(0,E.HW)(r),s=c??(u=i).docs.find((e=>e.id===u.mainDocId));var u;return a.createElement("div",{className:(0,d.A)(t,y.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},a.createElement("div",null,a.createElement(C,{siteTitle:o,versionMetadata:n})),a.createElement("div",{className:"margin-top--md"},a.createElement(L,{versionLabel:i.label,to:s.path,onClick:()=>l(i.name)})))}function T(e){let{className:t}=e;const n=(0,N.r)();return n.banner?a.createElement(_,{className:t,versionMetadata:n}):null}function w(e){let{className:t}=e;const n=(0,N.r)();return n.badge?a.createElement("span",{className:(0,d.A)(t,y.G.docs.docVersionBadge,"badge badge--secondary")},a.createElement(p.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label}},"Version: {versionLabel}")):null}function x(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return a.createElement(p.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:a.createElement("b",null,a.createElement("time",{dateTime:new Date(1e3*t).toISOString()},n))}}," on {date}")}function B(e){let{lastUpdatedBy:t}=e;return a.createElement(p.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:a.createElement("b",null,t)}}," by {user}")}function O(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:o}=e;return a.createElement("span",{className:y.G.common.lastUpdated},a.createElement(p.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?a.createElement(x,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:o?a.createElement(B,{lastUpdatedBy:o}):""}},"Last updated{atDate}{byUser}"),!1)}const j={iconEdit:"iconEdit_Z9Sw"};function H(e){let{className:t,...n}=e;return a.createElement("svg",(0,m.A)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,d.A)(j.iconEdit,t),"aria-hidden":"true"},n),a.createElement("g",null,a.createElement("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 M(e){let{editUrl:t}=e;return a.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener",className:y.G.common.editThisPage},a.createElement(H,null),a.createElement(p.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}const S={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function P(e){let{permalink:t,label:n,count:o}=e;return a.createElement(f.A,{href:t,className:(0,d.A)(S.tag,o?S.tagWithCount:S.tagRegular)},n,o&&a.createElement("span",null,o))}const I={tags:"tags_jXut",tag:"tag_QGVx"};function U(e){let{tags:t}=e;return a.createElement(a.Fragment,null,a.createElement("b",null,a.createElement(p.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),a.createElement("ul",{className:(0,d.A)(I.tags,"padding--none","margin-left--sm")},t.map((e=>{let{label:t,permalink:n}=e;return a.createElement("li",{key:n,className:I.tag},a.createElement(P,{label:t,permalink:n}))}))))}const D={lastUpdated:"lastUpdated_vwxv"};function R(e){return a.createElement("div",{className:(0,d.A)(y.G.docs.docFooterTagsRow,"row margin-bottom--sm")},a.createElement("div",{className:"col"},a.createElement(U,e)))}function V(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:o,formattedLastUpdatedAt:r}=e;return a.createElement("div",{className:(0,d.A)(y.G.docs.docFooterEditMetaRow,"row")},a.createElement("div",{className:"col"},t&&a.createElement(M,{editUrl:t})),a.createElement("div",{className:(0,d.A)("col",D.lastUpdated)},(n||o)&&a.createElement(O,{lastUpdatedAt:n,formattedLastUpdatedAt:r,lastUpdatedBy:o})))}function z(){const{metadata:e}=i(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:o,lastUpdatedBy:r,tags:l}=e,c=l.length>0,s=!!(t||n||r);return c||s?a.createElement("footer",{className:(0,d.A)(y.G.docs.docFooter,"docusaurus-mt-lg")},c&&a.createElement(R,{tags:l}),s&&a.createElement(V,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:r,formattedLastUpdatedAt:o})):null}var W=n(1422),$=n(6342);function G(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,...o}=e;n>=0?t[n].children.push(o):a.push(o)})),a}function F(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=F({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function q(e){const t=e.getBoundingClientRect();return t.top===t.bottom?q(e.parentNode):t}function Y(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>q(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(q(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function Z(){const e=(0,a.useRef)(0),{navbar:{hideOnScroll:t}}=(0,$.p)();return(0,a.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function Q(e){const t=(0,a.useRef)(void 0),n=Z();(0,a.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:o,minHeadingLevel:r,maxHeadingLevel:l}=e;function c(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),c=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let o=t;o<=n;o+=1)a.push(`h${o}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:r,maxHeadingLevel:l}),i=Y(c,{anchorTopOffset:n.current}),s=e.find((e=>i&&i.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(o),e.classList.add(o),t.current=e):e.classList.remove(o)}(e,e===s)}))}return document.addEventListener("scroll",c),document.addEventListener("resize",c),c(),()=>{document.removeEventListener("scroll",c),document.removeEventListener("resize",c)}}),[e,n])}function X(e){let{toc:t,className:n,linkClassName:o,isChild:r}=e;return t.length?a.createElement("ul",{className:r?void 0:n},t.map((e=>a.createElement("li",{key:e.id},a.createElement("a",{href:`#${e.id}`,className:o??void 0,dangerouslySetInnerHTML:{__html:e.value}}),a.createElement(X,{isChild:!0,toc:e.children,className:n,linkClassName:o}))))):null}const J=a.memo(X);function K(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:l,maxHeadingLevel:c,...i}=e;const s=(0,$.p)(),d=l??s.tableOfContents.minHeadingLevel,u=c??s.tableOfContents.maxHeadingLevel,p=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:o}=e;return(0,a.useMemo)((()=>F({toc:G(t),minHeadingLevel:n,maxHeadingLevel:o})),[t,n,o])}({toc:t,minHeadingLevel:d,maxHeadingLevel:u});return Q((0,a.useMemo)((()=>{if(o&&r)return{linkClassName:o,linkActiveClassName:r,minHeadingLevel:d,maxHeadingLevel:u}}),[o,r,d,u])),a.createElement(J,(0,m.A)({toc:p,className:n,linkClassName:o},i))}const ee={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function te(e){let{collapsed:t,...n}=e;return a.createElement("button",(0,m.A)({type:"button"},n,{className:(0,d.A)("clean-btn",ee.tocCollapsibleButton,!t&&ee.tocCollapsibleButtonExpanded,n.className)}),a.createElement(p.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page"))}const ne={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function ae(e){let{toc:t,className:n,minHeadingLevel:o,maxHeadingLevel:r}=e;const{collapsed:l,toggleCollapsed:c}=(0,W.u)({initialState:!0});return a.createElement("div",{className:(0,d.A)(ne.tocCollapsible,!l&&ne.tocCollapsibleExpanded,n)},a.createElement(te,{collapsed:l,onClick:c}),a.createElement(W.N,{lazy:!0,className:ne.tocCollapsibleContent,collapsed:l},a.createElement(K,{toc:t,minHeadingLevel:o,maxHeadingLevel:r})))}const oe={tocMobile:"tocMobile_ITEo"};function re(){const{toc:e,frontMatter:t}=i();return a.createElement(ae,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,d.A)(y.G.docs.docTocMobile,oe.tocMobile)})}const le={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},ce="table-of-contents__link toc-highlight",ie="table-of-contents__link--active";function se(e){let{className:t,...n}=e;return a.createElement("div",{className:(0,d.A)(le.tableOfContents,"thin-scrollbar",t)},a.createElement(K,(0,m.A)({},n,{linkClassName:ce,linkActiveClassName:ie})))}function de(){const{toc:e,frontMatter:t}=i();return a.createElement(se,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:y.G.docs.docTocDesktop})}const ue={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function me(e){let{as:t,id:n,...o}=e;const{navbar:{hideOnScroll:r}}=(0,$.p)();if("h1"===t||!n)return a.createElement(t,(0,m.A)({},o,{id:void 0}));const l=(0,p.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof o.children?o.children:n});return a.createElement(t,(0,m.A)({},o,{className:(0,d.A)("anchor",r?ue.anchorWithHideOnScrollNavbar:ue.anchorWithStickyNavbar,o.className),id:n}),o.children,a.createElement(f.A,{className:"hash-link",to:`#${n}`,"aria-label":l,title:l},"\u200b"))}var pe=n(5680),fe=n(5260);var he=n(8059),ge=n.n(he);var be=n(2303);const ve={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function Ee(e){return!!e&&("SUMMARY"===e.tagName||Ee(e.parentElement))}function ye(e,t){return!!e&&(e===t||ye(e.parentElement,t))}function ke(e){let{summary:t,children:n,...o}=e;const r=(0,be.A)(),l=(0,a.useRef)(null),{collapsed:c,setCollapsed:i}=(0,W.u)({initialState:!o.open}),[s,u]=(0,a.useState)(o.open),p=a.isValidElement(t)?t:a.createElement("summary",null,t??"Details");return a.createElement("details",(0,m.A)({},o,{ref:l,open:s,"data-collapsed":c,className:(0,d.A)(ve.details,r&&ve.isBrowser,o.className),onMouseDown:e=>{Ee(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;Ee(t)&&ye(t,l.current)&&(e.preventDefault(),c?(i(!1),u(!0)):i(!0))}}),p,a.createElement(W.N,{lazy:!1,collapsed:c,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{i(e),u(!e)}},a.createElement("div",{className:ve.collapsibleContent},n)))}const Ne={details:"details_b_Ee"},Ae="alert alert--info";function Ce(e){let{...t}=e;return a.createElement(ke,(0,m.A)({},t,{className:(0,d.A)(Ae,Ne.details,t.className)}))}function Le(e){return a.createElement(me,e)}const _e={containsTaskList:"containsTaskList_mC6p"};function Te(e){if(void 0!==e)return(0,d.A)(e,e?.includes("contains-task-list")&&_e.containsTaskList)}const we={img:"img_ev3q"};const xe="admonition_LlT9",Be="admonitionHeading_tbUL",Oe="admonitionIcon_kALy",je="admonitionContent_S0QG";const He={note:{infimaClassName:"secondary",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 14 16"},a.createElement("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"}))},label:a.createElement(p.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 12 16"},a.createElement("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"}))},label:a.createElement(p.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 12 16"},a.createElement("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"}))},label:a.createElement(p.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 14 16"},a.createElement("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"}))},label:a.createElement(p.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 16 16"},a.createElement("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"}))},label:a.createElement(p.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},Me={secondary:"note",important:"info",success:"tip",warning:"danger"};function Se(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=a.Children.toArray(e),n=t.find((e=>a.isValidElement(e)&&"mdxAdmonitionTitle"===e.props?.mdxType)),o=a.createElement(a.Fragment,null,t.filter((e=>e!==n)));return{mdxAdmonitionTitle:n,rest:o}}(e.children);return{...e,title:e.title??t,children:n}}const Pe={head:function(e){const t=a.Children.map(e.children,(e=>a.isValidElement(e)?function(e){if(e.props?.mdxType&&e.props.originalType){const{mdxType:t,originalType:n,...o}=e.props;return a.createElement(e.props.originalType,o)}return e}(e):e));return a.createElement(fe.A,e,t)},code:function(e){const t=["a","abbr","b","br","button","cite","code","del","dfn","em","i","img","input","ins","kbd","label","object","output","q","ruby","s","small","span","strong","sub","sup","time","u","var","wbr"];return a.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")||(0,a.isValidElement)(e)&&t.includes(e.props?.mdxType)))?a.createElement("code",e):a.createElement(ge(),e)},a:function(e){return a.createElement(f.A,e)},pre:function(e){return a.createElement(ge(),(0,a.isValidElement)(e.children)&&"code"===e.children.props?.originalType?e.children.props:{...e})},details:function(e){const t=a.Children.toArray(e.children),n=t.find((e=>a.isValidElement(e)&&"summary"===e.props?.mdxType)),o=a.createElement(a.Fragment,null,t.filter((e=>e!==n)));return a.createElement(Ce,(0,m.A)({},e,{summary:n}),o)},ul:function(e){return a.createElement("ul",(0,m.A)({},e,{className:Te(e.className)}))},img:function(e){return a.createElement("img",(0,m.A)({loading:"lazy"},e,{className:(t=e.className,(0,d.A)(t,we.img))}));var t},h1:e=>a.createElement(Le,(0,m.A)({as:"h1"},e)),h2:e=>a.createElement(Le,(0,m.A)({as:"h2"},e)),h3:e=>a.createElement(Le,(0,m.A)({as:"h3"},e)),h4:e=>a.createElement(Le,(0,m.A)({as:"h4"},e)),h5:e=>a.createElement(Le,(0,m.A)({as:"h5"},e)),h6:e=>a.createElement(Le,(0,m.A)({as:"h6"},e)),admonition:function(e){const{children:t,type:n,title:o,icon:r}=Se(e),l=function(e){const t=Me[e]??e,n=He[t];return n||(console.warn(`No admonition config found for admonition type "${t}". Using Info as fallback.`),He.info)}(n),c=o??l.label,{iconComponent:i}=l,s=r??a.createElement(i,null);return a.createElement("div",{className:(0,d.A)(y.G.common.admonition,y.G.common.admonitionType(e.type),"alert",`alert--${l.infimaClassName}`,xe)},a.createElement("div",{className:Be},a.createElement("span",{className:Oe},s),c),a.createElement("div",{className:je},t))},mermaid:()=>null};function Ie(e){let{children:t}=e;return a.createElement(pe.xA,{components:Pe},t)}function Ue(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=i();return t.hide_title||void 0!==n?null:e.title}();return a.createElement("div",{className:(0,d.A)(y.G.docs.docMarkdown,"markdown")},n&&a.createElement("header",null,a.createElement(me,{as:"h1"},n)),a.createElement(Ie,null,t))}var De=n(1754),Re=n(9169),Ve=n(6025);function ze(e){return a.createElement("svg",(0,m.A)({viewBox:"0 0 24 24"},e),a.createElement("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 We={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function $e(){const e=(0,Ve.A)("/");return a.createElement("li",{className:"breadcrumbs__item"},a.createElement(f.A,{"aria-label":(0,p.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},a.createElement(ze,{className:We.breadcrumbHomeIcon})))}const Ge={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function Fe(e){let{children:t,href:n,isLast:o}=e;const r="breadcrumbs__link";return o?a.createElement("span",{className:r,itemProp:"name"},t):n?a.createElement(f.A,{className:r,href:n,itemProp:"item"},a.createElement("span",{itemProp:"name"},t)):a.createElement("span",{className:r},t)}function qe(e){let{children:t,active:n,index:o,addMicrodata:r}=e;return a.createElement("li",(0,m.A)({},r&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,d.A)("breadcrumbs__item",{"breadcrumbs__item--active":n})}),t,a.createElement("meta",{itemProp:"position",content:String(o+1)}))}function Ye(){const e=(0,De.OF)(),t=(0,Re.Dt)();return e?a.createElement("nav",{className:(0,d.A)(y.G.docs.docBreadcrumbs,Ge.breadcrumbsContainer),"aria-label":(0,p.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},a.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&a.createElement($e,null),e.map(((t,n)=>{const o=n===e.length-1;return a.createElement(qe,{key:n,active:o,index:n,addMicrodata:!!t.href},a.createElement(Fe,{href:t.href,isLast:o},t.label))})))):null}const Ze={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function Qe(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=i(),n=(0,u.l)(),o=e.hide_table_of_contents,r=!o&&t.length>0;return{hidden:o,mobile:r?a.createElement(re,null):void 0,desktop:!r||"desktop"!==n&&"ssr"!==n?void 0:a.createElement(de,null)}}();return a.createElement("div",{className:"row"},a.createElement("div",{className:(0,d.A)("col",!n.hidden&&Ze.docItemCol)},a.createElement(T,null),a.createElement("div",{className:Ze.docItemContainer},a.createElement("article",null,a.createElement(Ye,null),a.createElement(w,null),n.mobile,a.createElement(Ue,null,t),a.createElement(z,null)),a.createElement(b,null))),n.desktop&&a.createElement("div",{className:"col col--3"},n.desktop))}function Xe(e){const t=`docs-doc-id-${e.content.metadata.unversionedId}`,n=e.content;return a.createElement(c,{content:e.content},a.createElement(o.e3,{className:t},a.createElement(s,null),a.createElement(Qe,null,a.createElement(n,null))))}},2252:(e,t,n)=>{"use strict";n.d(t,{n:()=>l,r:()=>c});var a=n(6540),o=n(9532);const r=a.createContext(null);function l(e){let{children:t,version:n}=e;return a.createElement(r.Provider,{value:n},t)}function c(){const e=(0,a.useContext)(r);if(null===e)throw new o.dV("DocsVersionProvider");return e}},8426:(e,t)=>{function n(e){let t,n=[];for(let a of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(a))n.push(parseInt(a,10));else if(t=a.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,a,o,r]=t;if(a&&r){a=parseInt(a),r=parseInt(r);const e=a<r?1:-1;"-"!==o&&".."!==o&&"\u2025"!==o||(r+=e);for(let t=a;t!==r;t+=e)n.push(t)}}return n}t.default=n,e.exports=n}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.08548001.js b/assets/js/1a4e3797.08548001.js new file mode 100644 index 00000000000..69a8c18d3f0 --- /dev/null +++ b/assets/js/1a4e3797.08548001.js @@ -0,0 +1,2 @@ +/*! For license information please see 1a4e3797.08548001.js.LICENSE.txt */ +(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[2138],{2733:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function n(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,a,s,c,u,o;if(this._events||(this._events={}),"error"===e&&(!this._events.error||n(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(i(a=this._events[e]))return!1;if(r(a))switch(arguments.length){case 1:a.call(this);break;case 2:a.call(this,arguments[1]);break;case 3:a.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),a.apply(this,c)}else if(n(a))for(c=Array.prototype.slice.call(arguments,1),s=(o=a.slice()).length,u=0;u<s;u++)o[u].apply(this,c);return!0},t.prototype.addListener=function(e,a){var s;if(!r(a))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,r(a.listener)?a.listener:a),this._events[e]?n(this._events[e])?this._events[e].push(a):this._events[e]=[this._events[e],a]:this._events[e]=a,n(this._events[e])&&!this._events[e].warned&&(s=i(this._maxListeners)?t.defaultMaxListeners:this._maxListeners)&&s>0&&this._events[e].length>s&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}return i.listener=t,this.on(e,i),this},t.prototype.removeListener=function(e,t){var i,a,s,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(s=(i=this._events[e]).length,a=-1,i===t||r(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(n(i)){for(c=s;c-- >0;)if(i[c]===t||i[c].listener&&i[c].listener===t){a=c;break}if(a<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(a,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},4103:(e,t,r)=>{"use strict";var n=r(6571),i=r(3371),a=r(7691);function s(e,t,r,i){return new n(e,t,r,i)}s.version=r(6938),s.AlgoliaSearchHelper=n,s.SearchParameters=i,s.SearchResults=a,e.exports=s},6732:(e,t,r)=>{"use strict";var n=r(2733);function i(e,t){this.main=e,this.fn=t,this.lastResults=null}r(3014)(i,n),i.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},i.prototype.getModifiedState=function(e){return this.fn(e)},e.exports=i},1673:(e,t,r)=>{"use strict";var n=r(9110),i=r(317),a=r(1383),s={addRefinement:function(e,t,r){if(s.isRefined(e,t,r))return e;var i=""+r,a=e[t]?e[t].concat(i):[i],c={};return c[t]=a,n({},c,e)},removeRefinement:function(e,t,r){if(void 0===r)return s.clearRefinement(e,(function(e,r){return t===r}));var n=""+r;return s.clearRefinement(e,(function(e,r){return t===r&&n===e}))},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return s.isRefined(e,t,r)?s.removeRefinement(e,t,r):s.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return i(e)?{}:e;if("string"==typeof t)return a(e,[t]);if("function"==typeof t){var n=!1,s=Object.keys(e).reduce((function(i,a){var s=e[a]||[],c=s.filter((function(e){return!t(e,a,r)}));return c.length!==s.length&&(n=!0),i[a]=c,i}),{});return n?s:e}},isRefined:function(e,t,r){var n=Boolean(e[t])&&e[t].length>0;if(void 0===r||!n)return n;var i=""+r;return-1!==e[t].indexOf(i)}};e.exports=s},3371:(e,t,r)=>{"use strict";var n=r(9110),i=r(849),a=r(4843),s=r(4728),c=r(317),u=r(1383),o=r(7507),h=r(2208),f=r(1673);function l(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,r){return l(t[r],e)})):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach((function(e){var n=-1!==m.PARAMETERS.indexOf(e),i=void 0!==t[e];!n&&i&&(r[e]=t[e])}))}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(r){var n=e[r];if("string"==typeof n){var i=parseFloat(n);t[r]=isNaN(i)?n:i}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t]||{};r[t]={},Object.keys(n).forEach((function(e){var i=n[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));r[t][e]=i}))})),t.numericRefinements=r}return s(e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&c(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):c(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:f.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:f.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:f.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:f.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var n=o(r);if(this.isNumericRefined(e,t,n))return this;var i=s({},this.numericRefinements);return i[e]=s({},i[e]),i[e][t]?(i[e][t]=i[e][t].slice(),i[e][t].push(n)):i[e][t]=[n],this.setQueryParameters({numericRefinements:i})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){var n=r;return void 0!==n?this.isNumericRefined(e,t,n)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,i){return i===e&&r.op===t&&l(r.val,o(n))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,n){return n===e&&r.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,r){return r===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return c(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return u(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,n=Object.keys(r).reduce((function(n,i){var a=r[i],s={};return a=a||{},Object.keys(a).forEach((function(r){var n=a[r]||[],c=[];n.forEach((function(t){e({val:t,op:r},i,"numeric")||c.push(t)})),c.length!==n.length&&(t=!0),s[r]=c})),n[i]=s,n}),{});return t?n:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:f.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:f.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:f.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:f.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:f.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:f.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:f.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:f.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:f.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),i={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?i[e]=[]:i[e]=[t.slice(0,t.lastIndexOf(r))]:i[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},i,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:n({},t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&f.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return Boolean(this.numericRefinements[e]);var n=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!n)return n;var a,s,c=o(r),u=void 0!==(a=this.numericRefinements[e][t],s=c,i(a,(function(e){return l(e,s)})));return n&&u},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=a(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets()).sort()},getRefinedHierarchicalFacets:function(){var e=this;return a(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0}))).sort()},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach((function(n){var i=r[n];-1===e.indexOf(n)&&void 0!==i&&(t[n]=i)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,n=m._parseNumbers(e),i=Object.keys(this).reduce((function(e,t){return e[t]=r[t],e}),{}),a=Object.keys(n).reduce((function(e,t){var r=void 0!==e[t],i=void 0!==n[t];return r&&!i?u(e,[t]):(i&&(e[t]=n[t]),e)}),i);return new this.constructor(a)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return i(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},6673:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var n=e.hierarchicalFacets[r],o=e.hierarchicalFacetsRefinements[n.name]&&e.hierarchicalFacetsRefinements[n.name][0]||"",h=e._getHierarchicalFacetSeparator(n),f=e._getHierarchicalRootPath(n),l=e._getHierarchicalShowParentLevel(n),m=a(e._getHierarchicalFacetSortBy(n)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,n,a){return function(o,h,f){var l=o;if(f>0){var m=0;for(l=o;m<f;){var d=l&&Array.isArray(l.data)?l.data:[];l=i(d,(function(e){return e.isRefined})),m++}}if(l){var p=Object.keys(h.data).map((function(e){return[e,h.data[e]]})).filter((function(e){return function(e,t,r,n,i,a){if(i&&(0!==e.indexOf(i)||i===e))return!1;return!i&&-1===e.indexOf(n)||i&&e.split(n).length-i.split(n).length==1||-1===e.indexOf(n)&&-1===r.indexOf(n)||0===r.indexOf(e)||0===e.indexOf(t+n)&&(a||0===e.indexOf(r))}(e[0],l.path||r,a,t,r,n)}));l.data=s(p.map((function(e){var r=e[0];return function(e,t,r,n,i){var a=t.split(r);return{name:a[a.length-1].trim(),path:t,escapedValue:c(t),count:e,isRefined:n===t||0===n.indexOf(t+r),exhaustive:i,data:null}}(e[1],r,t,u(a),h.exhaustive)})),e[0],e[1])}return o}}(m,h,f,l,o),v=t;return f&&(v=t.slice(f.split(h).length)),v.reduce(p,{name:e.hierarchicalFacets[r].name,count:null,isRefined:!0,path:null,escapedValue:null,exhaustive:d,data:null})}};var n=r(2909),i=r(849),a=r(7577),s=r(8601),c=n.escapeFacetValue,u=n.unescapeFacetValue},7691:(e,t,r)=>{"use strict";var n=r(8965),i=r(9110),a=r(2909),s=r(849),c=r(3917),u=r(7577),o=r(4728),h=r(8601),f=a.escapeFacetValue,l=a.unescapeFacetValue,m=r(6673);function d(e){var t={};return e.forEach((function(e,r){t[e]=r})),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function v(e,t,r){var a=t[0];this._rawResults=t;var u=this;Object.keys(a).forEach((function(e){u[e]=a[e]}));var h=o({persistHierarchicalRootCount:!1},r);Object.keys(h).forEach((function(e){u[e]=h[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var f=e.getRefinedDisjunctiveFacets(),v=d(e.facets),g=d(e.disjunctiveFacets),y=1,R=a.facets||{};Object.keys(R).forEach((function(t){var r,n,i=R[t],o=(r=e.hierarchicalFacets,n=t,s(r,(function(e){return(e.attributes||[]).indexOf(n)>-1})));if(o){var h=o.attributes.indexOf(t),f=c(e.hierarchicalFacets,(function(e){return e.name===o.name}));u.hierarchicalFacets[f][h]={attribute:t,data:i,exhaustive:a.exhaustiveFacetsCount}}else{var l,m=-1!==e.disjunctiveFacets.indexOf(t),d=-1!==e.facets.indexOf(t);m&&(l=g[t],u.disjunctiveFacets[l]={name:t,data:i,exhaustive:a.exhaustiveFacetsCount},p(u.disjunctiveFacets[l],a.facets_stats,t)),d&&(l=v[t],u.facets[l]={name:t,data:i,exhaustive:a.exhaustiveFacetsCount},p(u.facets[l],a.facets_stats,t))}})),this.hierarchicalFacets=n(this.hierarchicalFacets),f.forEach((function(r){var n=t[y],s=n&&n.facets?n.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(s).forEach((function(t){var r,f=s[t];if(h){r=c(e.hierarchicalFacets,(function(e){return e.name===h.name}));var m=c(u.hierarchicalFacets[r],(function(e){return e.attribute===t}));if(-1===m)return;u.hierarchicalFacets[r][m].data=o({},u.hierarchicalFacets[r][m].data,f)}else{r=g[t];var d=a.facets&&a.facets[t]||{};u.disjunctiveFacets[r]={name:t,data:i({},f,d),exhaustive:n.exhaustiveFacetsCount},p(u.disjunctiveFacets[r],n.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(n){!u.disjunctiveFacets[r].data[n]&&e.disjunctiveFacetsRefinements[t].indexOf(l(n))>-1&&(u.disjunctiveFacets[r].data[n]=0)}))}})),y++})),e.getRefinedHierarchicalFacets().forEach((function(r){var n=e.getHierarchicalFacetByName(r),a=e._getHierarchicalFacetSeparator(n),s=e.getHierarchicalRefinement(r);0===s.length||s[0].split(a).length<2||t.slice(y).forEach((function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach((function(t){var o=r[t],h=c(e.hierarchicalFacets,(function(e){return e.name===n.name})),f=c(u.hierarchicalFacets[h],(function(e){return e.attribute===t}));if(-1!==f){var l={};if(s.length>0&&!u.persistHierarchicalRootCount){var m=s[0].split(a)[0];l[m]=u.hierarchicalFacets[h][f].data[m]}u.hierarchicalFacets[h][f].data=i(l,o,u.hierarchicalFacets[h][f].data)}})),y++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],n=v[t];u.facets[n]={name:t,data:R[t],exhaustive:a.exhaustiveFacetsCount},r.forEach((function(e){u.facets[n]=u.facets[n]||{name:t},u.facets[n].data=u.facets[n].data||{},u.facets[n].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=n(this.facets),this.disjunctiveFacets=n(this.disjunctiveFacets),this._state=e}function g(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var n=s(e.facets,r);return n?Object.keys(n.data).map((function(r){var i=f(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isFacetRefined(t,i),isExcluded:e._state.isExcludeRefined(t,r)}})):[]}if(e._state.isDisjunctiveFacet(t)){var i=s(e.disjunctiveFacets,r);return i?Object.keys(i.data).map((function(r){var n=f(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,n)}})):[]}if(e._state.isHierarchicalFacet(t)){var a=s(e.hierarchicalFacets,r);if(!a)return a;var c=e._state.getHierarchicalFacetByName(t),u=e._state._getHierarchicalFacetSeparator(c),o=l(e._state.getHierarchicalRefinement(t)[0]||"");0===o.indexOf(c.rootPath)&&(o=o.replace(c.rootPath+u,""));var h=o.split(u);return h.unshift(t),y(a,h,0),a}}function y(e,t,r){e.isRefined=e.name===(t[r]&&t[r].trim()),e.data&&e.data.forEach((function(e){y(e,t,r+1)}))}function R(e,t,r,n){if(n=n||0,Array.isArray(t))return e(t,r[n]);if(!t.data||0===t.data.length)return t;var a=t.data.map((function(t){return R(e,t,r,n+1)})),s=e(a,r[n]);return i({data:s},t)}function F(e,t){var r=s(e,(function(e){return e.name===t}));return r&&r.stats}function b(e,t,r,n,i){var a=s(i,(function(e){return e.name===r})),c=a&&a.data&&a.data[n]?a.data[n]:0,u=a&&a.exhaustive||!1;return{type:t,attributeName:r,name:n,count:c,exhaustive:u}}v.prototype.getFacetByName=function(e){function t(t){return t.name===e}return s(this.facets,t)||s(this.disjunctiveFacets,t)||s(this.hierarchicalFacets,t)},v.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],v.prototype.getFacetValues=function(e,t){var r=g(this,e);if(r){var n,a=i({},t,{sortBy:v.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),s=this;if(Array.isArray(r))n=[e];else n=s._state.getHierarchicalFacetByName(r.name).attributes;return R((function(e,t){if(a.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(s,t);if(r)return function(e,t){var r=[],n=[],i=(t.order||[]).reduce((function(e,t,r){return e[t]=r,e}),{});e.forEach((function(e){var t=e.path||e.name;void 0!==i[t]?r[i[t]]=e:n.push(e)})),r=r.filter((function(e){return e}));var a,s=t.sortRemainingBy;return"hidden"===s?r:(a="alpha"===s?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(h(n,a[0],a[1])))}(e,r)}if(Array.isArray(a.sortBy)){var n=u(a.sortBy,v.DEFAULT_SORT);return h(e,n[0],n[1])}if("function"==typeof a.sortBy)return function(e,t){return t.sort(e)}(a.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}),r,n)}},v.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?F(this.facets,e):this._state.isDisjunctiveFacet(e)?F(this.disjunctiveFacets,e):void 0},v.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach((function(n){e.facetsRefinements[n].forEach((function(i){r.push(b(e,"facet",n,i,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(n){e.facetsExcludes[n].forEach((function(i){r.push(b(e,"exclude",n,i,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(n){e.disjunctiveFacetsRefinements[n].forEach((function(i){r.push(b(e,"disjunctive",n,i,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(n){e.hierarchicalFacetsRefinements[n].forEach((function(i){r.push(function(e,t,r,n){var i=e.getHierarchicalFacetByName(t),a=e._getHierarchicalFacetSeparator(i),c=r.split(a),u=s(n,(function(e){return e.name===t})),o=c.reduce((function(e,t){var r=e&&s(e.data,(function(e){return e.name===t}));return void 0!==r?r:e}),u),h=o&&o.count||0,f=o&&o.exhaustive||!1,l=o&&o.path||"";return{type:"hierarchical",attributeName:t,name:l,count:h,exhaustive:f}}(e,n,i,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t];Object.keys(n).forEach((function(e){n[e].forEach((function(n){r.push({type:"numeric",attributeName:t,name:n,numericValue:n,operator:e})}))}))})),e.tagRefinements.forEach((function(e){r.push({type:"tag",attributeName:"_tags",name:e})})),r},e.exports=v},6571:(e,t,r)=>{"use strict";var n=r(2733),i=r(6732),a=r(2909).escapeFacetValue,s=r(3014),c=r(4728),u=r(317),o=r(1383),h=r(9228),f=r(3371),l=r(7691),m=r(6938);function d(e,t,r,n){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+m+")"),this.setClient(e);var i=r||{};i.index=t,this.state=f.make(i),this.lastResults=null,this._queryId=0,this._lastQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0,this._searchResultsOptions=n}function p(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function v(){return this.state.page}s(d,n),d.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},d.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},d.prototype.getQuery=function(){var e=this.state;return h._getHitsSearchParams(e)},d.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,n=h._getQueries(r.index,r),i=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(n).then((function(e){return i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),{content:new l(r,e.results),state:r,_originalResponse:e}}),(function(e){throw i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),e}));this.client.search(n).then((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(null,new l(r,e.results),r)})).catch((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(e,null,r)}))},d.prototype.findAnswers=function(e){console.warn("[algoliasearch-helper] answers is no longer supported");var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var n=r.getModifiedState(t),i=c({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:o(h._getHitsSearchParams(n),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),a="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(a);var s=this.client.initIndex(n.index);if("function"!=typeof s.findAnswers)throw new Error(a);return s.findAnswers(n.query,e.queryLanguages,i)},d.prototype.searchForFacetValues=function(e,t,r,n){var i="function"==typeof this.client.searchForFacetValues,s="function"==typeof this.client.initIndex;if(!i&&!s&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(n||{}),u=c.isDisjunctiveFacet(e),o=h.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var f,l=this;return i?f=this.client.searchForFacetValues([{indexName:c.index,params:o}]):s?f=this.client.initIndex(c.index).searchForFacetValues(o):(delete o.facetName,f=this.client.search([{type:"facet",facet:e,indexName:c.index,params:o}]).then((function(e){return e.results[0]}))),this.emit("searchForFacetValues",{state:c,facet:e,query:t}),f.then((function(t){return l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.escapedValue=a(t.value),t.isRefined=u?c.isDisjunctiveFacetRefined(e,t.escapedValue):c.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),e}))},d.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},d.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},d.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},d.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},d.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},d.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},d.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},d.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},d.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},d.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},d.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},d.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},d.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},d.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},d.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},d.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},d.prototype.setCurrentPage=p,d.prototype.setPage=p,d.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},d.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},d.prototype.setState=function(e){return this._change({state:f.make(e),isPageReset:!1}),this},d.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new f(e),this},d.prototype.hasRefinements=function(e){return!!u(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},d.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},d.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},d.prototype.hasTag=function(e){return this.state.isTagRefined(e)},d.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},d.prototype.getIndex=function(){return this.state.index},d.prototype.getCurrentPage=v,d.prototype.getPage=v,d.prototype.getTags=function(){return this.state.tagRefinements},d.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach((function(e){var n=r[e];t.push({value:n,operator:e,type:"numeric"})})),t},d.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},d.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},d.prototype._search=function(e){var t=this.state,r=[],n=[];e.onlyWithDerivedHelpers||(n=h._getQueries(t.index,t),r.push({state:t,queriesCount:n.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var i=this.derivedHelpers.map((function(e){var n=e.getModifiedState(t),i=n.index?h._getQueries(n.index,n):[];return r.push({state:n,queriesCount:i.length,helper:e}),e.emit("search",{state:n,results:e.lastResults}),i})),a=Array.prototype.concat.apply(n,i),s=this._queryId++;if(this._currentNbQueries++,!a.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,r,s));try{this.client.search(a).then(this._dispatchAlgoliaResponse.bind(this,r,s)).catch(this._dispatchAlgoliaError.bind(this,s))}catch(c){this.emit("error",{error:c})}},d.prototype._dispatchAlgoliaResponse=function(e,t,r){var n=this;if(!(t<this._lastQueryIdReceived)){this._currentNbQueries-=t-this._lastQueryIdReceived,this._lastQueryIdReceived=t,0===this._currentNbQueries&&this.emit("searchQueueEmpty");var i=r.results.slice();e.forEach((function(e){var t=e.state,r=e.queriesCount,a=e.helper,s=i.splice(0,r);t.index?(a.lastResults=new l(t,s,n._searchResultsOptions),a.emit("result",{results:a.lastResults,state:t})):a.emit("result",{results:null,state:t})}))}},d.prototype._dispatchAlgoliaError=function(e,t){e<this._lastQueryIdReceived||(this._currentNbQueries-=e-this._lastQueryIdReceived,this._lastQueryIdReceived=e,this.emit("error",{error:t}),0===this._currentNbQueries&&this.emit("searchQueueEmpty"))},d.prototype.containsRefinement=function(e,t,r,n){return e||0!==t.length||0!==r.length||0!==n.length},d.prototype._hasDisjunctiveRefinements=function(e){return this.state.disjunctiveRefinements[e]&&this.state.disjunctiveRefinements[e].length>0},d.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},d.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},d.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+m+")"),this.client=e),this},d.prototype.getClient=function(){return this.client},d.prototype.derive=function(e){var t=new i(this,e);return this.derivedHelpers.push(t),t},d.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},d.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=d},8965:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},9110:e=>{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])})),e}),{})}},2909:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},849:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r<e.length;r++)if(t(e[r]))return e[r]}},3917:e=>{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r<e.length;r++)if(t(e[r]))return r;return-1}},7577:(e,t,r)=>{"use strict";var n=r(849);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),a=n(r,(function(e){return e[0]===i[0]}));return i.length>1||!a?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(a[0]),e[1].push(a[1]),e)}),[[],[]])}},3014:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},4843:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,n){return t.indexOf(r)>-1&&e.indexOf(r)===n}))}},4728:e=>{"use strict";function t(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function r(e,n){if(e===n)return e;for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)&&"__proto__"!==i&&"constructor"!==i){var a=n[i],s=e[i];void 0!==s&&void 0===a||(t(s)&&t(a)?e[i]=r(s,a):e[i]="object"==typeof(c=a)&&null!==c?r(Array.isArray(c)?[]:{},c):c)}var c;return e}e.exports=function(e){t(e)||(e={});for(var n=1,i=arguments.length;n<i;n++){var a=arguments[n];t(a)&&r(e,a)}return e}},317:e=>{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},1383:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,n,i={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}},8601:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=void 0!==t,a=null===t;if(!a&&e>t||n&&i||!r)return 1;if(!n&&e<t||a&&r||!i)return-1}return 0}e.exports=function(e,r,n){if(!Array.isArray(e))return[];Array.isArray(n)||(n=[]);var i=e.map((function(e,t){return{criteria:r.map((function(t){return e[t]})),index:t,value:e}}));return i.sort((function(e,r){for(var i=-1;++i<e.criteria.length;){var a=t(e.criteria[i],r.criteria[i]);if(a)return i>=n.length?a:"desc"===n[i]?-a:a}return e.index-r.index})),i.map((function(e){return e.value}))}},7507:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},9228:(e,t,r)=>{"use strict";var n=r(4728);function i(e){return Object.keys(e).sort().reduce((function(t,r){return t[r]=e[r],t}),{})}var a={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:a._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(n){r.push({indexName:e,params:a._getDisjunctiveFacetSearchParams(t,n)})})),t.getRefinedHierarchicalFacets().forEach((function(n){var i=t.getHierarchicalFacetByName(n),s=t.getHierarchicalRefinement(n),c=t._getHierarchicalFacetSeparator(i);if(s.length>0&&s[0].split(c).length>1){var u=s[0].split(c).slice(0,-1).reduce((function(e,t,r){return e.concat({attribute:i.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})}),[]);u.forEach((function(n,s){var c=a._getDisjunctiveFacetSearchParams(t,n.attribute,0===s);function o(e){return i.attributes.some((function(t){return t===e.split(":")[0]}))}var h=(c.facetFilters||[]).reduce((function(e,t){if(Array.isArray(t)){var r=t.filter((function(e){return!o(e)}));r.length>0&&e.push(r)}return"string"!=typeof t||o(t)||e.push(t),e}),[]),f=u[s-1];c.facetFilters=s>0?h.concat(f.attribute+":"+f.value):h.length>0?h:void 0,r.push({indexName:e,params:c})}))}})),r},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(a._getHitsHierarchicalFacetsAttributes(e)).sort(),r=a._getFacetFilters(e),s=a._getNumericFilters(e),c=a._getTagFilters(e),u={facets:t.indexOf("*")>-1?["*"]:t,tagFilters:c};return r.length>0&&(u.facetFilters=r),s.length>0&&(u.numericFilters=s),i(n({},e.getQueryParams(),u))},_getDisjunctiveFacetSearchParams:function(e,t,r){var s=a._getFacetFilters(e,t,r),c=a._getNumericFilters(e,t),u=a._getTagFilters(e),o={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};u.length>0&&(o.tagFilters=u);var h=e.getHierarchicalFacetByName(t);return o.facets=h?a._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(o.numericFilters=c),s.length>0&&(o.facetFilters=s),i(n({},e.getQueryParams(),o))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach((function(n){var i=e.numericRefinements[n]||{};Object.keys(i).forEach((function(e){var a=i[e]||[];t!==n&&a.forEach((function(t){if(Array.isArray(t)){var i=t.map((function(t){return n+e+t}));r.push(i)}else r.push(n+e+t)}))}))})),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var n=[],i=e.facetsRefinements||{};Object.keys(i).sort().forEach((function(e){(i[e]||[]).slice().sort().forEach((function(t){n.push(e+":"+t)}))}));var a=e.facetsExcludes||{};Object.keys(a).sort().forEach((function(e){(a[e]||[]).sort().forEach((function(t){n.push(e+":-"+t)}))}));var s=e.disjunctiveFacetsRefinements||{};Object.keys(s).sort().forEach((function(e){var r=s[e]||[];if(e!==t&&r&&0!==r.length){var i=[];r.slice().sort().forEach((function(t){i.push(e+":"+t)})),n.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).sort().forEach((function(i){var a=(c[i]||[])[0];if(void 0!==a){var s,u,o=e.getHierarchicalFacetByName(i),h=e._getHierarchicalFacetSeparator(o),f=e._getHierarchicalRootPath(o);if(t===i){if(-1===a.indexOf(h)||!f&&!0===r||f&&f.split(h).length===a.split(h).length)return;f?(u=f.split(h).length-1,a=f):(u=a.split(h).length-2,a=a.slice(0,a.lastIndexOf(h))),s=o.attributes[u]}else u=a.split(h).length-1,s=o.attributes[u];s&&n.push([s+":"+a])}})),n},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,r){var n=e.getHierarchicalRefinement(r.name)[0];if(!n)return t.push(r.attributes[0]),t;var i=e._getHierarchicalFacetSeparator(r),a=n.split(i).length,s=r.attributes.slice(0,a+1);return t.concat(s)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var n=e._getHierarchicalFacetSeparator(t);if(!0===r){var i=e._getHierarchicalRootPath(t),a=0;return i&&(a=i.split(n).length),[t.attributes[a]]}var s=(e.getHierarchicalRefinement(t.name)[0]||"").split(n).length-1;return t.attributes.slice(0,s+1)},getSearchForFacetQuery:function(e,t,r,s){var c=s.isDisjunctiveFacet(e)?s.clearRefinements(e):s,u={facetQuery:t,facetName:e};return"number"==typeof r&&(u.maxFacetHits=r),i(n({},a._getHitsSearchParams(c),u))}};e.exports=a},2208:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},6938:e=>{"use strict";e.exports="3.16.3"},3643:function(e){e.exports=function(){"use strict";function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(r){for(var n=1;n<arguments.length;n++){var i=null!=arguments[n]?arguments[n]:{};n%2?t(Object(i),!0).forEach((function(t){e(r,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(i)):t(Object(i)).forEach((function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(i,e))}))}return r}function n(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var r=[],n=!0,i=!1,a=void 0;try{for(var s,c=e[Symbol.iterator]();!(n=(s=c.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(e){i=!0,a=e}finally{try{n||null==c.return||c.return()}finally{if(i)throw a}}return r}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function a(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t<e.length;t++)r[t]=e[t];return r}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}function s(e){var t,r="algoliasearch-client-js-".concat(e.key),n=function(){return void 0===t&&(t=e.localStorage||window.localStorage),t},a=function(){return JSON.parse(n().getItem(r)||"{}")},s=function(e){n().setItem(r,JSON.stringify(e))},c=function(){var t=e.timeToLive?1e3*e.timeToLive:null,r=a(),n=Object.fromEntries(Object.entries(r).filter((function(e){return void 0!==i(e,2)[1].timestamp})));if(s(n),t){var c=Object.fromEntries(Object.entries(n).filter((function(e){var r=i(e,2)[1],n=(new Date).getTime();return!(r.timestamp+t<n)})));s(c)}};return{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){c();var t=JSON.stringify(e);return a()[t]})).then((function(e){return Promise.all([e?e.value:t(),void 0!==e])})).then((function(e){var t=i(e,2),n=t[0],a=t[1];return Promise.all([n,a||r.miss(n)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=a();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},n().setItem(r,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=a();delete t[JSON.stringify(e)],n().setItem(r,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){n().removeItem(r)}))}}}function c(e){var t=a(e.caches),r=t.shift();return void 0===r?{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,r.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return r.get(e,n,i).catch((function(){return c({caches:t}).get(e,n,i)}))},set:function(e,n){return r.set(e,n).catch((function(){return c({caches:t}).set(e,n)}))},delete:function(e){return r.delete(e).catch((function(){return c({caches:t}).delete(e)}))},clear:function(){return r.clear().catch((function(){return c({caches:t}).clear()}))}}}function u(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(r,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},a=JSON.stringify(r);if(a in t)return Promise.resolve(e.serializable?JSON.parse(t[a]):t[a]);var s=n(),c=i&&i.miss||function(){return Promise.resolve()};return s.then((function(e){return c(e)})).then((function(){return s}))},set:function(r,n){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function o(e){for(var t=e.length-1;t>0;t--){var r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function h(e,t){return t?(Object.keys(t).forEach((function(r){e[r]=t[r](e)})),e):e}function f(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];var i=0;return e.replace(/%s/g,(function(){return encodeURIComponent(r[i++])}))}var l={WithinQueryParameters:0,WithinHeaders:1};function m(e,t){var r=e||{},n=r.data||{};return Object.keys(r).forEach((function(e){-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(n[e]=r[e])})),{data:Object.entries(n).length>0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var d={Read:1,Write:2,Any:3},p=1,v=2,g=3;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;return r(r({},e),{},{status:t,lastUpdate:Date.now()})}function R(e){return"string"==typeof e?{protocol:"https",url:e,accept:d.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||d.Any}}var F="GET",b="POST";function P(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(y(t))}))}))).then((function(e){var r=e.filter((function(e){return function(e){return e.status===p||Date.now()-e.lastUpdate>12e4}(e)})),n=e.filter((function(e){return function(e){return e.status===g&&Date.now()-e.lastUpdate<=12e4}(e)})),i=[].concat(a(r),a(n));return{getTimeout:function(e,t){return(0===n.length&&0===e?1:n.length+3+e)*t},statelessHosts:i.length>0?i.map((function(e){return R(e)})):t}}))}function _(e,t,n,i){var s=[],c=function(e,t){if(e.method!==F&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:r(r({},e.data),t.data);return JSON.stringify(n)}}(n,i),u=function(e,t){var n=r(r({},e.headers),t.headers),i={};return Object.keys(n).forEach((function(e){var t=n[e];i[e.toLowerCase()]=t})),i}(e,i),o=n.method,h=n.method!==F?{}:r(r({},n.data),i.data),f=r(r(r({"x-algolia-agent":e.userAgent.value},e.queryParameters),h),i.queryParameters),l=0,m=function t(r,a){var h=r.pop();if(void 0===h)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:O(s)};var m={data:c,headers:u,method:o,url:E(h,n.path,f),connectTimeout:a(l,e.timeouts.connect),responseTimeout:a(l,i.timeout)},d=function(e){var t={request:m,response:e,host:h,triesLeft:r.length};return s.push(t),t},p={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var i=d(n);return n.isTimedOut&&l++,Promise.all([e.logger.info("Retryable failure",w(i)),e.hostsCache.set(h,y(h,n.isTimedOut?g:v))]).then((function(){return t(r,a)}))},onFail:function(e){throw d(e),function(e,t){var r=e.content,n=e.status,i=r;try{i=JSON.parse(r).message}catch(e){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(i,n,t)}(e,O(s))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,r=e.status;return!t&&!~~r}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,p)}))};return P(e.hostsCache,t).then((function(e){return m(a(e.statelessHosts).reverse(),e.getTimeout)}))}function j(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var r="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(r)&&(t.value="".concat(t.value).concat(r)),t}};return t}function E(e,t,r){var n=x(r),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return n.length&&(i+="?".concat(n)),i}function x(e){return Object.keys(e).map((function(t){return f("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function O(e){return e.map((function(e){return w(e)}))}function w(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return r(r({},e),{},{request:r(r({},e.request),{},{headers:r(r({},e.request.headers),t)})})}var A=function(e){var t=e.appId,n=function(e,t,r){var n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:function(){return e===l.WithinHeaders?n:{}},queryParameters:function(){return e===l.WithinQueryParameters?n:{}}}}(void 0!==e.authMode?e.authMode:l.WithinHeaders,t,e.apiKey),a=function(e){var t=e.hostsCache,r=e.logger,n=e.requester,a=e.requestsCache,s=e.responsesCache,c=e.timeouts,u=e.userAgent,o=e.hosts,h=e.queryParameters,f={hostsCache:t,logger:r,requester:n,requestsCache:a,responsesCache:s,timeouts:c,userAgent:u,headers:e.headers,queryParameters:h,hosts:o.map((function(e){return R(e)})),read:function(e,t){var r=m(t,f.timeouts.read),n=function(){return _(f,f.hosts.filter((function(e){return!!(e.accept&d.Read)})),e,r)};if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();var a={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(a,(function(){return f.requestsCache.get(a,(function(){return f.requestsCache.set(a,n()).then((function(e){return Promise.all([f.requestsCache.delete(a),e])}),(function(e){return Promise.all([f.requestsCache.delete(a),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(a,e)}})},write:function(e,t){return _(f,f.hosts.filter((function(e){return!!(e.accept&d.Write)})),e,m(t,f.timeouts.write))}};return f}(r(r({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:d.Read},{url:"".concat(t,".algolia.net"),accept:d.Write}].concat(o([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:r(r(r({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:r(r({},n.queryParameters()),e.queryParameters)}));return h({transporter:a,appId:t,addAlgoliaAgent:function(e,t){a.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([a.requestsCache.clear(),a.responsesCache.clear()]).then((function(){}))}},e.methods)},N=function(e){return function(t,r){return t.method===F?e.transporter.read(t,r):e.transporter.write(t,r)}},H=function(e){return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h({transporter:e.transporter,appId:e.appId,indexName:t},r.methods)}},S=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{params:x(e.params||{})})}));return e.transporter.read({method:b,path:"1/indexes/*/queries",data:{requests:i},cacheable:!0},n)}},T=function(e){return function(t,i){return Promise.all(t.map((function(t){var a=t.params,s=a.facetName,c=a.facetQuery,u=n(a,["facetName","facetQuery"]);return H(e)(t.indexName,{methods:{searchForFacetValues:k}}).searchForFacetValues(s,c,r(r({},i),u))})))}},Q=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n)}},C=function(e){return function(t,r){return e.transporter.read({method:b,path:f("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r)}},k=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n)}},D=1,I=2,q=3;function V(e,t,n){var i,a={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return r.setRequestHeader(t,e.headers[t])}));var n,i=function(e,n){return setTimeout((function(){r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e)},a=i(e.connectTimeout,"Connection timeout");r.onreadystatechange=function(){r.readyState>r.OPENED&&void 0===n&&(clearTimeout(a),n=i(e.responseTimeout,"Socket timeout"))},r.onerror=function(){0===r.status&&(clearTimeout(a),clearTimeout(n),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=function(){clearTimeout(a),clearTimeout(n),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},logger:(i=q,{debug:function(e,t){return D>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return I>=i&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:u(),requestsCache:u({serializable:!1}),hostsCache:c({caches:[s({key:"".concat("4.22.1","-").concat(e)}),u()]}),userAgent:j("4.22.1").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return A(r(r(r({},a),n),{},{methods:{search:S,searchForFacetValues:T,multipleQueries:S,multipleSearchForFacetValues:T,customRequest:N,initIndex:function(e){return function(t){return H(e)(t,{methods:{search:C,searchForFacetValues:k,findAnswers:Q}})}}}}))}return V.version="4.22.1",V}()},9057:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>N});var n=r(6540),i=r(53),a=r(4103),s=r.n(a),c=r(3643),u=r.n(c),o=r(8193),h=r(5260),f=r(5489),l=r(4070),m=r(4586);const d=["zero","one","two","few","many","other"];function p(e){return d.filter((t=>e.includes(t)))}const v={locale:"en",pluralForms:p(["one","other"]),select:e=>1===e?"one":"other"};function g(){const{i18n:{currentLocale:e}}=(0,m.A)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:p(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`),v}}),[e])}function y(){const e=g();return{selectMessage:(t,r)=>function(e,t,r){const n=e.split("|");if(1===n.length)return n[0];n.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 ${n.length}: ${e}`);const i=r.select(t),a=r.pluralForms.indexOf(i);return n[Math.min(a,n.length-1)]}(r,t,e)}}var R=r(4255),F=r(9532),b=r(9024),P=r(481),_=r(1312),j=r(8126),E=r(1062),x=r(8511);const O={searchQueryInput:"searchQueryInput_u2C7",searchVersionInput:"searchVersionInput_m0Ui",searchResultsColumn:"searchResultsColumn_JPFH",algoliaLogo:"algoliaLogo_rT1R",algoliaLogoPathFill:"algoliaLogoPathFill_WdUC",searchResultItem:"searchResultItem_Tv2o",searchResultItemHeading:"searchResultItemHeading_KbCB",searchResultItemPath:"searchResultItemPath_lhe1",searchResultItemSummary:"searchResultItemSummary_AEaO",searchQueryColumn:"searchQueryColumn_RTkw",searchVersionColumn:"searchVersionColumn_ypXd",searchLogoColumn:"searchLogoColumn_rJIA",loadingSpinner:"loadingSpinner_XVxU","loading-spin":"loading-spin_vzvp",loader:"loader_vvXV"};function w(e){let{docsSearchVersionsHelpers:t}=e;const r=Object.entries(t.allDocsData).filter((e=>{let[,t]=e;return t.versions.length>1}));return n.createElement("div",{className:(0,i.A)("col","col--3","padding-left--none",O.searchVersionColumn)},r.map((e=>{let[i,a]=e;const s=r.length>1?`${i}: `:"";return n.createElement("select",{key:i,onChange:e=>t.setSearchVersion(i,e.target.value),defaultValue:t.searchVersions[i],className:O.searchVersionInput},a.versions.map(((e,t)=>n.createElement("option",{key:t,label:`${s}${e.label}`,value:e.name}))))})))}function A(){const{i18n:{currentLocale:e}}=(0,m.A)(),{algolia:{appId:t,apiKey:r,indexName:a}}=(0,j.c)(),c=(0,E.C)(),d=function(){const{selectMessage:e}=y();return t=>e(t,(0,_.T)({id:"theme.SearchPage.documentsFound.plurals",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)',message:"One document found|{count} documents found"},{count:t}))}(),p=function(){const e=(0,l.Gy)(),[t,r]=(0,n.useState)((()=>Object.entries(e).reduce(((e,t)=>{let[r,n]=t;return{...e,[r]:n.versions[0].name}}),{}))),i=Object.values(e).some((e=>e.versions.length>1));return{allDocsData:e,versioningEnabled:i,searchVersions:t,setSearchVersion:(e,t)=>r((r=>({...r,[e]:t})))}}(),[v,g]=(0,R.b)(),b={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},[A,N]=(0,n.useReducer)(((e,t)=>{switch(t.type){case"reset":return b;case"loading":return{...e,loading:!0};case"update":return v!==t.value.query?e:{...t.value,items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)};case"advance":{const t=e.totalPages>e.lastPage+1;return{...e,lastPage:t?e.lastPage+1:e.lastPage,hasMore:t}}default:return e}}),b),H=u()(t,r),S=s()(H,a,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:["language","docusaurus_tag"]});S.on("result",(e=>{let{results:{query:t,hits:r,page:n,nbHits:i,nbPages:a}}=e;if(""===t||!Array.isArray(r))return void N({type:"reset"});const s=e=>e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match"),u=r.map((e=>{let{url:t,_highlightResult:{hierarchy:r},_snippetResult:n={}}=e;const i=Object.keys(r).map((e=>s(r[e].value)));return{title:i.pop(),url:c(t),summary:n.content?`${s(n.content.value)}...`:"",breadcrumbs:i}}));N({type:"update",value:{items:u,query:t,totalResults:i,totalPages:a,lastPage:n,hasMore:a>n+1,loading:!1}})}));const[T,Q]=(0,n.useState)(null),C=(0,n.useRef)(0),k=(0,n.useRef)(o.A.canUseIntersectionObserver&&new IntersectionObserver((e=>{const{isIntersecting:t,boundingClientRect:{y:r}}=e[0];t&&C.current>r&&N({type:"advance"}),C.current=r}),{threshold:1})),D=()=>v?(0,_.T)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:v}):(0,_.T)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"}),I=(0,F._q)((function(t){void 0===t&&(t=0),S.addDisjunctiveFacetRefinement("docusaurus_tag","default"),S.addDisjunctiveFacetRefinement("language",e),Object.entries(p.searchVersions).forEach((e=>{let[t,r]=e;S.addDisjunctiveFacetRefinement("docusaurus_tag",`docs-${t}-${r}`)})),S.setQuery(v).setPage(t).search()}));return(0,n.useEffect)((()=>{if(!T)return;const e=k.current;return e?(e.observe(T),()=>e.unobserve(T)):()=>!0}),[T]),(0,n.useEffect)((()=>{N({type:"reset"}),v&&(N({type:"loading"}),setTimeout((()=>{I()}),300))}),[v,p.searchVersions,I]),(0,n.useEffect)((()=>{A.lastPage&&0!==A.lastPage&&I(A.lastPage)}),[I,A.lastPage]),n.createElement(x.A,null,n.createElement(h.A,null,n.createElement("title",null,(0,P.s)(D())),n.createElement("meta",{property:"robots",content:"noindex, follow"})),n.createElement("div",{className:"container margin-vert--lg"},n.createElement("h1",null,D()),n.createElement("form",{className:"row",onSubmit:e=>e.preventDefault()},n.createElement("div",{className:(0,i.A)("col",O.searchQueryColumn,{"col--9":p.versioningEnabled,"col--12":!p.versioningEnabled})},n.createElement("input",{type:"search",name:"q",className:O.searchQueryInput,placeholder:(0,_.T)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,_.T)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:e=>g(e.target.value),value:v,autoComplete:"off",autoFocus:!0})),p.versioningEnabled&&n.createElement(w,{docsSearchVersionsHelpers:p})),n.createElement("div",{className:"row"},n.createElement("div",{className:(0,i.A)("col","col--8",O.searchResultsColumn)},!!A.totalResults&&d(A.totalResults)),n.createElement("div",{className:(0,i.A)("col","col--4","text--right",O.searchLogoColumn)},n.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:"https://www.algolia.com/","aria-label":(0,_.T)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"})},n.createElement("svg",{viewBox:"0 0 168 24",className:O.algoliaLogo},n.createElement("g",{fill:"none"},n.createElement("path",{className:O.algoliaLogoPathFill,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),n.createElement("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),n.createElement("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})))))),A.items.length>0?n.createElement("main",null,A.items.map(((e,t)=>{let{title:r,url:a,summary:s,breadcrumbs:c}=e;return n.createElement("article",{key:t,className:O.searchResultItem},n.createElement("h2",{className:O.searchResultItemHeading},n.createElement(f.A,{to:a,dangerouslySetInnerHTML:{__html:r}})),c.length>0&&n.createElement("nav",{"aria-label":"breadcrumbs"},n.createElement("ul",{className:(0,i.A)("breadcrumbs",O.searchResultItemPath)},c.map(((e,t)=>n.createElement("li",{key:t,className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}}))))),s&&n.createElement("p",{className:O.searchResultItemSummary,dangerouslySetInnerHTML:{__html:s}}))}))):[v&&!A.loading&&n.createElement("p",{key:"no-results"},n.createElement(_.A,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result"},"No results were found")),!!A.loading&&n.createElement("div",{key:"spinner",className:O.loadingSpinner})],A.hasMore&&n.createElement("div",{className:O.loader,ref:Q},n.createElement(_.A,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results"},"Fetching new results..."))))}function N(){return n.createElement(b.e3,{className:"search-page-wrapper"},n.createElement(A,null))}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.08548001.js.LICENSE.txt b/assets/js/1a4e3797.08548001.js.LICENSE.txt new file mode 100644 index 00000000000..9caab8b19c2 --- /dev/null +++ b/assets/js/1a4e3797.08548001.js.LICENSE.txt @@ -0,0 +1 @@ +/*! algoliasearch-lite.umd.js | 4.22.1 | © Algolia, inc. | https://github.com/algolia/algoliasearch-client-javascript */ diff --git a/assets/js/1be78505.78a5a7fc.js b/assets/js/1be78505.78a5a7fc.js new file mode 100644 index 00000000000..85c9090a780 --- /dev/null +++ b/assets/js/1be78505.78a5a7fc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[8714,1774],{10:(e,t,n)=>{n.r(t),n.d(t,{default:()=>ge});var a=n(6540),o=n(53),l=n(9024),r=n(7559),c=n(2967),i=n(1754),s=n(2252),d=n(6588),m=n(8511),u=n(1312),b=n(3104),p=n(5062);const h={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};function E(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),l=(0,a.useRef)(!1),{startScroll:r,cancelScroll:c}=(0,b.gk)();return(0,b.Mq)(((e,n)=>{let{scrollY:a}=e;const r=n?.scrollY;r&&(l.current?l.current=!1:a>=r?(c(),o(!1)):a<t?o(!1):a+window.innerHeight<document.documentElement.scrollHeight&&o(!0))})),(0,p.$)((e=>{e.location.hash&&(l.current=!0,o(!1))})),{shown:n,scrollToTop:()=>r(0)}}({threshold:300});return a.createElement("button",{"aria-label":(0,u.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",r.G.common.backToTopButton,h.backToTopButton,e&&h.backToTopButtonShow),type:"button",onClick:t})}var f=n(3109),g=n(6347),v=n(4581),_=n(6342),A=n(3465),C=n(8168);function k(e){return a.createElement("svg",(0,C.A)({width:"20",height:"20","aria-hidden":"true"},e),a.createElement("g",{fill:"#7a7a7a"},a.createElement("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"}),a.createElement("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 S={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function N(e){let{onClick:t}=e;return a.createElement("button",{type:"button",title:(0,u.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,u.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",S.collapseSidebarButton),onClick:t},a.createElement(k,{className:S.collapseSidebarButtonIcon}))}var T=n(5041),I=n(9532);const x=Symbol("EmptyContext"),B=a.createContext(x);function w(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),l=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return a.createElement(B.Provider,{value:l},t)}var y=n(1422),L=n(9169),M=n(5489),H=n(2303);function P(e){let{categoryLabel:t,onClick:n}=e;return a.createElement("button",{"aria-label":(0,u.T)({id:"theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel",message:"Toggle the collapsible sidebar category '{label}'",description:"The ARIA label to toggle the collapsible sidebar category"},{label:t}),type:"button",className:"clean-btn menu__caret",onClick:n})}function G(e){let{item:t,onItemClick:n,activePath:l,level:c,index:s,...d}=e;const{items:m,label:u,collapsible:b,className:p,href:h}=t,{docs:{sidebar:{autoCollapseCategories:E}}}=(0,_.p)(),f=function(e){const t=(0,H.A)();return(0,a.useMemo)((()=>e.href?e.href:!t&&e.collapsible?(0,i._o)(e):void 0),[e,t])}(t),g=(0,i.w8)(t,l),v=(0,L.ys)(h,l),{collapsed:A,setCollapsed:k}=(0,y.u)({initialState:()=>!!b&&(!g&&t.collapsed)}),{expandedItem:S,setExpandedItem:N}=function(){const e=(0,a.useContext)(B);if(e===x)throw new I.dV("DocSidebarItemsExpandedStateProvider");return e}(),T=function(e){void 0===e&&(e=!A),N(e?null:s),k(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const l=(0,I.ZC)(t);(0,a.useEffect)((()=>{t&&!l&&n&&o(!1)}),[t,l,n,o])}({isActive:g,collapsed:A,updateCollapsed:T}),(0,a.useEffect)((()=>{b&&null!=S&&S!==s&&E&&k(!0)}),[b,S,s,k,E]),a.createElement("li",{className:(0,o.A)(r.G.docs.docSidebarItemCategory,r.G.docs.docSidebarItemCategoryLevel(c),"menu__list-item",{"menu__list-item--collapsed":A},p)},a.createElement("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":v})},a.createElement(M.A,(0,C.A)({className:(0,o.A)("menu__link",{"menu__link--sublist":b,"menu__link--sublist-caret":!h&&b,"menu__link--active":g}),onClick:b?e=>{n?.(t),h?T(!1):(e.preventDefault(),T())}:()=>{n?.(t)},"aria-current":v?"page":void 0,"aria-expanded":b?!A:void 0,href:b?f??"#":f},d),u),h&&b&&a.createElement(P,{categoryLabel:u,onClick:e=>{e.preventDefault(),T()}})),a.createElement(y.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:A},a.createElement(K,{items:m,tabIndex:A?-1:0,onItemClick:n,activePath:l,level:c+1})))}var F=n(6654),W=n(3186);const D={menuExternalLink:"menuExternalLink_NmtK"};function V(e){let{item:t,onItemClick:n,activePath:l,level:c,index:s,...d}=e;const{href:m,label:u,className:b,autoAddBaseUrl:p}=t,h=(0,i.w8)(t,l),E=(0,F.A)(m);return a.createElement("li",{className:(0,o.A)(r.G.docs.docSidebarItemLink,r.G.docs.docSidebarItemLinkLevel(c),"menu__list-item",b),key:u},a.createElement(M.A,(0,C.A)({className:(0,o.A)("menu__link",!E&&D.menuExternalLink,{"menu__link--active":h}),autoAddBaseUrl:p,"aria-current":h?"page":void 0,to:m},E&&{onClick:n?()=>n(t):void 0},d),u,!E&&a.createElement(W.A,null)))}const U={menuHtmlItem:"menuHtmlItem_M9Kj"};function z(e){let{item:t,level:n,index:l}=e;const{value:c,defaultStyle:i,className:s}=t;return a.createElement("li",{className:(0,o.A)(r.G.docs.docSidebarItemLink,r.G.docs.docSidebarItemLinkLevel(n),i&&[U.menuHtmlItem,"menu__list-item"],s),key:l,dangerouslySetInnerHTML:{__html:c}})}function R(e){let{item:t,...n}=e;switch(t.type){case"category":return a.createElement(G,(0,C.A)({item:t},n));case"html":return a.createElement(z,(0,C.A)({item:t},n));default:return a.createElement(V,(0,C.A)({item:t},n))}}function j(e){let{items:t,...n}=e;return a.createElement(w,null,t.map(((e,t)=>a.createElement(R,(0,C.A)({key:t,item:e,index:t},n)))))}const K=(0,a.memo)(j),q={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function O(e){let{path:t,sidebar:n,className:l}=e;const c=function(){const{isActive:e}=(0,T.Mj)(),[t,n]=(0,a.useState)(e);return(0,b.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return a.createElement("nav",{"aria-label":(0,u.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",q.menu,c&&q.menuWithAnnouncementBar,l)},a.createElement("ul",{className:(0,o.A)(r.G.docs.docSidebarMenu,"menu__list")},a.createElement(K,{items:n,activePath:t,level:1})))}const X="sidebar_njMd",Y="sidebarWithHideableNavbar_wUlq",Z="sidebarHidden_VK0M",$="sidebarLogo_isFc";function J(e){let{path:t,sidebar:n,onCollapse:l,isHidden:r}=e;const{navbar:{hideOnScroll:c},docs:{sidebar:{hideable:i}}}=(0,_.p)();return a.createElement("div",{className:(0,o.A)(X,c&&Y,r&&Z)},c&&a.createElement(A.A,{tabIndex:-1,className:$}),a.createElement(O,{path:t,sidebar:n}),i&&a.createElement(N,{onClick:l}))}const Q=a.memo(J);var ee=n(5600),te=n(2069);const ne=e=>{let{sidebar:t,path:n}=e;const l=(0,te.M)();return a.createElement("ul",{className:(0,o.A)(r.G.docs.docSidebarMenu,"menu__list")},a.createElement(K,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&l.toggle(),"link"===e.type&&l.toggle()},level:1}))};function ae(e){return a.createElement(ee.GX,{component:ne,props:e})}const oe=a.memo(ae);function le(e){const t=(0,v.l)(),n="desktop"===t||"ssr"===t,o="mobile"===t;return a.createElement(a.Fragment,null,n&&a.createElement(Q,e),o&&a.createElement(oe,e))}const re={expandButton:"expandButton_m80_",expandButtonIcon:"expandButtonIcon_BlDH"};function ce(e){let{toggleSidebar:t}=e;return a.createElement("div",{className:re.expandButton,title:(0,u.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,u.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},a.createElement(k,{className:re.expandButtonIcon}))}const ie={docSidebarContainer:"docSidebarContainer_b6E3",docSidebarContainerHidden:"docSidebarContainerHidden_b3ry",sidebarViewport:"sidebarViewport_Xe31"};function se(e){let{children:t}=e;const n=(0,d.t)();return a.createElement(a.Fragment,{key:n?.name??"noSidebar"},t)}function de(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:l}=e;const{pathname:c}=(0,g.zy)(),[i,s]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{i&&s(!1),!i&&(0,f.O)()&&s(!0),l((e=>!e))}),[l,i]);return a.createElement("aside",{className:(0,o.A)(r.G.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&s(!0)}},a.createElement(se,null,a.createElement("div",{className:(0,o.A)(ie.sidebarViewport,i&&ie.sidebarViewportHidden)},a.createElement(le,{sidebar:t,path:c,onCollapse:d,isHidden:i}),i&&a.createElement(ce,{toggleSidebar:d}))))}const me={docMainContainer:"docMainContainer_gTbr",docMainContainerEnhanced:"docMainContainerEnhanced_Uz_u",docItemWrapperEnhanced:"docItemWrapperEnhanced_czyv"};function ue(e){let{hiddenSidebarContainer:t,children:n}=e;const l=(0,d.t)();return a.createElement("main",{className:(0,o.A)(me.docMainContainer,(t||!l)&&me.docMainContainerEnhanced)},a.createElement("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",me.docItemWrapper,t&&me.docItemWrapperEnhanced)},n))}const be={docPage:"docPage__5DB",docsWrapper:"docsWrapper_BCFX","themedComponent--light":"themedComponent--light_NU7w"};function pe(e){let{children:t}=e;const n=(0,d.t)(),[o,l]=(0,a.useState)(!1);return a.createElement(m.A,{wrapperClassName:be.docsWrapper},a.createElement(E,null),a.createElement("div",{className:be.docPage},n&&a.createElement(de,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:l}),a.createElement(ue,{hiddenSidebarContainer:o},t)))}var he=n(1774),Ee=n(1463);function fe(e){const{versionMetadata:t}=e;return a.createElement(a.Fragment,null,a.createElement(Ee.A,{version:t.version,tag:(0,c.tU)(t.pluginId,t.version)}),a.createElement(l.be,null,t.noIndex&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"})))}function ge(e){const{versionMetadata:t}=e,n=(0,i.mz)(e);if(!n)return a.createElement(he.default,null);const{docElement:c,sidebarName:m,sidebarItems:u}=n;return a.createElement(a.Fragment,null,a.createElement(fe,e),a.createElement(l.e3,{className:(0,o.A)(r.G.wrapper.docsPages,r.G.page.docsDocPage,e.versionMetadata.className)},a.createElement(s.n,{version:t},a.createElement(d.V,{name:m,items:u},a.createElement(pe,null,c)))))}},1774:(e,t,n)=>{n.r(t),n.d(t,{default:()=>c});var a=n(6540),o=n(1312),l=n(9024),r=n(8511);function c(){return a.createElement(a.Fragment,null,a.createElement(l.be,{title:(0,o.T)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.A,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}},2252:(e,t,n)=>{n.d(t,{n:()=>r,r:()=>c});var a=n(6540),o=n(9532);const l=a.createContext(null);function r(e){let{children:t,version:n}=e;return a.createElement(l.Provider,{value:n},t)}function c(){const e=(0,a.useContext)(l);if(null===e)throw new o.dV("DocsVersionProvider");return e}}}]); \ No newline at end of file diff --git a/assets/js/1ca1b9c8.c508c078.js b/assets/js/1ca1b9c8.c508c078.js new file mode 100644 index 00000000000..a1b6a217bf5 --- /dev/null +++ b/assets/js/1ca1b9c8.c508c078.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[3819],{1966:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/2222b3a9.4211f90b.js b/assets/js/2222b3a9.4211f90b.js new file mode 100644 index 00000000000..f20c17988e1 --- /dev/null +++ b/assets/js/2222b3a9.4211f90b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[1424],{5680:(e,t,r)=>{r.d(t,{xA:()=>d,yg:()=>b});var a=r(6540);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},i=Object.keys(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),c=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},d=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),u=c(r),m=n,b=u["".concat(s,".").concat(m)]||u[m]||p[m]||i;return r?a.createElement(b,l(l({ref:t},d),{},{components:r})):a.createElement(b,l({ref:t},d))}));function b(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,l=new Array(i);l[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[u]="string"==typeof e?e:n,l[1]=o;for(var c=2;c<i;c++)l[c]=r[c];return a.createElement.apply(null,l)}return a.createElement.apply(null,r)}m.displayName="MDXCreateElement"},4198:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var a=r(8168),n=(r(6540),r(5680));const i={title:"Building Gaia Deterministically",order:5},l=void 0,o={unversionedId:"resources/reproducible-builds",id:"resources/reproducible-builds",title:"Building Gaia Deterministically",description:"The Tendermint rbuilder Docker image provides a deterministic build environment that is used to build Cosmos SDK applications. It provides a way to be reasonably sure that the executables are really built from the git source. It also makes sure that the same, tested dependencies are used and statically built into the executable.",source:"@site/docs/resources/reproducible-builds.md",sourceDirName:"resources",slug:"/resources/reproducible-builds",permalink:"/main/resources/reproducible-builds",draft:!1,tags:[],version:"current",frontMatter:{title:"Building Gaia Deterministically",order:5},sidebar:"tutorialSidebar",previous:{title:"Ledger Nano Support",permalink:"/main/resources/ledger"},next:{title:"Service Providers",permalink:"/main/resources/service-providers"}},s={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Build",id:"build",level:2}],d={toc:c},u="wrapper";function p(e){let{components:t,...r}=e;return(0,n.yg)(u,(0,a.A)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("p",null,"The ",(0,n.yg)("a",{parentName:"p",href:"https://github.com/tendermint/images/tree/master/rbuilder"},"Tendermint rbuilder Docker image")," provides a deterministic build environment that is used to build Cosmos SDK applications. It provides a way to be reasonably sure that the executables are really built from the git source. It also makes sure that the same, tested dependencies are used and statically built into the executable."),(0,n.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,n.yg)("p",null,"Make sure you have ",(0,n.yg)("a",{parentName:"p",href:"https://docs.docker.com/get-docker/"},"Docker installed on your system"),"."),(0,n.yg)("p",null,"All the following instructions have been tested on ",(0,n.yg)("em",{parentName:"p"},"Ubuntu 18.04.2 LTS")," with ",(0,n.yg)("em",{parentName:"p"},"docker 20.10.2"),"."),(0,n.yg)("h2",{id:"build"},"Build"),(0,n.yg)("p",null,"Clone ",(0,n.yg)("inlineCode",{parentName:"p"},"gaia"),":"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-sh"},"git clone https://github.com/cosmos/gaia.git\n")),(0,n.yg)("p",null,"Checkout the commit, branch, or release tag you want to build:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-sh"},"cd gaia/\ngit checkout v4.2.1\n")),(0,n.yg)("p",null,"The buildsystem supports and produces binaries for the following architectures:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("strong",{parentName:"li"},"darwin/amd64")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("strong",{parentName:"li"},"linux/amd64")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("strong",{parentName:"li"},"linux/arm64")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("strong",{parentName:"li"},"windows/amd64"))),(0,n.yg)("p",null,"Run the following command to launch a build for all supported architectures:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-sh"},"make distclean build-reproducible\n")),(0,n.yg)("p",null,"The build system generates both the binaries and deterministic build report in the ",(0,n.yg)("inlineCode",{parentName:"p"},"artifacts")," directory.\nThe ",(0,n.yg)("inlineCode",{parentName:"p"},"artifacts/build_report")," file contains the list of the build artifacts and their respective checksums, and can be used to verify\nbuild sanity. An example of its contents follows:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-sh"},"App: gaiad\nVersion: v4.2.1\nCommit: dbd8a6fb522c571debf958837f9113c56d418f6b\nFiles:\n 29d219b0b120b3188bd7cd7249fc96b9 gaiad-v4.2.1-darwin-amd64\n 80338d9f0e55ea8f6c93f2ec7d4e18d6 gaiad-v4.2.1-linux-amd64\n 9bc77a512acca673ca1769ae67b4d6c7 gaiad-v4.2.1-linux-arm64\n c84387860f52178e2bffee08897564bb gaiad-v4.2.1-windows-amd64.exe\n c25cca8ccceec06a6fabae90f671fab1 gaiad-v4.2.1.tar.gz\nChecksums-Sha256:\n 05e5b9064bac4e71f0162c4c3c3bff55def22ca016d34205a5520fef89fd2776 gaiad-v4.2.1-darwin-amd64\n ccda422cbda29c723aaf27653bcf0f6412e138eec33fba2b49de131f9ffbe2d2 gaiad-v4.2.1-linux-amd64\n 95f89e8213cb758d12e1b0b631285938de822d04d2e25f399e99c0b798173cfd gaiad-v4.2.1-linux-arm64\n 7ef98f0041f1573f0a8601abad4a14b1c163f47481c7ba1954fd81ed423a6408 gaiad-v4.2.1-windows-amd64.exe\n 422883ba43c96a6ea5ef9512d39321dd1356633c6a9505517b9c651788df4a7f gaiad-v4.2.1.tar.gz\n")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/25a82047.7d108c6b.js b/assets/js/25a82047.7d108c6b.js new file mode 100644 index 00000000000..6814be6b5f9 --- /dev/null +++ b/assets/js/25a82047.7d108c6b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[5098],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>h});var r=n(6540);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 o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),g=a,h=p["".concat(s,".").concat(g)]||p[g]||d[g]||o;return n?r.createElement(h,l(l({ref:t},u),{},{components:n})):r.createElement(h,l({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var c=2;c<o;c++)l[c]=n[c];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}g.displayName="MDXCreateElement"},4200:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},l=void 0,i={unversionedId:"architecture/templates/adr-template",id:"architecture/templates/adr-template",title:"adr-template",description:"\x3c!--",source:"@site/docs/architecture/templates/adr-template.md",sourceDirName:"architecture/templates",slug:"/architecture/templates/adr-template",permalink:"/main/architecture/templates/adr-template",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"ADR 003: Interchain Accounts Controller Module",permalink:"/main/architecture/adr/adr-003-ica-controller"},next:{title:"ADR Creation Process",permalink:"/main/architecture/PROCESS"}},s={},c=[{value:"Changelog",id:"changelog",level:2},{value:"Status",id:"status",level:2},{value:"Abstract",id:"abstract",level:2},{value:"Context",id:"context",level:2},{value:"Decision",id:"decision",level:2},{value:"Consequences",id:"consequences",level:2},{value:"Positive",id:"positive",level:3},{value:"Negative",id:"negative",level:3},{value:"Neutral",id:"neutral",level:3},{value:"References",id:"references",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"adr-adr-number-title"},"ADR {ADR-NUMBER}: {TITLE}"),(0,a.yg)("h2",{id:"changelog"},"Changelog"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"{date}: {changelog}")),(0,a.yg)("h2",{id:"status"},"Status"),(0,a.yg)("p",null,"{DRAFT | PROPOSED} Not Implemented"),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},"Please have a look at the ",(0,a.yg)("a",{parentName:"p",href:"../adr/PROCESS#adr-status"},"PROCESS")," page.\nUse DRAFT if the ADR is in a draft stage (draft PR) or PROPOSED if it's in review.")),(0,a.yg)("h2",{id:"abstract"},"Abstract"),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},"\"If you can't explain it simply, you don't understand it well enough.\" Provide\na simplified and layman-accessible explanation of the ADR.\nA short (~200 word) description of the issue being addressed.")),(0,a.yg)("h2",{id:"context"},"Context"),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},"This section contains all the context one needs to understand the current state, and why there is a problem.\nIt should be as succinct as possible and introduce the high level idea behind the solution.\nThe language in this section is value-neutral. It is simply describing facts.")),(0,a.yg)("h2",{id:"decision"},"Decision"),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},"This section explains all of the details of the proposed solution, including implementation details.\nIt should also describe affects / corollary items that may need to be changed as a part of this.\nIf the proposed change will be large, please also indicate a way to do the change to maximize ease of review.\n(e.g. the optimal split of things to do between separate PR's)")),(0,a.yg)("h2",{id:"consequences"},"Consequences"),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},'This section describes the consequences, after applying the decision.\nAll consequences should be summarized here, not just the "positive" ones.')),(0,a.yg)("h3",{id:"positive"},"Positive"),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},"{positive consequences}")),(0,a.yg)("h3",{id:"negative"},"Negative"),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},"{negative consequences}")),(0,a.yg)("h3",{id:"neutral"},"Neutral"),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},"{neutral consequences}")),(0,a.yg)("h2",{id:"references"},"References"),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},"Are there any relevant PR comments, issues that led up to this, or articles referenced for why we made the given design choice? If so link them here!")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"{reference link}")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2d8dbdf9.a6290c53.js b/assets/js/2d8dbdf9.a6290c53.js new file mode 100644 index 00000000000..1ae286d5fac --- /dev/null +++ b/assets/js/2d8dbdf9.a6290c53.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[1236],{5680:(e,t,n)=>{n.d(t,{xA:()=>m,yg:()=>c});var r=n(6540);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(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),u=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),d=u(n),g=a,c=d["".concat(s,".").concat(g)]||d[g]||p[g]||i;return n?r.createElement(c,o(o({ref:t},m),{},{components:n})):r.createElement(c,o({ref:t},m))}));function c(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:a,o[1]=l;for(var u=2;u<i;u++)o[u]=n[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}g.displayName="MDXCreateElement"},3499:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var r=n(8168),a=(n(6540),n(5680));const i={title:"KMS - Key Management System",order:5},o=void 0,l={unversionedId:"validators/kms/kms",id:"validators/kms/kms",title:"KMS - Key Management System",description:"Tendermint KMS is a key management service that allows separating key management from Tendermint nodes. In addition it provides other advantages such as:",source:"@site/docs/validators/kms/kms.md",sourceDirName:"validators/kms",slug:"/validators/kms/",permalink:"/main/validators/kms/",draft:!1,tags:[],version:"current",frontMatter:{title:"KMS - Key Management System",order:5},sidebar:"tutorialSidebar",previous:{title:"Validators",permalink:"/main/validators/"},next:{title:"Setting up Tendermint KMS + Ledger",permalink:"/main/validators/kms/kms_ledger"}},s={},u=[{value:"Building",id:"building",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Using a YubiHSM",id:"using-a-yubihsm",level:3},{value:"Using a Ledger device running the Tendermint app",id:"using-a-ledger-device-running-the-tendermint-app",level:3}],m={toc:u},d="wrapper";function p(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,r.A)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("p",null,(0,a.yg)("a",{parentName:"p",href:"https://github.com/iqlusioninc/tmkms"},"Tendermint KMS")," is a key management service that allows separating key management from Tendermint nodes. In addition it provides other advantages such as:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Improved security and risk management policies"),(0,a.yg)("li",{parentName:"ul"},"Unified API and support for various HSM (hardware security modules)"),(0,a.yg)("li",{parentName:"ul"},"Double signing protection (software or hardware based)")),(0,a.yg)("p",null,"It is recommended that the KMS service runs in a separate physical hosts."),(0,a.yg)("h2",{id:"building"},"Building"),(0,a.yg)("p",null,"Detailed build instructions can be found ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/iqlusioninc/tmkms#installation"},"here"),"."),(0,a.yg)("admonition",{type:"tip"},(0,a.yg)("p",{parentName:"admonition"},"When compiling the KMS, ensure you have enabled the applicable features:")),(0,a.yg)("table",null,(0,a.yg)("thead",{parentName:"table"},(0,a.yg)("tr",{parentName:"thead"},(0,a.yg)("th",{parentName:"tr",align:null},"Backend"),(0,a.yg)("th",{parentName:"tr",align:null},"Recommended Command line"))),(0,a.yg)("tbody",{parentName:"table"},(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"YubiHSM"),(0,a.yg)("td",{parentName:"tr",align:null},(0,a.yg)("inlineCode",{parentName:"td"},"cargo build --features yubihsm"))),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Ledger+Tendermint App"),(0,a.yg)("td",{parentName:"tr",align:null},(0,a.yg)("inlineCode",{parentName:"td"},"cargo build --features ledgertm"))))),(0,a.yg)("h2",{id:"configuration"},"Configuration"),(0,a.yg)("p",null,"A KMS can be configured in various ways:"),(0,a.yg)("h3",{id:"using-a-yubihsm"},"Using a YubiHSM"),(0,a.yg)("p",null," Detailed information on how to setup a KMS with YubiHSM2 can be found ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/iqlusioninc/tmkms/blob/master/README.yubihsm.md"},"here")),(0,a.yg)("h3",{id:"using-a-ledger-device-running-the-tendermint-app"},"Using a Ledger device running the Tendermint app"),(0,a.yg)("p",null," Detailed information on how to setup a KMS with Ledger Tendermint App can be found ",(0,a.yg)("a",{parentName:"p",href:"/main/validators/kms/kms_ledger"},"here")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2dd09b7f.cbaaf380.js b/assets/js/2dd09b7f.cbaaf380.js new file mode 100644 index 00000000000..708d9024aba --- /dev/null +++ b/assets/js/2dd09b7f.cbaaf380.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[4731],{5680:(e,a,n)=>{n.d(a,{xA:()=>d,yg:()=>c});var t=n(6540);function o(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function i(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function r(e){for(var a=1;a<arguments.length;a++){var n=null!=arguments[a]?arguments[a]:{};a%2?i(Object(n),!0).forEach((function(a){o(e,a,n[a])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(n,a))}))}return e}function l(e,a){if(null==e)return{};var n,t,o=function(e,a){if(null==e)return{};var n,t,o={},i=Object.keys(e);for(t=0;t<i.length;t++)n=i[t],a.indexOf(n)>=0||(o[n]=e[n]);return o}(e,a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t<i.length;t++)n=i[t],a.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=t.createContext({}),g=function(e){var a=t.useContext(s),n=a;return e&&(n="function"==typeof e?e(a):r(r({},a),e)),n},d=function(e){var a=g(e.components);return t.createElement(s.Provider,{value:a},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},y=t.forwardRef((function(e,a){var n=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=g(n),y=o,c=u["".concat(s,".").concat(y)]||u[y]||p[y]||i;return n?t.createElement(c,r(r({ref:a},d),{},{components:n})):t.createElement(c,r({ref:a},d))}));function c(e,a){var n=arguments,o=a&&a.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=y;var l={};for(var s in a)hasOwnProperty.call(a,s)&&(l[s]=a[s]);l.originalType=e,l[u]="string"==typeof e?e:o,r[1]=l;for(var g=2;g<i;g++)r[g]=n[g];return t.createElement.apply(null,r)}return t.createElement.apply(null,n)}y.displayName="MDXCreateElement"},650:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>s,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>g});var t=n(8168),o=(n(6540),n(5680));const i={title:"Interacting with Gaiad (CLI)",order:5},r=void 0,l={unversionedId:"hub-tutorials/gaiad",id:"hub-tutorials/gaiad",title:"Interacting with Gaiad (CLI)",description:"Gaia Daemon",source:"@site/docs/hub-tutorials/gaiad.md",sourceDirName:"hub-tutorials",slug:"/hub-tutorials/gaiad",permalink:"/main/hub-tutorials/gaiad",draft:!1,tags:[],version:"current",frontMatter:{title:"Interacting with Gaiad (CLI)",order:5},sidebar:"tutorialSidebar",previous:{title:"Gaia Tutorials",permalink:"/main/hub-tutorials/"},next:{title:"Joining Mainnet",permalink:"/main/hub-tutorials/join-mainnet"}},s={},g=[{value:"Gaia Daemon",id:"gaia-daemon",level:2},{value:"Setting up gaiad",id:"setting-up-gaiad",level:3},{value:"Keys",id:"keys",level:3},{value:"Keyring",id:"keyring",level:4},{value:"Key Types",id:"key-types",level:4},{value:"Migrate Keys From Legacy On-Disk Keybase To OS Built-in Secret Store",id:"migrate-keys-from-legacy-on-disk-keybase-to-os-built-in-secret-store",level:4},{value:"Generate Keys",id:"generate-keys",level:4},{value:"Generate Multisig Public Keys",id:"generate-multisig-public-keys",level:4},{value:"Tx Broadcasting",id:"tx-broadcasting",level:3},{value:"Fees & Gas",id:"fees--gas",level:3},{value:"Account",id:"account",level:3},{value:"Get Tokens",id:"get-tokens",level:4},{value:"Query Account Balance",id:"query-account-balance",level:4},{value:"Send Tokens",id:"send-tokens",level:3},{value:"Query Transactions",id:"query-transactions",level:3},{value:"Matching a Set of Events",id:"matching-a-set-of-events",level:4},{value:"Matching a Transaction's Hash",id:"matching-a-transactions-hash",level:4},{value:"Slashing",id:"slashing",level:3},{value:"Unjailing",id:"unjailing",level:4},{value:"Signing Info",id:"signing-info",level:4},{value:"Query Parameters",id:"query-parameters",level:4},{value:"Minting",id:"minting",level:3},{value:"Staking",id:"staking",level:3},{value:"Set up a Validator",id:"set-up-a-validator",level:4},{value:"Delegate to a Validator",id:"delegate-to-a-validator",level:4},{value:"Query Validators",id:"query-validators",level:5},{value:"Bond Tokens",id:"bond-tokens",level:4},{value:"Query Delegations",id:"query-delegations",level:5},{value:"Unbond Tokens",id:"unbond-tokens",level:4},{value:"Query Unbonding-Delegations",id:"query-unbonding-delegations",level:5},{value:"Redelegate Tokens",id:"redelegate-tokens",level:4},{value:"Query Redelegations",id:"query-redelegations",level:5},{value:"Query Parameters",id:"query-parameters-1",level:4},{value:"Query Pool",id:"query-pool",level:4},{value:"Query Delegations To Validator",id:"query-delegations-to-validator",level:5},{value:"Governance",id:"governance",level:3},{value:"Create a Governance Proposal",id:"create-a-governance-proposal",level:4},{value:"Query Proposals",id:"query-proposals",level:5},{value:"Increase Deposit",id:"increase-deposit",level:4},{value:"Query Deposits",id:"query-deposits",level:5},{value:"Vote on a Proposal",id:"vote-on-a-proposal",level:4},{value:"Query Votes",id:"query-votes",level:5},{value:"Query proposal tally results",id:"query-proposal-tally-results",level:4},{value:"Query Governance Parameters",id:"query-governance-parameters",level:4},{value:"Fee Distribution",id:"fee-distribution",level:3},{value:"Query Distribution Parameters",id:"query-distribution-parameters",level:4},{value:"Query distribution Community Pool",id:"query-distribution-community-pool",level:4},{value:"Query outstanding rewards",id:"query-outstanding-rewards",level:4},{value:"Query Validator Commission",id:"query-validator-commission",level:4},{value:"Query Validator Slashes",id:"query-validator-slashes",level:4},{value:"Query Delegator Rewards",id:"query-delegator-rewards",level:4},{value:"Query All Delegator Rewards",id:"query-all-delegator-rewards",level:4},{value:"Multisig Transactions",id:"multisig-transactions",level:3},{value:"Shells Completion Scripts",id:"shells-completion-scripts",level:2}],d={toc:g},u="wrapper";function p(e){let{components:a,...n}=e;return(0,o.yg)(u,(0,t.A)({},d,n,{components:a,mdxType:"MDXLayout"}),(0,o.yg)("h2",{id:"gaia-daemon"},"Gaia Daemon"),(0,o.yg)("p",null,(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," is the tool that enables you to interact with the node that runs on the Cosmos Hub network, whether you run it yourself or not. Let us set it up properly. In order to install it, follow the ",(0,o.yg)("a",{parentName:"p",href:"../getting-started/installation"},"installation procedure"),"."),(0,o.yg)("h3",{id:"setting-up-gaiad"},"Setting up gaiad"),(0,o.yg)("p",null,"The main command used to set up ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," is the following:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad config <flag> <value>\n")),(0,o.yg)("p",null,"It allows you to set a default value for each given flag."),(0,o.yg)("p",null,"First, set up the address of the full-node you want to connect to:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad config node <host>:<port>\n\n# example: gaiad config node https://77.87.106.33:26657\n")),(0,o.yg)("p",null,"If you run your own full-node, just use ",(0,o.yg)("inlineCode",{parentName:"p"},"tcp://localhost:26657")," as the address."),(0,o.yg)("p",null,"Finally, let us set the ",(0,o.yg)("inlineCode",{parentName:"p"},"chain-id")," of the blockchain we want to interact with:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad config chain-id cosmoshub-2\n")),(0,o.yg)("h3",{id:"keys"},"Keys"),(0,o.yg)("h4",{id:"keyring"},"Keyring"),(0,o.yg)("p",null,'The keyring holds the private/public keypairs used to interact with a node. For instance, a validator key needs to be set up before running the blockchain node, so that blocks can be correctly signed. The private key can be stored in different locations, called "backends", such as a file or the operating system\'s own key storage.'),(0,o.yg)("p",null,"Headless environments are recommended to use either the ",(0,o.yg)("inlineCode",{parentName:"p"},"file")," or ",(0,o.yg)("inlineCode",{parentName:"p"},"pass")," backends. More information is available at the ",(0,o.yg)("a",{parentName:"p",href:"https://docs.cosmos.network/v0.47/user/run-node/keyring"},"SDK documentation page"),"."),(0,o.yg)("h4",{id:"key-types"},"Key Types"),(0,o.yg)("p",null,"There are three types of key representations that are used:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("inlineCode",{parentName:"p"},"cosmos")),(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},"Derived from account keys generated by ",(0,o.yg)("inlineCode",{parentName:"li"},"gaiad keys add")),(0,o.yg)("li",{parentName:"ul"},"Used to receive funds"),(0,o.yg)("li",{parentName:"ul"},"e.g. ",(0,o.yg)("inlineCode",{parentName:"li"},"cosmos15h6vd5f0wqps26zjlwrc6chah08ryu4hzzdwhc")))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("inlineCode",{parentName:"p"},"cosmosvaloper")),(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},"Used to associate a validator to its operator"),(0,o.yg)("li",{parentName:"ul"},"Used to invoke staking commands"),(0,o.yg)("li",{parentName:"ul"},"e.g. ",(0,o.yg)("inlineCode",{parentName:"li"},"cosmosvaloper1carzvgq3e6y3z5kz5y6gxp3wpy3qdrv928vyah")))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("inlineCode",{parentName:"p"},"cosmospub")),(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},"Derived from account keys generated by ",(0,o.yg)("inlineCode",{parentName:"li"},"gaiad keys add")),(0,o.yg)("li",{parentName:"ul"},"e.g. ",(0,o.yg)("inlineCode",{parentName:"li"},"cosmospub1zcjduc3q7fu03jnlu2xpl75s2nkt7krm6grh4cc5aqth73v0zwmea25wj2hsqhlqzm")))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("inlineCode",{parentName:"p"},"cosmosvalconspub")),(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},"Generated when the node is created with ",(0,o.yg)("inlineCode",{parentName:"li"},"gaiad init"),"."),(0,o.yg)("li",{parentName:"ul"},"Get this value with ",(0,o.yg)("inlineCode",{parentName:"li"},"gaiad tendermint show-validator")),(0,o.yg)("li",{parentName:"ul"},"e.g. ",(0,o.yg)("inlineCode",{parentName:"li"},"cosmosvalconspub1zcjduepq0ms2738680y72v44tfyqm3c9ppduku8fs6sr73fx7m666sjztznqzp2emf"))))),(0,o.yg)("h4",{id:"migrate-keys-from-legacy-on-disk-keybase-to-os-built-in-secret-store"},"Migrate Keys From Legacy On-Disk Keybase To OS Built-in Secret Store"),(0,o.yg)("p",null,"Older versions of ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," used store keys in the user's home directory. If you are migrating\nfrom an old version of ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," you will need to migrate your old keys into your operating system's\ncredentials storage by running the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys migrate\n")),(0,o.yg)("p",null,"The command will prompt for every passphrase. If a passphrase is incorrect, it will skip the\nrespective key."),(0,o.yg)("h4",{id:"generate-keys"},"Generate Keys"),(0,o.yg)("p",null,"You'll need an account private and public key pair ","(","a.k.a. ",(0,o.yg)("inlineCode",{parentName:"p"},"sk, pk")," respectively",")"," to be able to receive funds, send txs, bond tx, etc."),(0,o.yg)("p",null,"To generate a new ",(0,o.yg)("em",{parentName:"p"},"secp256k1")," key:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys add <account_name>\n")),(0,o.yg)("p",null,"The output of the above command will contain a ",(0,o.yg)("em",{parentName:"p"},"seed phrase"),". It is recommended to save the ",(0,o.yg)("em",{parentName:"p"},"seed\nphrase")," in a safe place so that in case you forget the password of the operating system's\ncredentials store, you could eventually regenerate the key from the seed phrase with the\nfollowing command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys add --recover\n")),(0,o.yg)("p",null,"If you check your private keys, you'll now see ",(0,o.yg)("inlineCode",{parentName:"p"},"<account_name>"),":"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys show <account_name>\n")),(0,o.yg)("p",null,"View the validator operator's address via:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys show <account_name> --bech=val\n")),(0,o.yg)("p",null,"You can see all your available keys by typing:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys list\n")),(0,o.yg)("p",null,"View the validator pubkey for your node by typing:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tendermint show-validator\n")),(0,o.yg)("p",null,"Note that this is the Tendermint signing key, ",(0,o.yg)("em",{parentName:"p"},"not")," the operator key you will use in delegation transactions."),(0,o.yg)("div",{class:"theme-doc-version-banner alert alert--warning margin-bottom--md",role:"alert"},"We strongly recommend _NOT_ using the same passphrase for multiple keys. The CometBFT team and the Interchain Foundation will not be responsible for the loss of funds."),(0,o.yg)("h4",{id:"generate-multisig-public-keys"},"Generate Multisig Public Keys"),(0,o.yg)("p",null,"You can generate and print a multisig public key by typing:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys add --multisig=name1,name2,name3[...] --multisig-threshold=K new_key_name\n")),(0,o.yg)("p",null,(0,o.yg)("inlineCode",{parentName:"p"},"K")," is the minimum number of private keys that must have signed the\ntransactions that carry the public key's address as signer."),(0,o.yg)("p",null,"The ",(0,o.yg)("inlineCode",{parentName:"p"},"--multisig")," flag must contain the name of public keys that will be combined into a\npublic key that will be generated and stored as ",(0,o.yg)("inlineCode",{parentName:"p"},"new_key_name")," in the local database.\nAll names supplied through ",(0,o.yg)("inlineCode",{parentName:"p"},"--multisig")," must already exist in the local database. Unless\nthe flag ",(0,o.yg)("inlineCode",{parentName:"p"},"--nosort")," is set, the order in which the keys are supplied on the command line\ndoes not matter, i.e. the following commands generate two identical keys:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys add --multisig=foo,bar,baz --multisig-threshold=2 multisig_address\ngaiad keys add --multisig=baz,foo,bar --multisig-threshold=2 multisig_address\n")),(0,o.yg)("p",null,"Multisig addresses can also be generated on-the-fly and printed through the which command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys show --multisig-threshold K name1 name2 name3 [...]\n")),(0,o.yg)("p",null,"For more information regarding how to generate, sign and broadcast transactions with a\nmulti signature account see ",(0,o.yg)("a",{parentName:"p",href:"#multisig-transactions"},"Multisig Transactions"),"."),(0,o.yg)("h3",{id:"tx-broadcasting"},"Tx Broadcasting"),(0,o.yg)("p",null,"When broadcasting transactions, ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," accepts a ",(0,o.yg)("inlineCode",{parentName:"p"},"--broadcast-mode")," flag. This\nflag can have a value of ",(0,o.yg)("inlineCode",{parentName:"p"},"sync")," (default), ",(0,o.yg)("inlineCode",{parentName:"p"},"async"),", or ",(0,o.yg)("inlineCode",{parentName:"p"},"block"),", where ",(0,o.yg)("inlineCode",{parentName:"p"},"sync")," makes\nthe client return a CheckTx response, ",(0,o.yg)("inlineCode",{parentName:"p"},"async")," makes the client return immediately,\nand ",(0,o.yg)("inlineCode",{parentName:"p"},"block")," makes the client wait for the tx to be committed (or timing out)."),(0,o.yg)("p",null,"It is important to note that the ",(0,o.yg)("inlineCode",{parentName:"p"},"block")," mode should ",(0,o.yg)("strong",{parentName:"p"},"not")," be used in most\ncircumstances. This is because broadcasting can timeout but the tx may still be\nincluded in a block. This can result in many undesirable situations. Therefore, it\nis best to use ",(0,o.yg)("inlineCode",{parentName:"p"},"sync")," or ",(0,o.yg)("inlineCode",{parentName:"p"},"async")," and query by tx hash to determine when the tx\nis included in a block."),(0,o.yg)("h3",{id:"fees--gas"},"Fees & Gas"),(0,o.yg)("p",null,"The Cosmos Hub uses the ",(0,o.yg)("inlineCode",{parentName:"p"},"x/feemarket")," module to\ndynamically vary the gas price based on demand."),(0,o.yg)("p",null,"You need to specify a sufficient gas price or total fees\nto ensure that your transaction is included in a block,\ne.g."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx bank send ... --fees=50000uatom\n")),(0,o.yg)("p",null,"or"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx bank send ... --gas-prices=0.0025uatom\n")),(0,o.yg)("p",null,"To find out more about the current minimal gas price, you can query the feemarket module:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad q feemarket gas-prices\n")),(0,o.yg)("p",null,"or"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad q feemarket gas-prices uatom\n")),(0,o.yg)("p",null,"which will output the current gas price similar to this:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},'price: \n amount: "0.005" \n denom: uatom \n')),(0,o.yg)("p",null,"For more information, check out how to query the ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/skip-mev/feemarket/blob/main/docs/SPEC.md#gas-price"},"feemarket"),",\nor check out the ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/skip-mev/feemarket/blob/main/docs/INTEGRATIONS.md"},"feemarket integration guide"),"."),(0,o.yg)("h3",{id:"account"},"Account"),(0,o.yg)("h4",{id:"get-tokens"},"Get Tokens"),(0,o.yg)("p",null,"On a testnet, getting tokens is usually done via a faucet."),(0,o.yg)("h4",{id:"query-account-balance"},"Query Account Balance"),(0,o.yg)("p",null,"After receiving tokens to your address, you can view your account's balance by typing:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query account account_cosmos\n")),(0,o.yg)("admonition",{title:"Note",type:"warning"},(0,o.yg)("p",{parentName:"admonition"},"When you query an account balance with zero tokens, you will get this error: ",(0,o.yg)("inlineCode",{parentName:"p"},"No account with address <account_cosmos> was found in the state.")," This can also happen if you fund the account before your node has fully synced with the chain. These are both normal.")),(0,o.yg)("h3",{id:"send-tokens"},"Send Tokens"),(0,o.yg)("p",null,"The following command could be used to send coins from one account to another:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx bank send sender_key_name_or_address recipient_address 10faucetToken \\\n --chain-id=chain_id\n")),(0,o.yg)("div",{class:"theme-doc-version-banner alert alert--warning margin-bottom--md",role:"alert"},"The `amount` argument accepts the format `value|coin_name`."),(0,o.yg)("div",{class:"theme-doc-version-banner info alert--warning margin-bottom--md",role:"info"},"You may want to cap the maximum gas that can be consumed by the transaction via the `--gas` flag. If you pass `--gas=auto`, the gas supply will be automatically estimated before executing the transaction. Gas estimate might be inaccurate as state changes could occur in between the end of the simulation and the actual execution of a transaction, thus an adjustment is applied on top of the original estimate in order to ensure the transaction is broadcasted successfully. The adjustment can be controlled via the `--gas-adjustment` flag, whose default value is 1.0."),(0,o.yg)("p",null,"Now, view the updated balances of the origin and destination accounts:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query account account_cosmos\ngaiad query account destination_cosmos\n")),(0,o.yg)("p",null,"You can also check your balance at a given block by using the ",(0,o.yg)("inlineCode",{parentName:"p"},"--block")," flag:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query account account_cosmos --block=<block_height>\n")),(0,o.yg)("p",null,"You can simulate a transaction without actually broadcasting it by appending the\n",(0,o.yg)("inlineCode",{parentName:"p"},"--dry-run")," flag to the command line:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx bank send <sender_key_name_or_address> <destination_cosmosaccaddr> 10faucetToken \\\n --chain-id=<chain_id> \\\n --dry-run\n")),(0,o.yg)("p",null,"Furthermore, you can build a transaction and print its JSON format to STDOUT by\nappending ",(0,o.yg)("inlineCode",{parentName:"p"},"--generate-only")," to the list of the command line arguments:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx bank send <sender_address> <recipient_address> 10faucetToken \\\n --chain-id=<chain_id> \\\n --generate-only > unsignedSendTx.json\n")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx sign \\\n --chain-id=<chain_id> \\\n --from=<key_name> \\\n unsignedSendTx.json > signedSendTx.json\n")),(0,o.yg)("div",{class:"theme-doc-version-banner info alert--warning margin-bottom--md",role:"info"},"The `--generate-only` flag prevents `gaiad` from accessing the local keybase. Thus when such flag is supplied `sender_key_name_or_address` must be an address."),(0,o.yg)("p",null,"You can validate the transaction's signatures by typing the following:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx sign --validate-signatures signedSendTx.json\n")),(0,o.yg)("p",null,"You can broadcast the signed transaction to a node by providing the JSON file to the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx broadcast --node=<node> signedSendTx.json\n")),(0,o.yg)("h3",{id:"query-transactions"},"Query Transactions"),(0,o.yg)("h4",{id:"matching-a-set-of-events"},"Matching a Set of Events"),(0,o.yg)("p",null,"You can use the transaction search command to query for transactions that match a\nspecific set of ",(0,o.yg)("inlineCode",{parentName:"p"},"events"),", which are added on every transaction."),(0,o.yg)("p",null,"Each event is composed by a key-value pair in the form of ",(0,o.yg)("inlineCode",{parentName:"p"},"{eventType}.{eventAttribute}={value}"),".\nEvents can also be combined to query for a more specific result using the ",(0,o.yg)("inlineCode",{parentName:"p"},"&")," symbol."),(0,o.yg)("p",null,"You can query transactions by ",(0,o.yg)("inlineCode",{parentName:"p"},"events")," as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query txs --events='message.sender=cosmos1...'\n")),(0,o.yg)("p",null,"And for using multiple ",(0,o.yg)("inlineCode",{parentName:"p"},"events"),":"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query txs --events='message.sender=cosmos1...&message.action=withdraw_delegator_reward'\n")),(0,o.yg)("p",null,"The pagination is supported as well via ",(0,o.yg)("inlineCode",{parentName:"p"},"page")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"limit"),":"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query txs --events='message.sender=cosmos1...' --page=1 --limit=20\n")),(0,o.yg)("div",{class:"theme-doc-version-banner info alert--warning margin-bottom--md",role:"info"},"The action tag always equals the message type returned by the `Type()` function of the relevant message."),(0,o.yg)("p",null,"You can find a list of available ",(0,o.yg)("inlineCode",{parentName:"p"},"events")," on each of the SDK modules:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://github.com/cosmos/cosmos-sdk/tree/main/x/staking#events"},"Staking events")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://github.com/cosmos/cosmos-sdk/tree/main/x/gov#events"},"Governance events")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://github.com/cosmos/cosmos-sdk/tree/main/x/slashing#events"},"Slashing events")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://github.com/cosmos/cosmos-sdk/tree/main/x/distribution#events"},"Distribution events")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://github.com/cosmos/cosmos-sdk/tree/main/x/bank#events"},"Bank events"))),(0,o.yg)("h4",{id:"matching-a-transactions-hash"},"Matching a Transaction's Hash"),(0,o.yg)("p",null,"You can also query a single transaction by its hash using the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query tx [hash]\n")),(0,o.yg)("h3",{id:"slashing"},"Slashing"),(0,o.yg)("h4",{id:"unjailing"},"Unjailing"),(0,o.yg)("p",null,"To unjail your jailed validator"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx slashing unjail --from <validator-operator-addr>\n")),(0,o.yg)("h4",{id:"signing-info"},"Signing Info"),(0,o.yg)("p",null,"To retrieve a validator's signing info:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query slashing signing-info <validator-pubkey>\n")),(0,o.yg)("h4",{id:"query-parameters"},"Query Parameters"),(0,o.yg)("p",null,"You can get the current slashing parameters via:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query slashing params\n")),(0,o.yg)("h3",{id:"minting"},"Minting"),(0,o.yg)("p",null,"You can query for the minting/inflation parameters via:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query mint params\n")),(0,o.yg)("p",null,"To query for the current inflation value:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query mint inflation\n")),(0,o.yg)("p",null,"To query for the current annual provisions value:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query mint annual-provisions\n")),(0,o.yg)("h3",{id:"staking"},"Staking"),(0,o.yg)("h4",{id:"set-up-a-validator"},"Set up a Validator"),(0,o.yg)("p",null,"Please refer to the ",(0,o.yg)("a",{parentName:"p",href:"/main/validators/validator-setup"},"Validator Setup")," section for a more complete guide on how to set up a validator-candidate."),(0,o.yg)("h4",{id:"delegate-to-a-validator"},"Delegate to a Validator"),(0,o.yg)("p",null,"On the upcoming mainnet, you can delegate ",(0,o.yg)("inlineCode",{parentName:"p"},"atom")," to a validator. These ",(0,o.yg)("a",{parentName:"p",href:"/main/delegators/delegator-faq"},"delegators")," can receive part of the validator's fee revenue. Read more about the ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/cosmos/cosmos/raw/master/Cosmos_Token_Model.pdf"},"Cosmos Token Model"),"."),(0,o.yg)("h5",{id:"query-validators"},"Query Validators"),(0,o.yg)("p",null,"You can query the list of all validators of a specific chain:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query staking validators\n")),(0,o.yg)("p",null,"If you want to get the information of a single validator you can check it with:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query staking validator <account_cosmosval>\n")),(0,o.yg)("h4",{id:"bond-tokens"},"Bond Tokens"),(0,o.yg)("p",null,"On the Cosmos Hub mainnet, we delegate ",(0,o.yg)("inlineCode",{parentName:"p"},"uatom"),", where ",(0,o.yg)("inlineCode",{parentName:"p"},"1atom = 1000000uatom"),". Here's how you can bond tokens to a testnet validator (",(0,o.yg)("em",{parentName:"p"},"i.e.")," delegate):"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx staking delegate \\\n --amount=10000000uatom \\\n --validator=<validator> \\\n --from=<key_name> \\\n --chain-id=<chain_id>\n")),(0,o.yg)("p",null,(0,o.yg)("inlineCode",{parentName:"p"},"<validator>")," is the operator address of the validator to which you intend to delegate. If you are running a local testnet, you can find this with:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys show [name] --bech val\n")),(0,o.yg)("p",null,"where ",(0,o.yg)("inlineCode",{parentName:"p"},"[name]")," is the name of the key you specified when you initialized ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad"),"."),(0,o.yg)("p",null,"While tokens are bonded, they are pooled with all the other bonded tokens in the network. Validators and delegators obtain a percentage of shares that equal their stake in this pool."),(0,o.yg)("h5",{id:"query-delegations"},"Query Delegations"),(0,o.yg)("p",null,"Once submitted a delegation to a validator, you can see its information by using the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query staking delegation <delegator_addr> <validator_addr>\n")),(0,o.yg)("p",null,"Or if you want to check all your current delegations with distinct validators:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query staking delegations <delegator_addr>\n")),(0,o.yg)("h4",{id:"unbond-tokens"},"Unbond Tokens"),(0,o.yg)("p",null,"If for any reason the validator misbehaves, or you just want to unbond a certain\namount of tokens, use the following command."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx staking unbond \\\n <validator_addr> \\\n 10atom \\\n --from=<key_name> \\\n --chain-id=<chain_id>\n")),(0,o.yg)("p",null,"The unbonding will be automatically completed when the unbonding period has passed."),(0,o.yg)("h5",{id:"query-unbonding-delegations"},"Query Unbonding-Delegations"),(0,o.yg)("p",null,"Once you begin an unbonding-delegation, you can see it's information by using the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query staking unbonding-delegation <delegator_addr> <validator_addr>\n")),(0,o.yg)("p",null,"Or if you want to check all your current unbonding-delegations with distinct validators:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query staking unbonding-delegations <account_cosmos>\n")),(0,o.yg)("p",null,"Additionally, as you can get all the unbonding-delegations from a particular validator:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query staking unbonding-delegations-from <account_cosmosval>\n")),(0,o.yg)("h4",{id:"redelegate-tokens"},"Redelegate Tokens"),(0,o.yg)("p",null,"A redelegation is a type delegation that allows you to bond illiquid tokens from one validator to another:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx staking redelegate \\\n <src-validator-operator-addr> \\\n <dst-validator-operator-addr> \\\n 10atom \\\n --from=<key_name> \\\n --chain-id=<chain_id>\n")),(0,o.yg)("p",null,"Here you can also redelegate a specific ",(0,o.yg)("inlineCode",{parentName:"p"},"shares-amount")," or a ",(0,o.yg)("inlineCode",{parentName:"p"},"shares-fraction")," with the corresponding flags."),(0,o.yg)("p",null,"The redelegation will be automatically completed when the unbonding period has passed."),(0,o.yg)("h5",{id:"query-redelegations"},"Query Redelegations"),(0,o.yg)("p",null,"Once you begin a redelegation, you can see its information by using the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query staking redelegation <delegator_addr> <src_val_addr> <dst_val_addr>\n")),(0,o.yg)("p",null,"Or if you want to check all your current unbonding-delegations with distinct validators:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query staking redelegations <account_cosmos>\n")),(0,o.yg)("p",null,"Additionally, as you can get all the outgoing redelegations from a particular validator:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"}," gaiad query staking redelegations-from <account_cosmosval>\n")),(0,o.yg)("h4",{id:"query-parameters-1"},"Query Parameters"),(0,o.yg)("p",null,"Parameters define high level settings for staking. You can get the current values by using:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query staking params\n")),(0,o.yg)("p",null,"With the above command you will get the values for:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Unbonding time"),(0,o.yg)("li",{parentName:"ul"},"Maximum numbers of validators"),(0,o.yg)("li",{parentName:"ul"},"Coin denomination for staking")),(0,o.yg)("p",null,"All these values will be subject to updates through a ",(0,o.yg)("inlineCode",{parentName:"p"},"governance")," process by ",(0,o.yg)("inlineCode",{parentName:"p"},"ParameterChange")," proposals."),(0,o.yg)("h4",{id:"query-pool"},"Query Pool"),(0,o.yg)("p",null,"A staking ",(0,o.yg)("inlineCode",{parentName:"p"},"Pool")," defines the dynamic parameters of the current state. You can query them with the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query staking pool\n")),(0,o.yg)("p",null,"With the ",(0,o.yg)("inlineCode",{parentName:"p"},"pool")," command you will get the values for:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Not-bonded and bonded tokens"),(0,o.yg)("li",{parentName:"ul"},"Token supply"),(0,o.yg)("li",{parentName:"ul"},"Current annual inflation and the block in which the last inflation was processed"),(0,o.yg)("li",{parentName:"ul"},"Last recorded bonded shares")),(0,o.yg)("h5",{id:"query-delegations-to-validator"},"Query Delegations To Validator"),(0,o.yg)("p",null,"You can also query all of the delegations to a particular validator:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"}," gaiad query delegations-to <account_cosmosval>\n")),(0,o.yg)("h3",{id:"governance"},"Governance"),(0,o.yg)("p",null,"Governance is the process from which users in the Cosmos Hub can come to consensus\non software upgrades, parameters of the mainnet or signaling mechanisms through\ntext proposals. This is done through voting on proposals, which will be submitted\nby ",(0,o.yg)("inlineCode",{parentName:"p"},"ATOM")," holders on the mainnet."),(0,o.yg)("p",null,"Some considerations about the voting process:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Voting is done by bonded ",(0,o.yg)("inlineCode",{parentName:"li"},"ATOM")," holders on a 1 bonded ",(0,o.yg)("inlineCode",{parentName:"li"},"ATOM")," 1 vote basis"),(0,o.yg)("li",{parentName:"ul"},"Delegators inherit the vote of their validator if they don't vote"),(0,o.yg)("li",{parentName:"ul"},"Votes are tallied at the end of the voting period (2 weeks on mainnet) where\neach address can vote multiple times to update its ",(0,o.yg)("inlineCode",{parentName:"li"},"Option")," value (paying the transaction fee each time),\nonly the most recently cast vote will count as valid"),(0,o.yg)("li",{parentName:"ul"},"Voters can choose between options ",(0,o.yg)("inlineCode",{parentName:"li"},"Yes"),", ",(0,o.yg)("inlineCode",{parentName:"li"},"No"),", ",(0,o.yg)("inlineCode",{parentName:"li"},"NoWithVeto")," and ",(0,o.yg)("inlineCode",{parentName:"li"},"Abstain")),(0,o.yg)("li",{parentName:"ul"},"At the end of the voting period, a proposal is accepted iff:",(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"(YesVotes / (YesVotes+NoVotes+NoWithVetoVotes)) > 1/2")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"(NoWithVetoVotes / (YesVotes+NoVotes+NoWithVetoVotes)) < 1/3")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"((YesVotes+NoVotes+NoWithVetoVotes) / totalBondedStake) >= quorum"))))),(0,o.yg)("p",null,"For more information about the governance process and how it works, please check\nout the Governance module ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/cosmos/cosmos-sdk/tree/main/x/gov#xgov"},"specification"),"."),(0,o.yg)("h4",{id:"create-a-governance-proposal"},"Create a Governance Proposal"),(0,o.yg)("p",null,"In order to create a governance proposal, you must submit an initial deposit\nalong with a title and description. Various modules outside of governance may\nimplement their own proposal types and handlers (eg. parameter changes), where\nthe governance module itself supports ",(0,o.yg)("inlineCode",{parentName:"p"},"Text")," proposals. Any module\noutside of governance has its command mounted on top of ",(0,o.yg)("inlineCode",{parentName:"p"},"submit-proposal"),"."),(0,o.yg)("p",null,"To submit a ",(0,o.yg)("inlineCode",{parentName:"p"},"Text")," proposal:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},'gaiad tx gov submit-proposal \\\n --title=<title> \\\n --description=<description> \\\n --type="Text" \\\n --deposit="1000000uatom" \\\n --from=<name> \\\n --chain-id=<chain_id>\n')),(0,o.yg)("p",null,"You may also provide the proposal directly through the ",(0,o.yg)("inlineCode",{parentName:"p"},"--proposal")," flag which\npoints to a JSON file containing the proposal."),(0,o.yg)("p",null,"To submit a parameter change proposal, you must provide a proposal file as its\ncontents are less friendly to CLI input:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx gov submit-proposal param-change <path/to/proposal.json> \\\n --from=<name> \\\n --chain-id=<chain_id>\n")),(0,o.yg)("p",null,"Where ",(0,o.yg)("inlineCode",{parentName:"p"},"proposal.json")," contains the following:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-json"},'{\n "title": "Param Change",\n "description": "Update max validators",\n "changes": [\n {\n "subspace": "staking",\n "key": "MaxValidators",\n "value": 105\n }\n ],\n "deposit": [\n {\n "denom": "stake",\n "amount": "10000000"\n }\n ]\n}\n')),(0,o.yg)("div",{class:"theme-doc-version-banner info alert--warning margin-bottom--md",role:"info"},"Currently parameter changes are _evaluated_ but not _validated_, so it is very important that any `value` change is valid (ie. correct type and within bounds) for its respective parameter, eg. `MaxValidators` should be an integer and not a decimal.",(0,o.yg)("p",null,"Proper vetting of a parameter change proposal should prevent this from happening\n(no deposits should occur during the governance process), but it should be noted\nregardless.")),(0,o.yg)("div",{class:"theme-doc-version-banner info alert--warning margin-bottom--md",role:"info"},"The `SoftwareUpgrade` is currently not supported as it's not implemented and currently does not differ from the semantics of a `Text` proposal."),(0,o.yg)("h5",{id:"query-proposals"},"Query Proposals"),(0,o.yg)("p",null,"Once created, you can now query information of the proposal:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query gov proposal <proposal_id>\n")),(0,o.yg)("p",null,"Or query all available proposals:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query gov proposals\n")),(0,o.yg)("p",null,"You can also query proposals filtered by ",(0,o.yg)("inlineCode",{parentName:"p"},"voter")," or ",(0,o.yg)("inlineCode",{parentName:"p"},"depositor")," by using the corresponding flags."),(0,o.yg)("p",null,"To query for the proposer of a given governance proposal:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query gov proposer <proposal_id>\n")),(0,o.yg)("h4",{id:"increase-deposit"},"Increase Deposit"),(0,o.yg)("p",null,"In order for a proposal to be broadcasted to the network, the amount deposited must be above a ",(0,o.yg)("inlineCode",{parentName:"p"},"minDeposit")," value (initial value: ",(0,o.yg)("inlineCode",{parentName:"p"},"512000000uatom"),"). If the proposal you previously created didn't meet this requirement, you can still increase the total amount deposited to activate it. Once the minimum deposit is reached, the proposal enters voting period:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},'gaiad tx gov deposit <proposal_id> "10000000uatom" \\\n --from=<name> \\\n --chain-id=<chain_id>\n')),(0,o.yg)("p",null,(0,o.yg)("em",{parentName:"p"},"NOTE"),": Proposals that don't meet this requirement will be deleted after ",(0,o.yg)("inlineCode",{parentName:"p"},"MaxDepositPeriod")," is reached."),(0,o.yg)("h5",{id:"query-deposits"},"Query Deposits"),(0,o.yg)("p",null,"Once a new proposal is created, you can query all the deposits submitted to it:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query gov deposits <proposal_id>\n")),(0,o.yg)("p",null,"You can also query a deposit submitted by a specific address:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query gov deposit <proposal_id> <depositor_address>\n")),(0,o.yg)("h4",{id:"vote-on-a-proposal"},"Vote on a Proposal"),(0,o.yg)("p",null,"After a proposal's deposit reaches the ",(0,o.yg)("inlineCode",{parentName:"p"},"MinDeposit")," value, the voting period opens. Bonded ",(0,o.yg)("inlineCode",{parentName:"p"},"Atom")," holders can then cast vote on it:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx gov vote <proposal_id> <Yes/No/NoWithVeto/Abstain> \\\n --from=<name> \\\n --chain-id=<chain_id>\n")),(0,o.yg)("h5",{id:"query-votes"},"Query Votes"),(0,o.yg)("p",null,"Check the vote with the option you just submitted:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query gov vote <proposal_id> <voter_address>\n")),(0,o.yg)("p",null,"You can also get all the previous votes submitted to the proposal with:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query gov votes <proposal_id>\n")),(0,o.yg)("h4",{id:"query-proposal-tally-results"},"Query proposal tally results"),(0,o.yg)("p",null,"To check the current tally of a given proposal you can use the ",(0,o.yg)("inlineCode",{parentName:"p"},"tally")," command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query gov tally <proposal_id>\n")),(0,o.yg)("h4",{id:"query-governance-parameters"},"Query Governance Parameters"),(0,o.yg)("p",null,"To check the current governance parameters run:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query gov params\n")),(0,o.yg)("p",null,"To query subsets of the governance parameters run:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query gov param voting\ngaiad query gov param tallying\ngaiad query gov param deposit\n")),(0,o.yg)("h3",{id:"fee-distribution"},"Fee Distribution"),(0,o.yg)("h4",{id:"query-distribution-parameters"},"Query Distribution Parameters"),(0,o.yg)("p",null,"To check the current distribution parameters, run:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query distribution params\n")),(0,o.yg)("h4",{id:"query-distribution-community-pool"},"Query distribution Community Pool"),(0,o.yg)("p",null,"To query all coins in the community pool which is under Governance control:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query distribution community-pool\n")),(0,o.yg)("h4",{id:"query-outstanding-rewards"},"Query outstanding rewards"),(0,o.yg)("p",null,"To check the current outstanding (un-withdrawn) rewards, run:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query distribution outstanding-rewards\n")),(0,o.yg)("h4",{id:"query-validator-commission"},"Query Validator Commission"),(0,o.yg)("p",null,"To check the current outstanding commission for a validator, run:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query distribution commission <validator_address>\n")),(0,o.yg)("h4",{id:"query-validator-slashes"},"Query Validator Slashes"),(0,o.yg)("p",null,"To check historical slashes for a validator, run:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query distribution slashes <validator_address> <start_height> <end_height>\n")),(0,o.yg)("h4",{id:"query-delegator-rewards"},"Query Delegator Rewards"),(0,o.yg)("p",null,"To check current rewards for a delegation (were they to be withdrawn), run:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query distribution rewards <delegator_address> <validator_address>\n")),(0,o.yg)("h4",{id:"query-all-delegator-rewards"},"Query All Delegator Rewards"),(0,o.yg)("p",null,"To check all current rewards for a delegation (were they to be withdrawn), run:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query distribution rewards <delegator_address>\n")),(0,o.yg)("h3",{id:"multisig-transactions"},"Multisig Transactions"),(0,o.yg)("p",null,"Multisig transactions require signatures of multiple private keys. Thus, generating and signing\na transaction from a multisig account involve cooperation among the parties involved. A multisig\ntransaction can be initiated by any of the key holders, and at least one of them would need to\nimport other parties' public keys into their Keybase and generate a multisig public key\nin order to finalize and broadcast the transaction."),(0,o.yg)("p",null,"For example, given a multisig key comprising the keys ",(0,o.yg)("inlineCode",{parentName:"p"},"p1"),", ",(0,o.yg)("inlineCode",{parentName:"p"},"p2"),", and ",(0,o.yg)("inlineCode",{parentName:"p"},"p3"),", each of which is held\nby a distinct party, the user holding ",(0,o.yg)("inlineCode",{parentName:"p"},"p1")," would require to import both ",(0,o.yg)("inlineCode",{parentName:"p"},"p2")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"p3")," in order to\ngenerate the multisig account public key:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys add \\\n p2 \\\n --pubkey=cosmospub1addwnpepqtd28uwa0yxtwal5223qqr5aqf5y57tc7kk7z8qd4zplrdlk5ez5kdnlrj4\n\ngaiad keys add \\\n p3 \\\n --pubkey=cosmospub1addwnpepqgj04jpm9wrdml5qnss9kjxkmxzywuklnkj0g3a3f8l5wx9z4ennz84ym5t\n\ngaiad keys add \\\n p1p2p3 \\\n --multisig-threshold=2 \\\n --multisig=p1,p2,p3\n")),(0,o.yg)("p",null,"A new multisig public key ",(0,o.yg)("inlineCode",{parentName:"p"},"p1p2p3")," has been stored, and its address will be\nused as signer of multisig transactions:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys show --address p1p2p3\n")),(0,o.yg)("p",null,"You may also view multisig threshold, pubkey constituents and respective weights\nby viewing the JSON output of the key or passing the ",(0,o.yg)("inlineCode",{parentName:"p"},"--show-multisig")," flag:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys show p1p2p3 -o json\n\ngaiad keys show p1p2p3 --show-multisig\n")),(0,o.yg)("p",null,"The first step to create a multisig transaction is to initiate it on behalf\nof the multisig address created above:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx bank send cosmos1570v2fq3twt0f0x02vhxpuzc9jc4yl30q2qned 1000000uatom \\\n --from=<multisig_address> \\\n --generate-only > unsignedTx.json\n")),(0,o.yg)("p",null,"The file ",(0,o.yg)("inlineCode",{parentName:"p"},"unsignedTx.json")," contains the unsigned transaction encoded in JSON.\n",(0,o.yg)("inlineCode",{parentName:"p"},"p1")," can now sign the transaction with its own private key:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx sign \\\n unsignedTx.json \\\n --multisig=<multisig_address> \\\n --from=p1 \\\n --output-document=p1signature.json\n")),(0,o.yg)("p",null,"Once the signature is generated, ",(0,o.yg)("inlineCode",{parentName:"p"},"p1")," transmits both ",(0,o.yg)("inlineCode",{parentName:"p"},"unsignedTx.json")," and\n",(0,o.yg)("inlineCode",{parentName:"p"},"p1signature.json")," to ",(0,o.yg)("inlineCode",{parentName:"p"},"p2")," or ",(0,o.yg)("inlineCode",{parentName:"p"},"p3"),", which in turn will generate their\nrespective signature:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx sign \\\n unsignedTx.json \\\n --multisig=<multisig_address> \\\n --from=p2 \\\n --output-document=p2signature.json\n")),(0,o.yg)("p",null,(0,o.yg)("inlineCode",{parentName:"p"},"p1p2p3")," is a 2-of-3 multisig key, therefore one additional signature\nis sufficient. Any the key holders can now generate the multisig\ntransaction by combining the required signature files:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx multisign \\\n unsignedTx.json \\\n p1p2p3 \\\n p1signature.json p2signature.json > signedTx.json\n")),(0,o.yg)("p",null,"The transaction can now be sent to the node:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx broadcast signedTx.json\n")),(0,o.yg)("h2",{id:"shells-completion-scripts"},"Shells Completion Scripts"),(0,o.yg)("p",null,"Completion scripts for popular UNIX shell interpreters such as ",(0,o.yg)("inlineCode",{parentName:"p"},"Bash")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"Zsh"),"\ncan be generated through the ",(0,o.yg)("inlineCode",{parentName:"p"},"completion")," command, which is available for both\n",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad"),"."),(0,o.yg)("p",null,"If you want to generate ",(0,o.yg)("inlineCode",{parentName:"p"},"Bash")," completion scripts run the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad completion > gaiad_completion\ngaiad completion > gaiacli_completion\n")),(0,o.yg)("p",null,"If you want to generate ",(0,o.yg)("inlineCode",{parentName:"p"},"Zsh")," completion scripts run the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad completion --zsh > gaiad_completion\ngaiad completion --zsh > gaiacli_completion\n")),(0,o.yg)("div",{class:"theme-doc-version-banner info alert--warning margin-bottom--md",role:"info"},"On most UNIX systems, such scripts may be loaded in `.bashrc` or `.bash_profile` to enable Bash autocompletion:",(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"echo '. gaiad_completion' >> ~/.bashrc\necho '. gaiacli_completion' >> ~/.bashrc\n")),(0,o.yg)("p",null,"Refer to the user's manual of your interpreter provided by your\noperating system for information on how to enable shell autocompletion.")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3a859fe7.099eea37.js b/assets/js/3a859fe7.099eea37.js new file mode 100644 index 00000000000..95e047c0f24 --- /dev/null +++ b/assets/js/3a859fe7.099eea37.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[3295],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>y});var a=r(6540);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),c=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(r),d=n,y=u["".concat(s,".").concat(d)]||u[d]||m[d]||o;return r?a.createElement(y,i(i({ref:t},p),{},{components:r})):a.createElement(y,i({ref:t},p))}));function y(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var c=2;c<o;c++)i[c]=r[c];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},5716:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var a=r(8168),n=(r(6540),r(5680));const o={title:"Validators",order:1},i=void 0,l={unversionedId:"validators/README",id:"validators/README",title:"Validators",description:"This folder contains documentation relevant to validators of the Cosmos Hub and other gaia blockchains.",source:"@site/docs/validators/README.md",sourceDirName:"validators",slug:"/validators/",permalink:"/main/validators/",draft:!1,tags:[],version:"current",frontMatter:{title:"Validators",order:1},sidebar:"tutorialSidebar",previous:{title:"Delegator Security",permalink:"/main/delegators/delegator-security"},next:{title:"KMS - Key Management System",permalink:"/main/validators/kms/"}},s={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...r}=e;return(0,n.yg)(u,(0,a.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("p",null,"This folder contains documentation relevant to validators of the Cosmos Hub and other ",(0,n.yg)("inlineCode",{parentName:"p"},"gaia")," blockchains."),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"/main/validators/overview"},"Validator Overview")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"/main/validators/validator-setup"},"Setting Up a Validator for Cosmos Hub Mainnet")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"/main/validators/validator-faq"},"Validator FAQ")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"/main/validators/security"},"Validator Security Notice")),(0,n.yg)("li",{parentName:"ul"},"Key Management Systems",(0,n.yg)("ul",{parentName:"li"},(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"/main/validators/kms/"},"Intro to KMS")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"/main/validators/kms/kms_ledger"},"KMS + Ledger"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3de875ef.6f15223f.js b/assets/js/3de875ef.6f15223f.js new file mode 100644 index 00000000000..c3599c391c3 --- /dev/null +++ b/assets/js/3de875ef.6f15223f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[3032],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=s(n),h=o,g=p["".concat(c,".").concat(h)]||p[h]||d[h]||a;return n?r.createElement(g,l(l({ref:t},u),{},{components:n})):r.createElement(g,l({ref:t},u))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,l=new Array(a);l[0]=h;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:o,l[1]=i;for(var s=2;s<a;s++)l[s]=n[s];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}h.displayName="MDXCreateElement"},9794:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var r=n(8168),o=(n(6540),n(5680));const a={},l="ADR 003: Interchain Accounts Controller Module",i={unversionedId:"architecture/adr/adr-003-ica-controller",id:"architecture/adr/adr-003-ica-controller",title:"ADR 003: Interchain Accounts Controller Module",description:"Changelog",source:"@site/docs/architecture/adr/adr-003-ica-controller.md",sourceDirName:"architecture/adr",slug:"/architecture/adr/adr-003-ica-controller",permalink:"/main/architecture/adr/adr-003-ica-controller",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"ADR 002: Globalfee Module",permalink:"/main/architecture/adr/adr-002-globalfee"},next:{title:"adr-template",permalink:"/main/architecture/templates/adr-template"}},c={},s=[{value:"Changelog",id:"changelog",level:2},{value:"Status",id:"status",level:2},{value:"Abstract",id:"abstract",level:2},{value:"Context",id:"context",level:2},{value:"Decision",id:"decision",level:2},{value:"Consequences",id:"consequences",level:2},{value:"Positive",id:"positive",level:3},{value:"Negative",id:"negative",level:3},{value:"Neutral",id:"neutral",level:3},{value:"References",id:"references",level:2}],u={toc:s},p="wrapper";function d(e){let{components:t,...n}=e;return(0,o.yg)(p,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"adr-003-interchain-accounts-controller-module"},"ADR 003: Interchain Accounts Controller Module"),(0,o.yg)("h2",{id:"changelog"},"Changelog"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"2024-03-08: Initial Draft")),(0,o.yg)("h2",{id:"status"},"Status"),(0,o.yg)("p",null,"Proposed"),(0,o.yg)("h2",{id:"abstract"},"Abstract"),(0,o.yg)("p",null,"The Interchain Accounts Controller IBC module allows users of one chain to create and control accounts on other chains. The Hub currently doesn't have ICA Controller module enabled, so it is not possible to create accounts on other chains from the Hub chain."),(0,o.yg)("h2",{id:"context"},"Context"),(0,o.yg)("p",null,"Enabling the ICA Controller module on the Hub would support various use cases. One such case could be the provider-based governance that would allow the ATOM stakers to participate in a governance on consumer chains."),(0,o.yg)("h2",{id:"decision"},"Decision"),(0,o.yg)("p",null,"The ICA Controller module will be included in the application, so the Hub will have both ICA Host and Controller modules. The implementation will use the Controller module's built-in authentication mechanism, since we don't have a need for custom authentication logic. According to this, users will directly use ",(0,o.yg)("inlineCode",{parentName:"p"},"MsgRegisterInterchainAccount")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"MsgSendTx")," messages defined by the Controller module. The possibility provided by the Controller module to define underlying application to have custom processing of IBC messages exchanged by the Controller module (e.g. ",(0,o.yg)("inlineCode",{parentName:"p"},"OnChanOpenInit"),", ",(0,o.yg)("inlineCode",{parentName:"p"},"OnAcknowledgementPacket"),", etc.) will not be used, since there is currently no need for this."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-go"},"// ICA Controller keeper\nappKeepers.ICAControllerKeeper = icacontrollerkeeper.NewKeeper(\n appCodec,\n appKeepers.keys[icacontrollertypes.StoreKey],\n appKeepers.GetSubspace(icacontrollertypes.SubModuleName),\n appKeepers.IBCKeeper.ChannelKeeper, // ICS4Wrapper\n appKeepers.IBCKeeper.ChannelKeeper,\n &appKeepers.IBCKeeper.PortKeeper,\n appKeepers.ScopedICAControllerKeeper,\n bApp.MsgServiceRouter(),\n)\n\n// Create ICA module\nappKeepers.ICAModule = ica.NewAppModule(&appKeepers.ICAControllerKeeper, &appKeepers.ICAHostKeeper)\n\n// Create Interchain Accounts Controller Stack\nvar icaControllerStack porttypes.IBCModule = icacontroller.NewIBCMiddleware(nil, appKeepers.ICAControllerKeeper)\n\n// Add Interchain Accounts Controller IBC route\nibcRouter.AddRoute(icacontrollertypes.SubModuleName, icaControllerStack)\n")),(0,o.yg)("h2",{id:"consequences"},"Consequences"),(0,o.yg)("h3",{id:"positive"},"Positive"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Users of the Hub will have a possibility to create and utilize Interchain Accounts on other IBC connected chains.")),(0,o.yg)("h3",{id:"negative"},"Negative"),(0,o.yg)("h3",{id:"neutral"},"Neutral"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Since we don't need to implement a custom authentication mechanism, we can rely on the one defined by the Controller module itself, implemented through the ",(0,o.yg)("inlineCode",{parentName:"li"},"MsgRegisterInterchainAccount")," and ",(0,o.yg)("inlineCode",{parentName:"li"},"MsgSendTx")," messages.")),(0,o.yg)("h2",{id:"references"},"References"),(0,o.yg)("p",null,(0,o.yg)("a",{parentName:"p",href:"https://github.com/cosmos/gaia/issues/2869"},"https://github.com/cosmos/gaia/issues/2869")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/416.e12d54c2.js b/assets/js/416.e12d54c2.js new file mode 100644 index 00000000000..2b31257812e --- /dev/null +++ b/assets/js/416.e12d54c2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[416],{416:(s,c,e)=>{e.r(c)}}]); \ No newline at end of file diff --git a/assets/js/41f2894c.8e130019.js b/assets/js/41f2894c.8e130019.js new file mode 100644 index 00000000000..84e425908ce --- /dev/null +++ b/assets/js/41f2894c.8e130019.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[3684],{5680:(e,a,t)=>{t.d(a,{xA:()=>u,yg:()=>h});var n=t(6540);function o(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function i(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var a=1;a<arguments.length;a++){var t=null!=arguments[a]?arguments[a]:{};a%2?i(Object(t),!0).forEach((function(a){o(e,a,t[a])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(t,a))}))}return e}function r(e,a){if(null==e)return{};var t,n,o=function(e,a){if(null==e)return{};var t,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)t=i[n],a.indexOf(t)>=0||(o[t]=e[t]);return o}(e,a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)t=i[n],a.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=n.createContext({}),p=function(e){var a=n.useContext(l),t=a;return e&&(t="function"==typeof e?e(a):s(s({},a),e)),t},u=function(e){var a=p(e.components);return n.createElement(l.Provider,{value:a},e.children)},m="mdxType",g={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},d=n.forwardRef((function(e,a){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,u=r(e,["components","mdxType","originalType","parentName"]),m=p(t),d=o,h=m["".concat(l,".").concat(d)]||m[d]||g[d]||i;return t?n.createElement(h,s(s({ref:a},u),{},{components:t})):n.createElement(h,s({ref:a},u))}));function h(e,a){var t=arguments,o=a&&a.mdxType;if("string"==typeof e||o){var i=t.length,s=new Array(i);s[0]=d;var r={};for(var l in a)hasOwnProperty.call(a,l)&&(r[l]=a[l]);r.originalType=e,r[m]="string"==typeof e?e:o,s[1]=r;for(var p=2;p<i;p++)s[p]=t[p];return n.createElement.apply(null,s)}return n.createElement.apply(null,t)}d.displayName="MDXCreateElement"},4411:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>l,contentTitle:()=>s,default:()=>g,frontMatter:()=>i,metadata:()=>r,toc:()=>p});var n=t(8168),o=(t(6540),t(5680));const i={title:"Submitting a Proposal",order:5},s=void 0,r={unversionedId:"governance/submitting",id:"governance/submitting",title:"Submitting a Proposal",description:"If you have a final draft of your proposal ready to submit, you may want to push your proposal live on the testnet first. These are the three primary steps to getting your proposal live on-chain.",source:"@site/docs/governance/submitting.md",sourceDirName:"governance",slug:"/governance/submitting",permalink:"/main/governance/submitting",draft:!1,tags:[],version:"current",frontMatter:{title:"Submitting a Proposal",order:5},sidebar:"tutorialSidebar",previous:{title:"On-Chain Proposal Process",permalink:"/main/governance/process"},next:{title:"Interchain Security",permalink:"/main/interchain-security/"}},l={},p=[{value:"Hosting supplementary materials",id:"hosting-supplementary-materials",level:2},{value:"Formatting the JSON file for the governance proposal",id:"formatting-the-json-file-for-the-governance-proposal",level:2},{value:"Sending the transaction that submits your governance proposal",id:"sending-the-transaction-that-submits-your-governance-proposal",level:2},{value:"Proposal types",id:"proposal-types",level:3},{value:"Legacy proposals (cosmos-sdk < v0.47)",id:"legacy-proposals-cosmos-sdk--v047",level:4},{value:"Proposals (cosmos-sdk >= v0.47)",id:"proposals-cosmos-sdk--v047",level:4},{value:"Minimal Deposit amount",id:"minimal-deposit-amount",level:4},{value:"Walkthrough example (changing x/staking params)",id:"walkthrough-example-changing-xstaking-params",level:3},{value:"Verifying your transaction",id:"verifying-your-transaction",level:3},{value:"Troubleshooting a failed transaction",id:"troubleshooting-a-failed-transaction",level:3},{value:"Depositing funds after a proposal has been submitted",id:"depositing-funds-after-a-proposal-has-been-submitted",level:3},{value:"Submitting your proposal to the testnet",id:"submitting-your-proposal-to-the-testnet",level:3}],u={toc:p},m="wrapper";function g(e){let{components:a,...t}=e;return(0,o.yg)(m,(0,n.A)({},u,t,{components:a,mdxType:"MDXLayout"}),(0,o.yg)("p",null,"If you have a final draft of your proposal ready to submit, you may want to push your proposal live on the testnet first. These are the three primary steps to getting your proposal live on-chain."),(0,o.yg)("p",null,"Interacting with the Cosmos Hub via the command line in order to run queries or submit proposals has several prerequisites:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"You will need to compile ",(0,o.yg)("a",{parentName:"li",href:"../getting-started/installation"},(0,o.yg)("inlineCode",{parentName:"a"},"gaiad"))," from source into a binary file executable by your operating system eg. MacOS, Windows, Linux"),(0,o.yg)("li",{parentName:"ul"},"You will need to indicate which chain you are querying, and currently this is ",(0,o.yg)("inlineCode",{parentName:"li"},"--chain-id cosmoshub-4")),(0,o.yg)("li",{parentName:"ul"},"You will need to connect to a full node. You can find a list of available Cosmos Hub endpoints under the ",(0,o.yg)("a",{parentName:"li",href:"https://github.com/cosmos/chain-registry/blob/master/cosmoshub/chain.json"},"API section")," in the ",(0,o.yg)("a",{parentName:"li",href:"https://github.com/cosmos/chain-registry"},"Chain Registry"),"."),(0,o.yg)("li",{parentName:"ul"},"More info is in the Walkthrough Example section.")),(0,o.yg)("p",null,"Running a full node can be difficult for those not technically-inclined, so you may choose to use a third-party's full node. In this case, the primary security risk is that of censorship: it's the single place where you have a single gateway to the network, and any messages submitted through an untrusted node could be censored."),(0,o.yg)("h2",{id:"hosting-supplementary-materials"},"Hosting supplementary materials"),(0,o.yg)("p",null,"In general we try to minimize the amount of data pushed to the blockchain. Hence, detailed documentation about a proposal is usually hosted on a separate censorship resistant data-hosting platform, like IPFS."),(0,o.yg)("p",null,"Once you have drafted your proposal, ideally as a Markdown file, you\ncan upload it to the IPFS network:"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"By ",(0,o.yg)("a",{parentName:"li",href:"https://ipfs.io"},"running an IPFS node and the IPFS software"),", or"),(0,o.yg)("li",{parentName:"ol"},"By using a service such as ",(0,o.yg)("a",{parentName:"li",href:"https://pinata.cloud"},"https://pinata.cloud"))),(0,o.yg)("p",null,'Ensure that you "pin" the file so that it continues to be available on the network. You should get a URL like this: ',(0,o.yg)("a",{parentName:"p",href:"https://ipfs.io/ipfs/QmbkQNtCAdR1CNbFE8ujub2jcpwUcmSRpSCg8gVWrTHSWD"},"https://ipfs.io/ipfs/QmbkQNtCAdR1CNbFE8ujub2jcpwUcmSRpSCg8gVWrTHSWD")),(0,o.yg)("p",null,"The value ",(0,o.yg)("inlineCode",{parentName:"p"},"QmbkQNtCAdR1CNbFE8ujub2jcpwUcmSRpSCg8gVWrTHSWD")," is called the ",(0,o.yg)("inlineCode",{parentName:"p"},"CID")," of your file - it is effectively the file's hash."),(0,o.yg)("p",null,"If you uploaded a markdown file, you can use the IPFS markdown viewer to render the document for better viewing. Links for the markdown viewer look like ",(0,o.yg)("inlineCode",{parentName:"p"},"https://ipfs.io/ipfs/QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/example#/ipfs/<CID>"),", where ",(0,o.yg)("inlineCode",{parentName:"p"},"<CID>")," is your CID. For instance the link above would be: ",(0,o.yg)("a",{parentName:"p",href:"https://ipfs.io/ipfs/QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/example#/ipfs/QmbkQNtCAdR1CNbFE8ujub2jcpwUcmSRpSCg8gVWrTHSWD"},"https://ipfs.io/ipfs/QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/example#/ipfs/QmbkQNtCAdR1CNbFE8ujub2jcpwUcmSRpSCg8gVWrTHSWD")),(0,o.yg)("p",null,"Share the URL with others and verify that your file is publicly accessible."),(0,o.yg)("p",null,"The reason we use IPFS is that it is a decentralized means of storage, making it resistant to censorship or single points of failure. This increases the likelihood that the file will remain available in the future."),(0,o.yg)("h2",{id:"formatting-the-json-file-for-the-governance-proposal"},"Formatting the JSON file for the governance proposal"),(0,o.yg)("p",null,"Prior to sending the transaction that submits your proposal on-chain, you must create a JSON file. This file will contain the information that will be stored on-chain as the governance proposal. Begin by creating a new text (.txt) file to enter this information. Use ",(0,o.yg)("a",{parentName:"p",href:"/main/governance/best-practices"},"these best practices")," as a guide for the contents of your proposal. When you're done, save the file as a .json file. "),(0,o.yg)("p",null,"Each proposal type is unique in how the JSON should be formatted.\nSee the relevant section for the type of proposal you are drafting:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"/main/governance/formatting#text"},"Text Proposals")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"/main/governance/formatting#community-pool-spend"},"Community Pool Spend Proposals")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"/main/governance/formatting#parameter-change"},"Parameter Change Proposals"))),(0,o.yg)("p",null,"Once on-chain, most people will rely upon block explorers to interpret this information with a graphical user interface (GUI)."),(0,o.yg)("h2",{id:"sending-the-transaction-that-submits-your-governance-proposal"},"Sending the transaction that submits your governance proposal"),(0,o.yg)("p",null,"For information on how to use gaiad (the command line interface) to submit an on-chain proposal through the governance module, please refer to the ",(0,o.yg)("a",{parentName:"p",href:"../hub-tutorials/gaiad"},"gaiad CLI tutorials")," for the Cosmos Hub documentation."),(0,o.yg)("h3",{id:"proposal-types"},"Proposal types"),(0,o.yg)("p",null,"There are 2 proposal types that can be submitted to the CosmosHub governance module."),(0,o.yg)("h4",{id:"legacy-proposals-cosmos-sdk--v047"},"Legacy proposals (cosmos-sdk < v0.47)"),(0,o.yg)("p",null,"These proposals can be submitted using ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad tx gov submit-legacy-proposal"),"."),(0,o.yg)("p",null,"Available proposals that can be submitted using this Tx are:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"cancel-software-upgrade"),(0,o.yg)("li",{parentName:"ul"},"change-reward-denoms"),(0,o.yg)("li",{parentName:"ul"},"consumer-addition"),(0,o.yg)("li",{parentName:"ul"},"consumer-removal"),(0,o.yg)("li",{parentName:"ul"},"ibc-upgrade"),(0,o.yg)("li",{parentName:"ul"},"param-change (does not work for standard cosmos-sdk modules, works on IBC and ICS modules)"),(0,o.yg)("li",{parentName:"ul"},"software-upgrade"),(0,o.yg)("li",{parentName:"ul"},"update-client")),(0,o.yg)("p",null,"You can read more about submitting a legacy proposal in the ",(0,o.yg)("a",{parentName:"p",href:"https://docs.cosmos.network/v0.47/build/modules/gov#submit-legacy-proposal"},"cosmos-sdk docs")),(0,o.yg)("h4",{id:"proposals-cosmos-sdk--v047"},"Proposals (cosmos-sdk >= v0.47)"),(0,o.yg)("p",null,"These proposals can be submitted using ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad tx gov submit-proposal"),"."),(0,o.yg)("p",null,"Using ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad tx gov draft-proposal")," can help prepare a proposal. The tool will create a file containing the specified proposal message and it also helps with populating all the required proposal fields.\nYou can always edit the file after you create it using ",(0,o.yg)("inlineCode",{parentName:"p"},"draft-proposal")),(0,o.yg)("p",null,"Most cosmos-sdk modules allow changing their governance gated parameters using a ",(0,o.yg)("inlineCode",{parentName:"p"},"MsgUpdateParams")," which is a new way of updating governance parameters. It is important to note that ",(0,o.yg)("inlineCode",{parentName:"p"},"MsgUpdateParams")," requires ",(0,o.yg)("strong",{parentName:"p"},"all parameters to be specified")," in the proposal message."),(0,o.yg)("p",null,"You can read more about submitting a proposal in the ",(0,o.yg)("a",{parentName:"p",href:"https://docs.cosmos.network/v0.47/build/modules/gov#submit-proposal"},"cosmos-sdk docs")),(0,o.yg)("h4",{id:"minimal-deposit-amount"},"Minimal Deposit amount"),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},"Please note that cosmoshub-4 uses a minimum initial deposit amount.")),(0,o.yg)("p",null,"Proposals cannot be submitted successfully without providing a minimum initial deposit. In practice, this means that the ",(0,o.yg)("inlineCode",{parentName:"p"},"deposit")," field in your proposal has to meet the ",(0,o.yg)("inlineCode",{parentName:"p"},"min_initial_deposit")," governance parameter.\nThe minimum deposit is equal to ",(0,o.yg)("inlineCode",{parentName:"p"},"min_deposit * min_initial_deposit_ratio"),". Only ",(0,o.yg)("inlineCode",{parentName:"p"},"uatom")," is supported as deposit denom."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-shell"},'// checking the min_initial_deposit\ngaiad q gov params -o json\n{\n ...\n "params": {\n ...\n "min_deposit": [\n {\n "denom": "stake",\n "amount": "10000000"\n }\n ],\n "min_initial_deposit_ratio": "0.000000000000000000"\n}\n')),(0,o.yg)("h3",{id:"walkthrough-example-changing-xstaking-params"},"Walkthrough example (changing x/staking params)"),(0,o.yg)("p",null,"Let's illustrate how to change the ",(0,o.yg)("inlineCode",{parentName:"p"},"x/staking")," parameters."),(0,o.yg)("p",null,"The module has the following parameters (values don't reflect actual on-chain values):"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-shell"},'gaiad q staking params -o json\n{\n "unbonding_time": "86400s",\n "max_validators": 100,\n "max_entries": 7,\n "historical_entries": 10000,\n "bond_denom": "stake",\n "min_commission_rate": "0.000000000000000000",\n "validator_bond_factor": "-1.000000000000000000",\n "global_liquid_staking_cap": "1.000000000000000000",\n "validator_liquid_staking_cap": "1.000000000000000000"\n}\n')),(0,o.yg)("p",null,"We will use ",(0,o.yg)("inlineCode",{parentName:"p"},"draft-proposal")," to help us create a proposal file that we will later submit."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-shell"},"gaiad tx gov draft-proposal\n// running the command will start a terminal applet allowing you to choose the proposal type\n\n// 1st screen\nUse the arrow keys to navigate: \u2193 \u2191 \u2192 \u2190\n? Select proposal type:\n text\n community-pool-spend\n software-upgrade\n cancel-software-upgrade\n \u25b8 other // choose this\n\n// 2nd screen\n\u2714 other\nUse the arrow keys to navigate: \u2193 \u2191 \u2192 \u2190\n? Select proposal message type::\n\u2191 /cosmos.staking.v1beta1.MsgUndelegate\n \u25b8 /cosmos.staking.v1beta1.MsgUpdateParams // choose this option\n /cosmos.staking.v1beta1.MsgValidatorBond\n /cosmos.upgrade.v1beta1.MsgCancelUpgrade\n\u2193 /cosmos.upgrade.v1beta1.MsgSoftwareUpgrade\n")),(0,o.yg)("p",null,"After choosing the ",(0,o.yg)("inlineCode",{parentName:"p"},"/cosmos.staking.v1beta1.MsgUpdateParams")," message, the applet will allow you to set the message fields and some other proposal details.\nUpon completion, the proposal will be available in the directory where you called the ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," command inside the ",(0,o.yg)("inlineCode",{parentName:"p"},"draft_proposal.json")," file."),(0,o.yg)("p",null,"Here is an example of the ",(0,o.yg)("inlineCode",{parentName:"p"},"draft_proposal.json")," file:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-JSON"},'{\n "messages": [\n {\n "@type": "/cosmos.staking.v1beta1.MsgUpdateParams",\n "authority": "cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn",\n "params": {\n "unbonding_time": "86400s",\n "max_validators": 100,\n "max_entries": 7,\n "historical_entries": 10000,\n "bond_denom": "uatom",\n "min_commission_rate": "0.050000000000000000", // we are changing this from 0.000000000000000000\n "validator_bond_factor": "-1.000000000000000000",\n "global_liquid_staking_cap": "1.000000000000000000",\n "validator_liquid_staking_cap": "1.000000000000000000"\n }\n }\n ],\n "metadata": "ipfs://CID",\n "deposit": "1000000uatom",\n "title": "Updating the staking params (min_comission_rate)",\n "summary": "This proposal will attempt to update the min_commission_rate staking parameter. During proposal creation and submission **all** proposal fields must be specified. Pay attention that you don\'t unintentionally specify different values for fields that you did not intend to change."\n}\n')),(0,o.yg)("p",null,"Finally, we submit the proposal:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},"gaiad tx gov submit-proposal <path_to_proposal.json>\n --from <submitter address> \\\n --chain-id cosmoshub-4 \\\n --gas <max gas allocated> \\\n --fees <fees allocated> \\\n --node <node address> \\\n")),(0,o.yg)("p",null,"Use ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad tx gov --help")," to get more info about the CLI options, we will explain some options below:"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("inlineCode",{parentName:"li"},"--from")," is the account key that pays the transaction fee and deposit amount. This account key must be already saved in the keyring on your device and it must be an address you control (e.g. ",(0,o.yg)("inlineCode",{parentName:"li"},"--from hypha-dev-wallet"),")."),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("inlineCode",{parentName:"li"},"--gas")," is the maximum amount of gas permitted to be used to process the transaction (e.g. ",(0,o.yg)("inlineCode",{parentName:"li"},"--gas 500000"),").",(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},"The more content there is in the description of your proposal, the more gas your transaction will consume"),(0,o.yg)("li",{parentName:"ul"},"If this number isn't high enough and there isn't enough gas to process your transaction, the transaction will fail."),(0,o.yg)("li",{parentName:"ul"},"The transaction will only use the amount of gas needed to process the transaction."))),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("inlineCode",{parentName:"li"},"--fees")," is a flat-rate incentive for a validator to process your transaction.",(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},"Many nodes use a minimum fee to disincentivize transaction spamming."),(0,o.yg)("li",{parentName:"ul"},"7500uatom is equal to 0.0075 ATOM."))),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("inlineCode",{parentName:"li"},"--node")," is using an established node to send the transaction to the Cosmos Hub 4 network. For available nodes, please look at the ",(0,o.yg)("a",{parentName:"li",href:"https://github.com/cosmos/chain-registry/blob/master/cosmoshub/chain.json"},"Chain Registry"),".")),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Note"),": be careful what you use for ",(0,o.yg)("inlineCode",{parentName:"p"},"--fees"),". A mistake here could result in spending hundreds or thousands of ATOMs accidentally, which cannot be recovered."),(0,o.yg)("h3",{id:"verifying-your-transaction"},"Verifying your transaction"),(0,o.yg)("p",null,"After posting your transaction, your command line interface (gaiad) will provide you with the transaction's hash, which you can either query using gaiad or by searching the transaction hash using ",(0,o.yg)("a",{parentName:"p",href:"https://www.mintscan.io/cosmos/txs/0506447AE8C7495DE970736474451CF23536DF8EA837FAF1CF6286565589AB57"},"Mintscan"),". The hash should look something like this: ",(0,o.yg)("inlineCode",{parentName:"p"},"0506447AE8C7495DE970736474451CF23536DF8EA837FAF1CF6286565589AB57"),"."),(0,o.yg)("p",null,"Alternatively, you can check your Tx status and information using:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-shell"},"gaiad q tx <hash>\n")),(0,o.yg)("h3",{id:"troubleshooting-a-failed-transaction"},"Troubleshooting a failed transaction"),(0,o.yg)("p",null,"There are a number of reasons why a transaction may fail. Here are two examples:"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("strong",{parentName:"p"},"Running out of gas")," - The more data there is in a transaction, the more gas it will need to be processed. If you don't specify enough gas, the transaction will fail.")),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("strong",{parentName:"p"},"Incorrect denomination")," - You may have specified an amount in 'utom' or 'atom' instead of 'uatom', causing the transaction to fail."))),(0,o.yg)("p",null,"If you encounter a problem, try to troubleshoot it first, and then ask for help on the Cosmos Hub forum: ",(0,o.yg)("a",{parentName:"p",href:"https://forum.cosmos.network"},"https://forum.cosmos.network"),". We can learn from failed attempts and use them to improve upon this guide."),(0,o.yg)("h3",{id:"depositing-funds-after-a-proposal-has-been-submitted"},"Depositing funds after a proposal has been submitted"),(0,o.yg)("p",null,"Sometimes a proposal is submitted without having the minimum token amount deposited yet. In these cases you would want to be able to deposit more tokens to get the proposal into the voting stage. In order to deposit tokens, you'll need to know what your proposal ID is after you've submitted your proposal. You can query all proposals by the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},"gaiad q gov proposals\n")),(0,o.yg)("p",null,"If there are a lot of proposals on the chain already, you can also filter by your own address. For the proposal above, that would be:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},"gaiad q gov proposals --depositor cosmos1hxv7mpztvln45eghez6evw2ypcw4vjmsmr8cdx\n")),(0,o.yg)("p",null,"Once you have the proposal ID, this is the command to deposit extra tokens:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},"gaiad tx gov deposit <proposal-id> <deposit_amount> --from <name>\n")),(0,o.yg)("p",null,"The amount per deposit is equal to ",(0,o.yg)("inlineCode",{parentName:"p"},"min_deposit * min_deposit_ratio"),". Only ",(0,o.yg)("inlineCode",{parentName:"p"},"uatom")," is supported as deposit denom. Transactions where ",(0,o.yg)("inlineCode",{parentName:"p"},"deposit_amount < (min_deposit * min_deposit_ratio)")," will be rejected."),(0,o.yg)("h3",{id:"submitting-your-proposal-to-the-testnet"},"Submitting your proposal to the testnet"),(0,o.yg)("p",null,"Submitting to the testnet is identical to mainnet submissions aside from a few changes:"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"The chain-id is ",(0,o.yg)("inlineCode",{parentName:"li"},"theta-testnet-001"),"."),(0,o.yg)("li",{parentName:"ol"},"The list of usable endpoints can be found ",(0,o.yg)("a",{parentName:"li",href:"https://github.com/cosmos/testnets/tree/master/public#readme"},"here"),"."),(0,o.yg)("li",{parentName:"ol"},"You will need testnet tokens, not ATOM. There is a faucet available in the Developer ",(0,o.yg)("a",{parentName:"li",href:"https://discord.com/invite/cosmosnetwork"},"Discord"),".")),(0,o.yg)("p",null,"You may want to submit your proposal to the testnet chain before the mainnet for a number of reasons:"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"To see what the proposal description will look like."),(0,o.yg)("li",{parentName:"ol"},"To signal that your proposal is about to go live on the mainnet."),(0,o.yg)("li",{parentName:"ol"},"To share what the proposal will look like in advance with stakeholders."),(0,o.yg)("li",{parentName:"ol"},"To test the functionality of the governance features.")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/43353076.6fe88653.js b/assets/js/43353076.6fe88653.js new file mode 100644 index 00000000000..f95142bd9b9 --- /dev/null +++ b/assets/js/43353076.6fe88653.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[8606],{5680:(e,t,o)=>{o.d(t,{xA:()=>d,yg:()=>c});var r=o(6540);function i(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function n(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,r)}return o}function a(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?n(Object(o),!0).forEach((function(t){i(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):n(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}function s(e,t){if(null==e)return{};var o,r,i=function(e,t){if(null==e)return{};var o,r,i={},n=Object.keys(e);for(r=0;r<n.length;r++)o=n[r],t.indexOf(o)>=0||(i[o]=e[o]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r<n.length;r++)o=n[r],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(i[o]=e[o])}return i}var p=r.createContext({}),l=function(e){var t=r.useContext(p),o=t;return e&&(o="function"==typeof e?e(t):a(a({},t),e)),o},d=function(e){var t=l(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var o=e.components,i=e.mdxType,n=e.originalType,p=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=l(o),h=i,c=u["".concat(p,".").concat(h)]||u[h]||g[h]||n;return o?r.createElement(c,a(a({ref:t},d),{},{components:o})):r.createElement(c,a({ref:t},d))}));function c(e,t){var o=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=o.length,a=new Array(n);a[0]=h;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[u]="string"==typeof e?e:i,a[1]=s;for(var l=2;l<n;l++)a[l]=o[l];return r.createElement.apply(null,a)}return r.createElement.apply(null,o)}h.displayName="MDXCreateElement"},7574:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>g,frontMatter:()=>n,metadata:()=>s,toc:()=>l});var r=o(8168),i=(o(6540),o(5680));const n={title:"On-Chain Proposal Process",order:2},a=void 0,s={unversionedId:"governance/process",id:"governance/process",title:"On-Chain Proposal Process",description:"Governance Parameters",source:"@site/docs/governance/process.md",sourceDirName:"governance",slug:"/governance/process",permalink:"/main/governance/process",draft:!1,tags:[],version:"current",frontMatter:{title:"On-Chain Proposal Process",order:2},sidebar:"tutorialSidebar",previous:{title:"Formatting a Proposal",permalink:"/main/governance/formatting"},next:{title:"Submitting a Proposal",permalink:"/main/governance/submitting"}},p={},l=[{value:"Governance Parameters",id:"governance-parameters",level:2},{value:"1. Deposit Period",id:"1-deposit-period",level:2},{value:"Deposits",id:"deposits",level:3},{value:"Burned deposits",id:"burned-deposits",level:3},{value:"2. Voting Period",id:"2-voting-period",level:2},{value:"What do the voting options mean?",id:"what-do-the-voting-options-mean",level:3},{value:"What determines whether or not a governance proposal passes?",id:"what-determines-whether-or-not-a-governance-proposal-passes",level:3},{value:"How is quorum determined?",id:"how-is-quorum-determined",level:3},{value:"How is voting tallied?",id:"how-is-voting-tallied",level:3}],d={toc:l},u="wrapper";function g(e){let{components:t,...o}=e;return(0,i.yg)(u,(0,r.A)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,i.yg)("h2",{id:"governance-parameters"},"Governance Parameters"),(0,i.yg)("p",null,"Several of the numbers involved in governance are parameters and can thus be changed by passing a parameter change proposal. "),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},"Minimum deposit: 250 ATOM"),(0,i.yg)("li",{parentName:"ul"},"Maximum deposit period: 14 days"),(0,i.yg)("li",{parentName:"ul"},"Voting period: 14 days"),(0,i.yg)("li",{parentName:"ul"},"Quorum: 40% of participating voting power"),(0,i.yg)("li",{parentName:"ul"},"Pass threshold: 50% of participating voting power"),(0,i.yg)("li",{parentName:"ul"},"Veto threshold: 33.40% of participating voting power")),(0,i.yg)("h2",{id:"1-deposit-period"},"1. Deposit Period"),(0,i.yg)("p",null,"The deposit period lasts either 14 days or until the proposal deposit totals 250 ATOMs, whichever happens first. "),(0,i.yg)("h3",{id:"deposits"},"Deposits"),(0,i.yg)("p",null,"Prior to a governance proposal entering the voting period (i.e., for the proposal to be voted upon), there must be at least a minimum number of ATOMs deposited (250). Anyone may contribute to this deposit, though it is usually filled by the proposal maker. Deposits of passed and failed proposals are returned to the contributors."),(0,i.yg)("p",null,"In the past, different people have considered contributions amounts differently. There is some consensus that this should be a personal choice. There is also some consensus that this can be an opportunity for supporters to signal their support by adding to the deposit amount, so a proposer may choose to leave contribution room (i.e., a deposit below 250 ATOMs) so that others may participate. It is important to remember that any contributed ATOMs are at risk of being burned."),(0,i.yg)("h3",{id:"burned-deposits"},"Burned deposits"),(0,i.yg)("p",null,"Deposits are burned only when proposals are vetoed as documented in the ",(0,i.yg)("a",{parentName:"p",href:"https://docs.cosmos.network/main/modules/gov#deposit-refund-and-burn"},"Cosmos SDK gov module spec"),". Deposits are not burned for failing to meet quorum or for being rejected. "),(0,i.yg)("h2",{id:"2-voting-period"},"2. Voting Period"),(0,i.yg)("p",null,"The voting period is currently a fixed 14-day period. During the voting period, participants may select a vote of either 'Yes', 'No', 'Abstain', or 'NoWithVeto'. Voters may change their vote at any time before the voting period ends. "),(0,i.yg)("h3",{id:"what-do-the-voting-options-mean"},"What do the voting options mean?"),(0,i.yg)("ol",null,(0,i.yg)("li",{parentName:"ol"},(0,i.yg)("strong",{parentName:"li"},"Abstain:")," The voter wishes to contribute to quorum without voting for or against a proposal."),(0,i.yg)("li",{parentName:"ol"},(0,i.yg)("strong",{parentName:"li"},"Yes:")," Approval of the proposal in its current form."),(0,i.yg)("li",{parentName:"ol"},(0,i.yg)("strong",{parentName:"li"},"No:")," Disapproval of the proposal in its current form."),(0,i.yg)("li",{parentName:"ol"},(0,i.yg)("strong",{parentName:"li"},"NoWithVeto:")," A \u2018NoWithVeto\u2019 vote indicates a proposal either (1) is deemed to be spam, i.e., irrelevant to Cosmos Hub, (2) disproportionately infringes on minority interests, or (3) violates or encourages violation of the rules of engagement as currently set out by Cosmos Hub governance.")),(0,i.yg)("p",null,"As accepted by the community in ",(0,i.yg)("a",{parentName:"p",href:"https://ipfs.io/ipfs/QmVHVH9WeGy9tTNN9dViqvDn7N79XJJUseKXD1rpyLVckK"},"Proposal 75"),", voters are expected to vote 'NoWithVeto' for proposals that are spam, infringe on minority interests, or violate the rules of engagement (i.e., Social protocols which have passed governance and thus been accepted as rules on the Hub). This proposal was an extension of the ideas put forward in ",(0,i.yg)("a",{parentName:"p",href:"https://ipfs.io/ipfs/QmRtR7qkeaZCpCzHDwHgJeJAZdTrbmHLxFDYXhw7RoF1pp"},"Proposal 6"),"."),(0,i.yg)("p",null,"Voting 'NoWithVeto' has no immediate additional financial cost to the voter - you do not directly risk your ATOM by using this option."),(0,i.yg)("h3",{id:"what-determines-whether-or-not-a-governance-proposal-passes"},"What determines whether or not a governance proposal passes?"),(0,i.yg)("p",null,"There are four criteria:"),(0,i.yg)("ol",null,(0,i.yg)("li",{parentName:"ol"},"Deposit is filled: A minimum deposit of 250 ATOM is required for the proposal to enter the voting period",(0,i.yg)("ul",{parentName:"li"},(0,i.yg)("li",{parentName:"ul"},"anyone may contribute to this deposit"),(0,i.yg)("li",{parentName:"ul"},"the deposit must be reached within 14 days (this is the deposit period)"))),(0,i.yg)("li",{parentName:"ol"},"Quorum is reached: A minimum of 40% of the network's total voting power (staked ATOM) is required to participate "),(0,i.yg)("li",{parentName:"ol"},"Simple majority of 'Yes' votes: Greater than 50% of the participating voting power must back the 'Yes' vote by the end of the 14-day voting period"),(0,i.yg)("li",{parentName:"ol"},"Not vetoed: Less than 33.4% of participating voting power must have backed 'NoWithVeto' by the end of the 14-day voting period")),(0,i.yg)("p",null,"Currently, the criteria for submitting and passing/failing all proposal types is the same."),(0,i.yg)("h3",{id:"how-is-quorum-determined"},"How is quorum determined?"),(0,i.yg)("p",null,"Voting power, whether backing a vote of 'Yes', 'Abstain', 'No', or 'NoWithVeto', counts toward quorum. Quorum is required for the outcome of a governance proposal vote to be considered valid and for deposit contributors to recover their deposit amounts. "),(0,i.yg)("h3",{id:"how-is-voting-tallied"},"How is voting tallied?"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Total voting power")," refers to all staked ATOM at the end of the 14-day voting period. Liquid ATOMs are not part of the total voting power and thus cannot participate in voting. "),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Participating voting power")," refers to only the ATOM which have been used to cast a vote on a particular proposal. Quorum is set to 40% of the ",(0,i.yg)("strong",{parentName:"li"},"participating")," voting power.")),(0,i.yg)("p",null,"Validators not in the active set can cast a vote, but their voting power (including the backing of their delegators) will not count toward the vote if they are not in the active set ",(0,i.yg)("strong",{parentName:"p"},"when the voting period ends"),". That means that if ATOM is delegated to a validator that is jailed, tombstoned, or outside of the active set at the time that the voting period ends, that ATOM's stake-weight will not count in the vote."),(0,i.yg)("p",null,"Though a simple majority 'Yes' vote (ie. 50% of participating voting power) is required for a governance proposal vote to pass, a 'NoWithVeto' vote of 33.4% of participating voting power or greater can override this outcome and cause the proposal to fail. This enables a minority group representing greater than 1/3 of participating voting power to fail a proposal that would otherwise pass."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/446bc915.c89b5aa8.js b/assets/js/446bc915.c89b5aa8.js new file mode 100644 index 00000000000..d8c8ce14749 --- /dev/null +++ b/assets/js/446bc915.c89b5aa8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[6745],{5680:(e,t,r)=>{r.d(t,{xA:()=>l,yg:()=>m});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?s(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function a(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},l=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,s=e.originalType,c=e.parentName,l=a(e,["components","mdxType","originalType","parentName"]),p=u(r),f=o,m=p["".concat(c,".").concat(f)]||p[f]||h[f]||s;return r?n.createElement(m,i(i({ref:t},l),{},{components:r})):n.createElement(m,i({ref:t},l))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=r.length,i=new Array(s);i[0]=f;var a={};for(var c in t)hasOwnProperty.call(t,c)&&(a[c]=t[c]);a.originalType=e,a[p]="string"==typeof e?e:o,i[1]=a;for(var u=2;u<s;u++)i[u]=r[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},2773:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>u});var n=r(8168),o=(r(6540),r(5680));const s={title:"Cosmos Hub Archives",order:2},i=void 0,a={unversionedId:"resources/archives",id:"resources/archives",title:"Cosmos Hub Archives",description:"With each breaking upgrade of the Cosmos Hub, the network is restarted at height 0. During this process, an export of the last state of the previous network is made to produce the genesis state of the new one.",source:"@site/docs/resources/archives.md",sourceDirName:"resources",slug:"/resources/archives",permalink:"/main/resources/archives",draft:!1,tags:[],version:"current",frontMatter:{title:"Cosmos Hub Archives",order:2},sidebar:"tutorialSidebar",previous:{title:"Resources",permalink:"/main/resources/"},next:{title:"The Genesis File",permalink:"/main/resources/genesis"}},c={},u=[{value:"Big Dipper",id:"big-dipper",level:3}],l={toc:u},p="wrapper";function h(e){let{components:t,...r}=e;return(0,o.yg)(p,(0,n.A)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("p",null,"With each breaking upgrade of the Cosmos Hub, the network is restarted at height 0. During this process, an export of the last state of the previous network is made to produce the genesis state of the new one."),(0,o.yg)("p",null,"As a result, the blocks of the previous networks are not downloaded by new clients (as they sync from the new genesis state), and may be deleted by existing full-nodes."),(0,o.yg)("p",null,"In an effort to maintain transparency, the interchain hosts archives of the previous versions of the Cosmos Hub network. These archives can be found ",(0,o.yg)("a",{parentName:"p",href:"https://archive.interchain.io/"},"here"),"."),(0,o.yg)("p",null,"If you would like to search explorers for previous hub data, these are some links where you can find the information:"),(0,o.yg)("h3",{id:"big-dipper"},"Big Dipper"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://cosmoshub-1.bigdipper.live/"},"Cosmos Hub 1")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://cosmoshub-2.bigdipper.live/"},"Cosmos Hub 2")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://cosmoshub-3.bigdipper.live/"},"Cosmos Hub 3"))),(0,o.yg)("p",null,"If you want to make archives available to the community, feel free to open a PR to this file and add them."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4b7d5026.a025ab50.js b/assets/js/4b7d5026.a025ab50.js new file mode 100644 index 00000000000..cd606e3d944 --- /dev/null +++ b/assets/js/4b7d5026.a025ab50.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[7915],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>g});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=s(r),h=a,g=d["".concat(l,".").concat(h)]||d[h]||p[h]||i;return r?n.createElement(g,o(o({ref:t},u),{},{components:r})):n.createElement(g,o({ref:t},u))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=h;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[d]="string"==typeof e?e:a,o[1]=c;for(var s=2;s<i;s++)o[s]=r[s];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}h.displayName="MDXCreateElement"},1928:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var n=r(8168),a=(r(6540),r(5680));const i={title:"Architecture Decision Records (ADR)",order:1},o=void 0,c={unversionedId:"architecture/README",id:"architecture/README",title:"Architecture Decision Records (ADR)",description:"This is a location to record all high-level architecture decisions for new feature and module proposals in the Cosmos Hub.",source:"@site/docs/architecture/README.md",sourceDirName:"architecture",slug:"/architecture/",permalink:"/main/architecture/",draft:!1,tags:[],version:"current",frontMatter:{title:"Architecture Decision Records (ADR)",order:1},sidebar:"tutorialSidebar",previous:{title:"Service Providers",permalink:"/main/resources/service-providers"},next:{title:"ADR Creation Process",permalink:"/main/architecture/adr/PROCESS"}},l={},s=[{value:"Rationale",id:"rationale",level:2},{value:"Creating new ADR",id:"creating-new-adr",level:2},{value:"Use RFC 2119 Keywords",id:"use-rfc-2119-keywords",level:3},{value:"ADR Table of Contents",id:"adr-table-of-contents",level:2},{value:"Accepted",id:"accepted",level:3},{value:"Proposed",id:"proposed",level:3},{value:"Draft",id:"draft",level:3},{value:"Rejected",id:"rejected",level:3},{value:"Deprecated",id:"deprecated",level:3}],u={toc:s},d="wrapper";function p(e){let{components:t,...r}=e;return(0,a.yg)(d,(0,n.A)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("p",null,"This is a location to record all high-level architecture decisions for new feature and module proposals in the Cosmos Hub."),(0,a.yg)("p",null,"An Architectural Decision (",(0,a.yg)("strong",{parentName:"p"},"AD"),") is a software design choice that addresses a functional or non-functional requirement that is architecturally significant.\nAn Architecturally Significant Requirement (",(0,a.yg)("strong",{parentName:"p"},"ASR"),") is a requirement that has a measurable effect on a software system\u2019s architecture and quality.\nAn Architectural Decision Record (",(0,a.yg)("strong",{parentName:"p"},"ADR"),") captures a single AD, such as often done when writing personal notes or meeting minutes; the collection of ADRs created and maintained in a project constitute its decision log. All these are within the topic of Architectural Knowledge Management (AKM)."),(0,a.yg)("p",null,"You can read more about the ADR concept ",(0,a.yg)("a",{parentName:"p",href:"https://adr.github.io/"},"here"),"."),(0,a.yg)("h2",{id:"rationale"},"Rationale"),(0,a.yg)("p",null,"ADRs are intended to be the primary mechanism for proposing new feature designs and new processes, for collecting community input on an issue, and for documenting the design decisions.\nAn ADR should provide:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Context on the relevant goals and the current state"),(0,a.yg)("li",{parentName:"ul"},"Proposed changes to achieve the goals"),(0,a.yg)("li",{parentName:"ul"},"Summary of pros and cons"),(0,a.yg)("li",{parentName:"ul"},"Discarded solution spaces and why they were discarded"),(0,a.yg)("li",{parentName:"ul"},"References"),(0,a.yg)("li",{parentName:"ul"},"Changelog")),(0,a.yg)("p",null,"Note the distinction between an ADR and a spec. The ADR provides the context, intuition, reasoning, and\njustification for a change in architecture, or for the architecture of something\nnew. The spec is much more compressed and streamlined summary of everything as\nit stands today."),(0,a.yg)("p",null,"If recorded decisions turn out to be lacking, convene a discussion, record the new decisions here, and then modify the code to match."),(0,a.yg)("h2",{id:"creating-new-adr"},"Creating new ADR"),(0,a.yg)("p",null,"Read about the ",(0,a.yg)("a",{parentName:"p",href:"/main/architecture/PROCESS"},"PROCESS"),"."),(0,a.yg)("h3",{id:"use-rfc-2119-keywords"},"Use RFC 2119 Keywords"),(0,a.yg)("p",null,'When writing ADRs, follow the same best practices for writing RFCs.\nWhen writing RFCs, key words are used to signify the requirements in the specification.\nThese words are often capitalized: "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL.\nThey are to be interpreted as described in ',(0,a.yg)("a",{parentName:"p",href:"https://datatracker.ietf.org/doc/html/rfc2119"},"RFC 2119"),"."),(0,a.yg)("h2",{id:"adr-table-of-contents"},"ADR Table of Contents"),(0,a.yg)("h3",{id:"accepted"},"Accepted"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"n/a")),(0,a.yg)("h3",{id:"proposed"},"Proposed"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"n/a")),(0,a.yg)("h3",{id:"draft"},"Draft"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"n/a")),(0,a.yg)("h3",{id:"rejected"},"Rejected"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/architecture/adr/adr-001-interchain-accounts"},"ADR 001: Interchain Accounts"))),(0,a.yg)("h3",{id:"deprecated"},"Deprecated"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/architecture/adr/adr-002-globalfee"},"ADR 002: Globalfee Module"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4bf737c3.30a03efb.js b/assets/js/4bf737c3.30a03efb.js new file mode 100644 index 00000000000..b53c4968965 --- /dev/null +++ b/assets/js/4bf737c3.30a03efb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[4704],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),s=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=s(r),f=a,d=c["".concat(u,".").concat(f)]||c[f]||m[f]||i;return r?n.createElement(d,o(o({ref:t},p),{},{components:r})):n.createElement(d,o({ref:t},p))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=f;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:a,o[1]=l;for(var s=2;s<i;s++)o[s]=r[s];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},2456:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=r(8168),a=(r(6540),r(5680));const i={title:"Gaia Tutorials",order:1},o=void 0,l={unversionedId:"hub-tutorials/README",id:"hub-tutorials/README",title:"Gaia Tutorials",description:"This folder contains tutorials related to the gaiad application.",source:"@site/docs/hub-tutorials/README.md",sourceDirName:"hub-tutorials",slug:"/hub-tutorials/",permalink:"/main/hub-tutorials/",draft:!1,tags:[],version:"current",frontMatter:{title:"Gaia Tutorials",order:1},sidebar:"tutorialSidebar",previous:{title:"System requirements",permalink:"/main/getting-started/system-requirements"},next:{title:"Interacting with Gaiad (CLI)",permalink:"/main/hub-tutorials/gaiad"}},u={},s=[],p={toc:s},c="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(c,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("p",null,"This folder contains tutorials related to the ",(0,a.yg)("inlineCode",{parentName:"p"},"gaiad")," application."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/hub-tutorials/gaiad"},"Interacting with the ",(0,a.yg)("inlineCode",{parentName:"a"},"gaiad")," binary")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/hub-tutorials/join-mainnet"},"Running a full-node for the Cosmos Hub Mainnet")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/hub-tutorials/join-testnet"},"Running a full-node for a ",(0,a.yg)("inlineCode",{parentName:"a"},"gaia")," testnet")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/hub-tutorials/upgrade-node"},"Upgrading a node from a previous version")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/hub-tutorials/live-upgrade-tutorial"},"Creating an upgrade governance proposal"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4e1cbcac.8af50437.js b/assets/js/4e1cbcac.8af50437.js new file mode 100644 index 00000000000..573d339e8b0 --- /dev/null +++ b/assets/js/4e1cbcac.8af50437.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[791],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>h});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var c=n.createContext({}),s=function(e){var t=n.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,c=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=s(a),m=r,h=p["".concat(c,".").concat(m)]||p[m]||d[m]||i;return a?n.createElement(h,o(o({ref:t},u),{},{components:a})):n.createElement(h,o({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[p]="string"==typeof e?e:r,o[1]=l;for(var s=2;s<i;s++)o[s]=a[s];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},5558:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=a(8168),r=(a(6540),a(5680));const i={},o=void 0,l={unversionedId:"architecture/adr/adr-001-interchain-accounts",id:"architecture/adr/adr-001-interchain-accounts",title:"adr-001-interchain-accounts",description:"\x3c!--",source:"@site/docs/architecture/adr/adr-001-interchain-accounts.md",sourceDirName:"architecture/adr",slug:"/architecture/adr/adr-001-interchain-accounts",permalink:"/main/architecture/adr/adr-001-interchain-accounts",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"README",permalink:"/main/architecture/adr/"},next:{title:"ADR 002: Globalfee Module",permalink:"/main/architecture/adr/adr-002-globalfee"}},c={},s=[{value:"Changelog",id:"changelog",level:2},{value:"Status",id:"status",level:2},{value:"Abstract",id:"abstract",level:2},{value:"Rationale",id:"rationale",level:2},{value:"Desired Outcome",id:"desired-outcome",level:2},{value:"Consequences",id:"consequences",level:2},{value:"Backwards Compatibility",id:"backwards-compatibility",level:4},{value:"Forward Compatibility",id:"forward-compatibility",level:4},{value:"Technical Specification",id:"technical-specification",level:2},{value:"Development",id:"development",level:2},{value:"Governance optional",id:"governance-optional",level:2},{value:"Project Integrations optional",id:"project-integrations-optional",level:2},{value:"Downstream User Impact Report",id:"downstream-user-impact-report",level:4},{value:"Upstream Partner Impact Report",id:"upstream-partner-impact-report",level:4},{value:"Inter-module Dependence Report",id:"inter-module-dependence-report",level:4},{value:"Support",id:"support",level:2},{value:"Additional Research & References",id:"additional-research--references",level:2}],u={toc:s},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"adr-001-interchain-accounts"},"ADR 001: Interchain Accounts"),(0,r.yg)("h2",{id:"changelog"},"Changelog"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"2022-02-04: added content"),(0,r.yg)("li",{parentName:"ul"},"2022-01-19: init"),(0,r.yg)("li",{parentName:"ul"},"2023-06-28: mark as rejected")),(0,r.yg)("h2",{id:"status"},"Status"),(0,r.yg)("p",null,"REJECTED Not Implemented"),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Reason:")," The IBC team decided to integrate this functionality directly into their codebase and maintain it, because multiple users require it. "),(0,r.yg)("h2",{id:"abstract"},"Abstract"),(0,r.yg)("p",null,'This is the Core Interchain Accounts Module. It allows the Cosmos Hub to act as a host chain with interchain accounts that are controlled by external IBC connected "Controller" blockchains. Candidate chains include Umee, Quicksilver, Sommelier. It is also a necessary component for a Authentication Module that allows the Cosmos Hub to act as a Controller chain as well. This will be recorded in a separate ADR.'),(0,r.yg)("h2",{id:"rationale"},"Rationale"),(0,r.yg)("p",null,"This allows the Hub to participate in advanced cross-chain defi operations, like Liquid Staking and various protocol controlled value applications."),(0,r.yg)("h2",{id:"desired-outcome"},"Desired Outcome"),(0,r.yg)("p",null,"The hub can be used trustlessly as a host chain in the configuration of Interchain Accounts."),(0,r.yg)("h2",{id:"consequences"},"Consequences"),(0,r.yg)("p",null,'There has been preliminary work done to understand if this increases any security feature of the Cosmos Hub. One thought was that this capability is similar to contract to contract interactions which are possible on virtual machine blockchains like EVM chains. Those interactions introduced a new attack vector, called a re-entrancy bug, which was the culprit of "The DAO hack on Ethereum". We believe there is no risk of these kinds of attacks with Interchain Accounts because they require the interactions to be atomic and Interchain Accounts are asynchronous.'),(0,r.yg)("h4",{id:"backwards-compatibility"},"Backwards Compatibility"),(0,r.yg)("p",null,"This is the first of its kind."),(0,r.yg)("h4",{id:"forward-compatibility"},"Forward Compatibility"),(0,r.yg)("p",null,"There are future releases of Interchain Accounts which are expected to be backwards compatible."),(0,r.yg)("h2",{id:"technical-specification"},"Technical Specification"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/cosmos/ibc/blob/master/spec/app/ics-027-interchain-accounts/README.md"},"ICS-27 Spec")),(0,r.yg)("h2",{id:"development"},"Development"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Integration requirements",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"Development has occurred in ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/cosmos/ibc-go"},"IBC-go")," and progress tracked on the project board there."))),(0,r.yg)("li",{parentName:"ul"},"Testing (Simulations, Core Team Testing, Partner Testing)",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"Simulations and Core Team tested this module"))),(0,r.yg)("li",{parentName:"ul"},"Audits (Internal Dev review, Third-party review, Bug Bounty)",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"An internal audit, an audit from Informal Systems, and an audit from Trail of Bits all took place with fixes made to all findings."))),(0,r.yg)("li",{parentName:"ul"},"Networks (Testnets, Productionnets, Mainnets)",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"Testnets")))),(0,r.yg)("h2",{id:"governance-optional"},"Governance ","[optional]"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"Needs Signaling Proposal")),(0,r.yg)("li",{parentName:"ul"},"Core Community Governance",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"N/A"))),(0,r.yg)("li",{parentName:"ul"},"Steering Community",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"N/A. Possibly Aditya Srinpal, Sean King, Bez?"))),(0,r.yg)("li",{parentName:"ul"},"Timelines & Roadmap",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"Expected to be released as part of IBC 3.0 in Feb 2022 (currently in ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/cosmos/ibc-go/releases/tag/v3.0.0-beta1"},"beta release"),")")))),(0,r.yg)("h2",{id:"project-integrations-optional"},"Project Integrations ","[optional]"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Gaia Integrations",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"https://github.com/cosmos/gaia/pull/1150"},"PR")))),(0,r.yg)("li",{parentName:"ul"},"Integration Partner",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"IBC Team")))),(0,r.yg)("h4",{id:"downstream-user-impact-report"},"Downstream User Impact Report"),(0,r.yg)("p",null,"(Needs to be created)"),(0,r.yg)("h4",{id:"upstream-partner-impact-report"},"Upstream Partner Impact Report"),(0,r.yg)("p",null,"(Needs to be created)"),(0,r.yg)("h4",{id:"inter-module-dependence-report"},"Inter-module Dependence Report"),(0,r.yg)("p",null,"(Needs to be created)"),(0,r.yg)("h2",{id:"support"},"Support"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://ibc.cosmos.network/main/apps/interchain-accounts/overview.html"},"Documentation")),(0,r.yg)("h2",{id:"additional-research--references"},"Additional Research & References"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"https://medium.com/chainapsis/why-interchain-accounts-change-everything-for-cosmos-interoperability-59c19032bf11"},"Why Interchain Accounts Change Everything for Cosmos Interoperability")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"https://github.com/cosmos/interchain-accounts"},"Interchain Account Auth Module Demo Repo"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/54f44165.2dc69c8d.js b/assets/js/54f44165.2dc69c8d.js new file mode 100644 index 00000000000..5e130775936 --- /dev/null +++ b/assets/js/54f44165.2dc69c8d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[7924],{5680:(e,a,t)=>{t.d(a,{xA:()=>p,yg:()=>c});var n=t(6540);function i(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function l(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function r(e){for(var a=1;a<arguments.length;a++){var t=null!=arguments[a]?arguments[a]:{};a%2?l(Object(t),!0).forEach((function(a){i(e,a,t[a])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):l(Object(t)).forEach((function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(t,a))}))}return e}function o(e,a){if(null==e)return{};var t,n,i=function(e,a){if(null==e)return{};var t,n,i={},l=Object.keys(e);for(n=0;n<l.length;n++)t=l[n],a.indexOf(t)>=0||(i[t]=e[t]);return i}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)t=l[n],a.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var s=n.createContext({}),g=function(e){var a=n.useContext(s),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},p=function(e){var a=g(e.components);return n.createElement(s.Provider,{value:a},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},m=n.forwardRef((function(e,a){var t=e.components,i=e.mdxType,l=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=g(t),m=i,c=u["".concat(s,".").concat(m)]||u[m]||d[m]||l;return t?n.createElement(c,r(r({ref:a},p),{},{components:t})):n.createElement(c,r({ref:a},p))}));function c(e,a){var t=arguments,i=a&&a.mdxType;if("string"==typeof e||i){var l=t.length,r=new Array(l);r[0]=m;var o={};for(var s in a)hasOwnProperty.call(a,s)&&(o[s]=a[s]);o.originalType=e,o[u]="string"==typeof e?e:i,r[1]=o;for(var g=2;g<l;g++)r[g]=t[g];return n.createElement.apply(null,r)}return n.createElement.apply(null,t)}m.displayName="MDXCreateElement"},9241:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>s,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>g});var n=t(8168),i=(t(6540),t(5680));const l={title:"Installing Gaia",sidebar_position:2},r=void 0,o={unversionedId:"getting-started/installation",id:"getting-started/installation",title:"Installing Gaia",description:"This guide will explain how to install the gaiad binary and run the cli. With this binary installed on a server, you can participate on the mainnet as either a Full Node or a Validator.",source:"@site/docs/getting-started/installation.md",sourceDirName:"getting-started",slug:"/getting-started/installation",permalink:"/main/getting-started/installation",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Installing Gaia",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"What is Gaia?",permalink:"/main/getting-started/what-is-gaia"},next:{title:"Quick Start - Join Mainnet",permalink:"/main/getting-started/quickstart"}},s={},g=[{value:"Build Requirements",id:"build-requirements",level:2},{value:"Build Tools",id:"build-tools",level:2},{value:"Install Go",id:"install-go",level:2},{value:"Install the binaries",id:"install-the-binaries",level:2},{value:"Docker",id:"docker",level:2},{value:"Static linking",id:"static-linking",level:2},{value:"Build Tags",id:"build-tags",level:3},{value:"Work with a Cosmos SDK Clone",id:"work-with-a-cosmos-sdk-clone",level:2},{value:"Next",id:"next",level:2}],p={toc:g},u="wrapper";function d(e){let{components:a,...t}=e;return(0,i.yg)(u,(0,n.A)({},p,t,{components:a,mdxType:"MDXLayout"}),(0,i.yg)("p",null,"This guide will explain how to install the ",(0,i.yg)("inlineCode",{parentName:"p"},"gaiad")," binary and run the cli. With this binary installed on a server, you can participate on the mainnet as either a ",(0,i.yg)("a",{parentName:"p",href:"/main/hub-tutorials/join-mainnet"},"Full Node")," or a ",(0,i.yg)("a",{parentName:"p",href:"/main/validators/validator-setup"},"Validator"),"."),(0,i.yg)("h2",{id:"build-requirements"},"Build Requirements"),(0,i.yg)("p",null,"At present, the SDK fully supports installation on linux distributions. For the purpose of this instruction set, we'll be using ",(0,i.yg)("inlineCode",{parentName:"p"},"Ubuntu 22.04 LTS"),". It is also possible to install ",(0,i.yg)("inlineCode",{parentName:"p"},"gaiad")," on Unix, while Windows may require additional unsupported third party installation. All steps are listed below for a clean install."),(0,i.yg)("ol",null,(0,i.yg)("li",{parentName:"ol"},(0,i.yg)("a",{parentName:"li",href:"#build-tools"},"Update & install build tools")),(0,i.yg)("li",{parentName:"ol"},(0,i.yg)("a",{parentName:"li",href:"#install-go"},"Install Go")),(0,i.yg)("li",{parentName:"ol"},(0,i.yg)("a",{parentName:"li",href:"#install-the-binaries"},"Install ",(0,i.yg)("inlineCode",{parentName:"a"},"Gaiad")," binaries"))),(0,i.yg)("h2",{id:"build-tools"},"Build Tools"),(0,i.yg)("p",null,"Install ",(0,i.yg)("inlineCode",{parentName:"p"},"make")," and ",(0,i.yg)("inlineCode",{parentName:"p"},"gcc"),"."),(0,i.yg)("p",null,(0,i.yg)("strong",{parentName:"p"},"Ubuntu:")),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"sudo apt update\n\nsudo apt install -y make gcc build-essential\n")),(0,i.yg)("h2",{id:"install-go"},"Install Go"),(0,i.yg)("admonition",{type:"tip"},(0,i.yg)("p",{parentName:"admonition"},(0,i.yg)("strong",{parentName:"p"},"Go 1.22+")," is required.")),(0,i.yg)("p",null,"We suggest the following two ways to install Go. Check out the ",(0,i.yg)("a",{parentName:"p",href:"https://golang.org/doc/install"},"official docs")," and Go installer for the correct download for your operating system. Alternatively, you can install Go yourself from the command line. Detailed below are standard default installation locations, but feel free to customize."),(0,i.yg)("p",null,"Since the introduction of CosmWasm in Gaia v18 it is recommended to build the binaries with ",(0,i.yg)("inlineCode",{parentName:"p"},"CGO")," enabled - simply set ",(0,i.yg)("inlineCode",{parentName:"p"},"CGO_ENABLED=1")," in your terminal before building the binary."),(0,i.yg)("p",null,"Building the ",(0,i.yg)("inlineCode",{parentName:"p"},"gaiad")," binary on Windows is not supported due to ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/CosmWasm/wasmvm"},"dependency issues"),"."),(0,i.yg)("p",null,(0,i.yg)("strong",{parentName:"p"},(0,i.yg)("a",{parentName:"strong",href:"https://go.dev/dl/"},"Go Binary Downloads"))),(0,i.yg)("p",null,(0,i.yg)("strong",{parentName:"p"},"Ubuntu:")),(0,i.yg)("p",null,"At the time of this writing, the latest release is ",(0,i.yg)("inlineCode",{parentName:"p"},"1.22.3"),". We're going to download the tarball, extract it to ",(0,i.yg)("inlineCode",{parentName:"p"},"/usr/local"),", and export ",(0,i.yg)("inlineCode",{parentName:"p"},"GOROOT")," to our ",(0,i.yg)("inlineCode",{parentName:"p"},"$PATH")),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"curl -OL https://go.dev/dl/go1.22.3.darwin-amd64.tar.gz\n\nsudo tar -C /usr/local -xvf https://go.dev/dl/go1.22.3.darwin-amd64.tar.gz\n\n\nexport PATH=$PATH:/usr/local/go/bin\n\n")),(0,i.yg)("p",null,"Remember to add ",(0,i.yg)("inlineCode",{parentName:"p"},"GOPATH")," to your ",(0,i.yg)("inlineCode",{parentName:"p"},"$PATH")," environment variable. If you're not sure where that is, run ",(0,i.yg)("inlineCode",{parentName:"p"},"go env GOPATH"),". This will allow us to run the ",(0,i.yg)("inlineCode",{parentName:"p"},"gaiad")," binary in the next step. If you're not sure how to set your ",(0,i.yg)("inlineCode",{parentName:"p"},"$PATH")," take a look at ",(0,i.yg)("a",{parentName:"p",href:"https://superuser.com/questions/284342/what-are-path-and-other-environment-variables-and-how-can-i-set-or-use-them"},"these instructions"),"."),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"export PATH=$PATH:$(go env GOPATH)/bin\n")),(0,i.yg)("h2",{id:"install-the-binaries"},"Install the binaries"),(0,i.yg)("p",null,"Next, let's install the latest version of Gaia. Make sure you ",(0,i.yg)("inlineCode",{parentName:"p"},"git checkout")," the\ncorrect ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/cosmos/gaia/releases"},"released version"),"."),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"git clone -b <latest-release-tag> https://github.com/cosmos/gaia.git\ncd gaia && make install\n")),(0,i.yg)("p",null,"If this command fails due to the following error message, you might have already set ",(0,i.yg)("inlineCode",{parentName:"p"},"LDFLAGS")," prior to running this step."),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-sh"},"# github.com/cosmos/gaia/cmd/gaiad\nflag provided but not defined: -L\nusage: link [options] main.o\n...\nmake: *** [install] Error 2\n")),(0,i.yg)("p",null,"Unset this environment variable and try again."),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-sh"},'LDFLAGS="" make install\n')),(0,i.yg)("blockquote",null,(0,i.yg)("p",{parentName:"blockquote"},(0,i.yg)("em",{parentName:"p"},"NOTE"),": If you still have issues at this step, please check that you have the latest stable version of GO installed.")),(0,i.yg)("p",null,"That will install the ",(0,i.yg)("inlineCode",{parentName:"p"},"gaiad")," binary. Verify that everything installed successfully by running:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad version --long\n")),(0,i.yg)("p",null,"You should see something similar to the following:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"name: gaia\nserver_name: gaiad\nversion: v18.0.0\ncommit: 682770f2410ab0d33ac7f0c7203519d7a99fa2b6\nbuild_tags: netgo,ledger,muslc\ngo: go version go1.22.3 linux/amd64\n")),(0,i.yg)("h2",{id:"docker"},"Docker"),(0,i.yg)("p",null,(0,i.yg)("inlineCode",{parentName:"p"},"Dockerfile")," is available in the gaia repo."),(0,i.yg)("p",null,"Building:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-shell"},"git clone -b <latest-release-tag> https://github.com/cosmos/gaia.git\ncd gaia\ndocker build -t cosmos-ics:local -f Dockerfile ./\n")),(0,i.yg)("h2",{id:"static-linking"},"Static linking"),(0,i.yg)("p",null,"In case you need to build a binary with all dependencies statically linked please check our ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/cosmos/gaia/blob/main/Dockerfile"},"Dockerfile"),"."),(0,i.yg)("p",null,"You must have ",(0,i.yg)("inlineCode",{parentName:"p"},"libwasmvm")," available on your machine.\nChoose the build that matches your platform and OS:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"https://github.com/CosmWasm/wasmvm?tab=readme-ov-file#builds-of-libwasmvm"},"https://github.com/CosmWasm/wasmvm?tab=readme-ov-file#builds-of-libwasmvm"))),(0,i.yg)("p",null,"For more information, please check ",(0,i.yg)("inlineCode",{parentName:"p"},"wasmvm")," ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/CosmWasm/wasmvm"},"documentation"),"."),(0,i.yg)("h3",{id:"build-tags"},"Build Tags"),(0,i.yg)("p",null,"Build tags indicate special features that have been enabled in the binary."),(0,i.yg)("table",null,(0,i.yg)("thead",{parentName:"table"},(0,i.yg)("tr",{parentName:"thead"},(0,i.yg)("th",{parentName:"tr",align:null},"Build Tag"),(0,i.yg)("th",{parentName:"tr",align:null},"Description"))),(0,i.yg)("tbody",{parentName:"table"},(0,i.yg)("tr",{parentName:"tbody"},(0,i.yg)("td",{parentName:"tr",align:null},"netgo"),(0,i.yg)("td",{parentName:"tr",align:null},"Name resolution will use pure Go code")),(0,i.yg)("tr",{parentName:"tbody"},(0,i.yg)("td",{parentName:"tr",align:null},"ledger"),(0,i.yg)("td",{parentName:"tr",align:null},"Ledger devices are supported (hardware wallets)")),(0,i.yg)("tr",{parentName:"tbody"},(0,i.yg)("td",{parentName:"tr",align:null},"static_wasm/muslc"),(0,i.yg)("td",{parentName:"tr",align:null},"Used for statically linked wasmd dependencies")))),(0,i.yg)("h2",{id:"work-with-a-cosmos-sdk-clone"},"Work with a Cosmos SDK Clone"),(0,i.yg)("p",null,"To work with your own modifications of the Cosmos SDK, make a fork of this repo, and add a ",(0,i.yg)("inlineCode",{parentName:"p"},"replace")," clause to the ",(0,i.yg)("inlineCode",{parentName:"p"},"go.mod")," file.\nThe ",(0,i.yg)("inlineCode",{parentName:"p"},"replace")," clause you add to ",(0,i.yg)("inlineCode",{parentName:"p"},"go.mod")," must provide the correct import path."),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-shell"},"go mod edit -replace github.com/cosmos/cosmos-sdk=../cosmos-sdk\ngo mod tidy\nmake install # or make build\n")),(0,i.yg)("h2",{id:"next"},"Next"),(0,i.yg)("p",null,"Now you can ",(0,i.yg)("a",{parentName:"p",href:"../hub-tutorials/join-mainnet"},"join the mainnet"),", ",(0,i.yg)("a",{parentName:"p",href:"../hub-tutorials/join-testnet"},"the public testnet"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5d489d3c.f34e6f03.js b/assets/js/5d489d3c.f34e6f03.js new file mode 100644 index 00000000000..c6fdcaf042e --- /dev/null +++ b/assets/js/5d489d3c.f34e6f03.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[8257],{7757:s=>{s.exports=JSON.parse('{"name":"docusaurus-theme-search-algolia","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/5fd51807.8fef9132.js b/assets/js/5fd51807.8fef9132.js new file mode 100644 index 00000000000..83ba512c6d0 --- /dev/null +++ b/assets/js/5fd51807.8fef9132.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[6331],{5680:(e,n,t)=>{t.d(n,{xA:()=>s,yg:()=>h});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?o(Object(t),!0).forEach((function(n){r(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function p(e,n){if(null==e)return{};var t,a,r=function(e,n){if(null==e)return{};var t,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)t=o[a],n.indexOf(t)>=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)t=o[a],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var l=a.createContext({}),u=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},s=function(e){var n=u(e.components);return a.createElement(l.Provider,{value:n},e.children)},d="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},c=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),d=u(t),c=r,h=d["".concat(l,".").concat(c)]||d[c]||g[c]||o;return t?a.createElement(h,i(i({ref:n},s),{},{components:t})):a.createElement(h,i({ref:n},s))}));function h(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=c;var p={};for(var l in n)hasOwnProperty.call(n,l)&&(p[l]=n[l]);p.originalType=e,p[d]="string"==typeof e?e:r,i[1]=p;for(var u=2;u<o;u++)i[u]=t[u];return a.createElement.apply(null,i)}return a.createElement.apply(null,t)}c.displayName="MDXCreateElement"},7144:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>p,toc:()=>u});var a=t(8168),r=(t(6540),t(5680));const o={title:"Upgrading the Chain",order:6},i=void 0,p={unversionedId:"hub-tutorials/live-upgrade-tutorial",id:"hub-tutorials/live-upgrade-tutorial",title:"Upgrading the Chain",description:"This document demonstrates how a live upgrade can be performed on-chain through a",source:"@site/docs/hub-tutorials/live-upgrade-tutorial.md",sourceDirName:"hub-tutorials",slug:"/hub-tutorials/live-upgrade-tutorial",permalink:"/main/hub-tutorials/live-upgrade-tutorial",draft:!1,tags:[],version:"current",frontMatter:{title:"Upgrading the Chain",order:6},sidebar:"tutorialSidebar",previous:{title:"Joining Testnet",permalink:"/main/hub-tutorials/join-testnet"},next:{title:"Upgrading Your Node",permalink:"/main/hub-tutorials/upgrade-node"}},l={},u=[],s={toc:u},d="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(d,(0,a.A)({},s,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("p",null,"This document demonstrates how a live upgrade can be performed on-chain through a\ngovernance process."),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},"Start the network and trigger upgrade"),(0,r.yg)("pre",{parentName:"li"},(0,r.yg)("code",{parentName:"pre",className:"language-bash"},'# start a gaia application full-node\n$ gaiad start\n\n# set up the cli config\n$ gaiad config chain-id testing\n\n# create an upgrade governance proposal\n$ gaiad tx gov submit-proposal <path-to-proposal-json> --from <name-or-key>\n\nWhere proposal json file contains MsgSoftwareUpgrade e.g.\n`{\n "messages": [\n {\n "@type": "/cosmos.upgrade.v1beta1.MsgSoftwareUpgrade",\n "authority":"cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn" ,\n "plan": {\n "name": "plan name",\n "height": "1000" ,\n "info": "proposal info" ,\n "upgraded_client_state": null\n }\n }\n ],\n "metadata": "ipfs://CID",\n "deposit": "10000000stake",\n "title": "proposal title",\n "summary": "proposal summary"\n}`\n\n')))),(0,r.yg)("h1",{id:"once-the-proposal-passes-you-can-query-the-pending-plan"},"once the proposal passes you can query the pending plan"),(0,r.yg)("p",null," $ gaiad query upgrade plan"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},'\n2. Performing an upgrade\n\nAssuming the proposal passes the chain will stop at given upgrade height.\n\nYou can stop and start the original binary all you want, but **it will refuse to\nrun after the upgrade height**.\n\nWe need a new binary with the upgrade handler installed. The logs should look\nsomething like:\n\n```bash\nE[2019-11-05|12:44:18.913] UPGRADE "<plan-name>" NEEDED at height: <desired-upgrade-height>: module=main\nE[2019-11-05|12:44:18.914] CONSENSUS FAILURE!!!\n...\n')),(0,r.yg)("p",null," Note that the process will hang indefinitely (doesn't exit to avoid restart loops). So, you must\nmanually kill the process and replace it with a new binary. Do so now with ",(0,r.yg)("inlineCode",{parentName:"p"},"Ctrl+C")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"killall gaiad"),"."),(0,r.yg)("p",null," In ",(0,r.yg)("inlineCode",{parentName:"p"},"gaia/app/app.go"),", after ",(0,r.yg)("inlineCode",{parentName:"p"},"upgrade.Keeper")," is initialized and set in the app, set the\ncorresponding upgrade ",(0,r.yg)("inlineCode",{parentName:"p"},"Handler")," with the correct ",(0,r.yg)("inlineCode",{parentName:"p"},"<plan-name>"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-go"},' app.upgradeKeeper.SetUpgradeHandler("<plan-name>", func(ctx sdk.Context, plan upgrade.Plan) {\n // custom logic after the network upgrade has been executed\n })\n')),(0,r.yg)("p",null," Note that we panic on any error - this would cause the upgrade to fail if the\nmigration could not be run, and no node would advance - allowing a manual recovery.\nIf we ignored the errors, then we would proceed with an incomplete upgrade and\nhave a very difficult time every recovering the proper state."),(0,r.yg)("p",null," Now, compile the new binary and run the upgraded code to complete the upgrade:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-bash"},"# create a new binary of gaia with the added upgrade handler\n$ make install\n\n# Restart the chain using the new binary. You should see the chain resume from\n# the upgrade height:\n# `I[2019-11-05|12:48:15.184] applying upgrade <plan-name> at height: <desired-upgrade-height> module=main`\n$ gaiad start\n\n# verify there is no pending plan\n$ gaiad query upgrade plan\n\n# verify you can query the block header of the completed upgrade\n$ gaiad query upgrade applied <plan-name>\n")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6294a1b0.1ce4e36d.js b/assets/js/6294a1b0.1ce4e36d.js new file mode 100644 index 00000000000..f8ec2c3649a --- /dev/null +++ b/assets/js/6294a1b0.1ce4e36d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[6840],{5680:(e,n,a)=>{a.d(n,{xA:()=>u,yg:()=>m});var t=a(6540);function o(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function i(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,t)}return a}function r(e){for(var n=1;n<arguments.length;n++){var a=null!=arguments[n]?arguments[n]:{};n%2?i(Object(a),!0).forEach((function(n){o(e,n,a[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(a,n))}))}return e}function l(e,n){if(null==e)return{};var a,t,o=function(e,n){if(null==e)return{};var a,t,o={},i=Object.keys(e);for(t=0;t<i.length;t++)a=i[t],n.indexOf(a)>=0||(o[a]=e[a]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t<i.length;t++)a=i[t],n.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var s=t.createContext({}),c=function(e){var n=t.useContext(s),a=n;return e&&(a="function"==typeof e?e(n):r(r({},n),e)),a},u=function(e){var n=c(e.components);return t.createElement(s.Provider,{value:n},e.children)},d="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},p=t.forwardRef((function(e,n){var a=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(a),p=o,m=d["".concat(s,".").concat(p)]||d[p]||g[p]||i;return a?t.createElement(m,r(r({ref:n},u),{},{components:a})):t.createElement(m,r({ref:n},u))}));function m(e,n){var a=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=a.length,r=new Array(i);r[0]=p;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[d]="string"==typeof e?e:o,r[1]=l;for(var c=2;c<i;c++)r[c]=a[c];return t.createElement.apply(null,r)}return t.createElement.apply(null,a)}p.displayName="MDXCreateElement"},5792:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>s,contentTitle:()=>r,default:()=>g,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var t=a(8168),o=(a(6540),a(5680));const i={title:"Service Providers",order:4},r=void 0,l={unversionedId:"resources/service-providers",id:"resources/service-providers",title:"Service Providers",description:"'Service Providers' are defined as entities that provide services for end-users that involve some form of interaction with the Cosmos Hub. More specifically, this document is focused on interactions with tokens.",source:"@site/docs/resources/service-providers.md",sourceDirName:"resources",slug:"/resources/service-providers",permalink:"/main/resources/service-providers",draft:!1,tags:[],version:"current",frontMatter:{title:"Service Providers",order:4},sidebar:"tutorialSidebar",previous:{title:"Building Gaia Deterministically",permalink:"/main/resources/reproducible-builds"},next:{title:"Architecture Decision Records (ADR)",permalink:"/main/architecture/"}},s={},c=[{value:"Connection Options",id:"connection-options",level:2},{value:"Running a Full Node",id:"running-a-full-node",level:2},{value:"What is a Full Node?",id:"what-is-a-full-node",level:3},{value:"Installation and Configuration",id:"installation-and-configuration",level:3},{value:"Command-Line Interface",id:"command-line-interface",level:2},{value:"Available Commands",id:"available-commands",level:3},{value:"Remote Access to gaiad",id:"remote-access-to-gaiad",level:3},{value:"Create a Key Pair",id:"create-a-key-pair",level:3},{value:"Check your Account",id:"check-your-account",level:4},{value:"Check your Balance",id:"check-your-balance",level:3},{value:"Send Coins Using the CLI",id:"send-coins-using-the-cli",level:4},{value:"REST API",id:"rest-api",level:2},{value:"Listen for Incoming Transactions",id:"listen-for-incoming-transactions",level:3}],u={toc:c},d="wrapper";function g(e){let{components:n,...a}=e;return(0,o.yg)(d,(0,t.A)({},u,a,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("p",null,"'Service Providers' are defined as entities that provide services for end-users that involve some form of interaction with the Cosmos Hub. More specifically, this document is focused on interactions with tokens."),(0,o.yg)("p",null,"Service Providers are expected to act as trusted points of contact to the blockchain for their end-users. This Service Providers section does not apply to wallet builders that want to provide Light Client functionalities."),(0,o.yg)("p",null,"This document describes:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#connection-options"},"Connection Options")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#running-a-full-node"},"Running a Full Node"),(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#what-is-a-full-node"},"What is a Full Node?")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#installation-and-configuration"},"Installation and Configuration")))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#command-line-interface"},"Command-Line Interface"),(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#available-commands"},"Available Commands")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#remote-access-to-gaiad"},"Remote Access to gaiad")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#create-a-key-pair"},"Create a Key Pair"),(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#check-your-account"},"Check your Account")))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#check-your-balance"},"Check your Balance"),(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#send-coins-using-the-cli"},"Send Coins Using the CLI")))))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#rest-api"},"REST API"),(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#listen-for-incoming-transactions"},"Listen for Incoming Transactions"))))),(0,o.yg)("h2",{id:"connection-options"},"Connection Options"),(0,o.yg)("p",null,"There are four main technologies to consider to connect to the Cosmos Hub:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Full Nodes: Interact with the blockchain."),(0,o.yg)("li",{parentName:"ul"},"REST Server: Serves for HTTP calls."),(0,o.yg)("li",{parentName:"ul"},"REST API: Use available endpoints for the REST Server."),(0,o.yg)("li",{parentName:"ul"},"GRPC: Connect to the Cosmos Hub using gRPC.")),(0,o.yg)("h2",{id:"running-a-full-node"},"Running a Full Node"),(0,o.yg)("h3",{id:"what-is-a-full-node"},"What is a Full Node?"),(0,o.yg)("p",null,"A Full Node is a network node that syncs up with the state of the blockchain. It provides blockchain data to others by using RESTful APIs, a replica of the database by exposing data with interfaces. A Full Node keeps in syncs with the rest of the blockchain nodes and stores the state on disk. If the full node does not have the queried block on disk the full node can go find the blockchain where the queried data lives."),(0,o.yg)("h3",{id:"installation-and-configuration"},"Installation and Configuration"),(0,o.yg)("p",null,"This section describes the steps to run and interact with a full node for the Cosmos Hub."),(0,o.yg)("p",null,"First, you need to ",(0,o.yg)("a",{parentName:"p",href:"../getting-started/installation"},"install the software"),"."),(0,o.yg)("p",null,"Consider running your own ",(0,o.yg)("a",{parentName:"p",href:"../hub-tutorials/join-mainnet"},"Cosmos Hub Full Node"),"."),(0,o.yg)("h2",{id:"command-line-interface"},"Command-Line Interface"),(0,o.yg)("p",null,"The command-line interface (CLI) is the most powerful tool to access the Cosmos Hub and use gaia.\nTo use the CLI, you must install the latest version of ",(0,o.yg)("inlineCode",{parentName:"p"},"gaia")," on your machine."),(0,o.yg)("p",null,"Compare your version with the ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/cosmos/gaia/releases"},"latest release version")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad version --long\n")),(0,o.yg)("h3",{id:"available-commands"},"Available Commands"),(0,o.yg)("p",null,"All available CLI commands are shown when you run the ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad\n")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},'Stargate Cosmos Hub App\n\nUsage:\n gaiad [command]\n\nAvailable Commands:\n\n\n add-genesis-account Add a genesis account to genesis.json\n collect-gentxs Collect genesis txs and output a genesis.json file\n debug Tool for helping with debugging your application\n export Export state to JSON\n gentx Generate a genesis tx carrying a self delegation\n help Help about any command\n init Initialize private validator, p2p, genesis, and application configuration files\n keys Manage your application\'s keys\n migrate Migrate genesis to a specified target version\n query Querying subcommands\n start Run the full node\n status Query remote node for status\n tendermint Tendermint subcommands\n testnet Initialize files for a simapp testnet\n tx Transactions subcommands\n unsafe-reset-all Resets the blockchain database, removes address book files, and resets data/priv_validator_state.json to the genesis state\n validate-genesis validates the genesis file at the default location or at the location passed as an arg\n version Print the application binary version information\n\nFlags:\n -h, --help help for gaiad\n --home string directory for config and data (default "/Users/tobias/.gaia")\n --log_format string The logging format (json|plain) (default "plain")\n --log_level string The logging level (trace|debug|info|warn|error|fatal|panic) (default "info")\n --trace print out full stack trace on errors\n\nUse "gaiad [command] --help" for more information about a command.\n')),(0,o.yg)("p",null,"For each displayed command, you can use the ",(0,o.yg)("inlineCode",{parentName:"p"},"--help")," flag to get further information."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},'gaiad query --help\nUsage:\n gaiad query [flags]\n gaiad query [command]\n\nAliases:\n query, q\n\nAvailable Commands:\n account Query for account by address\n auth Querying commands for the auth module\n bank Querying commands for the bank module\n block Get verified data for a the block at given height\n distribution Querying commands for the distribution module\n evidence Query for evidence by hash or for all (paginated) submitted evidence\n gov Querying commands for the governance module\n ibc Querying commands for the IBC module\n ibc-transfer IBC fungible token transfer query subcommands\n mint Querying commands for the minting module\n params Querying commands for the params module\n slashing Querying commands for the slashing module\n staking Querying commands for the staking module\n tendermint-validator-set Get the full tendermint validator set at given height\n tx Query for a transaction by hash in a committed block\n txs Query for paginated transactions that match a set of events\n upgrade Querying commands for the upgrade module\n\nFlags:\n --chain-id string The network chain ID\n -h, --help help for query\n\nGlobal Flags:\n --home string directory for config and data (default "/Users/tobias/.gaia")\n --log_format string The logging format (json|plain) (default "plain")\n --log_level string The logging level (trace|debug|info|warn|error|fatal|panic) (default "info")\n --trace print out full stack trace on errors\n\nUse "gaiad query [command] --help" for more information about a command.\n')),(0,o.yg)("h3",{id:"remote-access-to-gaiad"},"Remote Access to gaiad"),(0,o.yg)("p",null,"When choosing to remote access a Full Node and gaiad, you need a Full Node running and gaia installed on your local machine."),(0,o.yg)("p",null,(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," is the tool that enables you to interact with the node that runs on the Cosmos Hub network, whether you run it yourself or not."),(0,o.yg)("p",null,"To set up ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," on a local machine and connect to an existing full node, use the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad config <flag> <value>\n")),(0,o.yg)("p",null,"First, set up the address of the full node you want to connect to:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad config node <host>:<port\n\n// example: gaiad config node https://77.87.106.33:26657 (note: this is a placeholder)\n")),(0,o.yg)("p",null,"If you run your own full node locally, use ",(0,o.yg)("inlineCode",{parentName:"p"},"tcp://localhost:26657")," as the address."),(0,o.yg)("p",null,"Finally, set the ",(0,o.yg)("inlineCode",{parentName:"p"},"chain-id")," of the blockchain you want to interact with:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad config chain-id cosmoshub-4\n")),(0,o.yg)("p",null,"Next, learn to use CLI commands to interact with the full node.\nYou can run these commands as remote control or when you are running it on your local machine."),(0,o.yg)("h3",{id:"create-a-key-pair"},"Create a Key Pair"),(0,o.yg)("p",null,"The default key is ",(0,o.yg)("inlineCode",{parentName:"p"},"secp256k1 elliptic curve"),". Use the ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad keys")," command to list the keys and generate a new key."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys add <your_key_name>\n")),(0,o.yg)("p",null,"You will be asked to create a password (at least 8 characters) for this key-pair. This will return the information listed below:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"NAME"),": Name of your key"),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"TYPE"),": Type of your key, always ",(0,o.yg)("inlineCode",{parentName:"li"},"local"),"."),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"ADDRESS"),": Your address. Used to receive funds."),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"PUBKEY"),": Your public key. Useful for validators."),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"MNEMONIC"),": 24-word phrase. ",(0,o.yg)("strong",{parentName:"li"},"Save this mnemonic somewhere safe"),". This phrase is required to recover your private key in case you forget the password. The mnemonic is displayed at the end of the output.")),(0,o.yg)("p",null,"You can see all available keys by typing:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys list\n")),(0,o.yg)("p",null,"Use the ",(0,o.yg)("inlineCode",{parentName:"p"},"--recover")," flag to add a key that imports a mnemonic to your keyring."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys add <your_key_name> --recover\n")),(0,o.yg)("h4",{id:"check-your-account"},"Check your Account"),(0,o.yg)("p",null,"You can view your account by using the ",(0,o.yg)("inlineCode",{parentName:"p"},"query account")," command."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query account <YOUR_ADDRESS>\n")),(0,o.yg)("p",null,"It will display your account type, account number, public key and current account sequence."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"'@type': /cosmos.auth.v1beta1.BaseAccount\naccount_number: \"xxxx\"\naddress: cosmosxxxx\npub_key:\n '@type': /cosmos.crypto.secp256k1.PubKey\n key: xxx\nsequence: \"x\"\n")),(0,o.yg)("h3",{id:"check-your-balance"},"Check your Balance"),(0,o.yg)("p",null,"Query the account balance with the command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query bank balances <YOUR_ADDRESS>\n")),(0,o.yg)("p",null,"The response contains keys ",(0,o.yg)("inlineCode",{parentName:"p"},"balances")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"pagination"),".\nEach ",(0,o.yg)("inlineCode",{parentName:"p"},"balances")," entry contains an ",(0,o.yg)("inlineCode",{parentName:"p"},"amount")," held, connected to a ",(0,o.yg)("inlineCode",{parentName:"p"},"denom")," identifier.\nThe typical $ATOM token is identified by the denom ",(0,o.yg)("inlineCode",{parentName:"p"},"uatom"),". Where 1 ",(0,o.yg)("inlineCode",{parentName:"p"},"uatom")," is 0.000001 ATOM."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},'balances:\n- amount: "12345678"\n denom: uatom\npagination:\n next_key: null\n total: "0"\n')),(0,o.yg)("p",null,"When you query an account that has not received any token yet, the ",(0,o.yg)("inlineCode",{parentName:"p"},"balances")," entry is shown as an empty array."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},'balances: []\npagination:\n next_key: null\n total: "0"\n')),(0,o.yg)("h4",{id:"send-coins-using-the-cli"},"Send Coins Using the CLI"),(0,o.yg)("p",null,"To send coins using the CLI:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx bank send [from_key_or_address] [to_address] [amount] [flags]\n")),(0,o.yg)("p",null,"Parameters:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"<from_key_or_address>"),": Key name or address of sending account."),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"<to_address>"),": Address of the recipient."),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"<amount>"),": This parameter accepts the format ",(0,o.yg)("inlineCode",{parentName:"li"},"<value|coinName>"),", such as ",(0,o.yg)("inlineCode",{parentName:"li"},"1000000uatom"),".")),(0,o.yg)("p",null,"Flags:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"--chain-id"),": This flag allows you to specify the id of the chain. There are different ids for different testnet chains and mainnet chains."),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"--gas-prices"),": This flag allows you to specify the gas prices you pay for the transaction. The format is used as ",(0,o.yg)("inlineCode",{parentName:"li"},"0.0025uatom"))),(0,o.yg)("h2",{id:"rest-api"},"REST API"),(0,o.yg)("p",null,"The REST API documents list all the available endpoints that you can use to interact\nwith your full node. Learn ",(0,o.yg)("a",{parentName:"p",href:"/main/hub-tutorials/join-mainnet#enable-the-rest-api"},"how to enable the REST API")," on your full node."),(0,o.yg)("h3",{id:"listen-for-incoming-transactions"},"Listen for Incoming Transactions"),(0,o.yg)("p",null,"The recommended way to listen for incoming transactions is to periodically query the blockchain by using the following HTTP endpoint:"),(0,o.yg)("p",null,(0,o.yg)("inlineCode",{parentName:"p"},"/cosmos/bank/v1beta1/balances/{address}")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/62b775bc.4dabb2fb.js b/assets/js/62b775bc.4dabb2fb.js new file mode 100644 index 00000000000..f17498853c1 --- /dev/null +++ b/assets/js/62b775bc.4dabb2fb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[7335],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>f});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=s(r),g=o,f=p["".concat(c,".").concat(g)]||p[g]||d[g]||a;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,l=new Array(a);l[0]=g;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:o,l[1]=i;for(var s=2;s<a;s++)l[s]=r[s];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}g.displayName="MDXCreateElement"},8555:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var n=r(8168),o=(r(6540),r(5680));const a={title:"Delegators",order:1},l=void 0,i={unversionedId:"delegators/README",id:"delegators/README",title:"Delegators",description:"This folder contains documentation relevant to delegators of the Cosmos Hub and other gaia blockchains.",source:"@site/docs/delegators/README.md",sourceDirName:"delegators",slug:"/delegators/",permalink:"/main/delegators/",draft:!1,tags:[],version:"current",frontMatter:{title:"Delegators",order:1},sidebar:"tutorialSidebar",previous:{title:"Upgrading Your Node",permalink:"/main/hub-tutorials/upgrade-node"},next:{title:"Delegator FAQ",permalink:"/main/delegators/delegator-faq"}},c={},s=[],u={toc:s},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.yg)(p,(0,n.A)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("p",null,"This folder contains documentation relevant to delegators of the Cosmos Hub and other ",(0,o.yg)("inlineCode",{parentName:"p"},"gaia")," blockchains."),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"/main/delegators/delegator-guide-cli"},"Delegator CLI Guide")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"/main/delegators/delegator-faq"},"Delegators FAQ")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"/main/delegators/delegator-security"},"Delegator Security Notice"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/62f354e1.feac769b.js b/assets/js/62f354e1.feac769b.js new file mode 100644 index 00000000000..0dbca635570 --- /dev/null +++ b/assets/js/62f354e1.feac769b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[587],{5680:(e,n,a)=>{a.d(n,{xA:()=>g,yg:()=>m});var t=a(6540);function o(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function r(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,t)}return a}function i(e){for(var n=1;n<arguments.length;n++){var a=null!=arguments[n]?arguments[n]:{};n%2?r(Object(a),!0).forEach((function(n){o(e,n,a[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(a,n))}))}return e}function s(e,n){if(null==e)return{};var a,t,o=function(e,n){if(null==e)return{};var a,t,o={},r=Object.keys(e);for(t=0;t<r.length;t++)a=r[t],n.indexOf(a)>=0||(o[a]=e[a]);return o}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(t=0;t<r.length;t++)a=r[t],n.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var l=t.createContext({}),p=function(e){var n=t.useContext(l),a=n;return e&&(a="function"==typeof e?e(n):i(i({},n),e)),a},g=function(e){var n=p(e.components);return t.createElement(l.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},c=t.forwardRef((function(e,n){var a=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,g=s(e,["components","mdxType","originalType","parentName"]),u=p(a),c=o,m=u["".concat(l,".").concat(c)]||u[c]||d[c]||r;return a?t.createElement(m,i(i({ref:n},g),{},{components:a})):t.createElement(m,i({ref:n},g))}));function m(e,n){var a=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var r=a.length,i=new Array(r);i[0]=c;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var p=2;p<r;p++)i[p]=a[p];return t.createElement.apply(null,i)}return t.createElement.apply(null,a)}c.displayName="MDXCreateElement"},4093:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var t=a(8168),o=(a(6540),a(5680));const r={title:"Upgrading Your Node",order:4},i="Upgrade Your Node",s={unversionedId:"hub-tutorials/upgrade-node",id:"hub-tutorials/upgrade-node",title:"Upgrading Your Node",description:"This document describes the upgrade procedure of a gaiad full-node to a new version.",source:"@site/docs/hub-tutorials/upgrade-node.md",sourceDirName:"hub-tutorials",slug:"/hub-tutorials/upgrade-node",permalink:"/main/hub-tutorials/upgrade-node",draft:!1,tags:[],version:"current",frontMatter:{title:"Upgrading Your Node",order:4},sidebar:"tutorialSidebar",previous:{title:"Upgrading the Chain",permalink:"/main/hub-tutorials/live-upgrade-tutorial"},next:{title:"Delegators",permalink:"/main/delegators/"}},l={},p=[{value:"Cosmovisor",id:"cosmovisor",level:2},{value:"Setup",id:"setup",level:3},{value:"Preparing an Upgrade",id:"preparing-an-upgrade",level:3},{value:"Manual Software Upgrade",id:"manual-software-upgrade",level:2},{value:"Upgrade Genesis File",id:"upgrade-genesis-file",level:2},{value:"Fetching from a Trusted Source",id:"fetching-from-a-trusted-source",level:3},{value:"Exporting State to a New Genesis Locally",id:"exporting-state-to-a-new-genesis-locally",level:3},{value:"Reset Data",id:"reset-data",level:2},{value:"Restart",id:"restart",level:2}],g={toc:p},u="wrapper";function d(e){let{components:n,...a}=e;return(0,o.yg)(u,(0,t.A)({},g,a,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"upgrade-your-node"},"Upgrade Your Node"),(0,o.yg)("p",null,"This document describes the upgrade procedure of a ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," full-node to a new version."),(0,o.yg)("h2",{id:"cosmovisor"},"Cosmovisor"),(0,o.yg)("p",null,"The Cosmos SDK provides a convenient process manager that wraps around the ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," binary and can automatically swap in new binaries upon a successful governance upgrade proposal. Cosmovisor is entirely optional but recommended. More information can be found in ",(0,o.yg)("a",{parentName:"p",href:"https://docs.cosmos.network/v0.45/run-node/cosmovisor.html"},"cosmos.network docs")," and ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/cosmos/cosmos-sdk/blob/v0.47.11/tools/cosmovisor/README.md"},"cosmos-sdk/cosmovisor/readme"),"."),(0,o.yg)("h3",{id:"setup"},"Setup"),(0,o.yg)("p",null,"To get started with Cosmovisor first download it"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"go install github.com/cosmos/cosmos-sdk/cosmovisor/cmd/cosmovisor\n")),(0,o.yg)("p",null,"Set up the environment variables"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},'echo "# Setup Cosmovisor" >> ~/.profile\necho "export DAEMON_NAME=gaiad" >> ~/.profile\necho "export DAEMON_HOME=$HOME/.gaia" >> ~/.profile\nsource ~/.profile\n')),(0,o.yg)("p",null,"Create the appropriate directories"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"mkdir -p ~/.gaia/cosmovisor/upgrades\nmkdir -p ~/.gaia/cosmovisor/genesis/bin/\ncp $(which gaiad) ~/.gaia/cosmovisor/genesis/bin/\n\n# verify the setup. \n# It should return the same version as gaiad\ncosmovisor version\n")),(0,o.yg)("p",null,"Now ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," can start by running"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"cosmovisor start\n")),(0,o.yg)("h3",{id:"preparing-an-upgrade"},"Preparing an Upgrade"),(0,o.yg)("p",null,"Cosmovisor will continually poll the ",(0,o.yg)("inlineCode",{parentName:"p"},"$DAEMON_HOME/data/upgrade-info.json")," for new upgrade instructions. When an upgrade is ready, node operators can download the new binary and place it under ",(0,o.yg)("inlineCode",{parentName:"p"},"$DAEMON_HOME/cosmovisor/upgrades/<name>/bin")," where ",(0,o.yg)("inlineCode",{parentName:"p"},"<name>")," is the URI-encoded name of the upgrade as specified in the upgrade module plan."),(0,o.yg)("p",null,"It is possible to have Cosmovisor automatically download the new binary. To do this set the following environment variable."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"export DAEMON_ALLOW_DOWNLOAD_BINARIES=true\n")),(0,o.yg)("h2",{id:"manual-software-upgrade"},"Manual Software Upgrade"),(0,o.yg)("p",null,"First, stop your instance of ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad"),". Next, upgrade the software:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"cd gaia\ngit fetch --all && git checkout <new_version>\nmake install\n")),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("em",{parentName:"p"},"NOTE"),": If you have issues at this step, please check that you have the latest stable version of GO installed.")),(0,o.yg)("p",null,"See the ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/cosmos/testnets"},"testnet repo")," for details on which version is needed for which public testnet, and the ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/cosmos/Gaia/releases"},"Gaia release page")," for details on each release."),(0,o.yg)("p",null,"Your full node has been cleanly upgraded! If there are no breaking changes then you can simply restart the node by running:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad start\n")),(0,o.yg)("h2",{id:"upgrade-genesis-file"},"Upgrade Genesis File"),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},"If the new version you are upgrading to has breaking changes, you will have to restart your chain. If it is not breaking, you can skip to ",(0,o.yg)("a",{parentName:"p",href:"/hub-tutorials/upgrade-node#restart"},"Restart"))),(0,o.yg)("p",null,"To upgrade the genesis file, you can either fetch it from a trusted source or export it locally."),(0,o.yg)("h3",{id:"fetching-from-a-trusted-source"},"Fetching from a Trusted Source"),(0,o.yg)("p",null,"If you are joining the mainnet, fetch the genesis from the ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/cosmos/launch"},"mainnet repo"),". If you are joining a public testnet, fetch the genesis from the appropriate testnet in the ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/cosmos/testnets"},"testnet repo"),". Otherwise, fetch it from your trusted source."),(0,o.yg)("p",null,"Save the new genesis as ",(0,o.yg)("inlineCode",{parentName:"p"},"new_genesis.json"),". Then replace the old ",(0,o.yg)("inlineCode",{parentName:"p"},"genesis.json")," with ",(0,o.yg)("inlineCode",{parentName:"p"},"new_genesis.json")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"cd $HOME/.gaia/config\ncp -f genesis.json new_genesis.json\nmv new_genesis.json genesis.json\n")),(0,o.yg)("p",null,"Then, go to the ",(0,o.yg)("a",{parentName:"p",href:"#reset-data"},"reset data")," section."),(0,o.yg)("h3",{id:"exporting-state-to-a-new-genesis-locally"},"Exporting State to a New Genesis Locally"),(0,o.yg)("p",null,"If you were running a node in the previous version of the network and want to build your new genesis locally from a state of this previous network, use the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"cd $HOME/.gaia/config\ngaiad export --for-zero-height --height=<export-height> > new_genesis.json\n")),(0,o.yg)("p",null,"The command above take a state at a certain height ",(0,o.yg)("inlineCode",{parentName:"p"},"<export-height>")," and turns it into a new genesis file that can be used to start a new network."),(0,o.yg)("p",null,"Then, replace the old ",(0,o.yg)("inlineCode",{parentName:"p"},"genesis.json")," with ",(0,o.yg)("inlineCode",{parentName:"p"},"new_genesis.json"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"cp -f genesis.json new_genesis.json\nmv new_genesis.json genesis.json\n")),(0,o.yg)("p",null,"At this point, you might want to run a script to update the exported genesis into a genesis that is compatible with your new version. For example, the attributes of the ",(0,o.yg)("inlineCode",{parentName:"p"},"Account")," type changed, a script should query encoded account from the account store, unmarshal them, update their type, re-marshal and re-store them. You can find an example of such script ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/cosmos/cosmos-sdk/blob/02c6c9fafd58da88550ab4d7d494724a477c8a68/contrib/migrate/v0.33.x-to-v0.34.0.py"},"here"),"."),(0,o.yg)("h2",{id:"reset-data"},"Reset Data"),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},"If the version <new_version> you are upgrading to is not breaking from the previous one, you should not reset the data. If it is not breaking, you can skip to ",(0,o.yg)("a",{parentName:"p",href:"#restart"},"Restart"))),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},"If you are running a ",(0,o.yg)("strong",{parentName:"p"},"validator node")," on the mainnet, always be careful when doing ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad unsafe-reset-all"),". You should never use this command if you are not switching ",(0,o.yg)("inlineCode",{parentName:"p"},"chain-id"),".")),(0,o.yg)("p",null,"::: danger IMPORTANT\nMake sure that every node has a unique ",(0,o.yg)("inlineCode",{parentName:"p"},"priv_validator.json"),". Do not copy the ",(0,o.yg)("inlineCode",{parentName:"p"},"priv_validator.json")," from an old node to multiple new nodes. Running two nodes with the same ",(0,o.yg)("inlineCode",{parentName:"p"},"priv_validator.json")," will cause you to get slashed due to double signing!\n:::"),(0,o.yg)("p",null,"First, remove the outdated files and reset the data. ",(0,o.yg)("strong",{parentName:"p"},"If you are running a validator node, make sure you understand what you are doing before resetting"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad unsafe-reset-all\n")),(0,o.yg)("p",null,"Your node is now in a pristine state while keeping the original ",(0,o.yg)("inlineCode",{parentName:"p"},"priv_validator.json")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"config.toml"),". If you had any sentry nodes or full nodes setup before, your node will still try to connect to them, but may fail if they haven't also been upgraded."),(0,o.yg)("h2",{id:"restart"},"Restart"),(0,o.yg)("p",null,"If there are no breaking changes then you can simply restart the node by running:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad start\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/66cfa501.abec7ff9.js b/assets/js/66cfa501.abec7ff9.js new file mode 100644 index 00000000000..920842140f9 --- /dev/null +++ b/assets/js/66cfa501.abec7ff9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[35],{5680:(e,t,r)=>{r.d(t,{xA:()=>l,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},l=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=u(r),m=a,d=p["".concat(c,".").concat(m)]||p[m]||h[m]||i;return r?n.createElement(d,o(o({ref:t},l),{},{components:r})):n.createElement(d,o({ref:t},l))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[p]="string"==typeof e?e:a,o[1]=s;for(var u=2;u<i;u++)o[u]=r[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},6315:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const i={title:"Interchain Security",order:3},o=void 0,s={unversionedId:"interchain-security/README",id:"interchain-security/README",title:"Interchain Security",description:"The Interchain Security feature brings to the Cosmos Hub a shared security model, where the Cosmos Hub validators, also validate consumer chains. This is valuable for consumer chains, as consumer chains can focus on product-market fit, rather than business and operational agreements in bringing together a validator set. As part of this agreement, consumer chains pay for the security by distributing a portion of the consumer chain revenue to Hub token holders.",source:"@site/docs/interchain-security/README.md",sourceDirName:"interchain-security",slug:"/interchain-security/",permalink:"/main/interchain-security/",draft:!1,tags:[],version:"current",frontMatter:{title:"Interchain Security",order:3},sidebar:"tutorialSidebar",previous:{title:"Submitting a Proposal",permalink:"/main/governance/submitting"},next:{title:"Resources",permalink:"/main/resources/"}},c={},u=[{value:"ICS features",id:"ics-features",level:2},{value:"Top-N consumer chains",id:"top-n-consumer-chains",level:3},{value:"Opt-in consumer chains",id:"opt-in-consumer-chains",level:3},{value:"Parameter customization",id:"parameter-customization",level:3},{value:"Notable consumer chains",id:"notable-consumer-chains",level:2},{value:"Neutron",id:"neutron",level:3},{value:"Stride",id:"stride",level:3},{value:"Resources",id:"resources",level:2}],l={toc:u},p="wrapper";function h(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("p",null,"The ",(0,a.yg)("a",{parentName:"p",href:"https://cosmos.github.io/interchain-security/"},"Interchain Security")," feature brings to the Cosmos Hub a shared security model, where the Cosmos Hub validators, also validate consumer chains. This is valuable for consumer chains, as consumer chains can focus on product-market fit, rather than business and operational agreements in bringing together a validator set. As part of this agreement, consumer chains pay for the security by distributing a portion of the consumer chain revenue to Hub token holders."),(0,a.yg)("p",null,"All potential chains are onboarded as consumer chains, via Hub Governance, with the feedback from the Hub community."),(0,a.yg)("h2",{id:"ics-features"},"ICS features"),(0,a.yg)("p",null,(0,a.yg)("a",{parentName:"p",href:"https://cosmos.github.io/interchain-security/features/partial-set-security"},"Partial Set Security")," and ",(0,a.yg)("a",{parentName:"p",href:"https://cosmos.github.io/interchain-security/features/power-shaping"},"Power Shaping")," bring benefits for both the consumer chains and validators:"),(0,a.yg)("h3",{id:"top-n-consumer-chains"},"Top-N consumer chains"),(0,a.yg)("p",null,"Validators inside the top-N percent of voting power are required to validate the consumer chain."),(0,a.yg)("p",null,"e.g. ",(0,a.yg)("inlineCode",{parentName:"p"},"top-95")," means that the 95% of the validators (by voting power) are required to run the consumer chain binary"),(0,a.yg)("h3",{id:"opt-in-consumer-chains"},"Opt-in consumer chains"),(0,a.yg)("p",null,"Only validators that opt to running a consumer chains are required to run the chain binary and become eligible for consumer chain rewards distribution."),(0,a.yg)("h3",{id:"parameter-customization"},"Parameter customization"),(0,a.yg)("p",null,"Consumer chains gain the ability to customize the validator set to their needs:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"define allow/denylists"),(0,a.yg)("li",{parentName:"ul"},"set maximum number of validators"),(0,a.yg)("li",{parentName:"ul"},"set validator power cap")),(0,a.yg)("h2",{id:"notable-consumer-chains"},"Notable consumer chains"),(0,a.yg)("p",null,"Currently the Cosmos Hub has the following two Consumer Chains."),(0,a.yg)("h3",{id:"neutron"},"Neutron"),(0,a.yg)("p",null,(0,a.yg)("a",{parentName:"p",href:"https://neutron.org/"},"Neutron"),", is a smart contracting platform, that was the first consumer chain onboarded.",(0,a.yg)("br",{parentName:"p"}),"\n","Neutron was onboarded as a consumer chain in May 2023, see Hub ",(0,a.yg)("a",{parentName:"p",href:"https://www.mintscan.io/cosmos/proposals/792"},"proposal 792")," for more details."),(0,a.yg)("h3",{id:"stride"},"Stride"),(0,a.yg)("p",null,(0,a.yg)("a",{parentName:"p",href:"https://www.stride.zone/"},"Stride"),", is a liquid staking provider, which aims to unlock liquidity for Cosmos Hub token holders.",(0,a.yg)("br",{parentName:"p"}),"\n","Stride was onboarded as a consumer chain in July 2023, see Hub ",(0,a.yg)("a",{parentName:"p",href:"https://www.mintscan.io/cosmos/proposals/799"},"proposal 799")," for more details."),(0,a.yg)("h2",{id:"resources"},"Resources"),(0,a.yg)("p",null,"For more information visit:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"https://cosmos.github.io/interchain-security"},"Interchain Security docs"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/68580c81.58bea881.js b/assets/js/68580c81.58bea881.js new file mode 100644 index 00000000000..f12e96d8fee --- /dev/null +++ b/assets/js/68580c81.58bea881.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[2424],{5680:(e,t,a)=>{a.d(t,{xA:()=>h,yg:()=>m});var o=a(6540);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,o)}return a}function r(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?n(Object(a),!0).forEach((function(t){i(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):n(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function s(e,t){if(null==e)return{};var a,o,i=function(e,t){if(null==e)return{};var a,o,i={},n=Object.keys(e);for(o=0;o<n.length;o++)a=n[o],t.indexOf(a)>=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o<n.length;o++)a=n[o],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var l=o.createContext({}),d=function(e){var t=o.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},h=function(e){var t=d(e.components);return o.createElement(l.Provider,{value:t},e.children)},g="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},u=o.forwardRef((function(e,t){var a=e.components,i=e.mdxType,n=e.originalType,l=e.parentName,h=s(e,["components","mdxType","originalType","parentName"]),g=d(a),u=i,m=g["".concat(l,".").concat(u)]||g[u]||c[u]||n;return a?o.createElement(m,r(r({ref:t},h),{},{components:a})):o.createElement(m,r({ref:t},h))}));function m(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=a.length,r=new Array(n);r[0]=u;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[g]="string"==typeof e?e:i,r[1]=s;for(var d=2;d<n;d++)r[d]=a[d];return o.createElement.apply(null,r)}return o.createElement.apply(null,a)}u.displayName="MDXCreateElement"},6293:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>n,metadata:()=>s,toc:()=>d});var o=a(8168),i=(a(6540),a(5680));const n={title:"Delegator FAQ",order:4},r=void 0,s={unversionedId:"delegators/delegator-faq",id:"delegators/delegator-faq",title:"Delegator FAQ",description:"What is a delegator?",source:"@site/docs/delegators/delegator-faq.md",sourceDirName:"delegators",slug:"/delegators/delegator-faq",permalink:"/main/delegators/delegator-faq",draft:!1,tags:[],version:"current",frontMatter:{title:"Delegator FAQ",order:4},sidebar:"tutorialSidebar",previous:{title:"Delegators",permalink:"/main/delegators/"},next:{title:"Delegator Guide (CLI)",permalink:"/main/delegators/delegator-guide-cli"}},l={},d=[{value:"What is a delegator?",id:"what-is-a-delegator",level:2},{value:"Choosing a validator",id:"choosing-a-validator",level:2},{value:"Directives of delegators",id:"directives-of-delegators",level:2},{value:"Revenue",id:"revenue",level:2},{value:"Validator Commission",id:"validator-commission",level:2},{value:"Liquid Staking",id:"liquid-staking",level:2},{value:"Toggling the ability to tokenize shares",id:"toggling-the-ability-to-tokenize-shares",level:3},{value:"Risks",id:"risks",level:2}],h={toc:d},g="wrapper";function c(e){let{components:t,...a}=e;return(0,i.yg)(g,(0,o.A)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,i.yg)("h2",{id:"what-is-a-delegator"},"What is a delegator?"),(0,i.yg)("p",null,"People who cannot or do not want to operate ",(0,i.yg)("a",{parentName:"p",href:"/main/validators/overview"},"validator nodes")," can still participate in the staking process as delegators. Indeed, validators are not chosen based on their self-delegated stake but based on their total stake, which is the sum of their self-delegated stake and of the stake that is delegated to them. This is an important property, as it makes delegators a safeguard against validators that exhibit bad behavior. If a validator misbehaves, their delegators will move their Atoms away from them, thereby reducing their stake. Eventually, if a validator's stake falls under the top 180 addresses with highest stake, they will exit the validator set."),(0,i.yg)("p",null,(0,i.yg)("strong",{parentName:"p"},"Delegators share the revenue of their validators, but they also share the risks.")," In terms of revenue, validators and delegators differ in that validators can apply a commission on the revenue that goes to their delegator before it is distributed. This commission is known to delegators beforehand and can only change according to predefined constraints (see ",(0,i.yg)("a",{parentName:"p",href:"#choosing-a-validator"},"section")," below). In terms of risk, delegators' Atoms can be slashed if their validator misbehaves. For more, see ",(0,i.yg)("a",{parentName:"p",href:"#risks"},"Risks")," section."),(0,i.yg)("p",null,"To become delegators, Atom holders need to send a ",(0,i.yg)("a",{parentName:"p",href:"/main/delegators/delegator-guide-cli#sending-transactions"},'"Delegate transaction"'),' where they specify how many Atoms they want to bond and to which validator. A list of validator candidates will be displayed in Cosmos Hub explorers. Later, if a delegator wants to unbond part or all of their stake, they need to send an "Unbond transaction". From there, the delegator will have to wait 3 weeks to retrieve their Atoms. Delegators can also send a "Rebond Transaction" to switch from one validator to another, without having to go through the 3 weeks waiting period.'),(0,i.yg)("p",null,"For a practical guide on how to become a delegator, click ",(0,i.yg)("a",{parentName:"p",href:"/main/delegators/delegator-guide-cli"},"here"),"."),(0,i.yg)("h2",{id:"choosing-a-validator"},"Choosing a validator"),(0,i.yg)("p",null,"In order to choose their validators, delegators have access to a range of information directly in ",(0,i.yg)("a",{parentName:"p",href:"https://lunie.io"},"Lunie")," or other Cosmos block explorers."),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Validator's moniker"),": Name of the validator candidate."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Validator's description"),": Description provided by the validator operator."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Validator's website"),": Link to the validator's website."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Initial commission rate"),": The commission rate on revenue charged to any delegator by the validator (see below for more detail)."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Commission max change rate:")," The maximum daily increase of the validator's commission. This parameter cannot be changed by the validator operator."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Maximum commission:")," The maximum commission rate this validator candidate can charge. This parameter cannot be changed by the validator operator."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Validator self-bond amount"),": A validator with a high amount of self-delegated Atoms has more skin-in-the-game than a validator with a low amount.")),(0,i.yg)("h2",{id:"directives-of-delegators"},"Directives of delegators"),(0,i.yg)("p",null,"Being a delegator is not a passive task. Here are the main directives of a delegator:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Perform careful due diligence on validators before delegating.")," If a validator misbehaves, part of their total stake, which includes the stake of their delegators, can be slashed. Delegators should therefore carefully select validators they think will behave correctly."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Actively monitor their validator after having delegated.")," Delegators should ensure that the validators they delegate to behave correctly, meaning that they have good uptime, do not double sign or get compromised, and participate in governance. They should also monitor the commission rate that is applied. If a delegator is not satisfied with its validator, they can unbond or switch to another validator (Note: Delegators do not have to wait for the unbonding period to switch validators. Rebonding takes effect immediately)."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Participate in governance.")," Delegators can and are expected to actively participate in governance. A delegator's voting power is proportional to the size of their bonded stake. If a delegator does not vote, they will inherit the vote of their validator(s). If they do vote, they override the vote of their validator(s). Delegators therefore act as a counterbalance to their validators.")),(0,i.yg)("h2",{id:"revenue"},"Revenue"),(0,i.yg)("p",null,"Validators and delegators earn revenue in exchange for their services. This revenue is given in three forms:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Block provisions (Atoms):")," They are paid in newly created Atoms. Block provisions exist to incentivize Atom holders to stake. The yearly inflation rate is calculated to target 2/3 bonded stake. If the total bonded stake in the network is less than 2/3 of the total Atom supply, inflation increases until it reaches 20%. If the total bonded stake is more than 2/3 of the Atom supply, inflation decreases until it reaches 7%. This means that if total bonded stake stays less than 2/3 of the total Atom supply for a prolonged period of time, unbonded Atom holders can expect their Atom value to deflate by 20% (compounded) per year."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Transaction fees (various tokens):")," Each transfer on the Cosmos Hub comes with transactions fees. These fees can be paid in any currency that is whitelisted by the Hub's governance. Fees are distributed to bonded Atom holders in proportion to their stake. The first whitelisted token at launch is the ATOM.")),(0,i.yg)("h2",{id:"validator-commission"},"Validator Commission"),(0,i.yg)("p",null,"Each validator receives revenue based on their total stake. Before this revenue is distributed to delegators, the validator can apply a commission. In other words, delegators have to pay a commission to their validators on the revenue they earn. Let us look at a concrete example:"),(0,i.yg)("p",null,"We consider a validator whose stake (i.e. self-delegated stake + delegated stake) is 10% of the total stake of all validators. This validator has 20% self-delegated stake and applies a commission of 10%. Now let us consider a block with the following revenue:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},"990 Atoms in block provisions"),(0,i.yg)("li",{parentName:"ul"},"10 Atoms in transaction fees.")),(0,i.yg)("p",null,"This amounts to a total of 1000 Atoms and 100 Photons to be distributed among all staking pools."),(0,i.yg)("p",null,"Our validator's staking pool represents 10% of the total stake, which means the pool obtains 100 Atoms and 10 Photons. Now let us look at the internal distribution of revenue:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},"Commission = ",(0,i.yg)("inlineCode",{parentName:"li"},"10% * 80% * 100")," Atoms = 8 Atoms"),(0,i.yg)("li",{parentName:"ul"},"Validator's revenue = ",(0,i.yg)("inlineCode",{parentName:"li"},"20% * 100")," Atoms + Commission = 28 Atoms"),(0,i.yg)("li",{parentName:"ul"},"Delegators' total revenue = ",(0,i.yg)("inlineCode",{parentName:"li"},"80% * 100")," Atoms - Commission = 72 Atoms")),(0,i.yg)("p",null,"Then, each delegator in the staking pool can claim their portion of the delegators' total revenue."),(0,i.yg)("h2",{id:"liquid-staking"},"Liquid Staking"),(0,i.yg)("p",null,"The Liquid Staking module enacts a safety framework and associated governance-controlled parameters to regulate the adoption of liquid staking."),(0,i.yg)("p",null,"The LSM mitigates liquid staking risks by limiting the total amount of ATOM that can be liquid staked to a percentage of all staked ATOM. As an additional risk-mitigation feature, the LSM introduces a requirement that validators self-bond ATOM to be eligible for delegations from liquid staking providers or to be eligible to mint LSM tokens. This mechanism is called the \u201cvalidator bond\u201d, and is technically distinct from the current self-bond mechanism, but functions similarly."),(0,i.yg)("p",null,"At the same time, the LSM introduces the ability for staked ATOM to be instantly liquid staked, without having to wait for the unbonding period."),(0,i.yg)("p",null,"The LSM enables users to instantly liquid stake their staked ATOM, without having to wait the twenty-one day unbonding period. This is important, because a very large portion of the ATOM supply is currently staked. Liquid staking ATOM that is already staked incurs a switching cost in the form of three weeks\u2019 forfeited staking rewards. The LSM eliminates this switching cost."),(0,i.yg)("p",null,"A user would be able to visit any liquid staking provider that has integrated with the LSM and click a button to convert her staked ATOM to liquid staked ATOM. It would be as easy as liquid staking unstaked ATOM."),(0,i.yg)("p",null,"Technically speaking, this is accomplished by using something called an \u201cLSM share.\u201d Using the liquid staking module, a user can tokenize their staked ATOM and turn it into LSM shares. LSM shares can be redeemed for underlying staked tokens and are transferable. After staked ATOM is tokenized it can be immediately transferred to a liquid staking provider in exchange for liquid staking tokens - without having to wait for the unbonding period."),(0,i.yg)("h3",{id:"toggling-the-ability-to-tokenize-shares"},"Toggling the ability to tokenize shares"),(0,i.yg)("p",null,"Currently the liquid staking module facilitates the immediate conversion of staked assets into liquid staked tokens. Despite the many benefits that come with this capability, it does inadvertently negate a protective measure available via traditional staking, where an account can stake their tokens to render them illiquid in the event that their wallet is compromised (the attacker would first need to unbond, then transfer out the tokens)."),(0,i.yg)("p",null,"Tokenization obviates this potential recovery measure, as an attacker could tokenize and immediately transfer staked tokens to another wallet. So, as an additional protective measure, the staking module permit accounts to selectively disable the tokenization of their stake with the ",(0,i.yg)("inlineCode",{parentName:"p"},"DisableTokenizeShares")," message."),(0,i.yg)("p",null,"The ",(0,i.yg)("inlineCode",{parentName:"p"},"DisableTokenizeShares")," message is exposed by the staking module and can be executed as follows:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-sh"},"gaiad tx staking disable-tokenize-shares --from mykey \n")),(0,i.yg)("p",null,"When tokenization is disabled, a lock is placed on the account, effectively preventing the tokenization of any delegations. Re-enabling tokenization would initiate the removal of the lock, but the process is not immediate. The lock removal is queued, with the lock itself persisting throughout the unbonding period. Following the completion of the unbonding period, the lock would be completely removed, restoring the account's ability to tokenize. For liquid staking protocols that enable the lock, this delay better positions the base layer to coordinate a recovery in the event of an exploit."),(0,i.yg)("h2",{id:"risks"},"Risks"),(0,i.yg)("p",null,"Staking Atoms is not free of risk. First, staked Atoms are locked up, and retrieving them requires a 3 week waiting period called unbonding period. Additionally, if a validator misbehaves, a portion of their total stake can be slashed (i.e. destroyed). This includes the stake of their delegators."),(0,i.yg)("p",null,"There is one main slashing condition:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Double signing:")," If someone reports on that a validator signed two different blocks with the same chain ID at the same height, this validator will get slashed.")),(0,i.yg)("p",null,"This is why Atom holders should perform careful due diligence on validators before delegating. It is also important that delegators actively monitor the activity of their validators. If a validator behaves suspiciously or is too often offline, delegators can choose to unbond from them or switch to another validator. ",(0,i.yg)("strong",{parentName:"p"},"Delegators can also mitigate risk by distributing their stake across multiple validators."),"s"))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/69e61f52.b4811c42.js b/assets/js/69e61f52.b4811c42.js new file mode 100644 index 00000000000..3347fb23f6d --- /dev/null +++ b/assets/js/69e61f52.b4811c42.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[2045],{5680:(e,t,r)=>{r.d(t,{xA:()=>c,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),u=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},y=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(r),y=a,d=p["".concat(l,".").concat(y)]||p[y]||m[y]||i;return r?n.createElement(d,o(o({ref:t},c),{},{components:r})):n.createElement(d,o({ref:t},c))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=y;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,o[1]=s;for(var u=2;u<i;u++)o[u]=r[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}y.displayName="MDXCreateElement"},3389:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const i={title:"System requirements",sidebar_position:4},o="System requirements",s={unversionedId:"getting-started/system-requirements",id:"getting-started/system-requirements",title:"System requirements",description:"\x3c!--",source:"@site/docs/getting-started/system-requirements.md",sourceDirName:"getting-started",slug:"/getting-started/system-requirements",permalink:"/main/getting-started/system-requirements",draft:!1,tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"System requirements",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Quick Start - Join Mainnet",permalink:"/main/getting-started/quickstart"},next:{title:"Gaia Tutorials",permalink:"/main/hub-tutorials/"}},l={},u=[{value:"Gaia Upgrades",id:"gaia-upgrades",level:2}],c={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"system-requirements"},"System requirements"),(0,a.yg)("h2",{id:"gaia-upgrades"},"Gaia Upgrades"),(0,a.yg)("p",null,"The Gaia application typically needs at least 32GB RAM, for smooth operation for upgrade, as there may be lengthy migrations to perform."),(0,a.yg)("p",null,"If you have less than 32GB RAM, you might try creating a swapfile to swap an idle program onto the hard disk to free up memory. This can allow your machine to run the binary than it could run in RAM alone."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},"# Linux instructions\nsudo fallocate -l 16G /swapfile\nsudo chmod 600 /swapfile\nsudo mkswap /swapfile\nsudo swapon /swapfile\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6e233af6.35cb3878.js b/assets/js/6e233af6.35cb3878.js new file mode 100644 index 00000000000..56555476af6 --- /dev/null +++ b/assets/js/6e233af6.35cb3878.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[7169],{5680:(e,t,r)=>{r.d(t,{xA:()=>m,yg:()=>g});var a=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,o=function(e,t){if(null==e)return{};var r,a,o={},n=Object.keys(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=a.createContext({}),c=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},m=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,o=e.mdxType,n=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),u=c(r),d=o,g=u["".concat(s,".").concat(d)]||u[d]||p[d]||n;return r?a.createElement(g,i(i({ref:t},m),{},{components:r})):a.createElement(g,i({ref:t},m))}));function g(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=r.length,i=new Array(n);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var c=2;c<n;c++)i[c]=r[c];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},832:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>n,metadata:()=>l,toc:()=>c});var a=r(8168),o=(r(6540),r(5680));const n={title:"Gaia Modules",order:1},i=void 0,l={unversionedId:"modules/README",id:"modules/README",title:"Gaia Modules",description:"Here you can find an overview of the modules included on the Cosmos Hub (Gaia) blockchain with relevant info and",source:"@site/docs/modules/README.md",sourceDirName:"modules",slug:"/modules/",permalink:"/main/modules/",draft:!1,tags:[],version:"current",frontMatter:{title:"Gaia Modules",order:1},sidebar:"tutorialSidebar",previous:{title:"ADR Creation Process",permalink:"/main/architecture/PROCESS"},next:{title:"LSM Staking",permalink:"/main/modules/lsm-staking"}},s={},c=[{value:"cosmos-sdk",id:"cosmos-sdk",level:2},{value:"ibc-go",id:"ibc-go",level:2},{value:"gaia specific modules",id:"gaia-specific-modules",level:2},{value:"other modules",id:"other-modules",level:2}],m={toc:c},u="wrapper";function p(e){let{components:t,...r}=e;return(0,o.yg)(u,(0,a.A)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("p",null,"Here you can find an overview of the modules included on the Cosmos Hub (Gaia) blockchain with relevant info and\nlinks for each one."),(0,o.yg)("h1",{id:"module-list"},"Module List"),(0,o.yg)("h2",{id:"cosmos-sdk"},"cosmos-sdk"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://docs.cosmos.network/v0.50/build/modules/auth"},"x/auth")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://docs.cosmos.network/v0.50/build/modules/authz"},"x/authz")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://docs.cosmos.network/v0.50/build/modules/bank"},"x/bank")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://docs.cosmos.network/v0.50/build/modules/capability"},"x/capability")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://docs.cosmos.network/v0.50/build/modules/consensus"},"x/consensus")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://docs.cosmos.network/v0.50/build/modules/crisis"},"x/crisis")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://docs.cosmos.network/v0.50/build/modules/distribution"},"x/distribution")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://docs.cosmos.network/v0.50/build/modules/evidence"},"x/evidence")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://docs.cosmos.network/v0.50/build/modules/feegrant"},"x/feegrant")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://docs.cosmos.network/v0.50/build/modules/gov"},"x/gov")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://docs.cosmos.network/v0.50/build/modules/mint"},"x/mint")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://docs.cosmos.network/v0.50/build/modules/params"},"x/params")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://docs.cosmos.network/v0.50/build/modules/slashing"},"x/slashing")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://docs.cosmos.network/v0.50/build/modules/staking"},"x/staking (with LSM changes)")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://docs.cosmos.network/v0.50/build/modules/upgrade"},"x/upgrade"))),(0,o.yg)("h2",{id:"ibc-go"},"ibc-go"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://ibc.cosmos.network/main/apps/transfer/overview"},"transfer")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://ibc.cosmos.network/v8/apps/interchain-accounts/client#host"},"interchain accounts - host")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://ibc.cosmos.network/v8/apps/interchain-accounts/client#controller"},"interchain accounts - controller")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://github.com/cosmos/interchain-security/tree/main/x/ccv/provider"},"interchain-security/provider")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://github.com/cosmos/ibc-apps/tree/main/middleware/packet-forward-middleware"},"packetforward")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://ibc.cosmos.network/v8/middleware/ics29-fee/overview"},"ibcfee")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://github.com/Stride-Labs/ibc-rate-limiting"},"ibc-rate-limiting"))),(0,o.yg)("h2",{id:"gaia-specific-modules"},"gaia specific modules"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"/main/modules/metaprotocols"},"Metaprotocols")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"/main/modules/lsm-staking"},"LSM staking"))),(0,o.yg)("h2",{id:"other-modules"},"other modules"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://github.com/skip-mev/feemarket"},"fee market"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/781312e5.32264991.js b/assets/js/781312e5.32264991.js new file mode 100644 index 00000000000..09e2a0b26ff --- /dev/null +++ b/assets/js/781312e5.32264991.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[9053],{5680:(e,a,t)=>{t.d(a,{xA:()=>u,yg:()=>c});var n=t(6540);function o(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function i(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function r(e){for(var a=1;a<arguments.length;a++){var t=null!=arguments[a]?arguments[a]:{};a%2?i(Object(t),!0).forEach((function(a){o(e,a,t[a])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(t,a))}))}return e}function s(e,a){if(null==e)return{};var t,n,o=function(e,a){if(null==e)return{};var t,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)t=i[n],a.indexOf(t)>=0||(o[t]=e[t]);return o}(e,a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)t=i[n],a.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=n.createContext({}),d=function(e){var a=n.useContext(l),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},u=function(e){var a=d(e.components);return n.createElement(l.Provider,{value:a},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},g=n.forwardRef((function(e,a){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=d(t),g=o,c=p["".concat(l,".").concat(g)]||p[g]||m[g]||i;return t?n.createElement(c,r(r({ref:a},u),{},{components:t})):n.createElement(c,r({ref:a},u))}));function c(e,a){var t=arguments,o=a&&a.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var s={};for(var l in a)hasOwnProperty.call(a,l)&&(s[l]=a[l]);s.originalType=e,s[p]="string"==typeof e?e:o,r[1]=s;for(var d=2;d<i;d++)r[d]=t[d];return n.createElement.apply(null,r)}return n.createElement.apply(null,t)}g.displayName="MDXCreateElement"},4594:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var n=t(8168),o=(t(6540),t(5680));const i={title:"Running a Validator",order:2},r=void 0,s={unversionedId:"validators/validator-setup",id:"validators/validator-setup",title:"Running a Validator",description:"We suggest you try out joining a public testnet first. Information on how to join the most recent testnet can be found here.",source:"@site/docs/validators/validator-setup.md",sourceDirName:"validators",slug:"/validators/validator-setup",permalink:"/main/validators/validator-setup",draft:!1,tags:[],version:"current",frontMatter:{title:"Running a Validator",order:2},sidebar:"tutorialSidebar",previous:{title:"Validator FAQ",permalink:"/main/validators/validator-faq"},next:{title:"Governance Overview",permalink:"/main/governance/"}},l={},d=[{value:"What is a Validator?",id:"what-is-a-validator",level:2},{value:"Create Your Validator",id:"create-your-validator",level:2},{value:"Edit Validator Description",id:"edit-validator-description",level:2},{value:"View Validator Description",id:"view-validator-description",level:2},{value:"Track Validator Signing Information",id:"track-validator-signing-information",level:2},{value:"Unjail Validator",id:"unjail-validator",level:2},{value:"Confirm Your Validator is Running",id:"confirm-your-validator-is-running",level:2},{value:"Halting Your Validator",id:"halting-your-validator",level:2},{value:"Advanced configuration",id:"advanced-configuration",level:2},{value:"Common Problems",id:"common-problems",level:2},{value:"Problem #1: My validator has <code>voting_power: 0</code>",id:"problem-1-my-validator-has-voting_power-0",level:3},{value:"Problem #2: My <code>gaiad</code> crashes because of <code>too many open files</code>",id:"problem-2-my-gaiad-crashes-because-of-too-many-open-files",level:3}],u={toc:d},p="wrapper";function m(e){let{components:a,...t}=e;return(0,o.yg)(p,(0,n.A)({},u,t,{components:a,mdxType:"MDXLayout"}),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},"We suggest you try out joining a public testnet first. Information on how to join the most recent testnet can be found ",(0,o.yg)("a",{parentName:"p",href:"/hub-tutorials/join-testnet"},"here"),".")),(0,o.yg)("p",null,"Before setting up a validator node, make sure to have completed the ",(0,o.yg)("a",{parentName:"p",href:"/hub-tutorials/join-mainnet"},"Joining Mainnet")," guide."),(0,o.yg)("p",null,"If you plan to use a KMS (key management system), you should go through these steps first: ",(0,o.yg)("a",{parentName:"p",href:"/validators/kms/kms"},"Using a KMS"),"."),(0,o.yg)("h2",{id:"what-is-a-validator"},"What is a Validator?"),(0,o.yg)("p",null,(0,o.yg)("a",{parentName:"p",href:"/validators/overview"},"Validators")," are responsible for committing new blocks to the blockchain through an automated voting process. A validator's stake is slashed if they become unavailable or sign blocks at the same height. Because there is a chance of slashing, we suggest you read about ",(0,o.yg)("a",{parentName:"p",href:"/validators/validator-faq#how-can-validators-protect-themselves-from-denial-of-service-attacks"},"Sentry Node Architecture")," to protect your node from DDOS attacks and to ensure high-availability."),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},"If you want to become a validator for the Hub's ",(0,o.yg)("inlineCode",{parentName:"p"},"mainnet"),", you should learn more about ",(0,o.yg)("a",{parentName:"p",href:"/validators/security"},"security"),".")),(0,o.yg)("p",null,"The following instructions assume you have already ",(0,o.yg)("a",{parentName:"p",href:"/hub-tutorials/join-mainnet"},"set up a full-node")," and are synchronised to the latest blockheight."),(0,o.yg)("h2",{id:"create-your-validator"},"Create Your Validator"),(0,o.yg)("p",null,"Your ",(0,o.yg)("inlineCode",{parentName:"p"},"cosmosvalconspub")," can be used to create a new validator by staking tokens. You can find your validator pubkey by running:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tendermint show-validator\n")),(0,o.yg)("p",null,"To create your validator, just use the following command:"),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},"Don't use more ",(0,o.yg)("inlineCode",{parentName:"p"},"uatom")," than you have!")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},'gaiad tx staking create-validator \\\n --amount=1000000uatom \\\n --pubkey=$(gaiad tendermint show-validator) \\\n --moniker="choose a moniker" \\\n --chain-id=<chain_id> \\\n --commission-rate="0.10" \\\n --commission-max-rate="0.20" \\\n --commission-max-change-rate="0.01" \\\n --gas="auto" \\\n --gas-prices="0.0025uatom" \\\n --from=<key_name>\n')),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},"When specifying commission parameters, the ",(0,o.yg)("inlineCode",{parentName:"p"},"commission-max-change-rate")," is used to measure % ",(0,o.yg)("em",{parentName:"p"},"point")," change over the ",(0,o.yg)("inlineCode",{parentName:"p"},"commission-rate"),". E.g. 1% to 2% is a 100% rate increase, but only 1 percentage point.")),(0,o.yg)("p",null,"It's possible that you won't have enough ATOM to be part of the active set of validators in the beginning. Users are able to delegate to inactive validators (those outside of the active set) using the ",(0,o.yg)("a",{parentName:"p",href:"https://wallet.keplr.app/#/cosmoshub/stake?tab=inactive-validators"},"Keplr web app"),". You can confirm that you are in the validator set by using a third party explorer like ",(0,o.yg)("a",{parentName:"p",href:"https://www.mintscan.io/cosmos/validators"},"Mintscan"),"."),(0,o.yg)("h2",{id:"edit-validator-description"},"Edit Validator Description"),(0,o.yg)("p",null,"You can edit your validator's public description. This info is to identify your validator, and will be relied on by delegators to decide which validators to stake to. Make sure to provide input for every flag below. If a flag is not included in the command the field will default to empty (",(0,o.yg)("inlineCode",{parentName:"p"},"--moniker")," defaults to the machine name) if the field has never been set or remain the same if it has been set in the past."),(0,o.yg)("p",null,"The <key_name> specifies which validator you are editing. If you choose to not include some of the flags below, remember that the --from flag ",(0,o.yg)("strong",{parentName:"p"},"must")," be included to identify the validator to update."),(0,o.yg)("p",null,"The ",(0,o.yg)("inlineCode",{parentName:"p"},"--identity")," can be used as to verify identity with systems like Keybase or UPort. When using Keybase, ",(0,o.yg)("inlineCode",{parentName:"p"},"--identity")," should be populated with a 16-digit string that is generated with a ",(0,o.yg)("a",{parentName:"p",href:"https://keybase.io"},"keybase.io")," account. It's a cryptographically secure method of verifying your identity across multiple online networks. The Keybase API allows us to retrieve your Keybase avatar. This is how you can add a logo to your validator profile."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},'gaiad tx staking edit-validator\n --moniker="choose a moniker" \\\n --website="https://cosmos.network" \\\n --identity=6A0D65E29A4CBC8E \\\n --details="To infinity and beyond!" \\\n --chain-id=<chain_id> \\\n --gas="auto" \\\n --gas-prices="0.0025uatom" \\\n --from=<key_name> \\\n --commission-rate="0.10"\n')),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},"Please note that some parameters such as ",(0,o.yg)("inlineCode",{parentName:"p"},"commission-max-rate")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"commission-max-change-rate")," cannot be changed once your validator is up and running.")),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Note"),": The ",(0,o.yg)("inlineCode",{parentName:"p"},"commission-rate")," value must adhere to the following rules:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Must be between 0 and the validator's ",(0,o.yg)("inlineCode",{parentName:"li"},"commission-max-rate")),(0,o.yg)("li",{parentName:"ul"},"Must not exceed the validator's ",(0,o.yg)("inlineCode",{parentName:"li"},"commission-max-change-rate")," which is maximum\n% point change rate ",(0,o.yg)("strong",{parentName:"li"},"per day"),". In other words, a validator can only change\nits commission once per day and within ",(0,o.yg)("inlineCode",{parentName:"li"},"commission-max-change-rate")," bounds.")),(0,o.yg)("h2",{id:"view-validator-description"},"View Validator Description"),(0,o.yg)("p",null,"View the validator's information with this command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query staking validator <account_cosmos>\n")),(0,o.yg)("h2",{id:"track-validator-signing-information"},"Track Validator Signing Information"),(0,o.yg)("p",null,"In order to keep track of a validator's signatures in the past you can do so by using the ",(0,o.yg)("inlineCode",{parentName:"p"},"signing-info")," command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query slashing signing-info <validator-pubkey>\\\n --chain-id=<chain_id>\n")),(0,o.yg)("h2",{id:"unjail-validator"},"Unjail Validator"),(0,o.yg)("p",null,'When a validator is "jailed" for downtime, you must submit an ',(0,o.yg)("inlineCode",{parentName:"p"},"Unjail")," transaction from the operator account in order to be able to get block proposer rewards again (depends on the zone fee distribution)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx slashing unjail \\\n --from=<key_name> \\\n --chain-id=<chain_id>\n")),(0,o.yg)("h2",{id:"confirm-your-validator-is-running"},"Confirm Your Validator is Running"),(0,o.yg)("p",null,"Your validator is active if the following command returns anything:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},'gaiad query tendermint-validator-set | grep "$(gaiad tendermint show-address)"\n')),(0,o.yg)("p",null,"You should now see your validator in one of the Cosmos Hub explorers. You are looking for the ",(0,o.yg)("inlineCode",{parentName:"p"},"bech32")," encoded ",(0,o.yg)("inlineCode",{parentName:"p"},"address")," in the ",(0,o.yg)("inlineCode",{parentName:"p"},"~/.gaia/config/priv_validator.json")," file."),(0,o.yg)("h2",{id:"halting-your-validator"},"Halting Your Validator"),(0,o.yg)("p",null,"When attempting to perform routine maintenance or planning for an upcoming coordinated upgrade, it can be useful to have your validator systematically and gracefully halt. You can achieve this by either setting the ",(0,o.yg)("inlineCode",{parentName:"p"},"halt-height")," to the height at which you want your node to shutdown or by passing the ",(0,o.yg)("inlineCode",{parentName:"p"},"--halt-height")," flag to ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad"),". The node will shutdown with a zero exit code at that given height after committing\nthe block."),(0,o.yg)("h2",{id:"advanced-configuration"},"Advanced configuration"),(0,o.yg)("p",null,"You can find more advanced information about running a node or a validator on the ",(0,o.yg)("a",{parentName:"p",href:"https://docs.cometbft.com/v0.37/core/validators"},"CometBFT Core documentation"),"."),(0,o.yg)("h2",{id:"common-problems"},"Common Problems"),(0,o.yg)("h3",{id:"problem-1-my-validator-has-voting_power-0"},"Problem #1: My validator has ",(0,o.yg)("inlineCode",{parentName:"h3"},"voting_power: 0")),(0,o.yg)("p",null,"Your validator has become jailed. Validators get jailed, i.e. get removed from the active validator set, if they do not vote on at least ",(0,o.yg)("inlineCode",{parentName:"p"},"500")," of the last ",(0,o.yg)("inlineCode",{parentName:"p"},"10,000")," blocks, or if they double sign."),(0,o.yg)("p",null,"If you got jailed for downtime, you can get your voting power back to your validator. First, if you're not using ",(0,o.yg)("a",{parentName:"p",href:"https://docs.cosmos.network/v0.45/run-node/cosmovisor.html"},"Cosmovisor")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," is not running, start it up again:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad start\n")),(0,o.yg)("p",null,"Wait for your full node to catch up to the latest block. Then, you can ",(0,o.yg)("a",{parentName:"p",href:"#unjail-validator"},"unjail your validator")),(0,o.yg)("p",null,"After you have submitted the unjail transaction, check your validator again to see if your voting power is back."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad status\n")),(0,o.yg)("p",null,"You may notice that your voting power is less than it used to be. That's because you got slashed for downtime!"),(0,o.yg)("h3",{id:"problem-2-my-gaiad-crashes-because-of-too-many-open-files"},"Problem #2: My ",(0,o.yg)("inlineCode",{parentName:"h3"},"gaiad")," crashes because of ",(0,o.yg)("inlineCode",{parentName:"h3"},"too many open files")),(0,o.yg)("p",null,"The default number of files Linux can open (per-process) is ",(0,o.yg)("inlineCode",{parentName:"p"},"1024"),". ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," is known to open more than ",(0,o.yg)("inlineCode",{parentName:"p"},"1024")," files. This causes the process to crash. A quick fix is to run ",(0,o.yg)("inlineCode",{parentName:"p"},"ulimit -n 4096")," (increase the number of open files allowed) and then restarting the process with ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad start"),". If you are using ",(0,o.yg)("inlineCode",{parentName:"p"},"systemd")," or another process manager to launch ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," (such as ",(0,o.yg)("a",{parentName:"p",href:"https://docs.cosmos.network/v0.45/run-node/cosmovisor.html"},"Cosmovisor"),") this may require some configuration at that level. A sample ",(0,o.yg)("inlineCode",{parentName:"p"},"systemd")," file to fix this issue is below:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-toml"},"# /etc/systemd/system/gaiad.service\n[Unit]\nDescription=Cosmos Gaia Node\nAfter=network.target\n\n[Service]\nType=simple\nUser=ubuntu\nWorkingDirectory=/home/ubuntu\nExecStart=/home/ubuntu/go/bin/gaiad start\nRestart=on-failure\nRestartSec=3\nLimitNOFILE=4096\n\n[Install]\nWantedBy=multi-user.target\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7b876406.be75b00c.js b/assets/js/7b876406.be75b00c.js new file mode 100644 index 00000000000..01ddd30438a --- /dev/null +++ b/assets/js/7b876406.be75b00c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[7799],{5680:(e,a,n)=>{n.d(a,{xA:()=>p,yg:()=>m});var t=n(6540);function o(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function r(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function i(e){for(var a=1;a<arguments.length;a++){var n=null!=arguments[a]?arguments[a]:{};a%2?r(Object(n),!0).forEach((function(a){o(e,a,n[a])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(n,a))}))}return e}function l(e,a){if(null==e)return{};var n,t,o=function(e,a){if(null==e)return{};var n,t,o={},r=Object.keys(e);for(t=0;t<r.length;t++)n=r[t],a.indexOf(n)>=0||(o[n]=e[n]);return o}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(t=0;t<r.length;t++)n=r[t],a.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=t.createContext({}),d=function(e){var a=t.useContext(s),n=a;return e&&(n="function"==typeof e?e(a):i(i({},a),e)),n},p=function(e){var a=d(e.components);return t.createElement(s.Provider,{value:a},e.children)},g="mdxType",c={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},u=t.forwardRef((function(e,a){var n=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),g=d(n),u=o,m=g["".concat(s,".").concat(u)]||g[u]||c[u]||r;return n?t.createElement(m,i(i({ref:a},p),{},{components:n})):t.createElement(m,i({ref:a},p))}));function m(e,a){var n=arguments,o=a&&a.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=u;var l={};for(var s in a)hasOwnProperty.call(a,s)&&(l[s]=a[s]);l.originalType=e,l[g]="string"==typeof e?e:o,i[1]=l;for(var d=2;d<r;d++)i[d]=n[d];return t.createElement.apply(null,i)}return t.createElement.apply(null,n)}u.displayName="MDXCreateElement"},8499:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var t=n(8168),o=(n(6540),n(5680));const r={title:"Ledger Nano Support",order:3},i="Ledger Nano Support",l={unversionedId:"resources/ledger",id:"resources/ledger",title:"Ledger Nano Support",description:"Using a hardware wallet to store your keys greatly improves the security of your crypto assets. The Ledger device acts as an enclave of the seed and private keys, and the process of signing transactions takes place within it. No private information ever leaves the Ledger device. The following is a short tutorial on using the Cosmos Ledger app with the Gaia CLI or the Keplr wallet extension.",source:"@site/docs/resources/ledger.md",sourceDirName:"resources",slug:"/resources/ledger",permalink:"/main/resources/ledger",draft:!1,tags:[],version:"current",frontMatter:{title:"Ledger Nano Support",order:3},sidebar:"tutorialSidebar",previous:{title:"HD Wallets",permalink:"/main/resources/hd-wallets"},next:{title:"Building Gaia Deterministically",permalink:"/main/resources/reproducible-builds"}},s={},d=[{value:"Install the Cosmos Ledger application",id:"install-the-cosmos-ledger-application",level:2},{value:"Keplr + Ledger Nano",id:"keplr--ledger-nano",level:2},{value:"(Optional) Confirm your address",id:"optional-confirm-your-address",level:3},{value:"Gaia CLI + Ledger Nano",id:"gaia-cli--ledger-nano",level:2},{value:"Before you Begin",id:"before-you-begin",level:3},{value:"Add your Ledger key",id:"add-your-ledger-key",level:3},{value:"Confirm your address",id:"confirm-your-address",level:3},{value:"Connect to a full node",id:"connect-to-a-full-node",level:3},{value:"Sign a transaction",id:"sign-a-transaction",level:3},{value:"Receive funds",id:"receive-funds",level:3},{value:"Further documentation",id:"further-documentation",level:3},{value:"The Cosmos Standard Transaction",id:"the-cosmos-standard-transaction",level:2},{value:"Support",id:"support",level:2}],p={toc:d},g="wrapper";function c(e){let{components:a,...r}=e;return(0,o.yg)(g,(0,t.A)({},p,r,{components:a,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"ledger-nano-support"},"Ledger Nano Support"),(0,o.yg)("p",null,"Using a hardware wallet to store your keys greatly improves the security of your crypto assets. The Ledger device acts as an enclave of the seed and private keys, and the process of signing transactions takes place within it. No private information ever leaves the Ledger device. The following is a short tutorial on using the Cosmos Ledger app with the Gaia CLI or the ",(0,o.yg)("a",{parentName:"p",href:"https://www.keplr.app/"},"Keplr")," wallet extension."),(0,o.yg)("p",null,"At the core of a Ledger device there is a mnemonic seed phrase that is used to generate private keys. This phrase is generated when you initialize your Ledger. The mnemonic is compatible with Cosmos and can be used to seed new accounts."),(0,o.yg)("admonition",{type:"danger"},(0,o.yg)("p",{parentName:"admonition"},"Do not lose or share your 24 words with anyone. To prevent theft or loss of funds, it is best to keep multiple copies of your mnemonic stored in safe, secure places. If someone is able to gain access to your mnemonic, they will fully control the accounts associated with them.")),(0,o.yg)("h2",{id:"install-the-cosmos-ledger-application"},"Install the Cosmos Ledger application"),(0,o.yg)("p",null,"Installing the ",(0,o.yg)("inlineCode",{parentName:"p"},"Cosmos")," application on your ledger device is required before you can use either ",(0,o.yg)("a",{parentName:"p",href:"#keplr--ledger-nano"},"Keplr")," or ",(0,o.yg)("a",{parentName:"p",href:"#gaia-cli--ledger-nano"},(0,o.yg)("inlineCode",{parentName:"a"},"gaiad")),". To do so, you need to:"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"Install ",(0,o.yg)("a",{parentName:"li",href:"https://www.ledger.com/ledger-live"},"Ledger Live")," on your machine."),(0,o.yg)("li",{parentName:"ol"},"Using Ledger Live, ",(0,o.yg)("a",{parentName:"li",href:"https://support.ledger.com/hc/en-us/articles/360002731113?docs=true"},"update your Ledger Nano S with the latest firmware"),"."),(0,o.yg)("li",{parentName:"ol"},"On the Ledger Live application, navigate to the ",(0,o.yg)("inlineCode",{parentName:"li"},"Manager")," menu .\n",(0,o.yg)("img",{alt:"manager",src:n(9771).A,width:"2034",height:"1526"})),(0,o.yg)("li",{parentName:"ol"},"Connect your Ledger Nano device and allow Ledger Manager from it."),(0,o.yg)("li",{parentName:"ol"},"On the Ledger Live application, Search for ",(0,o.yg)("inlineCode",{parentName:"li"},"Cosmos"),".\n",(0,o.yg)("img",{alt:"search",src:n(1092).A,width:"2044",height:"1532"})),(0,o.yg)("li",{parentName:"ol"},"Install the Cosmos application by clicking on ",(0,o.yg)("inlineCode",{parentName:"li"},"Install"),".")),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},"To see the ",(0,o.yg)("inlineCode",{parentName:"p"},"Cosmos")," application when you search for it, you might need to activate the ",(0,o.yg)("inlineCode",{parentName:"p"},"Developer Mode"),", located in the Experimental features tab of the Ledger Live application.")),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Devmode",src:n(8667).A,width:"2040",height:"1530"})),(0,o.yg)("h2",{id:"keplr--ledger-nano"},"Keplr + Ledger Nano"),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Note: You need to ",(0,o.yg)("a",{parentName:"strong",href:"#install-the-cosmos-ledger-application"},"install the Cosmos app")," on your Ledger Nano before following this section")),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"Connect your Ledger device to your computer, unlock it with the PIN and open the Cosmos app."),(0,o.yg)("li",{parentName:"ol"},"Install the ",(0,o.yg)("a",{parentName:"li",href:"https://www.keplr.app/"},"Keplr browser extension"),"."),(0,o.yg)("li",{parentName:"ol"},"Click on the Keplr extension icon and select ",(0,o.yg)("inlineCode",{parentName:"li"},"Import Ledger")," and choose an account name and password."),(0,o.yg)("li",{parentName:"ol"},"Make sure your Ledger device is unlocked and has the Cosmos app open and then follow the instructions on the Keplr pop-up.")),(0,o.yg)("p",null,"That's it! You can now use Keplr with your Ledger Nano S. You can use the ",(0,o.yg)("a",{parentName:"p",href:"https://wallet.keplr.app/#/dashboard"},"Keplr web app")," to get a more detailed overview of your Cosmos account."),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Note: Each time you will send a transaction, you will need to confirm it on your Ledger device. Indication will be prompted from the Keplr interface")),(0,o.yg)("h3",{id:"optional-confirm-your-address"},"(Optional) Confirm your address"),(0,o.yg)("p",null,"You can double check that Keplr is displaying the correct address directly on your Ledger Nano device. To do so:"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"Connect your Ledger to your computer and open the Cosmos application on the device."),(0,o.yg)("li",{parentName:"ol"},"Once the Cosmos app is open, click on the right button to access the ",(0,o.yg)("inlineCode",{parentName:"li"},"Show Address")," option."),(0,o.yg)("li",{parentName:"ol"},"Click on both button, then select ",(0,o.yg)("inlineCode",{parentName:"li"},"Account 0")," and ",(0,o.yg)("inlineCode",{parentName:"li"},"Index 0"),".")),(0,o.yg)("p",null,"You should now see the same address that is displayed on the Keplr extension."),(0,o.yg)("p",null,"To learn more about using Keplr, we suggest you have a look at their ",(0,o.yg)("a",{parentName:"p",href:"https://keplr.crunch.help"},"support documentation"),"."),(0,o.yg)("p",null,"You can also have a look at the ",(0,o.yg)("a",{parentName:"p",href:"https://support.ledger.com/hc/en-us/articles/4411149814417?docs=true"},"Ledger support page")," for more details."),(0,o.yg)("h2",{id:"gaia-cli--ledger-nano"},"Gaia CLI + Ledger Nano"),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Note: You need to ",(0,o.yg)("a",{parentName:"strong",href:"#install-the-cosmos-ledger-application"},"install the Cosmos app")," on your Ledger Nano before following this section")),(0,o.yg)("p",null,"The tool used to generate addresses and transactions on the Cosmos Hub network is ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad"),". Here is how to get started. If using a CLI tool is unfamiliar to you, scroll down and follow instructions for using the Keplr wallet instead."),(0,o.yg)("h3",{id:"before-you-begin"},"Before you Begin"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://golang.org/doc/install"},"Install Golang")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"../getting-started/installation"},"Install Gaia"))),(0,o.yg)("p",null,"Verify that gaiad is installed correctly with the following command"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad version --long\n\n\u279c cosmos-sdk: 0.34.3\ngit commit: 67ab0b1e1d1e5b898c8cbdede35ad5196dba01b2\nvendor hash: 0341b356ad7168074391ca7507f40b050e667722\nbuild tags: netgo ledger\ngo version go1.11.5 darwin/amd64\n")),(0,o.yg)("h3",{id:"add-your-ledger-key"},"Add your Ledger key"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Connect and unlock your Ledger device."),(0,o.yg)("li",{parentName:"ul"},"Open the Cosmos app on your Ledger."),(0,o.yg)("li",{parentName:"ul"},"Create an account in gaiad from your ledger key.")),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},"Be sure to change the ",(0,o.yg)("em",{parentName:"p"},"keyName")," parameter to be a meaningful name. The ",(0,o.yg)("inlineCode",{parentName:"p"},"ledger")," flag tells ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," to use your Ledger to seed the account.")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys add <keyName> --ledger\n\n\u279c NAME: TYPE: ADDRESS: PUBKEY:\n<keyName> ledger cosmos1... cosmospub1...\n")),(0,o.yg)("p",null,"Cosmos uses ",(0,o.yg)("a",{parentName:"p",href:"/main/resources/hd-wallets"},"HD Wallets"),". This means you can setup many accounts using the same Ledger seed. To create another account from your Ledger device, run (change the integer i to some value >= 0 to choose the account for HD derivation):"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys add <secondKeyName> --ledger --account <i>\n")),(0,o.yg)("h3",{id:"confirm-your-address"},"Confirm your address"),(0,o.yg)("p",null,"Run this command to display your address on the device. Use the ",(0,o.yg)("inlineCode",{parentName:"p"},"keyName")," you gave your ledger key. The ",(0,o.yg)("inlineCode",{parentName:"p"},"-d")," flag is supported in version ",(0,o.yg)("inlineCode",{parentName:"p"},"1.5.0")," and higher."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys show <keyName> -d\n")),(0,o.yg)("p",null,"Confirm that the address displayed on the device matches that displayed when you added the key."),(0,o.yg)("h3",{id:"connect-to-a-full-node"},"Connect to a full node"),(0,o.yg)("p",null,"Next, you need to configure gaiad with the URL of a Cosmos full node and the appropriate ",(0,o.yg)("inlineCode",{parentName:"p"},"chain_id"),". In this example we connect to the public load balanced full node operated by Chorus One on the ",(0,o.yg)("inlineCode",{parentName:"p"},"cosmoshub-2")," chain. But you can point your ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," to any Cosmos full node. Be sure that the ",(0,o.yg)("inlineCode",{parentName:"p"},"chain-id")," is set to the same chain as the full node."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad config node https://cosmos.chorus.one:26657\ngaiad config chain_id cosmoshub-2\n")),(0,o.yg)("p",null,"Test your connection with a query such as:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query staking validators\n")),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},"To run your own full node locally ",(0,o.yg)("a",{parentName:"p",href:"/main/hub-tutorials/join-mainnet"},"read more here."),".")),(0,o.yg)("h3",{id:"sign-a-transaction"},"Sign a transaction"),(0,o.yg)("p",null,"You are now ready to start signing and sending transactions. Send a transaction with gaiad using the ",(0,o.yg)("inlineCode",{parentName:"p"},"tx send")," command."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx bank send --help # to see all available options.\n")),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},"Be sure to unlock your device with the PIN and open the Cosmos app before trying to run these commands")),(0,o.yg)("p",null,"Use the ",(0,o.yg)("inlineCode",{parentName:"p"},"keyName")," you set for your Ledger key and gaia will connect with the Cosmos Ledger app to then sign your transaction."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx bank send <keyName> <destinationAddress> <amount><denomination>\n")),(0,o.yg)("p",null,"When prompted with ",(0,o.yg)("inlineCode",{parentName:"p"},"confirm transaction before signing"),", Answer ",(0,o.yg)("inlineCode",{parentName:"p"},"Y"),"."),(0,o.yg)("p",null,"Next you will be prompted to review and approve the transaction on your Ledger device. Be sure to inspect the transaction JSON displayed on the screen. You can scroll through each field and each message. Scroll down to read more about the data fields of a standard transaction object."),(0,o.yg)("p",null,"Now, you are all set to start ",(0,o.yg)("a",{parentName:"p",href:"/main/delegators/delegator-guide-cli#sending-transactions"},"sending transactions on the network"),"."),(0,o.yg)("h3",{id:"receive-funds"},"Receive funds"),(0,o.yg)("p",null,"To receive funds to the Cosmos account on your Ledger device, retrieve the address for your Ledger account (the ones with ",(0,o.yg)("inlineCode",{parentName:"p"},"TYPE ledger"),") with this command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys list\n\n\u279c NAME: TYPE: ADDRESS: PUBKEY:\n<keyName> ledger cosmos1... cosmospub1...\n")),(0,o.yg)("h3",{id:"further-documentation"},"Further documentation"),(0,o.yg)("p",null,"Not sure what ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," can do? Simply run the command without arguments to output documentation for the commands in supports."),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},"The ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," help commands are nested. So ",(0,o.yg)("inlineCode",{parentName:"p"},"$ gaiad")," will output docs for the top level commands (status, config, query, and tx). You can access documentation for sub commands with further help commands."),(0,o.yg)("p",{parentName:"admonition"},"For example, to print the ",(0,o.yg)("inlineCode",{parentName:"p"},"query")," commands:"),(0,o.yg)("pre",{parentName:"admonition"},(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query --help\n")),(0,o.yg)("p",{parentName:"admonition"},"Or to print the ",(0,o.yg)("inlineCode",{parentName:"p"},"tx")," (transaction) commands:"),(0,o.yg)("pre",{parentName:"admonition"},(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx --help\n"))),(0,o.yg)("h2",{id:"the-cosmos-standard-transaction"},"The Cosmos Standard Transaction"),(0,o.yg)("p",null,"Transactions in Cosmos embed the ",(0,o.yg)("a",{parentName:"p",href:"https://godoc.org/github.com/cosmos/cosmos-sdk/x/auth#StdTx"},"Standard Transaction type")," from the Cosmos SDK. The Ledger device displays a serialized JSON representation of this object for you to review before signing the transaction. Here are the fields and what they mean:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"chain-id"),": The chain to which you are broadcasting the tx, such as the ",(0,o.yg)("inlineCode",{parentName:"li"},"gaia-13003")," testnet or ",(0,o.yg)("inlineCode",{parentName:"li"},"cosmoshub-2"),": mainnet."),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"account_number"),": The global id of the sending account assigned when the account receives funds for the first time."),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"sequence"),": The nonce for this account, incremented with each transaction."),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"fee"),": JSON object describing the transaction fee, its gas amount and coin denomination"),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"memo"),": optional text field used in various ways to tag transactions."),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"msgs_<index>/<field>"),": The array of messages included in the transaction. Double click to drill down into nested fields of the JSON.")),(0,o.yg)("h2",{id:"support"},"Support"),(0,o.yg)("p",null,"For further support, start by looking over the posts in our ",(0,o.yg)("a",{parentName:"p",href:"https://forum.cosmos.network/search?q=ledger"},"forum")),(0,o.yg)("p",null,"Feel welcome to reach out in our ",(0,o.yg)("a",{parentName:"p",href:"https://t.me/cosmosproject"},"Telegram channel")," to ask for help."),(0,o.yg)("p",null,"Here are a few relevant and helpful tutorials from the wonderful Cosmos community:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://catdotfish.medium.com/"},"Catdotfish")," - ",(0,o.yg)("a",{parentName:"li",href:"https://medium.com/chainapsis/how-to-use-keplr-wallet-40afc80907f6"},"How to use the Keplr Wallet")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://medium.com/cryptium"},"Cryptium Labs")," - ",(0,o.yg)("a",{parentName:"li",href:"https://medium.com/cryptium-cosmos/how-to-store-your-cosmos-atoms-on-your-ledger-and-delegate-with-the-command-line-929eb29705f"},"How to store your ATOMS on your Ledger and delegate with the command line"))))}c.isMDXComponent=!0},8667:(e,a,n)=>{n.d(a,{A:()=>t});const t=n.p+"assets/images/ledger-tuto-dev-mode-c4e394fda2491363a287cbf1fc82ab39.png"},9771:(e,a,n)=>{n.d(a,{A:()=>t});const t=n.p+"assets/images/ledger-tuto-manager-f0a3a54c10bfa2405995efaed78536f1.png"},1092:(e,a,n)=>{n.d(a,{A:()=>t});const t=n.p+"assets/images/ledger-tuto-search-d4d718ef5efa0fb720af125ef8819fd5.png"}}]); \ No newline at end of file diff --git a/assets/js/7b940702.cc2454a5.js b/assets/js/7b940702.cc2454a5.js new file mode 100644 index 00000000000..186bff150e6 --- /dev/null +++ b/assets/js/7b940702.cc2454a5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[1046],{5680:(e,n,a)=>{a.d(n,{xA:()=>p,yg:()=>y});var i=a(6540);function t(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function l(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);n&&(i=i.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,i)}return a}function o(e){for(var n=1;n<arguments.length;n++){var a=null!=arguments[n]?arguments[n]:{};n%2?l(Object(a),!0).forEach((function(n){t(e,n,a[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(a,n))}))}return e}function s(e,n){if(null==e)return{};var a,i,t=function(e,n){if(null==e)return{};var a,i,t={},l=Object.keys(e);for(i=0;i<l.length;i++)a=l[i],n.indexOf(a)>=0||(t[a]=e[a]);return t}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(i=0;i<l.length;i++)a=l[i],n.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(t[a]=e[a])}return t}var r=i.createContext({}),d=function(e){var n=i.useContext(r),a=n;return e&&(a="function"==typeof e?e(n):o(o({},n),e)),a},p=function(e){var n=d(e.components);return i.createElement(r.Provider,{value:n},e.children)},g="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return i.createElement(i.Fragment,{},n)}},u=i.forwardRef((function(e,n){var a=e.components,t=e.mdxType,l=e.originalType,r=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),g=d(a),u=t,y=g["".concat(r,".").concat(u)]||g[u]||m[u]||l;return a?i.createElement(y,o(o({ref:n},p),{},{components:a})):i.createElement(y,o({ref:n},p))}));function y(e,n){var a=arguments,t=n&&n.mdxType;if("string"==typeof e||t){var l=a.length,o=new Array(l);o[0]=u;var s={};for(var r in n)hasOwnProperty.call(n,r)&&(s[r]=n[r]);s.originalType=e,s[g]="string"==typeof e?e:t,o[1]=s;for(var d=2;d<l;d++)o[d]=a[d];return i.createElement.apply(null,o)}return i.createElement.apply(null,a)}u.displayName="MDXCreateElement"},5774:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>d});var i=a(8168),t=(a(6540),a(5680));const l={title:"The Genesis File",order:1},o=void 0,s={unversionedId:"resources/genesis",id:"resources/genesis",title:"The Genesis File",description:"This document explains how the genesis file of the Cosmos Hub mainnet is structured. It also explains how you can build a genesis file for your own gaia testnet.",source:"@site/docs/resources/genesis.md",sourceDirName:"resources",slug:"/resources/genesis",permalink:"/main/resources/genesis",draft:!1,tags:[],version:"current",frontMatter:{title:"The Genesis File",order:1},sidebar:"tutorialSidebar",previous:{title:"Cosmos Hub Archives",permalink:"/main/resources/archives"},next:{title:"HD Wallets",permalink:"/main/resources/hd-wallets"}},r={},d=[{value:"What is a Genesis File",id:"what-is-a-genesis-file",level:2},{value:"Genesis Time and Chain_id",id:"genesis-time-and-chain_id",level:2},{value:"Consensus Parameters",id:"consensus-parameters",level:2},{value:"Application State",id:"application-state",level:2},{value:"Genesis Accounts",id:"genesis-accounts",level:3},{value:"Bank",id:"bank",level:3},{value:"Staking",id:"staking",level:3},{value:"Mint",id:"mint",level:3},{value:"Distribution",id:"distribution",level:3},{value:"Governance",id:"governance",level:3},{value:"Slashing",id:"slashing",level:3},{value:"Genesis Transactions",id:"genesis-transactions",level:3}],p={toc:d},g="wrapper";function m(e){let{components:n,...a}=e;return(0,t.yg)(g,(0,i.A)({},p,a,{components:n,mdxType:"MDXLayout"}),(0,t.yg)("p",null,"This document explains how the genesis file of the Cosmos Hub mainnet is structured. It also explains how you can build a genesis file for your own ",(0,t.yg)("inlineCode",{parentName:"p"},"gaia")," testnet."),(0,t.yg)("p",null,"Note that you can generate a default genesis file for your own testnet by running the following command:"),(0,t.yg)("pre",null,(0,t.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad init <moniker> --chain-id <chain-id>\n")),(0,t.yg)("p",null,"The genesis file is stored in ",(0,t.yg)("inlineCode",{parentName:"p"},"~/.gaia/config/genesis.toml"),"."),(0,t.yg)("h2",{id:"what-is-a-genesis-file"},"What is a Genesis File"),(0,t.yg)("p",null,"A genesis file is a JSON file which defines the initial state of your blockchain. It can be seen as height ",(0,t.yg)("inlineCode",{parentName:"p"},"0")," of your blockchain. The first block, at height ",(0,t.yg)("inlineCode",{parentName:"p"},"1"),", will reference the genesis file as its parent."),(0,t.yg)("p",null,"The state defined in the genesis file contains all the necessary information, like initial token allocation, genesis time, default parameters, and more. Let us break down this information."),(0,t.yg)("h2",{id:"genesis-time-and-chain_id"},"Genesis Time and Chain_id"),(0,t.yg)("p",null,"The ",(0,t.yg)("inlineCode",{parentName:"p"},"genesis_time")," is defined at the top of the genesis file. It is a ",(0,t.yg)("inlineCode",{parentName:"p"},"UTC")," timestamp that specifies when the blockchain is due to start. At this time, genesis validators are supposed to come online and start participating in the consensus process. The blockchain starts when more than 2/3rd of the genesis validators (weighted by voting power) are online."),(0,t.yg)("pre",null,(0,t.yg)("code",{parentName:"pre",className:"language-json"},'"genesis_time": "2019-03-13T17:00:00.000000000Z",\n')),(0,t.yg)("p",null,"The ",(0,t.yg)("inlineCode",{parentName:"p"},"chain_id")," is a unique identifier for your chain. It helps differentiate between different chains using the same version of the software."),(0,t.yg)("pre",null,(0,t.yg)("code",{parentName:"pre",className:"language-json"},'"chain_id": "cosmoshub-2",\n')),(0,t.yg)("h2",{id:"consensus-parameters"},"Consensus Parameters"),(0,t.yg)("p",null,"Next, the genesis file defines consensus parameters. Consensus parameters regroup all the parameters that are related to the consensus layer, which is ",(0,t.yg)("inlineCode",{parentName:"p"},"Tendermint")," in the case of ",(0,t.yg)("inlineCode",{parentName:"p"},"gaia"),". Let us look at these parameters:"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"block"),(0,t.yg)("ul",{parentName:"li"},(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"max_bytes"),": Maximum number of bytes per block."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"max_gas"),": Gas limit per block. Each transaction included in the block will consume some gas. The total gas used by transactions included in a block cannot exceed this limit."))),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"evidence"),(0,t.yg)("ul",{parentName:"li"},(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"max_age"),": An evidence is a proof that a validator signed two different blocks at the same height (and round). This is an explicitly malicious behaviour that is punished at the state-machine level. The ",(0,t.yg)("inlineCode",{parentName:"li"},"max_age")," defines the maximum number of ",(0,t.yg)("strong",{parentName:"li"},"blocks")," after which an evidence is not valid anymore."))),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"validator"),(0,t.yg)("ul",{parentName:"li"},(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"pub_key_types"),": The types of pubkey (",(0,t.yg)("inlineCode",{parentName:"li"},"ed25519"),", ",(0,t.yg)("inlineCode",{parentName:"li"},"secp256k1"),", ...) that are accepted for validators. Currently only ",(0,t.yg)("inlineCode",{parentName:"li"},"ed25519")," is accepted.")))),(0,t.yg)("pre",null,(0,t.yg)("code",{parentName:"pre",className:"language-json"},'"consensus_params": {\n "block_size": {\n "max_bytes": "150000",\n "max_gas": "1500000"\n },\n "evidence": {\n "max_age": "1000000"\n },\n "validator": {\n "pub_key_types": [\n "ed25519"\n ]\n }\n },\n')),(0,t.yg)("h2",{id:"application-state"},"Application State"),(0,t.yg)("p",null,"The application state defines the initial state of the state-machine."),(0,t.yg)("h3",{id:"genesis-accounts"},"Genesis Accounts"),(0,t.yg)("p",null,"In this section, the initial allocation of tokens is defined. It is possible to add accounts manually by directly editing the genesis file, but it is also possible to use the following command:"),(0,t.yg)("pre",null,(0,t.yg)("code",{parentName:"pre",className:"language-bash"},"// Example: gaiad add-genesis-account cosmos1qs8tnw2t8l6amtzvdemnnsq9dzk0ag0z37gh3h 10000000uatom\n\ngaiad genesis add-genesis-account <account-address> <amount><denom>\n")),(0,t.yg)("p",null,"This command creates an item in the ",(0,t.yg)("inlineCode",{parentName:"p"},"accounts")," list, under the ",(0,t.yg)("inlineCode",{parentName:"p"},"app_state")," section."),(0,t.yg)("pre",null,(0,t.yg)("code",{parentName:"pre",className:"language-json"},'"accounts": [\n {\n "address": "cosmos1qs8tnw2t8l6amtzvdemnnsq9dzk0ag0z37gh3h",\n "coins": [\n {\n "denom": "uatom",\n "amount": "10000000"\n }\n ],\n "sequence_number": "0",\n "account_number": "0",\n "original_vesting": [\n {\n "denom": "uatom",\n "amount": "26306000000"\n }\n ],\n "delegated_free": null,\n "delegated_vesting": null,\n "start_time": "0",\n "end_time": "10000"\n }\n]\n')),(0,t.yg)("p",null,"Let us break down the parameters:"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"sequence_number"),": This number is used to count the number of transactions sent by this account. It is incremented each time a transaction is included in a block, and used to prevent replay attacks. Initial value is ",(0,t.yg)("inlineCode",{parentName:"li"},"0"),"."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"account_number"),": Unique identifier for the account. It is generated the first time a transaction including this account is included in a block."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"original_vesting"),": Vesting is natively supported by ",(0,t.yg)("inlineCode",{parentName:"li"},"gaia"),". You can define an amount of token owned by the account that needs to be vested for a period of time before they can be transferred. Vested tokens can be delegated. Default value is ",(0,t.yg)("inlineCode",{parentName:"li"},"null"),"."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"delegated_free"),": Amount of delegated tokens that can be transferred after they've been vested. Most of the time, will be ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," in genesis."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"delegated_vesting"),": Amount of delegated tokens that are still vesting. Most of the time, will be ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," in genesis."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"start_time"),": Timestamp at which the vesting period starts. ",(0,t.yg)("inlineCode",{parentName:"li"},"0")," most of the time in genesis."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"end_time"),": Timestamp at which the vesting period ends. ",(0,t.yg)("inlineCode",{parentName:"li"},"0")," if no vesting for this account.")),(0,t.yg)("h3",{id:"bank"},"Bank"),(0,t.yg)("p",null,"The ",(0,t.yg)("inlineCode",{parentName:"p"},"bank")," module handles tokens. The only parameter that needs to be defined in this section is whether ",(0,t.yg)("inlineCode",{parentName:"p"},"transfers")," are enabled at genesis or not."),(0,t.yg)("pre",null,(0,t.yg)("code",{parentName:"pre",className:"language-json"},'"bank": {\n "send_enabled": false\n }\n')),(0,t.yg)("h3",{id:"staking"},"Staking"),(0,t.yg)("p",null,"The ",(0,t.yg)("inlineCode",{parentName:"p"},"staking")," module handles the bulk of the Proof-of-Stake logic of the state-machine. This section should look like the following:"),(0,t.yg)("pre",null,(0,t.yg)("code",{parentName:"pre",className:"language-json"},'"staking": {\n "pool": {\n "not_bonded_tokens": "10000000",\n "bonded_tokens": "0"\n },\n "params": {\n "unbonding_time": "1814400000000000",\n "max_validators": 100,\n "max_entries": 7,\n "bond_denom": "uatom"\n },\n "last_total_power": "0",\n "last_validator_powers": null,\n "validators": null,\n "bonds": null,\n "unbonding_delegations": null,\n "redelegations": null,\n "exported": false\n }\n')),(0,t.yg)("p",null,"Let us break down the parameters:"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"pool"),(0,t.yg)("ul",{parentName:"li"},(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"not_bonded_tokens"),": Defines the amount of tokens not bonded (i.e. delegated) in genesis. Generally, it equals the total supply of the staking token (",(0,t.yg)("inlineCode",{parentName:"li"},"uatom")," in this example)."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"bonded_tokens"),": Amount of bonded tokens in genesis. Generally ",(0,t.yg)("inlineCode",{parentName:"li"},"0"),"."))),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"params"),(0,t.yg)("ul",{parentName:"li"},(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"unbonding_time"),": Time in ",(0,t.yg)("strong",{parentName:"li"},"nanosecond")," it takes for tokens to complete unbonding."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"max_validators"),": Maximum number of active validators."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"max_entries"),": Maximum unbonding delegations and redelegations between a particular pair of delegator / validator."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"bond_denom"),": Denomination of the staking token."))),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"last_total_power"),": Total amount of voting power. Generally ",(0,t.yg)("inlineCode",{parentName:"li"},"0")," in genesis (except if genesis was generated using a previous state)."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"last_validator_powers"),": Power of each validator in last known state. Generally ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," in genesis (except if genesis was generated using a previous state)."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"validators"),": List of last known validators. Generally ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," in genesis (except if genesis was generated using a previous state)."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"bonds"),": List of last known delegation. Generally ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," in genesis (except if genesis was generated using a previous state)."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"unbonding_delegations"),": List of last known unbonding delegations. Generally ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," in genesis (except if genesis was generated using a previous state)."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"redelegations"),": List of last known redelegations. Generally ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," in genesis (except if genesis was generated using a previous state)."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"exported"),": Whether this genesis was generated using the export of a previous state.")),(0,t.yg)("h3",{id:"mint"},"Mint"),(0,t.yg)("p",null,"The ",(0,t.yg)("inlineCode",{parentName:"p"},"mint")," module governs the logic of inflating the supply of token. The ",(0,t.yg)("inlineCode",{parentName:"p"},"mint")," section in the genesis file looks like the following:"),(0,t.yg)("pre",null,(0,t.yg)("code",{parentName:"pre",className:"language-json"},'"mint": {\n "minter": {\n "inflation": "0.070000000000000000",\n "annual_provisions": "0.000000000000000000"\n },\n "params": {\n "mint_denom": "uatom",\n "inflation_rate_change": "0.130000000000000000",\n "inflation_max": "0.200000000000000000",\n "inflation_min": "0.070000000000000000",\n "goal_bonded": "0.670000000000000000",\n "blocks_per_year": "6311520"\n }\n }\n')),(0,t.yg)("p",null,"Let us break down the parameters:"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"minter"),(0,t.yg)("ul",{parentName:"li"},(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"inflation"),": Initial yearly percentage of increase in the total supply of staking token, compounded weekly. A ",(0,t.yg)("inlineCode",{parentName:"li"},"0.070000000000000000")," value means the target is ",(0,t.yg)("inlineCode",{parentName:"li"},"7%")," yearly inflation, compounded weekly."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"annual_provisions"),": Calculated each block. Initialize at ",(0,t.yg)("inlineCode",{parentName:"li"},"0.000000000000000000"),"."))),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"params"),(0,t.yg)("ul",{parentName:"li"},(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"mint_denom"),": Denom of the staking token that is inflated."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"inflation_rate_change"),": Max yearly change in inflation."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"inflation_max"),": Maximum level of inflation."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"inflation_min"),": Minimum level of inflation."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"goal_bonded"),": Percentage of the total supply that is targeted to be bonded. If the percentage of bonded staking tokens is below this target, the inflation increases (following ",(0,t.yg)("inlineCode",{parentName:"li"},"inflation_rate_change"),") until it reaches ",(0,t.yg)("inlineCode",{parentName:"li"},"inflation_max"),". If the percentage of bonded staking tokens is above this target, the inflation decreases (following ",(0,t.yg)("inlineCode",{parentName:"li"},"inflation_rate_change"),") until it reaches ",(0,t.yg)("inlineCode",{parentName:"li"},"inflation_min"),"."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"blocks_per_year"),": Estimation of the amount of blocks per year. Used to compute the block reward coming from inflated staking token (called block provisions).")))),(0,t.yg)("h3",{id:"distribution"},"Distribution"),(0,t.yg)("p",null,"The ",(0,t.yg)("inlineCode",{parentName:"p"},"distribution")," module handles the logic of distribution block provisions and fees to validators and delegators. The ",(0,t.yg)("inlineCode",{parentName:"p"},"distribution")," section in the genesis file looks like the following:"),(0,t.yg)("pre",null,(0,t.yg)("code",{parentName:"pre",className:"language-json"},' "distribution": {\n "fee_pool": {\n "community_pool": null\n },\n "community_tax": "0.020000000000000000",\n "base_proposer_reward": "0.010000000000000000",\n "bonus_proposer_reward": "0.040000000000000000",\n "withdraw_addr_enabled": false,\n "delegator_withdraw_infos": null,\n "previous_proposer": "",\n "outstanding_rewards": null,\n "validator_accumulated_commissions": null,\n "validator_historical_rewards": null,\n "validator_current_rewards": null,\n "delegator_starting_infos": null,\n "validator_slash_events": null\n }\n')),(0,t.yg)("p",null,"Let us break down the parameters:"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"fee_pool"),(0,t.yg)("ul",{parentName:"li"},(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"community_pool"),": The community pool is a pool of tokens that can be used to pay for bounties. It is allocated via governance proposals. Generally ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," in genesis."))),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"community_tax"),": The tax percentage on fees and block rewards that goes to the community pool."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"base_proposer_reward"),": Base bonus on transaction fees collected in a valid block that goes to the proposer of block. If value is ",(0,t.yg)("inlineCode",{parentName:"li"},"0.010000000000000000"),", 1% of the fees go to the proposer."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"bonus_proposer_reward"),": Max bonus on transaction fees collected in a valid block that goes to the proposer of block. The bonus depends on the number of ",(0,t.yg)("inlineCode",{parentName:"li"},"precommits")," the proposer includes. If the proposer includes 2/3rd ",(0,t.yg)("inlineCode",{parentName:"li"},"precommits")," weighted by voting power (minimum for the block to be valid), they get a bonus of ",(0,t.yg)("inlineCode",{parentName:"li"},"base_proposer_reward"),". This bonus increases linearly up to ",(0,t.yg)("inlineCode",{parentName:"li"},"bonus_proposer_reward")," if the proposer includes 100% of ",(0,t.yg)("inlineCode",{parentName:"li"},"precommits"),"."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"withdraw_addr_enabled"),": If ",(0,t.yg)("inlineCode",{parentName:"li"},"true"),", delegators can set a different address to withdraw their rewards. Set to ",(0,t.yg)("inlineCode",{parentName:"li"},"false")," if you want to disable transfers at genesis, as it can be used as a way to get around the restriction."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"delegator_withdraw_infos"),": List of delegators withdraw address. Generally ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," if genesis was not exported from previous state."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"previous_proposer"),": Proposer of the previous block. Set to ",(0,t.yg)("inlineCode",{parentName:"li"},'""')," if genesis was not exported from previous state."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"outstanding_rewards"),": Outstanding (un-withdrawn) rewards. Set to ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," if genesis was not exported from previous state."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"validator_accumulated_commission"),": Outstanding (un-withdrawn) commission of validators. Set to ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," if genesis was not exported from previous state."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"validator_historical_rewards"),": Set of information related to the historical rewards of validators and used by the ",(0,t.yg)("inlineCode",{parentName:"li"},"distribution")," module for various computation. Set to ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," if genesis was not exported from previous state."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"validators_current_rewards"),": Set of information related to the current rewards of validators and used by the ",(0,t.yg)("inlineCode",{parentName:"li"},"distribution")," module for various computation. Set to ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," if genesis was not exported from previous state."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"delegator_starting_infos"),": Tracks the previous validator period, the delegation's amount of staking token, and the creation height (to check later on if any slashes have occurred). Set to ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," if genesis was not exported from previous state."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"validator_slash_events"),": Set of information related to the past slashing of validators. Set to ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," if genesis was not exported from previous state.")),(0,t.yg)("h3",{id:"governance"},"Governance"),(0,t.yg)("p",null,"The ",(0,t.yg)("inlineCode",{parentName:"p"},"gov")," module handles all governance-related transactions. The initial state of the ",(0,t.yg)("inlineCode",{parentName:"p"},"gov")," section looks like the following:"),(0,t.yg)("pre",null,(0,t.yg)("code",{parentName:"pre",className:"language-json"},'"gov": {\n "starting_proposal_id": "1",\n "deposits": null,\n "votes": null,\n "proposals": null,\n "deposit_params": {\n "min_deposit": [\n {\n "denom": "uatom",\n "amount": "512000000"\n }\n ],\n "max_deposit_period": "1209600000000000"\n },\n "voting_params": {\n "voting_period": "1209600000000000"\n },\n "tally_params": {\n "quorum": "0.4",\n "threshold": "0.5",\n "veto": "0.334",\n "governance_penalty": "0.0"\n }\n }\n')),(0,t.yg)("p",null,"Let us break down the parameters:"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"starting_proposal_id"),": This parameter defines the ID of the first proposal. Each proposal is identified by a unique ID."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"deposits"),": List of deposits for each proposal ID. Set to ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," if genesis was not exported from previous state."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"votes"),": List of votes for each proposal ID. Set to ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," if genesis was not exported from previous state."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"proposals"),": List of proposals for each proposal ID: Set to ",(0,t.yg)("inlineCode",{parentName:"li"},"null")," if genesis was not exported from previous state."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"deposit_params"),(0,t.yg)("ul",{parentName:"li"},(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"min_deposit"),": The minimum deposit required for the proposal to enter ",(0,t.yg)("inlineCode",{parentName:"li"},"Voting Period"),". If multiple denoms are provided, the ",(0,t.yg)("inlineCode",{parentName:"li"},"OR")," operator applies."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"max_deposit_period"),": The maximum period (in ",(0,t.yg)("strong",{parentName:"li"},"nanoseconds"),") after which it is not possible to deposit on the proposal anymore."))),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"voting_params"),(0,t.yg)("ul",{parentName:"li"},(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"voting_period"),": Length of the voting period in ",(0,t.yg)("strong",{parentName:"li"},"nanoseconds"),"."))),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"tally_params"),(0,t.yg)("ul",{parentName:"li"},(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"quorum"),": Minimum percentage of bonded staking tokens that needs to vote for the result to be valid."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"threshold"),": Minimum percentage of votes that need to be ",(0,t.yg)("inlineCode",{parentName:"li"},"YES")," for the result to be valid."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"veto"),": Maximum percentage ",(0,t.yg)("inlineCode",{parentName:"li"},"NO_WITH_VETO")," votes for the result to be valid."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"governance_penalty"),": Penalty for validators that do not vote on a given proposal.")))),(0,t.yg)("h3",{id:"slashing"},"Slashing"),(0,t.yg)("p",null,"The ",(0,t.yg)("inlineCode",{parentName:"p"},"slashing")," module handles the logic to slash delegators if their validator misbehaves. The ",(0,t.yg)("inlineCode",{parentName:"p"},"slashing")," section in genesis looks as follows:"),(0,t.yg)("pre",null,(0,t.yg)("code",{parentName:"pre",className:"language-json"},'"slashing": {\n "params": {\n "max_evidence_age": "1814400000000000",\n "signed_blocks_window": "10000",\n "min_signed_per_window": "0.050000000000000000",\n "downtime_jail_duration": "600000000000",\n "slash_fraction_double_sign": "0.050000000000000000",\n "slash_fraction_downtime": "0.000100000000000000"\n },\n "signing_infos": {},\n "missed_blocks": {}\n }\n')),(0,t.yg)("p",null,"Let us break down the parameters:"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"params"),(0,t.yg)("ul",{parentName:"li"},(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"max_evidence_age"),": Maximum age of the evidence in ",(0,t.yg)("strong",{parentName:"li"},"nanoseconds"),"."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"signed_blocks_window"),": Moving window of blocks to figure out offline validators."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"min_signed_per_window"),": Minimum percentage of ",(0,t.yg)("inlineCode",{parentName:"li"},"precommits"),"that must be present in the ",(0,t.yg)("inlineCode",{parentName:"li"},"block window")," for the validator to be considered online."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"downtime_jail_duration"),": Duration in ",(0,t.yg)("strong",{parentName:"li"},"nanoseconds")," for which a validator is jailed after they get slashed for downtime."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"slash_fraction_double_sign"),": Percentage of delegators bonded stake slashed when their validator double signs."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"slash_fraction_downtime"),": Percentage of delegators bonded stake slashed when their validator is down."))),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"signing_infos"),": Various infos per validator needed by the ",(0,t.yg)("inlineCode",{parentName:"li"},"slashing")," module. Set to ",(0,t.yg)("inlineCode",{parentName:"li"},"{}")," if genesis was not exported from previous state."),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("inlineCode",{parentName:"li"},"missed_blocks"),": Various infos related to missed blocks needed by the ",(0,t.yg)("inlineCode",{parentName:"li"},"slashing")," module. Set to ",(0,t.yg)("inlineCode",{parentName:"li"},"{}")," if genesis was not exported from previous state.")),(0,t.yg)("h3",{id:"genesis-transactions"},"Genesis Transactions"),(0,t.yg)("p",null,"By default, the genesis file do not contain any ",(0,t.yg)("inlineCode",{parentName:"p"},"gentxs"),". A ",(0,t.yg)("inlineCode",{parentName:"p"},"gentx")," is a transaction that bonds staking token present in the genesis file under ",(0,t.yg)("inlineCode",{parentName:"p"},"accounts")," to a validator, essentially creating a validator at genesis. The chain will start as soon as more than 2/3rds of the validators (weighted by voting power) that are the recipient of a valid ",(0,t.yg)("inlineCode",{parentName:"p"},"gentx")," come online after ",(0,t.yg)("inlineCode",{parentName:"p"},"genesis_time"),"."),(0,t.yg)("p",null,"A ",(0,t.yg)("inlineCode",{parentName:"p"},"gentx")," can be added manually to the genesis file, or via the following command:"),(0,t.yg)("pre",null,(0,t.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad collect-gentxs\n")),(0,t.yg)("p",null,"This command will add all the ",(0,t.yg)("inlineCode",{parentName:"p"},"gentxs")," stored in ",(0,t.yg)("inlineCode",{parentName:"p"},"~/.gaia/config/gentx")," to the genesis file. In order to create a genesis transaction, click ",(0,t.yg)("a",{parentName:"p",href:"/main/validators/validator-setup#participate-in-genesis-as-a-validator"},"here"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8913.41732d83.js b/assets/js/8913.41732d83.js new file mode 100644 index 00000000000..401640c583c --- /dev/null +++ b/assets/js/8913.41732d83.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[8913],{8913:(s,c,e)=>{e.r(c)}}]); \ No newline at end of file diff --git a/assets/js/8bdc3bda.45ad097f.js b/assets/js/8bdc3bda.45ad097f.js new file mode 100644 index 00000000000..c2b7522d3c6 --- /dev/null +++ b/assets/js/8bdc3bda.45ad097f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[5608],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>d});var o=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,o)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?n(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):n(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function s(e,t){if(null==e)return{};var a,o,r=function(e,t){if(null==e)return{};var a,o,r={},n=Object.keys(e);for(o=0;o<n.length;o++)a=n[o],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o<n.length;o++)a=n[o],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=o.createContext({}),c=function(e){var t=o.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},y="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var a=e.components,r=e.mdxType,n=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),y=c(a),p=r,d=y["".concat(l,".").concat(p)]||y[p]||h[p]||n;return a?o.createElement(d,i(i({ref:t},u),{},{components:a})):o.createElement(d,i({ref:t},u))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=a.length,i=new Array(n);i[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[y]="string"==typeof e?e:r,i[1]=s;for(var c=2;c<n;c++)i[c]=a[c];return o.createElement.apply(null,i)}return o.createElement.apply(null,a)}p.displayName="MDXCreateElement"},3935:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var o=a(8168),r=(a(6540),a(5680));const n={title:"Delegator Security",order:3},i=void 0,s={unversionedId:"delegators/delegator-security",id:"delegators/delegator-security",title:"Delegator Security",description:"The launch of any public blockchain is an incredibly exciting time, and it's definitely one that malicious actors may try to take advantage of for their own personal gain. Owning and having access to cryptocurrency can make you a valuable target for an attacker, but there are many things you can do to improve your personal security and reduce or eliminate security risks.",source:"@site/docs/delegators/delegator-security.md",sourceDirName:"delegators",slug:"/delegators/delegator-security",permalink:"/main/delegators/delegator-security",draft:!1,tags:[],version:"current",frontMatter:{title:"Delegator Security",order:3},sidebar:"tutorialSidebar",previous:{title:"Delegator Guide (CLI)",permalink:"/main/delegators/delegator-guide-cli"},next:{title:"Validators",permalink:"/main/validators/"}},l={},c=[{value:"Social Engineering",id:"social-engineering",level:2},{value:"Key Management",id:"key-management",level:2},{value:"Software Vulnerabilities",id:"software-vulnerabilities",level:2},{value:"Verifying Transactions",id:"verifying-transactions",level:2},{value:"Account Security",id:"account-security",level:2},{value:"Supply Chain Attacks",id:"supply-chain-attacks",level:2},{value:"Disclaimer",id:"disclaimer",level:2}],u={toc:c},y="wrapper";function h(e){let{components:t,...a}=e;return(0,r.yg)(y,(0,o.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("p",null,"The launch of any public blockchain is an incredibly exciting time, and it's definitely one that malicious actors may try to take advantage of for their own personal gain. Owning and having access to cryptocurrency can make you a valuable target for an attacker, but there are many things you can do to improve your personal security and reduce or eliminate security risks."),(0,r.yg)("h2",{id:"social-engineering"},"Social Engineering"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Social_engineering_(security)"},"Social engineering")," has existed for about as long as human beings have been on the planet, and in the technical era, it usually takes in the form of ",(0,r.yg)("a",{parentName:"p",href:"https://ssd.eff.org/en/module/how-avoid-phishing-attacks"},"phishing")," or ",(0,r.yg)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Phishing#Spear_phishing"},"spearphishing")," . Both of these attacks are wildly successful forms of trickery that are responsible for over 95% of account security breaches, and they don't just happen via email: these days, opportunistic and targeted phishing attempts take place ",(0,r.yg)("a",{parentName:"p",href:"https://www.umass.edu/it/security/phishing-fraudulent-emails-text-messages-phone-calls"},"anywhere that you have an inbox")," . It doesn't matter if you're using Signal, Telegram, SMS, Twitter, or just checking your DMs on forums or social networks, attackers have a ",(0,r.yg)("a",{parentName:"p",href:"https://lucris.lub.lu.se/ws/portalfiles/portal/85420559/The_Weaponization_of_Social_Media_Bossetta_2018_.pdf"},"plethora of opportunities")," to gain foothold in your digital life in effort to separate you from valuable information and assets that you most definitely don't want to lose. If a deal pops up that ",(0,r.yg)("a",{parentName:"p",href:"https://www.psychologytoday.com/us/blog/mind-in-the-machine/201712/how-fear-is-being-used-manipulate-cryptocurrency-markets"},"sounds too good to be true")," , or a message shows up asking for information that should never, ever be shared with someone else, you can always verify it before engaging with it by navigating to our official website or an official Cosmos communication channel on your own."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("strong",{parentName:"p"},"Be skeptical of unexpected attachments, or emails that ask you to visit a suspicious or unfamiliar website in the context of blockchains or cryptocurrency.")," An attacker may attempt to lure you to a ",(0,r.yg)("a",{parentName:"p",href:"https://blog.malwarebytes.com/cybercrime/2013/02/tools-of-the-trade-exploit-kits/"},"compromised site")," designed to steal sensitive information from your computer. If you're a Gmail user, test your resilience against the latest email-based phishing tactics ",(0,r.yg)("a",{parentName:"p",href:"https://phishingquiz.withgoogle.com/"},"here")," .")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("strong",{parentName:"p"},"Do your due diligence before purchasing ATOM. Neither the Tendermint team nor the Interchain Foundation will be selling ATOM at launch"),", so if you see social media posts or emails advertising a token sale from us, they're not real and should be dismissed immediately. If you're on the hunt for ATOM, make sure that you've researched the seller or exchange to confirm that the tokens are coming from a trustworthy source.")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("strong",{parentName:"p"},"No one from Cosmos, the Tendermint team or the Interchain Foundation will ever send an email that asks for you to share any kind of account credentials or your 12 words with us"),", and we will always use our official Twitter, Medium, and Github accounts to communicate important news directly to the Cosmos community."))),(0,r.yg)("p",null,"If you receive an email or tweet that sounds too good to be true, is likely to be a scam. "),(0,r.yg)("h2",{id:"key-management"},"Key Management"),(0,r.yg)("p",null,"The best way to minimize the risk of theft or loss of ATOM is to have a strong storage and backup strategy for your private keys. The safest way to store your keys is offline, either in a cryptocurrency wallet or on a device that you never connect to the internet. The best backup strategy for your k yes is to ensure that you have multiple copies of them stored in safe places, and to take specific measures to protect at least one copy of your keys from any kind of natural disaster that is a likely possibility in your part of the world."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"To protect your ATOM, do not share your 12 words with anyone.")," The only person who should ever need to know them is you. You do not need to share your private keys if you're delegating ATOM to a validator on the network or to use custodial services. If anyone asks for your key material,"),(0,r.yg)("h2",{id:"software-vulnerabilities"},"Software Vulnerabilities"),(0,r.yg)("p",null,"To protect yourself and ensure you're using the safest code is to use the latest version of software available, and to update immediately (or as soon as you can) after a security advisory is released. This is important for your laptops, mobile devices, cryptocurrency wallets, and anything else that may be linked to your identity or your cryptocurrency."),(0,r.yg)("p",null,(0,r.yg)("em",{parentName:"p"},"To protect your ATOM, you should only download software directly from official sources, and make sure that you're always using the latest, most secure version of ",(0,r.yg)("inlineCode",{parentName:"em"},"gaiad")," when you're doing anything that involves your 12 words"),". The latest versions of ",(0,r.yg)("inlineCode",{parentName:"p"},"Tendermint"),", the ",(0,r.yg)("inlineCode",{parentName:"p"},"Cosmos-SDK"),", and ",(0,r.yg)("inlineCode",{parentName:"p"},"gaiad")," will always be available from our official Github repositories."),(0,r.yg)("p",null,"No one from Cosmos, the Tendermint team or the Interchain Foundation will ever send an email that asks for you to download a software attachment after sending out a security advisory or making a patch available."),(0,r.yg)("h2",{id:"verifying-transactions"},"Verifying Transactions"),(0,r.yg)("p",null,"Be skeptical of technical advice, especially advice that comes from people you do not know in forums and on group chat channels. Familiarize yourself with important commands, especially those that will help you carry out high-risk actions, and consult our official documentation to make sure that you're not being tricked into doing something that will harm you or your validator."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"When sending transactions or doing anything that may spend coins, you should always verify those transactions before hitting send"),". While address strings are long, it is important to visually comparing them in blocks of 4 characters at a time to ensure that you are sending them to the right place rather than into oblivion."),(0,r.yg)("h2",{id:"account-security"},"Account Security"),(0,r.yg)("p",null,"One of the most important things you can do to protect your cryptocurrency and eliminate risk is to harden all of your critical online accounts. Attackers will try to gain foothold wherever they can, and will use that foothold to pivot from one place to another. Unprotected accounts like email, social media, your Github account, the Cosmos Forum and anything in between could give an attacker an opportunities to gain foothold in your online life."),(0,r.yg)("p",null,"For people who hold cryptocurrency, there are two specific account security actions that can be taken to eliminate specific risks that come with being part of the blockchain world."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"First, it is important to enable 2-factor authentication everywhere you can, and to make sure that you are using a code generator or ",(0,r.yg)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Universal_2nd_Factor"},"U2F hardware key")," as a second factor.")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Second, be mindful of account recovery methods used to regain access to your most important accounts and make sure that you do not use SMS as a recovery method. If you haven't done so yet, start using an authenticator app or a hardware key immediately for your personal email account and wherever else you manage your tokens, especially if you use online exchanges."))),(0,r.yg)("h2",{id:"supply-chain-attacks"},"Supply Chain Attacks"),(0,r.yg)("p",null,"Whether you're buying a hardware or a hardware wallet, it is important to purchase whatever you need directly from the supplier or from a trusted source. This is the only way to completely eliminate the risk of a compromised device or chip from stealing your private keys, especially since there are reports of compromised wallets being sold on Amazon and through other popular online marketplaces."),(0,r.yg)("h2",{id:"disclaimer"},"Disclaimer"),(0,r.yg)("p",null,'Please note that this is highly experimental software. In these early days, we can expect to have issues, updates, and bugs. The existing tools require advanced technical skills and involve risks which are outside of the control of the Interchain Foundation and/or the Tendermint team (see also the risk section in the Interchain Cosmos Contribution Terms). Any use of this open source Apache 2.0 licensed software is done at your own risk and on a "AS IS" basis, without warranties or conditions of any kind, and any and all liability of the Interchain Foundation and/or the Tendermint team for damages arising in connection to the software is excluded. Please exercise extreme caution!`'))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8c40170f.b074362e.js b/assets/js/8c40170f.b074362e.js new file mode 100644 index 00000000000..a1e3abba655 --- /dev/null +++ b/assets/js/8c40170f.b074362e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[2650],{5680:(e,t,r)=>{r.d(t,{xA:()=>d,yg:()=>g});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,d=c(e,["components","mdxType","originalType","parentName"]),u=s(r),h=a,g=u["".concat(l,".").concat(h)]||u[h]||p[h]||i;return r?n.createElement(g,o(o({ref:t},d),{},{components:r})):n.createElement(g,o({ref:t},d))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=h;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[u]="string"==typeof e?e:a,o[1]=c;for(var s=2;s<i;s++)o[s]=r[s];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}h.displayName="MDXCreateElement"},7414:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var n=r(8168),a=(r(6540),r(5680));const i={},o=void 0,c={unversionedId:"architecture/adr/README",id:"architecture/adr/README",title:"README",description:"\x3c!--",source:"@site/docs/architecture/adr/README.md",sourceDirName:"architecture/adr",slug:"/architecture/adr/",permalink:"/main/architecture/adr/",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"ADR Creation Process",permalink:"/main/architecture/adr/PROCESS"},next:{title:"adr-001-interchain-accounts",permalink:"/main/architecture/adr/adr-001-interchain-accounts"}},l={},s=[{value:"Rationale",id:"rationale",level:2},{value:"Creating new ADR",id:"creating-new-adr",level:2},{value:"Use RFC 2119 Keywords",id:"use-rfc-2119-keywords",level:3},{value:"ADR Table of Contents",id:"adr-table-of-contents",level:2},{value:"Accepted",id:"accepted",level:3},{value:"Proposed",id:"proposed",level:3},{value:"Draft",id:"draft",level:3},{value:"Rejected",id:"rejected",level:3},{value:"Deprecated",id:"deprecated",level:3}],d={toc:s},u="wrapper";function p(e){let{components:t,...r}=e;return(0,a.yg)(u,(0,n.A)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"architecture-decision-records-adr"},"Architecture Decision Records (ADR)"),(0,a.yg)("p",null,"This is a location to record all high-level architecture decisions for new feature and module proposals in the Cosmos Hub."),(0,a.yg)("p",null,"An Architectural Decision (",(0,a.yg)("strong",{parentName:"p"},"AD"),") is a software design choice that addresses a functional or non-functional requirement that is architecturally significant.\nAn Architecturally Significant Requirement (",(0,a.yg)("strong",{parentName:"p"},"ASR"),") is a requirement that has a measurable effect on a software system\u2019s architecture and quality.\nAn Architectural Decision Record (",(0,a.yg)("strong",{parentName:"p"},"ADR"),") captures a single AD, such as often done when writing personal notes or meeting minutes; the collection of ADRs created and maintained in a project constitute its decision log. All these are within the topic of Architectural Knowledge Management (AKM)."),(0,a.yg)("p",null,"You can read more about the ADR concept ",(0,a.yg)("a",{parentName:"p",href:"https://adr.github.io/"},"here"),"."),(0,a.yg)("h2",{id:"rationale"},"Rationale"),(0,a.yg)("p",null,"ADRs are intended to be the primary mechanism for proposing new feature designs and new processes, for collecting community input on an issue, and for documenting the design decisions.\nAn ADR should provide:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Context on the relevant goals and the current state"),(0,a.yg)("li",{parentName:"ul"},"Proposed changes to achieve the goals"),(0,a.yg)("li",{parentName:"ul"},"Summary of pros and cons"),(0,a.yg)("li",{parentName:"ul"},"Discarded solution spaces and why they were discarded"),(0,a.yg)("li",{parentName:"ul"},"References"),(0,a.yg)("li",{parentName:"ul"},"Changelog")),(0,a.yg)("p",null,"Note the distinction between an ADR and a spec. The ADR provides the context, intuition, reasoning, and\njustification for a change in architecture, or for the architecture of something\nnew. The spec is much more compressed and streamlined summary of everything as\nit stands today."),(0,a.yg)("p",null,"If recorded decisions turn out to be lacking, convene a discussion, record the new decisions here, and then modify the code to match."),(0,a.yg)("h2",{id:"creating-new-adr"},"Creating new ADR"),(0,a.yg)("p",null,"Read about the ",(0,a.yg)("a",{parentName:"p",href:"/main/architecture/adr/PROCESS"},"PROCESS"),"."),(0,a.yg)("h3",{id:"use-rfc-2119-keywords"},"Use RFC 2119 Keywords"),(0,a.yg)("p",null,'When writing ADRs, follow the same best practices for writing RFCs.\nWhen writing RFCs, key words are used to signify the requirements in the specification.\nThese words are often capitalized: "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL.\nThey are to be interpreted as described in ',(0,a.yg)("a",{parentName:"p",href:"https://datatracker.ietf.org/doc/html/rfc2119"},"RFC 2119"),"."),(0,a.yg)("h2",{id:"adr-table-of-contents"},"ADR Table of Contents"),(0,a.yg)("h3",{id:"accepted"},"Accepted"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"n/a")),(0,a.yg)("h3",{id:"proposed"},"Proposed"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/architecture/adr/adr-003-ica-controller"},"ADR 003: Interchain Accounts Controller Module"))),(0,a.yg)("h3",{id:"draft"},"Draft"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"n/a")),(0,a.yg)("h3",{id:"rejected"},"Rejected"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/architecture/adr/adr-001-interchain-accounts"},"ADR 001: Interchain Accounts"))),(0,a.yg)("h3",{id:"deprecated"},"Deprecated"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/architecture/adr/adr-002-globalfee"},"ADR 002: Globalfee Module"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8e6759d2.7651f18b.js b/assets/js/8e6759d2.7651f18b.js new file mode 100644 index 00000000000..8c120b0bb0d --- /dev/null +++ b/assets/js/8e6759d2.7651f18b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[5159],{4061:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/9157a56f.5c072d3b.js b/assets/js/9157a56f.5c072d3b.js new file mode 100644 index 00000000000..0b24386028a --- /dev/null +++ b/assets/js/9157a56f.5c072d3b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[5643],{5680:(e,r,t)=>{t.d(r,{xA:()=>u,yg:()=>y});var n=t(6540);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function i(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?o(Object(t),!0).forEach((function(r){a(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function s(e,r){if(null==e)return{};var t,n,a=function(e,r){if(null==e)return{};var t,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)t=o[n],r.indexOf(t)>=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)t=o[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c=n.createContext({}),l=function(e){var r=n.useContext(c),t=r;return e&&(t="function"==typeof e?e(r):i(i({},r),e)),t},u=function(e){var r=l(e.components);return n.createElement(c.Provider,{value:r},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},f=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=l(t),f=a,y=p["".concat(c,".").concat(f)]||p[f]||m[f]||o;return t?n.createElement(y,i(i({ref:r},u),{},{components:t})):n.createElement(y,i({ref:r},u))}));function y(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=f;var s={};for(var c in r)hasOwnProperty.call(r,c)&&(s[c]=r[c]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var l=2;l<o;l++)i[l]=t[l];return n.createElement.apply(null,i)}return n.createElement.apply(null,t)}f.displayName="MDXCreateElement"},2328:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var n=t(8168),a=(t(6540),t(5680));const o={title:"Resources",order:1},i=void 0,s={unversionedId:"resources/README",id:"resources/README",title:"Resources",description:"This folder contains resources on the gaia software.",source:"@site/docs/resources/README.md",sourceDirName:"resources",slug:"/resources/",permalink:"/main/resources/",draft:!1,tags:[],version:"current",frontMatter:{title:"Resources",order:1},sidebar:"tutorialSidebar",previous:{title:"Interchain Security",permalink:"/main/interchain-security/"},next:{title:"Cosmos Hub Archives",permalink:"/main/resources/archives"}},c={},l=[],u={toc:l},p="wrapper";function m(e){let{components:r,...t}=e;return(0,a.yg)(p,(0,n.A)({},u,t,{components:r,mdxType:"MDXLayout"}),(0,a.yg)("p",null,"This folder contains resources on the ",(0,a.yg)("inlineCode",{parentName:"p"},"gaia")," software."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/resources/genesis"},(0,a.yg)("inlineCode",{parentName:"a"},"gaia")," genesis file")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/resources/hd-wallets"},"HD Wallets for ",(0,a.yg)("inlineCode",{parentName:"a"},"gaia"))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/resources/ledger"},"Ledger Integration for ",(0,a.yg)("inlineCode",{parentName:"a"},"gaia"))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/resources/service-providers"},"Service Providers Documentation")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/resources/reproducible-builds"},"Reproducible Builds"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.0e1a73cd.js b/assets/js/935f2afb.0e1a73cd.js new file mode 100644 index 00000000000..cd420cd5129 --- /dev/null +++ b/assets/js/935f2afb.0e1a73cd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[8581],{5610:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Latest","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Introduction","href":"/main/","docId":"index"},{"type":"category","label":"Getting Started","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"What is Gaia?","href":"/main/getting-started/what-is-gaia","docId":"getting-started/what-is-gaia"},{"type":"link","label":"Installing Gaia","href":"/main/getting-started/installation","docId":"getting-started/installation"},{"type":"link","label":"Quick Start - Join Mainnet","href":"/main/getting-started/quickstart","docId":"getting-started/quickstart"},{"type":"link","label":"System requirements","href":"/main/getting-started/system-requirements","docId":"getting-started/system-requirements"}],"href":"/main/getting-started/"},{"type":"category","label":"Guides","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Interacting with Gaiad (CLI)","href":"/main/hub-tutorials/gaiad","docId":"hub-tutorials/gaiad"},{"type":"link","label":"Joining Mainnet","href":"/main/hub-tutorials/join-mainnet","docId":"hub-tutorials/join-mainnet"},{"type":"link","label":"Joining Testnet","href":"/main/hub-tutorials/join-testnet","docId":"hub-tutorials/join-testnet"},{"type":"link","label":"Upgrading the Chain","href":"/main/hub-tutorials/live-upgrade-tutorial","docId":"hub-tutorials/live-upgrade-tutorial"},{"type":"link","label":"Upgrading Your Node","href":"/main/hub-tutorials/upgrade-node","docId":"hub-tutorials/upgrade-node"}],"href":"/main/hub-tutorials/"},{"type":"category","label":"Delegators","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Delegator FAQ","href":"/main/delegators/delegator-faq","docId":"delegators/delegator-faq"},{"type":"link","label":"Delegator Guide (CLI)","href":"/main/delegators/delegator-guide-cli","docId":"delegators/delegator-guide-cli"},{"type":"link","label":"Delegator Security","href":"/main/delegators/delegator-security","docId":"delegators/delegator-security"}],"href":"/main/delegators/"},{"type":"category","label":"Validators","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Key Management Systems","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"KMS - Key Management System","href":"/main/validators/kms/","docId":"validators/kms/kms"},{"type":"link","label":"Setting up Tendermint KMS + Ledger","href":"/main/validators/kms/kms_ledger","docId":"validators/kms/kms_ledger"}]},{"type":"link","label":"Validator Overview","href":"/main/validators/overview","docId":"validators/overview"},{"type":"link","label":"Validator Security","href":"/main/validators/security","docId":"validators/security"},{"type":"link","label":"Validator FAQ","href":"/main/validators/validator-faq","docId":"validators/validator-faq"},{"type":"link","label":"Running a Validator","href":"/main/validators/validator-setup","docId":"validators/validator-setup"}],"href":"/main/validators/"},{"type":"category","label":"Governance","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Common proposals","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Community Pool Spend","href":"/main/governance/proposal-types/community-pool-spend","docId":"governance/proposal-types/community-pool-spend"},{"type":"link","label":"Parameter Changes","href":"/main/governance/proposal-types/param-change","docId":"governance/proposal-types/param-change"},{"type":"link","label":"Software Upgrade","href":"/main/governance/proposal-types/software-upgrade","docId":"governance/proposal-types/software-upgrade"},{"type":"link","label":"Text (Signaling)","href":"/main/governance/proposal-types/text-prop","docId":"governance/proposal-types/text-prop"}],"href":"/main/governance/proposal-types/"},{"type":"link","label":"Off-Chain Proposal Process","href":"/main/governance/best-practices","docId":"governance/best-practices"},{"type":"link","label":"Formatting a Proposal","href":"/main/governance/formatting","docId":"governance/formatting"},{"type":"link","label":"On-Chain Proposal Process","href":"/main/governance/process","docId":"governance/process"},{"type":"link","label":"Submitting a Proposal","href":"/main/governance/submitting","docId":"governance/submitting"}],"href":"/main/governance/"},{"type":"link","label":"Interchain Security","href":"/main/interchain-security/","docId":"interchain-security/README"},{"type":"category","label":"Resources","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Cosmos Hub Archives","href":"/main/resources/archives","docId":"resources/archives"},{"type":"link","label":"The Genesis File","href":"/main/resources/genesis","docId":"resources/genesis"},{"type":"link","label":"HD Wallets","href":"/main/resources/hd-wallets","docId":"resources/hd-wallets"},{"type":"link","label":"Ledger Nano Support","href":"/main/resources/ledger","docId":"resources/ledger"},{"type":"link","label":"Building Gaia Deterministically","href":"/main/resources/reproducible-builds","docId":"resources/reproducible-builds"},{"type":"link","label":"Service Providers","href":"/main/resources/service-providers","docId":"resources/service-providers"}],"href":"/main/resources/"},{"type":"category","label":"ADRs","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Current ADR\'s","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ADR Creation Process","href":"/main/architecture/adr/PROCESS","docId":"architecture/adr/PROCESS"},{"type":"link","label":"README","href":"/main/architecture/adr/","docId":"architecture/adr/README"},{"type":"link","label":"adr-001-interchain-accounts","href":"/main/architecture/adr/adr-001-interchain-accounts","docId":"architecture/adr/adr-001-interchain-accounts"},{"type":"link","label":"ADR 002: Globalfee Module","href":"/main/architecture/adr/adr-002-globalfee","docId":"architecture/adr/adr-002-globalfee"},{"type":"link","label":"ADR 003: Interchain Accounts Controller Module","href":"/main/architecture/adr/adr-003-ica-controller","docId":"architecture/adr/adr-003-ica-controller"}]},{"type":"category","label":"ADR Templates","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"adr-template","href":"/main/architecture/templates/adr-template","docId":"architecture/templates/adr-template"}]},{"type":"link","label":"ADR Creation Process","href":"/main/architecture/PROCESS","docId":"architecture/PROCESS"}],"href":"/main/architecture/"},{"type":"category","label":"Gaia Modules","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"LSM Staking","href":"/main/modules/lsm-staking","docId":"modules/lsm-staking"},{"type":"link","label":"Metaprotocol","href":"/main/modules/metaprotocols","docId":"modules/metaprotocols"}],"href":"/main/modules/"}]},"docs":{"architecture/adr/adr-001-interchain-accounts":{"id":"architecture/adr/adr-001-interchain-accounts","title":"adr-001-interchain-accounts","description":"\x3c!--","sidebar":"tutorialSidebar"},"architecture/adr/adr-002-globalfee":{"id":"architecture/adr/adr-002-globalfee","title":"ADR 002: Globalfee Module","description":"Changelog","sidebar":"tutorialSidebar"},"architecture/adr/adr-003-ica-controller":{"id":"architecture/adr/adr-003-ica-controller","title":"ADR 003: Interchain Accounts Controller Module","description":"Changelog","sidebar":"tutorialSidebar"},"architecture/adr/PROCESS":{"id":"architecture/adr/PROCESS","title":"ADR Creation Process","description":"1. Copy the adr-template.md file. Use the following filename pattern: adr-next_number-title.md","sidebar":"tutorialSidebar"},"architecture/adr/README":{"id":"architecture/adr/README","title":"README","description":"\x3c!--","sidebar":"tutorialSidebar"},"architecture/PROCESS":{"id":"architecture/PROCESS","title":"ADR Creation Process","description":"1. Copy the adr-template.md file. Use the following filename pattern: adr-next_number-title.md","sidebar":"tutorialSidebar"},"architecture/README":{"id":"architecture/README","title":"Architecture Decision Records (ADR)","description":"This is a location to record all high-level architecture decisions for new feature and module proposals in the Cosmos Hub.","sidebar":"tutorialSidebar"},"architecture/templates/adr-template":{"id":"architecture/templates/adr-template","title":"adr-template","description":"\x3c!--","sidebar":"tutorialSidebar"},"delegators/delegator-faq":{"id":"delegators/delegator-faq","title":"Delegator FAQ","description":"What is a delegator?","sidebar":"tutorialSidebar"},"delegators/delegator-guide-cli":{"id":"delegators/delegator-guide-cli","title":"Delegator Guide (CLI)","description":"This document contains all the necessary information for delegators to interact with the Cosmos Hub through the Command-Line Interface (CLI).","sidebar":"tutorialSidebar"},"delegators/delegator-security":{"id":"delegators/delegator-security","title":"Delegator Security","description":"The launch of any public blockchain is an incredibly exciting time, and it\'s definitely one that malicious actors may try to take advantage of for their own personal gain. Owning and having access to cryptocurrency can make you a valuable target for an attacker, but there are many things you can do to improve your personal security and reduce or eliminate security risks.","sidebar":"tutorialSidebar"},"delegators/README":{"id":"delegators/README","title":"Delegators","description":"This folder contains documentation relevant to delegators of the Cosmos Hub and other gaia blockchains.","sidebar":"tutorialSidebar"},"getting-started/installation":{"id":"getting-started/installation","title":"Installing Gaia","description":"This guide will explain how to install the gaiad binary and run the cli. With this binary installed on a server, you can participate on the mainnet as either a Full Node or a Validator.","sidebar":"tutorialSidebar"},"getting-started/quickstart":{"id":"getting-started/quickstart","title":"Quick Start - Join Mainnet","description":"Bootstrap a cosmoshub-4 mainnet node","sidebar":"tutorialSidebar"},"getting-started/README":{"id":"getting-started/README","title":"Getting Started","description":"This folder contains tutorials related to the gaia application.","sidebar":"tutorialSidebar"},"getting-started/system-requirements":{"id":"getting-started/system-requirements","title":"System requirements","description":"\x3c!--","sidebar":"tutorialSidebar"},"getting-started/what-is-gaia":{"id":"getting-started/what-is-gaia","title":"What is Gaia?","description":"The Cosmos Hub is a public Proof-of-Stake chain that uses ATOM as its native staking token. It is the first blockchain launched in the Cosmos Network and developed using the cosmos-sdk development framework and ibc-go.","sidebar":"tutorialSidebar"},"governance/best-practices":{"id":"governance/best-practices","title":"Off-Chain Proposal Process","description":"Once a proposal is on-chain, it cannot be changed to reflect feedback or new information. It\'s very important to give a proposal time off-chain to receive feedback, input, and edits before going on-chain and asking for votes.","sidebar":"tutorialSidebar"},"governance/formatting":{"id":"governance/formatting","title":"Formatting a Proposal","description":"Many proposals allow for long form text to be included, usually under the key description. These provide the opportunity to include markdown if formatted correctly, as well as line breaks with \\\\n.","sidebar":"tutorialSidebar"},"governance/process":{"id":"governance/process","title":"On-Chain Proposal Process","description":"Governance Parameters","sidebar":"tutorialSidebar"},"governance/proposal-types/community-pool-spend":{"id":"governance/proposal-types/community-pool-spend","title":"Community Pool Spend","description":"Cosmos Hub launched with community-spend capabilities on December 11, 2019, effectively unlocking the potential for token-holders to vote to approve spending from the Community Pool.","sidebar":"tutorialSidebar"},"governance/proposal-types/param-change":{"id":"governance/proposal-types/param-change","title":"Parameter Changes","description":"This documentation aims to provide guidelines for creating and assessing parameter-change proposals.","sidebar":"tutorialSidebar"},"governance/proposal-types/README":{"id":"governance/proposal-types/README","title":"Proposal Types","description":"- Text","sidebar":"tutorialSidebar"},"governance/proposal-types/software-upgrade":{"id":"governance/proposal-types/software-upgrade","title":"Software Upgrade","description":"Software upgrade proposals are submitted to signal that a Cosmos Hub release with new features, bugfixes and various other improvements is available and ready for production deployment.","sidebar":"tutorialSidebar"},"governance/proposal-types/text-prop":{"id":"governance/proposal-types/text-prop","title":"Text (Signaling)","description":"What are signaling proposals currently used for?","sidebar":"tutorialSidebar"},"governance/README":{"id":"governance/README","title":"Governance Overview","description":"The Cosmos Hub (\\"Gaia\\") has an on-chain governance mechanism for signaling, changing consensus parameters, and spending funds from the community pool.","sidebar":"tutorialSidebar"},"governance/submitting":{"id":"governance/submitting","title":"Submitting a Proposal","description":"If you have a final draft of your proposal ready to submit, you may want to push your proposal live on the testnet first. These are the three primary steps to getting your proposal live on-chain.","sidebar":"tutorialSidebar"},"hub-tutorials/gaiad":{"id":"hub-tutorials/gaiad","title":"Interacting with Gaiad (CLI)","description":"Gaia Daemon","sidebar":"tutorialSidebar"},"hub-tutorials/join-mainnet":{"id":"hub-tutorials/join-mainnet","title":"Joining Mainnet","description":"The chain-id of Cosmos Hub mainnet is cosmoshub-4.","sidebar":"tutorialSidebar"},"hub-tutorials/join-testnet":{"id":"hub-tutorials/join-testnet","title":"Joining Testnet","description":"Visit the testnets repo for the most up-to-date information on the currently available public testnets:","sidebar":"tutorialSidebar"},"hub-tutorials/live-upgrade-tutorial":{"id":"hub-tutorials/live-upgrade-tutorial","title":"Upgrading the Chain","description":"This document demonstrates how a live upgrade can be performed on-chain through a","sidebar":"tutorialSidebar"},"hub-tutorials/README":{"id":"hub-tutorials/README","title":"Gaia Tutorials","description":"This folder contains tutorials related to the gaiad application.","sidebar":"tutorialSidebar"},"hub-tutorials/upgrade-node":{"id":"hub-tutorials/upgrade-node","title":"Upgrading Your Node","description":"This document describes the upgrade procedure of a gaiad full-node to a new version.","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Introduction","description":"Welcome to the Cosmos Hub","sidebar":"tutorialSidebar"},"interchain-security/README":{"id":"interchain-security/README","title":"Interchain Security","description":"The Interchain Security feature brings to the Cosmos Hub a shared security model, where the Cosmos Hub validators, also validate consumer chains. This is valuable for consumer chains, as consumer chains can focus on product-market fit, rather than business and operational agreements in bringing together a validator set. As part of this agreement, consumer chains pay for the security by distributing a portion of the consumer chain revenue to Hub token holders.","sidebar":"tutorialSidebar"},"modules/lsm-staking":{"id":"modules/lsm-staking","title":"LSM Staking","description":"The x/staking module used by the Hub includes extensions that enable liquid staking","sidebar":"tutorialSidebar"},"modules/metaprotocols":{"id":"modules/metaprotocols","title":"Metaprotocol","description":"The x/metaprotocol module adds support for encoding and decoding additional fields attached to transactions.","sidebar":"tutorialSidebar"},"modules/README":{"id":"modules/README","title":"Gaia Modules","description":"Here you can find an overview of the modules included on the Cosmos Hub (Gaia) blockchain with relevant info and","sidebar":"tutorialSidebar"},"resources/archives":{"id":"resources/archives","title":"Cosmos Hub Archives","description":"With each breaking upgrade of the Cosmos Hub, the network is restarted at height 0. During this process, an export of the last state of the previous network is made to produce the genesis state of the new one.","sidebar":"tutorialSidebar"},"resources/genesis":{"id":"resources/genesis","title":"The Genesis File","description":"This document explains how the genesis file of the Cosmos Hub mainnet is structured. It also explains how you can build a genesis file for your own gaia testnet.","sidebar":"tutorialSidebar"},"resources/hd-wallets":{"id":"resources/hd-wallets","title":"HD Wallets","description":"Accounts in Cosmos are Hierarchical Deterministic (HD) Wallets. Originally specified in Bitcoin\'s BIP32, HD wallets are a special kind of wallet that let users derive any number of accounts from a single seed. To understand what that means, let us first define some terminology:","sidebar":"tutorialSidebar"},"resources/ledger":{"id":"resources/ledger","title":"Ledger Nano Support","description":"Using a hardware wallet to store your keys greatly improves the security of your crypto assets. The Ledger device acts as an enclave of the seed and private keys, and the process of signing transactions takes place within it. No private information ever leaves the Ledger device. The following is a short tutorial on using the Cosmos Ledger app with the Gaia CLI or the Keplr wallet extension.","sidebar":"tutorialSidebar"},"resources/README":{"id":"resources/README","title":"Resources","description":"This folder contains resources on the gaia software.","sidebar":"tutorialSidebar"},"resources/reproducible-builds":{"id":"resources/reproducible-builds","title":"Building Gaia Deterministically","description":"The Tendermint rbuilder Docker image provides a deterministic build environment that is used to build Cosmos SDK applications. It provides a way to be reasonably sure that the executables are really built from the git source. It also makes sure that the same, tested dependencies are used and statically built into the executable.","sidebar":"tutorialSidebar"},"resources/service-providers":{"id":"resources/service-providers","title":"Service Providers","description":"\'Service Providers\' are defined as entities that provide services for end-users that involve some form of interaction with the Cosmos Hub. More specifically, this document is focused on interactions with tokens.","sidebar":"tutorialSidebar"},"validators/kms/kms":{"id":"validators/kms/kms","title":"KMS - Key Management System","description":"Tendermint KMS is a key management service that allows separating key management from Tendermint nodes. In addition it provides other advantages such as:","sidebar":"tutorialSidebar"},"validators/kms/kms_ledger":{"id":"validators/kms/kms_ledger","title":"Setting up Tendermint KMS + Ledger","description":"The following instructions are a brief walkthrough and not a comprehensive guideline. You should consider and research more about the security implications of activating an external KMS.","sidebar":"tutorialSidebar"},"validators/overview":{"id":"validators/overview","title":"Validator Overview","description":"Introduction","sidebar":"tutorialSidebar"},"validators/README":{"id":"validators/README","title":"Validators","description":"This folder contains documentation relevant to validators of the Cosmos Hub and other gaia blockchains.","sidebar":"tutorialSidebar"},"validators/security":{"id":"validators/security","title":"Validator Security","description":"Each validator candidate is encouraged to run its operations independently, as diverse setups increase the resilience of the network. Validator candidates should commence their setup phase now in order to be on time for launch.","sidebar":"tutorialSidebar"},"validators/validator-faq":{"id":"validators/validator-faq","title":"Validator FAQ","description":"Disclaimer","sidebar":"tutorialSidebar"},"validators/validator-setup":{"id":"validators/validator-setup","title":"Running a Validator","description":"We suggest you try out joining a public testnet first. Information on how to join the most recent testnet can be found here.","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/9462.9ef19974.js b/assets/js/9462.9ef19974.js new file mode 100644 index 00000000000..20d99cf4024 --- /dev/null +++ b/assets/js/9462.9ef19974.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[9462],{9462:(e,t,r)=>{function n(e,t){var r=void 0;return function(){for(var n=arguments.length,o=new Array(n),i=0;i<n;i++)o[i]=arguments[i];r&&clearTimeout(r),r=setTimeout((function(){return e.apply(void 0,o)}),t)}}function o(e){return e!==Object(e)}function i(e,t){if(e===t)return!0;if(o(e)||o(t)||"function"==typeof e||"function"==typeof t)return e===t;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var r=0,n=Object.keys(e);r<n.length;r++){var a=n[r];if(!(a in t))return!1;if(!i(e[a],t[a]))return!1}return!0}r.r(t),r.d(t,{DocSearchModal:()=>pn});var a=function(){};function c(e){var t=e.item,r=e.items;return{index:t.__autocomplete_indexName,items:[t],positions:[1+r.findIndex((function(e){return e.objectID===t.objectID}))],queryID:t.__autocomplete_queryID,algoliaSource:["autocomplete"]}}function l(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,c=[],l=!0,u=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);l=!0);}catch(s){u=!0,o=s}finally{try{if(!l&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(u)throw o}}return c}}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return u(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return u(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var s=["items"],f=["items"];function m(e){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},m(e)}function p(e){return function(e){if(Array.isArray(e))return v(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return v(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return v(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function v(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function d(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function y(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function h(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?y(Object(r),!0).forEach((function(t){b(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):y(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function b(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==m(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==m(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===m(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function g(e){return e.map((function(e){var t=e.items,r=d(e,s);return h(h({},r),{},{objectIDs:(null==t?void 0:t.map((function(e){return e.objectID})))||r.objectIDs})}))}function O(e){var t,r,n,o=(t=l((e.version||"").split(".").map(Number),2),r=t[0],n=t[1],r>=3||2===r&&n>=4||1===r&&n>=10);function i(t,r,n){if(o&&void 0!==n){var i=n[0].__autocomplete_algoliaCredentials,a={"X-Algolia-Application-Id":i.appId,"X-Algolia-API-Key":i.apiKey};e.apply(void 0,[t].concat(p(r),[{headers:a}]))}else e.apply(void 0,[t].concat(p(r)))}return{init:function(t,r){e("init",{appId:t,apiKey:r})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("clickedObjectIDsAfterSearch",g(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("clickedObjectIDs",g(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];r.length>0&&e.apply(void 0,["clickedFilters"].concat(r))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("convertedObjectIDsAfterSearch",g(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("convertedObjectIDs",g(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];r.length>0&&e.apply(void 0,["convertedFilters"].concat(r))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&t.reduce((function(e,t){var r=t.items,n=d(t,f);return[].concat(p(e),p(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,r=[],n=0;n<e.objectIDs.length;n+=t)r.push(h(h({},e),{},{objectIDs:e.objectIDs.slice(n,n+t)}));return r}(h(h({},n),{},{objectIDs:(null==r?void 0:r.map((function(e){return e.objectID})))||n.objectIDs})).map((function(e){return{items:r,payload:e}}))))}),[]).forEach((function(e){var t=e.items;return i("viewedObjectIDs",[e.payload],t)}))},viewedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];r.length>0&&e.apply(void 0,["viewedFilters"].concat(r))}}}function S(e){var t=e.items.reduce((function(e,t){var r;return e[t.__autocomplete_indexName]=(null!==(r=e[t.__autocomplete_indexName])&&void 0!==r?r:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function j(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function w(e){return w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},w(e)}function E(e){return function(e){if(Array.isArray(e))return P(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return P(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return P(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function P(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function I(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function D(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?I(Object(r),!0).forEach((function(t){A(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):I(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function A(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==w(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==w(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===w(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var k="2.6.0",x="https://cdn.jsdelivr.net/npm/search-insights@".concat(k,"/dist/search-insights.min.js"),C=n((function(e){var t=e.onItemsChange,r=e.items,n=e.insights,o=e.state;t({insights:n,insightsEvents:S({items:r}).map((function(e){return D({eventName:"Items Viewed"},e)})),state:o})}),400);function _(e){var t=function(e){return D({onItemsChange:function(e){var t=e.insights,r=e.insightsEvents;t.viewedObjectIDs.apply(t,E(r.map((function(e){return D(D({},e),{},{algoliaSource:[].concat(E(e.algoliaSource||[]),["autocomplete-internal"])})}))))},onSelect:function(e){var t=e.insights,r=e.insightsEvents;t.clickedObjectIDsAfterSearch.apply(t,E(r.map((function(e){return D(D({},e),{},{algoliaSource:[].concat(E(e.algoliaSource||[]),["autocomplete-internal"])})}))))},onActive:a},e)}(e),r=t.insightsClient,o=t.onItemsChange,l=t.onSelect,u=t.onActive,s=r;r||function(e){if("undefined"!=typeof window)e({window:window})}((function(e){var t=e.window,r=t.AlgoliaAnalyticsObject||"aa";"string"==typeof r&&(s=t[r]),s||(t.AlgoliaAnalyticsObject=r,t[r]||(t[r]=function(){t[r].queue||(t[r].queue=[]);for(var e=arguments.length,n=new Array(e),o=0;o<e;o++)n[o]=arguments[o];t[r].queue.push(n)}),t[r].version=k,s=t[r],function(e){var t="[Autocomplete]: Could not load search-insights.js. Please load it manually following https://alg.li/insights-autocomplete";try{var r=e.document.createElement("script");r.async=!0,r.src=x,r.onerror=function(){console.error(t)},document.body.appendChild(r)}catch(n){console.error(t)}}(t))}));var f=O(s),m={current:[]},p=n((function(e){var t=e.state;if(t.isOpen){var r=t.collections.reduce((function(e,t){return[].concat(E(e),E(t.items))}),[]).filter(j);i(m.current.map((function(e){return e.objectID})),r.map((function(e){return e.objectID})))||(m.current=r,r.length>0&&C({onItemsChange:o,items:r,insights:f,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,r=e.onSelect,n=e.onActive;s("addAlgoliaAgent","insights-plugin"),t({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:f}}),r((function(e){var t=e.item,r=e.state,n=e.event;j(t)&&l({state:r,event:n,insights:f,item:t,insightsEvents:[D({eventName:"Item Selected"},c({item:t,items:m.current}))]})})),n((function(e){var t=e.item,r=e.state,n=e.event;j(t)&&u({state:r,event:n,insights:f,item:t,insightsEvents:[D({eventName:"Item Active"},c({item:t,items:m.current}))]})}))},onStateChange:function(e){var t=e.state;p({state:t})},__autocomplete_pluginOptions:e}}function N(e){return N="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},N(e)}function T(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function q(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==N(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==N(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===N(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function R(e,t,r){var n,o=t.initialState;return{getState:function(){return o},dispatch:function(n,i){var a=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?T(Object(r),!0).forEach((function(t){q(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):T(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}({},o);o=e(o,{type:n,props:t,payload:i}),r({state:o,prevState:a})},pendingRequests:(n=[],{add:function(e){return n.push(e),e.finally((function(){n=n.filter((function(t){return t!==e}))}))},cancelAll:function(){n.forEach((function(e){return e.cancel()}))},isEmpty:function(){return 0===n.length}})}}function L(e){return e.reduce((function(e,t){return e.concat(t)}),[])}function M(e){return M="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},M(e)}function H(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function F(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?H(Object(r),!0).forEach((function(t){U(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):H(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function U(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==M(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==M(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===M(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function B(e){return 0===e.collections.length?0:e.collections.reduce((function(e,t){return e+t.items.length}),0)}var V=0;function K(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function $(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?K(Object(r),!0).forEach((function(t){J(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):K(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function J(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==z(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==z(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===z(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function z(e){return z="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},z(e)}function W(e){return W="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},W(e)}function Q(e){return function(e){if(Array.isArray(e))return Z(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Z(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Z(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Z(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function G(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function X(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?G(Object(r),!0).forEach((function(t){Y(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):G(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Y(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==W(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==W(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===W(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ee(e,t){var r,n="undefined"!=typeof window?window:{},o=e.plugins||[];return X(X({debug:!1,openOnFocus:!1,placeholder:"",autoFocus:!1,defaultActiveItemId:null,stallThreshold:300,insights:!1,environment:n,shouldPanelOpen:function(e){return B(e.state)>0},reshape:function(e){return e.sources}},e),{},{id:null!==(r=e.id)&&void 0!==r?r:"autocomplete-".concat(V++),plugins:o,initialState:X({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var r;null===(r=e.onStateChange)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onStateChange)||void 0===r?void 0:r.call(e,t)}))},onSubmit:function(t){var r;null===(r=e.onSubmit)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onSubmit)||void 0===r?void 0:r.call(e,t)}))},onReset:function(t){var r;null===(r=e.onReset)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onReset)||void 0===r?void 0:r.call(e,t)}))},getSources:function(r){return Promise.all([].concat(Q(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var r=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,r.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));r.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:a,onResolve:a};Object.keys(t).forEach((function(e){t[e].__default=!0}));var n=$($({},t),e);return Promise.resolve(n)})))}))}(e,r)}))).then((function(e){return L(e)})).then((function(e){return e.map((function(e){return X(X({},e),{},{onSelect:function(r){e.onSelect(r),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,r)}))},onActive:function(r){e.onActive(r),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,r)}))},onResolve:function(r){e.onResolve(r),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,r)}))}})}))}))},navigator:X({navigate:function(e){var t=e.itemUrl;n.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,r=n.open(t,"_blank","noopener");null==r||r.focus()},navigateNewWindow:function(e){var t=e.itemUrl;n.open(t,"_blank","noopener")}},e.navigator)})}function te(e){return te="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},te(e)}function re(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ne(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?re(Object(r),!0).forEach((function(t){oe(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):re(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function oe(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==te(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==te(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===te(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ie(e){return ie="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ie(e)}function ae(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ce(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ae(Object(r),!0).forEach((function(t){le(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ae(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function le(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==ie(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==ie(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===ie(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ue(e){return function(e){if(Array.isArray(e))return se(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return se(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return se(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function se(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function fe(e){return Boolean(e.execute)}function me(e,t,r){if(o=e,Boolean(null==o?void 0:o.execute)){var n="algolia"===e.requesterId?Object.assign.apply(Object,[{}].concat(ue(Object.keys(r.context).map((function(e){var t;return null===(t=r.context[e])||void 0===t?void 0:t.__algoliaSearchParameters}))))):{};return ce(ce({},e),{},{requests:e.queries.map((function(r){return{query:"algolia"===e.requesterId?ce(ce({},r),{},{params:ce(ce({},n),r.params)}):r,sourceId:t,transformResponse:e.transformResponse}}))})}var o;return{items:e,sourceId:t}}function pe(e){var t=e.reduce((function(e,t){if(!fe(t))return e.push(t),e;var r=t.searchClient,n=t.execute,o=t.requesterId,i=t.requests,a=e.find((function(e){return fe(t)&&fe(e)&&e.searchClient===r&&Boolean(o)&&e.requesterId===o}));if(a){var c;(c=a.items).push.apply(c,ue(i))}else{var l={execute:n,requesterId:o,items:i,searchClient:r};e.push(l)}return e}),[]).map((function(e){if(!fe(e))return Promise.resolve(e);var t=e,r=t.execute,n=t.items;return r({searchClient:t.searchClient,requests:n})}));return Promise.all(t).then((function(e){return L(e)}))}function ve(e,t,r){return t.map((function(t){var n,o=e.filter((function(e){return e.sourceId===t.sourceId})),i=o.map((function(e){return e.items})),a=o[0].transformResponse,c=a?a({results:n=i,hits:n.map((function(e){return e.hits})).filter(Boolean),facetHits:n.map((function(e){var t;return null===(t=e.facetHits)||void 0===t?void 0:t.map((function(e){return{label:e.value,count:e.count,_highlightResult:{label:{value:e.highlighted}}}}))})).filter(Boolean)}):i;return t.onResolve({source:t,results:i,items:c,state:r.getState()}),Array.isArray(c),c.every(Boolean),'The `getItems` function from source "'.concat(t.sourceId,'" must return an array of items but returned ').concat(JSON.stringify(void 0),".\n\nDid you forget to return items?\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems"),{source:t,items:c}}))}function de(e,t){var r=t;return{then:function(t,n){return de(e.then(be(t,r,e),be(n,r,e)),r)},catch:function(t){return de(e.catch(be(t,r,e)),r)},finally:function(t){return t&&r.onCancelList.push(t),de(e.finally(be(t&&function(){return r.onCancelList=[],t()},r,e)),r)},cancel:function(){r.isCanceled=!0;var e=r.onCancelList;r.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===r.isCanceled}}}function ye(e){return de(new Promise((function(t,r){return e(t,r)})),{isCanceled:!1,onCancelList:[]})}function he(e){return de(e,{isCanceled:!1,onCancelList:[]})}function be(e,t,r){return e?function(r){return t.isCanceled?r:e(r)}:r}function ge(e){var t=function(e){var t=e.collections.map((function(e){return e.items.length})).reduce((function(e,t,r){var n=(e[r-1]||0)+t;return e.push(n),e}),[]).reduce((function(t,r){return r<=e.activeItemId?t+1:t}),0);return e.collections[t]}(e);if(!t)return null;var r=t.items[function(e){for(var t=e.state,r=e.collection,n=!1,o=0,i=0;!1===n;){var a=t.collections[o];if(a===r){n=!0;break}i+=a.items.length,o++}return t.activeItemId-i}({state:e,collection:t})],n=t.source;return{item:r,itemInputValue:n.getItemInputValue({item:r,state:e}),itemUrl:n.getItemUrl({item:r,state:e}),source:n}}function Oe(e){return Oe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Oe(e)}ye.resolve=function(e){return he(Promise.resolve(e))},ye.reject=function(e){return he(Promise.reject(e))};var Se=["event","nextState","props","query","refresh","store"];function je(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function we(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?je(Object(r),!0).forEach((function(t){Ee(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):je(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Ee(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==Oe(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==Oe(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Oe(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Pe(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Ie,De,Ae,ke=null,xe=(Ie=-1,De=-1,Ae=void 0,function(e){var t=++Ie;return Promise.resolve(e).then((function(e){return Ae&&t<De?Ae:(De=t,Ae=e,e)}))});function Ce(e){var t=e.event,r=e.nextState,n=void 0===r?{}:r,o=e.props,i=e.query,a=e.refresh,c=e.store,l=Pe(e,Se);ke&&o.environment.clearTimeout(ke);var u=l.setCollections,s=l.setIsOpen,f=l.setQuery,m=l.setActiveItemId,p=l.setStatus;if(f(i),m(o.defaultActiveItemId),!i&&!1===o.openOnFocus){var v,d=c.getState().collections.map((function(e){return we(we({},e),{},{items:[]})}));p("idle"),u(d),s(null!==(v=n.isOpen)&&void 0!==v?v:o.shouldPanelOpen({state:c.getState()}));var y=he(xe(d).then((function(){return Promise.resolve()})));return c.pendingRequests.add(y)}p("loading"),ke=o.environment.setTimeout((function(){p("stalled")}),o.stallThreshold);var h=he(xe(o.getSources(we({query:i,refresh:a,state:c.getState()},l)).then((function(e){return Promise.all(e.map((function(e){return Promise.resolve(e.getItems(we({query:i,refresh:a,state:c.getState()},l))).then((function(t){return me(t,e.sourceId,c.getState())}))}))).then(pe).then((function(t){return ve(t,e,c)})).then((function(e){return function(e){var t=e.collections,r=e.props,n=e.state,o=t.reduce((function(e,t){return ne(ne({},e),{},oe({},t.source.sourceId,ne(ne({},t.source),{},{getItems:function(){return L(t.items)}})))}),{}),i=r.plugins.reduce((function(e,t){return t.reshape?t.reshape(e):e}),{sourcesBySourceId:o,state:n}).sourcesBySourceId;return L(r.reshape({sourcesBySourceId:i,sources:Object.values(i),state:n})).filter(Boolean).map((function(e){return{source:e,items:e.getItems()}}))}({collections:e,props:o,state:c.getState()})}))})))).then((function(e){var r;p("idle"),u(e);var f=o.shouldPanelOpen({state:c.getState()});s(null!==(r=n.isOpen)&&void 0!==r?r:o.openOnFocus&&!i&&f||f);var m=ge(c.getState());if(null!==c.getState().activeItemId&&m){var v=m.item,d=m.itemInputValue,y=m.itemUrl,h=m.source;h.onActive(we({event:t,item:v,itemInputValue:d,itemUrl:y,refresh:a,source:h,state:c.getState()},l))}})).finally((function(){p("idle"),ke&&o.environment.clearTimeout(ke)}));return c.pendingRequests.add(h)}function _e(e){return _e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_e(e)}var Ne=["event","props","refresh","store"];function Te(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function qe(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?Te(Object(r),!0).forEach((function(t){Re(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Te(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Re(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==_e(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==_e(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===_e(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Le(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Me=/((gt|sm)-|galaxy nexus)|samsung[- ]|samsungbrowser/i;function He(e){return He="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},He(e)}var Fe=["props","refresh","store"],Ue=["inputElement","formElement","panelElement"],Be=["inputElement"],Ve=["inputElement","maxLength"],Ke=["sourceIndex"],$e=["sourceIndex"],Je=["item","source","sourceIndex"];function ze(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function We(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ze(Object(r),!0).forEach((function(t){Qe(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ze(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Qe(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==He(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==He(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===He(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Ze(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ge(e){var t=e.props,r=e.refresh,n=e.store,o=Ze(e,Fe),i=function(e,t){return void 0!==t?"".concat(e,"-").concat(t):e};return{getEnvironmentProps:function(e){var r=e.inputElement,o=e.formElement,i=e.panelElement;function a(e){!n.getState().isOpen&&n.pendingRequests.isEmpty()||e.target===r||!1===[o,i].some((function(t){return r=t,n=e.target,r===n||r.contains(n);var r,n}))&&(n.dispatch("blur",null),t.debug||n.pendingRequests.cancelAll())}return We({onTouchStart:a,onMouseDown:a,onTouchMove:function(e){!1!==n.getState().isOpen&&r===t.environment.document.activeElement&&e.target!==r&&r.blur()}},Ze(e,Ue))},getRootProps:function(e){return We({role:"combobox","aria-expanded":n.getState().isOpen,"aria-haspopup":"listbox","aria-owns":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label")},e)},getFormProps:function(e){e.inputElement;return We({action:"",noValidate:!0,role:"search",onSubmit:function(i){var a;i.preventDefault(),t.onSubmit(We({event:i,refresh:r,state:n.getState()},o)),n.dispatch("submit",null),null===(a=e.inputElement)||void 0===a||a.blur()},onReset:function(i){var a;i.preventDefault(),t.onReset(We({event:i,refresh:r,state:n.getState()},o)),n.dispatch("reset",null),null===(a=e.inputElement)||void 0===a||a.focus()}},Ze(e,Be))},getLabelProps:function(e){var r=e||{},n=r.sourceIndex,o=Ze(r,Ke);return We({htmlFor:"".concat(i(t.id,n),"-input"),id:"".concat(i(t.id,n),"-label")},o)},getInputProps:function(e){var i;function c(e){(t.openOnFocus||Boolean(n.getState().query))&&Ce(We({event:e,props:t,query:n.getState().completion||n.getState().query,refresh:r,store:n},o)),n.dispatch("focus",null)}var l=e||{},u=(l.inputElement,l.maxLength),s=void 0===u?512:u,f=Ze(l,Ve),m=ge(n.getState()),p=function(e){return Boolean(e&&e.match(Me))}((null===(i=t.environment.navigator)||void 0===i?void 0:i.userAgent)||""),v=null!=m&&m.itemUrl&&!p?"go":"search";return We({"aria-autocomplete":"both","aria-activedescendant":n.getState().isOpen&&null!==n.getState().activeItemId?"".concat(t.id,"-item-").concat(n.getState().activeItemId):void 0,"aria-controls":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:n.getState().completion||n.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:v,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:s,type:"search",onChange:function(e){Ce(We({event:e,props:t,query:e.currentTarget.value.slice(0,s),refresh:r,store:n},o))},onKeyDown:function(e){!function(e){var t=e.event,r=e.props,n=e.refresh,o=e.store,i=Le(e,Ne);if("ArrowUp"===t.key||"ArrowDown"===t.key){var a=function(){var e=r.environment.document.getElementById("".concat(r.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},c=function(){var e=ge(o.getState());if(null!==o.getState().activeItemId&&e){var r=e.item,a=e.itemInputValue,c=e.itemUrl,l=e.source;l.onActive(qe({event:t,item:r,itemInputValue:a,itemUrl:c,refresh:n,source:l,state:o.getState()},i))}};t.preventDefault(),!1===o.getState().isOpen&&(r.openOnFocus||Boolean(o.getState().query))?Ce(qe({event:t,props:r,query:o.getState().query,refresh:n,store:o},i)).then((function(){o.dispatch(t.key,{nextActiveItemId:r.defaultActiveItemId}),c(),setTimeout(a,0)})):(o.dispatch(t.key,{}),c(),a())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(r.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=ge(o.getState()),u=l.item,s=l.itemInputValue,f=l.itemUrl,m=l.source;if(t.metaKey||t.ctrlKey)void 0!==f&&(m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),r.navigator.navigateNewTab({itemUrl:f,item:u,state:o.getState()}));else if(t.shiftKey)void 0!==f&&(m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),r.navigator.navigateNewWindow({itemUrl:f,item:u,state:o.getState()}));else if(t.altKey);else{if(void 0!==f)return m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),void r.navigator.navigate({itemUrl:f,item:u,state:o.getState()});Ce(qe({event:t,nextState:{isOpen:!1},props:r,query:s,refresh:n,store:o},i)).then((function(){m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i))}))}}}(We({event:e,props:t,refresh:r,store:n},o))},onFocus:c,onBlur:a,onClick:function(r){e.inputElement!==t.environment.document.activeElement||n.getState().isOpen||c(r)}},f)},getPanelProps:function(e){return We({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){n.dispatch("mouseleave",null)}},e)},getListProps:function(e){var r=e||{},n=r.sourceIndex,o=Ze(r,$e);return We({role:"listbox","aria-labelledby":"".concat(i(t.id,n),"-label"),id:"".concat(i(t.id,n),"-list")},o)},getItemProps:function(e){var a=e.item,c=e.source,l=e.sourceIndex,u=Ze(e,Je);return We({id:"".concat(i(t.id,l),"-item-").concat(a.__autocomplete_id),role:"option","aria-selected":n.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(e){if(a.__autocomplete_id!==n.getState().activeItemId){n.dispatch("mousemove",a.__autocomplete_id);var t=ge(n.getState());if(null!==n.getState().activeItemId&&t){var i=t.item,c=t.itemInputValue,l=t.itemUrl,u=t.source;u.onActive(We({event:e,item:i,itemInputValue:c,itemUrl:l,refresh:r,source:u,state:n.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var i=c.getItemInputValue({item:a,state:n.getState()}),l=c.getItemUrl({item:a,state:n.getState()});(l?Promise.resolve():Ce(We({event:e,nextState:{isOpen:!1},props:t,query:i,refresh:r,store:n},o))).then((function(){c.onSelect(We({event:e,item:a,itemInputValue:i,itemUrl:l,refresh:r,source:c,state:n.getState()},o))}))}},u)}}}var Xe=[{segment:"autocomplete-core",version:"1.9.3"}];function Ye(e){return Ye="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ye(e)}function et(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function tt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?et(Object(r),!0).forEach((function(t){rt(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):et(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function rt(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==Ye(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==Ye(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Ye(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function nt(e){var t,r,n,o,i=e.plugins,a=e.options,c=null===(t=((null===(r=a.__autocomplete_metadata)||void 0===r?void 0:r.userAgents)||[])[0])||void 0===t?void 0:t.segment,l=c?rt({},c,Object.keys((null===(n=a.__autocomplete_metadata)||void 0===n?void 0:n.options)||{})):{};return{plugins:i.map((function(e){return{name:e.name,options:Object.keys(e.__autocomplete_pluginOptions||[])}})),options:tt({"autocomplete-core":Object.keys(a)},l),ua:Xe.concat((null===(o=a.__autocomplete_metadata)||void 0===o?void 0:o.userAgents)||[])}}function ot(e){var t,r=e.state;return!1===r.isOpen||null===r.activeItemId?null:(null===(t=ge(r))||void 0===t?void 0:t.itemInputValue)||null}function it(e,t,r,n){if(!r)return null;if(e<0&&(null===t||null!==n&&0===t))return r+e;var o=(null===t?-1:t)+e;return o<=-1||o>=r?null===n?null:0:o}function at(e){return at="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},at(e)}function ct(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function lt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ct(Object(r),!0).forEach((function(t){ut(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ct(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function ut(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==at(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==at(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===at(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var st=function(e,t){switch(t.type){case"setActiveItemId":case"mousemove":return lt(lt({},e),{},{activeItemId:t.payload});case"setQuery":return lt(lt({},e),{},{query:t.payload,completion:null});case"setCollections":return lt(lt({},e),{},{collections:t.payload});case"setIsOpen":return lt(lt({},e),{},{isOpen:t.payload});case"setStatus":return lt(lt({},e),{},{status:t.payload});case"setContext":return lt(lt({},e),{},{context:lt(lt({},e.context),t.payload)});case"ArrowDown":var r=lt(lt({},e),{},{activeItemId:t.payload.hasOwnProperty("nextActiveItemId")?t.payload.nextActiveItemId:it(1,e.activeItemId,B(e),t.props.defaultActiveItemId)});return lt(lt({},r),{},{completion:ot({state:r})});case"ArrowUp":var n=lt(lt({},e),{},{activeItemId:it(-1,e.activeItemId,B(e),t.props.defaultActiveItemId)});return lt(lt({},n),{},{completion:ot({state:n})});case"Escape":return e.isOpen?lt(lt({},e),{},{activeItemId:null,isOpen:!1,completion:null}):lt(lt({},e),{},{activeItemId:null,query:"",status:"idle",collections:[]});case"submit":return lt(lt({},e),{},{activeItemId:null,isOpen:!1,status:"idle"});case"reset":return lt(lt({},e),{},{activeItemId:!0===t.props.openOnFocus?t.props.defaultActiveItemId:null,status:"idle",query:""});case"focus":return lt(lt({},e),{},{activeItemId:t.props.defaultActiveItemId,isOpen:(t.props.openOnFocus||Boolean(e.query))&&t.props.shouldPanelOpen({state:e})});case"blur":return t.props.debug?e:lt(lt({},e),{},{isOpen:!1,activeItemId:null});case"mouseleave":return lt(lt({},e),{},{activeItemId:t.props.defaultActiveItemId});default:return"The reducer action ".concat(JSON.stringify(t.type)," is not supported."),e}};function ft(e){return ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ft(e)}function mt(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function pt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?mt(Object(r),!0).forEach((function(t){vt(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):mt(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function vt(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==ft(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==ft(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===ft(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function dt(e){var t=[],r=ee(e,t),n=R(st,r,(function(e){var t=e.prevState,n=e.state;r.onStateChange(pt({prevState:t,state:n,refresh:a,navigator:r.navigator},o))})),o=function(e){var t=e.store;return{setActiveItemId:function(e){t.dispatch("setActiveItemId",e)},setQuery:function(e){t.dispatch("setQuery",e)},setCollections:function(e){var r=0,n=e.map((function(e){return F(F({},e),{},{items:L(e.items).map((function(e){return F(F({},e),{},{__autocomplete_id:r++})}))})}));t.dispatch("setCollections",n)},setIsOpen:function(e){t.dispatch("setIsOpen",e)},setStatus:function(e){t.dispatch("setStatus",e)},setContext:function(e){t.dispatch("setContext",e)}}}({store:n}),i=Ge(pt({props:r,refresh:a,store:n,navigator:r.navigator},o));function a(){return Ce(pt({event:new Event("input"),nextState:{isOpen:n.getState().isOpen},props:r,navigator:r.navigator,query:n.getState().query,refresh:a,store:n},o))}if(e.insights&&!r.plugins.some((function(e){return"aa.algoliaInsightsPlugin"===e.name}))){var c="boolean"==typeof e.insights?{}:e.insights;r.plugins.push(_(c))}return r.plugins.forEach((function(e){var n;return null===(n=e.subscribe)||void 0===n?void 0:n.call(e,pt(pt({},o),{},{navigator:r.navigator,refresh:a,onSelect:function(e){t.push({onSelect:e})},onActive:function(e){t.push({onActive:e})},onResolve:function(e){t.push({onResolve:e})}}))})),function(e){var t,r,n=e.metadata,o=e.environment;if(null===(t=o.navigator)||void 0===t||null===(r=t.userAgent)||void 0===r?void 0:r.includes("Algolia Crawler")){var i=o.document.createElement("meta"),a=o.document.querySelector("head");i.name="algolia:metadata",setTimeout((function(){i.content=JSON.stringify(n),a.appendChild(i)}),0)}}({metadata:nt({plugins:r.plugins,options:e}),environment:r.environment}),pt(pt({refresh:a,navigator:r.navigator},i),o)}var yt=r(6540),ht=64;function bt(e){var t=e.translations,r=(void 0===t?{}:t).searchByText,n=void 0===r?"Search by":r;return yt.createElement("a",{href:"https://www.algolia.com/ref/docsearch/?utm_source=".concat(window.location.hostname,"&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch"),target:"_blank",rel:"noopener noreferrer"},yt.createElement("span",{className:"DocSearch-Label"},n),yt.createElement("svg",{width:"77",height:"19","aria-label":"Algolia",role:"img",id:"Layer_1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 2196.2 500"},yt.createElement("defs",null,yt.createElement("style",null,".cls-1,.cls-2{fill:#003dff;}.cls-2{fill-rule:evenodd;}")),yt.createElement("path",{className:"cls-2",d:"M1070.38,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),yt.createElement("rect",{className:"cls-1",x:"1845.88",y:"104.73",width:"62.58",height:"277.9",rx:"5.9",ry:"5.9"}),yt.createElement("path",{className:"cls-2",d:"M1851.78,71.38h50.77c3.26,0,5.9-2.64,5.9-5.9V5.9c0-3.62-3.24-6.39-6.82-5.83l-50.77,7.95c-2.87,.45-4.99,2.92-4.99,5.83v51.62c0,3.26,2.64,5.9,5.9,5.9Z"}),yt.createElement("path",{className:"cls-2",d:"M1764.03,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),yt.createElement("path",{className:"cls-2",d:"M1631.95,142.72c-11.14-12.25-24.83-21.65-40.78-28.31-15.92-6.53-33.26-9.85-52.07-9.85-18.78,0-36.15,3.17-51.92,9.85-15.59,6.66-29.29,16.05-40.76,28.31-11.47,12.23-20.38,26.87-26.76,44.03-6.38,17.17-9.24,37.37-9.24,58.36,0,20.99,3.19,36.87,9.55,54.21,6.38,17.32,15.14,32.11,26.45,44.36,11.29,12.23,24.83,21.62,40.6,28.46,15.77,6.83,40.12,10.33,52.4,10.48,12.25,0,36.78-3.82,52.7-10.48,15.92-6.68,29.46-16.23,40.78-28.46,11.29-12.25,20.05-27.04,26.25-44.36,6.22-17.34,9.24-33.22,9.24-54.21,0-20.99-3.34-41.19-10.03-58.36-6.38-17.17-15.14-31.8-26.43-44.03Zm-44.43,163.75c-11.47,15.75-27.56,23.7-48.09,23.7-20.55,0-36.63-7.8-48.1-23.7-11.47-15.75-17.21-34.01-17.21-61.2,0-26.89,5.59-49.14,17.06-64.87,11.45-15.75,27.54-23.52,48.07-23.52,20.55,0,36.63,7.78,48.09,23.52,11.47,15.57,17.36,37.98,17.36,64.87,0,27.19-5.72,45.3-17.19,61.2Z"}),yt.createElement("path",{className:"cls-2",d:"M894.42,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),yt.createElement("path",{className:"cls-2",d:"M2133.97,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),yt.createElement("path",{className:"cls-2",d:"M1314.05,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-11.79,18.34-19.6,39.64-22.11,62.59-.58,5.3-.88,10.68-.88,16.14s.31,11.15,.93,16.59c4.28,38.09,23.14,71.61,50.66,94.52,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47h0c17.99,0,34.61-5.93,48.16-15.97,16.29-11.58,28.88-28.54,34.48-47.75v50.26h-.11v11.08c0,21.84-5.71,38.27-17.34,49.36-11.61,11.08-31.04,16.63-58.25,16.63-11.12,0-28.79-.59-46.6-2.41-2.83-.29-5.46,1.5-6.27,4.22l-12.78,43.11c-1.02,3.46,1.27,7.02,4.83,7.53,21.52,3.08,42.52,4.68,54.65,4.68,48.91,0,85.16-10.75,108.89-32.21,21.48-19.41,33.15-48.89,35.2-88.52V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,64.1s.65,139.13,0,143.36c-12.08,9.77-27.11,13.59-43.49,14.7-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-1.32,0-2.63-.03-3.94-.1-40.41-2.11-74.52-37.26-74.52-79.38,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33Z"}),yt.createElement("path",{className:"cls-1",d:"M249.83,0C113.3,0,2,110.09,.03,246.16c-2,138.19,110.12,252.7,248.33,253.5,42.68,.25,83.79-10.19,120.3-30.03,3.56-1.93,4.11-6.83,1.08-9.51l-23.38-20.72c-4.75-4.21-11.51-5.4-17.36-2.92-25.48,10.84-53.17,16.38-81.71,16.03-111.68-1.37-201.91-94.29-200.13-205.96,1.76-110.26,92-199.41,202.67-199.41h202.69V407.41l-115-102.18c-3.72-3.31-9.42-2.66-12.42,1.31-18.46,24.44-48.53,39.64-81.93,37.34-46.33-3.2-83.87-40.5-87.34-86.81-4.15-55.24,39.63-101.52,94-101.52,49.18,0,89.68,37.85,93.91,85.95,.38,4.28,2.31,8.27,5.52,11.12l29.95,26.55c3.4,3.01,8.79,1.17,9.63-3.3,2.16-11.55,2.92-23.58,2.07-35.92-4.82-70.34-61.8-126.93-132.17-131.26-80.68-4.97-148.13,58.14-150.27,137.25-2.09,77.1,61.08,143.56,138.19,145.26,32.19,.71,62.03-9.41,86.14-26.95l150.26,133.2c6.44,5.71,16.61,1.14,16.61-7.47V9.48C499.66,4.25,495.42,0,490.18,0H249.83Z"})))}function gt(e){return yt.createElement("svg",{width:"15",height:"15","aria-label":e.ariaLabel,role:"img"},yt.createElement("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.2"},e.children))}function Ot(e){var t=e.translations,r=void 0===t?{}:t,n=r.selectText,o=void 0===n?"to select":n,i=r.selectKeyAriaLabel,a=void 0===i?"Enter key":i,c=r.navigateText,l=void 0===c?"to navigate":c,u=r.navigateUpKeyAriaLabel,s=void 0===u?"Arrow up":u,f=r.navigateDownKeyAriaLabel,m=void 0===f?"Arrow down":f,p=r.closeText,v=void 0===p?"to close":p,d=r.closeKeyAriaLabel,y=void 0===d?"Escape key":d,h=r.searchByText,b=void 0===h?"Search by":h;return yt.createElement(yt.Fragment,null,yt.createElement("div",{className:"DocSearch-Logo"},yt.createElement(bt,{translations:{searchByText:b}})),yt.createElement("ul",{className:"DocSearch-Commands"},yt.createElement("li",null,yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:a},yt.createElement("path",{d:"M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3"}))),yt.createElement("span",{className:"DocSearch-Label"},o)),yt.createElement("li",null,yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:m},yt.createElement("path",{d:"M7.5 3.5v8M10.5 8.5l-3 3-3-3"}))),yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:s},yt.createElement("path",{d:"M7.5 11.5v-8M10.5 6.5l-3-3-3 3"}))),yt.createElement("span",{className:"DocSearch-Label"},l)),yt.createElement("li",null,yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:y},yt.createElement("path",{d:"M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956"}))),yt.createElement("span",{className:"DocSearch-Label"},v))))}function St(e){var t=e.hit,r=e.children;return yt.createElement("a",{href:t.url},r)}function jt(){return yt.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0"}))}function wt(e){var t=e.translations,r=void 0===t?{}:t,n=r.titleText,o=void 0===n?"Unable to fetch results":n,i=r.helpText,a=void 0===i?"You might want to check your network connection.":i;return yt.createElement("div",{className:"DocSearch-ErrorScreen"},yt.createElement("div",{className:"DocSearch-Screen-Icon"},yt.createElement(jt,null)),yt.createElement("p",{className:"DocSearch-Title"},o),yt.createElement("p",{className:"DocSearch-Help"},a))}function Et(){return yt.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2"}))}var Pt=["translations"];function It(e){return function(e){if(Array.isArray(e))return Dt(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Dt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Dt(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Dt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function At(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function kt(e){var t=e.translations,r=void 0===t?{}:t,n=At(e,Pt),o=r.noResultsText,i=void 0===o?"No results for":o,a=r.suggestedQueryText,c=void 0===a?"Try searching for":a,l=r.reportMissingResultsText,u=void 0===l?"Believe this query should return results?":l,s=r.reportMissingResultsLinkText,f=void 0===s?"Let us know.":s,m=n.state.context.searchSuggestions;return yt.createElement("div",{className:"DocSearch-NoResults"},yt.createElement("div",{className:"DocSearch-Screen-Icon"},yt.createElement(Et,null)),yt.createElement("p",{className:"DocSearch-Title"},i,' "',yt.createElement("strong",null,n.state.query),'"'),m&&m.length>0&&yt.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},yt.createElement("p",{className:"DocSearch-Help"},c,":"),yt.createElement("ul",null,m.slice(0,3).reduce((function(e,t){return[].concat(It(e),[yt.createElement("li",{key:t},yt.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){n.setQuery(t.toLowerCase()+" "),n.refresh(),n.inputRef.current.focus()}},t))])}),[]))),n.getMissingResultsUrl&&yt.createElement("p",{className:"DocSearch-Help"},"".concat(u," "),yt.createElement("a",{href:n.getMissingResultsUrl({query:n.state.query}),target:"_blank",rel:"noopener noreferrer"},f)))}var xt=function(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function Ct(e){switch(e.type){case"lvl1":return yt.createElement(xt,null);case"content":return yt.createElement(Nt,null);default:return yt.createElement(_t,null)}}function _t(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function Nt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Tt(){return yt.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),yt.createElement("path",{d:"M8 17l-6-6 6-6"})))}var qt=["hit","attribute","tagName"];function Rt(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Lt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?Rt(Object(r),!0).forEach((function(t){Mt(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Rt(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Mt(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Ht(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ft(e,t){return t.split(".").reduce((function(e,t){return null!=e&&e[t]?e[t]:null}),e)}function Ut(e){var t=e.hit,r=e.attribute,n=e.tagName,o=void 0===n?"span":n,i=Ht(e,qt);return(0,yt.createElement)(o,Lt(Lt({},i),{},{dangerouslySetInnerHTML:{__html:Ft(t,"_snippetResult.".concat(r,".value"))||Ft(t,r)}}))}function Bt(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,o,i=[],a=!0,c=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(l){c=!0,o=l}finally{try{a||null==r.return||r.return()}finally{if(c)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Vt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Vt(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Vt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function Kt(){return Kt=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Kt.apply(this,arguments)}function $t(e){return e.collection&&0!==e.collection.items.length?yt.createElement("section",{className:"DocSearch-Hits"},yt.createElement("div",{className:"DocSearch-Hit-source"},e.title),yt.createElement("ul",e.getListProps(),e.collection.items.map((function(t,r){return yt.createElement(Jt,Kt({key:[e.title,t.objectID].join(":"),item:t,index:r},e))})))):null}function Jt(e){var t=e.item,r=e.index,n=e.renderIcon,o=e.renderAction,i=e.getItemProps,a=e.onItemClick,c=e.collection,l=e.hitComponent,u=Bt(yt.useState(!1),2),s=u[0],f=u[1],m=Bt(yt.useState(!1),2),p=m[0],v=m[1],d=yt.useRef(null),y=l;return yt.createElement("li",Kt({className:["DocSearch-Hit",t.__docsearch_parent&&"DocSearch-Hit--Child",s&&"DocSearch-Hit--deleting",p&&"DocSearch-Hit--favoriting"].filter(Boolean).join(" "),onTransitionEnd:function(){d.current&&d.current()}},i({item:t,source:c.source,onClick:function(e){a(t,e)}})),yt.createElement(y,{hit:t},yt.createElement("div",{className:"DocSearch-Hit-Container"},n({item:t,index:r}),t.hierarchy[t.type]&&"lvl1"===t.type&&yt.createElement("div",{className:"DocSearch-Hit-content-wrapper"},yt.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.lvl1"}),t.content&&yt.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"content"})),t.hierarchy[t.type]&&("lvl2"===t.type||"lvl3"===t.type||"lvl4"===t.type||"lvl5"===t.type||"lvl6"===t.type)&&yt.createElement("div",{className:"DocSearch-Hit-content-wrapper"},yt.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.".concat(t.type)}),yt.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),"content"===t.type&&yt.createElement("div",{className:"DocSearch-Hit-content-wrapper"},yt.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"content"}),yt.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),o({item:t,runDeleteTransition:function(e){f(!0),d.current=e},runFavoriteTransition:function(e){v(!0),d.current=e}}))))}var zt=/(<mark>|<\/mark>)/g,Wt=RegExp(zt.source);function Qt(e){var t,r,n=e;if(!n.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var o=((n.__docsearch_parent?null===(t=n.__docsearch_parent)||void 0===t||null===(t=t._highlightResult)||void 0===t||null===(t=t.hierarchy)||void 0===t?void 0:t.lvl0:null===(r=e._highlightResult)||void 0===r||null===(r=r.hierarchy)||void 0===r?void 0:r.lvl0)||{}).value;return o&&Wt.test(o)?o.replace(zt,""):o}function Zt(){return Zt=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Zt.apply(this,arguments)}function Gt(e){return yt.createElement("div",{className:"DocSearch-Dropdown-Container"},e.state.collections.map((function(t){if(0===t.items.length)return null;var r=Qt(t.items[0]);return yt.createElement($t,Zt({},e,{key:t.source.sourceId,title:r,collection:t,renderIcon:function(e){var r,n=e.item,o=e.index;return yt.createElement(yt.Fragment,null,n.__docsearch_parent&&yt.createElement("svg",{className:"DocSearch-Hit-Tree",viewBox:"0 0 24 54"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},n.__docsearch_parent!==(null===(r=t.items[o+1])||void 0===r?void 0:r.__docsearch_parent)?yt.createElement("path",{d:"M8 6v21M20 27H8.3"}):yt.createElement("path",{d:"M8 6v42M20 27H8.3"}))),yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Ct,{type:n.type})))},renderAction:function(){return yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement(Tt,null))}}))})),e.resultsFooterComponent&&yt.createElement("section",{className:"DocSearch-HitsFooter"},yt.createElement(e.resultsFooterComponent,{state:e.state})))}function Xt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M3.18 6.6a8.23 8.23 0 1112.93 9.94h0a8.23 8.23 0 01-11.63 0"}),yt.createElement("path",{d:"M6.44 7.25H2.55V3.36M10.45 6v5.6M10.45 11.6L13 13"})))}function Yt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M10 14.2L5 17l1-5.6-4-4 5.5-.7 2.5-5 2.5 5 5.6.8-4 4 .9 5.5z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function er(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}var tr=["translations"];function rr(){return rr=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},rr.apply(this,arguments)}function nr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function or(e){var t=e.translations,r=void 0===t?{}:t,n=nr(e,tr),o=r.recentSearchesTitle,i=void 0===o?"Recent":o,a=r.noRecentSearchesText,c=void 0===a?"No recent searches":a,l=r.saveRecentSearchButtonTitle,u=void 0===l?"Save this search":l,s=r.removeRecentSearchButtonTitle,f=void 0===s?"Remove this search from history":s,m=r.favoriteSearchesTitle,p=void 0===m?"Favorite":m,v=r.removeFavoriteSearchButtonTitle,d=void 0===v?"Remove this search from favorites":v;return"idle"===n.state.status&&!1===n.hasCollections?n.disableUserPersonalization?null:yt.createElement("div",{className:"DocSearch-StartScreen"},yt.createElement("p",{className:"DocSearch-Help"},c)):!1===n.hasCollections?null:yt.createElement("div",{className:"DocSearch-Dropdown-Container"},yt.createElement($t,rr({},n,{title:i,collection:n.state.collections[0],renderIcon:function(){return yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Xt,null))},renderAction:function(e){var t=e.item,r=e.runFavoriteTransition,o=e.runDeleteTransition;return yt.createElement(yt.Fragment,null,yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:u,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.add(t),n.recentSearches.remove(t),n.refresh()}))}},yt.createElement(Yt,null))),yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),o((function(){n.recentSearches.remove(t),n.refresh()}))}},yt.createElement(er,null))))}})),yt.createElement($t,rr({},n,{title:p,collection:n.state.collections[1],renderIcon:function(){return yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Yt,null))},renderAction:function(e){var t=e.item,r=e.runDeleteTransition;return yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:d,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.remove(t),n.refresh()}))}},yt.createElement(er,null)))}})))}var ir=["translations"];function ar(){return ar=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},ar.apply(this,arguments)}function cr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var lr=yt.memo((function(e){var t=e.translations,r=void 0===t?{}:t,n=cr(e,ir);if("error"===n.state.status)return yt.createElement(wt,{translations:null==r?void 0:r.errorScreen});var o=n.state.collections.some((function(e){return e.items.length>0}));return n.state.query?!1===o?yt.createElement(kt,ar({},n,{translations:null==r?void 0:r.noResultsScreen})):yt.createElement(Gt,n):yt.createElement(or,ar({},n,{hasCollections:o,translations:null==r?void 0:r.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status}));function ur(){return yt.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},yt.createElement("g",{fill:"none",fillRule:"evenodd"},yt.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},yt.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),yt.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},yt.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}var sr=r(9188),fr=["translations"];function mr(){return mr=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},mr.apply(this,arguments)}function pr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function vr(e){var t=e.translations,r=void 0===t?{}:t,n=pr(e,fr),o=r.resetButtonTitle,i=void 0===o?"Clear the query":o,a=r.resetButtonAriaLabel,c=void 0===a?"Clear the query":a,l=r.cancelButtonText,u=void 0===l?"Cancel":l,s=r.cancelButtonAriaLabel,f=void 0===s?"Cancel":s,m=r.searchInputLabel,p=void 0===m?"Search":m,v=n.getFormProps({inputElement:n.inputRef.current}).onReset;return yt.useEffect((function(){n.autoFocus&&n.inputRef.current&&n.inputRef.current.focus()}),[n.autoFocus,n.inputRef]),yt.useEffect((function(){n.isFromSelection&&n.inputRef.current&&n.inputRef.current.select()}),[n.isFromSelection,n.inputRef]),yt.createElement(yt.Fragment,null,yt.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:v},yt.createElement("label",mr({className:"DocSearch-MagnifierLabel"},n.getLabelProps()),yt.createElement(sr.W,null),yt.createElement("span",{className:"DocSearch-VisuallyHiddenForAccessibility"},p)),yt.createElement("div",{className:"DocSearch-LoadingIndicator"},yt.createElement(ur,null)),yt.createElement("input",mr({className:"DocSearch-Input",ref:n.inputRef},n.getInputProps({inputElement:n.inputRef.current,autoFocus:n.autoFocus,maxLength:ht}))),yt.createElement("button",{type:"reset",title:i,className:"DocSearch-Reset","aria-label":c,hidden:!n.state.query},yt.createElement(er,null))),yt.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":f,onClick:n.onClose},u))}var dr=["_highlightResult","_snippetResult"];function yr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function hr(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(t){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}function br(e){var t=e.key,r=e.limit,n=void 0===r?5:r,o=hr(t),i=o.getItem().slice(0,n);return{add:function(e){var t=e,r=(t._highlightResult,t._snippetResult,yr(t,dr)),a=i.findIndex((function(e){return e.objectID===r.objectID}));a>-1&&i.splice(a,1),i.unshift(r),i=i.slice(0,n),o.setItem(i)},remove:function(e){i=i.filter((function(t){return t.objectID!==e.objectID})),o.setItem(i)},getAll:function(){return i}}}function gr(e){const t=`algoliasearch-client-js-${e.key}`;let r;const n=()=>(void 0===r&&(r=e.localStorage||window.localStorage),r),o=()=>JSON.parse(n().getItem(t)||"{}"),i=e=>{n().setItem(t,JSON.stringify(e))};return{get:(t,r,n={miss:()=>Promise.resolve()})=>Promise.resolve().then((()=>{(()=>{const t=e.timeToLive?1e3*e.timeToLive:null,r=o(),n=Object.fromEntries(Object.entries(r).filter((([,e])=>void 0!==e.timestamp)));if(i(n),!t)return;const a=Object.fromEntries(Object.entries(n).filter((([,e])=>{const r=(new Date).getTime();return!(e.timestamp+t<r)})));i(a)})();const r=JSON.stringify(t);return o()[r]})).then((e=>Promise.all([e?e.value:r(),void 0!==e]))).then((([e,t])=>Promise.all([e,t||n.miss(e)]))).then((([e])=>e)),set:(e,r)=>Promise.resolve().then((()=>{const i=o();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:r},n().setItem(t,JSON.stringify(i)),r})),delete:e=>Promise.resolve().then((()=>{const r=o();delete r[JSON.stringify(e)],n().setItem(t,JSON.stringify(r))})),clear:()=>Promise.resolve().then((()=>{n().removeItem(t)}))}}function Or(e){const t=[...e.caches],r=t.shift();return void 0===r?{get:(e,t,r={miss:()=>Promise.resolve()})=>t().then((e=>Promise.all([e,r.miss(e)]))).then((([e])=>e)),set:(e,t)=>Promise.resolve(t),delete:e=>Promise.resolve(),clear:()=>Promise.resolve()}:{get:(e,n,o={miss:()=>Promise.resolve()})=>r.get(e,n,o).catch((()=>Or({caches:t}).get(e,n,o))),set:(e,n)=>r.set(e,n).catch((()=>Or({caches:t}).set(e,n))),delete:e=>r.delete(e).catch((()=>Or({caches:t}).delete(e))),clear:()=>r.clear().catch((()=>Or({caches:t}).clear()))}}function Sr(e={serializable:!0}){let t={};return{get(r,n,o={miss:()=>Promise.resolve()}){const i=JSON.stringify(r);if(i in t)return Promise.resolve(e.serializable?JSON.parse(t[i]):t[i]);const a=n(),c=o&&o.miss||(()=>Promise.resolve());return a.then((e=>c(e))).then((()=>a))},set:(r,n)=>(t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)),delete:e=>(delete t[JSON.stringify(e)],Promise.resolve()),clear:()=>(t={},Promise.resolve())}}function jr(e){let t=e.length-1;for(;t>0;t--){const r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function wr(e,t){return t?(Object.keys(t).forEach((r=>{e[r]=t[r](e)})),e):e}function Er(e,...t){let r=0;return e.replace(/%s/g,(()=>encodeURIComponent(t[r++])))}const Pr="4.22.1",Ir={WithinQueryParameters:0,WithinHeaders:1};function Dr(e,t){const r=e||{},n=r.data||{};return Object.keys(r).forEach((e=>{-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(n[e]=r[e])})),{data:Object.entries(n).length>0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}const Ar={Read:1,Write:2,Any:3},kr={Up:1,Down:2,Timeouted:3},xr=12e4;function Cr(e,t=kr.Up){return{...e,status:t,lastUpdate:Date.now()}}function _r(e){return"string"==typeof e?{protocol:"https",url:e,accept:Ar.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||Ar.Any}}const Nr={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};function Tr(e,t){return Promise.all(t.map((t=>e.get(t,(()=>Promise.resolve(Cr(t))))))).then((e=>{const r=e.filter((e=>function(e){return e.status===kr.Up||Date.now()-e.lastUpdate>xr}(e))),n=e.filter((e=>function(e){return e.status===kr.Timeouted&&Date.now()-e.lastUpdate<=xr}(e))),o=[...r,...n];return{getTimeout:(e,t)=>(0===n.length&&0===e?1:n.length+3+e)*t,statelessHosts:o.length>0?o.map((e=>_r(e))):t}}))}const qr=(e,t)=>(e=>{const t=e.status;return e.isTimedOut||(({isTimedOut:e,status:t})=>!e&&!~~t)(e)||2!=~~(t/100)&&4!=~~(t/100)})(e)?t.onRetry(e):(({status:e})=>2==~~(e/100))(e)?t.onSuccess(e):t.onFail(e);function Rr(e,t,r,n){const o=[],i=function(e,t){if(e.method===Nr.Get||void 0===e.data&&void 0===t.data)return;const r=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(r)}(r,n),a=function(e,t){const r={...e.headers,...t.headers},n={};return Object.keys(r).forEach((e=>{const t=r[e];n[e.toLowerCase()]=t})),n}(e,n),c=r.method,l=r.method!==Nr.Get?{}:{...r.data,...n.data},u={"x-algolia-agent":e.userAgent.value,...e.queryParameters,...l,...n.queryParameters};let s=0;const f=(t,l)=>{const m=t.pop();if(void 0===m)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:Fr(o)};const p={data:i,headers:a,method:c,url:Mr(m,r.path,u),connectTimeout:l(s,e.timeouts.connect),responseTimeout:l(s,n.timeout)},v=e=>{const r={request:p,response:e,host:m,triesLeft:t.length};return o.push(r),r},d={onSuccess:e=>function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e),onRetry(r){const n=v(r);return r.isTimedOut&&s++,Promise.all([e.logger.info("Retryable failure",Ur(n)),e.hostsCache.set(m,Cr(m,r.isTimedOut?kr.Timeouted:kr.Down))]).then((()=>f(t,l)))},onFail(e){throw v(e),function({content:e,status:t},r){let n=e;try{n=JSON.parse(e).message}catch(o){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(n,t,r)}(e,Fr(o))}};return e.requester.send(p).then((e=>qr(e,d)))};return Tr(e.hostsCache,t).then((e=>f([...e.statelessHosts].reverse(),e.getTimeout)))}function Lr(e){const t={value:`Algolia for JavaScript (${e})`,add(e){const r=`; ${e.segment}${void 0!==e.version?` (${e.version})`:""}`;return-1===t.value.indexOf(r)&&(t.value=`${t.value}${r}`),t}};return t}function Mr(e,t,r){const n=Hr(r);let o=`${e.protocol}://${e.url}/${"/"===t.charAt(0)?t.substr(1):t}`;return n.length&&(o+=`?${n}`),o}function Hr(e){return Object.keys(e).map((t=>{return Er("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function Fr(e){return e.map((e=>Ur(e)))}function Ur(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}const Br=e=>{const t=e.appId,r=function(e,t,r){const n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:()=>e===Ir.WithinHeaders?n:{},queryParameters:()=>e===Ir.WithinQueryParameters?n:{}}}(void 0!==e.authMode?e.authMode:Ir.WithinHeaders,t,e.apiKey),n=function(e){const{hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:i,timeouts:a,userAgent:c,hosts:l,queryParameters:u,headers:s}=e,f={hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:i,timeouts:a,userAgent:c,headers:s,queryParameters:u,hosts:l.map((e=>_r(e))),read(e,t){const r=Dr(t,f.timeouts.read),n=()=>Rr(f,f.hosts.filter((e=>!!(e.accept&Ar.Read))),e,r);if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();const o={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(o,(()=>f.requestsCache.get(o,(()=>f.requestsCache.set(o,n()).then((e=>Promise.all([f.requestsCache.delete(o),e])),(e=>Promise.all([f.requestsCache.delete(o),Promise.reject(e)]))).then((([e,t])=>t))))),{miss:e=>f.responsesCache.set(o,e)})},write:(e,t)=>Rr(f,f.hosts.filter((e=>!!(e.accept&Ar.Write))),e,Dr(t,f.timeouts.write))};return f}({hosts:[{url:`${t}-dsn.algolia.net`,accept:Ar.Read},{url:`${t}.algolia.net`,accept:Ar.Write}].concat(jr([{url:`${t}-1.algolianet.com`},{url:`${t}-2.algolianet.com`},{url:`${t}-3.algolianet.com`}])),...e,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...e.headers},queryParameters:{...r.queryParameters(),...e.queryParameters}}),o={transporter:n,appId:t,addAlgoliaAgent(e,t){n.userAgent.add({segment:e,version:t})},clearCache:()=>Promise.all([n.requestsCache.clear(),n.responsesCache.clear()]).then((()=>{}))};return wr(o,e.methods)},Vr=e=>(t,r)=>t.method===Nr.Get?e.transporter.read(t,r):e.transporter.write(t,r),Kr=e=>(t,r={})=>wr({transporter:e.transporter,appId:e.appId,indexName:t},r.methods),$r=e=>(t,r)=>{const n=t.map((e=>({...e,params:Hr(e.params||{})})));return e.transporter.read({method:Nr.Post,path:"1/indexes/*/queries",data:{requests:n},cacheable:!0},r)},Jr=e=>(t,r)=>Promise.all(t.map((t=>{const{facetName:n,facetQuery:o,...i}=t.params;return Kr(e)(t.indexName,{methods:{searchForFacetValues:Qr}}).searchForFacetValues(n,o,{...r,...i})}))),zr=e=>(t,r,n)=>e.transporter.read({method:Nr.Post,path:Er("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n),Wr=e=>(t,r)=>e.transporter.read({method:Nr.Post,path:Er("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r),Qr=e=>(t,r,n)=>e.transporter.read({method:Nr.Post,path:Er("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n),Zr={Debug:1,Info:2,Error:3};function Gr(e,t,r){const n={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:e=>new Promise((t=>{const r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((t=>r.setRequestHeader(t,e.headers[t])));const n=(e,n)=>setTimeout((()=>{r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e),o=n(e.connectTimeout,"Connection timeout");let i;r.onreadystatechange=()=>{r.readyState>r.OPENED&&void 0===i&&(clearTimeout(o),i=n(e.responseTimeout,"Socket timeout"))},r.onerror=()=>{0===r.status&&(clearTimeout(o),clearTimeout(i),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=()=>{clearTimeout(o),clearTimeout(i),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))},logger:(o=Zr.Error,{debug:(e,t)=>(Zr.Debug>=o&&console.debug(e,t),Promise.resolve()),info:(e,t)=>(Zr.Info>=o&&console.info(e,t),Promise.resolve()),error:(e,t)=>(console.error(e,t),Promise.resolve())}),responsesCache:Sr(),requestsCache:Sr({serializable:!1}),hostsCache:Or({caches:[gr({key:`${Pr}-${e}`}),Sr()]}),userAgent:Lr(Pr).add({segment:"Browser",version:"lite"}),authMode:Ir.WithinQueryParameters};var o;return Br({...n,...r,methods:{search:$r,searchForFacetValues:Jr,multipleQueries:$r,multipleSearchForFacetValues:Jr,customRequest:Vr,initIndex:e=>t=>Kr(e)(t,{methods:{search:Wr,searchForFacetValues:Qr,findAnswers:zr}})}})}Gr.version=Pr;const Xr=Gr;var Yr="3.6.0";function en(){}function tn(e){return e}function rn(e){return 1===e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}function nn(e,t,r){return e.reduce((function(e,n){var o=t(n);return e.hasOwnProperty(o)||(e[o]=[]),e[o].length<(r||5)&&e[o].push(n),e}),{})}var on=["footer","searchBox"];function an(){return an=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},an.apply(this,arguments)}function cn(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ln(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?cn(Object(r),!0).forEach((function(t){un(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):cn(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function un(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function sn(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,o,i=[],a=!0,c=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(l){c=!0,o=l}finally{try{a||null==r.return||r.return()}finally{if(c)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return fn(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return fn(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function fn(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function mn(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function pn(e){var t=e.appId,r=e.apiKey,n=e.indexName,o=e.placeholder,i=void 0===o?"Search docs":o,a=e.searchParameters,c=e.maxResultsPerGroup,l=e.onClose,u=void 0===l?en:l,s=e.transformItems,f=void 0===s?tn:s,m=e.hitComponent,p=void 0===m?St:m,v=e.resultsFooterComponent,d=void 0===v?function(){return null}:v,y=e.navigator,h=e.initialScrollY,b=void 0===h?0:h,g=e.transformSearchClient,O=void 0===g?tn:g,S=e.disableUserPersonalization,j=void 0!==S&&S,w=e.initialQuery,E=void 0===w?"":w,P=e.translations,I=void 0===P?{}:P,D=e.getMissingResultsUrl,A=e.insights,k=void 0!==A&&A,x=I.footer,C=I.searchBox,_=mn(I,on),N=sn(yt.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),T=N[0],q=N[1],R=yt.useRef(null),L=yt.useRef(null),M=yt.useRef(null),H=yt.useRef(null),F=yt.useRef(null),U=yt.useRef(10),B=yt.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,ht):"").current,V=yt.useRef(E||B).current,K=function(e,t,r){return yt.useMemo((function(){var n=Xr(e,t);return n.addAlgoliaAgent("docsearch",Yr),!1===/docsearch.js \(.*\)/.test(n.transporter.userAgent.value)&&n.addAlgoliaAgent("docsearch-react",Yr),r(n)}),[e,t,r])}(t,r,O),$=yt.useRef(br({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(n),limit:10})).current,J=yt.useRef(br({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(n),limit:0===$.getAll().length?7:4})).current,z=yt.useCallback((function(e){if(!j){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===$.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&J.add(t)}}),[$,J,j]),W=yt.useCallback((function(e){if(T.context.algoliaInsightsPlugin&&e.__autocomplete_id){var t=e,r={eventName:"Item Selected",index:t.__autocomplete_indexName,items:[t],positions:[e.__autocomplete_id],queryID:t.__autocomplete_queryID};T.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(r)}}),[T.context.algoliaInsightsPlugin]),Q=yt.useMemo((function(){return dt({id:"docsearch",defaultActiveItemId:0,placeholder:i,openOnFocus:!0,initialState:{query:V,context:{searchSuggestions:[]}},insights:k,navigator:y,onStateChange:function(e){q(e.state)},getSources:function(e){var o=e.query,i=e.state,l=e.setContext,s=e.setStatus;if(!o)return j?[]:[{sourceId:"recentSearches",onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return J.getAll()}},{sourceId:"favoriteSearches",onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return $.getAll()}}];var m=Boolean(k);return K.search([{query:o,indexName:n,params:ln({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(U.current),"hierarchy.lvl2:".concat(U.current),"hierarchy.lvl3:".concat(U.current),"hierarchy.lvl4:".concat(U.current),"hierarchy.lvl5:".concat(U.current),"hierarchy.lvl6:".concat(U.current),"content:".concat(U.current)],snippetEllipsisText:"\u2026",highlightPreTag:"<mark>",highlightPostTag:"</mark>",hitsPerPage:20,clickAnalytics:m},a)}]).catch((function(e){throw"RetryError"===e.name&&s("error"),e})).then((function(e){var o=e.results[0],a=o.hits,s=o.nbHits,p=nn(a,(function(e){return Qt(e)}),c);i.context.searchSuggestions.length<Object.keys(p).length&&l({searchSuggestions:Object.keys(p)}),l({nbHits:s});var v={};return m&&(v={__autocomplete_indexName:n,__autocomplete_queryID:o.queryID,__autocomplete_algoliaCredentials:{appId:t,apiKey:r}}),Object.values(p).map((function(e,t){return{sourceId:"hits".concat(t),onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return Object.values(nn(e,(function(e){return e.hierarchy.lvl1}),c)).map(f).map((function(e){return e.map((function(t){var r=null,n=e.find((function(e){return"lvl1"===e.type&&e.hierarchy.lvl1===t.hierarchy.lvl1}));return"lvl1"!==t.type&&n&&(r=n),ln(ln({},t),{},{__docsearch_parent:r},v)}))})).flat()}}}))}))}})}),[n,a,c,K,u,J,$,z,V,i,y,f,j,k,t,r]),Z=Q.getEnvironmentProps,G=Q.getRootProps,X=Q.refresh;return function(e){var t=e.getEnvironmentProps,r=e.panelElement,n=e.formElement,o=e.inputElement;yt.useEffect((function(){if(r&&n&&o){var e=t({panelElement:r,formElement:n,inputElement:o}),i=e.onTouchStart,a=e.onTouchMove;return window.addEventListener("touchstart",i),window.addEventListener("touchmove",a),function(){window.removeEventListener("touchstart",i),window.removeEventListener("touchmove",a)}}}),[t,r,n,o])}({getEnvironmentProps:Z,panelElement:H.current,formElement:M.current,inputElement:F.current}),function(e){var t=e.container;yt.useEffect((function(){if(t){var e=t.querySelectorAll("a[href]:not([disabled]), button:not([disabled]), input:not([disabled])"),r=e[0],n=e[e.length-1];return t.addEventListener("keydown",o),function(){t.removeEventListener("keydown",o)}}function o(e){"Tab"===e.key&&(e.shiftKey?document.activeElement===r&&(e.preventDefault(),n.focus()):document.activeElement===n&&(e.preventDefault(),r.focus()))}}),[t])}({container:R.current}),yt.useEffect((function(){return document.body.classList.add("DocSearch--active"),function(){var e,t;document.body.classList.remove("DocSearch--active"),null===(e=(t=window).scrollTo)||void 0===e||e.call(t,0,b)}}),[]),yt.useEffect((function(){window.matchMedia("(max-width: 768px)").matches&&(U.current=5)}),[]),yt.useEffect((function(){H.current&&(H.current.scrollTop=0)}),[T.query]),yt.useEffect((function(){V.length>0&&(X(),F.current&&F.current.focus())}),[V,X]),yt.useEffect((function(){function e(){if(L.current){var e=.01*window.innerHeight;L.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),yt.createElement("div",an({ref:R},G({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===T.status&&"DocSearch-Container--Stalled","error"===T.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&u()}}),yt.createElement("div",{className:"DocSearch-Modal",ref:L},yt.createElement("header",{className:"DocSearch-SearchBar",ref:M},yt.createElement(vr,an({},Q,{state:T,autoFocus:0===V.length,inputRef:F,isFromSelection:Boolean(V)&&V===B,translations:C,onClose:u}))),yt.createElement("div",{className:"DocSearch-Dropdown",ref:H},yt.createElement(lr,an({},Q,{indexName:n,state:T,hitComponent:p,resultsFooterComponent:d,disableUserPersonalization:j,recentSearches:J,favoriteSearches:$,inputRef:F,translations:_,getMissingResultsUrl:D,onItemClick:function(e,t){W(e),z(e),rn(t)||u()}}))),yt.createElement("footer",{className:"DocSearch-Footer"},yt.createElement(Ot,{translations:x}))))}}}]); \ No newline at end of file diff --git a/assets/js/9ade351a.168bdbfb.js b/assets/js/9ade351a.168bdbfb.js new file mode 100644 index 00000000000..3a187fb2687 --- /dev/null +++ b/assets/js/9ade351a.168bdbfb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[4986],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>y});var o=n(6540);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 r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,o,a=function(e,t){if(null==e)return{};var n,o,a={},r=Object.keys(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},u=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),u=a,y=d["".concat(l,".").concat(u)]||d[u]||m[u]||r;return n?o.createElement(y,i(i({ref:t},c),{},{components:n})):o.createElement(y,i({ref:t},c))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=u;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:a,i[1]=s;for(var p=2;p<r;p++)i[p]=n[p];return o.createElement.apply(null,i)}return o.createElement.apply(null,n)}u.displayName="MDXCreateElement"},2130:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var o=n(8168),a=(n(6540),n(5680));const r={title:"Metaprotocol",order:2},i=void 0,s={unversionedId:"modules/metaprotocols",id:"modules/metaprotocols",title:"Metaprotocol",description:"The x/metaprotocol module adds support for encoding and decoding additional fields attached to transactions.",source:"@site/docs/modules/metaprotocols.md",sourceDirName:"modules",slug:"/modules/metaprotocols",permalink:"/main/modules/metaprotocols",draft:!1,tags:[],version:"current",frontMatter:{title:"Metaprotocol",order:2},sidebar:"tutorialSidebar",previous:{title:"LSM Staking",permalink:"/main/modules/lsm-staking"}},l={},p=[],c={toc:p},d="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,o.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("p",null,"The ",(0,a.yg)("inlineCode",{parentName:"p"},"x/metaprotocol")," module adds support for encoding and decoding additional fields attached to transactions."),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"extension_options")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"non_critical_extension_options")," are optional fields that can be used to attach data to valid transactions. The fields are validated by the blockchain, but they are not used in any way. The fields pass validation if they are provided as empty lists (",(0,a.yg)("inlineCode",{parentName:"p"},"[ ]"),") or they use a list of ",(0,a.yg)("inlineCode",{parentName:"p"},"ExtensionData")," types."),(0,a.yg)("p",null,"The application does not use the attached data but it does ensure that the correct type is provided and that it can be successfully unmarshalled. The attached data will be part of a block."),(0,a.yg)("admonition",{type:"tip"},(0,a.yg)("p",{parentName:"admonition"},"Txs where ",(0,a.yg)("inlineCode",{parentName:"p"},"extension_options")," or ",(0,a.yg)("inlineCode",{parentName:"p"},"non_critical_extension_options")," are populated with a type other than ",(0,a.yg)("inlineCode",{parentName:"p"},"/gaia.metaprotocols.ExtensionData")," are considered invalid and will be rejected.")),(0,a.yg)("p",null,"Here is an example of a correctly formed ",(0,a.yg)("inlineCode",{parentName:"p"},"non_critical_extension_options")," field:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{\n "@type": "/gaia.metaprotocols.ExtensionData", // must be this exact string\n "protocol_id": "some-protocol",\n "protocol_version": "1",\n "data": "<base64 encoded bytes>"\n}\n')),(0,a.yg)("p",null,"Here is an example of a correctly populated ",(0,a.yg)("inlineCode",{parentName:"p"},"non_critical_extension_options")," on a ",(0,a.yg)("inlineCode",{parentName:"p"},"bank.MsgSend")," transaction:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{\n "body": {\n "messages": [\n {\n "@type": "/cosmos.bank.v1beta1.MsgSend",\n "from_address": "cosmos1ehpqg9sj09037uhe56sqktk30asn47asthyr22",\n "to_address": "cosmos1ehpqg9sj09037uhe56sqktk30asn47asthyr22",\n "amount": [\n {\n "denom": "uatom",\n "amount": "100"\n }\n ]\n }\n ],\n "memo": "memo_smaller_than_512_bytes",\n "timeout_height": "0",\n "extension_options": [],\n "non_critical_extension_options": [\n {\n "@type": "/gaia.metaprotocols.ExtensionData",\n "protocol_id": "some-protocol",\n "protocol_version": "1",\n "data": "<base64 encoded bytes>"\n }\n ]\n },\n "auth_info": {\n "signer_infos": [],\n "fee": {\n "amount": [],\n "gas_limit": "200000",\n "payer": "",\n "granter": ""\n },\n "tip": null\n },\n "signatures": []\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a2135033.5ee0f453.js b/assets/js/a2135033.5ee0f453.js new file mode 100644 index 00000000000..cdee5f77459 --- /dev/null +++ b/assets/js/a2135033.5ee0f453.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[4163],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>f});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(r),d=a,f=u["".concat(c,".").concat(d)]||u[d]||g[d]||i;return r?n.createElement(f,o(o({ref:t},p),{},{components:r})):n.createElement(f,o({ref:t},p))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:a,o[1]=l;for(var s=2;s<i;s++)o[s]=r[s];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},4279:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>g,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=r(8168),a=(r(6540),r(5680));const i={title:"Getting Started",order:null},o=void 0,l={unversionedId:"getting-started/README",id:"getting-started/README",title:"Getting Started",description:"This folder contains tutorials related to the gaia application.",source:"@site/docs/getting-started/README.md",sourceDirName:"getting-started",slug:"/getting-started/",permalink:"/main/getting-started/",draft:!1,tags:[],version:"current",frontMatter:{title:"Getting Started",order:null},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/main/"},next:{title:"What is Gaia?",permalink:"/main/getting-started/what-is-gaia"}},c={},s=[],p={toc:s},u="wrapper";function g(e){let{components:t,...r}=e;return(0,a.yg)(u,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("p",null,"This folder contains tutorials related to the ",(0,a.yg)("inlineCode",{parentName:"p"},"gaia")," application."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/getting-started/what-is-gaia"},"What is Gaia?")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/getting-started/installation"},"Installing ",(0,a.yg)("inlineCode",{parentName:"a"},"gaiad"))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/getting-started/quickstart"},"Joining Mainnet"))))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a56f5018.9552f7c6.js b/assets/js/a56f5018.9552f7c6.js new file mode 100644 index 00000000000..0a646d81526 --- /dev/null +++ b/assets/js/a56f5018.9552f7c6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[7669],{5680:(e,o,a)=>{a.d(o,{xA:()=>c,yg:()=>h});var t=a(6540);function n(e,o,a){return o in e?Object.defineProperty(e,o,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[o]=a,e}function r(e,o){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);o&&(t=t.filter((function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable}))),a.push.apply(a,t)}return a}function s(e){for(var o=1;o<arguments.length;o++){var a=null!=arguments[o]?arguments[o]:{};o%2?r(Object(a),!0).forEach((function(o){n(e,o,a[o])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(o){Object.defineProperty(e,o,Object.getOwnPropertyDescriptor(a,o))}))}return e}function i(e,o){if(null==e)return{};var a,t,n=function(e,o){if(null==e)return{};var a,t,n={},r=Object.keys(e);for(t=0;t<r.length;t++)a=r[t],o.indexOf(a)>=0||(n[a]=e[a]);return n}(e,o);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(t=0;t<r.length;t++)a=r[t],o.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=t.createContext({}),l=function(e){var o=t.useContext(p),a=o;return e&&(a="function"==typeof e?e(o):s(s({},o),e)),a},c=function(e){var o=l(e.components);return t.createElement(p.Provider,{value:o},e.children)},u="mdxType",g={inlineCode:"code",wrapper:function(e){var o=e.children;return t.createElement(t.Fragment,{},o)}},m=t.forwardRef((function(e,o){var a=e.components,n=e.mdxType,r=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=l(a),m=n,h=u["".concat(p,".").concat(m)]||u[m]||g[m]||r;return a?t.createElement(h,s(s({ref:o},c),{},{components:a})):t.createElement(h,s({ref:o},c))}));function h(e,o){var a=arguments,n=o&&o.mdxType;if("string"==typeof e||n){var r=a.length,s=new Array(r);s[0]=m;var i={};for(var p in o)hasOwnProperty.call(o,p)&&(i[p]=o[p]);i.originalType=e,i[u]="string"==typeof e?e:n,s[1]=i;for(var l=2;l<r;l++)s[l]=a[l];return t.createElement.apply(null,s)}return t.createElement.apply(null,a)}m.displayName="MDXCreateElement"},1545:(e,o,a)=>{a.r(o),a.d(o,{assets:()=>p,contentTitle:()=>s,default:()=>g,frontMatter:()=>r,metadata:()=>i,toc:()=>l});var t=a(8168),n=(a(6540),a(5680));const r={order:2,parent:{order:1}},s="Text (Signaling)",i={unversionedId:"governance/proposal-types/text-prop",id:"governance/proposal-types/text-prop",title:"Text (Signaling)",description:"What are signaling proposals currently used for?",source:"@site/docs/governance/proposal-types/text-prop.md",sourceDirName:"governance/proposal-types",slug:"/governance/proposal-types/text-prop",permalink:"/main/governance/proposal-types/text-prop",draft:!1,tags:[],version:"current",frontMatter:{order:2,parent:{order:1}},sidebar:"tutorialSidebar",previous:{title:"Software Upgrade",permalink:"/main/governance/proposal-types/software-upgrade"},next:{title:"Off-Chain Proposal Process",permalink:"/main/governance/best-practices"}},p={},l=[{value:"What are signaling proposals currently used for?",id:"what-are-signaling-proposals-currently-used-for",level:2},{value:"A note on historical text proposals",id:"a-note-on-historical-text-proposals",level:3},{value:"Why make a signaling proposal?",id:"why-make-a-signaling-proposal",level:2},{value:"What happens when a signaling proposal passes?",id:"what-happens-when-a-signaling-proposal-passes",level:2},{value:"Submitting a text proposal",id:"submitting-a-text-proposal",level:2}],c={toc:l},u="wrapper";function g(e){let{components:o,...a}=e;return(0,n.yg)(u,(0,t.A)({},c,a,{components:o,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"text-signaling"},"Text (Signaling)"),(0,n.yg)("h2",{id:"what-are-signaling-proposals-currently-used-for"},"What are signaling proposals currently used for?"),(0,n.yg)("p",null,"Signaling proposals are used to make an on-chain record of support or agreement on a certain topic or ideas. Text proposals do not contain any code. That is, they do not directly cause any changes to the Hub once passed."),(0,n.yg)("p",null,"Past signalling proposals have been used for a variety of reasons:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"Agreement to adopt (or not adopt) a feature in a future release (",(0,n.yg)("a",{parentName:"li",href:"https://www.mintscan.io/cosmos/proposals/7"},"7"),", ",(0,n.yg)("a",{parentName:"li",href:"https://www.mintscan.io/cosmos/proposals/31"},"31"),", ",(0,n.yg)("a",{parentName:"li",href:"https://www.mintscan.io/cosmos/proposals/38"},"38"),", ",(0,n.yg)("a",{parentName:"li",href:"https://www.mintscan.io/cosmos/proposals/49"},"49"),", ",(0,n.yg)("a",{parentName:"li",href:"https://www.mintscan.io/cosmos/proposals/69"},"69"),")"),(0,n.yg)("li",{parentName:"ul"},"A high-signal alert to validators (",(0,n.yg)("a",{parentName:"li",href:"https://www.mintscan.io/cosmos/proposals/8"},"8"),")"),(0,n.yg)("li",{parentName:"ul"},"On-chain record of community opinion (",(0,n.yg)("a",{parentName:"li",href:"https://www.mintscan.io/cosmos/proposals/12"},"12"),")"),(0,n.yg)("li",{parentName:"ul"},"Ratification of a social norm (",(0,n.yg)("a",{parentName:"li",href:"https://www.mintscan.io/cosmos/proposals/75"},"75"),")")),(0,n.yg)("h3",{id:"a-note-on-historical-text-proposals"},"A note on historical text proposals"),(0,n.yg)("p",null,"In the early days of the Cosmos Hub, 'text' was the only proposal type. If you read old proposals, you will find 'text' proposals being used for things we use other proposal types now, such as changing a parameter (",(0,n.yg)("a",{parentName:"p",href:"https://www.mintscan.io/cosmos/proposals/10"},"10"),") or upgrading the software (",(0,n.yg)("a",{parentName:"p",href:"https://www.mintscan.io/cosmos/proposals/19"},"19"),")."),(0,n.yg)("p",null,"The process for these historical proposals was that an on-chain signal was used to give permission for development or changes to be made off-chain and included in the Cosmos Hub code. With the addition of new proposal types, these development or spending choices can now be executed by the Gaia code immediately after the vote is tallied."),(0,n.yg)("h2",{id:"why-make-a-signaling-proposal"},"Why make a signaling proposal?"),(0,n.yg)("p",null,"Signaling proposals are a great way to take an official, public poll of community sentiment before investing more resources into a project. The most common way for text proposals to be used is to confirm that the community is actually interested in what the proposer wants to develop, without asking for money to fund development that might not be concrete enough to have a budget yet. "),(0,n.yg)("p",null,"Because the results of signaling proposals remain on-chain and are easily accessible to anyone, they are also a good way to formalize community opinions. Information contained in documentation or Github repos can be hard to find for new community members but signaling proposals in a block explorer or wallet is very accessible. "),(0,n.yg)("p",null,"You might make a signaling proposal to gather opinions for work you want to do for the Hub, or because you think it's important to have a record of some perspective held by the community at large. "),(0,n.yg)("h2",{id:"what-happens-when-a-signaling-proposal-passes"},"What happens when a signaling proposal passes?"),(0,n.yg)("p",null,"Technically, nothing happens on-chain. No code executes, and this 'unenforceable' property of text proposals is one of the biggest criticisms of the format. Regardless of whether the results of a signaling proposal are enforced by code, there can still be value from having a proposal on-chain and subject to discussion. Whether a proposal passes or fails, we all get information from it having been considered."),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"The community might have had a thorough, thoughtful discussion about a topic that they otherwise wouldn't have had."),(0,n.yg)("li",{parentName:"ul"},"A dev team interested in a feature might have a better idea of how their work will be received by the community."),(0,n.yg)("li",{parentName:"ul"},"The community might be more informed about a topic than they previously were."),(0,n.yg)("li",{parentName:"ul"},"The community might feel confident that we are aligned on a particular definition or social norm. ")),(0,n.yg)("h2",{id:"submitting-a-text-proposal"},"Submitting a text proposal"),(0,n.yg)("p",null,"Follow the instructions below to create a text proposal and submit it to the blockchain."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-sh"},"\u279c gaiad tx gov draft-proposal\n\nUse the arrow keys to navigate: \u2193 \u2191 \u2192 \u2190\n? Select proposal type:\n \u25b8 text # choose this\n community-pool-spend\n software-upgrade\n cancel-software-upgrade\n other\n")),(0,n.yg)("p",null,"Choose ",(0,n.yg)("inlineCode",{parentName:"p"},"text")," from the ",(0,n.yg)("inlineCode",{parentName:"p"},"draft-proposal")," menu and populate all the available fields."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-sh"},"\u2714 text\nEnter proposal title: Title\nEnter proposal authors: Author\nEnter proposal summary: Proposal summary\nEnter proposal details: Details, all the details\nEnter proposal proposal forum url: /\nEnter proposal vote option context: Vote yes if <...>\nEnter proposal deposit: 100001uatom\n")),(0,n.yg)("p",null,"Check ",(0,n.yg)("inlineCode",{parentName:"p"},"draft_proposal.json"),", your result should be similar to this:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-json"},'{\n "metadata": "ipfs://CID",\n "deposit": "100001uatom",\n "title": "Title",\n "summary": "Proposal summary"\n}\n')),(0,n.yg)("p",null,"Upload your ",(0,n.yg)("inlineCode",{parentName:"p"},"draft_metadata.json")," to a distribution platform of your choice. ",(0,n.yg)("inlineCode",{parentName:"p"},"draft_proposal.json")," is used to submit a governance proposal using ",(0,n.yg)("inlineCode",{parentName:"p"},"submit-proposal"),"."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-sh"},"gaiad tx gov submit-proposal <path_to_proposal.json>\n --from <submitter address> \\\n --chain-id cosmoshub-4 \\\n --gas <max gas allocated> \\\n --fees <fees allocated> \\\n --node <node address> \\\n")),(0,n.yg)("p",null,"Additional instructions with debugging information is available on the ",(0,n.yg)("a",{parentName:"p",href:"/main/governance/submitting"},"submitting")," page."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b6d5a092.f0ffe981.js b/assets/js/b6d5a092.f0ffe981.js new file mode 100644 index 00000000000..18f67363cb9 --- /dev/null +++ b/assets/js/b6d5a092.f0ffe981.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[960],{5680:(e,n,t)=>{t.d(n,{xA:()=>p,yg:()=>d});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?i(Object(t),!0).forEach((function(n){r(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function s(e,n){if(null==e)return{};var t,a,r=function(e,n){if(null==e)return{};var t,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)t=i[a],n.indexOf(t)>=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)t=i[a],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var l=a.createContext({}),c=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},p=function(e){var n=c(e.components);return a.createElement(l.Provider,{value:n},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},y=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(t),y=r,d=u["".concat(l,".").concat(y)]||u[y]||m[y]||i;return t?a.createElement(d,o(o({ref:n},p),{},{components:t})):a.createElement(d,o({ref:n},p))}));function d(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,o=new Array(i);o[0]=y;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[u]="string"==typeof e?e:r,o[1]=s;for(var c=2;c<i;c++)o[c]=t[c];return a.createElement.apply(null,o)}return a.createElement.apply(null,t)}y.displayName="MDXCreateElement"},2969:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var a=t(8168),r=(t(6540),t(5680));const i={title:"HD Wallets",order:2},o=void 0,s={unversionedId:"resources/hd-wallets",id:"resources/hd-wallets",title:"HD Wallets",description:"Accounts in Cosmos are Hierarchical Deterministic (HD) Wallets. Originally specified in Bitcoin's BIP32, HD wallets are a special kind of wallet that let users derive any number of accounts from a single seed. To understand what that means, let us first define some terminology:",source:"@site/docs/resources/hd-wallets.md",sourceDirName:"resources",slug:"/resources/hd-wallets",permalink:"/main/resources/hd-wallets",draft:!1,tags:[],version:"current",frontMatter:{title:"HD Wallets",order:2},sidebar:"tutorialSidebar",previous:{title:"The Genesis File",permalink:"/main/resources/genesis"},next:{title:"Ledger Nano Support",permalink:"/main/resources/ledger"}},l={},c=[],p={toc:c},u="wrapper";function m(e){let{components:n,...t}=e;return(0,r.yg)(u,(0,a.A)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("p",null,"Accounts in Cosmos are Hierarchical Deterministic (HD) Wallets. Originally specified in Bitcoin's ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki"},"BIP32"),", HD wallets are a special kind of wallet that let users derive any number of accounts from a single seed. To understand what that means, let us first define some terminology:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"Wallet"),": Set of accounts obtained from a given seed."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"Account"),": A pair of public key/private key."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"Private Key"),": A private key is a secret piece of information used to sign messages. In the blockchain context, a private key identifies the owner of an account. The private key of a user should never be revealed to others."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"Public Key"),": A public key is a piece of information obtained by applying a one-way mathematical function on a private key. From it, an address can be derived. A private key cannot be found from a public key."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"Address"),": An address is a public string with a human-readable prefix that identifies an account. It is obtained by applying mathematical transformations to a public key."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"Digital Signature"),": A digital signature is a piece of cryptographic information that proves the owner of a given private key approved of a given message without revealing the private key."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"Seed"),": Same as Mnemonic."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"Mnemonic"),": A mnemonic is a sequence of words that is used as seed to derive private keys. The mnemonic is at the core of each wallet. NEVER LOSE YOUR MNEMONIC. WRITE IT DOWN ON A PIECE OF PAPER AND STORE IT SOMEWHERE SAFE. IF YOU LOSE IT, THERE IS NO WAY TO RETRIEVE IT. IF SOMEONE GAINS ACCESS TO IT, THEY GAIN ACCESS TO ALL THE ASSOCIATED ACCOUNTS.")),(0,r.yg)("p",null,"At the core of a HD wallet, there is a seed. From this seed, users can deterministically generate accounts. To generate an account from a seed, one-way mathematical transformations are applied. To decide which account to generate, the user specifies a ",(0,r.yg)("inlineCode",{parentName:"p"},"path"),", generally an ",(0,r.yg)("inlineCode",{parentName:"p"},"integer")," (",(0,r.yg)("inlineCode",{parentName:"p"},"0"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"1"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"2"),", ...)."),(0,r.yg)("p",null,"By specifying ",(0,r.yg)("inlineCode",{parentName:"p"},"path")," to be ",(0,r.yg)("inlineCode",{parentName:"p"},"0")," for example, the Wallet will generate ",(0,r.yg)("inlineCode",{parentName:"p"},"Private Key 0")," from the seed. Then, ",(0,r.yg)("inlineCode",{parentName:"p"},"Public Key 0")," can be generated from ",(0,r.yg)("inlineCode",{parentName:"p"},"Private Key 0"),". Finally, ",(0,r.yg)("inlineCode",{parentName:"p"},"Address 0")," can be generated from ",(0,r.yg)("inlineCode",{parentName:"p"},"Public Key 0"),". All these steps are one way only, meaning the ",(0,r.yg)("inlineCode",{parentName:"p"},"Public Key")," cannot be found from the ",(0,r.yg)("inlineCode",{parentName:"p"},"Address"),", the ",(0,r.yg)("inlineCode",{parentName:"p"},"Private Key")," cannot be found from the ",(0,r.yg)("inlineCode",{parentName:"p"},"Public Key"),", ..."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"}," Account 0 Account 1 Account 2\n\n+------------------+ +------------------+ +------------------+\n| | | | | |\n| Address 0 | | Address 1 | | Address 2 |\n| ^ | | ^ | | ^ |\n| | | | | | | | |\n| | | | | | | | |\n| | | | | | | | |\n| + | | + | | + |\n| Public key 0 | | Public key 1 | | Public key 2 |\n| ^ | | ^ | | ^ |\n| | | | | | | | |\n| | | | | | | | |\n| | | | | | | | |\n| + | | + | | + |\n| Private key 0 | | Private key 1 | | Private key 2 |\n| ^ | | ^ | | ^ |\n+------------------+ +------------------+ +------------------+\n | | |\n | | |\n | | |\n +--------------------------------------------------------------------+\n |\n |\n +---------+---------+\n | |\n | Mnemonic (Seed) |\n | |\n +-------------------+\n")),(0,r.yg)("p",null,"The process of derivating accounts from the seed is deterministic. This means that given the same path, the derived private key will always be the same."),(0,r.yg)("p",null,"The funds stored in an account are controlled by the private key. This private key is generated using a one-way function from the mnemonic. If you lose the private key, you can retrieve it using the mnemonic. However, if you lose the mnemonic, you will lose access to all the derived private keys. Likewise, if someone gains access to your mnemonic, they gain access to all the associated accounts."),(0,r.yg)("admonition",{type:"danger"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Do not lose or share your 24 words with anyone. To prevent theft or loss of funds, it is best to keep multiple copies of your mnemonic stored in safe, secure places. If someone is able to gain access to your mnemonic, they will fully control the accounts associated with them."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b78d3fc1.fbebe30c.js b/assets/js/b78d3fc1.fbebe30c.js new file mode 100644 index 00000000000..43f758deae7 --- /dev/null +++ b/assets/js/b78d3fc1.fbebe30c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[4165],{5680:(e,n,a)=>{a.d(n,{xA:()=>g,yg:()=>c});var t=a(6540);function o(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function r(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,t)}return a}function i(e){for(var n=1;n<arguments.length;n++){var a=null!=arguments[n]?arguments[n]:{};n%2?r(Object(a),!0).forEach((function(n){o(e,n,a[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(a,n))}))}return e}function s(e,n){if(null==e)return{};var a,t,o=function(e,n){if(null==e)return{};var a,t,o={},r=Object.keys(e);for(t=0;t<r.length;t++)a=r[t],n.indexOf(a)>=0||(o[a]=e[a]);return o}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(t=0;t<r.length;t++)a=r[t],n.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var l=t.createContext({}),d=function(e){var n=t.useContext(l),a=n;return e&&(a="function"==typeof e?e(n):i(i({},n),e)),a},g=function(e){var n=d(e.components);return t.createElement(l.Provider,{value:n},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},m=t.forwardRef((function(e,n){var a=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,g=s(e,["components","mdxType","originalType","parentName"]),u=d(a),m=o,c=u["".concat(l,".").concat(m)]||u[m]||p[m]||r;return a?t.createElement(c,i(i({ref:n},g),{},{components:a})):t.createElement(c,i({ref:n},g))}));function c(e,n){var a=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var r=a.length,i=new Array(r);i[0]=m;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var d=2;d<r;d++)i[d]=a[d];return t.createElement.apply(null,i)}return t.createElement.apply(null,a)}m.displayName="MDXCreateElement"},2406:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var t=a(8168),o=(a(6540),a(5680));const r={title:"Delegator Guide (CLI)",order:2},i=void 0,s={unversionedId:"delegators/delegator-guide-cli",id:"delegators/delegator-guide-cli",title:"Delegator Guide (CLI)",description:"This document contains all the necessary information for delegators to interact with the Cosmos Hub through the Command-Line Interface (CLI).",source:"@site/docs/delegators/delegator-guide-cli.md",sourceDirName:"delegators",slug:"/delegators/delegator-guide-cli",permalink:"/main/delegators/delegator-guide-cli",draft:!1,tags:[],version:"current",frontMatter:{title:"Delegator Guide (CLI)",order:2},sidebar:"tutorialSidebar",previous:{title:"Delegator FAQ",permalink:"/main/delegators/delegator-faq"},next:{title:"Delegator Security",permalink:"/main/delegators/delegator-security"}},l={},d=[{value:"Table of Contents",id:"table-of-contents",level:2},{value:"Installing <code>gaiad</code>",id:"installing-gaiad",level:2},{value:"Cosmos Accounts",id:"cosmos-accounts",level:2},{value:"Restoring an Account from the Fundraiser",id:"restoring-an-account-from-the-fundraiser",level:3},{value:"On a Ledger Device",id:"on-a-ledger-device",level:4},{value:"On a Computer",id:"on-a-computer",level:4},{value:"Creating an Account",id:"creating-an-account",level:3},{value:"Using a Ledger Device",id:"using-a-ledger-device",level:4},{value:"Using a Computer",id:"using-a-computer",level:4},{value:"Accessing the Cosmos Hub Network",id:"accessing-the-cosmos-hub-network",level:2},{value:"Running Your Own Full-Node",id:"running-your-own-full-node",level:3},{value:"Connecting to a Remote Full-Node",id:"connecting-to-a-remote-full-node",level:3},{value:"Setting Up <code>gaiad</code>",id:"setting-up-gaiad",level:2},{value:"Querying the State",id:"querying-the-state",level:2},{value:"Sending Transactions",id:"sending-transactions",level:2},{value:"A Note on Gas and Fees",id:"a-note-on-gas-and-fees",level:3},{value:"Sending Tokens",id:"sending-tokens",level:3},{value:"Bonding Atoms and Withdrawing Rewards",id:"bonding-atoms-and-withdrawing-rewards",level:3},{value:"Participating in Governance",id:"participating-in-governance",level:2},{value:"Primer on Governance",id:"primer-on-governance",level:3},{value:"In Practice",id:"in-practice",level:3},{value:"Signing Transactions From an Offline Computer",id:"signing-transactions-from-an-offline-computer",level:3}],g={toc:d},u="wrapper";function p(e){let{components:n,...a}=e;return(0,o.yg)(u,(0,t.A)({},g,a,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("p",null,"This document contains all the necessary information for delegators to interact with the Cosmos Hub through the Command-Line Interface (CLI)."),(0,o.yg)("p",null,"It also contains instructions on how to manage accounts, restore accounts from the fundraiser and use a ledger nano device."),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"Very Important"),": Please assure that you follow the steps described hereinafter\ncarefully, as negligence in this significant process could lead to an indefinite\nloss of your Atoms. Therefore, read through the following instructions in their\nentirety prior to proceeding and reach out to us in case you need support."),(0,o.yg)("p",{parentName:"admonition"},"Please also note that you are about to interact with the Cosmos Hub, a\nblockchain technology containing highly experimental software. While the\nblockchain has been developed in accordance to the state of the art and audited\nwith utmost care, we can nevertheless expect to have issues, updates and bugs.\nFurthermore, interaction with blockchain technology requires\nadvanced technical skills and always entails risks that are outside our control.\nBy using the software, you confirm that you understand the inherent risks\nassociated with cryptographic software (see also risk section of the\n",(0,o.yg)("a",{parentName:"p",href:"https://github.com/cosmos/cosmos/blob/master/fundraiser/Interchain%20Cosmos%20Contribution%20Terms%20-%20FINAL.pdf"},"Interchain Cosmos Contribution terms"),') and that the Interchain Foundation and/or\nthe Tendermint Team may not be held liable for potential damages arising out of the use of the\nsoftware. Any use of this open source software released under the Apache 2.0 license is\ndone at your own risk and on a "AS IS" basis, without warranties or conditions\nof any kind.')),(0,o.yg)("p",null,"Please exercise extreme caution!"),(0,o.yg)("h2",{id:"table-of-contents"},"Table of Contents"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#table-of-contents"},"Table of Contents")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#installing-gaiad"},"Installing ",(0,o.yg)("inlineCode",{parentName:"a"},"gaiad"))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#cosmos-accounts"},"Cosmos Accounts"),(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#restoring-an-account-from-the-fundraiser"},"Restoring an Account from the Fundraiser"),(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#on-a-ledger-device"},"On a Ledger Device")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#on-a-computer"},"On a Computer")))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#creating-an-account"},"Creating an Account"),(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#using-a-ledger-device"},"Using a Ledger Device")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#using-a-computer"},"Using a Computer")))))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#accessing-the-cosmos-hub-network"},"Accessing the Cosmos Hub Network"),(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#running-your-own-full-node"},"Running Your Own Full-Node")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#connecting-to-a-remote-full-node"},"Connecting to a Remote Full-Node")))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#setting-up-gaiad"},"Setting Up ",(0,o.yg)("inlineCode",{parentName:"a"},"gaiad"))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#querying-the-state"},"Querying the State")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#sending-transactions"},"Sending Transactions"),(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#a-note-on-gas-and-fees"},"A Note on Gas and Fees")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#sending-tokens"},"Sending Tokens")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#bonding-atoms-and-withdrawing-rewards"},"Bonding Atoms and Withdrawing Rewards")))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#participating-in-governance"},"Participating in Governance"),(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#primer-on-governance"},"Primer on Governance")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#in-practice"},"In Practice")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"#signing-transactions-from-an-offline-computer"},"Signing Transactions From an Offline Computer"))))),(0,o.yg)("h2",{id:"installing-gaiad"},"Installing ",(0,o.yg)("inlineCode",{parentName:"h2"},"gaiad")),(0,o.yg)("p",null,(0,o.yg)("inlineCode",{parentName:"p"},"gaiad"),": This is the command-line interface to interact with a ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," full-node."),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"Please check that you download the latest stable release of ",(0,o.yg)("inlineCode",{parentName:"strong"},"gaiad")," that is available"))),(0,o.yg)("p",null,"[",(0,o.yg)("strong",{parentName:"p"},"Download the binaries"),"]","\nNot available yet."),(0,o.yg)("p",null,(0,o.yg)("a",{parentName:"p",href:"../getting-started/installation"},(0,o.yg)("strong",{parentName:"a"},"Install from source"))),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," is used from a terminal. To open the terminal, follow these steps:"),(0,o.yg)("ul",{parentName:"admonition"},(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("strong",{parentName:"li"},"Windows"),": ",(0,o.yg)("inlineCode",{parentName:"li"},"Start")," > ",(0,o.yg)("inlineCode",{parentName:"li"},"All Programs")," > ",(0,o.yg)("inlineCode",{parentName:"li"},"Accessories")," > ",(0,o.yg)("inlineCode",{parentName:"li"},"Command Prompt")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("strong",{parentName:"li"},"MacOS"),": ",(0,o.yg)("inlineCode",{parentName:"li"},"Finder")," > ",(0,o.yg)("inlineCode",{parentName:"li"},"Applications")," > ",(0,o.yg)("inlineCode",{parentName:"li"},"Utilities")," > ",(0,o.yg)("inlineCode",{parentName:"li"},"Terminal")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("strong",{parentName:"li"},"Linux"),": ",(0,o.yg)("inlineCode",{parentName:"li"},"Ctrl")," + ",(0,o.yg)("inlineCode",{parentName:"li"},"Alt")," + ",(0,o.yg)("inlineCode",{parentName:"li"},"T")))),(0,o.yg)("h2",{id:"cosmos-accounts"},"Cosmos Accounts"),(0,o.yg)("p",null,"At the core of every Cosmos account, there is a seed, which takes the form of a 12 or 24-words mnemonic. From this mnemonic, it is possible to create any number of Cosmos accounts, i.e. pairs of private key/public key. This is called an HD wallet (see ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki"},"BIP32")," for more information on the HD wallet specification)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-txt"}," Account 0 Account 1 Account 2\n\n+------------------+ +------------------+ +------------------+\n| | | | | |\n| Address 0 | | Address 1 | | Address 2 |\n| ^ | | ^ | | ^ |\n| | | | | | | | |\n| | | | | | | | |\n| | | | | | | | |\n| + | | + | | + |\n| Public key 0 | | Public key 1 | | Public key 2 |\n| ^ | | ^ | | ^ |\n| | | | | | | | |\n| | | | | | | | |\n| | | | | | | | |\n| + | | + | | + |\n| Private key 0 | | Private key 1 | | Private key 2 |\n| ^ | | ^ | | ^ |\n+------------------+ +------------------+ +------------------+\n | | |\n | | |\n | | |\n +--------------------------------------------------------------------+\n |\n |\n +---------+---------+\n | |\n | Mnemonic (Seed) |\n | |\n +-------------------+\n")),(0,o.yg)("p",null,"The funds stored in an account are controlled by the private key. This private key is generated using a one-way function from the mnemonic. If you lose the private key, you can retrieve it using the mnemonic. However, if you lose the mnemonic, you will lose access to all the derived private keys. Likewise, if someone gains access to your mnemonic, they gain access to all the associated accounts."),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"Do not lose or share your 12 words with anyone. To prevent theft or loss of funds, it is best to ensure that you keep multiple copies of your mnemonic, and store it in a safe, secure place and that only you know how to access. If someone is able to gain access to your mnemonic, they will be able to gain access to your private keys and control the accounts associated with them."))),(0,o.yg)("p",null,"The address is a public string with a human-readable prefix (e.g. ",(0,o.yg)("inlineCode",{parentName:"p"},"cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg"),") that identifies your account. When someone wants to send you funds, they send it to your address. It is computationally infeasible to find the private key associated with a given address."),(0,o.yg)("h3",{id:"restoring-an-account-from-the-fundraiser"},"Restoring an Account from the Fundraiser"),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("em",{parentName:"p"},"NOTE: This section only concerns fundraiser participants"))),(0,o.yg)("p",null,"If you participated in the fundraiser, you should be in possession of a 12-words mnemonic. Newly generated mnemonics use 24 words, but 12-word mnemonics are also compatible with all the Cosmos tools."),(0,o.yg)("h4",{id:"on-a-ledger-device"},"On a Ledger Device"),(0,o.yg)("p",null,"At the core of a ledger device, there is a mnemonic used to generate accounts on multiple blockchains (including the Cosmos Hub). Usually, you will create a new mnemonic when you initialize your ledger device. However, it is possible to tell the ledger device to use a mnemonic provided by the user instead. Let us go ahead and see how you can input the mnemonic you obtained during the fundraiser as the seed of your ledger device."),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},"*NOTE: To do this, ",(0,o.yg)("strong",{parentName:"p"},"it is preferable to use a brand new ledger device."),". Indeed, there can be only one mnemonic per ledger device. If, however, you want to use a ledger that is already initialized with a seed, you can reset it by going in ",(0,o.yg)("inlineCode",{parentName:"p"},"Settings"),">",(0,o.yg)("inlineCode",{parentName:"p"},"Device"),">",(0,o.yg)("inlineCode",{parentName:"p"},"Reset All"),". ",(0,o.yg)("strong",{parentName:"p"},"Please note that this will wipe out the seed currently stored on the device. If you have not properly secured the associated mnemonic, you could lose your funds!!!*"))),(0,o.yg)("p",null,"The following steps need to be performed on an un-initialized ledger device:"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"Connect your ledger device to the computer via USB"),(0,o.yg)("li",{parentName:"ol"},"Press both buttons"),(0,o.yg)("li",{parentName:"ol"},"Do ",(0,o.yg)("strong",{parentName:"li"},"NOT"),' choose the "Config as a new device" option. Instead, choose "Restore Configuration"'),(0,o.yg)("li",{parentName:"ol"},"Choose a PIN"),(0,o.yg)("li",{parentName:"ol"},"Choose the 12 words option"),(0,o.yg)("li",{parentName:"ol"},"Input each of the words you got during the fundraiser, in the correct order.")),(0,o.yg)("p",null,"Your ledger is now correctly set up with your fundraiser mnemonic! Do not lose this mnemonic! If your ledger is compromised, you can always restore a new device again using the same mnemonic."),(0,o.yg)("p",null,"Next, click ",(0,o.yg)("a",{parentName:"p",href:"#using-a-ledger-device"},"here")," to learn how to generate an account."),(0,o.yg)("h4",{id:"on-a-computer"},"On a Computer"),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"NOTE: It is more secure to perform this action on an offline computer"))),(0,o.yg)("p",null,"To restore an account using a fundraiser mnemonic and store the associated encrypted private key on a computer, use the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys add <yourKeyName> --recover\n")),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"<yourKeyName>")," is the name of the account. It is a reference to the account number used to derive the key pair from the mnemonic. You will use this name to identify your account when you want to send a transaction."),(0,o.yg)("li",{parentName:"ul"},"You can add the optional ",(0,o.yg)("inlineCode",{parentName:"li"},"--account")," flag to specify the path (",(0,o.yg)("inlineCode",{parentName:"li"},"0"),", ",(0,o.yg)("inlineCode",{parentName:"li"},"1"),", ",(0,o.yg)("inlineCode",{parentName:"li"},"2"),", ...) you want to use to generate your account. By default, account ",(0,o.yg)("inlineCode",{parentName:"li"},"0")," is generated.")),(0,o.yg)("p",null,"The private key of account ",(0,o.yg)("inlineCode",{parentName:"p"},"0")," will be saved in your operating system's credentials storage.\nEach time you want to send a transaction, you will need to unlock your system's credentials store.\nIf you lose access to your credentials storage, you can always recover the private key with the\nmnemonic."),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"You may not be prompted for password each time you send a transaction since most operating systems\nunlock user's credentials store upon login by default. If you want to change your credentials\nstore security policies please refer to your operating system manual."))),(0,o.yg)("h3",{id:"creating-an-account"},"Creating an Account"),(0,o.yg)("p",null,"To create an account, you just need to have ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," installed. Before creating it, you need to know where you intend to store and interact with your private keys. The best options are to store them in an offline dedicated computer or a ledger device. Storing them on your regular online computer involves more risk, since anyone who infiltrates your computer through the internet could exfiltrate your private keys and steal your funds."),(0,o.yg)("h4",{id:"using-a-ledger-device"},"Using a Ledger Device"),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"Only use Ledger devices that you bought factory new or trust fully"))),(0,o.yg)("p",null,"When you initialize your ledger, a 24-word mnemonic is generated and stored in the device. This mnemonic is compatible with Cosmos and Cosmos accounts can be derived from it. Therefore, all you have to do is make your ledger compatible with ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad"),". To do so, you need to go through the following steps:"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"Download the Ledger Live app ",(0,o.yg)("a",{parentName:"li",href:"https://www.ledger.com/ledger-live"},"here"),"."),(0,o.yg)("li",{parentName:"ol"},"Connect your ledger via USB and update to the latest firmware"),(0,o.yg)("li",{parentName:"ol"},'Go to the ledger live app store, and download the "Cosmos" application (this can take a while). ',(0,o.yg)("strong",{parentName:"li"},"Note: You may have to enable ",(0,o.yg)("inlineCode",{parentName:"strong"},"Dev Mode")," in the ",(0,o.yg)("inlineCode",{parentName:"strong"},"Settings"),' of Ledger Live to be able to download the "Cosmos" application'),"."),(0,o.yg)("li",{parentName:"ol"},"Navigate to the Cosmos app on your ledger device")),(0,o.yg)("p",null,"Then, to create an account, use the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys add <yourAccountName> --ledger\n")),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"This command will only work while the Ledger is plugged in and unlocked"))),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"<yourKeyName>")," is the name of the account. It is a reference to the account number used to derive the key pair from the mnemonic. You will use this name to identify your account when you want to send a transaction."),(0,o.yg)("li",{parentName:"ul"},"You can add the optional ",(0,o.yg)("inlineCode",{parentName:"li"},"--account")," flag to specify the path (",(0,o.yg)("inlineCode",{parentName:"li"},"0"),", ",(0,o.yg)("inlineCode",{parentName:"li"},"1"),", ",(0,o.yg)("inlineCode",{parentName:"li"},"2"),", ...) you want to use to generate your account. By default, account ",(0,o.yg)("inlineCode",{parentName:"li"},"0")," is generated.")),(0,o.yg)("h4",{id:"using-a-computer"},"Using a Computer"),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"NOTE: It is more secure to perform this action on an offline computer"))),(0,o.yg)("p",null,"To generate an account, just use the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys add <yourKeyName>\n")),(0,o.yg)("p",null,"The command will generate a 24-words mnemonic and save the private and public keys for account ",(0,o.yg)("inlineCode",{parentName:"p"},"0"),"\nat the same time.\nEach time you want to send a transaction, you will need to unlock your system's credentials store.\nIf you lose access to your credentials storage, you can always recover the private key with the\nmnemonic."),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"You may not be prompted for password each time you send a transaction since most operating systems\nunlock user's credentials store upon login by default. If you want to change your credentials\nstore security policies please refer to your operating system manual."))),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"Do not lose or share your 12 words with anyone. To prevent theft or loss of funds, it is best to ensure that you keep multiple copies of your mnemonic, and store it in a safe, secure place and that only you know how to access. If someone is able to gain access to your mnemonic, they will be able to gain access to your private keys and control the accounts associated with them."))),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},"After you have secured your mnemonic (triple check!), you can delete bash history to ensure no one can retrieve it:"),(0,o.yg)("pre",{parentName:"admonition"},(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"history -c\nrm ~/.bash_history\n"))),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"<yourKeyName>")," is the name of the account. It is a reference to the account number used to derive the key pair from the mnemonic. You will use this name to identify your account when you want to send a transaction."),(0,o.yg)("li",{parentName:"ul"},"You can add the optional ",(0,o.yg)("inlineCode",{parentName:"li"},"--account")," flag to specify the path (",(0,o.yg)("inlineCode",{parentName:"li"},"0"),", ",(0,o.yg)("inlineCode",{parentName:"li"},"1"),", ",(0,o.yg)("inlineCode",{parentName:"li"},"2"),", ...) you want to use to generate your account. By default, account ",(0,o.yg)("inlineCode",{parentName:"li"},"0")," is generated.")),(0,o.yg)("p",null,"You can generate more accounts from the same mnemonic using the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad keys add <yourKeyName> --recover --account 1\n")),(0,o.yg)("p",null,"This command will prompt you to input a passphrase as well as your mnemonic. Change the account number to generate a different account."),(0,o.yg)("h2",{id:"accessing-the-cosmos-hub-network"},"Accessing the Cosmos Hub Network"),(0,o.yg)("p",null,"In order to query the state and send transactions, you need a way to access the network. To do so, you can either run your own full-node, or connect to someone else's."),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},'NOTE: Do not share your mnemonic (12 or 24 words) with anyone. The only person who should ever need to know it is you. This is especially important if you are ever approached via email or direct message by someone requesting that you share your mnemonic for any kind of blockchain services or support. No one from Cosmos, the Tendermint team or the Interchain Foundation will ever send an email that asks for you to share any kind of account credentials or your mnemonic."'),".")),(0,o.yg)("h3",{id:"running-your-own-full-node"},"Running Your Own Full-Node"),(0,o.yg)("p",null,"This is the most secure option, but comes with relatively high resource requirements. In order to run your own full-node, you need good bandwidth and at least 1TB of disk space."),(0,o.yg)("p",null,"You will find the tutorial on how to install ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," ",(0,o.yg)("a",{parentName:"p",href:"../getting-started/installation"},"here"),", and the guide to run a full-node ",(0,o.yg)("a",{parentName:"p",href:"../hub-tutorials/join-mainnet"},"here"),"."),(0,o.yg)("h3",{id:"connecting-to-a-remote-full-node"},"Connecting to a Remote Full-Node"),(0,o.yg)("p",null,"If you do not want or cannot run your own node, you can connect to someone else's full-node. You should pick an operator you trust, because a malicious operator could return incorrect query results or censor your transactions. However, they will never be able to steal your funds, as your private keys are stored locally on your computer or ledger device. Possible options of full-node operators include validators, wallet providers or exchanges."),(0,o.yg)("p",null,"In order to connect to the full-node, you will need an address of the following form: ",(0,o.yg)("inlineCode",{parentName:"p"},"https://77.87.106.33:26657")," (",(0,o.yg)("em",{parentName:"p"},"Note: This is a placeholder"),"). This address has to be communicated by the full-node operator you choose to trust. You will use this address in the ",(0,o.yg)("a",{parentName:"p",href:"#setting-up-gaiad"},"following section"),"."),(0,o.yg)("h2",{id:"setting-up-gaiad"},"Setting Up ",(0,o.yg)("inlineCode",{parentName:"h2"},"gaiad")),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"Before setting up ",(0,o.yg)("inlineCode",{parentName:"strong"},"gaiad"),", make sure you have set up a way to ",(0,o.yg)("a",{parentName:"strong",href:"#accessing-the-cosmos-hub-network"},"access the Cosmos Hub network")))),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"Please check that you are always using the latest stable release of ",(0,o.yg)("inlineCode",{parentName:"strong"},"gaiad")))),(0,o.yg)("p",null,(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," is the tool that enables you to interact with the node that runs on the Cosmos Hub network, whether you run it yourself or not. Let us set it up properly."),(0,o.yg)("p",null,"In order to set up ",(0,o.yg)("inlineCode",{parentName:"p"},"gaiad"),", use the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad config <flag> <value>\n")),(0,o.yg)("p",null,"It allows you to set a default value for each given flag."),(0,o.yg)("p",null,"First, set up the address of the full-node you want to connect to:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad config node <host>:<port\n\n// example: gaiad config node https://77.87.106.33:26657 (note: this is a placeholder)\n")),(0,o.yg)("p",null,"If you run your own full-node, just use ",(0,o.yg)("inlineCode",{parentName:"p"},"tcp://localhost:26657")," as the address."),(0,o.yg)("p",null,"Finally, let us set the ",(0,o.yg)("inlineCode",{parentName:"p"},"chain-id")," of the blockchain we want to interact with:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad config chain-id cosmoshub-4\n")),(0,o.yg)("h2",{id:"querying-the-state"},"Querying the State"),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"Before you can bond atoms and withdraw rewards, you need to ",(0,o.yg)("a",{parentName:"strong",href:"#setting-up-gaiad"},"set up ",(0,o.yg)("inlineCode",{parentName:"a"},"gaiad"))))),(0,o.yg)("p",null,(0,o.yg)("inlineCode",{parentName:"p"},"gaiad")," lets you query all relevant information from the blockchain, like account balances, amount of bonded tokens, outstanding rewards, governance proposals and more. Next is a list of the most useful commands for delegator."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"// query account balances and other account-related information\ngaiad query account <yourAddress>\n\n// query the list of validators\ngaiad query staking validators\n\n// query the information of a validator given their address (e.g. cosmosvaloper1n5pepvmgsfd3p2tqqgvt505jvymmstf6s9gw27)\ngaiad query staking validator <validatorAddress>\n\n// query all delegations made from a delegator given their address (e.g. cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg)\ngaiad query staking delegations <delegatorAddress>\n\n// query a specific delegation made from a delegator (e.g. cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg) to a validator (e.g. cosmosvaloper1n5pepvmgsfd3p2tqqgvt505jvymmstf6s9gw27) given their addresses\ngaiad query staking delegation <delegatorAddress> <validatorAddress>\n\n// query the rewards of a delegator given a delegator address (e.g. cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg)\ngaiad query distribution rewards <delegatorAddress>\n\n// query all proposals currently open for depositing\ngaiad query gov proposals --status deposit_period\n\n// query all proposals currently open for voting\ngaiad query gov proposals --status voting_period\n\n// query a proposal given its proposalID\ngaiad query gov proposal <proposalID>\n")),(0,o.yg)("p",null,"For more commands, just type:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query\n")),(0,o.yg)("p",null,"For each command, you can use the ",(0,o.yg)("inlineCode",{parentName:"p"},"-h")," or ",(0,o.yg)("inlineCode",{parentName:"p"},"--help")," flag to get more information."),(0,o.yg)("h2",{id:"sending-transactions"},"Sending Transactions"),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},"On Cosmos Hub mainnet, the accepted denom is ",(0,o.yg)("inlineCode",{parentName:"p"},"uatom"),", where ",(0,o.yg)("inlineCode",{parentName:"p"},"1atom = 1,000,000uatom"))),(0,o.yg)("h3",{id:"a-note-on-gas-and-fees"},"A Note on Gas and Fees"),(0,o.yg)("p",null,"Transactions on the Cosmos Hub network need to include a transaction fee in order to be processed. This fee pays for the gas required to run the transaction. The formula is the following:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-js"},"fees = ceil(gas * gasPrices)\n")),(0,o.yg)("p",null,"The ",(0,o.yg)("inlineCode",{parentName:"p"},"gas")," is dependent on the transaction. Different transaction require different amount of ",(0,o.yg)("inlineCode",{parentName:"p"},"gas"),". The ",(0,o.yg)("inlineCode",{parentName:"p"},"gas")," amount for a transaction is calculated as it is being processed, but there is a way to estimate it beforehand by using the ",(0,o.yg)("inlineCode",{parentName:"p"},"auto")," value for the ",(0,o.yg)("inlineCode",{parentName:"p"},"gas")," flag. Of course, this only gives an estimate. You can adjust this estimate with the flag ",(0,o.yg)("inlineCode",{parentName:"p"},"--gas-adjustment")," (default ",(0,o.yg)("inlineCode",{parentName:"p"},"1.0"),") if you want to be sure you provide enough ",(0,o.yg)("inlineCode",{parentName:"p"},"gas")," for the transaction. For the remainder of this tutorial, we will use a ",(0,o.yg)("inlineCode",{parentName:"p"},"--gas-adjustment")," of ",(0,o.yg)("inlineCode",{parentName:"p"},"1.5"),"."),(0,o.yg)("p",null,"The ",(0,o.yg)("inlineCode",{parentName:"p"},"gasPrice")," is the price of each unit of ",(0,o.yg)("inlineCode",{parentName:"p"},"gas"),". Each validator sets a ",(0,o.yg)("inlineCode",{parentName:"p"},"min-gas-price")," value, and will only include transactions that have a ",(0,o.yg)("inlineCode",{parentName:"p"},"gasPrice")," greater than their ",(0,o.yg)("inlineCode",{parentName:"p"},"min-gas-price"),"."),(0,o.yg)("p",null,"The transaction ",(0,o.yg)("inlineCode",{parentName:"p"},"fees")," are the product of ",(0,o.yg)("inlineCode",{parentName:"p"},"gas")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"gasPrice"),". As a user, you have to input 2 out of 3. The higher the ",(0,o.yg)("inlineCode",{parentName:"p"},"gasPrice"),"/",(0,o.yg)("inlineCode",{parentName:"p"},"fees"),", the higher the chance that your transaction will get included in a block."),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},"For mainnet, the recommended ",(0,o.yg)("inlineCode",{parentName:"p"},"gas-prices")," is ",(0,o.yg)("inlineCode",{parentName:"p"},"0.0025uatom"),".")),(0,o.yg)("h3",{id:"sending-tokens"},"Sending Tokens"),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"Before you can bond atoms and withdraw rewards, you need to ",(0,o.yg)("a",{parentName:"strong",href:"#setting-up-gaiad"},"set up ",(0,o.yg)("inlineCode",{parentName:"a"},"gaiad"))," and ",(0,o.yg)("a",{parentName:"strong",href:"#creating-an-account"},"create an account")))),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"Note: These commands need to be run on an online computer. It is more secure to perform them commands using a Ledger Nano S device. For the offline procedure, click ",(0,o.yg)("a",{parentName:"strong",href:"#signing-transactions-from-an-offline-computer"},"here"),"."))),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"// Send a certain amount of tokens to an address\n// Ex value for parameters (do not actually use these values in your tx!!): <to_address>=cosmos16m93fezfiezhvnjajzrfyszml8qm92a0w67ntjhd3d0 <amount>=1000000uatom\n// Ex value for flags: <gasPrice>=0.0025uatom\n\ngaiad tx bank send [from_key_or_address] [to_address] [amount] [flags]\n")),(0,o.yg)("h3",{id:"bonding-atoms-and-withdrawing-rewards"},"Bonding Atoms and Withdrawing Rewards"),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"Before you can bond atoms and withdraw rewards, you need to ",(0,o.yg)("a",{parentName:"strong",href:"#setting-up-gaiad"},"set up ",(0,o.yg)("inlineCode",{parentName:"a"},"gaiad"))," and ",(0,o.yg)("a",{parentName:"strong",href:"#creating-an-account"},"create an account")))),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"Before bonding Atoms, please read the ",(0,o.yg)("a",{parentName:"strong",href:"https://hub.cosmos.network/delegators/delegator-faq"},"delegator faq")," to understand the risk and responsibilities involved with delegating"))),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"Note: These commands need to be run on an online computer. It is more secure to perform them commands using a ledger device. For the offline procedure, click ",(0,o.yg)("a",{parentName:"strong",href:"#signing-transactions-from-an-offline-computer"},"here"),"."))),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"// Bond a certain amount of Atoms to a given validator\n// ex value for flags: <validatorAddress>=cosmosvaloper18thamkhnj9wz8pa4nhnp9rldprgant57pk2m8s, <amountToBound>=10000000uatom, <gasPrice>=0.0025uatom\n\ngaiad tx staking delegate <validatorAddress> <amountToBond> --from <delegatorKeyName> --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice>\n\n\n// Redelegate a certain amount of Atoms from a validator to another\n// Can only be used if already bonded to a validator\n// Redelegation takes effect immediately, there is no waiting period to redelegate\n// After a redelegation, no other redelegation can be made from the account for the next 3 weeks\n// ex value for flags: <stcValidatorAddress>=cosmosvaloper18thamkhnj9wz8pa4nhnp9rldprgant57pk2m8s, <amountToRedelegate>=100000000uatom, <gasPrice>=0.0025uatom\n\ngaiad tx staking redelegate <srcValidatorAddress> <destValidatorAddress> <amountToRedelegate> --from <delegatorKeyName> --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice>\n\n// Withdraw all rewards\n// ex value for flag: <gasPrice>=0.0025uatom\n\ngaiad tx distribution withdraw-all-rewards --from <delegatorKeyName> --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice>\n\n\n// Unbond a certain amount of Atoms from a given validator\n// You will have to wait 3 weeks before your Atoms are fully unbonded and transferrable\n// ex value for flags: <validatorAddress>=cosmosvaloper18thamkhnj9wz8pa4nhnp9rldprgant57pk2m8s, <amountToUnbound>=10000000uatom, <gasPrice>=0.0025uatom\n\ngaiad tx staking unbond <validatorAddress> <amountToUnbond> --from <delegatorKeyName> --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice>\n")),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"If you use a connected Ledger, you will be asked to confirm the transaction on the device before it is signed and broadcast to the network. Note that the command will only work while the Ledger is plugged in and unlocked."))),(0,o.yg)("p",null,"To confirm that your transaction went through, you can use the following queries:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"// your balance should change after you bond Atoms or withdraw rewards\ngaiad query account\n\n// you should have delegations after you bond Atom\ngaiad query staking delegations <delegatorAddress>\n\n// this returns your tx if it has been included\n// use the tx hash that was displayed when you created the tx\ngaiad query tx <txHash>\n\n")),(0,o.yg)("p",null,"Double check with a block explorer if you interact with the network through a trusted full-node."),(0,o.yg)("h2",{id:"participating-in-governance"},"Participating in Governance"),(0,o.yg)("h3",{id:"primer-on-governance"},"Primer on Governance"),(0,o.yg)("p",null,"The Cosmos Hub has a built-in governance system that lets bonded Atom holders vote on proposals. There are three types of proposal:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"Text Proposals"),": These are the most basic type of proposals. They can be used to get the opinion of the network on a given topic."),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"Parameter Proposals"),": These are used to update the value of an existing parameter."),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"Software Upgrade Proposal"),": These are used to propose an upgrade of the Hub's software.")),(0,o.yg)("p",null,"Any Atom holder can submit a proposal. In order for the proposal to be open for voting, it needs to come with a ",(0,o.yg)("inlineCode",{parentName:"p"},"deposit")," that is greater than a parameter called ",(0,o.yg)("inlineCode",{parentName:"p"},"minDeposit"),". The ",(0,o.yg)("inlineCode",{parentName:"p"},"deposit")," need not be provided in its entirety by the submitter. If the initial proposer's ",(0,o.yg)("inlineCode",{parentName:"p"},"deposit")," is not sufficient, the proposal enters the ",(0,o.yg)("inlineCode",{parentName:"p"},"deposit_period")," status. Then, any Atom holder can increase the deposit by sending a ",(0,o.yg)("inlineCode",{parentName:"p"},"depositTx"),"."),(0,o.yg)("p",null,"Once the ",(0,o.yg)("inlineCode",{parentName:"p"},"deposit")," reaches ",(0,o.yg)("inlineCode",{parentName:"p"},"minDeposit"),", the proposal enters the ",(0,o.yg)("inlineCode",{parentName:"p"},"voting_period"),", which lasts 2 weeks. Any ",(0,o.yg)("strong",{parentName:"p"},"bonded")," Atom holder can then cast a vote on this proposal. The options are ",(0,o.yg)("inlineCode",{parentName:"p"},"Yes"),", ",(0,o.yg)("inlineCode",{parentName:"p"},"No"),", ",(0,o.yg)("inlineCode",{parentName:"p"},"NoWithVeto")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"Abstain"),". The weight of the vote is based on the amount of bonded Atoms of the sender. If they don't vote, delegator inherit the vote of their validator. However, delegators can override their validator's vote by sending a vote themselves."),(0,o.yg)("p",null,"At the end of the voting period, the proposal is accepted if there are more than 50% ",(0,o.yg)("inlineCode",{parentName:"p"},"Yes")," votes (excluding ",(0,o.yg)("inlineCode",{parentName:"p"},"Abstain")," votes) and less than 33.33% of ",(0,o.yg)("inlineCode",{parentName:"p"},"NoWithVeto")," votes (excluding ",(0,o.yg)("inlineCode",{parentName:"p"},"Abstain")," votes)."),(0,o.yg)("h3",{id:"in-practice"},"In Practice"),(0,o.yg)("admonition",{type:"tip"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"Before you can bond atoms and withdraw rewards, you need to ",(0,o.yg)("a",{parentName:"strong",href:"#bonding-atoms-and-withdrawing-rewards"},"bond Atoms")))),(0,o.yg)("admonition",{type:"warning"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"Note: These commands need to be run on an online computer. It is more secure to perform them commands using a ledger device. For the offline procedure, click ",(0,o.yg)("a",{parentName:"strong",href:"#signing-transactions-from-an-offline-computer"},"here"),"."))),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},'// Submit a Proposal\n// <type>=text/parameter_change/software_upgrade\n// ex value for flag: <gasPrice>=0.0025uatom\n\n// the proposal must meet the minimum deposit amount - please check the current chain params\ngaiad tx gov submit-legacy-proposal --title "Test Text Proposal" --description "My awesome proposal" --type "text" --deposit=10000000uatom --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice> --from <delegatorKeyName>\n\n// Increase deposit of a proposal\n// Retrieve proposalID from $gaiad query gov proposals --status deposit_period\n// ex value for parameter: <deposit>=10000000uatom\n\ngaiad tx gov deposit <proposalID> <deposit> --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice> --from <delegatorKeyName>\n\n// Vote on a proposal\n// Retrieve proposalID from $gaiad query gov proposals --status voting_period\n// <option>=yes/no/no_with_veto/abstain\n\ngaiad tx gov vote <proposalID> <option> --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice> --from <delegatorKeyName>\n')),(0,o.yg)("h3",{id:"signing-transactions-from-an-offline-computer"},"Signing Transactions From an Offline Computer"),(0,o.yg)("p",null,"If you do not have a ledger device and want to interact with your private key on an offline computer, you can use the following procedure. First, generate an unsigned transaction on an ",(0,o.yg)("strong",{parentName:"p"},"online computer")," with the following command (example with a bonding transaction):"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"// Bond Atoms\n// ex value for flags: <amountToBound>=10000000uatom, <bech32AddressOfValidator>=cosmosvaloper18thamkhnj9wz8pa4nhnp9rldprgant57pk2m8s, <gasPrice>=0.0025uatom, <delegatorAddress>=cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg\n\ngaiad tx staking delegate <validatorAddress> <amountToBond> --from <delegatorAddress> --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice> --generate-only > unsignedTX.json\n")),(0,o.yg)("p",null,"In order to sign, you will also need the ",(0,o.yg)("inlineCode",{parentName:"p"},"chain-id"),", ",(0,o.yg)("inlineCode",{parentName:"p"},"account-number")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"sequence"),". The ",(0,o.yg)("inlineCode",{parentName:"p"},"chain-id")," is a unique identifier for the blockchain on which you are submitting the transaction. The ",(0,o.yg)("inlineCode",{parentName:"p"},"account-number")," is an identifier generated when your account first receives funds. The ",(0,o.yg)("inlineCode",{parentName:"p"},"sequence")," number is used to keep track of the number of transactions you have sent and prevent replay attacks."),(0,o.yg)("p",null,"Get the chain-id from the genesis file (",(0,o.yg)("inlineCode",{parentName:"p"},"4"),"), and the two other fields using the account query:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad query account <yourAddress> --chain-id cosmoshub-4\n")),(0,o.yg)("p",null,"Then, copy ",(0,o.yg)("inlineCode",{parentName:"p"},"unsignedTx.json")," and transfer it (e.g. via USB) to the offline computer. If it is not done already, ",(0,o.yg)("a",{parentName:"p",href:"#using-a-computer"},"create an account on the offline computer"),". For additional security, you can double check the parameters of your transaction before signing it using the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"cat unsignedTx.json\n")),(0,o.yg)("p",null,"Now, sign the transaction using the following command. You will need the ",(0,o.yg)("inlineCode",{parentName:"p"},"chain-id"),", ",(0,o.yg)("inlineCode",{parentName:"p"},"sequence")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"account-number")," obtained earlier:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx sign unsignedTx.json --from <delegatorKeyName> --offline --chain-id cosmoshub-4 --sequence <sequence> --account-number <account-number> > signedTx.json\n")),(0,o.yg)("p",null,"Copy ",(0,o.yg)("inlineCode",{parentName:"p"},"signedTx.json")," and transfer it back to the online computer. Finally, use the following command to broadcast the transaction:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad tx broadcast signedTx.json\n")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bcd9d779.78ddfd17.js b/assets/js/bcd9d779.78ddfd17.js new file mode 100644 index 00000000000..26743db703b --- /dev/null +++ b/assets/js/bcd9d779.78ddfd17.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[2644],{5680:(e,t,n)=>{n.d(t,{xA:()=>d,yg:()=>m});var r=n(6540);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 o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),p=c(n),y=a,m=p["".concat(l,".").concat(y)]||p[y]||u[y]||o;return n?r.createElement(m,i(i({ref:t},d),{},{components:n})):r.createElement(m,i({ref:t},d))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=y;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c<o;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}y.displayName="MDXCreateElement"},672:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={title:"Validator Security",order:4},i=void 0,s={unversionedId:"validators/security",id:"validators/security",title:"Validator Security",description:"Each validator candidate is encouraged to run its operations independently, as diverse setups increase the resilience of the network. Validator candidates should commence their setup phase now in order to be on time for launch.",source:"@site/docs/validators/security.md",sourceDirName:"validators",slug:"/validators/security",permalink:"/main/validators/security",draft:!1,tags:[],version:"current",frontMatter:{title:"Validator Security",order:4},sidebar:"tutorialSidebar",previous:{title:"Validator Overview",permalink:"/main/validators/overview"},next:{title:"Validator FAQ",permalink:"/main/validators/validator-faq"}},l={},c=[{value:"Key Management - HSM",id:"key-management---hsm",level:2},{value:"Sentry Nodes (DDOS Protection)",id:"sentry-nodes-ddos-protection",level:2},{value:"Environment Variables",id:"environment-variables",level:2}],d={toc:c},p="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("p",null,"Each validator candidate is encouraged to run its operations independently, as diverse setups increase the resilience of the network. Validator candidates should commence their setup phase now in order to be on time for launch."),(0,a.yg)("h2",{id:"key-management---hsm"},"Key Management - HSM"),(0,a.yg)("p",null,"It is mission critical that an attacker cannot steal a validator's key. If this is possible, it puts the entire stake delegated to the compromised validator at risk. Hardware security modules are an important strategy for mitigating this risk."),(0,a.yg)("p",null,"HSM modules must support ",(0,a.yg)("inlineCode",{parentName:"p"},"ed25519")," signatures for the hub. The YubiHSM2 supports ",(0,a.yg)("inlineCode",{parentName:"p"},"ed25519")," and ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/iqlusioninc/yubihsm.rs"},"this yubikey library is available"),". The YubiHSM can protect a private key but cannot ensure in a secure setting that it won't sign the same block twice."),(0,a.yg)("p",null,"The CometBFT team is also working on extending our Ledger Nano S application to support validator signing. This app can store recent blocks and mitigate double signing attacks."),(0,a.yg)("p",null,"We will update this page when more key storage solutions become available."),(0,a.yg)("h2",{id:"sentry-nodes-ddos-protection"},"Sentry Nodes (DDOS Protection)"),(0,a.yg)("p",null,"Validators are responsible for ensuring that the network can sustain denial of service attacks."),(0,a.yg)("p",null,"One recommended way to mitigate these risks is for validators to carefully structure their network topology in a so-called sentry node architecture."),(0,a.yg)("p",null,"Validator nodes should only connect to full-nodes they trust because they operate them themselves or are run by other validators they know socially. A validator node will typically run in a data center. Most data centers provide direct links to the networks of major cloud providers. The validator can use those links to connect to sentry nodes in the cloud. This shifts the burden of denial-of-service from the validator's node directly to its sentry nodes, and may require new sentry nodes be spun up or activated to mitigate attacks on existing ones."),(0,a.yg)("p",null,"Sentry nodes can be quickly spun up or change their IP addresses. Because the links to the sentry nodes are in private IP space, an internet based attack cannot disturb them directly. This will ensure validator block proposals and votes always make it to the rest of the network."),(0,a.yg)("p",null,"To setup your sentry node architecture you can follow the instructions below:"),(0,a.yg)("p",null,"Validators nodes should edit their config.toml:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"# Comma separated list of nodes to keep persistent connections to\n# Do not add private peers to this list if you don't want them advertised\npersistent_peers =[list of sentry nodes]\n\n# Set true to enable the peer-exchange reactor\npex = false\n")),(0,a.yg)("p",null,"Sentry Nodes should edit their config.toml:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},'# Comma separated list of peer IDs to keep private (will not be gossiped to other peers)\n# Example ID: 3e16af0cead27979e1fc3dac57d03df3c7a77acc@3.87.179.235:26656\n\nprivate_peer_ids = "node_ids_of_private_peers"\n')),(0,a.yg)("h2",{id:"environment-variables"},"Environment Variables"),(0,a.yg)("p",null,"By default, uppercase environment variables with the following prefixes will replace lowercase command-line flags:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"GA")," (for Gaia flags)"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"TM")," (for Tendermint/CometBFT flags)"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"BC")," (for democli or basecli flags)")),(0,a.yg)("p",null,"For example, the environment variable ",(0,a.yg)("inlineCode",{parentName:"p"},"GA_CHAIN_ID")," will map to the command line flag ",(0,a.yg)("inlineCode",{parentName:"p"},"--chain-id"),". Note that while explicit command-line flags will take precedence over environment variables, environment variables will take precedence over any of your configuration files. For this reason, it's imperative that you lock down your environment such that any critical parameters are defined as flags on the CLI or prevent modification of any environment variables."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c377a04b.731fd0c6.js b/assets/js/c377a04b.731fd0c6.js new file mode 100644 index 00000000000..abb55c1cb03 --- /dev/null +++ b/assets/js/c377a04b.731fd0c6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[5742],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>g});var o=a(6540);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,o)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?r(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,o,n=function(e,t){if(null==e)return{};var a,o,n={},r=Object.keys(e);for(o=0;o<r.length;o++)a=r[o],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o<r.length;o++)a=r[o],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=o.createContext({}),m=function(e){var t=o.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=m(e.components);return o.createElement(s.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var a=e.components,n=e.mdxType,r=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=m(a),h=n,g=u["".concat(s,".").concat(h)]||u[h]||c[h]||r;return a?o.createElement(g,i(i({ref:t},p),{},{components:a})):o.createElement(g,i({ref:t},p))}));function g(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=a.length,i=new Array(r);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var m=2;m<r;m++)i[m]=a[m];return o.createElement.apply(null,i)}return o.createElement.apply(null,a)}h.displayName="MDXCreateElement"},1866:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>m});var o=a(8168),n=(a(6540),a(5680));const r={title:"Introduction",order:1,sidebar_position:1},i=void 0,l={unversionedId:"index",id:"index",title:"Introduction",description:"Welcome to the Cosmos Hub",source:"@site/docs/index.md",sourceDirName:".",slug:"/",permalink:"/main/",draft:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Introduction",order:1,sidebar_position:1},sidebar:"tutorialSidebar",next:{title:"Getting Started",permalink:"/main/getting-started/"}},s={},m=[{value:"The ATOM",id:"the-atom",level:2},{value:"Cosmos Hub Wallets",id:"cosmos-hub-wallets",level:2},{value:"Metamask Snaps",id:"metamask-snaps",level:2},{value:"Cosmos Hub Explorers",id:"cosmos-hub-explorers",level:2},{value:"Cosmos Hub CLI",id:"cosmos-hub-cli",level:2},{value:"Running a full-node on the Cosmos Hub Mainnet",id:"running-a-full-node-on-the-cosmos-hub-mainnet",level:2},{value:"Join the Community",id:"join-the-community",level:2}],p={toc:m},u="wrapper";function c(e){let{components:t,...r}=e;return(0,n.yg)(u,(0,o.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("p",null,(0,n.yg)("img",{alt:"Welcome to the Cosmos Hub",src:a(3153).A,width:"1920",height:"1080"})),(0,n.yg)("h1",{id:"introduction"},"Introduction"),(0,n.yg)("p",null,"The Cosmos Hub is the first of ",(0,n.yg)("a",{parentName:"p",href:"https://cosmos.network"},"thousands of interconnected blockchains")," that will eventually comprise the ",(0,n.yg)("strong",{parentName:"p"},"Cosmos Network"),". The primary token of the Cosmos Hub is the ",(0,n.yg)("strong",{parentName:"p"},"ATOM"),", but the Hub will support many tokens in the future."),(0,n.yg)("h2",{id:"the-atom"},"The ATOM"),(0,n.yg)("p",null,"Do you have ATOM tokens? With ATOM, you have the superpower to contribute to the security and governance of the Cosmos Hub. Delegate your ATOM to one or more of the validators on the Cosmos Hub blockchain to earn more ATOM through Proof-of-Stake. You can also vote with your ATOM to influence the future of the Cosmos Hub through on-chain governance proposals."),(0,n.yg)("p",null,"Learn more about ",(0,n.yg)("a",{parentName:"p",href:"/main/delegators/delegator-faq"},"being a delegator"),", learn about ",(0,n.yg)("a",{parentName:"p",href:"/main/delegators/delegator-security"},"the security risks"),", and start participating with one of the following wallets."),(0,n.yg)("h2",{id:"cosmos-hub-wallets"},"Cosmos Hub Wallets"),(0,n.yg)("admonition",{type:"tip"},(0,n.yg)("p",{parentName:"admonition"},"Do your own research and take precautions in regards to wallet security. Maintaining proper security practices is solely your responsibility when using third party wallets.")),(0,n.yg)("p",null,"These community-maintained web and mobile wallets allow you to store & transfer ATOM, delegate ATOM to validators, and vote on on-chain governance proposals. Note that we do not endorse any of the wallets, they are listed for your convenience."),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://wallet.keplr.app"},"Keplr")," - Web"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://www.ledger.com/cosmos-wallet"},"Ledger")," - Hardware"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://www.cosmostation.io/"},"Cosmostation")," - Android, iOS"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://www.leapwallet.io/"},"Leap Wallet")," - Android, iOS, Web"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://atomicwallet.io/"},"Atomic Wallet")," - Android, Linux, macOS, Windows"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://citadel.one/#mobile"},"Citadel.One")," - Android, iOS"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://cobo.com/"},"Cobo")," - Android, iOS"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://crypto.com/"},"Crypto.com")," - Android, iOS"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://www.huobiwallet.com/"},"Huobi Wallet")," - Android, iOS"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://app.shapeshift.com/"},"ShapeShift")," - Android, iOS, Web"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://token.im/"},"imToken")," - Android, iOS"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://www.mathwallet.org/en/"},"Math Wallet")," - Android, iOS, Web"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://www.rainbow.one"},"Rainbow Wallet")," - Android, iOS"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://trustwallet.com/"},"Trust Wallet")," Android, iOS"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://atomicdex.io/en/"},"Komodo Wallet"))),(0,n.yg)("h2",{id:"metamask-snaps"},"Metamask Snaps"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://www.leapwallet.io/snaps"},"Leap Wallet")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://metamask.mysticlabs.xyz/"},"Mystic Lab"))),(0,n.yg)("h2",{id:"cosmos-hub-explorers"},"Cosmos Hub Explorers"),(0,n.yg)("p",null,"These block explorers allow you to search, view and analyze Cosmos Hub data","\u2014","like blocks, transactions, validators, etc."),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://mintscan.io"},"Mintscan")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://www.datalenses.zone/chain/cosmos"},"Numia")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://atomscan.com"},"ATOMScan")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://cosmoshub.iobscan.io/"},"IOBScan")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://ping.pub/cosmos"},"Ping.Pub")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://monitor.bronbro.io/d/cosmos-stats/cosmos"},"BronBro")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://cosmos.smartstake.io/stats"},"SmartStake"))),(0,n.yg)("h2",{id:"cosmos-hub-cli"},"Cosmos Hub CLI"),(0,n.yg)("p",null,(0,n.yg)("inlineCode",{parentName:"p"},"gaiad")," is a command-line interface that lets you interact with the Cosmos Hub. ",(0,n.yg)("inlineCode",{parentName:"p"},"gaiad")," is the only tool that supports 100% of the Cosmos Hub features, including accounts, transfers, delegation, and governance. Learn more about ",(0,n.yg)("inlineCode",{parentName:"p"},"gaiad")," with the ",(0,n.yg)("a",{parentName:"p",href:"/main/delegators/delegator-guide-cli"},"delegator's CLI guide"),"."),(0,n.yg)("h2",{id:"running-a-full-node-on-the-cosmos-hub-mainnet"},"Running a full-node on the Cosmos Hub Mainnet"),(0,n.yg)("p",null,"In order to run a full-node for the Cosmos Hub mainnet, you must first ",(0,n.yg)("a",{parentName:"p",href:"./getting-started/installation"},"install ",(0,n.yg)("inlineCode",{parentName:"a"},"gaiad")),". Then, follow ",(0,n.yg)("a",{parentName:"p",href:"./hub-tutorials/join-mainnet"},"the guide"),".\nIf you are looking to run a validator node, follow the ","[validator setup guide]","(./validators/valid\nator-setup)."),(0,n.yg)("h2",{id:"join-the-community"},"Join the Community"),(0,n.yg)("p",null,"Have questions, comments, or new ideas? Participate in the Cosmos community through one of the following channels."),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://discord.gg/interchain"},"Discord")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://forum.cosmos.network"},"Cosmos Forum")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://reddit.com/r/cosmosnetwork"},"Cosmos on Reddit"))),(0,n.yg)("p",null,"To learn more about the Cosmos Hub and how it fits within the Cosmos Network, visit ",(0,n.yg)("a",{parentName:"p",href:"https://cosmos.network"},"cosmos.network"),"."))}c.isMDXComponent=!0},3153:(e,t,a)=>{a.d(t,{A:()=>o});const o=a.p+"assets/images/cosmos-hub-image-64b35193bcb3998afd27f30060ed5ab5.jpg"}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.fcc81489.js b/assets/js/c4f5d8e4.fcc81489.js new file mode 100644 index 00000000000..96952752b42 --- /dev/null +++ b/assets/js/c4f5d8e4.fcc81489.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[2634],{192:(e,s,t)=>{t.r(s),t.d(s,{default:()=>o});var c=t(6540),u=t(6347);function o(){return c.createElement(u.rd,{to:"/main"})}}}]); \ No newline at end of file diff --git a/assets/js/c5a35911.9436f1cc.js b/assets/js/c5a35911.9436f1cc.js new file mode 100644 index 00000000000..f68179b8166 --- /dev/null +++ b/assets/js/c5a35911.9436f1cc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[5967],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>m});var a=n(6540);function r(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(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),d=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=d(e.components);return a.createElement(s.Provider,{value:t},e.children)},g="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),g=d(n),u=r,m=g["".concat(s,".").concat(u)]||g[u]||c[u]||i;return n?a.createElement(m,o(o({ref:t},p),{},{components:n})):a.createElement(m,o({ref:t},p))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[g]="string"==typeof e?e:r,o[1]=l;for(var d=2;d<i;d++)o[d]=n[d];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}u.displayName="MDXCreateElement"},7911:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var a=n(8168),r=(n(6540),n(5680));const i={title:"Setting up Tendermint KMS + Ledger",order:6},o=void 0,l={unversionedId:"validators/kms/kms_ledger",id:"validators/kms/kms_ledger",title:"Setting up Tendermint KMS + Ledger",description:"The following instructions are a brief walkthrough and not a comprehensive guideline. You should consider and research more about the security implications of activating an external KMS.",source:"@site/docs/validators/kms/kms_ledger.md",sourceDirName:"validators/kms",slug:"/validators/kms/kms_ledger",permalink:"/main/validators/kms/kms_ledger",draft:!1,tags:[],version:"current",frontMatter:{title:"Setting up Tendermint KMS + Ledger",order:6},sidebar:"tutorialSidebar",previous:{title:"KMS - Key Management System",permalink:"/main/validators/kms/"},next:{title:"Validator Overview",permalink:"/main/validators/overview"}},s={},d=[{value:"Tendermint Validator app (for Ledger devices)",id:"tendermint-validator-app-for-ledger-devices",level:2},{value:"KMS configuration",id:"kms-configuration",level:2},{value:"Config file",id:"config-file",level:3},{value:"Generate secret key",id:"generate-secret-key",level:3},{value:"Retrieve validator key",id:"retrieve-validator-key",level:3},{value:"Gaia configuration",id:"gaia-configuration",level:2}],p={toc:d},g="wrapper";function c(e){let{components:t,...i}=e;return(0,r.yg)(g,(0,a.A)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The following instructions are a brief walkthrough and not a comprehensive guideline. You should consider and ",(0,r.yg)("a",{parentName:"p",href:"/main/validators/security"},"research more about the security implications")," of activating an external KMS.")),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"KMS and Ledger Tendermint app are currently work in progress. Details may vary. Use with care under your own risk.")),(0,r.yg)("h2",{id:"tendermint-validator-app-for-ledger-devices"},"Tendermint Validator app (for Ledger devices)"),(0,r.yg)("p",null,"You should be able to find the Tendermint app in Ledger Live."),(0,r.yg)("p",null,(0,r.yg)("em",{parentName:"p"},"Note: at the moment, you might need to enable ",(0,r.yg)("inlineCode",{parentName:"em"},"developer mode")," in Ledger Live settings")),(0,r.yg)("h2",{id:"kms-configuration"},"KMS configuration"),(0,r.yg)("p",null,"In this section, we will configure a KMS to use a Ledger device running the Tendermint Validator App."),(0,r.yg)("h3",{id:"config-file"},"Config file"),(0,r.yg)("p",null,"You can find other configuration examples ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/iqlusioninc/tmkms/blob/master/tmkms.toml.example"},"here")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Create a ",(0,r.yg)("inlineCode",{parentName:"li"},"~/.tmkms/tmkms.toml")," file with the following content (use an adequate ",(0,r.yg)("inlineCode",{parentName:"li"},"chain_id"),")")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-toml"},'# Example KMS configuration file\n[[validator]]\naddr = "tcp://localhost:26658" # or "unix:///path/to/socket"\nchain_id = "gaia-11001"\nreconnect = true # true is the default\nsecret_key = "~/.tmkms/secret_connection.key"\n\n[[providers.ledgertm]]\nchain_ids = ["gaia-11001"]\n')),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Edit ",(0,r.yg)("inlineCode",{parentName:"li"},"addr")," to point to your ",(0,r.yg)("inlineCode",{parentName:"li"},"gaiad")," instance."),(0,r.yg)("li",{parentName:"ul"},"Adjust ",(0,r.yg)("inlineCode",{parentName:"li"},"chain-id")," to match your ",(0,r.yg)("inlineCode",{parentName:"li"},".gaia/config/config.toml")," settings."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"provider.ledgertm")," has no additional parameters at the moment, however, it is important that you keep that header to enable the feature.")),(0,r.yg)("p",null,(0,r.yg)("em",{parentName:"p"},"Plug your Ledger device and open the Tendermint validator app.")),(0,r.yg)("h3",{id:"generate-secret-key"},"Generate secret key"),(0,r.yg)("p",null,"Now you need to generate secret_key:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-bash"},"tmkms keygen ~/.tmkms/secret_connection.key\n")),(0,r.yg)("h3",{id:"retrieve-validator-key"},"Retrieve validator key"),(0,r.yg)("p",null,"The last step is to retrieve the validator key that you will use in ",(0,r.yg)("inlineCode",{parentName:"p"},"gaiad"),"."),(0,r.yg)("p",null,"Start the KMS:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-bash"},"tmkms start -c ~/.tmkms/tmkms.toml\n")),(0,r.yg)("p",null,"The output should look similar to:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"07:28:24 [INFO] tmkms 0.3.0 starting up...\n07:28:24 [INFO] [keyring:ledgertm:ledgertm] added validator key cosmosvalconspub1zcjduepqy53m39prgp9dz3nz96kaav3el5e0th8ltwcf8cpavqdvpxgr5slsd6wz6f\n07:28:24 [INFO] KMS node ID: 1BC12314E2E1C29015B66017A397F170C6ECDE4A\n")),(0,r.yg)("p",null,"The KMS may complain that it cannot connect to gaiad. That is fine, we will fix it in the next section."),(0,r.yg)("p",null,"This output indicates the validator key linked to this particular device is: ",(0,r.yg)("inlineCode",{parentName:"p"},"cosmosvalconspub1zcjduepqy53m39prgp9dz3nz96kaav3el5e0th8ltwcf8cpavqdvpxgr5slsd6wz6f")),(0,r.yg)("p",null,"Take note of the validator pubkey that appears in your screen. ",(0,r.yg)("em",{parentName:"p"},"We will use it in the next section.")),(0,r.yg)("h2",{id:"gaia-configuration"},"Gaia configuration"),(0,r.yg)("p",null,"You need to enable KMS access by editing ",(0,r.yg)("inlineCode",{parentName:"p"},".gaia/config/config.toml"),". In this file, modify ",(0,r.yg)("inlineCode",{parentName:"p"},"priv_validator_laddr")," to create a listening address/port or a unix socket in ",(0,r.yg)("inlineCode",{parentName:"p"},"gaiad"),"."),(0,r.yg)("p",null,"For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-toml"},'...\n# TCP or UNIX socket address for Tendermint to listen on for\n# connections from an external PrivValidator process\npriv_validator_laddr = "tcp://127.0.0.1:26658"\n...\n')),(0,r.yg)("p",null,"Let's assume that you have set up your validator account and called it ",(0,r.yg)("inlineCode",{parentName:"p"},"kmsval"),". You can tell gaiad the key that we've got in the previous section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad gentx --name kmsval --pubkey {.ValidatorKey} \n")),(0,r.yg)("p",null,"Now start ",(0,r.yg)("inlineCode",{parentName:"p"},"gaiad"),". You should see that the KMS connects and receives a signature request."),(0,r.yg)("p",null,"Once the ledger receives the first message, it will ask for confirmation that the values are adequate."),(0,r.yg)("p",null,(0,r.yg)("img",{src:n(9631).A,width:"300",height:"150"})),(0,r.yg)("p",null,"Click the right button, if the height and round are correct."),(0,r.yg)("p",null,"After that, you will see that the KMS will start forwarding all signature requests to the ledger:"),(0,r.yg)("p",null,(0,r.yg)("img",{src:n(6016).A,width:"313",height:"150"})),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The word TEST in the second picture, second line appears because they were taken on a pre-release version."),(0,r.yg)("p",{parentName:"admonition"},"Once the app as been released in Ledger's app store, this word should NOT appear.")))}c.isMDXComponent=!0},9631:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/ledger_1-333b5a02b13138ef329933950ec162af.jpg"},6016:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/ledger_2-0fe258512b66899f1a60ffb8986ebb48.jpg"}}]); \ No newline at end of file diff --git a/assets/js/d3580699.eba85ceb.js b/assets/js/d3580699.eba85ceb.js new file mode 100644 index 00000000000..00991971381 --- /dev/null +++ b/assets/js/d3580699.eba85ceb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[1671],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>g});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),u=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},p=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),c=u(a),m=r,g=c["".concat(s,".").concat(m)]||c[m]||d[m]||i;return a?n.createElement(g,l(l({ref:t},p),{},{components:a})):n.createElement(g,l({ref:t},p))}));function g(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[c]="string"==typeof e?e:r,l[1]=o;for(var u=2;u<i;u++)l[u]=a[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},6943:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>o,toc:()=>u});var n=a(8168),r=(a(6540),a(5680));const i={},l="ADR Creation Process",o={unversionedId:"architecture/adr/PROCESS",id:"architecture/adr/PROCESS",title:"ADR Creation Process",description:"1. Copy the adr-template.md file. Use the following filename pattern: adr-next_number-title.md",source:"@site/docs/architecture/adr/PROCESS.md",sourceDirName:"architecture/adr",slug:"/architecture/adr/PROCESS",permalink:"/main/architecture/adr/PROCESS",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Architecture Decision Records (ADR)",permalink:"/main/architecture/"},next:{title:"README",permalink:"/main/architecture/adr/"}},s={},u=[{value:"ADR life cycle",id:"adr-life-cycle",level:2},{value:"ADR status",id:"adr-status",level:3},{value:"Consensus Status",id:"consensus-status",level:4},{value:"Language used in ADR",id:"language-used-in-adr",level:2}],p={toc:u},c="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(c,(0,n.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"adr-creation-process"},"ADR Creation Process"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Copy the ",(0,r.yg)("inlineCode",{parentName:"li"},"adr-template.md")," file. Use the following filename pattern: ",(0,r.yg)("inlineCode",{parentName:"li"},"adr-next_number-title.md")),(0,r.yg)("li",{parentName:"ol"},"Create a draft Pull Request and solicit input from the stewarding team, if you want to get an early feedback."),(0,r.yg)("li",{parentName:"ol"},"Make sure that the problem, the context and a recommended solution is clear and well documented. Be sure to document alternate solution spaces and give reasons why they have been discarded."),(0,r.yg)("li",{parentName:"ol"},"Add an entry to a list in the README file ",(0,r.yg)("a",{parentName:"li",href:"/main/architecture/adr/#adr-table-of-contents"},"Table of Contents"),"."),(0,r.yg)("li",{parentName:"ol"},"Create a Pull Request to propose a new ADR.")),(0,r.yg)("h2",{id:"adr-life-cycle"},"ADR life cycle"),(0,r.yg)("p",null,"ADR creation is an ",(0,r.yg)("strong",{parentName:"p"},"iterative")," process. Instead of trying to solve all decisions in a single ADR pull request, we MUST firstly understand the problem and collect feedback through a GitHub Issue."),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},"Every proposal SHOULD start with a new GitHub Issue or be a result of existing Issues. The Issue should contain just a brief proposal summary.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},"Once the motivation is validated, a GitHub Pull Request (PR) is created with a new document based on the ",(0,r.yg)("inlineCode",{parentName:"p"},"adr-template.md"),".")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},"An ADR doesn't have to arrive to ",(0,r.yg)("inlineCode",{parentName:"p"},"main")," with an ",(0,r.yg)("em",{parentName:"p"},"accepted")," status in a single PR. If the motivation is clear and the solution is sound, we SHOULD be able to merge it and keep a ",(0,r.yg)("em",{parentName:"p"},"proposed")," status. It's preferable to have an iterative approach rather than long, not merged Pull Requests.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},"If a ",(0,r.yg)("em",{parentName:"p"},"proposed")," ADR is merged, then it should clearly document outstanding issues either in ADR document notes or in a GitHub Issue.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},"The PR SHOULD always be merged. In the case of a faulty ADR, we still prefer to merge it with a ",(0,r.yg)("em",{parentName:"p"},"rejected")," status. The only time the ADR SHOULD NOT be merged is if the author abandons it.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},"Merged ADRs SHOULD NOT be deleted."))),(0,r.yg)("h3",{id:"adr-status"},"ADR status"),(0,r.yg)("p",null,"Status has two components:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"{CONSENSUS STATUS} {IMPLEMENTATION STATUS}\n")),(0,r.yg)("p",null,"IMPLEMENTATION STATUS is either ",(0,r.yg)("inlineCode",{parentName:"p"},"Implemented")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"Not Implemented"),"."),(0,r.yg)("h4",{id:"consensus-status"},"Consensus Status"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-mermaid"},"flowchart TD\n A[DRAFT] --\x3e B[PROPOSED]\n B --\x3e C[LAST CALL YYYY-MM-DD]\n B --\x3e D[ABANDONED]\n C --\x3e E[ACCEPTED or REJECTED]\n E --\x3e F[SUPERSEDED by ADR-xxx]\n")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"DRAFT"),": ","[optional]"," an ADR which is work in progress, not being ready for a general review. This is to present an early work and get an early feedback in a Draft Pull Request form."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"PROPOSED"),": an ADR covering a full solution architecture and still in the review - project stakeholders haven't reached an agreement yet."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"LAST CALL <date for the last call>"),": ","[optional]"," clear notify that we are close to accept updates. Changing a status to ",(0,r.yg)("inlineCode",{parentName:"li"},"LAST CALL")," means that social consensus (of Cosmos SDK maintainers) has been reached and we still want to give it a time to let the community react or analyze."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"ACCEPTED"),": ADR which will represent a currently implemented or to be implemented architecture design."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"REJECTED"),": ADR can go from PROPOSED or ACCEPTED to rejected if the consensus among project stakeholders will decide so."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"SUPERSEEDED by ADR-xxx"),": ADR which has been superseded by a new ADR."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"ABANDONED"),": the ADR is no longer pursued by the original authors.")),(0,r.yg)("h2",{id:"language-used-in-adr"},"Language used in ADR"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"The context/background should be written in the present tense."),(0,r.yg)("li",{parentName:"ul"},"Avoid using a first, personal form.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d56e8623.c789244d.js b/assets/js/d56e8623.c789244d.js new file mode 100644 index 00000000000..aa81e753dc9 --- /dev/null +++ b/assets/js/d56e8623.c789244d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[6542],{5680:(e,n,r)=>{r.d(n,{xA:()=>m,yg:()=>f});var t=r(6540);function o(e,n,r){return n in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}function a(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),r.push.apply(r,t)}return r}function i(e){for(var n=1;n<arguments.length;n++){var r=null!=arguments[n]?arguments[n]:{};n%2?a(Object(r),!0).forEach((function(n){o(e,n,r[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))}))}return e}function s(e,n){if(null==e)return{};var r,t,o=function(e,n){if(null==e)return{};var r,t,o={},a=Object.keys(e);for(t=0;t<a.length;t++)r=a[t],n.indexOf(r)>=0||(o[r]=e[r]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(t=0;t<a.length;t++)r=a[t],n.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=t.createContext({}),p=function(e){var n=t.useContext(c),r=n;return e&&(r="function"==typeof e?e(n):i(i({},n),e)),r},m=function(e){var n=p(e.components);return t.createElement(c.Provider,{value:n},e.children)},l="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},y=t.forwardRef((function(e,n){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),l=p(r),y=o,f=l["".concat(c,".").concat(y)]||l[y]||u[y]||a;return r?t.createElement(f,i(i({ref:n},m),{},{components:r})):t.createElement(f,i({ref:n},m))}));function f(e,n){var r=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=y;var s={};for(var c in n)hasOwnProperty.call(n,c)&&(s[c]=n[c]);s.originalType=e,s[l]="string"==typeof e?e:o,i[1]=s;for(var p=2;p<a;p++)i[p]=r[p];return t.createElement.apply(null,i)}return t.createElement.apply(null,r)}y.displayName="MDXCreateElement"},3057:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var t=r(8168),o=(r(6540),r(5680));const a={title:"Governance Overview",order:1},i=void 0,s={unversionedId:"governance/README",id:"governance/README",title:"Governance Overview",description:'The Cosmos Hub ("Gaia") has an on-chain governance mechanism for signaling, changing consensus parameters, and spending funds from the community pool.',source:"@site/docs/governance/README.md",sourceDirName:"governance",slug:"/governance/",permalink:"/main/governance/",draft:!1,tags:[],version:"current",frontMatter:{title:"Governance Overview",order:1},sidebar:"tutorialSidebar",previous:{title:"Running a Validator",permalink:"/main/validators/validator-setup"},next:{title:"Proposal Types",permalink:"/main/governance/proposal-types/"}},c={},p=[{value:"Community",id:"community",level:2}],m={toc:p},l="wrapper";function u(e){let{components:n,...r}=e;return(0,o.yg)(l,(0,t.A)({},m,r,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("p",null,'The Cosmos Hub ("Gaia") has an on-chain governance mechanism for ',(0,o.yg)("a",{parentName:"p",href:"/main/governance/proposal-types/text-prop"},"signaling"),", changing ",(0,o.yg)("a",{parentName:"p",href:"/main/governance/proposal-types/param-change"},"consensus parameters"),", and spending ",(0,o.yg)("a",{parentName:"p",href:"/main/governance/proposal-types/community-pool-spend"},"funds from the community pool"),". "),(0,o.yg)("p",null,"This repository provides background information on these different kinds of proposals and best-practices for drafting them and proposing them on-chain."),(0,o.yg)("h2",{id:"community"},"Community"),(0,o.yg)("p",null,"Cosmos governance is driven by the Cosmos community, and much of the documentation in this repo was funded by the community fund itself in\n",(0,o.yg)("a",{parentName:"p",href:"https://www.mintscan.io/cosmos/proposals/23"},"Proposal 23")," and ",(0,o.yg)("a",{parentName:"p",href:"https://www.mintscan.io/cosmos/proposals/63"},"Proposal 63"),".\nGovernance discussions happen in a number of places moderated by diverse community members, including:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"http://forum.cosmos.network/"},"Forum")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://discord.gg/interchain"},"Discord")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"http://reddit.com/r/cosmosnetwork"},"Reddit")),(0,o.yg)("li",{parentName:"ul"},"anywhere else you might interact with members of the Cosmos community!")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e48b7f5f.5b620ce3.js b/assets/js/e48b7f5f.5b620ce3.js new file mode 100644 index 00000000000..741599c843a --- /dev/null +++ b/assets/js/e48b7f5f.5b620ce3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[6708],{5680:(e,a,t)=>{t.d(a,{xA:()=>h,yg:()=>u});var o=t(6540);function i(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function n(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);a&&(o=o.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,o)}return t}function r(e){for(var a=1;a<arguments.length;a++){var t=null!=arguments[a]?arguments[a]:{};a%2?n(Object(t),!0).forEach((function(a){i(e,a,t[a])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):n(Object(t)).forEach((function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(t,a))}))}return e}function s(e,a){if(null==e)return{};var t,o,i=function(e,a){if(null==e)return{};var t,o,i={},n=Object.keys(e);for(o=0;o<n.length;o++)t=n[o],a.indexOf(t)>=0||(i[t]=e[t]);return i}(e,a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o<n.length;o++)t=n[o],a.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var l=o.createContext({}),d=function(e){var a=o.useContext(l),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},h=function(e){var a=d(e.components);return o.createElement(l.Provider,{value:a},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var a=e.children;return o.createElement(o.Fragment,{},a)}},m=o.forwardRef((function(e,a){var t=e.components,i=e.mdxType,n=e.originalType,l=e.parentName,h=s(e,["components","mdxType","originalType","parentName"]),c=d(t),m=i,u=c["".concat(l,".").concat(m)]||c[m]||g[m]||n;return t?o.createElement(u,r(r({ref:a},h),{},{components:t})):o.createElement(u,r({ref:a},h))}));function u(e,a){var t=arguments,i=a&&a.mdxType;if("string"==typeof e||i){var n=t.length,r=new Array(n);r[0]=m;var s={};for(var l in a)hasOwnProperty.call(a,l)&&(s[l]=a[l]);s.originalType=e,s[c]="string"==typeof e?e:i,r[1]=s;for(var d=2;d<n;d++)r[d]=t[d];return o.createElement.apply(null,r)}return o.createElement.apply(null,t)}m.displayName="MDXCreateElement"},6027:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>l,contentTitle:()=>r,default:()=>g,frontMatter:()=>n,metadata:()=>s,toc:()=>d});var o=t(8168),i=(t(6540),t(5680));const n={title:"Validator FAQ",order:3},r=void 0,s={unversionedId:"validators/validator-faq",id:"validators/validator-faq",title:"Validator FAQ",description:"Disclaimer",source:"@site/docs/validators/validator-faq.md",sourceDirName:"validators",slug:"/validators/validator-faq",permalink:"/main/validators/validator-faq",draft:!1,tags:[],version:"current",frontMatter:{title:"Validator FAQ",order:3},sidebar:"tutorialSidebar",previous:{title:"Validator Security",permalink:"/main/validators/security"},next:{title:"Running a Validator",permalink:"/main/validators/validator-setup"}},l={},d=[{value:"General Concepts",id:"general-concepts",level:2},{value:"What is a Cosmos validator?",id:"what-is-a-cosmos-validator",level:3},{value:"What is staking?",id:"what-is-staking",level:3},{value:"What is a full node?",id:"what-is-a-full-node",level:3},{value:"What is a delegator?",id:"what-is-a-delegator",level:3},{value:"Becoming a Validator",id:"becoming-a-validator",level:2},{value:"How to become a validator?",id:"how-to-become-a-validator",level:3},{value:"Testnet",id:"testnet",level:2},{value:"How can I join the testnet?",id:"how-can-i-join-the-testnet",level:3},{value:"Additional Concepts",id:"additional-concepts",level:2},{value:"What are the different types of keys?",id:"what-are-the-different-types-of-keys",level:3},{value:"What are the different states a validator can be in?",id:"what-are-the-different-states-a-validator-can-be-in",level:3},{value:"What is self-delegation? How can I increase my self-delegation?",id:"what-is-self-delegation-how-can-i-increase-my-self-delegation",level:3},{value:"What is validator bond? How can I increase my validator bond?",id:"what-is-validator-bond-how-can-i-increase-my-validator-bond",level:3},{value:"Is there a minimum amount of ATOM that must be delegated to be an active (bonded) validator?",id:"is-there-a-minimum-amount-of-atom-that-must-be-delegated-to-be-an-active-bonded-validator",level:3},{value:"How do delegators choose their validators?",id:"how-do-delegators-choose-their-validators",level:3},{value:"Responsibilities",id:"responsibilities",level:2},{value:"Do validators need to be publicly identified?",id:"do-validators-need-to-be-publicly-identified",level:3},{value:"What are the responsibilities of a validator?",id:"what-are-the-responsibilities-of-a-validator",level:3},{value:"What does 'participate in governance' entail?",id:"what-does-participate-in-governance-entail",level:3},{value:"What does staking imply?",id:"what-does-staking-imply",level:3},{value:"Can a validator run away with their delegators' ATOM?",id:"can-a-validator-run-away-with-their-delegators-atom",level:3},{value:"How often is a validator chosen to propose the next block? Does frequency increase with the quantity of bonded ATOM?",id:"how-often-is-a-validator-chosen-to-propose-the-next-block-does-frequency-increase-with-the-quantity-of-bonded-atom",level:3},{value:"Are validators of the Cosmos Hub required to validate other zones in the Cosmos ecosystem?",id:"are-validators-of-the-cosmos-hub-required-to-validate-other-zones-in-the-cosmos-ecosystem",level:3},{value:"How can a validator safely quit validating on the Cosmos Hub?",id:"how-can-a-validator-safely-quit-validating-on-the-cosmos-hub",level:3},{value:"Incentives",id:"incentives",level:2},{value:"What is the incentive to stake?",id:"what-is-the-incentive-to-stake",level:3},{value:"What is a validator commission?",id:"what-is-a-validator-commission",level:3},{value:"What is the incentive to run a validator?",id:"what-is-the-incentive-to-run-a-validator",level:3},{value:"How are block rewards distributed?",id:"how-are-block-rewards-distributed",level:3},{value:"How are fees distributed?",id:"how-are-fees-distributed",level:3},{value:"What are the slashing conditions?",id:"what-are-the-slashing-conditions",level:3},{value:"Are validators required to self-delegate ATOM?",id:"are-validators-required-to-self-delegate-atom",level:3},{value:"How to prevent concentration of stake in the hands of a few top validators?",id:"how-to-prevent-concentration-of-stake-in-the-hands-of-a-few-top-validators",level:3},{value:"Liquid Staking Module",id:"liquid-staking-module",level:2},{value:"What is the liquid staking module?",id:"what-is-the-liquid-staking-module",level:3},{value:"Who can validator bond?",id:"who-can-validator-bond",level:3},{value:"How can I validator bond?",id:"how-can-i-validator-bond",level:3},{value:"How does a delegator or validator mark their delegation as a validator bond?",id:"how-does-a-delegator-or-validator-mark-their-delegation-as-a-validator-bond",level:3},{value:"Are validator bonds subject to additional slashing conditions?",id:"are-validator-bonds-subject-to-additional-slashing-conditions",level:3},{value:"Can I unbond my validator bond?",id:"can-i-unbond-my-validator-bond",level:3},{value:"Can I validator bond some of my tokens and delegate the remaining portion normally?",id:"can-i-validator-bond-some-of-my-tokens-and-delegate-the-remaining-portion-normally",level:3},{value:"Technical Requirements",id:"technical-requirements",level:2},{value:"What are hardware requirements?",id:"what-are-hardware-requirements",level:3},{value:"What are software requirements?",id:"what-are-software-requirements",level:3},{value:"What are bandwidth requirements?",id:"what-are-bandwidth-requirements",level:3},{value:"How to handle key management?",id:"how-to-handle-key-management",level:3},{value:"What can validators expect in terms of operations?",id:"what-can-validators-expect-in-terms-of-operations",level:3},{value:"What are the maintenance requirements?",id:"what-are-the-maintenance-requirements",level:3},{value:"How can validators protect themselves from denial-of-service attacks?",id:"how-can-validators-protect-themselves-from-denial-of-service-attacks",level:3}],h={toc:d},c="wrapper";function g(e){let{components:a,...t}=e;return(0,i.yg)(c,(0,o.A)({},h,t,{components:a,mdxType:"MDXLayout"}),(0,i.yg)("admonition",{type:"warning"},(0,i.yg)("h3",{parentName:"admonition",id:"disclaimer"},"Disclaimer"),(0,i.yg)("p",{parentName:"admonition"},"This is work in progress. Mechanisms and values are susceptible to change.")),(0,i.yg)("h2",{id:"general-concepts"},"General Concepts"),(0,i.yg)("h3",{id:"what-is-a-cosmos-validator"},"What is a Cosmos validator?"),(0,i.yg)("p",null,"The Cosmos Hub is based on ",(0,i.yg)("a",{parentName:"p",href:"https://docs.cometbft.com/v0.37/introduction/what-is-cometbft"},"CometBFT")," that relies on a set of validators to secure the network. The role of validators is to run a full node and participate in consensus by broadcasting votes that contain cryptographic signatures signed by the validator's private key. Validators commit new blocks in the blockchain and receive revenue in exchange for their work. Validators must also participate in governance by voting on proposals. Validators are weighted according to their total stake."),(0,i.yg)("h3",{id:"what-is-staking"},"What is staking?"),(0,i.yg)("p",null,"The Cosmos Hub is a public Proof-Of-Stake (PoS) blockchain, meaning that the weight of validators is determined by the amount of staking tokens (ATOM) bonded as collateral. These ATOM tokens can be self-delegated directly by the validator or delegated to the validator by other ATOM holders."),(0,i.yg)("p",null,"Any user in the system can declare their intention to become a validator by sending a ",(0,i.yg)("inlineCode",{parentName:"p"},"create-validator")," transaction to become validator candidates."),(0,i.yg)("p",null,"The weight (i.e. voting power) of a validator determines whether they are an active validator. The active validator set is limited to ",(0,i.yg)("a",{parentName:"p",href:"https://www.mintscan.io/cosmos/validators"},"an amount")," that changes over time."),(0,i.yg)("h3",{id:"what-is-a-full-node"},"What is a full node?"),(0,i.yg)("p",null,"A full node is a server running a chain's ",(0,i.yg)("em",{parentName:"p"},"binary")," (its software) that fully validates transactions and blocks of a blockchain and keeps a full record of all historic activity. A full node is distinct from a pruned node that processes only block headers and a small subset of transactions. Running a full node requires more resources than a pruned node. Validators can decide to run either a full node or a pruned node, but they need to make sure they retain enough blocks to be able to validate new blocks."),(0,i.yg)("p",null,"Of course, it is possible and encouraged for users to run full nodes even if they do not plan to be validators."),(0,i.yg)("p",null,"You can find more details about the requirements in the ",(0,i.yg)("a",{parentName:"p",href:"/main/hub-tutorials/join-mainnet"},"Joining Mainnet Tutorial"),"."),(0,i.yg)("h3",{id:"what-is-a-delegator"},"What is a delegator?"),(0,i.yg)("p",null,"Delegators are ATOM holders who cannot, or do not want to, run a validator themselves. ATOM holders can delegate ATOM to a validator and obtain a part of their revenue in exchange. For details on how revenue is distributed, see ",(0,i.yg)("a",{parentName:"p",href:"/validators/validator-faq#what-is-the-incentive-to-stake"},"What is the incentive to stake?")," and ",(0,i.yg)("a",{parentName:"p",href:"/validators/validator-faq#what-is-a-validator-commission"},"What are validators commission?")," in this document."),(0,i.yg)("p",null,"Because delegators share revenue with their validators, they also share risks. If a validator misbehaves, each of their delegators are partially slashed in proportion to their delegated stake. This penalty is one of the reasons why delegators must perform due diligence on validators before delegating. Spreading their stake over multiple validators is another layer of protection."),(0,i.yg)("p",null,"Delegators play a critical role in the system, as they are responsible for choosing validators. Being a delegator is not a passive role. Delegators must actively monitor the actions of their validators and participate in governance. For details on being a delegator, read the ",(0,i.yg)("a",{parentName:"p",href:"https://hub.cosmos.network/delegators/delegator-faq"},"Delegator FAQ"),"."),(0,i.yg)("h2",{id:"becoming-a-validator"},"Becoming a Validator"),(0,i.yg)("h3",{id:"how-to-become-a-validator"},"How to become a validator?"),(0,i.yg)("p",null,"Any participant in the network can signal that they want to become a validator by sending a ",(0,i.yg)("inlineCode",{parentName:"p"},"create-validator")," transaction, where they must fill out the following parameters:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Validator's ",(0,i.yg)("inlineCode",{parentName:"strong"},"PubKey"),":")," The private key associated with this Tendermint/CometBFT ",(0,i.yg)("inlineCode",{parentName:"li"},"PubKey")," is used to sign ",(0,i.yg)("em",{parentName:"li"},"prevotes")," and ",(0,i.yg)("em",{parentName:"li"},"precommits"),"."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Validator's Address:")," Application level address that is used to publicly identify your validator. The private key associated with this address is used to delegate, unbond, claim rewards, and participate in governance."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Validator's name (moniker)")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Validator's website (Optional)")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Validator's description (Optional)")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Initial commission rate"),": The commission rate on block rewards and fees charged to delegators."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Maximum commission:")," The maximum commission rate that this validator can charge. This parameter is fixed and cannot be changed after the ",(0,i.yg)("inlineCode",{parentName:"li"},"create-validator")," transaction is processed."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Commission max change rate:")," The maximum daily increase of the validator commission. This parameter is fixed cannot be changed after the ",(0,i.yg)("inlineCode",{parentName:"li"},"create-validator")," transaction is processed.")),(0,i.yg)("p",null,"After a validator is created, ATOM holders can delegate ATOM to them, effectively adding stake to the validator's pool. The total stake of an address is the combination of ATOM bonded by delegators and ATOM self-bonded by the validator."),(0,i.yg)("p",null,"From all validator candidates that signaled themselves, the 180 validators with the most total stake are the designated ",(0,i.yg)("strong",{parentName:"p"},"validators"),". If a validator's total stake falls below the top 180, then that validator loses its validator privileges. The validator cannot participate in consensus or generate rewards until the stake is high enough to be in the top 180. Over time, the maximum number of validators may be increased via on-chain governance proposal."),(0,i.yg)("h2",{id:"testnet"},"Testnet"),(0,i.yg)("h3",{id:"how-can-i-join-the-testnet"},"How can I join the testnet?"),(0,i.yg)("p",null,"The testnet is a great environment to test your validator setup before launch."),(0,i.yg)("p",null,"Testnet participation is a great way to signal to the community that you are ready and able to operate a validator. For details, see ",(0,i.yg)("a",{parentName:"p",href:"/main/hub-tutorials/join-testnet"},"Join the Public Testnet")," documentation."),(0,i.yg)("h2",{id:"additional-concepts"},"Additional Concepts"),(0,i.yg)("h3",{id:"what-are-the-different-types-of-keys"},"What are the different types of keys?"),(0,i.yg)("p",null,"There are two types of keys:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Tendermint/CometBFT key"),": A unique key that is used to sign consensus votes.",(0,i.yg)("ul",{parentName:"li"},(0,i.yg)("li",{parentName:"ul"},"It is associated with a public key ",(0,i.yg)("inlineCode",{parentName:"li"},"cosmosvalconspub")," (To get this value, run ",(0,i.yg)("inlineCode",{parentName:"li"},"gaiad tendermint show-validator"),")"),(0,i.yg)("li",{parentName:"ul"},"It is generated when the node is created with ",(0,i.yg)("inlineCode",{parentName:"li"},"gaiad init"),"."))),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Application key"),": This key is created from the ",(0,i.yg)("inlineCode",{parentName:"li"},"gaiad")," binary and is used to sign transactions. Application keys are associated with a public key that is prefixed by ",(0,i.yg)("inlineCode",{parentName:"li"},"cosmospub")," and an address that is prefixed by ",(0,i.yg)("inlineCode",{parentName:"li"},"cosmos"),".")),(0,i.yg)("p",null,"The Tendermint/CometBFT key and the application key are derived from account keys that are generated by the ",(0,i.yg)("inlineCode",{parentName:"p"},"gaiad keys add")," command."),(0,i.yg)("p",null,(0,i.yg)("strong",{parentName:"p"},"Note:")," A validator's operator key is directly tied to an application key and uses the ",(0,i.yg)("inlineCode",{parentName:"p"},"cosmosvaloper")," and ",(0,i.yg)("inlineCode",{parentName:"p"},"cosmosvaloperpub")," prefixes that are reserved solely for this purpose."),(0,i.yg)("h3",{id:"what-are-the-different-states-a-validator-can-be-in"},"What are the different states a validator can be in?"),(0,i.yg)("p",null,"After a validator is created with a ",(0,i.yg)("inlineCode",{parentName:"p"},"create-validator")," transaction, the validator is in one of three states:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("p",{parentName:"li"},(0,i.yg)("inlineCode",{parentName:"p"},"in validator set"),": Validator is in the active set and participates in consensus. The validator is earning rewards and can be slashed for misbehavior.")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("p",{parentName:"li"},(0,i.yg)("inlineCode",{parentName:"p"},"jailed"),": Validator misbehaved and is in jail, i.e. outside of the validator set."),(0,i.yg)("ul",{parentName:"li"},(0,i.yg)("li",{parentName:"ul"},"If the jailing is due to being offline for too long (i.e. having missed more than ",(0,i.yg)("inlineCode",{parentName:"li"},"95%")," out of the last ",(0,i.yg)("inlineCode",{parentName:"li"},"10,000")," blocks), the validator can send an ",(0,i.yg)("inlineCode",{parentName:"li"},"unjail")," transaction in order to re-enter the validator set."),(0,i.yg)("li",{parentName:"ul"},"If the jailing is due to double signing, the validator cannot unjail."))),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("p",{parentName:"li"},(0,i.yg)("inlineCode",{parentName:"p"},"unbonded"),": Validator is not in the active set, and therefore not signing blocks. The validator cannot be slashed and does not earn any reward. It is still possible to delegate ATOM to an unbonded validator. Undelegating from an ",(0,i.yg)("inlineCode",{parentName:"p"},"unbonded")," validator is immediate, meaning that the tokens are not subject to the unbonding period."))),(0,i.yg)("h3",{id:"what-is-self-delegation-how-can-i-increase-my-self-delegation"},"What is self-delegation? How can I increase my self-delegation?"),(0,i.yg)("p",null,"Self-delegation is a delegation of ATOM from a validator to themselves. The delegated amount can be increased by sending a ",(0,i.yg)("inlineCode",{parentName:"p"},"delegate")," transaction from your validator's ",(0,i.yg)("inlineCode",{parentName:"p"},"application")," application key."),(0,i.yg)("h3",{id:"what-is-validator-bond-how-can-i-increase-my-validator-bond"},"What is validator bond? How can I increase my validator bond?"),(0,i.yg)("p",null,"Validator bond is a delegation of ATOM from a delegator to a validator. Validator operators can validator bond to themselves. The validator bond amount can be increased by sending a ",(0,i.yg)("inlineCode",{parentName:"p"},"ValidatorBond")," transaction from any account delegated to your validator. Validator bond is required before a validator can accept delegations from liquid staking providers. As such it forces validators to put \u201cskin in the game\u201d in order to be entrusted with delegations from liquid staking providers. This disincentivizes malicious behavior and enables the validator to negotiate its relationship with liquid staking providers."),(0,i.yg)("h3",{id:"is-there-a-minimum-amount-of-atom-that-must-be-delegated-to-be-an-active-bonded-validator"},"Is there a minimum amount of ATOM that must be delegated to be an active (bonded) validator?"),(0,i.yg)("p",null,"The minimum is 1 ATOM. But the network is currently secured by much higher values. You can check the minimum required ATOM to become part of the active validator set on the ",(0,i.yg)("a",{parentName:"p",href:"https://www.mintscan.io/cosmos/validators"},"Mintscan validator page"),"."),(0,i.yg)("h3",{id:"how-do-delegators-choose-their-validators"},"How do delegators choose their validators?"),(0,i.yg)("p",null,"Delegators are free to choose validators according to their own subjective criteria. Selection criteria includes:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Amount of validator-bonded ATOM:")," Number of ATOM a validator validator-bonded to themselves. A validator with a higher amount of self-delegated ATOM indicates that the validator is sharing the risk and consequences for their actions, or has enough goodwill from the community so that others post validator bond on the validator's behalf."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Amount of delegated ATOM:")," Total number of ATOM delegated to a validator. A high voting power shows that the community trusts this validator. Larger validators also decrease the decentralization of the network, so delegators are suggested to consider delegating to smaller validators."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Commission rate:")," Commission applied on revenue by validators before the revenue is distributed to their delegators."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Track record:")," Delegators review the track record of the validators they plan to delegate to. This track record includes past votes on proposals and historical average uptime."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Community contributions:")," Another (more subjective) criteria is the work that validators have contributed to the community, such as educational content, participation in the community channels, contributions to open source software, etc.")),(0,i.yg)("p",null,"Apart from these criteria, validators send a ",(0,i.yg)("inlineCode",{parentName:"p"},"create-validator")," transaction to signal a website address to complete their resume. Validators must build reputation one way or another to attract delegators. For example, a good practice for validators is to have a third party audit their setup. Note though, that the CometBFT team does not approve or conduct any audits themselves. For more information on due diligence, see the ",(0,i.yg)("a",{parentName:"p",href:"https://medium.com/@interchain_io/3d0faf10ce6f"},"A Delegator\u2019s Guide to Staking")," blog post."),(0,i.yg)("h2",{id:"responsibilities"},"Responsibilities"),(0,i.yg)("h3",{id:"do-validators-need-to-be-publicly-identified"},"Do validators need to be publicly identified?"),(0,i.yg)("p",null,"No, they do not. Each delegator can value validators based on their own criteria. Validators are able to register a website address when they nominate themselves so that they can advertise their operation as they see fit. Some delegators prefer a website that clearly displays the team operating the validator and their resume, while other validators might prefer to be anonymous validators with positive track records."),(0,i.yg)("h3",{id:"what-are-the-responsibilities-of-a-validator"},"What are the responsibilities of a validator?"),(0,i.yg)("p",null,"Validators have two main responsibilities:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("p",{parentName:"li"},(0,i.yg)("strong",{parentName:"p"},"Be able to constantly run a correct version of the software:")," Validators must ensure that their servers are always online and their private keys are not compromised.")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("p",{parentName:"li"},(0,i.yg)("strong",{parentName:"p"},"Actively participate in governance:")," Validators are required to vote on every proposal."))),(0,i.yg)("p",null,"Additionally, validators are expected to be active members of the community. Validators must always be up-to-date with the current state of the ecosystem so that they can easily adapt to any change."),(0,i.yg)("h3",{id:"what-does-participate-in-governance-entail"},"What does 'participate in governance' entail?"),(0,i.yg)("p",null,"Validators and delegators on the Cosmos Hub can vote on proposals to change operational parameters (such as the block gas limit), coordinate upgrades, or make a decision on any given matter."),(0,i.yg)("p",null,"Validators play a special role in the governance system. As pillars of the system, validators are required to vote on every proposal. It is especially important since delegators who do not vote inherit the vote of their validator."),(0,i.yg)("h3",{id:"what-does-staking-imply"},"What does staking imply?"),(0,i.yg)("p",null,"Staking ATOM can be thought of as a safety deposit on validation activities. When a validator or a delegator wants to retrieve part or all of their deposit, they send an ",(0,i.yg)("inlineCode",{parentName:"p"},"unbonding")," transaction. Then, ATOM undergoes a ",(0,i.yg)("strong",{parentName:"p"},"3-week unbonding period")," during which they are liable to being slashed for potential misbehaviors committed by the validator before the unbonding process started."),(0,i.yg)("p",null,"Validators, and by association delegators, receive block rewards, fees, and have the right to participate in governance. If a validator misbehaves, a certain portion of their total stake is slashed. This means that every delegator that bonded ATOM to this validator gets penalized in proportion to their bonded stake. Delegators are therefore incentivized to delegate to validators that they anticipate will function safely."),(0,i.yg)("h3",{id:"can-a-validator-run-away-with-their-delegators-atom"},"Can a validator run away with their delegators' ATOM?"),(0,i.yg)("p",null,"By delegating to a validator, a user delegates voting power. The more voting power a validator have, the more weight they have in the consensus and governance processes. This does not mean that the validator has custody of their delegators' ATOM. ",(0,i.yg)("strong",{parentName:"p"},"A validator cannot run away with its delegator's funds"),"."),(0,i.yg)("p",null,"Even though delegated funds cannot be stolen by their validators, delegators' tokens can still be slashed by a small percentage if their validator suffers a ",(0,i.yg)("a",{parentName:"p",href:"#what-are-the-slashing-conditions"},"slashing event"),", which is why we encourage due diligence when ",(0,i.yg)("a",{parentName:"p",href:"#how-do-delegators-choose-their-validators"},"selecting a validator"),"."),(0,i.yg)("h3",{id:"how-often-is-a-validator-chosen-to-propose-the-next-block-does-frequency-increase-with-the-quantity-of-bonded-atom"},"How often is a validator chosen to propose the next block? Does frequency increase with the quantity of bonded ATOM?"),(0,i.yg)("p",null,"The validator that is selected to propose the next block is called the proposer. Each proposer is selected deterministically. The frequency of being chosen is proportional to the voting power (i.e. amount of bonded ATOM) of the validator. For example, if the total bonded stake across all validators is 100 ATOM and a validator's total stake is 10 ATOM, then this validator is the proposer ~10% of the blocks."),(0,i.yg)("h3",{id:"are-validators-of-the-cosmos-hub-required-to-validate-other-zones-in-the-cosmos-ecosystem"},"Are validators of the Cosmos Hub required to validate other zones in the Cosmos ecosystem?"),(0,i.yg)("p",null,"This depends, currently no validators are required to validate other blockchains. But when the first version of ",(0,i.yg)("a",{parentName:"p",href:"https://blog.cosmos.network/interchain-security-is-coming-to-the-cosmos-hub-f144c45fb035"},"Interchain Security")," is launched on the Cosmos Hub, delegators can vote to have certain blockchains secured via Interchain Security. In those cases, validators are required to validate on these chains as well."),(0,i.yg)("h3",{id:"how-can-a-validator-safely-quit-validating-on-the-cosmos-hub"},"How can a validator safely quit validating on the Cosmos Hub?"),(0,i.yg)("p",null,"If a validator simply shuts down their node, this would result in the validator and their delegators getting slashed for being offline. The only way to safely exit a validator node running on the Cosmos Hub is by unbonding the validator with the ",(0,i.yg)("inlineCode",{parentName:"p"},"UnbondValidator")," message. As a result, the validator gets jailed and kicked out of the active set of validators, without getting slashed. They can then proceed to shut down their node without risking their tokens."),(0,i.yg)("p",null,"It's highly advised to inform your delegators when doing this, as they will still be bonded to your validator after it got jailed. They will need to manually unbond and they might not have been made aware of this via their preferred wallet application."),(0,i.yg)("h2",{id:"incentives"},"Incentives"),(0,i.yg)("h3",{id:"what-is-the-incentive-to-stake"},"What is the incentive to stake?"),(0,i.yg)("p",null,"Each member of a validator's staking pool earns different types of revenue:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Block rewards:")," Native tokens of applications (e.g. ATOM on the Cosmos Hub) run by validators are inflated to produce block provisions. These provisions exist to incentivize ATOM holders to bond their stake. Non-bonded ATOM are diluted over time."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Transaction fees:")," The Cosmos Hub maintains an allow list of tokens that are accepted as fee payment. The initial fee token is the ",(0,i.yg)("inlineCode",{parentName:"li"},"atom"),".")),(0,i.yg)("p",null,"This total revenue is divided among validators' staking pools according to each validator's weight. Then, within each validator's staking pool the revenue is divided among delegators in proportion to each delegator's stake. A commission on delegators' revenue is applied by the validator before it is distributed."),(0,i.yg)("h3",{id:"what-is-a-validator-commission"},"What is a validator commission?"),(0,i.yg)("p",null,"Revenue received by a validator's pool is split between the validator and their delegators. The validator can apply a commission on the part of the revenue that goes to their delegators. This commission is set as a percentage. Each validator is free to set their initial commission, maximum daily commission change rate, and maximum commission. The Cosmos Hub enforces the parameter that each validator sets. The maximum commission rate is fixed and cannot be changed. However, the commission rate itself can be changed after the validator is created as long as it does not exceed the maximum commission."),(0,i.yg)("h3",{id:"what-is-the-incentive-to-run-a-validator"},"What is the incentive to run a validator?"),(0,i.yg)("p",null,"Validators earn proportionally more revenue than their delegators because of the commission they take on the staking rewards from their delegators."),(0,i.yg)("p",null,"Validators also play a major role in governance. If a delegator does not vote, they inherit the vote from their validator. This voting inheritance gives validators a major responsibility in the ecosystem."),(0,i.yg)("h3",{id:"how-are-block-rewards-distributed"},"How are block rewards distributed?"),(0,i.yg)("p",null,"Block rewards are distributed proportionally to all validators relative to their voting power. This means that even though each validator gains ATOM with each reward, all validators maintain equal weight over time."),(0,i.yg)("p",null,"For example, 10 validators have equal voting power and a commission rate of 1%. For this example, the reward for a block is 1000 ATOM and each validator has 20% of self-bonded ATOM. These tokens do not go directly to the proposer. Instead, the tokens are evenly spread among validators. So now each validator's pool has 100 ATOM. These 100 ATOM are distributed according to each participant's stake:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},"Commission: ",(0,i.yg)("inlineCode",{parentName:"li"},"100*80%*1% = 0.8 ATOM")),(0,i.yg)("li",{parentName:"ul"},"Validator gets: ",(0,i.yg)("inlineCode",{parentName:"li"},"100\\*20% + Commission = 20.8 ATOM")),(0,i.yg)("li",{parentName:"ul"},"All delegators get: ",(0,i.yg)("inlineCode",{parentName:"li"},"100\\*80% - Commission = 79.2 ATOM"))),(0,i.yg)("p",null,"Then, each delegator can claim their part of the 79.2 ATOM in proportion to their stake in the validator's staking pool."),(0,i.yg)("h3",{id:"how-are-fees-distributed"},"How are fees distributed?"),(0,i.yg)("p",null,"Fees are similarly distributed with the exception that the block proposer can get a bonus on the fees of the block they propose if the proposer includes more than the strict minimum of required precommits."),(0,i.yg)("p",null,"When a validator is selected to propose the next block, the validator must include at least 2/3 precommits of the previous block. However, an incentive to include more than 2/3 precommits is a bonus. The bonus is linear: it ranges from 1% if the proposer includes 2/3rd precommits (minimum for the block to be valid) to 5% if the proposer includes 100% precommits. Of course the proposer must not wait too long or other validators may timeout and move on to the next proposer. As such, validators have to find a balance between wait-time to get the most signatures and risk of losing out on proposing the next block. This mechanism aims to incentivize non-empty block proposals, better networking between validators, and mitigates censorship."),(0,i.yg)("p",null,"For a concrete example to illustrate the aforementioned concept, there are 10 validators with equal stake. Each validator applies a 1% commission rate and has 20% of self-delegated ATOM. Now comes a successful block that collects a total of 1025.51020408 ATOM in fees."),(0,i.yg)("p",null,"First, a 2% tax is applied. The corresponding ATOM go to the reserve pool. The reserve pool's funds can be allocated through governance to fund bounties and upgrades."),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("inlineCode",{parentName:"li"},"2% * 1025.51020408 = 20.51020408")," ATOM go to the reserve pool.")),(0,i.yg)("p",null,"1005 ATOM now remain. For this example, the proposer included 100% of the signatures in its block so the proposer obtains the full bonus of 5%."),(0,i.yg)("p",null,"To solve this simple equation to find the reward R for each validator:"),(0,i.yg)("p",null,(0,i.yg)("inlineCode",{parentName:"p"},"9*R + R + R*5% = 1005 \u21d4 R = 1005/10.05 = 100")),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},"For the proposer validator:",(0,i.yg)("ul",{parentName:"li"},(0,i.yg)("li",{parentName:"ul"},"The pool obtains ",(0,i.yg)("inlineCode",{parentName:"li"},"R + R * 5%"),": 105 ATOM"),(0,i.yg)("li",{parentName:"ul"},"Commission: ",(0,i.yg)("inlineCode",{parentName:"li"},"105 * 80% * 1%")," = 0.84 ATOM"),(0,i.yg)("li",{parentName:"ul"},"Validator's reward: ",(0,i.yg)("inlineCode",{parentName:"li"},"105 * 20% + Commission")," = 21.84 ATOM"),(0,i.yg)("li",{parentName:"ul"},"Delegators' rewards: ",(0,i.yg)("inlineCode",{parentName:"li"},"105 * 80% - Commission")," = 83.16 ATOM (each delegator is able to claim its portion of these rewards in proportion to their stake)"))),(0,i.yg)("li",{parentName:"ul"},"For each non-proposer validator:",(0,i.yg)("ul",{parentName:"li"},(0,i.yg)("li",{parentName:"ul"},"The pool obtains R: 100 ATOM"),(0,i.yg)("li",{parentName:"ul"},"Commission: ",(0,i.yg)("inlineCode",{parentName:"li"},"100 * 80% * 1%")," = 0.8 ATOM"),(0,i.yg)("li",{parentName:"ul"},"Validator's reward: ",(0,i.yg)("inlineCode",{parentName:"li"},"100 * 20% + Commission")," = 20.8 ATOM"),(0,i.yg)("li",{parentName:"ul"},"Delegators' rewards: ",(0,i.yg)("inlineCode",{parentName:"li"},"100 * 80% - Commission")," = 79.2 ATOM (each delegator is able to claim their portion of these rewards in proportion to their stake)")))),(0,i.yg)("h3",{id:"what-are-the-slashing-conditions"},"What are the slashing conditions?"),(0,i.yg)("p",null,"If a validator misbehaves, their delegated stake is partially slashed. Two faults can result in slashing of funds for a validator and their delegators:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Double signing:")," If someone reports on chain A that a validator signed two blocks at the same height on chain A and chain B, and if chain A and chain B share a common ancestor, then this validator gets slashed by 5% on chain A."),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("strong",{parentName:"li"},"Downtime:")," If a validator misses more than ",(0,i.yg)("inlineCode",{parentName:"li"},"95%")," of the last ",(0,i.yg)("inlineCode",{parentName:"li"},"10,000")," blocks (roughly ~19 hours), they are slashed by 0.01%.")),(0,i.yg)("h3",{id:"are-validators-required-to-self-delegate-atom"},"Are validators required to self-delegate ATOM?"),(0,i.yg)("p",null,"No, they do not need to self-delegate. Even though there is no obligation for validators to self-delegate, delegators may want their validator to have self-delegated ATOM in their staking pool. In other words, validators share the risk."),(0,i.yg)("p",null,"Note however that it's possible that some validators decide to self-delegate via a different address for security reasons."),(0,i.yg)("h3",{id:"how-to-prevent-concentration-of-stake-in-the-hands-of-a-few-top-validators"},"How to prevent concentration of stake in the hands of a few top validators?"),(0,i.yg)("p",null,"The community is expected to behave in a smart and self-preserving way. When a mining pool in Bitcoin gets too much mining power the community usually stops contributing to that pool. The Cosmos Hub relies on the same effect. Additionally, when delegators switch to another validator, they are not subject to the unbonding period, which removes any barrier to quickly redelegating tokens in service of improving decentralization."),(0,i.yg)("h2",{id:"liquid-staking-module"},"Liquid Staking Module"),(0,i.yg)("h3",{id:"what-is-the-liquid-staking-module"},"What is the liquid staking module?"),(0,i.yg)("p",null,"The Liquid Staking Module is a set of safety features that mitigate liquid staking risks by: "),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},"limiting the total amount of tokens that can be liquid staked to X% of all staked tokens."),(0,i.yg)("li",{parentName:"ul"},"introducing a requirement that validators validator-bond tokens to be eligible for delegations from liquid staking providers."),(0,i.yg)("li",{parentName:"ul"},"limiting the portion of validators's shares that can be liquid staked to X% of their total shares.")),(0,i.yg)("p",null,"The Liquid Staking Module also improves liquid staking UX by making delegations transferable under limited scenarios, to allow delegators to convert their delegations into liquid staking positions without having to wait the unbonding period."),(0,i.yg)("p",null,"For a detailed and technical description, please see ADR-061 in the Cosmos SDK or the Liquid Staking Module Cosmos Hub ",(0,i.yg)("a",{parentName:"p",href:"https://forum.cosmos.network/t/signaling-proposal-draft-add-liquid-staking-module-to-the-cosmos-hub/10368"},"forum post"),"."),(0,i.yg)("h3",{id:"who-can-validator-bond"},"Who can validator bond?"),(0,i.yg)("p",null,"The validator themselves, but also any other address delegated to the validator."),(0,i.yg)("h3",{id:"how-can-i-validator-bond"},"How can I validator bond?"),(0,i.yg)("p",null,"Once delegated to a validator, a delegator (or validator operator) can convert their delegation to a validator into Validator Bond by signing a ValidatorBond message. "),(0,i.yg)("p",null,"The ValidatorBond message is exposed by the staking module and can be executed as follows:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre"},"gaiad tx staking validator-bond cosmosvaloper13h5xdxhsdaugwdrkusf8lkgu406h8t62jkqv3h <delegator> --from mykey \n")),(0,i.yg)("p",null,"There are no partial Validator Bonds: when a delegator or validator converts their shares to a particular validator into Validator Bond, their entire delegation to that validator is converted to Validator Bond. If a validator or delegator wishes to convert only some of their delegation to Validator Bond, they should transfer those funds to a separate address and Validator Bond from that address, or redelegate the funds that they do not wish to validator bond to another validator before converting their delegation to validator bond."),(0,i.yg)("p",null,"To convert Validator Bond back into a standard delegation, simply unbond the shares."),(0,i.yg)("h3",{id:"how-does-a-delegator-or-validator-mark-their-delegation-as-a-validator-bond"},"How does a delegator or validator mark their delegation as a validator bond?"),(0,i.yg)("p",null,"Once delegated to a validator, sign a ",(0,i.yg)("inlineCode",{parentName:"p"},"ValidatorBond")," message. "),(0,i.yg)("h3",{id:"are-validator-bonds-subject-to-additional-slashing-conditions"},"Are validator bonds subject to additional slashing conditions?"),(0,i.yg)("p",null,"No, in the event of a slash, a validator bond is slashed at the same rate as a regular bond."),(0,i.yg)("h3",{id:"can-i-unbond-my-validator-bond"},"Can I unbond my validator bond?"),(0,i.yg)("p",null,"If all the liquid staking capacity made available by a validator\u2019s validator bond is utilized, validator bond delegated to that validator cannot be unbonded. If new capacity becomes available (either by redemption of liquid staking tokens or addition or new validator bond), then existing validator bond can be undelegated."),(0,i.yg)("p",null,"Example: Suppose the validator bond factor is 250 and Validator V bonds 2 ATOM, then liquid staking providers delegate 500 ATOM to Validator V. Now Validator V cannot remove any of their validator bond because the full liquid staking capacity made available by Validator V\u2019s validator bond is consumed."),(0,i.yg)("p",null,"If liquid staking providers undelegate 250 ATOM from Validator V, Validator V can now remove 1 ATOM of validator bond."),(0,i.yg)("p",null,"If, instead, the ICF or a community member validator bonds 1 additional ATOM to Validator V, Validator V can now remove 1 ATOM of validator bond."),(0,i.yg)("h3",{id:"can-i-validator-bond-some-of-my-tokens-and-delegate-the-remaining-portion-normally"},"Can I validator bond some of my tokens and delegate the remaining portion normally?"),(0,i.yg)("p",null,"The ",(0,i.yg)("inlineCode",{parentName:"p"},"ValidatorBond")," message converts the full balance delegated to a validator into validator bond. To validator bond some tokens and delegate the remaining portion normally, use two addresses: the first will delegate + ValidatorBond, and the second will just delegate."),(0,i.yg)("h2",{id:"technical-requirements"},"Technical Requirements"),(0,i.yg)("h3",{id:"what-are-hardware-requirements"},"What are hardware requirements?"),(0,i.yg)("p",null,"A modest level of hardware specifications is initially required and rises as network use increases. Participating in the testnet is the best way to learn more. You can find the current hardware recommendations in the ",(0,i.yg)("a",{parentName:"p",href:"/main/hub-tutorials/join-mainnet"},"Joining Mainnet documentation"),"."),(0,i.yg)("p",null,"Validators are recommended to set up ",(0,i.yg)("a",{parentName:"p",href:"https://docs.cometbft.com/v0.37/core/validators"},"sentry nodes")," to protect your validator node from DDoS attacks."),(0,i.yg)("h3",{id:"what-are-software-requirements"},"What are software requirements?"),(0,i.yg)("p",null,"In addition to running a Cosmos Hub node, validators are expected to implement monitoring, alerting, and management solutions. There are ",(0,i.yg)("a",{parentName:"p",href:"https://medium.com/solar-labs-team/cosmos-how-to-monitoring-your-validator-892a46298722"},"several tools")," that you can use."),(0,i.yg)("h3",{id:"what-are-bandwidth-requirements"},"What are bandwidth requirements?"),(0,i.yg)("p",null,"The Cosmos network has the capacity for very high throughput relative to chains like Ethereum or Bitcoin."),(0,i.yg)("p",null,"We recommend that the data center nodes connect only to trusted full nodes in the cloud or other validators that know each other socially. This connection strategy relieves the data center node from the burden of mitigating denial-of-service attacks."),(0,i.yg)("p",null,"Ultimately, as the network becomes more heavily used, multigigabyte per day bandwidth is very realistic."),(0,i.yg)("h3",{id:"how-to-handle-key-management"},"How to handle key management?"),(0,i.yg)("p",null,"Validators are expected to run an HSM that supports ed25519 keys. Here are potential options:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},"YubiHSM 2"),(0,i.yg)("li",{parentName:"ul"},"Ledger Nano S"),(0,i.yg)("li",{parentName:"ul"},"Ledger BOLOS SGX enclave"),(0,i.yg)("li",{parentName:"ul"},"Thales nShield support")),(0,i.yg)("p",null,"The Interchain Foundation does not recommend one solution above the other. The community is encouraged to bolster the effort to improve HSMs and the security of key management."),(0,i.yg)("h3",{id:"what-can-validators-expect-in-terms-of-operations"},"What can validators expect in terms of operations?"),(0,i.yg)("p",null,"Running an effective operation is key to avoiding unexpected unbonding or slashing. Operations must be able to respond to attacks and outages, as well as maintain security and isolation in the data center."),(0,i.yg)("h3",{id:"what-are-the-maintenance-requirements"},"What are the maintenance requirements?"),(0,i.yg)("p",null,"Validators are expected to perform regular software updates to accommodate chain upgrades and bug fixes. It is suggested to consider using ",(0,i.yg)("a",{parentName:"p",href:"https://docs.cosmos.network/v0.45/run-node/cosmovisor.html"},"Cosmovisor")," to partially automate this process."),(0,i.yg)("p",null,"During an chain upgrade, progress is discussed in a private channel in the ",(0,i.yg)("a",{parentName:"p",href:"https://discord.gg/interchain"},"Interchain Discord"),". If your validator is in the active set we encourage you to request access to that channel by contacting a moderator."),(0,i.yg)("h3",{id:"how-can-validators-protect-themselves-from-denial-of-service-attacks"},"How can validators protect themselves from denial-of-service attacks?"),(0,i.yg)("p",null,"Denial-of-service attacks occur when an attacker sends a flood of internet traffic to an IP address to prevent the server at the IP address from connecting to the internet."),(0,i.yg)("p",null,"An attacker scans the network, tries to learn the IP address of various validator nodes, and disconnects them from communication by flooding them with traffic."),(0,i.yg)("p",null,"One recommended way to mitigate these risks is for validators to carefully structure their network topology using a sentry node architecture."),(0,i.yg)("p",null,"Validator nodes are expected to connect only to full nodes they trust because they operate the full nodes themselves or the trust full nodes are run by other validators they know socially. A validator node is typically run in a data center. Most data centers provide direct links to the networks of major cloud providers. The validator can use those links to connect to sentry nodes in the cloud. This mitigation shifts the burden of denial-of-service from the validator's node directly to its sentry nodes, and can require that new sentry nodes are spun up or activated to mitigate attacks on existing ones."),(0,i.yg)("p",null,"Sentry nodes can be quickly spun up or change their IP addresses. Because the links to the sentry nodes are in private IP space, an internet-based attack cannot disturb them directly. This strategy ensures that validator block proposals and votes have a much higher chance to make it to the rest of the network."),(0,i.yg)("p",null,"For more sentry node details, see the ",(0,i.yg)("a",{parentName:"p",href:"https://docs.cometbft.com/v0.37/core/validators"},"CometBFT Documentation")," or the ",(0,i.yg)("a",{parentName:"p",href:"https://forum.cosmos.network/t/sentry-node-architecture-overview/454"},"Sentry Node Architecture Overview")," on the forum."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/edd0fe92.15df109d.js b/assets/js/edd0fe92.15df109d.js new file mode 100644 index 00000000000..35d97838022 --- /dev/null +++ b/assets/js/edd0fe92.15df109d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[7870],{5680:(e,r,t)=>{t.d(r,{xA:()=>c,yg:()=>u});var n=t(6540);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function p(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?o(Object(t),!0).forEach((function(r){a(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function i(e,r){if(null==e)return{};var t,n,a=function(e,r){if(null==e)return{};var t,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)t=o[n],r.indexOf(t)>=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)t=o[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=n.createContext({}),l=function(e){var r=n.useContext(s),t=r;return e&&(t="function"==typeof e?e(r):p(p({},r),e)),t},c=function(e){var r=l(e.components);return n.createElement(s.Provider,{value:r},e.children)},g="mdxType",m={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},y=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),g=l(t),y=a,u=g["".concat(s,".").concat(y)]||g[y]||m[y]||o;return t?n.createElement(u,p(p({ref:r},c),{},{components:t})):n.createElement(u,p({ref:r},c))}));function u(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var o=t.length,p=new Array(o);p[0]=y;var i={};for(var s in r)hasOwnProperty.call(r,s)&&(i[s]=r[s]);i.originalType=e,i[g]="string"==typeof e?e:a,p[1]=i;for(var l=2;l<o;l++)p[l]=t[l];return n.createElement.apply(null,p)}return n.createElement.apply(null,t)}y.displayName="MDXCreateElement"},538:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>s,contentTitle:()=>p,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var n=t(8168),a=(t(6540),t(5680));const o={order:1,parent:{order:6}},p="Proposal Types",i={unversionedId:"governance/proposal-types/README",id:"governance/proposal-types/README",title:"Proposal Types",description:"- Text",source:"@site/docs/governance/proposal-types/README.md",sourceDirName:"governance/proposal-types",slug:"/governance/proposal-types/",permalink:"/main/governance/proposal-types/",draft:!1,tags:[],version:"current",frontMatter:{order:1,parent:{order:6}},sidebar:"tutorialSidebar",previous:{title:"Governance Overview",permalink:"/main/governance/"},next:{title:"Community Pool Spend",permalink:"/main/governance/proposal-types/community-pool-spend"}},s={},l=[{value:"Drafting a Proposal",id:"drafting-a-proposal",level:2}],c={toc:l},g="wrapper";function m(e){let{components:r,...t}=e;return(0,a.yg)(g,(0,n.A)({},c,t,{components:r,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"proposal-types"},"Proposal Types"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/governance/proposal-types/text-prop"},(0,a.yg)("strong",{parentName:"a"},"Text"))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/governance/proposal-types/community-pool-spend"},(0,a.yg)("strong",{parentName:"a"},"Community Pool Spend"))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/governance/proposal-types/param-change"},(0,a.yg)("strong",{parentName:"a"},"Parameter Change"))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/main/governance/proposal-types/software-upgrade"},(0,a.yg)("strong",{parentName:"a"},"Software Upgrade"))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"IBC Client Update"))),(0,a.yg)("h2",{id:"drafting-a-proposal"},"Drafting a Proposal"),(0,a.yg)("p",null,"Drafting and submitting a proposal is a process that takes time, attention, and involves risk. The objective of this documentation is to make this process easier by preparing participants for what to pay attention to, the information that should be considered in a proposal, and how to reduce the risk of losing deposits. "),(0,a.yg)("p",null,"Ideally, a proposal should only fail to pass because voters are aware, engaged, and have made an informed decision to vote down the proposal. "),(0,a.yg)("p",null,"If you are considering drafting a proposal, you should first review the general background on drafting and submitting a proposal:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("a",{parentName:"li",href:"/main/governance/process"},"How the voting process and governance mechanism works")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("a",{parentName:"li",href:"/main/governance/best-practices"},"How to draft your proposal and engage with the Cosmos community about it")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("a",{parentName:"li",href:"/main/governance/formatting"},"How to format proposals")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("a",{parentName:"li",href:"/main/governance/submitting"},"How to submit your proposal"))),(0,a.yg)("p",null,"You should also review details specific to each kind of proposal, listed in this section."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/efb78e80.cc101548.js b/assets/js/efb78e80.cc101548.js new file mode 100644 index 00000000000..2d64fe7b85c --- /dev/null +++ b/assets/js/efb78e80.cc101548.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[253],{5680:(e,a,t)=>{t.d(a,{xA:()=>c,yg:()=>h});var r=t(6540);function n(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function o(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);a&&(r=r.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var a=1;a<arguments.length;a++){var t=null!=arguments[a]?arguments[a]:{};a%2?o(Object(t),!0).forEach((function(a){n(e,a,t[a])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(t,a))}))}return e}function s(e,a){if(null==e)return{};var t,r,n=function(e,a){if(null==e)return{};var t,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)t=o[r],a.indexOf(t)>=0||(n[t]=e[t]);return n}(e,a);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)t=o[r],a.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}var p=r.createContext({}),l=function(e){var a=r.useContext(p),t=a;return e&&(t="function"==typeof e?e(a):i(i({},a),e)),t},c=function(e){var a=l(e.components);return r.createElement(p.Provider,{value:a},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var a=e.children;return r.createElement(r.Fragment,{},a)}},g=r.forwardRef((function(e,a){var t=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),m=l(t),g=n,h=m["".concat(p,".").concat(g)]||m[g]||u[g]||o;return t?r.createElement(h,i(i({ref:a},c),{},{components:t})):r.createElement(h,i({ref:a},c))}));function h(e,a){var t=arguments,n=a&&a.mdxType;if("string"==typeof e||n){var o=t.length,i=new Array(o);i[0]=g;var s={};for(var p in a)hasOwnProperty.call(a,p)&&(s[p]=a[p]);s.originalType=e,s[m]="string"==typeof e?e:n,i[1]=s;for(var l=2;l<o;l++)i[l]=t[l];return r.createElement.apply(null,i)}return r.createElement.apply(null,t)}g.displayName="MDXCreateElement"},4412:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var r=t(8168),n=(t(6540),t(5680));const o={title:"Parameter Changes",order:4},i=void 0,s={unversionedId:"governance/proposal-types/param-change",id:"governance/proposal-types/param-change",title:"Parameter Changes",description:"This documentation aims to provide guidelines for creating and assessing parameter-change proposals.",source:"@site/docs/governance/proposal-types/param-change.md",sourceDirName:"governance/proposal-types",slug:"/governance/proposal-types/param-change",permalink:"/main/governance/proposal-types/param-change",draft:!1,tags:[],version:"current",frontMatter:{title:"Parameter Changes",order:4},sidebar:"tutorialSidebar",previous:{title:"Community Pool Spend",permalink:"/main/governance/proposal-types/community-pool-spend"},next:{title:"Software Upgrade",permalink:"/main/governance/proposal-types/software-upgrade"}},p={},l=[{value:"What parameters can be changed?",id:"what-parameters-can-be-changed",level:2},{value:"What are the current parameter values?",id:"what-are-the-current-parameter-values",level:2},{value:"Why create a parameter change proposal?",id:"why-create-a-parameter-change-proposal",level:2},{value:"Risks in parameter change proposals",id:"risks-in-parameter-change-proposals",level:2}],c={toc:l},m="wrapper";function u(e){let{components:a,...t}=e;return(0,n.yg)(m,(0,r.A)({},c,t,{components:a,mdxType:"MDXLayout"}),(0,n.yg)("p",null,"This documentation aims to provide guidelines for creating and assessing parameter-change proposals."),(0,n.yg)("p",null,"Drafting and submitting a parameter-change governance proposal involves two kinds of risk: losing proposal deposit amounts and the potential to alter the function of the Cosmos Hub network in an undesirable way. "),(0,n.yg)("h2",{id:"what-parameters-can-be-changed"},"What parameters can be changed?"),(0,n.yg)("p",null,"The complete parameters of the Cosmos Hub are split up into different modules, each of which has its own set of parameters. Most parameters can be updated by submitting a governance proposal."),(0,n.yg)("p",null,"List of modules whose parameters can be changed via governance:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"x/auth"),(0,n.yg)("li",{parentName:"ul"},"x/bank"),(0,n.yg)("li",{parentName:"ul"},"x/distribution"),(0,n.yg)("li",{parentName:"ul"},"x/evidence"),(0,n.yg)("li",{parentName:"ul"},"x/feegrant"),(0,n.yg)("li",{parentName:"ul"},"x/gov"),(0,n.yg)("li",{parentName:"ul"},"x/mint"),(0,n.yg)("li",{parentName:"ul"},"x/slashing"),(0,n.yg)("li",{parentName:"ul"},"x/staking"),(0,n.yg)("li",{parentName:"ul"},"ibc-go/transfer"),(0,n.yg)("li",{parentName:"ul"},"interchain-security/provider")),(0,n.yg)("p",null,"Each cosmos-sdk module uses ",(0,n.yg)("inlineCode",{parentName:"p"},"MsgUpdateParams")," for providing parameter changes. You can learn more about it in the cosmos-sdk documentation of each module (e.g. ",(0,n.yg)("a",{parentName:"p",href:"https://docs.cosmos.network/v0.47/build/modules/staking#msgupdateparams"},"https://docs.cosmos.network/v0.47/build/modules/staking#msgupdateparams"),")"),(0,n.yg)("h2",{id:"what-are-the-current-parameter-values"},"What are the current parameter values?"),(0,n.yg)("p",null,"There are ways to query the current settings for each module's parameter(s). Some can be queried with the command line program ",(0,n.yg)("a",{parentName:"p",href:"../../getting-started/installation"},(0,n.yg)("inlineCode",{parentName:"a"},"gaiad")),"."),(0,n.yg)("p",null,"You can begin by using the command ",(0,n.yg)("inlineCode",{parentName:"p"},"gaiad q [module] -h")," to get help about the subcommands for the module you want to query. For example, ",(0,n.yg)("inlineCode",{parentName:"p"},"gaiad q staking params")," returns the settings of relevant parameters:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-sh"},"bond_denom: uatom\nhistorical_entries: 10000\nmax_entries: 7\nmax_validators: 180\nunbonding_time: 1814400s\n")),(0,n.yg)("p",null,"If a parameter-change proposal is successful, the change takes effect immediately upon completion of the voting period."),(0,n.yg)("p",null,(0,n.yg)("strong",{parentName:"p"},"Note:")," You cannot currently query the ",(0,n.yg)("inlineCode",{parentName:"p"},"bank")," module's parameter, which is ",(0,n.yg)("inlineCode",{parentName:"p"},"sendenabled"),". You also cannot query the ",(0,n.yg)("inlineCode",{parentName:"p"},"crisis")," module's parameters."),(0,n.yg)("h2",{id:"why-create-a-parameter-change-proposal"},"Why create a parameter change proposal?"),(0,n.yg)("p",null,"Parameters are what govern many aspects of the chain's behaviour. As circumstances and attitudes change, sometimes you might want to change a parameter to bring the chain's behaviour in line with community opinion. For example, the Cosmos Hub launched with 100 active validators and there have been 4 proposals to date that have increased the ",(0,n.yg)("inlineCode",{parentName:"p"},"MaxValidators")," parameter. At the time of writing, the active set contains 180 validators."),(0,n.yg)("p",null,"The Cosmos Hub has been viewed as a slow-moving, highly secure chain and that is reflected in some of its other parameters, such as a 21 day unbonding period and 14 day voting period. These are quite long compared to other chains in the Cosmos Ecosystem"),(0,n.yg)("h2",{id:"risks-in-parameter-change-proposals"},"Risks in parameter change proposals"),(0,n.yg)("p",null,"Because parameters dictate some of the ways in which the chain operates, changing them can have an impact beyond what is immediately obvious. "),(0,n.yg)("p",null,"For example, reducing the unbonding period might seem like the only effect is in how quickly delegators can liquidate their assets. It might also have a much greater impact on the overall security of the network that would be hard to realize at first glance."),(0,n.yg)("p",null,"This is one of the reasons that having a thorough discussion before going on-chain is so important - talking through the impacts of a proposal is a great way to avoid unintended effects."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f165f987.176e879b.js b/assets/js/f165f987.176e879b.js new file mode 100644 index 00000000000..b52dcbbc473 --- /dev/null +++ b/assets/js/f165f987.176e879b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[9743],{5680:(e,o,n)=>{n.d(o,{xA:()=>u,yg:()=>y});var t=n(6540);function a(e,o,n){return o in e?Object.defineProperty(e,o,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[o]=n,e}function r(e,o){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);o&&(t=t.filter((function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable}))),n.push.apply(n,t)}return n}function i(e){for(var o=1;o<arguments.length;o++){var n=null!=arguments[o]?arguments[o]:{};o%2?r(Object(n),!0).forEach((function(o){a(e,o,n[o])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(o){Object.defineProperty(e,o,Object.getOwnPropertyDescriptor(n,o))}))}return e}function s(e,o){if(null==e)return{};var n,t,a=function(e,o){if(null==e)return{};var n,t,a={},r=Object.keys(e);for(t=0;t<r.length;t++)n=r[t],o.indexOf(n)>=0||(a[n]=e[n]);return a}(e,o);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(t=0;t<r.length;t++)n=r[t],o.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=t.createContext({}),p=function(e){var o=t.useContext(l),n=o;return e&&(n="function"==typeof e?e(o):i(i({},o),e)),n},u=function(e){var o=p(e.components);return t.createElement(l.Provider,{value:o},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var o=e.children;return t.createElement(t.Fragment,{},o)}},c=t.forwardRef((function(e,o){var n=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),m=p(n),c=a,y=m["".concat(l,".").concat(c)]||m[c]||d[c]||r;return n?t.createElement(y,i(i({ref:o},u),{},{components:n})):t.createElement(y,i({ref:o},u))}));function y(e,o){var n=arguments,a=o&&o.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=c;var s={};for(var l in o)hasOwnProperty.call(o,l)&&(s[l]=o[l]);s.originalType=e,s[m]="string"==typeof e?e:a,i[1]=s;for(var p=2;p<r;p++)i[p]=n[p];return t.createElement.apply(null,i)}return t.createElement.apply(null,n)}c.displayName="MDXCreateElement"},6187:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var t=n(8168),a=(n(6540),n(5680));const r={order:3,parent:{order:1}},i="Community Pool Spend",s={unversionedId:"governance/proposal-types/community-pool-spend",id:"governance/proposal-types/community-pool-spend",title:"Community Pool Spend",description:"Cosmos Hub launched with community-spend capabilities on December 11, 2019, effectively unlocking the potential for token-holders to vote to approve spending from the Community Pool.",source:"@site/docs/governance/proposal-types/community-pool-spend.md",sourceDirName:"governance/proposal-types",slug:"/governance/proposal-types/community-pool-spend",permalink:"/main/governance/proposal-types/community-pool-spend",draft:!1,tags:[],version:"current",frontMatter:{order:3,parent:{order:1}},sidebar:"tutorialSidebar",previous:{title:"Proposal Types",permalink:"/main/governance/proposal-types/"},next:{title:"Parameter Changes",permalink:"/main/governance/proposal-types/param-change"}},l={},p=[{value:"Learn About the Community Pool",id:"learn-about-the-community-pool",level:2},{value:"How is the Community Pool funded?",id:"how-is-the-community-pool-funded",level:3},{value:"How can funding for the Community Pool change?",id:"how-can-funding-for-the-community-pool-change",level:3},{value:"How much money is in the Community Pool?",id:"how-much-money-is-in-the-community-pool",level:3},{value:"How can funds from the Community Pool be spent?",id:"how-can-funds-from-the-community-pool-be-spent",level:3},{value:"How should funds from the Community Pool be spent?",id:"how-should-funds-from-the-community-pool-be-spent",level:3},{value:"How are funds disbursed after a community-spend proposal is passed?",id:"how-are-funds-disbursed-after-a-community-spend-proposal-is-passed",level:3},{value:"Why create a proposal to use Community Pool funds?",id:"why-create-a-proposal-to-use-community-pool-funds",level:2}],u={toc:p},m="wrapper";function d(e){let{components:o,...n}=e;return(0,a.yg)(m,(0,t.A)({},u,n,{components:o,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"community-pool-spend"},"Community Pool Spend"),(0,a.yg)("p",null,"Cosmos Hub launched with community-spend capabilities on December 11, 2019, effectively unlocking the potential for token-holders to vote to approve spending from the Community Pool."),(0,a.yg)("p",null,"\ud83c\uddea\ud83c\uddf8 Esta p\xe1gina tambi\xe9n est\xe1 ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/raquetelio/CosmosCommunitySpend/blob/master/README%5BES_es%5D.md"},"disponible en espa\xf1ol"),"."),(0,a.yg)("h2",{id:"learn-about-the-community-pool"},"Learn About the Community Pool"),(0,a.yg)("h3",{id:"how-is-the-community-pool-funded"},"How is the Community Pool funded?"),(0,a.yg)("p",null,"2% of all staking rewards generated (via block rewards & transaction fees) are continually transferred to and accrue within the Community Pool. For example, from Dec 19, 2019 until Jan 20, 2020 (32 days), 28,726 ATOM were generated and added to the pool."),(0,a.yg)("h3",{id:"how-can-funding-for-the-community-pool-change"},"How can funding for the Community Pool change?"),(0,a.yg)("p",null,"Though the rate of funding is currently fixed at 2% of staking rewards, the effective rate is dependent upon the Cosmos Hub's staking rewards, which can change with inflation and block times."),(0,a.yg)("p",null,"The current parameter ",(0,a.yg)("inlineCode",{parentName:"p"},"Community Tax")," parameter of 2% may be modified with a governance proposal and enacted immediately after the proposal passes."),(0,a.yg)("h3",{id:"how-much-money-is-in-the-community-pool"},"How much money is in the Community Pool?"),(0,a.yg)("p",null,"You may directly query the Cosmos Hub 4 for the balance of the Community Pool:"),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"gaiad q distribution community-pool --chain-id cosmoshub-4 --node <rpc-node-address> ")),(0,a.yg)("p",null,"Alternatively, popular Cosmos explorers such as ",(0,a.yg)("a",{parentName:"p",href:"https://cosmos.bigdipper.live"},"Big Dipper")," and ",(0,a.yg)("a",{parentName:"p",href:"https://www.mintscan.io/cosmos"},"Mintscan")," display the ongoing Community Pool balance."),(0,a.yg)("h3",{id:"how-can-funds-from-the-community-pool-be-spent"},"How can funds from the Community Pool be spent?"),(0,a.yg)("p",null,"Funds from the Cosmos Community Pool may be spent via successful governance proposal."),(0,a.yg)("h3",{id:"how-should-funds-from-the-community-pool-be-spent"},"How should funds from the Community Pool be spent?"),(0,a.yg)("p",null,"We don't know \ud83e\udd37"),(0,a.yg)("p",null,"The prevailing assumption is that funds should be spent in a way that brings value to the Cosmos Hub. However, there is debate about how to keep the fund sustainable. There is also some debate about who should receive funding. For example, part of the community believes that the funds should only be used for those who need funding most. Other topics of concern include:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"retroactive grants"),(0,a.yg)("li",{parentName:"ul"},"price negotiation"),(0,a.yg)("li",{parentName:"ul"},"fund disbursal (eg. payments in stages; payments pegged to reduce volatility)"),(0,a.yg)("li",{parentName:"ul"},"radical overhaul of how the community-spend mechanism functions")),(0,a.yg)("p",null,"We can expect this to take shape as proposals are discussed, accepted, and rejected by the Cosmos Hub community."),(0,a.yg)("h3",{id:"how-are-funds-disbursed-after-a-community-spend-proposal-is-passed"},"How are funds disbursed after a community-spend proposal is passed?"),(0,a.yg)("p",null,"If a community-spend proposal passes successfully, the number of ATOM encoded in the proposal will be transferred from the community pool to the address encoded in the proposal, and this will happen immediately after the voting period ends."),(0,a.yg)("h2",{id:"why-create-a-proposal-to-use-community-pool-funds"},"Why create a proposal to use Community Pool funds?"),(0,a.yg)("p",null,"There are other funding options, most notably the Interchain Foundation's grant program. Why create a community-spend proposal?"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"As a strategy: you can do both.")," You can submit your proposal to the Interchain Foundation, but also consider submitting your proposal publicly on-chain. If the Hub votes in favour, you can withdraw your Interchain Foundation application."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"As a strategy: funding is fast.")," Besides the time it takes to push your proposal on-chain, the only other limiting factor is a fixed 14-day voting period. As soon as the proposal passes, your account will be credited the full amount of your proposal request."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"To build rapport.")," Engaging publicly with the community is the opportunity to develop relationships with stakeholders and to educate them about the importance of your work. Unforeseen partnerships could arise, and overall the community may value your work more if they are involved as stakeholders."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"To be more independent.")," The Interchain Foundation (ICF) may not always be able to fund work. Having a more consistently funded source and having a report with its stakeholders means you can use your rapport to have confidence in your ability to secure funding without having to be dependent upon the ICF alone."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f2660785.03184e19.js b/assets/js/f2660785.03184e19.js new file mode 100644 index 00000000000..a4e5668d910 --- /dev/null +++ b/assets/js/f2660785.03184e19.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[9737],{5680:(e,a,r)=>{r.d(a,{xA:()=>l,yg:()=>m});var t=r(6540);function n(e,a,r){return a in e?Object.defineProperty(e,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[a]=r,e}function o(e,a){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),r.push.apply(r,t)}return r}function s(e){for(var a=1;a<arguments.length;a++){var r=null!=arguments[a]?arguments[a]:{};a%2?o(Object(r),!0).forEach((function(a){n(e,a,r[a])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(r,a))}))}return e}function i(e,a){if(null==e)return{};var r,t,n=function(e,a){if(null==e)return{};var r,t,n={},o=Object.keys(e);for(t=0;t<o.length;t++)r=o[t],a.indexOf(r)>=0||(n[r]=e[r]);return n}(e,a);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(t=0;t<o.length;t++)r=o[t],a.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=t.createContext({}),d=function(e){var a=t.useContext(p),r=a;return e&&(r="function"==typeof e?e(a):s(s({},a),e)),r},l=function(e){var a=d(e.components);return t.createElement(p.Provider,{value:a},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},g=t.forwardRef((function(e,a){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),u=d(r),g=n,m=u["".concat(p,".").concat(g)]||u[g]||c[g]||o;return r?t.createElement(m,s(s({ref:a},l),{},{components:r})):t.createElement(m,s({ref:a},l))}));function m(e,a){var r=arguments,n=a&&a.mdxType;if("string"==typeof e||n){var o=r.length,s=new Array(o);s[0]=g;var i={};for(var p in a)hasOwnProperty.call(a,p)&&(i[p]=a[p]);i.originalType=e,i[u]="string"==typeof e?e:n,s[1]=i;for(var d=2;d<o;d++)s[d]=r[d];return t.createElement.apply(null,s)}return t.createElement.apply(null,r)}g.displayName="MDXCreateElement"},9812:(e,a,r)=>{r.r(a),r.d(a,{assets:()=>p,contentTitle:()=>s,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var t=r(8168),n=(r(6540),r(5680));const o={order:2,parent:{order:2}},s="Software Upgrade",i={unversionedId:"governance/proposal-types/software-upgrade",id:"governance/proposal-types/software-upgrade",title:"Software Upgrade",description:"Software upgrade proposals are submitted to signal that a Cosmos Hub release with new features, bugfixes and various other improvements is available and ready for production deployment.",source:"@site/docs/governance/proposal-types/software-upgrade.md",sourceDirName:"governance/proposal-types",slug:"/governance/proposal-types/software-upgrade",permalink:"/main/governance/proposal-types/software-upgrade",draft:!1,tags:[],version:"current",frontMatter:{order:2,parent:{order:2}},sidebar:"tutorialSidebar",previous:{title:"Parameter Changes",permalink:"/main/governance/proposal-types/param-change"},next:{title:"Text (Signaling)",permalink:"/main/governance/proposal-types/text-prop"}},p={},d=[{value:"Procedure",id:"procedure",level:2},{value:"Using x/upgrading",id:"using-xupgrading",level:2},{value:"Additional information",id:"additional-information",level:2}],l={toc:d},u="wrapper";function c(e){let{components:a,...r}=e;return(0,n.yg)(u,(0,t.A)({},l,r,{components:a,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"software-upgrade"},"Software Upgrade"),(0,n.yg)("p",null,"Software upgrade proposals are submitted to signal that a Cosmos Hub release with new features, bugfixes and various other improvements is available and ready for production deployment."),(0,n.yg)("p",null,"Software upgrade proposals should be submitted by the development teams tasked with stewarding the Cosmos Hub development."),(0,n.yg)("h2",{id:"procedure"},"Procedure"),(0,n.yg)("p",null,"Use ",(0,n.yg)("inlineCode",{parentName:"p"},"draft-proposal")," command to create a draft proposal and populate it with required information."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-sh"},"\u2717 gaiad tx gov draft-proposal\nUse the arrow keys to navigate: \u2193 \u2191 \u2192 \u2190\n? Select proposal type:\n text\n community-pool-spend\n \u25b8 software-upgrade # choose this\n cancel-software-upgrade\n other\n\n# populate all steps (displaying all for demonstration purposes)\nEnter proposal title: Upgrade v15\nEnter proposal authors: Stewards\nEnter proposal summary: Upgrade to v15\nEnter proposal details: <v15 upgrade changelog details>\nEnter proposal proposal forum url: /\nEnter proposal vote option context: Vote YES to support running this binary on the Cosmos Hub mainnet.\nEnter proposal deposit: 100001uatom\nEnter msg authority: cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn\n")),(0,n.yg)("p",null,"In your ",(0,n.yg)("inlineCode",{parentName:"p"},"draft_proposal.json")," populate the ",(0,n.yg)("inlineCode",{parentName:"p"},"height")," with your desired upgrade height and populate the ",(0,n.yg)("inlineCode",{parentName:"p"},"info")," field with additional information (must be a valid JSON string):"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-json"},'{\n "binaries": {\n "darwin/amd64": "https://github.com/cosmos/gaia/releases/download/v15.0.0/gaiad-v15.0.0-darwin-amd64?checksum=sha256:7157f03fbad4f53a4c73cde4e75454f4a40a9b09619d3295232341fec99ad138",\n "darwin/arm64": "https://github.com/cosmos/gaia/releases/download/v15.0.0/gaiad-v15.0.0-darwin-arm64?checksum=sha256:09e2420151dd22920304dafea47af4aa5ff4ab0ddbe056bb91797e33ff6df274",\n "linux/amd64": "https://github.com/cosmos/gaia/releases/download/v15.0.0/gaiad-v15.0.0-linux-amd64?checksum=sha256:236b5b83a7674e0e63ba286739c4670d15d7d6b3dcd810031ff83bdec2c0c2af",\n "linux/arm64": "https://github.com/cosmos/gaia/releases/download/v15.0.0/gaiad-v15.0.0-linux-arm64?checksum=sha256:b055fb7011e99d16a3ccae06443b0dcfd745b36480af6b3e569e88c94f3134d3",\n "windows/armd64": "https://github.com/cosmos/gaia/releases/download/v15.0.0/gaiad-v15.0.0-windows-amd64.exe?checksum=sha256:f0224ba914cad46dc27d6a9facd8179aec8a70727f0b1e509f0c6171c97ccf76",\n "windows/arm64": "https://github.com/cosmos/gaia/releases/download/v15.0.0/gaiad-v15.0.0-windows-arm64.exe?checksum=sha256:cbbce5933d501b4d54dcced9b097c052bffdef3fa8e1dfd75f29b34c3ee7de86"\n }\n}\n')),(0,n.yg)("p",null,"Upload your ",(0,n.yg)("inlineCode",{parentName:"p"},"draft_metadata.json")," to a distribution platform of your choice. ",(0,n.yg)("inlineCode",{parentName:"p"},"draft_proposal.json")," is used to submit a governance proposal using ",(0,n.yg)("inlineCode",{parentName:"p"},"submit-proposal"),"."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-sh"},"gaiad tx gov submit-proposal <path_to_proposal.json>\n --from <submitter address> \\\n --chain-id cosmoshub-4 \\\n --gas <max gas allocated> \\\n --fees <fees allocated> \\\n --node <node address> \\\n")),(0,n.yg)("h2",{id:"using-xupgrading"},"Using x/upgrading"),(0,n.yg)("p",null,"Software upgrade proposals can be submitted using the ",(0,n.yg)("a",{parentName:"p",href:"https://docs.cosmos.network/v0.47/build/modules/upgrade#transactions"},"x/upgrade module"),". The end effect will be the same since the ",(0,n.yg)("inlineCode",{parentName:"p"},"x/gov")," module routes the message to ",(0,n.yg)("inlineCode",{parentName:"p"},"x/upgrade")," module."),(0,n.yg)("h2",{id:"additional-information"},"Additional information"),(0,n.yg)("p",null,"Additional instructions with debugging information is available on the ",(0,n.yg)("a",{parentName:"p",href:"/main/governance/submitting"},"submitting")," page."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f4352eb0.22438c82.js b/assets/js/f4352eb0.22438c82.js new file mode 100644 index 00000000000..bd34bf158a2 --- /dev/null +++ b/assets/js/f4352eb0.22438c82.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[2472],{5680:(e,n,a)=>{a.d(n,{xA:()=>g,yg:()=>y});var t=a(6540);function i(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function r(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,t)}return a}function o(e){for(var n=1;n<arguments.length;n++){var a=null!=arguments[n]?arguments[n]:{};n%2?r(Object(a),!0).forEach((function(n){i(e,n,a[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(a,n))}))}return e}function l(e,n){if(null==e)return{};var a,t,i=function(e,n){if(null==e)return{};var a,t,i={},r=Object.keys(e);for(t=0;t<r.length;t++)a=r[t],n.indexOf(a)>=0||(i[a]=e[a]);return i}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(t=0;t<r.length;t++)a=r[t],n.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var s=t.createContext({}),p=function(e){var n=t.useContext(s),a=n;return e&&(a="function"==typeof e?e(n):o(o({},n),e)),a},g=function(e){var n=p(e.components);return t.createElement(s.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},u=t.forwardRef((function(e,n){var a=e.components,i=e.mdxType,r=e.originalType,s=e.parentName,g=l(e,["components","mdxType","originalType","parentName"]),d=p(a),u=i,y=d["".concat(s,".").concat(u)]||d[u]||m[u]||r;return a?t.createElement(y,o(o({ref:n},g),{},{components:a})):t.createElement(y,o({ref:n},g))}));function y(e,n){var a=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var r=a.length,o=new Array(r);o[0]=u;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[d]="string"==typeof e?e:i,o[1]=l;for(var p=2;p<r;p++)o[p]=a[p];return t.createElement.apply(null,o)}return t.createElement.apply(null,a)}u.displayName="MDXCreateElement"},6247:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>r,metadata:()=>l,toc:()=>p});var t=a(8168),i=(a(6540),a(5680));const r={title:"Joining Mainnet",order:2},o="Join the Cosmos Hub Mainnet",l={unversionedId:"hub-tutorials/join-mainnet",id:"hub-tutorials/join-mainnet",title:"Joining Mainnet",description:"The chain-id of Cosmos Hub mainnet is cosmoshub-4.",source:"@site/docs/hub-tutorials/join-mainnet.md",sourceDirName:"hub-tutorials",slug:"/hub-tutorials/join-mainnet",permalink:"/main/hub-tutorials/join-mainnet",draft:!1,tags:[],version:"current",frontMatter:{title:"Joining Mainnet",order:2},sidebar:"tutorialSidebar",previous:{title:"Interacting with Gaiad (CLI)",permalink:"/main/hub-tutorials/gaiad"},next:{title:"Joining Testnet",permalink:"/main/hub-tutorials/join-testnet"}},s={},p=[{value:"Release History",id:"release-history",level:2},{value:"Overview",id:"overview",level:3},{value:"Explorers",id:"explorers",level:2},{value:"Getting Started",id:"getting-started",level:2},{value:"Hardware",id:"hardware",level:2},{value:"General Configuration",id:"general-configuration",level:2},{value:"Initialize Chain",id:"initialize-chain",level:3},{value:"Genesis File",id:"genesis-file",level:3},{value:"Seeds & Peers",id:"seeds--peers",level:3},{value:"Gas & Fees",id:"gas--fees",level:3},{value:"Pruning of State",id:"pruning-of-state",level:3},{value:"REST API",id:"rest-api",level:3},{value:"GRPC",id:"grpc",level:3},{value:"Sync Options",id:"sync-options",level:2},{value:"Blocksync",id:"blocksync",level:3},{value:"Getting Started",id:"getting-started-1",level:5},{value:"State Sync",id:"state-sync",level:3},{value:"Quicksync",id:"quicksync",level:3},{value:"Snapshots",id:"snapshots",level:2},{value:"Cosmovisor",id:"cosmovisor",level:2},{value:"Running via Background Process",id:"running-via-background-process",level:2},{value:"Exporting State",id:"exporting-state",level:2},{value:"Verify Mainnet",id:"verify-mainnet",level:2}],g={toc:p},d="wrapper";function m(e){let{components:n,...a}=e;return(0,i.yg)(d,(0,t.A)({},g,a,{components:n,mdxType:"MDXLayout"}),(0,i.yg)("h1",{id:"join-the-cosmos-hub-mainnet"},"Join the Cosmos Hub Mainnet"),(0,i.yg)("admonition",{type:"info"},(0,i.yg)("p",{parentName:"admonition"},"The chain-id of Cosmos Hub mainnet is ",(0,i.yg)("inlineCode",{parentName:"p"},"cosmoshub-4"),".")),(0,i.yg)("h2",{id:"release-history"},"Release History"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},"use ",(0,i.yg)("inlineCode",{parentName:"li"},"gaia v5.0.x")," (Delta) for queries of state between height ",(0,i.yg)("inlineCode",{parentName:"li"},"6,910,000")," and ",(0,i.yg)("inlineCode",{parentName:"li"},"8,695,000")),(0,i.yg)("li",{parentName:"ul"},"use ",(0,i.yg)("inlineCode",{parentName:"li"},"gaia v6.0.x")," (Vega) between ",(0,i.yg)("inlineCode",{parentName:"li"},"8,695,000")," and ",(0,i.yg)("inlineCode",{parentName:"li"},"10,085,397")),(0,i.yg)("li",{parentName:"ul"},"use ",(0,i.yg)("inlineCode",{parentName:"li"},"gaia v7.0.x")," (Theta) between ",(0,i.yg)("inlineCode",{parentName:"li"},"10,085,397")," and ",(0,i.yg)("inlineCode",{parentName:"li"},"14,099,412")),(0,i.yg)("li",{parentName:"ul"},"use ",(0,i.yg)("inlineCode",{parentName:"li"},"gaia v8.0.x")," (Rho) between ",(0,i.yg)("inlineCode",{parentName:"li"},"14,099,412")," and ",(0,i.yg)("inlineCode",{parentName:"li"},"14,470,501")),(0,i.yg)("li",{parentName:"ul"},"use ",(0,i.yg)("inlineCode",{parentName:"li"},"gaia v9.0.x")," (Lambda) between ",(0,i.yg)("inlineCode",{parentName:"li"},"14,470,501")," and ",(0,i.yg)("inlineCode",{parentName:"li"},"15,213,800")),(0,i.yg)("li",{parentName:"ul"},"use ",(0,i.yg)("inlineCode",{parentName:"li"},"gaia v9.1.x")," between ",(0,i.yg)("inlineCode",{parentName:"li"},"15,213,800")," and ",(0,i.yg)("inlineCode",{parentName:"li"},"15,816,200")),(0,i.yg)("li",{parentName:"ul"},"use ",(0,i.yg)("inlineCode",{parentName:"li"},"gaia v10.0.x")," between ",(0,i.yg)("inlineCode",{parentName:"li"},"15,816,200")," and ",(0,i.yg)("inlineCode",{parentName:"li"},"16,596,000")),(0,i.yg)("li",{parentName:"ul"},"use ",(0,i.yg)("inlineCode",{parentName:"li"},"gaia v11.x")," between ",(0,i.yg)("inlineCode",{parentName:"li"},"16,596,000")," and ",(0,i.yg)("inlineCode",{parentName:"li"},"16,985,500")),(0,i.yg)("li",{parentName:"ul"},"use ",(0,i.yg)("inlineCode",{parentName:"li"},"gaia v12.x")," between ",(0,i.yg)("inlineCode",{parentName:"li"},"16,985,500")," and ",(0,i.yg)("inlineCode",{parentName:"li"},"17,380,000")),(0,i.yg)("li",{parentName:"ul"},"use ",(0,i.yg)("inlineCode",{parentName:"li"},"gaia v13.x")," between ",(0,i.yg)("inlineCode",{parentName:"li"},"17,380,000")," and ",(0,i.yg)("inlineCode",{parentName:"li"},"18,262,000")),(0,i.yg)("li",{parentName:"ul"},"use ",(0,i.yg)("inlineCode",{parentName:"li"},"gaia v14.1.x")," between ",(0,i.yg)("inlineCode",{parentName:"li"},"18,262,000")," and ",(0,i.yg)("inlineCode",{parentName:"li"},"19,639,600")),(0,i.yg)("li",{parentName:"ul"},"use ",(0,i.yg)("inlineCode",{parentName:"li"},"gaia v15.1.x")," between ",(0,i.yg)("inlineCode",{parentName:"li"},"19,639,600")," and ",(0,i.yg)("inlineCode",{parentName:"li"},"19,939,000")),(0,i.yg)("li",{parentName:"ul"},"use ",(0,i.yg)("inlineCode",{parentName:"li"},"gaia v15.2.x")," between ",(0,i.yg)("inlineCode",{parentName:"li"},"19,939,000")," and ",(0,i.yg)("inlineCode",{parentName:"li"},"20,440,500")," "),(0,i.yg)("li",{parentName:"ul"},"use ",(0,i.yg)("inlineCode",{parentName:"li"},"gaia v16.x")," from ",(0,i.yg)("inlineCode",{parentName:"li"},"20,440,500")," and ",(0,i.yg)("inlineCode",{parentName:"li"},"20,739,800")),(0,i.yg)("li",{parentName:"ul"},"use ",(0,i.yg)("inlineCode",{parentName:"li"},"gaia v17.1.x")," from ",(0,i.yg)("inlineCode",{parentName:"li"},"20,739,800"))),(0,i.yg)("p",null,(0,i.yg)("strong",{parentName:"p"},"This guide includes full instructions for joining the mainnet either as an archive/full node or a pruned node.")),(0,i.yg)("p",null,"For instructions to bootstrap a node via Quicksync or State Sync, see the ",(0,i.yg)("a",{parentName:"p",href:"/main/getting-started/quickstart"},"Quickstart Guide")),(0,i.yg)("p",null,"For instructions to join as a validator, please also see the ",(0,i.yg)("a",{parentName:"p",href:"/main/validators/overview"},"Validator Guide"),"."),(0,i.yg)("h3",{id:"overview"},"Overview"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#join-the-cosmos-hub-mainnet"},"Join the Cosmos Hub Mainnet"),(0,i.yg)("ul",{parentName:"li"},(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#release-history"},"Release History"),(0,i.yg)("ul",{parentName:"li"},(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#overview"},"Overview")))),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#explorers"},"Explorers")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#getting-started"},"Getting Started")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#hardware"},"Hardware")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#general-configuration"},"General Configuration"),(0,i.yg)("ul",{parentName:"li"},(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#initialize-chain"},"Initialize Chain")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#genesis-file"},"Genesis File")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#seeds--peers"},"Seeds \\& Peers")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#gas--fees"},"Gas \\& Fees")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#pruning-of-state"},"Pruning of State")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#rest-api"},"REST API")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#grpc"},"GRPC")))),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#sync-options"},"Sync Options"),(0,i.yg)("ul",{parentName:"li"},(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#blocksync"},"Blocksync"),(0,i.yg)("ul",{parentName:"li"},(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#getting-started-1"},"Getting Started")))),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#state-sync"},"State Sync")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#quicksync"},"Quicksync")))),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#snapshots"},"Snapshots")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#cosmovisor"},"Cosmovisor")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#running-via-background-process"},"Running via Background Process")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#exporting-state"},"Exporting State")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"#verify-mainnet"},"Verify Mainnet"))))),(0,i.yg)("h2",{id:"explorers"},"Explorers"),(0,i.yg)("p",null,"There are many explorers for the Cosmos Hub. For reference while setting up a node, here are a few recommendations:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"https://www.mintscan.io/cosmos"},"Mintscan"))),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"https://www.datalenses.zone/chain/cosmos"},"Numia")),(0,i.yg)("li",{parentName:"ul"},(0,i.yg)("a",{parentName:"li",href:"https://ping.pub/cosmos"},"Ping.Pub"))),(0,i.yg)("h2",{id:"getting-started"},"Getting Started"),(0,i.yg)("p",null,"Make sure the following prerequisites are completed:"),(0,i.yg)("ul",null,(0,i.yg)("li",{parentName:"ul"},"Choose the proper hardware/server configuration. See the ",(0,i.yg)("a",{parentName:"li",href:"#hardware"},"hardware guide"),"."),(0,i.yg)("li",{parentName:"ul"},"Ensure Gaia is properly installed. See the ",(0,i.yg)("a",{parentName:"li",href:"../getting-started/installation"},"installation guide")," for a walk-through."),(0,i.yg)("li",{parentName:"ul"},"Follow the ",(0,i.yg)("a",{parentName:"li",href:"../hub-tutorials/join-mainnet#general-configuration"},"configuration guide")," to initialize and prepare the node to sync with the network.")),(0,i.yg)("h2",{id:"hardware"},"Hardware"),(0,i.yg)("p",null,"Running a full archive node can be resource intensive as the full current ",(0,i.yg)("inlineCode",{parentName:"p"},"cosmoshub-4")," state is over ",(0,i.yg)("inlineCode",{parentName:"p"},"1.4TB"),". For those who wish to run state sync or use quicksync, the following hardware configuration is recommended:"),(0,i.yg)("table",null,(0,i.yg)("thead",{parentName:"table"},(0,i.yg)("tr",{parentName:"thead"},(0,i.yg)("th",{parentName:"tr",align:null},"Node Type"),(0,i.yg)("th",{parentName:"tr",align:null},"RAM"),(0,i.yg)("th",{parentName:"tr",align:null},"Storage"))),(0,i.yg)("tbody",{parentName:"table"},(0,i.yg)("tr",{parentName:"tbody"},(0,i.yg)("td",{parentName:"tr",align:null},"Validator"),(0,i.yg)("td",{parentName:"tr",align:null},"32GB"),(0,i.yg)("td",{parentName:"tr",align:null},"500GB-2TB*")),(0,i.yg)("tr",{parentName:"tbody"},(0,i.yg)("td",{parentName:"tr",align:null},"Full"),(0,i.yg)("td",{parentName:"tr",align:null},"16GB"),(0,i.yg)("td",{parentName:"tr",align:null},"2TB")),(0,i.yg)("tr",{parentName:"tbody"},(0,i.yg)("td",{parentName:"tr",align:null},"Default"),(0,i.yg)("td",{parentName:"tr",align:null},"16GB"),(0,i.yg)("td",{parentName:"tr",align:null},"1TB")))),(0,i.yg)("p",null,"*"," Storage size for validators will depend on level of pruning."),(0,i.yg)("h2",{id:"general-configuration"},"General Configuration"),(0,i.yg)("p",null,"Make sure to walk through the basic setup and configuration. Operators will need to initialize ",(0,i.yg)("inlineCode",{parentName:"p"},"gaiad"),", download the genesis file for ",(0,i.yg)("inlineCode",{parentName:"p"},"cosmoshub-4"),", and set persistent peers and/or seeds for startup."),(0,i.yg)("h3",{id:"initialize-chain"},"Initialize Chain"),(0,i.yg)("p",null,"Choose a custom moniker for the node and initialize. By default, the ",(0,i.yg)("inlineCode",{parentName:"p"},"init")," command creates the ",(0,i.yg)("inlineCode",{parentName:"p"},"~/.gaia")," directory with subfolders ",(0,i.yg)("inlineCode",{parentName:"p"},"config")," and ",(0,i.yg)("inlineCode",{parentName:"p"},"data"),". In the ",(0,i.yg)("inlineCode",{parentName:"p"},"/config")," directory, the most important files for configuration are ",(0,i.yg)("inlineCode",{parentName:"p"},"app.toml")," and ",(0,i.yg)("inlineCode",{parentName:"p"},"config.toml"),"."),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad init <custom-moniker>\n")),(0,i.yg)("blockquote",null,(0,i.yg)("p",{parentName:"blockquote"},(0,i.yg)("strong",{parentName:"p"},"Note"),": Monikers can contain only ASCII characters. Using Unicode characters is not supported and renders the node unreachable.")),(0,i.yg)("p",null,"The ",(0,i.yg)("inlineCode",{parentName:"p"},"moniker")," can be edited in the ",(0,i.yg)("inlineCode",{parentName:"p"},"~/.gaia/config/config.toml")," file:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-sh"},'# A custom human readable name for this node\nmoniker = "<custom_moniker>"\n')),(0,i.yg)("h3",{id:"genesis-file"},"Genesis File"),(0,i.yg)("p",null,"Once the node is initialized, download the genesis file and move to the ",(0,i.yg)("inlineCode",{parentName:"p"},"/config")," directory of the Gaia home directory."),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"wget https://raw.githubusercontent.com/cosmos/mainnet/master/genesis/genesis.cosmoshub-4.json.gz\ngzip -d genesis.cosmoshub-4.json.gz\nmv genesis.cosmoshub-4.json ~/.gaia/config/genesis.json\n")),(0,i.yg)("h3",{id:"seeds--peers"},"Seeds & Peers"),(0,i.yg)("p",null,"Upon startup the node will need to connect to peers. If there are specific nodes a node operator is interested in setting as seeds or as persistent peers, this can be configured in ",(0,i.yg)("inlineCode",{parentName:"p"},"~/.gaia/config/config.toml")),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-sh"},'# Comma separated list of seed nodes to connect to\nseeds = "<seed node id 1>@<seed node address 1>:26656,<seed node id 2>@<seed node address 2>:26656"\n\n# Comma separated list of nodes to keep persistent connections to\npersistent_peers = "<node id 1>@<node address 1>:26656,<node id 2>@<node address 2>:26656"\n')),(0,i.yg)("p",null,"Node operators can optionally download the ",(0,i.yg)("a",{parentName:"p",href:"https://quicksync.io/addrbook.cosmos.json"},"Quicksync address book"),". Make sure to move this to ",(0,i.yg)("inlineCode",{parentName:"p"},"~/.gaia/config/addrbook.json"),"."),(0,i.yg)("h3",{id:"gas--fees"},"Gas & Fees"),(0,i.yg)("p",null,"On Cosmos Hub mainnet, the accepted denom is ",(0,i.yg)("inlineCode",{parentName:"p"},"uatom"),", where ",(0,i.yg)("inlineCode",{parentName:"p"},"1atom = 1.000.000uatom")),(0,i.yg)("p",null,"Transactions on the Cosmos Hub network need to include a transaction fee in order to be processed. This fee pays for the gas required to run the transaction. The formula is the following:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre"},"fees = ceil(gas * gasPrices)\n")),(0,i.yg)("p",null,(0,i.yg)("inlineCode",{parentName:"p"},"Gas")," is the smallest unit or pricing value required to perform a transaction. Different transactions require different amounts of ",(0,i.yg)("inlineCode",{parentName:"p"},"gas"),". The ",(0,i.yg)("inlineCode",{parentName:"p"},"gas")," amount for a transaction is calculated as it is being processed, but it can be estimated beforehand by using the ",(0,i.yg)("inlineCode",{parentName:"p"},"auto")," value for the ",(0,i.yg)("inlineCode",{parentName:"p"},"gas")," flag. The gas estimate can be adjusted with the flag ",(0,i.yg)("inlineCode",{parentName:"p"},"--gas-adjustment")," (default ",(0,i.yg)("inlineCode",{parentName:"p"},"1.0"),") to ensure enough ",(0,i.yg)("inlineCode",{parentName:"p"},"gas")," is provided for the transaction."),(0,i.yg)("p",null,"The ",(0,i.yg)("inlineCode",{parentName:"p"},"gasPrice")," is the price of each unit of ",(0,i.yg)("inlineCode",{parentName:"p"},"gas"),". Each validator sets a ",(0,i.yg)("inlineCode",{parentName:"p"},"min-gas-price")," value, and will only include transactions that have a ",(0,i.yg)("inlineCode",{parentName:"p"},"gasPrice")," greater than their ",(0,i.yg)("inlineCode",{parentName:"p"},"min-gas-price"),"."),(0,i.yg)("p",null,"The transaction ",(0,i.yg)("inlineCode",{parentName:"p"},"fees")," are the product of ",(0,i.yg)("inlineCode",{parentName:"p"},"gas")," and ",(0,i.yg)("inlineCode",{parentName:"p"},"gasPrice"),". The higher the ",(0,i.yg)("inlineCode",{parentName:"p"},"gasPrice"),"/",(0,i.yg)("inlineCode",{parentName:"p"},"fees"),", the higher the chance that a transaction will get included in a block."),(0,i.yg)("p",null,(0,i.yg)("strong",{parentName:"p"},"For mainnet, the recommended ",(0,i.yg)("inlineCode",{parentName:"strong"},"gas-prices")," is ",(0,i.yg)("inlineCode",{parentName:"strong"},"0.0025uatom"),".")),(0,i.yg)("p",null,"A full-node keeps unconfirmed transactions in its mempool. In order to protect it from spam, it is better to set a ",(0,i.yg)("inlineCode",{parentName:"p"},"minimum-gas-prices")," that the transaction must meet in order to be accepted in the node's mempool. This parameter can be set in ",(0,i.yg)("inlineCode",{parentName:"p"},"~/.gaia/config/app.toml"),"."),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre"},'# The minimum gas prices a validator is willing to accept for processing a\n# transaction. A transaction\'s fees must meet the minimum of any denomination\n# specified in this config (e.g. 0.25token1;0.0001token2).\nminimum-gas-prices = "0.0025uatom"\n')),(0,i.yg)("p",null,"The initial recommended ",(0,i.yg)("inlineCode",{parentName:"p"},"min-gas-prices")," is ",(0,i.yg)("inlineCode",{parentName:"p"},"0.0025uatom"),", but this can be changed later."),(0,i.yg)("h3",{id:"pruning-of-state"},"Pruning of State"),(0,i.yg)("blockquote",null,(0,i.yg)("p",{parentName:"blockquote"},(0,i.yg)("strong",{parentName:"p"},"Note"),": This is an optional configuration.")),(0,i.yg)("p",null,"There are four strategies for pruning state. These strategies apply only to state and do not apply to block storage. A node operator may want to consider custom pruning if node storage is a concern or there is an interest in running an archive node."),(0,i.yg)("p",null,"To set pruning, adjust the ",(0,i.yg)("inlineCode",{parentName:"p"},"pruning")," parameter in the ",(0,i.yg)("inlineCode",{parentName:"p"},"~/.gaia/config/app.toml")," file.\nThe following pruning state settings are available:"),(0,i.yg)("ol",null,(0,i.yg)("li",{parentName:"ol"},(0,i.yg)("inlineCode",{parentName:"li"},"everything"),": Prune all saved states other than the current state."),(0,i.yg)("li",{parentName:"ol"},(0,i.yg)("inlineCode",{parentName:"li"},"nothing"),": Save all states and delete nothing."),(0,i.yg)("li",{parentName:"ol"},(0,i.yg)("inlineCode",{parentName:"li"},"default"),": Save the last 100 states and the state of every 10,000th block."),(0,i.yg)("li",{parentName:"ol"},(0,i.yg)("inlineCode",{parentName:"li"},"custom"),": Specify pruning settings with the ",(0,i.yg)("inlineCode",{parentName:"li"},"pruning-keep-recent"),", ",(0,i.yg)("inlineCode",{parentName:"li"},"pruning-keep-every"),", and ",(0,i.yg)("inlineCode",{parentName:"li"},"pruning-interval")," parameters.")),(0,i.yg)("p",null,"By default, every node is in ",(0,i.yg)("inlineCode",{parentName:"p"},"default")," mode which is the recommended setting for most environments.\nIf a node operator wants to change their node's pruning strategy then this ",(0,i.yg)("strong",{parentName:"p"},"must")," be done before the node is initialized."),(0,i.yg)("p",null,"In ",(0,i.yg)("inlineCode",{parentName:"p"},"~/.gaia/config/app.toml")),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre"},'# default: the last 100 states are kept in addition to every 500th state; pruning at 10 block intervals\n# nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node)\n# everything: all saved states will be deleted, storing only the current state; pruning at 10 block intervals\n# custom: allow pruning options to be manually specified through \'pruning-keep-recent\', \'pruning-keep-every\', and \'pruning-interval\'\npruning = "custom"\n\n# These are applied if and only if the pruning strategy is custom.\npruning-keep-recent = "10"\npruning-keep-every = "1000"\npruning-interval = "10"\n')),(0,i.yg)("p",null,"Passing a flag when starting ",(0,i.yg)("inlineCode",{parentName:"p"},"gaia")," will always override settings in the ",(0,i.yg)("inlineCode",{parentName:"p"},"app.toml")," file. To change the node's pruning setting to ",(0,i.yg)("inlineCode",{parentName:"p"},"everything")," mode then pass the ",(0,i.yg)("inlineCode",{parentName:"p"},"---pruning everything")," flag when running ",(0,i.yg)("inlineCode",{parentName:"p"},"gaiad start"),"."),(0,i.yg)("blockquote",null,(0,i.yg)("p",{parentName:"blockquote"},(0,i.yg)("strong",{parentName:"p"},"Note"),": If running the node with pruned state, it will not be possible to query the heights that are not in the node's store.")),(0,i.yg)("h3",{id:"rest-api"},"REST API"),(0,i.yg)("blockquote",null,(0,i.yg)("p",{parentName:"blockquote"},(0,i.yg)("strong",{parentName:"p"},"Note"),": This is an optional configuration.")),(0,i.yg)("p",null,"By default, the REST API is disabled. To enable the REST API, edit the ",(0,i.yg)("inlineCode",{parentName:"p"},"~/.gaia/config/app.toml")," file, and set ",(0,i.yg)("inlineCode",{parentName:"p"},"enable")," to ",(0,i.yg)("inlineCode",{parentName:"p"},"true")," in the ",(0,i.yg)("inlineCode",{parentName:"p"},"[api]")," section."),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-toml"},'###############################################################################\n### API Configuration ###\n###############################################################################\n[api]\n# Enable defines if the API server should be enabled.\nenable = true\n# Swagger defines if swagger documentation should automatically be registered.\nswagger = false\n# Address defines the API server to listen on.\naddress = "tcp://0.0.0.0:1317"\n')),(0,i.yg)("p",null,"Optionally activate swagger by setting ",(0,i.yg)("inlineCode",{parentName:"p"},"swagger")," to ",(0,i.yg)("inlineCode",{parentName:"p"},"true")," or change the port of the REST API in the parameter ",(0,i.yg)("inlineCode",{parentName:"p"},"address"),".\nAfter restarting the application, access the REST API on ",(0,i.yg)("inlineCode",{parentName:"p"},"<NODE IP>:1317"),"."),(0,i.yg)("h3",{id:"grpc"},"GRPC"),(0,i.yg)("blockquote",null,(0,i.yg)("p",{parentName:"blockquote"},(0,i.yg)("strong",{parentName:"p"},"Note"),": This is an optional configuration.")),(0,i.yg)("p",null,"By default, gRPC is enabled on port ",(0,i.yg)("inlineCode",{parentName:"p"},"9090"),". The ",(0,i.yg)("inlineCode",{parentName:"p"},"~/.gaia/config/app.toml")," file is where changes can be made in the gRPC section. To disable the gRPC endpoint, set ",(0,i.yg)("inlineCode",{parentName:"p"},"enable")," to ",(0,i.yg)("inlineCode",{parentName:"p"},"false"),". To change the port, use the ",(0,i.yg)("inlineCode",{parentName:"p"},"address")," parameter."),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-toml"},'###############################################################################\n### gRPC Configuration ###\n###############################################################################\n[grpc]\n# Enable defines if the gRPC server should be enabled.\nenable = true\n# Address defines the gRPC server address to bind to.\naddress = "0.0.0.0:9090"\n')),(0,i.yg)("h2",{id:"sync-options"},"Sync Options"),(0,i.yg)("p",null,"There are three main ways to sync a node on the Cosmos Hub; Blocksync, State Sync, and Quicksync. See the matrix below for the Hub's recommended setup configuration. This guide will focus on syncing two types of common nodes; full and pruned. For further information on syncing to run a validator node, see the section on ",(0,i.yg)("a",{parentName:"p",href:"/main/validators/overview"},"Validators"),"."),(0,i.yg)("p",null,"There are two types of concerns when deciding which sync option is right. ",(0,i.yg)("em",{parentName:"p"},"Data integrity")," refers to how reliable the data provided by a subset of network participants is. ",(0,i.yg)("em",{parentName:"p"},"Historical data")," refers to how robust and inclusive the chain\u2019s history is."),(0,i.yg)("table",null,(0,i.yg)("thead",{parentName:"table"},(0,i.yg)("tr",{parentName:"thead"},(0,i.yg)("th",{parentName:"tr",align:null}),(0,i.yg)("th",{parentName:"tr",align:null},"Low Data Integrity"),(0,i.yg)("th",{parentName:"tr",align:null},"High Data Integrity"))),(0,i.yg)("tbody",{parentName:"table"},(0,i.yg)("tr",{parentName:"tbody"},(0,i.yg)("td",{parentName:"tr",align:null},"Minimal Historical Data"),(0,i.yg)("td",{parentName:"tr",align:null},"Quicksync - Pruned"),(0,i.yg)("td",{parentName:"tr",align:null},"State Sync")),(0,i.yg)("tr",{parentName:"tbody"},(0,i.yg)("td",{parentName:"tr",align:null},"Moderate Historical Data"),(0,i.yg)("td",{parentName:"tr",align:null},"Quicksync - Default"),(0,i.yg)("td",{parentName:"tr",align:null})),(0,i.yg)("tr",{parentName:"tbody"},(0,i.yg)("td",{parentName:"tr",align:null},"Full Historical Data"),(0,i.yg)("td",{parentName:"tr",align:null},"Quicksync - Archive"),(0,i.yg)("td",{parentName:"tr",align:null},"Blocksync")))),(0,i.yg)("p",null,"If a node operator wishes to run a full node, it is possible to start from scratch but will take a significant amount of time to catch up. Node operators not concerned with rebuilding original state from the beginning of ",(0,i.yg)("inlineCode",{parentName:"p"},"cosmoshub-4")," can also leverage ",(0,i.yg)("a",{parentName:"p",href:"#quicksync"},"Quicksync"),"'s available archive history."),(0,i.yg)("p",null,"For operators interested in bootstrapping a pruned node, either ",(0,i.yg)("a",{parentName:"p",href:"#quicksync"},"Quicksync")," or ",(0,i.yg)("a",{parentName:"p",href:"#state-sync"},"State Sync")," would be sufficient."),(0,i.yg)("p",null,"Make sure to consult the ",(0,i.yg)("a",{parentName:"p",href:"#hardware"},"hardware")," section for guidance on the best configuration for the type of node operating."),(0,i.yg)("h3",{id:"blocksync"},"Blocksync"),(0,i.yg)("p",null,"Blocksync is faster than traditional consensus and syncs the chain from genesis by downloading blocks and verifying against the merkle tree of validators. For more information see ",(0,i.yg)("a",{parentName:"p",href:"https://docs.cometbft.com/v0.37/core/block-sync"},"CometBFT's Blocksync Docs")),(0,i.yg)("p",null,"When syncing via Blocksync, node operators will either need to manually upgrade the chain or set up ",(0,i.yg)("a",{parentName:"p",href:"#cosmovisor"},"Cosmovisor")," to upgrade automatically."),(0,i.yg)("p",null,"For more information on performing the manual upgrades, see ",(0,i.yg)("a",{parentName:"p",href:"#releases--upgrades"},"Releases & Upgrades"),"."),(0,i.yg)("p",null,"It is possible to sync from previous versions of the Cosmos Hub. See the matrix below for the correct ",(0,i.yg)("inlineCode",{parentName:"p"},"gaia")," version. See the ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/cosmos/mainnet"},"mainnet archive")," for historical genesis files."),(0,i.yg)("table",null,(0,i.yg)("thead",{parentName:"table"},(0,i.yg)("tr",{parentName:"thead"},(0,i.yg)("th",{parentName:"tr",align:null},"Chain Id"),(0,i.yg)("th",{parentName:"tr",align:null},"Gaia Version"))),(0,i.yg)("tbody",{parentName:"table"},(0,i.yg)("tr",{parentName:"tbody"},(0,i.yg)("td",{parentName:"tr",align:null},(0,i.yg)("inlineCode",{parentName:"td"},"cosmoshub-4")),(0,i.yg)("td",{parentName:"tr",align:null},(0,i.yg)("inlineCode",{parentName:"td"},"v4.2.1"))),(0,i.yg)("tr",{parentName:"tbody"},(0,i.yg)("td",{parentName:"tr",align:null},(0,i.yg)("inlineCode",{parentName:"td"},"cosmoshub-3")),(0,i.yg)("td",{parentName:"tr",align:null},(0,i.yg)("inlineCode",{parentName:"td"},"v2.0.x"))),(0,i.yg)("tr",{parentName:"tbody"},(0,i.yg)("td",{parentName:"tr",align:null},(0,i.yg)("inlineCode",{parentName:"td"},"cosmoshub-2")),(0,i.yg)("td",{parentName:"tr",align:null},(0,i.yg)("inlineCode",{parentName:"td"},"v1.0.x"))),(0,i.yg)("tr",{parentName:"tbody"},(0,i.yg)("td",{parentName:"tr",align:null},(0,i.yg)("inlineCode",{parentName:"td"},"cosmoshub-1")),(0,i.yg)("td",{parentName:"tr",align:null},(0,i.yg)("inlineCode",{parentName:"td"},"v0.0.x"))))),(0,i.yg)("h5",{id:"getting-started-1"},"Getting Started"),(0,i.yg)("p",null,"Start Gaia to begin syncing with the ",(0,i.yg)("inlineCode",{parentName:"p"},"skip-invariants")," flag. For more information on this see ",(0,i.yg)("a",{parentName:"p",href:"#verify-mainnet"},"Verify Mainnet"),"."),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad start --x-crisis-skip-assert-invariants\n\n")),(0,i.yg)("p",null,"The node will begin rebuilding state until it hits the first upgrade height at block ",(0,i.yg)("inlineCode",{parentName:"p"},"6910000"),". If Cosmovisor is set up then there's nothing else to do besides wait, otherwise the node operator will need to perform the manual upgrade twice."),(0,i.yg)("h3",{id:"state-sync"},"State Sync"),(0,i.yg)("p",null,"State Sync is an efficient and fast way to bootstrap a new node, and it works by replaying larger chunks of application state directly rather than replaying individual blocks or consensus rounds. For more information, see ",(0,i.yg)("a",{parentName:"p",href:"https://docs.cometbft.com/v0.37/core/state-sync"},"CometBFT's State Sync docs"),"."),(0,i.yg)("p",null,"To enable state sync, visit an explorer to get a recent block height and corresponding hash. A node operator can choose any height/hash in the current bonding period, but as the recommended snapshot period is ",(0,i.yg)("inlineCode",{parentName:"p"},"1000")," blocks, it is advised to choose something close to ",(0,i.yg)("inlineCode",{parentName:"p"},"current height - 1000"),"."),(0,i.yg)("p",null,"With the block height and hash selected, update the configuration in ",(0,i.yg)("inlineCode",{parentName:"p"},"~/.gaia/config/config.toml")," to set ",(0,i.yg)("inlineCode",{parentName:"p"},"enable = true"),", and populate the ",(0,i.yg)("inlineCode",{parentName:"p"},"trust_height")," and ",(0,i.yg)("inlineCode",{parentName:"p"},"trust_hash"),". Node operators can configure the rpc servers to a preferred provider, but there must be at least two entries. It is important that these are two rpc servers the node operator trusts to verify component parts of the chain state. While not recommended, uniqueness is not currently enforced, so it is possible to duplicate the same server in the list and still sync successfully."),(0,i.yg)("blockquote",null,(0,i.yg)("p",{parentName:"blockquote"},(0,i.yg)("strong",{parentName:"p"},"Note"),": In the future, the RPC server requirement will be deprecated as state sync is ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/tendermint/tendermint/issues/6491"},"moved to the p2p layer in Tendermint 0.38"),".")),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-toml"},'#######################################################\n### State Sync Configuration Options ###\n#######################################################\n[statesync]\n# State sync rapidly bootstraps a new node by discovering, fetching, and restoring a state machine\n# snapshot from peers instead of fetching and replaying historical blocks. Requires some peers in\n# the network to take and serve state machine snapshots. State sync is not attempted if the node\n# has any local state (LastBlockHeight > 0). The node will have a truncated block history,\n# starting from the height of the snapshot.\nenable = true\n\n# RPC servers (comma-separated) for light client verification of the synced state machine and\n# retrieval of state data for node bootstrapping. Also needs a trusted height and corresponding\n# header hash obtained from a trusted source, and a period during which validators can be trusted.\n#\n# For Cosmos SDK-based chains, trust_period should usually be about 2/3 of the unbonding time (~2\n# weeks) during which they can be financially punished (slashed) for misbehavior.\nrpc_servers = "https://cosmos-rpc.polkachu.com:443,https://rpc-cosmoshub-ia.cosmosia.notional.ventures:443"\ntrust_height = 8959784\ntrust_hash = "3D8F12EA302AEDA66E80939F7FC785206692F8B6EE6F727F1655F1AFB6A873A5"\ntrust_period = "168h0m0s"\n')),(0,i.yg)("p",null,"Start Gaia to begin state sync. It may take some time for the node to acquire a snapshot, but the command and output should look similar to the following:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},'$ gaiad start --x-crisis-skip-assert-invariants\n\n...\n\n> INF Discovered new snapshot format=1 hash="0x000..." height=8967000 module=statesync\n\n...\n\n> INF Fetching snapshot chunk chunk=4 format=1 height=8967000 module=statesync total=45\n> INF Applied snapshot chunk to ABCI app chunk=0 format=1 height=8967000 module=statesync total=45\n')),(0,i.yg)("p",null,"Once state sync successfully completes, the node will begin to process blocks normally. If state sync fails and the node operator encounters the following error: ",(0,i.yg)("inlineCode",{parentName:"p"},'State sync failed err="state sync aborted"'),", either try restarting ",(0,i.yg)("inlineCode",{parentName:"p"},"gaiad")," or running ",(0,i.yg)("inlineCode",{parentName:"p"},"gaiad unsafe-reset-all")," (make sure to backup any configuration and history before doing this)."),(0,i.yg)("h3",{id:"quicksync"},"Quicksync"),(0,i.yg)("p",null,"Quicksync.io offers several daily snapshots of the Cosmos Hub with varying levels of pruning (",(0,i.yg)("inlineCode",{parentName:"p"},"archive")," 1.4TB, ",(0,i.yg)("inlineCode",{parentName:"p"},"default")," 540GB, and ",(0,i.yg)("inlineCode",{parentName:"p"},"pruned")," 265GB). For downloads and installation instructions, visit the ",(0,i.yg)("a",{parentName:"p",href:"https://quicksync.io/networks/cosmos.html"},"Cosmos Quicksync guide"),"."),(0,i.yg)("h2",{id:"snapshots"},"Snapshots"),(0,i.yg)("p",null,"Saving and serving snapshots helps nodes rapidly join the network. Snapshots are now enabled by default effective ",(0,i.yg)("inlineCode",{parentName:"p"},"1/20/21"),"."),(0,i.yg)("p",null,"While not advised, if a node operator needs to customize this feature, it can be configured in ",(0,i.yg)("inlineCode",{parentName:"p"},"~/.gaia/config/app.toml"),". The Cosmos Hub recommends setting this value to match ",(0,i.yg)("inlineCode",{parentName:"p"},"pruning-keep-every")," in ",(0,i.yg)("inlineCode",{parentName:"p"},"config.toml"),"."),(0,i.yg)("blockquote",null,(0,i.yg)("p",{parentName:"blockquote"},(0,i.yg)("strong",{parentName:"p"},"Note"),": It is highly recommended that node operators use the same value for snapshot-interval in order to aid snapshot discovery. Discovery is easier when more nodes are serving the same snapshots.")),(0,i.yg)("p",null,"In ",(0,i.yg)("inlineCode",{parentName:"p"},"app.toml")),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-toml"},"###############################################################################\n### State Sync Configuration ###\n###############################################################################\n\n# State sync snapshots allow other nodes to rapidly join the network without replaying historical\n# blocks, instead downloading and applying a snapshot of the application state at a given height.\n[state-sync]\n\n# snapshot-interval specifies the block interval at which local state sync snapshots are\n# taken (0 to disable). Must be a multiple of pruning-keep-every.\nsnapshot-interval = 1000\n\n# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all).\nsnapshot-keep-recent = 10\n")),(0,i.yg)("h2",{id:"cosmovisor"},"Cosmovisor"),(0,i.yg)("p",null,"Cosmovisor is a process manager developed to relieve node operators of having to manually intervene every time there is an upgrade. Cosmovisor monitors the governance module for upgrade proposals; it will take care of downloading the new binary, stopping the old one, switching to the new one, and restarting."),(0,i.yg)("p",null,"For more information on how to run a node via Cosmovisor, check out the ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/cosmos/cosmos-sdk/tree/main/tools/cosmovisor"},"docs"),"."),(0,i.yg)("h2",{id:"running-via-background-process"},"Running via Background Process"),(0,i.yg)("p",null,"To run the node in a background process with automatic restarts, it's recommended to use a service manager like ",(0,i.yg)("inlineCode",{parentName:"p"},"systemd"),". To set this up run the following:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"sudo tee /etc/systemd/system/<service name>.service > /dev/null <<EOF \n[Unit]\nDescription=Gaia Daemon\nAfter=network-online.target\n\n[Service]\nUser=$USER\nExecStart=$(which gaiad) start\nRestart=always\nRestartSec=3\nLimitNOFILE=4096\n\n[Install]\nWantedBy=multi-user.target\nEOF\n")),(0,i.yg)("p",null,"If using Cosmovisor then make sure to add the following:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},'Environment="DAEMON_HOME=$HOME/.gaia"\nEnvironment="DAEMON_NAME=gaiad"\nEnvironment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"\nEnvironment="DAEMON_RESTART_AFTER_UPGRADE=true"\n')),(0,i.yg)("p",null,"After the ",(0,i.yg)("inlineCode",{parentName:"p"},"LimitNOFILE")," line and replace ",(0,i.yg)("inlineCode",{parentName:"p"},"$(which gaiad)")," with ",(0,i.yg)("inlineCode",{parentName:"p"},"$(which cosmovisor)"),"."),(0,i.yg)("p",null,"Run the following to setup the daemon:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"sudo -S systemctl daemon-reload\nsudo -S systemctl enable <service name>\n")),(0,i.yg)("p",null,"Then start the process and confirm that it's running."),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"sudo -S systemctl start <service name>\n\nsudo service <service name> status\n")),(0,i.yg)("h2",{id:"exporting-state"},"Exporting State"),(0,i.yg)("p",null,"Gaia can dump the entire application state into a JSON file. This application state dump is useful for manual analysis and can also be used as the genesis file of a new network."),(0,i.yg)("blockquote",null,(0,i.yg)("p",{parentName:"blockquote"},(0,i.yg)("strong",{parentName:"p"},"Note"),": The node can't be running while exporting state, otherwise the operator can expect a ",(0,i.yg)("inlineCode",{parentName:"p"},"resource temporarily unavailable")," error.")),(0,i.yg)("p",null,"Export state with:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad export > [filename].json\n")),(0,i.yg)("p",null,"It is also possible to export state from a particular height (at the end of processing the block of that height):"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad export --height [height] > [filename].json\n")),(0,i.yg)("p",null,"If planning to start a new network from the exported state, export with the ",(0,i.yg)("inlineCode",{parentName:"p"},"--for-zero-height")," flag:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad export --height [height] --for-zero-height > [filename].json\n")),(0,i.yg)("h2",{id:"verify-mainnet"},"Verify Mainnet"),(0,i.yg)("p",null,"Help to prevent a catastrophe by running invariants on each block on your full\nnode. In essence, by running invariants the node operator ensures that the state of mainnet is the correct expected state. One vital invariant check is that no atoms are being created or destroyed outside of expected protocol, however there are many other invariant checks each unique to their respective module. Because invariant checks are computationally expensive, they are not enabled by default. To run a node with these checks start your node without the ",(0,i.yg)("inlineCode",{parentName:"p"},"--x-crisis-skip-assert-invariants")," flag:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad start\n")),(0,i.yg)("p",null,"If an invariant is broken on the node, it will panic and prompt the operator to send a transaction which will halt mainnet. For example the provided message may look like:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"invariant broken:\n loose token invariance:\n pool.NotBondedTokens: 100\n sum of account tokens: 101\n CRITICAL please submit the following transaction:\n gaiad tx crisis invariant-broken staking supply\n\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f5cf8579.3d0f96c8.js b/assets/js/f5cf8579.3d0f96c8.js new file mode 100644 index 00000000000..0eed1c52794 --- /dev/null +++ b/assets/js/f5cf8579.3d0f96c8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[3350],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>d});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=a.createContext({}),l=function(e){var t=a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=l(e.components);return a.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),g=r,d=u["".concat(c,".").concat(g)]||u[g]||m[g]||o;return n?a.createElement(d,i(i({ref:t},p),{},{components:n})):a.createElement(d,i({ref:t},p))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=g;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:r,i[1]=s;for(var l=2;l<o;l++)i[l]=n[l];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}g.displayName="MDXCreateElement"},215:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=n(8168),r=(n(6540),n(5680));const o={title:"What is Gaia?",sidebar_position:1},i=void 0,s={unversionedId:"getting-started/what-is-gaia",id:"getting-started/what-is-gaia",title:"What is Gaia?",description:"The Cosmos Hub is a public Proof-of-Stake chain that uses ATOM as its native staking token. It is the first blockchain launched in the Cosmos Network and developed using the cosmos-sdk development framework and ibc-go.",source:"@site/docs/getting-started/what-is-gaia.md",sourceDirName:"getting-started",slug:"/getting-started/what-is-gaia",permalink:"/main/getting-started/what-is-gaia",draft:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"What is Gaia?",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Getting Started",permalink:"/main/getting-started/"},next:{title:"Installing Gaia",permalink:"/main/getting-started/installation"}},c={},l=[],p={toc:l},u="wrapper";function m(e){let{components:t,...n}=e;return(0,r.yg)(u,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("p",null,"The Cosmos Hub is a public Proof-of-Stake chain that uses ATOM as its native staking token. It is the first blockchain launched in the Cosmos Network and developed using the ",(0,r.yg)("a",{parentName:"p",href:"https://docs.cosmos.network/"},"cosmos-sdk")," development framework and ",(0,r.yg)("a",{parentName:"p",href:"https://ibc.cosmos.network/"},"ibc-go"),"."),(0,r.yg)("p",null,"Cosmos hub is also the first security aggregation platform that leverages the ",(0,r.yg)("a",{parentName:"p",href:"https://cosmos.github.io/interchain-security/"},"interchain-security")," protocol (",(0,r.yg)("a",{parentName:"p",href:"https://github.com/cosmos/ibc/tree/main/spec/app/ics-028-cross-chain-validation"},"ICS-28"),") to facilitate the launch of cosmos-sdk blockchain projects."),(0,r.yg)("admonition",{type:"tip"},(0,r.yg)("p",{parentName:"admonition"},"Interchain security features deployed on the Cosmos Hub blockchain allow anyone to launch a blockchain using a subset, or even the entire validator set of the Cosmos Hub blockchain. ")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("ul",{parentName:"admonition"},(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"gaia")," is the name of the Cosmos SDK application for the Cosmos Hub.")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"gaiad")," is the daemon and command-line interface (CLI) that operates the ",(0,r.yg)("inlineCode",{parentName:"p"},"gaia")," blockchain application.")))),(0,r.yg)("p",null,"For a full list of modules used on the Cosmos Hub follow this ",(0,r.yg)("a",{parentName:"p",href:"/main/modules/"},"link"),"."),(0,r.yg)("p",null,"Next, learn how to ",(0,r.yg)("a",{parentName:"p",href:"/main/getting-started/installation"},"install Gaia"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f6addb2b.f6296bc3.js b/assets/js/f6addb2b.f6296bc3.js new file mode 100644 index 00000000000..ff49550125f --- /dev/null +++ b/assets/js/f6addb2b.f6296bc3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[3818],{5680:(e,t,a)=>{a.d(t,{xA:()=>c,yg:()=>h});var r=a(6540);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function s(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=r.createContext({}),d=function(e){var t=r.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=d(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},v=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=d(a),v=n,h=u["".concat(l,".").concat(v)]||u[v]||p[v]||o;return a?r.createElement(h,i(i({ref:t},c),{},{components:a})):r.createElement(h,i({ref:t},c))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=v;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:n,i[1]=s;for(var d=2;d<o;d++)i[d]=a[d];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}v.displayName="MDXCreateElement"},4877:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var r=a(8168),n=(a(6540),a(5680));const o={title:"Validator Overview",order:1},i=void 0,s={unversionedId:"validators/overview",id:"validators/overview",title:"Validator Overview",description:"Introduction",source:"@site/docs/validators/overview.md",sourceDirName:"validators",slug:"/validators/overview",permalink:"/main/validators/overview",draft:!1,tags:[],version:"current",frontMatter:{title:"Validator Overview",order:1},sidebar:"tutorialSidebar",previous:{title:"Setting up Tendermint KMS + Ledger",permalink:"/main/validators/kms/kms_ledger"},next:{title:"Validator Security",permalink:"/main/validators/security"}},l={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Hardware",id:"hardware",level:2},{value:"Create a Validator Website",id:"create-a-validator-website",level:2},{value:"Seek Legal Advice",id:"seek-legal-advice",level:2},{value:"Community",id:"community",level:2}],c={toc:d},u="wrapper";function p(e){let{components:t,...a}=e;return(0,n.yg)(u,(0,r.A)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h2",{id:"introduction"},"Introduction"),(0,n.yg)("p",null,"The Cosmos Hub is based on ",(0,n.yg)("a",{parentName:"p",href:"https://docs.cometbft.com/v0.37/introduction/what-is-cometbft"},"CometBFT")," that relies on a set of validators that are responsible for committing new blocks in the blockchain. These validators participate in the consensus protocol by broadcasting votes that contain cryptographic signatures signed by each validator's private key."),(0,n.yg)("p",null,"Validator candidates can bond their own ATOM and have ATOM ",(0,n.yg)("a",{parentName:"p",href:"/main/delegators/delegator-guide-cli"},'"delegated"'),", or staked, to them by token holders. The Cosmos Hub has 180 active validators, but over time the number of validators can be changed through governance (",(0,n.yg)("inlineCode",{parentName:"p"},"MaxValidators")," parameter). Validator voting power is determined by the total number of ATOM tokens delegated to them. Validators that do not have enough voting power to be in the top 180 are considered inactive. Inactive validators can become active if their staked amount increases so that they fall into the top 180 validators."),(0,n.yg)("p",null,"Validators and their delegators earn ATOM as block provisions and tokens as transaction fees through execution of the Tendermint consensus protocol. Note that validators can set a commission percentage on the fees their delegators receive as additional incentive. You can find an overview of all current validators and their voting power on ",(0,n.yg)("a",{parentName:"p",href:"https://www.mintscan.io/cosmos/validators"},"Mintscan"),"."),(0,n.yg)("p",null,"If validators double sign or are offline for an ",(0,n.yg)("a",{parentName:"p",href:"/main/validators/validator-faq#what-are-the-slashing-conditions"},"extended period"),", their staked ATOM (including ATOM of users that delegated to them) can be slashed. The penalty depends on the severity of the violation."),(0,n.yg)("h2",{id:"hardware"},"Hardware"),(0,n.yg)("p",null,"For validator key management, validators must set up a physical operation that is secured with restricted access. A good starting place, for example, would be co-locating in secure data centers."),(0,n.yg)("p",null,"Validators are expected to equip their datacenter location with redundant power, connectivity, and storage backups. Expect to have several redundant networking boxes for fiber, firewall, and switching and then small servers with redundant hard drive and failover."),(0,n.yg)("p",null,"You can find the minimum hardware requirements on the instructions for ",(0,n.yg)("a",{parentName:"p",href:"/main/hub-tutorials/join-mainnet"},"joining the Cosmos Hub mainnet"),". As the network grows, bandwidth, CPU, and memory requirements rise. Large hard drives are recommended for storing years of blockchain history, as well as significant RAM to process the increasing amount of transactions."),(0,n.yg)("h2",{id:"create-a-validator-website"},"Create a Validator Website"),(0,n.yg)("p",null,"To get started as a validator, create your dedicated validator website and signal your intention to become a validator in the ",(0,n.yg)("a",{parentName:"p",href:"https://discord.gg/interchain"},"Interchain Discord"),". Posting your validator website is essential because delegators want to have information about the entity they are delegating their ATOM to."),(0,n.yg)("h2",{id:"seek-legal-advice"},"Seek Legal Advice"),(0,n.yg)("p",null,"As always, do your own research and seek legal advice if you intend to run a validator node."),(0,n.yg)("h2",{id:"community"},"Community"),(0,n.yg)("p",null,"Discuss the finer details of being a validator on our community Discord and sign up for the Cosmos newsletter to get regular updates:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://discord.gg/interchain"},"Discord")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"https://cosmos.network/updates/signup/"},"Newsletter"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fb13cd97.67cc25d5.js b/assets/js/fb13cd97.67cc25d5.js new file mode 100644 index 00000000000..206ab8e47cc --- /dev/null +++ b/assets/js/fb13cd97.67cc25d5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[7826],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>m});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function s(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),p=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=p(a),g=r,m=c["".concat(l,".").concat(g)]||c[g]||h[g]||o;return a?n.createElement(m,i(i({ref:t},u),{},{components:a})):n.createElement(m,i({ref:t},u))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:r,i[1]=s;for(var p=2;p<o;p++)i[p]=a[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}g.displayName="MDXCreateElement"},372:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const o={title:"Joining Testnet",order:3},i=void 0,s={unversionedId:"hub-tutorials/join-testnet",id:"hub-tutorials/join-testnet",title:"Joining Testnet",description:"Visit the testnets repo for the most up-to-date information on the currently available public testnets:",source:"@site/docs/hub-tutorials/join-testnet.md",sourceDirName:"hub-tutorials",slug:"/hub-tutorials/join-testnet",permalink:"/main/hub-tutorials/join-testnet",draft:!1,tags:[],version:"current",frontMatter:{title:"Joining Testnet",order:3},sidebar:"tutorialSidebar",previous:{title:"Joining Mainnet",permalink:"/main/hub-tutorials/join-mainnet"},next:{title:"Upgrading the Chain",permalink:"/main/hub-tutorials/live-upgrade-tutorial"}},l={},p=[{value:"How to Join",id:"how-to-join",level:2},{value:"Create a Validator (Optional)",id:"create-a-validator-optional",level:2},{value:"Upgrading Your Node",id:"upgrading-your-node",level:2},{value:"Cosmovisor Upgrade Example",id:"cosmovisor-upgrade-example",level:3}],u={toc:p},c="wrapper";function h(e){let{components:t,...a}=e;return(0,r.yg)(c,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("p",null,"Visit the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/cosmos/testnets"},"testnets repo")," for the most up-to-date information on the currently available public testnets:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Interchain Security (ICS) Testnet: ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/cosmos/testnets/blob/master/interchain-security/provider/README.md"},(0,r.yg)("inlineCode",{parentName:"a"},"provider"))),(0,r.yg)("li",{parentName:"ul"},"Release Testnet: ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/cosmos/testnets/blob/master/release/README.md"},(0,r.yg)("inlineCode",{parentName:"a"},"theta-testnet-001")))),(0,r.yg)("h2",{id:"how-to-join"},"How to Join"),(0,r.yg)("p",null,"You can set up a testnet node with a single command using one of the options below:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Run a shell script from the testnets repo",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"https://github.com/cosmos/testnets/tree/master/interchain-security/provider#bash-script"},"ICS Testnet")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"https://github.com/cosmos/testnets/blob/master/release/README.md#bash-script"},"Release testnet")))),(0,r.yg)("li",{parentName:"ul"},"Run an Ansible playbook from the ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/hyphacoop/cosmos-ansible"},"cosmos-ansible")," repo",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"https://github.com/hyphacoop/cosmos-ansible/blob/main/examples/README.md#provider-chain"},"ICS Testnet")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"https://github.com/hyphacoop/cosmos-ansible/blob/main/examples/README.md#join-the-cosmos-hub-release-testnet"},"Release Testnet"))))),(0,r.yg)("h2",{id:"create-a-validator-optional"},"Create a Validator (Optional)"),(0,r.yg)("p",null,"If you want to create a validator in either testnet, request tokens through the ",(0,r.yg)("a",{parentName:"p",href:"https://discord.com/channels/669268347736686612/953697793476821092"},"faucet Discord channel")," and follow the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/cosmos/testnets/blob/master/interchain-security/VALIDATOR_JOINING_GUIDE.md#creating-a-validator-on-the-provider-chain"},"this guide"),". If you are creating a validator in the Release Testnet, you can disregard the instructions about joining live consumer chains."),(0,r.yg)("h2",{id:"upgrading-your-node"},"Upgrading Your Node"),(0,r.yg)("p",null,"Follow these instructions if you have a node that is already synced and wish to participate in a scheduled testnet software upgrade."),(0,r.yg)("p",null,"When the chain reaches the upgrade block height specified by a software upgrade proposal, the chain binary will halt and expect the new binary to be run (the system log will show ",(0,r.yg)("inlineCode",{parentName:"p"},'ERR UPGRADE "<Upgrade name>" NEEDED at height: XXXX')," or something similar)."),(0,r.yg)("p",null,"There are three ways you can update the binary:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Without Cosmovisor: You must build or download the new binary ahead of the upgrade. When the chain binary halts at the upgrade height:")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Stop the gaiad service with ",(0,r.yg)("inlineCode",{parentName:"li"},"systemctl stop gaiad.service"),"."),(0,r.yg)("li",{parentName:"ul"},"Build or download the new binary, replacing the existing ",(0,r.yg)("inlineCode",{parentName:"li"},"~/go/bin")," one."),(0,r.yg)("li",{parentName:"ul"},"Start the gaiad service with ",(0,r.yg)("inlineCode",{parentName:"li"},"systemctl start gaiad.service"),".")),(0,r.yg)("ol",{start:2},(0,r.yg)("li",{parentName:"ol"},"With Cosmovisor: You must build or download the new binary and copy it to the appropriate folder ahead of the upgrade."),(0,r.yg)("li",{parentName:"ol"},"With Cosmovisor: Using the auto-download feature, assuming the proposal includes the binaries for your system architecture.")),(0,r.yg)("p",null,"The instructions below are for option 2. For more information on auto-download with Cosmovisor, see the relevant ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/cosmos/cosmos-sdk/tree/main/tools/cosmovisor#auto-download"},"documentation")," in the Cosmos SDK repo."),(0,r.yg)("p",null,"If the environment variable ",(0,r.yg)("inlineCode",{parentName:"p"},"DAEMON_ALLOW_DOWNLOAD_BINARIES")," is set to ",(0,r.yg)("inlineCode",{parentName:"p"},"false"),", Cosmovisor will look for the new binary in a folder that matches the name of the upgrade specified in the software upgrade proposal."),(0,r.yg)("h3",{id:"cosmovisor-upgrade-example"},"Cosmovisor Upgrade Example"),(0,r.yg)("p",null,"Using the ",(0,r.yg)("inlineCode",{parentName:"p"},"v17")," upgrade as an example, the expected folder structure would look as follows:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},".gaia\n\u2514\u2500\u2500 cosmovisor\n \u251c\u2500\u2500 current\n \u251c\u2500\u2500 genesis\n \u2502 \u2514\u2500\u2500 bin\n | \u2514\u2500\u2500 gaiad\n \u2514\u2500\u2500 upgrades\n \u2514\u2500\u2500 v17\n \u2514\u2500\u2500 bin\n \u2514\u2500\u2500 gaiad\n")),(0,r.yg)("p",null,"Prepare the upgrade directory"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"mkdir -p ~/.gaia/cosmovisor/upgrades/v17/bin\n")),(0,r.yg)("p",null,"Download and install the new binary version."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"cd $HOME/gaia\ngit pull\ngit checkout v17.0.0-rc0\nmake install\n\n# Copy the new binary to the v17 upgrade directory\ncp ~/go/bin/gaiad ~/.gaia/cosmovisor/upgrades/v17/bin/gaiad\n")),(0,r.yg)("p",null,"When the upgrade height is reached, Cosmovisor will stop the gaiad binary, update the symlink from ",(0,r.yg)("inlineCode",{parentName:"p"},"current")," to the relevant upgrade folder, and restart. After a few minutes, the node should start syncing blocks using the new binary."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fb286465.db999e83.js b/assets/js/fb286465.db999e83.js new file mode 100644 index 00000000000..fb72746bfa3 --- /dev/null +++ b/assets/js/fb286465.db999e83.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[6112],{5680:(e,t,o)=>{o.d(t,{xA:()=>u,yg:()=>g});var a=o(6540);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function n(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,a)}return o}function i(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?n(Object(o),!0).forEach((function(t){r(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):n(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}function s(e,t){if(null==e)return{};var o,a,r=function(e,t){if(null==e)return{};var o,a,r={},n=Object.keys(e);for(a=0;a<n.length;a++)o=n[a],t.indexOf(o)>=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a<n.length;a++)o=n[a],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},h="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var o=e.components,r=e.mdxType,n=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),h=p(o),c=r,g=h["".concat(l,".").concat(c)]||h[c]||d[c]||n;return o?a.createElement(g,i(i({ref:t},u),{},{components:o})):a.createElement(g,i({ref:t},u))}));function g(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=o.length,i=new Array(n);i[0]=c;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[h]="string"==typeof e?e:r,i[1]=s;for(var p=2;p<n;p++)i[p]=o[p];return a.createElement.apply(null,i)}return a.createElement.apply(null,o)}c.displayName="MDXCreateElement"},9038:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>n,metadata:()=>s,toc:()=>p});var a=o(8168),r=(o(6540),o(5680));const n={title:"Off-Chain Proposal Process",order:3},i=void 0,s={unversionedId:"governance/best-practices",id:"governance/best-practices",title:"Off-Chain Proposal Process",description:"Once a proposal is on-chain, it cannot be changed to reflect feedback or new information. It's very important to give a proposal time off-chain to receive feedback, input, and edits before going on-chain and asking for votes.",source:"@site/docs/governance/best-practices.md",sourceDirName:"governance",slug:"/governance/best-practices",permalink:"/main/governance/best-practices",draft:!1,tags:[],version:"current",frontMatter:{title:"Off-Chain Proposal Process",order:3},sidebar:"tutorialSidebar",previous:{title:"Text (Signaling)",permalink:"/main/governance/proposal-types/text-prop"},next:{title:"Formatting a Proposal",permalink:"/main/governance/formatting"}},l={},p=[{value:"Engage directly with the voting community and seek feedback",id:"engage-directly-with-the-voting-community-and-seek-feedback",level:2},{value:"Stage 1: Your Idea",id:"stage-1-your-idea",level:2},{value:"Not yet confident about your idea?",id:"not-yet-confident-about-your-idea",level:3},{value:"Confident with your idea?",id:"confident-with-your-idea",level:3},{value:"Are you ready to draft a governance proposal?",id:"are-you-ready-to-draft-a-governance-proposal",level:3},{value:"Stage 2: Your Draft Proposal",id:"stage-2-your-draft-proposal",level:2},{value:"Proposal Elements",id:"proposal-elements",level:3},{value:"Parameter-Change",id:"parameter-change",level:4},{value:"Community-Spend Proposal",id:"community-spend-proposal",level:4},{value:"Begin with a well-considered draft proposal",id:"begin-with-a-well-considered-draft-proposal",level:3},{value:"Engage the community with your draft proposal",id:"engage-the-community-with-your-draft-proposal",level:3},{value:"Submit your proposal to the testnet",id:"submit-your-proposal-to-the-testnet",level:3},{value:"Stage 3: Your On-Chain Proposal",id:"stage-3-your-on-chain-proposal",level:2},{value:"The Deposit Period",id:"the-deposit-period",level:3},{value:"The Voting Period",id:"the-voting-period",level:3}],u={toc:p},h="wrapper";function d(e){let{components:t,...o}=e;return(0,r.yg)(h,(0,a.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("p",null,"Once a proposal is on-chain, it cannot be changed to reflect feedback or new information. It's very important to give a proposal time off-chain to receive feedback, input, and edits before going on-chain and asking for votes. "),(0,r.yg)("p",null,"The process of passing a proposal starts long before it goes on-chain!"),(0,r.yg)("p",null,"There are currently several types of proposals supported by the Cosmos Hub: "),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},(0,r.yg)("a",{parentName:"strong",href:"/main/governance/proposal-types/text-prop"},"Text"))," - Proposal to agree to a certain strategy, plan, commitment, future upgrade or other statement. Text proposals do not directly cause any changes, but they can be used to take a record of the community's opinion or commitment to a future idea."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"/main/governance/proposal-types/community-pool-spend"},(0,r.yg)("strong",{parentName:"a"},"Community Pool Spend"))," - Proposal to spend funds from the community pool on a project."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"/main/governance/proposal-types/param-change"},(0,r.yg)("strong",{parentName:"a"},"Parameter Change"))," - Proposal to change a core on-chain parameter."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"Software Upgrade")," - Proposal to upgrade the chain version."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"IBC Client Update")," - Proposal to update an IBC client.")),(0,r.yg)("p",null,"You'll first want to determine which kind of proposal you are making. Be sure to review all details of your specific proposal type. "),(0,r.yg)("h2",{id:"engage-directly-with-the-voting-community-and-seek-feedback"},"Engage directly with the voting community and seek feedback"),(0,r.yg)("p",null,"Engagement is likely to be critical to the success of a proposal. The degree to which you engage with the Cosmos Hub community should be relative to the potential impact that your proposal may have on the stakeholders. This guide does not cover all ways of engaging but here are some suggestions: "),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Post your idea to the ",(0,r.yg)("a",{parentName:"p",href:"https://forum.cosmos.network/"},"Cosmos Hub Forum"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Mention the idea in a community call (often hosted on ",(0,r.yg)("a",{parentName:"p",href:"https://twitter.com/CosmosHub"},"Twitter"),")")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Host an AMA on ",(0,r.yg)("a",{parentName:"p",href:"https://www.reddit.com/r/cosmosnetwork"},"Reddit")," "),(0,r.yg)("p",{parentName:"li"},"We encourage you to experiment and use your strengths to introduce proposal ideas and gather feedback."))),(0,r.yg)("p",null,"There are many different ways to engage. One strategy involves a few stages of engagement before and after submitting a proposal on chain. "),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Why do it in stages?")," It's a more conservative approach to save resources. The idea is to check in with key stakeholders at each stage before investing more resources into developing your proposal."),(0,r.yg)("p",null,"In the first stage of this strategy, you should engage people (ideally experts) informally about your idea. You'll want to start with the minimal, critical components (name, value to Cosmos Hub, timeline, any funding needs) and check:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Does it make sense? "),(0,r.yg)("li",{parentName:"ul"},"Are there critical flaws? "),(0,r.yg)("li",{parentName:"ul"},"How will this affect other projects or properties of the Hub? ")),(0,r.yg)("p",null,"You should be engaging with key stakeholders (e.g., a large validator operator) with a few short sentences to measure their support. Here's an example:"),(0,r.yg)("p",null,'"We are considering a proposal for funding to work on ',(0,r.yg)("inlineCode",{parentName:"p"},"project"),". We think it will help the Hub to ",(0,r.yg)("inlineCode",{parentName:"p"},"outcome"),". Timeline is ",(0,r.yg)("inlineCode",{parentName:"p"},"x"),", and we're asking for ",(0,r.yg)("inlineCode",{parentName:"p"},"y")," amount. Do you think that this is a proposal that ",(0,r.yg)("inlineCode",{parentName:"p"},"large validator"),' may support?"'),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Why a large validator?")," They tend to be the de facto decision-makers on the Cosmos Hub, since their delegators also delegate their voting power. If you can establish a base layer of off-chain support, you can be more confident that it's worth proceeding to the next stage."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Note:")," Many validators will likely hesitate to commit support, and that's okay. It will be important to reassure these stakeholders that this isn't a binding commitment. You're just canvasing the community to get a feel for whether it's worthwhile to proceed. It's also an opportunity to connect with new people and to answer their questions about what it is you're working on. It will be important for them to clearly understand why you think what you're proposing will be valuable to the Cosmos Hub, and if possible, why it will be valuable to them as long-term stakeholders."),(0,r.yg)("p",null,"If you're already confident about your idea, ",(0,r.yg)("a",{parentName:"p",href:"#stage-2-your-draft-proposal"},"skip to Stage 2"),"."),(0,r.yg)("h2",{id:"stage-1-your-idea"},"Stage 1: Your Idea"),(0,r.yg)("h3",{id:"not-yet-confident-about-your-idea"},"Not yet confident about your idea?"),(0,r.yg)("p",null,"Great! Governance proposals potentially impact many stakeholders. Introduce your idea with known members of the community before investing resources into drafting a proposal. Don't let negative feedback dissuade you from exploring your idea if you think that it's still important. "),(0,r.yg)("p",null,"If you know people who are very involved with the Cosmos Hub, send them a private message with a concise overview of what you think will result from your idea or proposed changes. Wait for them to ask questions before providing details. Do the same in semi-private channels where people tend to be respectful (and hopefully supportive). "),(0,r.yg)("h3",{id:"confident-with-your-idea"},"Confident with your idea?"),(0,r.yg)("p",null,"Great! However, remember that governance proposals potentially impact many stakeholders, which can happen in unexpected ways. Introduce your idea with members of the community before investing resources into drafting a proposal. At this point you should seek out and carefully consider critical feedback in order to protect yourself from ",(0,r.yg)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Confirmation_bias"},"confirmation bias"),". This is the ideal time to see a critical flaw, because submitting a flawed proposal on-chain will waste resources and have reputational costs."),(0,r.yg)("p",null,"Posting your idea to the ",(0,r.yg)("a",{parentName:"p",href:"https://forum.cosmos.network/"},"Cosmos Hub Forum")," is a great way to get broad feedback and perspective even if you don't have personal connections to any stakeholders or involved parties."),(0,r.yg)("h3",{id:"are-you-ready-to-draft-a-governance-proposal"},"Are you ready to draft a governance proposal?"),(0,r.yg)("p",null,"There will likely be differences of opinion about the value of what you're proposing to do and the strategy by which you're planning to do it. If you've considered feedback from broad perspectives and think that what you're doing is valuable and that your strategy should work, and you believe that others feel this way as well, it's likely worth drafting a proposal. However, remember that the largest ATOM stakers have the biggest vote, so a vocal minority isn't necessarily representative or predictive of the outcome of an on-chain vote. "),(0,r.yg)("p",null,"You could choose to take a conservative approach and wait until you have some confidence that you roughly have initial support from a majority of the voting power before proceeding to drafting the details of your proposal. Or you could propose the idea, or define the problem statement and let the community participate freely in drafting competing solutions to solve the issue."),(0,r.yg)("h2",{id:"stage-2-your-draft-proposal"},"Stage 2: Your Draft Proposal"),(0,r.yg)("p",null,"The next major section outlines and describes some potential elements of drafting a proposal. Ensure that you have considered your proposal and anticipated questions that the community will likely ask. ",(0,r.yg)("strong",{parentName:"p"},"Once your proposal is on-chain, you will not be able to change it.")),(0,r.yg)("h3",{id:"proposal-elements"},"Proposal Elements"),(0,r.yg)("p",null,"It will be important to balance two things: being detailed and being concise. You'll want to be concise so that people can assess your proposal quickly. You'll want to be detailed so that voters will have a clear, meaningful understanding of what the changes are and how they are likely to be impacted."),(0,r.yg)("p",null,"Each major proposal type has a rough template available on the forum: ",(0,r.yg)("a",{parentName:"p",href:"https://forum.cosmos.network/t/about-the-signaling-text-category/5947"},"Text"),", ",(0,r.yg)("a",{parentName:"p",href:"https://forum.cosmos.network/t/about-the-community-spend-category/5949"},"community pool spend"),", ",(0,r.yg)("a",{parentName:"p",href:"https://forum.cosmos.network/t/about-the-parameter-change-category/5950"},"parameter change"),", ",(0,r.yg)("a",{parentName:"p",href:"https://forum.cosmos.network/t/about-the-software-upgrade-category/5951"},"software upgrade"),"."),(0,r.yg)("p",null,"Each proposal should contain a summary with key details about what the proposal hopes to change. If you were viewing only the summary with no other context, it should be a good start to being able to make a decision."),(0,r.yg)("p",null,"Assume that many people will stop reading at this point. However it is important to provide in-depth information. The on-chain proposal text should also include a link to an un-editable version of the text, such as an IPFS pin, and a link to where discussion about the idea is happening."),(0,r.yg)("p",null,"A few more pointers for Parameter-change and Community Spend proposals are below."),(0,r.yg)("h4",{id:"parameter-change"},"Parameter-Change"),(0,r.yg)("p",null,"An example of a successful parameter change proposal is ",(0,r.yg)("a",{parentName:"p",href:"https://forum.cosmos.network/t/proposal-66-accepted-increase-active-validator-spots-to-175/6118/53"},"Proposal #66"),". Note that this proposal went on-chain without the recommended IPFS pin."),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Problem/Value - The problem or value that's motivating the parameter change(s)."),(0,r.yg)("li",{parentName:"ol"},"Solution - How changing the parameter(s) will address the problem or improve the network."),(0,r.yg)("li",{parentName:"ol"},"Risks & Benefits - How making this/these change(s) may expose stakeholders to new benefits and/or risks.",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"The beneficiaries of the change(s) (ie. who will these changes impact and how?)"),(0,r.yg)("li",{parentName:"ul"},"Voters should understand the importance of the change(s) in a simple way"))),(0,r.yg)("li",{parentName:"ol"},"Supplementary materials - Optional materials eg. models, graphs, tables, research, signed petition, etc")),(0,r.yg)("h4",{id:"community-spend-proposal"},"Community-Spend Proposal"),(0,r.yg)("p",null,"An example of a successful community spend proposal is ",(0,r.yg)("a",{parentName:"p",href:"https://forum.cosmos.network/t/proposal-63-accepted-activate-governance-discussions-on-the-discourse-forum-using-community-pool-funds/5833"},"Proposal #63"),"."),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Applicant(s) - The profile of the person(s)/entity making the proposal.",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"Who you are and your involvement in Cosmos and/or other blockchain networks."),(0,r.yg)("li",{parentName:"ul"},"An overview of team members involved and their relevant experience."))),(0,r.yg)("li",{parentName:"ol"},"Problem - What you're solving and/or opportunity you're addressing.",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"Past, present (and possibly a prediction of the future without this work being done)."))),(0,r.yg)("li",{parentName:"ol"},"Solution - How you're proposing to deliver the solution.",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"Your plan to fix the problem or deliver value."),(0,r.yg)("li",{parentName:"ul"},"The beneficiaries of this plan (ie. who will your plan impact and how?)."),(0,r.yg)("li",{parentName:"ul"},"Your reasons for selecting this plan."),(0,r.yg)("li",{parentName:"ul"},"Your motivation for delivering this solution/value."))),(0,r.yg)("li",{parentName:"ol"},"Funding - amount and denomination proposed eg. 5000 ATOM.",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"The entity controlling the account receiving the funding."),(0,r.yg)("li",{parentName:"ul"},"Consider an itemized breakdown of funding per major deliverable."),(0,r.yg)("li",{parentName:"ul"},"Note that the 'budget' of a spend proposal is generally the easiest thing to criticize. If your budget is vague, consider explaining the reasons you're unable to give a detailed breakdown and be clear about what happens if you do not meet your budget."))),(0,r.yg)("li",{parentName:"ol"},"Deliverables and timeline - the specifics of what you're delivering and how, and what to expect.",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"What are the specific deliverables? (be detailed)."),(0,r.yg)("li",{parentName:"ul"},"When will each of these be delivered?"),(0,r.yg)("li",{parentName:"ul"},"How will each of these be delivered?"),(0,r.yg)("li",{parentName:"ul"},"What will happen if you do not deliver on time?"),(0,r.yg)("li",{parentName:"ul"},"Do you have a plan to return the funds if you're under-budget or the project fails?"),(0,r.yg)("li",{parentName:"ul"},"How will you be accountable to the Cosmos Hub stakeholders?",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"How will you communicate updates and how often?"),(0,r.yg)("li",{parentName:"ul"},"How can the community observe your progress?"),(0,r.yg)("li",{parentName:"ul"},"How can the community provide feedback?"))),(0,r.yg)("li",{parentName:"ul"},"How should the quality of deliverables be assessed? eg. metrics."))),(0,r.yg)("li",{parentName:"ol"},"Relationships and disclosures.",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"Have you received or applied for grants or funding? for similar work? eg. from the Interchain Foundation."),(0,r.yg)("li",{parentName:"ul"},"How will you and/or your organization benefit?"),(0,r.yg)("li",{parentName:"ul"},"Do you see this work continuing in the future and is there a plan?"),(0,r.yg)("li",{parentName:"ul"},"What are the risks involved with this work?"),(0,r.yg)("li",{parentName:"ul"},"Do you have conflicts of interest to declare?")))),(0,r.yg)("h3",{id:"begin-with-a-well-considered-draft-proposal"},"Begin with a well-considered draft proposal"),(0,r.yg)("p",null,"Ideally, a proposal is first sent to the forum in Markdown format so that it can be further edited and available for comments. A changelog is a great tool so that people can see how the idea has developed over time and in response to feedback."),(0,r.yg)("p",null,"This Markdown-formatted post can eventually become the description text in a proposal sent on-chain."),(0,r.yg)("h3",{id:"engage-the-community-with-your-draft-proposal"},"Engage the community with your draft proposal"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},"Post a draft of your proposal as a topic in the appropriate category of the forum. ",(0,r.yg)("a",{parentName:"p",href:"https://forum.cosmos.network/c/hub-proposals"},"Hub Proposals")," is a catch-all if you are not sure where to post, but there are categories for all types of proposals.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},"Directly engage key members of the community for feedback. These could be large contributors, those likely to be most impacted by the proposal, and entities with high stake-backing (eg. high-ranked validators; large stakers)."))),(0,r.yg)("ol",{start:3},(0,r.yg)("li",{parentName:"ol"},"Alert the entire community to the draft proposal on other platforms such as Twitter, tagging accounts such as the ",(0,r.yg)("a",{parentName:"li",href:"https://twitter.com/cosmoshub"},"Cosmos Hub account"),", the ",(0,r.yg)("a",{parentName:"li",href:"https://twitter.com/CosmosGov"},"Cosmos Governance account"),", and other governance-focused groups.")),(0,r.yg)("h3",{id:"submit-your-proposal-to-the-testnet"},"Submit your proposal to the testnet"),(0,r.yg)("p",null,"Before going on mainnet, you can test your proposal on the ",(0,r.yg)("a",{parentName:"p",href:"/main/governance/submitting#submitting-your-proposal-to-the-testnet"},"testnet"),". "),(0,r.yg)("p",null,"This is a great way to make sure your proposal looks the way you want and refine it before heading to mainnet."),(0,r.yg)("h2",{id:"stage-3-your-on-chain-proposal"},"Stage 3: Your On-Chain Proposal"),(0,r.yg)("p",null,"A majority of the voting community should probably be aware of the proposal and have considered it before the proposal goes live on-chain. If you're taking a conservative approach, you should have reasonable confidence that your proposal will pass before risking deposit contributions. Make revisions to your draft proposal after each stage of engagement."),(0,r.yg)("p",null,"See the ",(0,r.yg)("a",{parentName:"p",href:"/main/governance/submitting"},"submitting guide")," for more on submitting proposals."),(0,r.yg)("h3",{id:"the-deposit-period"},"The Deposit Period"),(0,r.yg)("p",null,"The deposit period currently lasts 14 days. If you submitted your transaction with the minimum deposit (250 ATOM), your proposal will immediately enter the voting period. If you didn't submit the minimum deposit amount (currently 250 ATOM), then this may be an opportunity for others to show their support by contributing (and risking) their ATOMs as a bond for your proposal. You can request contributions openly and also contact stakeholders directly (particularly stakeholders who are enthusiastic about your proposal). Remember that each contributor is risking their funds, and you can ",(0,r.yg)("a",{parentName:"p",href:"/main/governance/process#burned-deposits"},"read more about the conditions for burning deposits here"),"."),(0,r.yg)("p",null,"This is a stage where proposals may begin to get broader attention. Some block explorers display proposals in the deposit period, while others don't show them until they hit voting period."),(0,r.yg)("p",null,"A large cross-section of the blockchain/cryptocurrency community exists on Twitter. Having your proposal in the deposit period is a good time to engage the so-called 'crypto Twitter' Cosmos community to prepare validators to vote (eg. tag ",(0,r.yg)("a",{parentName:"p",href:"https://twitter.com/cosmosvalidator"},"@cosmosvalidator"),") and ATOM-holders that are staking (eg. tag ",(0,r.yg)("a",{parentName:"p",href:"https://twitter.com/cosmoshub"},"@cosmoshub"),", ",(0,r.yg)("a",{parentName:"p",href:"https://twitter.com/CosmosGov"},"@CosmosGov"),"). "),(0,r.yg)("h3",{id:"the-voting-period"},"The Voting Period"),(0,r.yg)("p",null,"At this point you'll want to track which validator has voted and which has not. You'll want to re-engage directly with top stake-holders, ie. the highest-ranking validator operators, to ensure that:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"they are aware of your proposal;"),(0,r.yg)("li",{parentName:"ol"},"they can ask you any questions about your proposal; and"),(0,r.yg)("li",{parentName:"ol"},"they are prepared to vote.")),(0,r.yg)("p",null,"Remember that any voter may change their vote at any time before the voting period ends. That historically doesn't happen often, but there may be an opportunity to convince a voter to change their vote. The biggest risk is that stakeholders won't vote at all (for a number of reasons). Validator operators tend to need multiple reminders to vote. How you choose to contact validator operators, how often, and what you say is up to you--remember that no validator is obligated to vote, and that operators are likely occupied by competing demands for their attention. Take care not to stress any potential relationship with validator operators."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fbd7a87c.bcce9ca2.js b/assets/js/fbd7a87c.bcce9ca2.js new file mode 100644 index 00000000000..5309796aa36 --- /dev/null +++ b/assets/js/fbd7a87c.bcce9ca2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[1361],{5680:(e,n,t)=>{t.d(n,{xA:()=>p,yg:()=>m});var a=t(6540);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function r(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?r(Object(t),!0).forEach((function(n){i(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):r(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function s(e,n){if(null==e)return{};var t,a,i=function(e,n){if(null==e)return{};var t,a,i={},r=Object.keys(e);for(a=0;a<r.length;a++)t=r[a],n.indexOf(t)>=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)t=r[a],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var c=a.createContext({}),l=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},p=function(e){var n=l(e.components);return a.createElement(c.Provider,{value:n},e.children)},u="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,i=e.mdxType,r=e.originalType,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(t),d=i,m=u["".concat(c,".").concat(d)]||u[d]||g[d]||r;return t?a.createElement(m,o(o({ref:n},p),{},{components:t})):a.createElement(m,o({ref:n},p))}));function m(e,n){var t=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var r=t.length,o=new Array(r);o[0]=d;var s={};for(var c in n)hasOwnProperty.call(n,c)&&(s[c]=n[c]);s.originalType=e,s[u]="string"==typeof e?e:i,o[1]=s;for(var l=2;l<r;l++)o[l]=t[l];return a.createElement.apply(null,o)}return a.createElement.apply(null,t)}d.displayName="MDXCreateElement"},5760:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>g,frontMatter:()=>r,metadata:()=>s,toc:()=>l});var a=t(8168),i=(t(6540),t(5680));const r={title:"Quick Start - Join Mainnet",sidebar_position:3},o=void 0,s={unversionedId:"getting-started/quickstart",id:"getting-started/quickstart",title:"Quick Start - Join Mainnet",description:"Bootstrap a cosmoshub-4 mainnet node",source:"@site/docs/getting-started/quickstart.md",sourceDirName:"getting-started",slug:"/getting-started/quickstart",permalink:"/main/getting-started/quickstart",draft:!1,tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Quick Start - Join Mainnet",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Installing Gaia",permalink:"/main/getting-started/installation"},next:{title:"System requirements",permalink:"/main/getting-started/system-requirements"}},c={},l=[{value:"Prerequisites",id:"prerequisites",level:3},{value:"Sync Options",id:"sync-options",level:3},{value:"State Sync",id:"state-sync",level:4},{value:"Quick Sync",id:"quick-sync",level:4},{value:"Create Gaia Home & Config",id:"create-gaia-home--config",level:5},{value:"Start Quicksync Download",id:"start-quicksync-download",level:5},{value:"Default",id:"default",level:6},{value:"Pruned",id:"pruned",level:6},{value:"Archive",id:"archive",level:6},{value:"Unzip",id:"unzip",level:5},{value:"Copy Address Book Quicksync",id:"copy-address-book-quicksync",level:5},{value:"Start Gaia",id:"start-gaia",level:5}],p={toc:l},u="wrapper";function g(e){let{components:n,...t}=e;return(0,i.yg)(u,(0,a.A)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,i.yg)("p",null,(0,i.yg)("strong",{parentName:"p"},"Bootstrap a ",(0,i.yg)("inlineCode",{parentName:"strong"},"cosmoshub-4")," mainnet node")),(0,i.yg)("h3",{id:"prerequisites"},"Prerequisites"),(0,i.yg)("blockquote",null,(0,i.yg)("p",{parentName:"blockquote"},(0,i.yg)("strong",{parentName:"p"},"Note"),": Make sure the ",(0,i.yg)("a",{parentName:"p",href:"/main/getting-started/installation"},"Gaia CLI is installed"),".")),(0,i.yg)("h3",{id:"sync-options"},"Sync Options"),(0,i.yg)("p",null,"To quickly get started, node operators can choose to sync via State Sync or by downloading a snapshot from Quicksync. State Sync works by replaying larger chunks of application state directly rather than replaying individual blocks or consensus rounds. Quicksync is a service provided courtesy of ChainLayer, and offers historical state of the chain available for download every 24 hours. For more advanced information on setting up a node, see the Sync Options section of the full ",(0,i.yg)("a",{parentName:"p",href:"/main/hub-tutorials/join-mainnet"},"Joining Mainnet Tutorial")),(0,i.yg)("h4",{id:"state-sync"},"State Sync"),(0,i.yg)("p",null,"To enable state sync, visit an ",(0,i.yg)("a",{parentName:"p",href:"https://www.mintscan.io/cosmos/blocks"},"explorer")," to get a recent block height and corresponding hash. A node operator can choose any height/hash in the current bonding period, but as the recommended snapshot period is 1000 blocks, it is advised to choose something close to current height - 1000. Set these parameters in the code snippet below ",(0,i.yg)("inlineCode",{parentName:"p"},"<BLOCK_HEIGHT>")," and ",(0,i.yg)("inlineCode",{parentName:"p"},"<BLOCK_HASH>")),(0,i.yg)("p",null,"For reference, the list of ",(0,i.yg)("inlineCode",{parentName:"p"},"rpc_servers")," and ",(0,i.yg)("inlineCode",{parentName:"p"},"persistent")," peers can be found in the ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/cosmos/chain-registry/blob/master/cosmoshub/chain.json"},"cosmos hub chain-registry repo"),"."),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"# Build gaiad binary and initialize chain\ncd $HOME\ngit clone -b v18.0.0 https://github.com/cosmos/gaia --depth=1\ncd gaiad\nmake install\ngaiad init CUSTOM_MONIKER --chain-id cosmoshub-4\n\n#Set minimum gas price & peers\nsed -i'' 's/minimum-gas-prices = \"\"/minimum-gas-prices = \"0.0025uatom\"/' $HOME/.gaia/config/app.toml\nsed -i'' 's/persistent_peers = \"\"/persistent_peers = '\"\\\"$(curl -s https://raw.githubusercontent.com/cosmos/chain-registry/master/cosmoshub/chain.json | jq -r '[foreach .peers.seeds[] as $item (\"\"; \"\\($item.id)@\\($item.address)\")] | join(\",\")')\\\"\"'/' $HOME/.gaia/config/config.toml\n\n# Configure State sync\nsed -i'' 's/enable = false/enable = true/' $HOME/.gaia/config/config.toml\nsed -i'' 's/trust_height = 0/trust_height = <BLOCK_HEIGHT>/' $HOME/.gaia/config/config.toml\nsed -i'' 's/trust_hash = \"\"/trust_hash = \"<BLOCK_HASH>\"/' $HOME/.gaia/config/config.toml\nsed -i'' 's/rpc_servers = \"\"/rpc_servers = \"https:\\/\\/cosmos-rpc.polkachu.com:443,https:\\/\\/rpc-cosmoshub-ia.cosmosia.notional.ventures:443,https:\\/\\/rpc.cosmos.network:443\"/' $HOME/.gaia/config/config.toml\n\n#Start Gaia\ngaiad start --x-crisis-skip-assert-invariants\n")),(0,i.yg)("h4",{id:"quick-sync"},"Quick Sync"),(0,i.yg)("p",null,(0,i.yg)("strong",{parentName:"p"},"Note"),": Make sure to set the ",(0,i.yg)("inlineCode",{parentName:"p"},"--home")," flag when initializing and starting ",(0,i.yg)("inlineCode",{parentName:"p"},"gaiad")," if mounting quicksync data externally."),(0,i.yg)("h5",{id:"create-gaia-home--config"},"Create Gaia Home & Config"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"mkdir $HOME/.gaia/config -p\n")),(0,i.yg)("h5",{id:"start-quicksync-download"},"Start Quicksync Download"),(0,i.yg)("p",null,"Node Operators can decide how much of historical state they want to preserve by choosing between ",(0,i.yg)("inlineCode",{parentName:"p"},"Pruned"),", ",(0,i.yg)("inlineCode",{parentName:"p"},"Default"),", and ",(0,i.yg)("inlineCode",{parentName:"p"},"Archive"),". See the ",(0,i.yg)("a",{parentName:"p",href:"https://quicksync.io/networks/cosmos.html"},"Quicksync.io downloads")," for up-to-date snapshot sizes."),(0,i.yg)("h6",{id:"default"},"Default"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash="},"sudo apt-get install wget liblz4-tool aria2 jq -y\n\nexport URL=`curl -L https://quicksync.io/cosmos.json|jq -r '.[] |select(.file==\"cosmoshub-4-default\")|.url'`\n\necho $URL\n\ncd $HOME/.gaia\n\naria2c -x5 $URL\n")),(0,i.yg)("h6",{id:"pruned"},"Pruned"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash="},"sudo apt-get install wget liblz4-tool aria2 jq -y\n\nexport URL=`curl -L https://quicksync.io/cosmos.json|jq -r '.[] |select(.file==\"cosmoshub-4-pruned\")|.url'`\n\necho $URL\n\ncd $HOME/.gaia\n\naria2c -x5 $URL\n")),(0,i.yg)("h6",{id:"archive"},"Archive"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash="},"sudo apt-get install wget liblz4-tool aria2 jq -y\n\nexport URL=`curl -L https://quicksync.io/cosmos.json|jq -r '.[] |select(.file==\"cosmoshub-4-archive\")|.url'`\n\necho $URL\n\ncd $HOME/.gaia\n\naria2c -x5 $URL\n")),(0,i.yg)("p",null,(0,i.yg)("strong",{parentName:"p"},"The download logs should look like the following")),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre"},"01/11 07:48:17 [NOTICE] Downloading 1 item(s)\n[#7cca5a 484MiB/271GiB(0%) CN:5 DL:108MiB ETA:42m41s]\n")),(0,i.yg)("p",null,(0,i.yg)("strong",{parentName:"p"},"Completed Download Process:")),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre"},"[#7cca5a 271GiB/271GiB(99%) CN:1 DL:77MiB]\n01/11 08:32:19 [NOTICE] Download complete: /mnt/quicksync_01/cosmoshub-4-pruned.20220111.0310.tar.lz4\n\nDownload Results:\ngid |stat|avg speed |path/URI\n======+====+===========+=======================================================\n7cca5a|OK | 105MiB/s|/mnt/quicksync_01/cosmoshub-4-pruned.20220111.0310.tar.lz4\n\nStatus Legend:\n(OK):download completed.\n")),(0,i.yg)("h5",{id:"unzip"},"Unzip"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"lz4 -c -d `basename $URL` | tar xf -\n")),(0,i.yg)("h5",{id:"copy-address-book-quicksync"},"Copy Address Book Quicksync"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"curl https://quicksync.io/addrbook.cosmos.json > $HOME/.gaia/config/addrbook.json\n")),(0,i.yg)("h5",{id:"start-gaia"},"Start Gaia"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"gaiad start --x-crisis-skip-assert-invariants\n\n")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.6b3d2fac.js b/assets/js/main.6b3d2fac.js new file mode 100644 index 00000000000..72eec734e85 --- /dev/null +++ b/assets/js/main.6b3d2fac.js @@ -0,0 +1,2 @@ +/*! For license information please see main.6b3d2fac.js.LICENSE.txt */ +(self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[]).push([[8792],{9188:(e,t,n)=>{"use strict";n.d(t,{W:()=>a});var r=n(6540);function a(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20","aria-hidden":"true"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var r=n(6540),a=n(8168),o=n(3259),i=n.n(o),l=n(4054);const s={"0b65cac9":[()=>n.e(8070).then(n.bind(n,2052)),"@site/docs/architecture/adr/adr-002-globalfee.md",2052],"0ce6bca3":[()=>n.e(4036).then(n.bind(n,4829)),"@site/docs/architecture/PROCESS.md",4829],"1094a517":[()=>n.e(8637).then(n.bind(n,7156)),"@site/docs/governance/formatting.md",7156],"12e4c223":[()=>n.e(7999).then(n.bind(n,1188)),"@site/docs/modules/lsm-staking.md",1188],17896441:[()=>Promise.all([n.e(1869),n.e(8401)]).then(n.bind(n,6140)),"@theme/DocItem",6140],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,9057)),"@theme/SearchPage",9057],"1be78505":[()=>Promise.all([n.e(1869),n.e(8714)]).then(n.bind(n,10)),"@theme/DocPage",10],"1ca1b9c8":[()=>n.e(3819).then(n.t.bind(n,1966,19)),"/home/runner/work/gaia/gaia/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",1966],"2222b3a9":[()=>n.e(1424).then(n.bind(n,4198)),"@site/docs/resources/reproducible-builds.md",4198],"25a82047":[()=>n.e(5098).then(n.bind(n,4200)),"@site/docs/architecture/templates/adr-template.md",4200],"2d8dbdf9":[()=>n.e(1236).then(n.bind(n,3499)),"@site/docs/validators/kms/kms.md",3499],"2dd09b7f":[()=>n.e(4731).then(n.bind(n,650)),"@site/docs/hub-tutorials/gaiad.md",650],"3a859fe7":[()=>n.e(3295).then(n.bind(n,5716)),"@site/docs/validators/README.md",5716],"3de875ef":[()=>n.e(3032).then(n.bind(n,9794)),"@site/docs/architecture/adr/adr-003-ica-controller.md",9794],"41f2894c":[()=>n.e(3684).then(n.bind(n,4411)),"@site/docs/governance/submitting.md",4411],43353076:[()=>n.e(8606).then(n.bind(n,7574)),"@site/docs/governance/process.md",7574],"446bc915":[()=>n.e(6745).then(n.bind(n,2773)),"@site/docs/resources/archives.md",2773],"4b7d5026":[()=>n.e(7915).then(n.bind(n,1928)),"@site/docs/architecture/README.md",1928],"4bf737c3":[()=>n.e(4704).then(n.bind(n,2456)),"@site/docs/hub-tutorials/README.md",2456],"4e1cbcac":[()=>n.e(791).then(n.bind(n,5558)),"@site/docs/architecture/adr/adr-001-interchain-accounts.md",5558],"54f44165":[()=>n.e(7924).then(n.bind(n,9241)),"@site/docs/getting-started/installation.md",9241],"5d489d3c":[()=>n.e(8257).then(n.t.bind(n,7757,19)),"/home/runner/work/gaia/gaia/docs/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7757],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"5fd51807":[()=>n.e(6331).then(n.bind(n,7144)),"@site/docs/hub-tutorials/live-upgrade-tutorial.md",7144],"6294a1b0":[()=>n.e(6840).then(n.bind(n,5792)),"@site/docs/resources/service-providers.md",5792],"62b775bc":[()=>n.e(7335).then(n.bind(n,8555)),"@site/docs/delegators/README.md",8555],"62f354e1":[()=>n.e(587).then(n.bind(n,4093)),"@site/docs/hub-tutorials/upgrade-node.md",4093],"66cfa501":[()=>n.e(35).then(n.bind(n,6315)),"@site/docs/interchain-security/README.md",6315],"68580c81":[()=>n.e(2424).then(n.bind(n,6293)),"@site/docs/delegators/delegator-faq.md",6293],"69e61f52":[()=>n.e(2045).then(n.bind(n,3389)),"@site/docs/getting-started/system-requirements.md",3389],"6e233af6":[()=>n.e(7169).then(n.bind(n,832)),"@site/docs/modules/README.md",832],"781312e5":[()=>n.e(9053).then(n.bind(n,4594)),"@site/docs/validators/validator-setup.md",4594],"7b876406":[()=>n.e(7799).then(n.bind(n,8499)),"@site/docs/resources/ledger.md",8499],"7b940702":[()=>n.e(1046).then(n.bind(n,5774)),"@site/docs/resources/genesis.md",5774],"8bdc3bda":[()=>n.e(5608).then(n.bind(n,3935)),"@site/docs/delegators/delegator-security.md",3935],"8c40170f":[()=>n.e(2650).then(n.bind(n,7414)),"@site/docs/architecture/adr/README.md",7414],"8e6759d2":[()=>n.e(5159).then(n.t.bind(n,4061,19)),"/home/runner/work/gaia/gaia/docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",4061],"9157a56f":[()=>n.e(5643).then(n.bind(n,2328)),"@site/docs/resources/README.md",2328],"935f2afb":[()=>n.e(8581).then(n.t.bind(n,5610,19)),"~docs/default/version-current-metadata-prop-751.json",5610],"9ade351a":[()=>n.e(4986).then(n.bind(n,2130)),"@site/docs/modules/metaprotocols.md",2130],a2135033:[()=>n.e(4163).then(n.bind(n,4279)),"@site/docs/getting-started/README.md",4279],a56f5018:[()=>n.e(7669).then(n.bind(n,1545)),"@site/docs/governance/proposal-types/text-prop.md",1545],b6d5a092:[()=>n.e(960).then(n.bind(n,2969)),"@site/docs/resources/hd-wallets.md",2969],b78d3fc1:[()=>n.e(4165).then(n.bind(n,2406)),"@site/docs/delegators/delegator-guide-cli.md",2406],bcd9d779:[()=>n.e(2644).then(n.bind(n,672)),"@site/docs/validators/security.md",672],c377a04b:[()=>n.e(5742).then(n.bind(n,1866)),"@site/docs/index.md",1866],c4f5d8e4:[()=>n.e(2634).then(n.bind(n,192)),"@site/src/pages/index.js",192],c5a35911:[()=>n.e(5967).then(n.bind(n,7911)),"@site/docs/validators/kms/kms_ledger.md",7911],d3580699:[()=>n.e(1671).then(n.bind(n,6943)),"@site/docs/architecture/adr/PROCESS.md",6943],d56e8623:[()=>n.e(6542).then(n.bind(n,3057)),"@site/docs/governance/README.md",3057],e48b7f5f:[()=>n.e(6708).then(n.bind(n,6027)),"@site/docs/validators/validator-faq.md",6027],edd0fe92:[()=>n.e(7870).then(n.bind(n,538)),"@site/docs/governance/proposal-types/README.md",538],efb78e80:[()=>n.e(253).then(n.bind(n,4412)),"@site/docs/governance/proposal-types/param-change.md",4412],f165f987:[()=>n.e(9743).then(n.bind(n,6187)),"@site/docs/governance/proposal-types/community-pool-spend.md",6187],f2660785:[()=>n.e(9737).then(n.bind(n,9812)),"@site/docs/governance/proposal-types/software-upgrade.md",9812],f4352eb0:[()=>n.e(2472).then(n.bind(n,6247)),"@site/docs/hub-tutorials/join-mainnet.md",6247],f5cf8579:[()=>n.e(3350).then(n.bind(n,215)),"@site/docs/getting-started/what-is-gaia.md",215],f6addb2b:[()=>n.e(3818).then(n.bind(n,4877)),"@site/docs/validators/overview.md",4877],fb13cd97:[()=>n.e(7826).then(n.bind(n,372)),"@site/docs/hub-tutorials/join-testnet.md",372],fb286465:[()=>n.e(6112).then(n.bind(n,9038)),"@site/docs/governance/best-practices.md",9038],fbd7a87c:[()=>n.e(1361).then(n.bind(n,5760)),"@site/docs/getting-started/quickstart.md",5760]};function u(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("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%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("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"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(6921),d=n(3102);function f(e,t){if("*"===e)return i()({loading:u,loader:()=>n.e(1774).then(n.bind(n,1774)),modules:["@theme/NotFound"],webpack:()=>[1774],render(e,t){const n=e.default;return r.createElement(d.W,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[`${e}-${t}`],f={},p=[],m=[],h=(0,c.A)(o);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:u,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));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 o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.W,{value:s},r.createElement(l,(0,a.A)({},i,n)))}})}const p=[{path:"/search",component:f("/search","6a9"),exact:!0},{path:"/main",component:f("/main","ed7"),routes:[{path:"/main",component:f("/main","87c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/architecture",component:f("/main/architecture","df6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/architecture/adr",component:f("/main/architecture/adr","174"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/architecture/adr/adr-001-interchain-accounts",component:f("/main/architecture/adr/adr-001-interchain-accounts","bcd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/architecture/adr/adr-002-globalfee",component:f("/main/architecture/adr/adr-002-globalfee","8da"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/architecture/adr/adr-003-ica-controller",component:f("/main/architecture/adr/adr-003-ica-controller","47f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/architecture/adr/PROCESS",component:f("/main/architecture/adr/PROCESS","229"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/architecture/PROCESS",component:f("/main/architecture/PROCESS","939"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/architecture/templates/adr-template",component:f("/main/architecture/templates/adr-template","112"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/delegators",component:f("/main/delegators","715"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/delegators/delegator-faq",component:f("/main/delegators/delegator-faq","e43"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/delegators/delegator-guide-cli",component:f("/main/delegators/delegator-guide-cli","ec4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/delegators/delegator-security",component:f("/main/delegators/delegator-security","c39"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/getting-started",component:f("/main/getting-started","df2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/getting-started/installation",component:f("/main/getting-started/installation","218"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/getting-started/quickstart",component:f("/main/getting-started/quickstart","42f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/getting-started/system-requirements",component:f("/main/getting-started/system-requirements","fc6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/getting-started/what-is-gaia",component:f("/main/getting-started/what-is-gaia","c86"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/governance",component:f("/main/governance","d66"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/governance/best-practices",component:f("/main/governance/best-practices","9f1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/governance/formatting",component:f("/main/governance/formatting","b14"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/governance/process",component:f("/main/governance/process","ab8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/governance/proposal-types",component:f("/main/governance/proposal-types","3da"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/governance/proposal-types/community-pool-spend",component:f("/main/governance/proposal-types/community-pool-spend","184"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/governance/proposal-types/param-change",component:f("/main/governance/proposal-types/param-change","514"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/governance/proposal-types/software-upgrade",component:f("/main/governance/proposal-types/software-upgrade","e15"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/governance/proposal-types/text-prop",component:f("/main/governance/proposal-types/text-prop","ee4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/governance/submitting",component:f("/main/governance/submitting","e5f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/hub-tutorials",component:f("/main/hub-tutorials","f75"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/hub-tutorials/gaiad",component:f("/main/hub-tutorials/gaiad","d7b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/hub-tutorials/join-mainnet",component:f("/main/hub-tutorials/join-mainnet","a68"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/hub-tutorials/join-testnet",component:f("/main/hub-tutorials/join-testnet","938"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/hub-tutorials/live-upgrade-tutorial",component:f("/main/hub-tutorials/live-upgrade-tutorial","57e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/hub-tutorials/upgrade-node",component:f("/main/hub-tutorials/upgrade-node","ee3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/interchain-security",component:f("/main/interchain-security","028"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/modules",component:f("/main/modules","cfc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/modules/lsm-staking",component:f("/main/modules/lsm-staking","c2b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/modules/metaprotocols",component:f("/main/modules/metaprotocols","bf0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/resources",component:f("/main/resources","280"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/resources/archives",component:f("/main/resources/archives","919"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/resources/genesis",component:f("/main/resources/genesis","036"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/resources/hd-wallets",component:f("/main/resources/hd-wallets","67c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/resources/ledger",component:f("/main/resources/ledger","f4a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/resources/reproducible-builds",component:f("/main/resources/reproducible-builds","7ef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/resources/service-providers",component:f("/main/resources/service-providers","c0f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/validators",component:f("/main/validators","145"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/validators/kms",component:f("/main/validators/kms","b91"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/validators/kms/kms_ledger",component:f("/main/validators/kms/kms_ledger","090"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/validators/overview",component:f("/main/validators/overview","c52"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/validators/security",component:f("/main/validators/security","3fb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/validators/validator-faq",component:f("/main/validators/validator-faq","d18"),exact:!0,sidebar:"tutorialSidebar"},{path:"/main/validators/validator-setup",component:f("/main/validators/validator-setup","6e6"),exact:!0,sidebar:"tutorialSidebar"}]},{path:"/",component:f("/","62b"),exact:!0},{path:"*",component:f("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>o});var r=n(6540);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},8536:(e,t,n)=>{"use strict";var r=n(6540),a=n(961),o=n(4625),i=n(545),l=n(8193);const s=[n(1911),n(119),n(6134),n(6294),n(1043)];var u=n(8328),c=n(6347),d=n(2831);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(8168),m=n(5260),h=n(4586),g=n(6025),b=n(6342),v=n(9024),y=n(2131),w=n(4090),E=n(2967),k=n(440),S=n(1463);function x(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,h.A)(),n=(0,y.o)();return r.createElement(m.A,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function _(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.A)(),a=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.A)(),{pathname:r}=(0,c.zy)();return e+(0,k.applyTrailingSlash)((0,g.A)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:a;return r.createElement(m.A,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function A(){const{i18n:{currentLocale:e}}=(0,h.A)(),{metadata:t,image:n}=(0,b.p)();return r.createElement(r.Fragment,null,r.createElement(m.A,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.w})),n&&r.createElement(v.be,{image:n}),r.createElement(_,null),r.createElement(x,null),r.createElement(S.A,{tag:E.Cy,locale:e}),r.createElement(m.A,null,t.map(((e,t)=>r.createElement("meta",(0,p.A)({key:t},e))))))}const C=new Map;function T(e){if(C.has(e.pathname))return{...e,pathname:C.get(e.pathname)};if((0,d.u)(u.A,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}var O=n(6125),L=n(6988);function N(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];const a=s.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const P=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)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:a}),N("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function R(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.canUseDOM?N("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=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),R(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 r.createElement(P,{previousLocation:this.previousLocation,location:t},r.createElement(c.qh,{location:t,render:()=>e}))}}const M=I,D="__docusaurus-base-url-issue-banner-container",B="__docusaurus-base-url-issue-banner",F="__docusaurus-base-url-issue-banner-suggestion-container",$="__DOCUSAURUS_INSERT_BASEURL_BANNER";function z(e){return`\nwindow['${$}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${$}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${D}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${B}" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${F}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n var suggestionContainer = document.getElementById('${F}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function U(){const{siteConfig:{baseUrl:e}}=(0,h.A)();return(0,r.useLayoutEffect)((()=>{window[$]=!1}),[]),r.createElement(r.Fragment,null,!l.A.canUseDOM&&r.createElement(m.A,null,r.createElement("script",null,z(e))),r.createElement("div",{id:D}))}function j(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.A)(),{pathname:n}=(0,c.zy)();return t&&n===e?r.createElement(U,null):null}function H(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,h.A)(),i=(0,g.A)(e),{htmlLang:l,direction:s}=o[a];return r.createElement(m.A,null,r.createElement("html",{lang:l,dir:s}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var V=n(7489),G=n(2303);function W(){const e=(0,G.A)();return r.createElement(m.A,null,r.createElement("html",{"data-has-hydrated":e}))}function q(){const e=(0,d.v)(u.A),t=(0,c.zy)();return r.createElement(V.A,null,r.createElement(L.l,null,r.createElement(O.x,null,r.createElement(f,null,r.createElement(H,null),r.createElement(A,null),r.createElement(j,null),r.createElement(M,{location:T(t)},e)),r.createElement(W,null))))}var K=n(4054);const Y=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Q=n(6921);const X=new Set,Z=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!Z.has(e)&&!X.has(e))(e))return!1;X.add(e);const t=(0,d.u)(u.A,e).flatMap((e=>{return t=e.route.path,Object.entries(K).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Q.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Y(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!Z.has(e))(e)&&(Z.add(e),R(e))},te=Object.freeze(ee);if(l.A.canUseDOM){window.docusaurus=te;const e=a.hydrate;R(window.location.pathname).then((()=>{e(r.createElement(i.vd,null,r.createElement(o.Kd,null,r.createElement(q,null))),document.getElementById("__docusaurus"))}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>c,l:()=>d});var r=n(6540),a=n(4784);const o=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":["G-EB7MEE3TJ1"],"anonymizeIP":true,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/","versions":[{"name":"current","label":"Latest","isLast":true,"path":"/main","mainDocId":"index","docs":[{"id":"architecture/adr/adr-001-interchain-accounts","path":"/main/architecture/adr/adr-001-interchain-accounts","sidebar":"tutorialSidebar"},{"id":"architecture/adr/adr-002-globalfee","path":"/main/architecture/adr/adr-002-globalfee","sidebar":"tutorialSidebar"},{"id":"architecture/adr/adr-003-ica-controller","path":"/main/architecture/adr/adr-003-ica-controller","sidebar":"tutorialSidebar"},{"id":"architecture/adr/PROCESS","path":"/main/architecture/adr/PROCESS","sidebar":"tutorialSidebar"},{"id":"architecture/adr/README","path":"/main/architecture/adr/","sidebar":"tutorialSidebar"},{"id":"architecture/PROCESS","path":"/main/architecture/PROCESS","sidebar":"tutorialSidebar"},{"id":"architecture/README","path":"/main/architecture/","sidebar":"tutorialSidebar"},{"id":"architecture/templates/adr-template","path":"/main/architecture/templates/adr-template","sidebar":"tutorialSidebar"},{"id":"delegators/delegator-faq","path":"/main/delegators/delegator-faq","sidebar":"tutorialSidebar"},{"id":"delegators/delegator-guide-cli","path":"/main/delegators/delegator-guide-cli","sidebar":"tutorialSidebar"},{"id":"delegators/delegator-security","path":"/main/delegators/delegator-security","sidebar":"tutorialSidebar"},{"id":"delegators/README","path":"/main/delegators/","sidebar":"tutorialSidebar"},{"id":"getting-started/installation","path":"/main/getting-started/installation","sidebar":"tutorialSidebar"},{"id":"getting-started/quickstart","path":"/main/getting-started/quickstart","sidebar":"tutorialSidebar"},{"id":"getting-started/README","path":"/main/getting-started/","sidebar":"tutorialSidebar"},{"id":"getting-started/system-requirements","path":"/main/getting-started/system-requirements","sidebar":"tutorialSidebar"},{"id":"getting-started/what-is-gaia","path":"/main/getting-started/what-is-gaia","sidebar":"tutorialSidebar"},{"id":"governance/best-practices","path":"/main/governance/best-practices","sidebar":"tutorialSidebar"},{"id":"governance/formatting","path":"/main/governance/formatting","sidebar":"tutorialSidebar"},{"id":"governance/process","path":"/main/governance/process","sidebar":"tutorialSidebar"},{"id":"governance/proposal-types/community-pool-spend","path":"/main/governance/proposal-types/community-pool-spend","sidebar":"tutorialSidebar"},{"id":"governance/proposal-types/param-change","path":"/main/governance/proposal-types/param-change","sidebar":"tutorialSidebar"},{"id":"governance/proposal-types/README","path":"/main/governance/proposal-types/","sidebar":"tutorialSidebar"},{"id":"governance/proposal-types/software-upgrade","path":"/main/governance/proposal-types/software-upgrade","sidebar":"tutorialSidebar"},{"id":"governance/proposal-types/text-prop","path":"/main/governance/proposal-types/text-prop","sidebar":"tutorialSidebar"},{"id":"governance/README","path":"/main/governance/","sidebar":"tutorialSidebar"},{"id":"governance/submitting","path":"/main/governance/submitting","sidebar":"tutorialSidebar"},{"id":"hub-tutorials/gaiad","path":"/main/hub-tutorials/gaiad","sidebar":"tutorialSidebar"},{"id":"hub-tutorials/join-mainnet","path":"/main/hub-tutorials/join-mainnet","sidebar":"tutorialSidebar"},{"id":"hub-tutorials/join-testnet","path":"/main/hub-tutorials/join-testnet","sidebar":"tutorialSidebar"},{"id":"hub-tutorials/live-upgrade-tutorial","path":"/main/hub-tutorials/live-upgrade-tutorial","sidebar":"tutorialSidebar"},{"id":"hub-tutorials/README","path":"/main/hub-tutorials/","sidebar":"tutorialSidebar"},{"id":"hub-tutorials/upgrade-node","path":"/main/hub-tutorials/upgrade-node","sidebar":"tutorialSidebar"},{"id":"index","path":"/main/","sidebar":"tutorialSidebar"},{"id":"interchain-security/README","path":"/main/interchain-security/","sidebar":"tutorialSidebar"},{"id":"modules/lsm-staking","path":"/main/modules/lsm-staking","sidebar":"tutorialSidebar"},{"id":"modules/metaprotocols","path":"/main/modules/metaprotocols","sidebar":"tutorialSidebar"},{"id":"modules/README","path":"/main/modules/","sidebar":"tutorialSidebar"},{"id":"resources/archives","path":"/main/resources/archives","sidebar":"tutorialSidebar"},{"id":"resources/genesis","path":"/main/resources/genesis","sidebar":"tutorialSidebar"},{"id":"resources/hd-wallets","path":"/main/resources/hd-wallets","sidebar":"tutorialSidebar"},{"id":"resources/ledger","path":"/main/resources/ledger","sidebar":"tutorialSidebar"},{"id":"resources/README","path":"/main/resources/","sidebar":"tutorialSidebar"},{"id":"resources/reproducible-builds","path":"/main/resources/reproducible-builds","sidebar":"tutorialSidebar"},{"id":"resources/service-providers","path":"/main/resources/service-providers","sidebar":"tutorialSidebar"},{"id":"validators/kms/kms","path":"/main/validators/kms/","sidebar":"tutorialSidebar"},{"id":"validators/kms/kms_ledger","path":"/main/validators/kms/kms_ledger","sidebar":"tutorialSidebar"},{"id":"validators/overview","path":"/main/validators/overview","sidebar":"tutorialSidebar"},{"id":"validators/README","path":"/main/validators/","sidebar":"tutorialSidebar"},{"id":"validators/security","path":"/main/validators/security","sidebar":"tutorialSidebar"},{"id":"validators/validator-faq","path":"/main/validators/validator-faq","sidebar":"tutorialSidebar"},{"id":"validators/validator-setup","path":"/main/validators/validator-setup","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/main/","label":"index"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(2654);const s=JSON.parse('{"docusaurusVersion":"2.4.3","siteVersion":"1.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.3"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.3"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"2.4.3"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.3"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"2.4.3"},"docusaurus-tailwindcss":{"type":"local"},"docusaurus-plugin-client-redirects":{"type":"package","name":"@docusaurus/plugin-client-redirects","version":"2.4.3"},"docusaurus-theme-github-codeblock":{"type":"package","name":"@you54f/theme-github-codeblock","version":"0.1.1"}}}'),u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(6540),a=n(8193),o=n(5260),i=n(440),l=n(8511);function s(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(u,{error:t}))}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function c(e){let{error:t,tryAgain:n}=e;return r.createElement(f,{fallback:()=>r.createElement(s,{error:t,tryAgain:n})},r.createElement(o.A,null,r.createElement("title",null,"Page Error")),r.createElement(l.A,null,r.createElement(s,{error:t,tryAgain:n})))}const d=e=>r.createElement(c,e);class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??d)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(545);function o(e){return r.createElement(a.mg,e)}},5489:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var r=n(8168),a=n(6540),o=n(4625),i=n(440),l=n(4586),s=n(6654),u=n(8193);const c=a.createContext({collectLink:()=>{}});var d=n(6025);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:w}}=(0,l.A)(),{withBaseUrl:E}=(0,d.h)(),k=(0,a.useContext)(c),S=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>S.current));const x=f||p;const _=(0,s.A)(x),A=x?.replace("pathname://","");let C=void 0!==A?(T=A,b&&(e=>e.startsWith("/"))(T)?E(T):T):void 0;var T;C&&_&&(C=(0,i.applyTrailingSlash)(C,{trailingSlash:y,baseUrl:w}));const O=(0,a.useRef)(!1),L=n?o.k2:o.N_,N=u.A.canUseIntersectionObserver,P=(0,a.useRef)(),R=()=>{O.current||null==C||(window.docusaurus.preload(C),O.current=!0)};(0,a.useEffect)((()=>(!N&&_&&null!=C&&window.docusaurus.prefetch(C),()=>{N&&P.current&&P.current.disconnect()})),[P,C,N,_]);const I=C?.startsWith("#")??!1,M=!C||!_||I;return M||g||k.collectLink(C),M?a.createElement("a",(0,r.A)({ref:S,href:C},x&&!_&&{target:"_blank",rel:"noopener noreferrer"},v)):a.createElement(L,(0,r.A)({},v,{onMouseEnter:R,onTouchStart:R,innerRef:e=>{S.current=e,N&&e&&_&&(P.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(P.current.unobserve(e),P.current.disconnect(),null!=C&&window.docusaurus.prefetch(C))}))})),P.current.observe(e))},to:C},n&&{isActive:h,activeClassName:m}))}const p=a.forwardRef(f)},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>s,T:()=>l});var r=n(6540);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(2654);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>a,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{A:()=>l,h:()=>i});var r=n(6540),a=n(4586),o=n(6654);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.A)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.z)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6988);function o(){return(0,r.useContext)(a.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6125);function o(){return(0,r.useContext)(a.o)}},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>o,o:()=>a});var r=n(6540);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>b,vT:()=>p,gk:()=>m,Gy:()=>d,HW:()=>v,ht:()=>f,r7:()=>g,jh:()=>h});var r=n(6347),a=n(4586),o=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}function u(e,t){const n=s(e,t),a=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const c={},d=()=>i("docusaurus-plugin-content-docs")??c,f=e=>function(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function m(e){void 0===e&&(e={});const t=p(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:s(t.pluginData,n)}}function h(e){return f(e).versions}function g(e){const t=f(e);return l(t)}function b(e){const t=f(e),{pathname:n}=(0,r.zy)();return u(t,n)}function v(e){const t=f(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=l(e);return{latestDocSuggestion:u(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},1911:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("event","page_view",{page_title:document.title,page_location:window.location.href,page_path:t.pathname+t.search+t.hash})}))}}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(5947),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},6134:(e,t,n)=>{"use strict";n.r(t);var r=n(1258),a=n(4784);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(7773)(`./prism-${e}`)})),delete globalThis.Prism}(r.A)},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const a={iconExternalLink:"iconExternalLink_nPIU"};function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},8511:(e,t,n)=>{"use strict";n.d(t,{A:()=>Nt});var r=n(6540),a=n(53),o=n(7489),i=n(9024),l=n(8168),s=n(6347),u=n(1312),c=n(5062);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,u.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:a}=p();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,l.A)({},e,{href:`#${d}`,onClick:a}),t))}var g=n(7559),b=n(4090);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(h,{className:v.skipToContent})}var w=n(6342),E=n(5041);function k(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...s}=e;return r.createElement("svg",(0,l.A)({viewBox:"0 0 15 15",width:t,height:n},s),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const S={closeButton:"closeButton_CVFx"};function x(e){return r.createElement("button",(0,l.A)({type:"button","aria-label":(0,u.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.A)("clean-btn close",S.closeButton,e.className)}),r.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const _={content:"content_knG7"};function A(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return r.createElement("div",(0,l.A)({},e,{className:(0,a.A)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const C={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function T(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,E.Mj)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:C.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:C.announcementBarPlaceholder}),r.createElement(A,{className:C.announcementBarContent}),i&&r.createElement(x,{onClick:n,className:C.announcementBarClose}))}var O=n(2069),L=n(3104);var N=n(9532),P=n(5600);const R=r.createContext(null);function I(e){let{children:t}=e;const n=function(){const e=(0,O.M)(),t=(0,P.YL)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,N.ZC)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(R.Provider,{value:n},t)}function M(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function D(){const e=(0,r.useContext)(R);if(!e)throw new N.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,P.YL)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:M(o)})),[a,o,t])}function B(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=D();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var F=n(5293),$=n(2303);function z(e){return r.createElement("svg",(0,l.A)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function U(e){return r.createElement("svg",(0,l.A)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const j={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function H(e){let{className:t,buttonClassName:n,value:o,onChange:i}=e;const l=(0,$.A)(),s=(0,u.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===o?(0,u.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.A)(j.toggle,t)},r.createElement("button",{className:(0,a.A)("clean-btn",j.toggleButton,!l&&j.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===o?"light":"dark"),disabled:!l,title:s,"aria-label":s,"aria-live":"polite"},r.createElement(z,{className:(0,a.A)(j.toggleIcon,j.lightToggleIcon)}),r.createElement(U,{className:(0,a.A)(j.toggleIcon,j.darkToggleIcon)})))}const V=r.memo(H),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function W(e){let{className:t}=e;const n=(0,w.p)().navbar.style,a=(0,w.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:i}=(0,F.G)();return a?null:r.createElement(V,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:o,onChange:i})}var q=n(3465);function K(){return r.createElement(q.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,O.M)();return r.createElement("button",{type:"button","aria-label":(0,u.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(k,{color:"var(--ifm-color-emphasis-600)"}))}function Q(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(K,null),r.createElement(W,{className:"margin-right--md"}),r.createElement(Y,null))}var X=n(5489),Z=n(6025),J=n(6654),ee=n(1252),te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:s,isDropdownLink:u,prependBaseUrlToHref:c,...d}=e;const f=(0,Z.A)(a),p=(0,Z.A)(t),m=(0,Z.A)(o,{forcePrependBaseUrl:!0}),h=i&&o&&!(0,J.A)(o),g=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,h&&r.createElement(te.A,u&&{width:12,height:12}))};return o?r.createElement(X.A,(0,l.A)({href:c?m:o},d,g)):r.createElement(X.A,(0,l.A)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?(0,ee.G)(n,t.pathname):t.pathname.startsWith(p)},d,g))}function re(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ne,(0,l.A)({className:(0,a.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function ae(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,l.A)({className:(0,a.A)("menu__link",t)},o)))}function oe(e){let{mobile:t=!1,position:n,...a}=e;const o=t?ae:re;return r.createElement(o,(0,l.A)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(1422),le=n(9169),se=n(4586);function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.ys)(e.to,t)||!!(0,ee.G)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ce(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[u]),r.createElement("div",{ref:u,className:(0,a.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(ne,(0,l.A)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,a.A)("navbar__link",o)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),s.children??s.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(Ve,(0,l.A)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:o,onClick:i,...u}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),r.createElement("li",{className:(0,a.A)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(ne,(0,l.A)({role:"button",className:(0,a.A)("menu__link menu__link--sublist menu__link--sublist-caret",n)},u,{onClick:e=>{e.preventDefault(),p()}}),u.children??u.label),r.createElement(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>r.createElement(Ve,(0,l.A)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function fe(e){let{mobile:t=!1,...n}=e;const a=t?de:ce;return r.createElement(a,n)}var pe=n(2131);function me(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,l.A)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const he="iconLanguage_nlXk";function ge(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var be=n(9188),ve=["translations"];function ye(){return ye=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},ye.apply(this,arguments)}function we(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,a,o=[],i=!0,l=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(o.push(r.value),!t||o.length!==t);i=!0);}catch(s){l=!0,a=s}finally{try{i||null==n.return||n.return()}finally{if(l)throw a}}return o}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Ee(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Ee(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Ee(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function ke(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var Se="Ctrl";var xe=r.forwardRef((function(e,t){var n=e.translations,a=void 0===n?{}:n,o=ke(e,ve),i=a.buttonText,l=void 0===i?"Search":i,s=a.buttonAriaLabel,u=void 0===s?"Search":s,c=we((0,r.useState)(null),2),d=c[0],f=c[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("\u2318"):f(Se))}),[]),r.createElement("button",ye({type:"button",className:"DocSearch DocSearch-Button","aria-label":u},o,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(be.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},l)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement(_e,{reactsToKey:d===Se?Se:"Meta"},d===Se?r.createElement(ge,null):d),r.createElement(_e,{reactsToKey:"k"},"K"))))}));function _e(e){var t=e.reactsToKey,n=e.children,a=we((0,r.useState)(!1),2),o=a[0],i=a[1];return(0,r.useEffect)((function(){if(t)return window.addEventListener("keydown",e),window.addEventListener("keyup",n),function(){window.removeEventListener("keydown",e),window.removeEventListener("keyup",n)};function e(e){e.key===t&&i(!0)}function n(e){e.key!==t&&"Meta"!==e.key||i(!1)}}),[t]),r.createElement("kbd",{className:o?"DocSearch-Button-Key DocSearch-Button-Key--pressed":"DocSearch-Button-Key"},n)}var Ae=n(5260),Ce=n(4255),Te=n(1062),Oe=n(2967);var Le=n(961);const Ne={button:{buttonText:(0,u.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,u.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,u.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,u.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,u.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,u.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,u.T)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,u.T)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,u.T)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,u.T)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,u.T)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,u.T)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,u.T)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,u.T)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,u.T)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,u.T)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,u.T)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,u.T)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,u.T)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,u.T)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,u.T)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,u.T)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,u.T)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,u.T)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,u.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,u.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,u.T)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Pe=null;function Re(e){let{hit:t,children:n}=e;return r.createElement(X.A,{to:t.url},n)}function Ie(e){let{state:t,onClose:n}=e;const a=(0,Ce.w)();return r.createElement(X.A,{to:a(t.query),onClick:n},r.createElement(u.A,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits}},"See all {count} results"))}function Me(e){let{contextualSearch:t,externalUrlRegex:a,...o}=e;const{siteMetadata:i}=(0,se.A)(),u=(0,Te.C)(),c=function(){const{locale:e,tags:t}=(0,Oe.af)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=o.searchParameters?.facetFilters??[],f=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(c,d):d,p={...o.searchParameters,facetFilters:f},m=(0,s.W6)(),h=(0,r.useRef)(null),g=(0,r.useRef)(null),[b,v]=(0,r.useState)(!1),[y,w]=(0,r.useState)(void 0),E=(0,r.useCallback)((()=>Pe?Promise.resolve():Promise.all([n.e(9462).then(n.bind(n,9462)),Promise.all([n.e(1869),n.e(8913)]).then(n.bind(n,8913)),Promise.all([n.e(1869),n.e(416)]).then(n.bind(n,416))]).then((e=>{let[{DocSearchModal:t}]=e;Pe=t}))),[]),k=(0,r.useCallback)((()=>{E().then((()=>{h.current=document.createElement("div"),document.body.insertBefore(h.current,document.body.firstChild),v(!0)}))}),[E,v]),S=(0,r.useCallback)((()=>{v(!1),h.current?.remove()}),[v]),x=(0,r.useCallback)((e=>{E().then((()=>{v(!0),w(e.key)}))}),[E,v,w]),_=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.G)(a,t)?window.location.href=t:m.push(t)}}).current,A=(0,r.useRef)((e=>o.transformItems?o.transformItems(e):e.map((e=>({...e,url:u(e.url)}))))).current,C=(0,r.useMemo)((()=>e=>r.createElement(Ie,(0,l.A)({},e,{onClose:S}))),[S]),T=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,a=e.onClose,o=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;(27===e.keyCode&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?a():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,a,o,i])}({isOpen:b,onOpen:k,onClose:S,onInput:x,searchButtonRef:g}),r.createElement(r.Fragment,null,r.createElement(Ae.A,null,r.createElement("link",{rel:"preconnect",href:`https://${o.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})),r.createElement(xe,{onTouchStart:E,onFocus:E,onMouseOver:E,onClick:k,ref:g,translations:Ne.button}),b&&Pe&&h.current&&(0,Le.createPortal)(r.createElement(Pe,(0,l.A)({onClose:S,initialScrollY:window.scrollY,initialQuery:y,navigator:_,transformItems:A,hitComponent:Re,transformSearchClient:T},o.searchPagePath&&{resultsFooterComponent:C},o,{searchParameters:p,placeholder:Ne.placeholder,translations:Ne.modal})),h.current))}function De(){const{siteConfig:e}=(0,se.A)();return r.createElement(Me,e.themeConfig.algolia)}const Be={searchBox:"searchBox_ZlJk"};function Fe(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.A)(n,Be.searchBox)},t)}var $e=n(4070),ze=n(1754);var Ue=n(5597);const je=e=>e.docs.find((t=>t.id===e.mainDocId));const He={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.A)(),f=(0,pe.o)(),{search:p,hash:m}=(0,s.zy)(),h=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${m}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],g=t?(0,u.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(fe,(0,l.A)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(me,{className:he}),g),items:h}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(Fe,{className:n},r.createElement(De,null))},dropdown:fe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.A)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,$e.zK)(a),s=(0,ze.QB)(t,a);return null===s?null:r.createElement(oe,(0,l.A)({exact:!0},o,{isActive:()=>i?.path===s.path||!!i?.sidebar&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,$e.zK)(a),s=(0,ze.fW)(t,a).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(oe,(0,l.A)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,ze.Vd)(a)[0],s=t??i.label,u=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(oe,(0,l.A)({},o,{label:s,to:u}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...c}=e;const{search:d,hash:f}=(0,s.zy)(),p=(0,$e.zK)(n),m=(0,$e.jh)(n),{savePreferredVersionName:h}=(0,Ue.g1)(n),g=[...o,...m.map((e=>{const t=p.alternateDocVersions[e.name]??je(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...i],b=(0,ze.Vd)(n)[0],v=t&&g.length>1?(0,u.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&g.length>1?void 0:je(b).path;return g.length<=1?r.createElement(oe,(0,l.A)({},c,{mobile:t,label:v,to:y,isActive:a?()=>!1:void 0})):r.createElement(fe,(0,l.A)({},c,{mobile:t,label:v,to:y,items:g,isActive:a?()=>!1:void 0}))}};function Ve(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=He[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function Ge(){const e=(0,O.M)(),t=(0,w.p)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Ve,(0,l.A)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function We(e){return r.createElement("button",(0,l.A)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function qe(){const e=0===(0,w.p)().navbar.items.length,t=D();return r.createElement(r.Fragment,null,!e&&r.createElement(We,{onClick:()=>t.hide()}),t.content)}function Ke(){const e=(0,O.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(B,{header:r.createElement(Q,null),primaryMenu:r.createElement(Ge,null),secondaryMenu:r.createElement(qe,null)}):null}const Ye={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Qe(e){return r.createElement("div",(0,l.A)({role:"presentation"},e,{className:(0,a.A)("navbar-sidebar__backdrop",e.className)}))}function Xe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.p)(),i=(0,O.M)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,L.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i<o.current)return void n(!0);if(a.current)return void(a.current=!1);const l=r?.scrollY,s=document.documentElement.scrollHeight-o.current,u=window.innerHeight;l&&i>=l?n(!1):i+u<s&&n(!0)})),(0,c.$)((t=>{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,"aria-label":(0,u.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.A)("navbar","navbar--fixed-top",n&&[Ye.navbarHideable,!s&&Ye.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Qe,{onClick:i.toggle}),r.createElement(Ke,null))}var Ze=n(440);const Je={errorBoundaryError:"errorBoundaryError_a6uf"};function et(e){return r.createElement("button",(0,l.A)({type:"button"},e),r.createElement(u.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function tt(e){let{error:t}=e;const n=(0,Ze.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:Je.errorBoundaryError},n)}class nt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const rt="right";function at(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,l.A)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function ot(){const{toggle:e,shown:t}=(0,O.M)();return r.createElement("button",{onClick:e,"aria-label":(0,u.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},r.createElement(at,null))}const it={colorModeToggle:"colorModeToggle_DEke"};function lt(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(nt,{key:t,onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t})},r.createElement(Ve,e)))))}function st(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function ut(){const e=(0,O.M)(),t=(0,w.p)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??rt)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(st,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(ot,null),r.createElement(K,null),r.createElement(lt,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(lt,{items:a}),r.createElement(W,{className:it.colorModeToggle}),!o&&r.createElement(Fe,null,r.createElement(De,null)))})}function ct(){return r.createElement(Xe,null,r.createElement(ut,null))}function dt(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...s}=t,u=(0,Z.A)(n),c=(0,Z.A)(a,{forcePrependBaseUrl:!0});return r.createElement(X.A,(0,l.A)({className:"footer__link-item"},a?{href:i?c:a}:{to:u},s),o,a&&!(0,J.A)(a)&&r.createElement(te.A,null))}function ft(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(dt,{item:t}))}function pt(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(ft,{key:t,item:e})))))}function mt(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(pt,{key:t,column:e}))))}function ht(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function gt(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(dt,{item:t})}function bt(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(gt,{item:e}),t.length!==n+1&&r.createElement(ht,null))))))}function vt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(mt,{columns:t}):r.createElement(bt,{links:t})}var yt=n(1653);const wt={footerLogoLink:"footerLogoLink_BH7S"};function Et(e){let{logo:t}=e;const{withBaseUrl:n}=(0,Z.h)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(yt.A,{className:(0,a.A)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function kt(e){let{logo:t}=e;return t.href?r.createElement(X.A,{href:t.href,className:wt.footerLogoLink,target:t.target},r.createElement(Et,{logo:t})):r.createElement(Et,{logo:t})}function St(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function xt(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.A)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function _t(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(xt,{style:o,links:n&&n.length>0&&r.createElement(vt,{links:n}),logo:a&&r.createElement(kt,{logo:a}),copyright:t&&r.createElement(St,{copyright:t})})}const At=r.memo(_t),Ct=(0,N.fM)([F.a,E.oq,L.Tv,Ue.VQ,i.Jx,function(e){let{children:t}=e;return r.createElement(P.y_,null,r.createElement(O.e,null,r.createElement(I,null,t)))}]);function Tt(e){let{children:t}=e;return r.createElement(Ct,null,t)}function Ot(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(et,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(tt,{error:t})))))}const Lt={mainWrapper:"mainWrapper_z2l0"};function Nt(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:u}=e;return(0,b.J)(),r.createElement(Tt,null,r.createElement(i.be,{title:s,description:u}),r.createElement(y,null),r.createElement(T,null),r.createElement(ct,null),r.createElement("div",{id:d,className:(0,a.A)(g.G.wrapper.main,Lt.mainWrapper,l)},r.createElement(o.A,{fallback:e=>r.createElement(Ot,e)},t)),!n&&r.createElement(At,null))}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>d});var r=n(8168),a=n(6540),o=n(5489),i=n(6025),l=n(4586),s=n(6342),u=n(1653);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.A)(t.src),dark:(0,i.A)(t.srcDark||t.src)},l=a.createElement(u.A,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.A)(),{navbar:{title:n,logo:u}}=(0,s.p)(),{imageClassName:d,titleClassName:f,...p}=e,m=(0,i.A)(u?.href||"/"),h=n?"":t,g=u?.alt??h;return a.createElement(o.A,(0,r.A)({to:m},p,u?.target&&{target:u.target}),u&&a.createElement(c,{logo:u,alt:g,imageClassName:d}),null!=n&&a.createElement("b",{className:f},n))}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(5260);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.A,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},1653:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(8168),a=n(6540),o=n(53),i=n(2303),l=n(5293);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,i.A)(),{colorMode:n}=(0,l.G)(),{sources:u,className:c,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.A)({key:e,src:u[e],alt:d,className:(0,o.A)(s.themedImage,s[`themedImage--${e}`],c)},f)))))}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>g,u:()=>s});var r=n(8168),a=n(6540),o=n(8193),i=n(3109);const l="ease-in-out";function s(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const u={display:"none",overflow:"hidden",height:"0px"},c={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?u:c;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=r?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??l}`,height:`${t}px`}}function s(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return d(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function p(e){if(!o.A.canUseDOM)return e?u:c}function m(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const u=(0,a.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:o}),a.createElement(t,{ref:u,style:s?void 0:p(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(u.current,n),i?.(n))},className:l},r)}function h(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(m,(0,r.A)({},n,{collapsed:l})):null}function g(e){let{lazy:t,...n}=e;const r=t?h:m;return a.createElement(r,n)}},5041:(e,t,n)=>{"use strict";n.d(t,{Mj:()=>m,oq:()=>p});var r=n(6540),a=n(2303),o=n(9466),i=n(9532),l=n(6342);const s=(0,o.Wf)("docusaurus.announcement.dismiss"),u=(0,o.Wf)("docusaurus.announcement.id"),c=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.p)(),t=(0,a.A)(),[n,o]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{o(c())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>g,a:()=>h});var r=n(6540),a=n(8193),o=n(9532),i=n(9466),l=n(6342);const s=r.createContext(void 0),u="theme",c=(0,i.Wf)(u),d={light:"light",dark:"dark"},f=e=>e===d.dark?d.dark:d.light,p=e=>a.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{c.set(f(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.p)(),[a,o]=(0,r.useState)(p(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),c.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=c.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===d.dark},setLightTheme(){i(d.light)},setDarkTheme(){i(d.dark)}})),[a,i])}();return r.createElement(s.Provider,{value:n},t)}function g(){const e=(0,r.useContext)(s);if(null==e)throw new o.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},5597:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>g,XK:()=>y,g1:()=>v});var r=n(6540),a=n(4070),o=n(7065),i=n(6342),l=n(1754),s=n(9532),u=n(9466);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,u.Wf)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.Wf)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.Wf)(c(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function m(){const e=(0,a.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return r.createElement(p.Provider,{value:n},t)}function g(e){let{children:t}=e;return l.C5?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(p);if(!e)throw new s.dV("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.W);const t=(0,a.ht)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function y(){const e=(0,a.Gy)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:a}=t[n];return r.versions.find((e=>e.name===a))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},6588:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>s});var r=n(6540),a=n(9532);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.dV("DocsSidebarProvider");return e}},2069:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>d});var r=n(6540),a=n(5600),o=n(4581),i=n(7485),l=n(6342),s=n(9532);const u=r.createContext(void 0);function c(){const e=function(){const e=(0,a.YL)(),{items:t}=(0,l.p)().navbar;return 0===t.length&&!e.component}(),t=(0,o.l)(),n=!e&&"mobile"===t,[s,u]=(0,r.useState)(!1);(0,i.$Z)((()=>{if(s)return u(!1),!1}));const c=(0,r.useCallback)((()=>{u((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&u(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:s})),[e,n,c,s])}function d(e){let{children:t}=e;const n=c();return r.createElement(u.Provider,{value:n},t)}function f(){const e=r.useContext(u);if(void 0===e)throw new s.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>s,YL:()=>l,y_:()=>i});var r=n(6540),a=n(9532);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.dV("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.dV("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Be)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>a,J:()=>o});var r=n(6540);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4255:(e,t,n)=>{"use strict";n.d(t,{b:()=>l,w:()=>s});var r=n(6540),a=n(4586),o=n(7485);const i="q";function l(){return(0,o.l)(i)}function s(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,a.A)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>u});var r=n(6540),a=n(8193);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(){return a.A.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const s=!1;function u(){const[e,t]=(0,r.useState)((()=>s?"ssr":l()));return(0,r.useEffect)((()=>{function e(){t(l())}const n=s?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},1754:(e,t,n)=>{"use strict";n.d(t,{_o:()=>f,w8:()=>h,C5:()=>d,mz:()=>E,Vd:()=>v,QB:()=>w,fW:()=>y,OF:()=>b});var r=n(6540),a=n(6347),o=n(2831),i=n(4070),l=n(5597),s=n(6588);function u(e){return Array.from(new Set(e))}var c=n(9169);const d=!!i.Gy;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,c.ys)(e,t),m=(e,t)=>e.some((e=>h(e,t)));function h(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||m(e.items,t))}function g(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,c.ys)(o.href,n)||e(o.items))||"link"===o.type&&(0,c.ys)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function b(){const e=(0,s.t)(),{pathname:t}=(0,a.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?g({sidebarItems:e.items,pathname:t}):null}function v(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,l.g1)(e),a=(0,i.r7)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}function y(e,t){const n=v(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function w(e,t){const n=v(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t,versionMetadata:n}=e;const r=(0,a.zy)(),i=t.routes,l=i.find((e=>(0,a.B6)(r.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.v)(i),sidebarName:s,sidebarItems:u}}},481:(e,t,n)=>{"use strict";n.d(t,{s:()=>a});var r=n(4586);function a(e){const{siteConfig:t}=(0,r.A)(),{title:n,titleDelimiter:a}=t;return e?.trim().length?`${e.trim()} ${a} ${n}`:n}},7485:(e,t,n)=>{"use strict";n.d(t,{$Z:()=>l,l:()=>u});var r=n(6540),a=n(6347),o=n(9888),i=n(9532);function l(e){!function(e){const t=(0,a.W6)(),n=(0,i._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){return function(e){const t=(0,a.W6)();return(0,o.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function u(e){const t=s(e)??"",n=function(){const e=(0,a.W6)();return(0,r.useCallback)(((t,n,r)=>{const a=new URLSearchParams(e.location.search);n?a.set(t,n):a.delete(t),(r?.push?e.push:e.replace)({search:a.toString()})}),[e])}();return[t,(0,r.useCallback)(((t,r)=>{n(e,t,r)}),[n,e])]}},9024:(e,t,n)=>{"use strict";n.d(t,{e3:()=>f,be:()=>c,Jx:()=>p});var r=n(6540),a=n(53),o=n(5260),i=n(3102);function l(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(6025),u=n(481);function c(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const c=(0,u.s)(t),{withBaseUrl:d}=(0,s.h)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.A,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.A)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.A,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(f,{className:(0,a.A)(o,i)},t)}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>s,ZC:()=>i,_q:()=>o,dV:()=>l,fM:()=>u});var r=n(6540);const a=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},1252:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{G:()=>r})},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>l,ys:()=>i});var r=n(6540),a=n(8328),o=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>d,Tv:()=>s,gk:()=>f});var r=n(6540),a=n(8193),o=n(2303),i=n(9532);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const c=()=>a.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(c()),o=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&a<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(a-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},2967:(e,t,n)=>{"use strict";n.d(t,{Cy:()=>i,af:()=>s,tU:()=>l});var r=n(4070),a=n(4586),o=n(5597);const i="default";function l(e,t){return`docs-${e}-${t}`}function s(){const{i18n:e}=(0,a.A)(),t=(0,r.Gy)(),n=(0,r.gk)(),s=(0,o.XK)();const u=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,a=s[e],o=t[e].versions.find((e=>e.isLast));return l(e,(r??a??o).name)}))];return{locale:e.currentLocale,tags:u}}},9466:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>s});n(6540),n(9888);const r="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function o(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function s(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=o(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),a=n(6347),o=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.A)(),{pathname:s}=(0,a.zy)(),u=(0,o.applyTrailingSlash)(s,{trailingSlash:n,baseUrl:e}),c=l===i?e:e.replace(`/${l}/`,"/"),d=u.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${c}`:`${c}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),a=n(6347),o=n(9532);function i(e){const t=(0,a.zy)(),n=(0,o.ZC)(t),i=(0,o._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(4586);function a(){return(0,r.A)().siteConfig.themeConfig}},8126:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});var r=n(4586);function a(){const{siteConfig:{themeConfig:e}}=(0,r.A)();return e}},1062:(e,t,n)=>{"use strict";n.d(t,{C:()=>l});var r=n(6540),a=n(1252),o=n(6025),i=n(8126);function l(){const{withBaseUrl:e}=(0,o.h)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.c)();return(0,r.useCallback)((r=>{const o=new URL(r);if((0,a.G)(t,o.href))return r;const i=`${o.pathname+o.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},2983:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},440:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(2983);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(253);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},53:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=r(e[t]))&&(a&&(a+=" "),a+=n);else for(t in e)e[t]&&(a&&(a+=" "),a+=t);return a}n.d(t,{A:()=>a});const a=function(){for(var e,t,n=0,a="";n<arguments.length;)(e=arguments[n++])&&(t=r(e))&&(a&&(a+=" "),a+=t);return a}},9231:(e,t,n)=>{"use strict";n.d(t,{zR:()=>S,TM:()=>O,yJ:()=>h,sC:()=>N,AO:()=>m,Fu:()=>g});var r=n(8168);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r<a;n+=1,r+=1)e[n]=e[r];e.pop()}const i=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],i=t&&t.split("/")||[],l=e&&a(e),s=t&&a(t),u=l||s;if(e&&a(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var c=i[i.length-1];n="."===c||".."===c||""===c}else n=!1;for(var d=0,f=i.length;f>=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};function l(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}const s=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"==typeof t||"object"==typeof n){var r=l(t),a=l(n);return r!==t||a!==n?e(r,a):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1};var u=n(1561);function c(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function f(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function p(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function m(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function h(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.A)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function g(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&s(e.state,t.state)}function b(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach((function(e){return e.apply(void 0,n)}))}}}var v=!("undefined"==typeof window||!window.document||!window.document.createElement);function y(e,t){t(window.confirm(e))}var w="popstate",E="hashchange";function k(){try{return window.history.state||{}}catch(e){return{}}}function S(e){void 0===e&&(e={}),v||(0,u.A)(!1);var t,n=window.history,a=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,o=!(-1===window.navigator.userAgent.indexOf("Trident")),i=e,l=i.forceRefresh,s=void 0!==l&&l,d=i.getUserConfirmation,g=void 0===d?y:d,S=i.keyLength,x=void 0===S?6:S,_=e.basename?p(c(e.basename)):"";function A(e){var t=e||{},n=t.key,r=t.state,a=window.location,o=a.pathname+a.search+a.hash;return _&&(o=f(o,_)),h(o,r,n)}function C(){return Math.random().toString(36).substr(2,x)}var T=b();function O(e){(0,r.A)(U,e),U.length=n.length,T.notifyListeners(U.location,U.action)}function L(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||R(A(e.state))}function N(){R(A(k()))}var P=!1;function R(e){if(P)P=!1,O();else{T.confirmTransitionTo(e,"POP",g,(function(t){t?O({action:"POP",location:e}):function(e){var t=U.location,n=M.indexOf(t.key);-1===n&&(n=0);var r=M.indexOf(e.key);-1===r&&(r=0);var a=n-r;a&&(P=!0,B(a))}(e)}))}}var I=A(k()),M=[I.key];function D(e){return _+m(e)}function B(e){n.go(e)}var F=0;function $(e){1===(F+=e)&&1===e?(window.addEventListener(w,L),o&&window.addEventListener(E,N)):0===F&&(window.removeEventListener(w,L),o&&window.removeEventListener(E,N))}var z=!1;var U={length:n.length,action:"POP",location:I,createHref:D,push:function(e,t){var r="PUSH",o=h(e,t,C(),U.location);T.confirmTransitionTo(o,r,g,(function(e){if(e){var t=D(o),i=o.key,l=o.state;if(a)if(n.pushState({key:i,state:l},null,t),s)window.location.href=t;else{var u=M.indexOf(U.location.key),c=M.slice(0,u+1);c.push(o.key),M=c,O({action:r,location:o})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",o=h(e,t,C(),U.location);T.confirmTransitionTo(o,r,g,(function(e){if(e){var t=D(o),i=o.key,l=o.state;if(a)if(n.replaceState({key:i,state:l},null,t),s)window.location.replace(t);else{var u=M.indexOf(U.location.key);-1!==u&&(M[u]=o.key),O({action:r,location:o})}else window.location.replace(t)}}))},go:B,goBack:function(){B(-1)},goForward:function(){B(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return z||($(1),z=!0),function(){return z&&(z=!1,$(-1)),t()}},listen:function(e){var t=T.appendListener(e);return $(1),function(){$(-1),t()}}};return U}var x="hashchange",_={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+d(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:d,decodePath:c},slash:{encodePath:c,decodePath:c}};function A(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function C(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function T(e){window.location.replace(A(window.location.href)+"#"+e)}function O(e){void 0===e&&(e={}),v||(0,u.A)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),a=n.getUserConfirmation,o=void 0===a?y:a,i=n.hashType,l=void 0===i?"slash":i,s=e.basename?p(c(e.basename)):"",d=_[l],g=d.encodePath,w=d.decodePath;function E(){var e=w(C());return s&&(e=f(e,s)),h(e)}var k=b();function S(e){(0,r.A)(z,e),z.length=t.length,k.notifyListeners(z.location,z.action)}var O=!1,L=null;function N(){var e,t,n=C(),r=g(n);if(n!==r)T(r);else{var a=E(),i=z.location;if(!O&&(t=a,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(L===m(a))return;L=null,function(e){if(O)O=!1,S();else{var t="POP";k.confirmTransitionTo(e,t,o,(function(n){n?S({action:t,location:e}):function(e){var t=z.location,n=M.lastIndexOf(m(t));-1===n&&(n=0);var r=M.lastIndexOf(m(e));-1===r&&(r=0);var a=n-r;a&&(O=!0,D(a))}(e)}))}}(a)}}var P=C(),R=g(P);P!==R&&T(R);var I=E(),M=[m(I)];function D(e){t.go(e)}var B=0;function F(e){1===(B+=e)&&1===e?window.addEventListener(x,N):0===B&&window.removeEventListener(x,N)}var $=!1;var z={length:t.length,action:"POP",location:I,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=A(window.location.href)),n+"#"+g(s+m(e))},push:function(e,t){var n="PUSH",r=h(e,void 0,void 0,z.location);k.confirmTransitionTo(r,n,o,(function(e){if(e){var t=m(r),a=g(s+t);if(C()!==a){L=t,function(e){window.location.hash=e}(a);var o=M.lastIndexOf(m(z.location)),i=M.slice(0,o+1);i.push(t),M=i,S({action:n,location:r})}else S()}}))},replace:function(e,t){var n="REPLACE",r=h(e,void 0,void 0,z.location);k.confirmTransitionTo(r,n,o,(function(e){if(e){var t=m(r),a=g(s+t);C()!==a&&(L=t,T(a));var o=M.indexOf(m(z.location));-1!==o&&(M[o]=t),S({action:n,location:r})}}))},go:D,goBack:function(){D(-1)},goForward:function(){D(1)},block:function(e){void 0===e&&(e=!1);var t=k.setPrompt(e);return $||(F(1),$=!0),function(){return $&&($=!1,F(-1)),t()}},listen:function(e){var t=k.appendListener(e);return F(1),function(){F(-1),t()}}};return z}function L(e,t,n){return Math.min(Math.max(e,t),n)}function N(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,a=t.initialEntries,o=void 0===a?["/"]:a,i=t.initialIndex,l=void 0===i?0:i,s=t.keyLength,u=void 0===s?6:s,c=b();function d(e){(0,r.A)(w,e),w.length=w.entries.length,c.notifyListeners(w.location,w.action)}function f(){return Math.random().toString(36).substr(2,u)}var p=L(l,0,o.length-1),g=o.map((function(e){return h(e,void 0,"string"==typeof e?f():e.key||f())})),v=m;function y(e){var t=L(w.index+e,0,w.entries.length-1),r=w.entries[t];c.confirmTransitionTo(r,"POP",n,(function(e){e?d({action:"POP",location:r,index:t}):d()}))}var w={length:g.length,action:"POP",location:g[p],index:p,entries:g,createHref:v,push:function(e,t){var r="PUSH",a=h(e,t,f(),w.location);c.confirmTransitionTo(a,r,n,(function(e){if(e){var t=w.index+1,n=w.entries.slice(0);n.length>t?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=h(e,t,f(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t<w.entries.length},block:function(e){return void 0===e&&(e=!1),c.setPrompt(e)},listen:function(e){return c.appendListener(e)}};return w}},4146:(e,t,n)=>{"use strict";var r=n(4363),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g<i.length;++g){var b=i[g];if(!(o[b]||r&&r[b]||h&&h[b]||l&&l[b])){var v=f(n,b);try{u(t,b,v)}catch(y){}}}}return t}},311:e=>{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function a(e,t,n){return e<t?t:e>n?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},5228:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var o,i,l=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s<arguments.length;s++){for(var u in o=Object(arguments[s]))n.call(o,u)&&(l[u]=o[u]);if(t){i=t(o);for(var c=0;c<i.length;c++)r.call(o,i[c])&&(l[i[c]]=o[i[c]])}}return l}},5302:(e,t,n)=>{var r=n(4634);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",c=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var m=e[i],h=n[2],g=n[3],b=n[4],v=n[5],y=n[6],w=n[7];l&&(r.push(l),l="");var E=null!=h&&null!=m&&m!==h,k="+"===y||"*"===y,S="?"===y||"*"===y,x=n[2]||c,_=b||v;r.push({name:g||o++,prefix:h||"",delimiter:x,optional:S,repeat:k,partial:E,asterisk:!!w,pattern:_?u(_):w?".*":"[^"+s(x)+"]+?"})}}return i<e.length&&(l+=e.substr(i)),l&&r.push(l),r}function i(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function l(e,t){for(var n=new Array(e.length),a=0;a<e.length;a++)"object"==typeof e[a]&&(n[a]=new RegExp("^(?:"+e[a].pattern+")$",d(t)));return function(t,a){for(var o="",l=t||{},s=(a||{}).pretty?i:encodeURIComponent,u=0;u<e.length;u++){var c=e[u];if("string"!=typeof c){var d,f=l[c.name];if(null==f){if(c.optional){c.partial&&(o+=c.prefix);continue}throw new TypeError('Expected "'+c.name+'" to be defined')}if(r(f)){if(!c.repeat)throw new TypeError('Expected "'+c.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length){if(c.optional)continue;throw new TypeError('Expected "'+c.name+'" to not be empty')}for(var p=0;p<f.length;p++){if(d=s(f[p]),!n[u].test(d))throw new TypeError('Expected all "'+c.name+'" to match "'+c.pattern+'", but received `'+JSON.stringify(d)+"`");o+=(0===p?c.prefix:c.delimiter)+d}}else{if(d=c.asterisk?encodeURI(f).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):s(f),!n[u].test(d))throw new TypeError('Expected "'+c.name+'" to match "'+c.pattern+'", but received "'+d+'"');o+=c.prefix+d}}else o+=c}return o}}function s(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function u(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function c(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function f(e,t,n){r(t)||(n=t||n,t=[]);for(var a=(n=n||{}).strict,o=!1!==n.end,i="",l=0;l<e.length;l++){var u=e[l];if("string"==typeof u)i+=s(u);else{var f=s(u.prefix),p="(?:"+u.pattern+")";t.push(u),u.repeat&&(p+="(?:"+f+p+")*"),i+=p=u.optional?u.partial?f+"("+p+")?":"(?:"+f+"("+p+"))?":f+"("+p+")"}}var m=s(n.delimiter||"/"),h=i.slice(-m.length)===m;return a||(i=(h?i.slice(0,-m.length):i)+"(?:"+m+"(?=$))?"),i+=o?"$":a&&h?"":"(?="+m+"|$)",c(new RegExp("^"+i,d(n)),t)}function p(e,t,n){return r(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return c(e,t)}(e,t):r(e)?function(e,t,n){for(var r=[],a=0;a<e.length;a++)r.push(p(e[a],t,n).source);return c(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return f(o(e,n),t,n)}(e,t,n)}},1258:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var a,o;switch(n=n||{},r.util.type(t)){case"Object":if(o=r.util.objId(t),n[o])return n[o];for(var i in a={},n[o]=a,t)t.hasOwnProperty(i)&&(a[i]=e(t[i],n));return a;case"Array":return o=r.util.objId(t),n[o]?n[o]:(a=[],n[o]=a,t.forEach((function(t,r){a[r]=e(t,n)})),a);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var r="no-"+t;e;){var a=e.classList;if(a.contains(t))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=r.util.clone(r.languages[e]);for(var a in t)n[a]=t[a];return n},insertBefore:function(e,t,n,a){var o=(a=a||r.languages)[e],i={};for(var l in o)if(o.hasOwnProperty(l)){if(l==t)for(var s in n)n.hasOwnProperty(s)&&(i[s]=n[s]);n.hasOwnProperty(l)||(i[l]=o[l])}var u=a[e];return a[e]=i,r.languages.DFS(r.languages,(function(t,n){n===u&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,a,o){o=o||{};var i=r.util.objId;for(var l in t)if(t.hasOwnProperty(l)){n.call(t,l,t[l],a||l);var s=t[l],u=r.util.type(s);"Object"!==u||o[i(s)]?"Array"!==u||o[i(s)]||(o[i(s)]=!0,e(s,n,l,o)):(o[i(s)]=!0,e(s,n,null,o))}}},plugins:{},highlight:function(e,t,n){var o={code:e,grammar:t,language:n};return r.hooks.run("before-tokenize",o),o.tokens=r.tokenize(o.code,o.grammar),r.hooks.run("after-tokenize",o),a.stringify(r.util.encode(o.tokens),o.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var a=new l;return s(a,a.head,e),i(e,a,t,a.head,0),function(e){var t=[],n=e.head.next;for(;n!==e.tail;)t.push(n.value),n=n.next;return t}(a)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var a,o=0;a=n[o++];)a(t)}},Token:a};function a(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function o(e,t,n,r){e.lastIndex=t;var a=e.exec(n);if(a&&r&&a[1]){var o=a[1].length;a.index+=o,a[0]=a[0].slice(o)}return a}function i(e,t,n,l,c,d){for(var f in n)if(n.hasOwnProperty(f)&&n[f]){var p=n[f];p=Array.isArray(p)?p:[p];for(var m=0;m<p.length;++m){if(d&&d.cause==f+","+m)return;var h=p[m],g=h.inside,b=!!h.lookbehind,v=!!h.greedy,y=h.alias;if(v&&!h.pattern.global){var w=h.pattern.toString().match(/[imsuy]*$/)[0];h.pattern=RegExp(h.pattern.source,w+"g")}for(var E=h.pattern||h,k=l.next,S=c;k!==t.tail&&!(d&&S>=d.reach);S+=k.value.length,k=k.next){var x=k.value;if(t.length>e.length)return;if(!(x instanceof a)){var _,A=1;if(v){if(!(_=o(E,S,e,b))||_.index>=e.length)break;var C=_.index,T=_.index+_[0].length,O=S;for(O+=k.value.length;C>=O;)O+=(k=k.next).value.length;if(S=O-=k.value.length,k.value instanceof a)continue;for(var L=k;L!==t.tail&&(O<T||"string"==typeof L.value);L=L.next)A++,O+=L.value.length;A--,x=e.slice(S,O),_.index-=S}else if(!(_=o(E,0,x,b)))continue;C=_.index;var N=_[0],P=x.slice(0,C),R=x.slice(C+N.length),I=S+x.length;d&&I>d.reach&&(d.reach=I);var M=k.prev;if(P&&(M=s(t,M,P),S+=P.length),u(t,M,A),k=s(t,M,new a(f,g?r.tokenize(N,g):N,y,N)),R&&s(t,k,R),A>1){var D={cause:f+","+m,reach:I};i(e,t,n,k.prev,S,D),d&&D.reach>d.reach&&(d.reach=D.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function u(e,t,n){for(var r=t.next,a=0;a<n&&r!==e.tail;a++)r=r.next;t.next=r,r.prev=t,e.length-=a}return a.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var a="";return t.forEach((function(t){a+=e(t,n)})),a}var o={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(o.classes,i):o.classes.push(i)),r.hooks.run("wrap",o);var l="";for(var s in o.attributes)l+=" "+s+'="'+(o.attributes[s]||"").replace(/"/g,""")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+l+">"+o.content+"</"+o.tag+">"},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i;var r={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i<a.length;i++)o[a[i]]=e.languages.bash[a[i]];e.languages.shell=e.languages.bash}(a),a.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<value>>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<key>>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n<r;n++){var a=t[n];if("code"===a.type){var o=a.content[1],i=a.content[3];if(o&&i&&"code-language"===o.type&&"code-block"===i.type&&"string"==typeof o.content){var l=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),s="language-"+(l=(/[a-z][\w-]*/i.exec(l)||[""])[0].toLowerCase());i.alias?"string"==typeof i.alias?i.alias=[i.alias,s]:i.alias.push(s):i.alias=[s]}}else e(a.content)}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",r=0,a=t.classes.length;r<a;r++){var o=t.classes[r],u=/language-(.+)/.exec(o);if(u){n=u[1];break}}var c,d=e.languages[n];if(d)t.content=e.highlight((c=t.content,c.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;if("#"===(t=t.toLowerCase())[0])return n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),s(n);var r=l[t];return r||e}))),d,n);else if(n&&"none"!==n&&e.plugins.autoloader){var f="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random());t.attributes.id=f,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(f);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))}))}}}));var i=RegExp(e.languages.markup.tag.pattern.source,"gi"),l={amp:"&",lt:"<",gt:">",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n<t.length;){var r=t[n++];if("keyword"===r.type&&"mutation"===r.content){var a=[];if(d(["definition-mutation","punctuation"])&&"("===c(1).content){n+=2;var o=f(/^\($/,/^\)$/);if(-1===o)continue;for(;n<o;n++){var i=c(0);"variable"===i.type&&(p(i,"variable-input"),a.push(i.content))}n=o+1}if(d(["punctuation","property-query"])&&"{"===c(0).content&&(n++,p(c(0),"property-mutation"),a.length>0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s<l;s++){var u=t[s];"variable"===u.type&&a.indexOf(u.content)>=0&&p(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=c(n+t);if(!r||r.type!==e[n])return!1}return!0}function f(e,r){for(var a=1,o=n;o<t.length;o++){var i=t[o],l=i.content;if("punctuation"===i.type&&"string"==typeof l)if(e.test(l))a++;else if(r.test(l)&&0===--a)return o}return-1}function p(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),a.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function u(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function c(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,c={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return c[n]=a,n})).join(""),n,r),f=Object.keys(c);return i=0,function e(t){for(var n=0;n<t.length;n++){if(i>=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=u(c[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var h=[p];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r<a;r++){var o=n[r];if("string"!=typeof o){var i=o.content;if(Array.isArray(i))if("template-string"===o.type){var l=i[1];if(3===i.length&&"string"!=typeof l&&"embedded-code"===l.type){var s=f(l),u=l.alias,d=Array.isArray(u)?u[0]:u,p=e.languages[d];if(!p)continue;i[1]=c(s,p,d)}}else t(i);else"string"!=typeof i&&t([i])}}}(t.tokens)}))}(a),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r<n.length;r++){var a=n[r],o=e.languages.javascript[a];"RegExp"===e.util.type(o)&&(o=e.languages.javascript[a]={pattern:o});var i=o.inside||{};o.inside=i,i["maybe-class-name"]=/^[A-Z][\s\S]*/}}(a),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,a=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function o(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return r})).replace(/<SPREAD>/g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r<t.length;r++){var a=t[r],o=!1;if("string"!=typeof a&&("tag"===a.type&&a.content[0]&&"tag"===a.content[0].type?"</"===a.content[0].content[0].content?n.length>0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(s+=i(t[r+1]),t.splice(r+1,1)),r>0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s<l.length&&!(a>=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++a;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),v=[];h&&v.push.apply(v,i([h])),v.push(g),b&&v.push.apply(v,i([b])),"string"==typeof u?l.splice.apply(l,[s,1].concat(v)):u.content=v}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},5955:()=>{Prism.languages["go-mod"]=Prism.languages["go-module"]={comment:{pattern:/\/\/.*/,greedy:!0},version:{pattern:/(^|[\s()[\],])v\d+\.\d+\.\d+(?:[+-][-+.\w]*)?(?![^\s()[\],])/,lookbehind:!0,alias:"number"},"go-version":{pattern:/((?:^|\s)go\s+)\d+(?:\.\d+){1,2}/,lookbehind:!0,alias:"number"},keyword:{pattern:/^([ \t]*)(?:exclude|go|module|replace|require|retract)\b/m,lookbehind:!0},operator:/=>/,punctuation:/[()[\],]/}},9535:()=>{!function(e){var t=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:t}},builtin:t,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism)},7773:(e,t,n)=>{var r={"./prism-go-module":5955,"./prism-protobuf":9535};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=7773},2694:(e,t,n)=>{"use strict";var r=n(6925);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),a=n(5228),o=n(9982);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!r)throw Error(i(227));var l=new Set,s={};function u(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(s[e]=t,e=0;e<t.length;e++)l.add(t[e])}var d=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),f=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,p=Object.prototype.hasOwnProperty,m={},h={};function g(e,t,n,r,a,o,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=a,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var b={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){b[e]=new g(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];b[t]=new g(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){b[e]=new g(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){b[e]=new g(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){b[e]=new g(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){b[e]=new g(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){b[e]=new g(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){b[e]=new g(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){b[e]=new g(e,5,!1,e.toLowerCase(),null,!1,!1)}));var v=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function w(e,t,n,r){var a=b.hasOwnProperty(t)?b[t]:null;(null!==a?0===a.type:!r&&(2<t.length&&("o"===t[0]||"O"===t[0])&&("n"===t[1]||"N"===t[1])))||(function(e,t,n,r){if(null==t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,a,r)&&(n=null),r||null===a?function(e){return!!p.call(h,e)||!p.call(m,e)&&(f.test(e)?h[e]=!0:(m[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):a.mustUseProperty?e[a.propertyName]=null===n?3!==a.type&&"":n:(t=a.attributeName,r=a.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(a=a.type)||4===a&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new g(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new g(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(v,y);b[t]=new g(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){b[e]=new g(e,1,!1,e.toLowerCase(),null,!1,!1)})),b.xlinkHref=new g("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){b[e]=new g(e,1,!1,e.toLowerCase(),null,!0,!0)}));var E=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,k=60103,S=60106,x=60107,_=60108,A=60114,C=60109,T=60110,O=60112,L=60113,N=60120,P=60115,R=60116,I=60121,M=60128,D=60129,B=60130,F=60131;if("function"==typeof Symbol&&Symbol.for){var $=Symbol.for;k=$("react.element"),S=$("react.portal"),x=$("react.fragment"),_=$("react.strict_mode"),A=$("react.profiler"),C=$("react.provider"),T=$("react.context"),O=$("react.forward_ref"),L=$("react.suspense"),N=$("react.suspense_list"),P=$("react.memo"),R=$("react.lazy"),I=$("react.block"),$("react.scope"),M=$("react.opaque.id"),D=$("react.debug_trace_mode"),B=$("react.offscreen"),F=$("react.legacy_hidden")}var z,U="function"==typeof Symbol&&Symbol.iterator;function j(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=U&&e[U]||e["@@iterator"])?e:null}function H(e){if(void 0===z)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);z=t&&t[1]||""}return"\n"+z+e}var V=!1;function G(e,t){if(!e||V)return"";V=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(s){var r=s}Reflect.construct(e,[],t)}else{try{t.call()}catch(s){r=s}e.call(t.prototype)}else{try{throw Error()}catch(s){r=s}e()}}catch(s){if(s&&r&&"string"==typeof s.stack){for(var a=s.stack.split("\n"),o=r.stack.split("\n"),i=a.length-1,l=o.length-1;1<=i&&0<=l&&a[i]!==o[l];)l--;for(;1<=i&&0<=l;i--,l--)if(a[i]!==o[l]){if(1!==i||1!==l)do{if(i--,0>--l||a[i]!==o[l])return"\n"+a[i].replace(" at new "," at ")}while(1<=i&&0<=l);break}}}finally{V=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?H(e):""}function W(e){switch(e.tag){case 5:return H(e.type);case 16:return H("Lazy");case 13:return H("Suspense");case 19:return H("SuspenseList");case 0:case 2:case 15:return e=G(e.type,!1);case 11:return e=G(e.type.render,!1);case 22:return e=G(e.type._render,!1);case 1:return e=G(e.type,!0);default:return""}}function q(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case x:return"Fragment";case S:return"Portal";case A:return"Profiler";case _:return"StrictMode";case L:return"Suspense";case N:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case T:return(e.displayName||"Context")+".Consumer";case C:return(e._context.displayName||"Context")+".Provider";case O:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case P:return q(e.type);case I:return q(e._render);case R:t=e._payload,e=e._init;try{return q(e(t))}catch(n){}}return null}function K(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function Y(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function Q(e){e._valueTracker||(e._valueTracker=function(e){var t=Y(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var a=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(e){r=""+e,o.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function X(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Y(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Z(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function J(e,t){var n=t.checked;return a({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function ee(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=K(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function te(e,t){null!=(t=t.checked)&&w(e,"checked",t,!1)}function ne(e,t){te(e,t);var n=K(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ae(e,t.type,n):t.hasOwnProperty("defaultValue")&&ae(e,t.type,K(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function re(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ae(e,t,n){"number"===t&&Z(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}function oe(e,t){return e=a({children:void 0},t),(t=function(e){var t="";return r.Children.forEach(e,(function(e){null!=e&&(t+=e)})),t}(t.children))&&(e.children=t),e}function ie(e,t,n,r){if(e=e.options,t){t={};for(var a=0;a<n.length;a++)t["$"+n[a]]=!0;for(n=0;n<e.length;n++)a=t.hasOwnProperty("$"+e[n].value),e[n].selected!==a&&(e[n].selected=a),a&&r&&(e[n].defaultSelected=!0)}else{for(n=""+K(n),t=null,a=0;a<e.length;a++){if(e[a].value===n)return e[a].selected=!0,void(r&&(e[a].defaultSelected=!0));null!==t||e[a].disabled||(t=e[a])}null!==t&&(t.selected=!0)}}function le(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));return a({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function se(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(i(92));if(Array.isArray(n)){if(!(1>=n.length))throw Error(i(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:K(n)}}function ue(e,t){var n=K(t.value),r=K(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ce(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var de={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};function fe(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function pe(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?fe(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var me,he,ge=(he=function(e,t){if(e.namespaceURI!==de.svg||"innerHTML"in e)e.innerHTML=t;else{for((me=me||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=me.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return he(e,t)}))}:he);function be(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var ve={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ye=["Webkit","ms","Moz","O"];function we(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||ve.hasOwnProperty(e)&&ve[e]?(""+t).trim():t+"px"}function Ee(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),a=we(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,a):e[n]=a}}Object.keys(ve).forEach((function(e){ye.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ve[t]=ve[e]}))}));var ke=a({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Se(e,t){if(t){if(ke[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(i(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(i(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(i(62))}}function xe(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function _e(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Ae=null,Ce=null,Te=null;function Oe(e){if(e=na(e)){if("function"!=typeof Ae)throw Error(i(280));var t=e.stateNode;t&&(t=aa(t),Ae(e.stateNode,e.type,t))}}function Le(e){Ce?Te?Te.push(e):Te=[e]:Ce=e}function Ne(){if(Ce){var e=Ce,t=Te;if(Te=Ce=null,Oe(e),t)for(e=0;e<t.length;e++)Oe(t[e])}}function Pe(e,t){return e(t)}function Re(e,t,n,r,a){return e(t,n,r,a)}function Ie(){}var Me=Pe,De=!1,Be=!1;function Fe(){null===Ce&&null===Te||(Ie(),Ne())}function $e(e,t){var n=e.stateNode;if(null===n)return null;var r=aa(n);if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(i(231,t,typeof n));return n}var ze=!1;if(d)try{var Ue={};Object.defineProperty(Ue,"passive",{get:function(){ze=!0}}),window.addEventListener("test",Ue,Ue),window.removeEventListener("test",Ue,Ue)}catch(he){ze=!1}function je(e,t,n,r,a,o,i,l,s){var u=Array.prototype.slice.call(arguments,3);try{t.apply(n,u)}catch(c){this.onError(c)}}var He=!1,Ve=null,Ge=!1,We=null,qe={onError:function(e){He=!0,Ve=e}};function Ke(e,t,n,r,a,o,i,l,s){He=!1,Ve=null,je.apply(qe,arguments)}function Ye(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{!!(1026&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function Qe(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function Xe(e){if(Ye(e)!==e)throw Error(i(188))}function Ze(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ye(e)))throw Error(i(188));return t!==e?null:e}for(var n=e,r=t;;){var a=n.return;if(null===a)break;var o=a.alternate;if(null===o){if(null!==(r=a.return)){n=r;continue}break}if(a.child===o.child){for(o=a.child;o;){if(o===n)return Xe(a),e;if(o===r)return Xe(a),t;o=o.sibling}throw Error(i(188))}if(n.return!==r.return)n=a,r=o;else{for(var l=!1,s=a.child;s;){if(s===n){l=!0,n=a,r=o;break}if(s===r){l=!0,r=a,n=o;break}s=s.sibling}if(!l){for(s=o.child;s;){if(s===n){l=!0,n=o,r=a;break}if(s===r){l=!0,r=o,n=a;break}s=s.sibling}if(!l)throw Error(i(189))}}if(n.alternate!==r)throw Error(i(190))}if(3!==n.tag)throw Error(i(188));return n.stateNode.current===n?e:t}(e),!e)return null;for(var t=e;;){if(5===t.tag||6===t.tag)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}function Je(e,t){for(var n=e.alternate;null!==t;){if(t===e||t===n)return!0;t=t.return}return!1}var et,tt,nt,rt,at=!1,ot=[],it=null,lt=null,st=null,ut=new Map,ct=new Map,dt=[],ft="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function pt(e,t,n,r,a){return{blockedOn:e,domEventName:t,eventSystemFlags:16|n,nativeEvent:a,targetContainers:[r]}}function mt(e,t){switch(e){case"focusin":case"focusout":it=null;break;case"dragenter":case"dragleave":lt=null;break;case"mouseover":case"mouseout":st=null;break;case"pointerover":case"pointerout":ut.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ct.delete(t.pointerId)}}function ht(e,t,n,r,a,o){return null===e||e.nativeEvent!==o?(e=pt(t,n,r,a,o),null!==t&&(null!==(t=na(t))&&tt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==a&&-1===t.indexOf(a)&&t.push(a),e)}function gt(e){var t=ta(e.target);if(null!==t){var n=Ye(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Qe(n)))return e.blockedOn=t,void rt(e.lanePriority,(function(){o.unstable_runWithPriority(e.priority,(function(){nt(n)}))}))}else if(3===t&&n.stateNode.hydrate)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function bt(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Zt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=na(n))&&tt(t),e.blockedOn=n,!1;t.shift()}return!0}function vt(e,t,n){bt(e)&&n.delete(t)}function yt(){for(at=!1;0<ot.length;){var e=ot[0];if(null!==e.blockedOn){null!==(e=na(e.blockedOn))&&et(e);break}for(var t=e.targetContainers;0<t.length;){var n=Zt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n){e.blockedOn=n;break}t.shift()}null===e.blockedOn&&ot.shift()}null!==it&&bt(it)&&(it=null),null!==lt&&bt(lt)&&(lt=null),null!==st&&bt(st)&&(st=null),ut.forEach(vt),ct.forEach(vt)}function wt(e,t){e.blockedOn===t&&(e.blockedOn=null,at||(at=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,yt)))}function Et(e){function t(t){return wt(t,e)}if(0<ot.length){wt(ot[0],e);for(var n=1;n<ot.length;n++){var r=ot[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==it&&wt(it,e),null!==lt&&wt(lt,e),null!==st&&wt(st,e),ut.forEach(t),ct.forEach(t),n=0;n<dt.length;n++)(r=dt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<dt.length&&null===(n=dt[0]).blockedOn;)gt(n),null===n.blockedOn&&dt.shift()}function kt(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var St={animationend:kt("Animation","AnimationEnd"),animationiteration:kt("Animation","AnimationIteration"),animationstart:kt("Animation","AnimationStart"),transitionend:kt("Transition","TransitionEnd")},xt={},_t={};function At(e){if(xt[e])return xt[e];if(!St[e])return e;var t,n=St[e];for(t in n)if(n.hasOwnProperty(t)&&t in _t)return xt[e]=n[t];return e}d&&(_t=document.createElement("div").style,"AnimationEvent"in window||(delete St.animationend.animation,delete St.animationiteration.animation,delete St.animationstart.animation),"TransitionEvent"in window||delete St.transitionend.transition);var Ct=At("animationend"),Tt=At("animationiteration"),Ot=At("animationstart"),Lt=At("transitionend"),Nt=new Map,Pt=new Map,Rt=["abort","abort",Ct,"animationEnd",Tt,"animationIteration",Ot,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",Lt,"transitionEnd","waiting","waiting"];function It(e,t){for(var n=0;n<e.length;n+=2){var r=e[n],a=e[n+1];a="on"+(a[0].toUpperCase()+a.slice(1)),Pt.set(r,t),Nt.set(r,a),u(a,[r])}}(0,o.unstable_now)();var Mt=8;function Dt(e){if(1&e)return Mt=15,1;if(2&e)return Mt=14,2;if(4&e)return Mt=13,4;var t=24&e;return 0!==t?(Mt=12,t):32&e?(Mt=11,32):0!==(t=192&e)?(Mt=10,t):256&e?(Mt=9,256):0!==(t=3584&e)?(Mt=8,t):4096&e?(Mt=7,4096):0!==(t=4186112&e)?(Mt=6,t):0!==(t=62914560&e)?(Mt=5,t):67108864&e?(Mt=4,67108864):134217728&e?(Mt=3,134217728):0!==(t=805306368&e)?(Mt=2,t):1073741824&e?(Mt=1,1073741824):(Mt=8,e)}function Bt(e,t){var n=e.pendingLanes;if(0===n)return Mt=0;var r=0,a=0,o=e.expiredLanes,i=e.suspendedLanes,l=e.pingedLanes;if(0!==o)r=o,a=Mt=15;else if(0!==(o=134217727&n)){var s=o&~i;0!==s?(r=Dt(s),a=Mt):0!==(l&=o)&&(r=Dt(l),a=Mt)}else 0!==(o=n&~i)?(r=Dt(o),a=Mt):0!==l&&(r=Dt(l),a=Mt);if(0===r)return 0;if(r=n&((0>(r=31-Ht(r))?0:1<<r)<<1)-1,0!==t&&t!==r&&!(t&i)){if(Dt(t),a<=Mt)return t;Mt=a}if(0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)a=1<<(n=31-Ht(t)),r|=e[n],t&=~a;return r}function Ft(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function $t(e,t){switch(e){case 15:return 1;case 14:return 2;case 12:return 0===(e=zt(24&~t))?$t(10,t):e;case 10:return 0===(e=zt(192&~t))?$t(8,t):e;case 8:return 0===(e=zt(3584&~t))&&(0===(e=zt(4186112&~t))&&(e=512)),e;case 2:return 0===(t=zt(805306368&~t))&&(t=268435456),t}throw Error(i(358,e))}function zt(e){return e&-e}function Ut(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function jt(e,t,n){e.pendingLanes|=t;var r=t-1;e.suspendedLanes&=r,e.pingedLanes&=r,(e=e.eventTimes)[t=31-Ht(t)]=n}var Ht=Math.clz32?Math.clz32:function(e){return 0===e?32:31-(Vt(e)/Gt|0)|0},Vt=Math.log,Gt=Math.LN2;var Wt=o.unstable_UserBlockingPriority,qt=o.unstable_runWithPriority,Kt=!0;function Yt(e,t,n,r){De||Ie();var a=Xt,o=De;De=!0;try{Re(a,e,t,n,r)}finally{(De=o)||Fe()}}function Qt(e,t,n,r){qt(Wt,Xt.bind(null,e,t,n,r))}function Xt(e,t,n,r){var a;if(Kt)if((a=!(4&t))&&0<ot.length&&-1<ft.indexOf(e))e=pt(null,e,t,n,r),ot.push(e);else{var o=Zt(e,t,n,r);if(null===o)a&&mt(e,r);else{if(a){if(-1<ft.indexOf(e))return e=pt(o,e,t,n,r),void ot.push(e);if(function(e,t,n,r,a){switch(t){case"focusin":return it=ht(it,e,t,n,r,a),!0;case"dragenter":return lt=ht(lt,e,t,n,r,a),!0;case"mouseover":return st=ht(st,e,t,n,r,a),!0;case"pointerover":var o=a.pointerId;return ut.set(o,ht(ut.get(o)||null,e,t,n,r,a)),!0;case"gotpointercapture":return o=a.pointerId,ct.set(o,ht(ct.get(o)||null,e,t,n,r,a)),!0}return!1}(o,e,t,n,r))return;mt(e,r)}Ir(e,t,r,null,n)}}}function Zt(e,t,n,r){var a=_e(r);if(null!==(a=ta(a))){var o=Ye(a);if(null===o)a=null;else{var i=o.tag;if(13===i){if(null!==(a=Qe(o)))return a;a=null}else if(3===i){if(o.stateNode.hydrate)return 3===o.tag?o.stateNode.containerInfo:null;a=null}else o!==a&&(a=null)}}return Ir(e,t,r,a,n),null}var Jt=null,en=null,tn=null;function nn(){if(tn)return tn;var e,t,n=en,r=n.length,a="value"in Jt?Jt.value:Jt.textContent,o=a.length;for(e=0;e<r&&n[e]===a[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===a[o-t];t++);return tn=a.slice(e,1<t?1-t:void 0)}function rn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function an(){return!0}function on(){return!1}function ln(e){function t(t,n,r,a,o){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=a,this.target=o,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(a):a[i]);return this.isDefaultPrevented=(null!=a.defaultPrevented?a.defaultPrevented:!1===a.returnValue)?an:on,this.isPropagationStopped=on,this}return a(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=an)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=an)},persist:function(){},isPersistent:an}),t}var sn,un,cn,dn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},fn=ln(dn),pn=a({},dn,{view:0,detail:0}),mn=ln(pn),hn=a({},pn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Cn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==cn&&(cn&&"mousemove"===e.type?(sn=e.screenX-cn.screenX,un=e.screenY-cn.screenY):un=sn=0,cn=e),sn)},movementY:function(e){return"movementY"in e?e.movementY:un}}),gn=ln(hn),bn=ln(a({},hn,{dataTransfer:0})),vn=ln(a({},pn,{relatedTarget:0})),yn=ln(a({},dn,{animationName:0,elapsedTime:0,pseudoElement:0})),wn=a({},dn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),En=ln(wn),kn=ln(a({},dn,{data:0})),Sn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},xn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},_n={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function An(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=_n[e])&&!!t[e]}function Cn(){return An}var Tn=a({},pn,{key:function(e){if(e.key){var t=Sn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=rn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?xn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Cn,charCode:function(e){return"keypress"===e.type?rn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?rn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),On=ln(Tn),Ln=ln(a({},hn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Nn=ln(a({},pn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Cn})),Pn=ln(a({},dn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Rn=a({},hn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),In=ln(Rn),Mn=[9,13,27,32],Dn=d&&"CompositionEvent"in window,Bn=null;d&&"documentMode"in document&&(Bn=document.documentMode);var Fn=d&&"TextEvent"in window&&!Bn,$n=d&&(!Dn||Bn&&8<Bn&&11>=Bn),zn=String.fromCharCode(32),Un=!1;function jn(e,t){switch(e){case"keyup":return-1!==Mn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Hn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Vn=!1;var Gn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Wn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Gn[e.type]:"textarea"===t}function qn(e,t,n,r){Le(r),0<(t=Dr(t,"onChange")).length&&(n=new fn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Kn=null,Yn=null;function Qn(e){Tr(e,0)}function Xn(e){if(X(ra(e)))return e}function Zn(e,t){if("change"===e)return t}var Jn=!1;if(d){var er;if(d){var tr="oninput"in document;if(!tr){var nr=document.createElement("div");nr.setAttribute("oninput","return;"),tr="function"==typeof nr.oninput}er=tr}else er=!1;Jn=er&&(!document.documentMode||9<document.documentMode)}function rr(){Kn&&(Kn.detachEvent("onpropertychange",ar),Yn=Kn=null)}function ar(e){if("value"===e.propertyName&&Xn(Yn)){var t=[];if(qn(t,Yn,e,_e(e)),e=Qn,De)e(t);else{De=!0;try{Pe(e,t)}finally{De=!1,Fe()}}}}function or(e,t,n){"focusin"===e?(rr(),Yn=n,(Kn=t).attachEvent("onpropertychange",ar)):"focusout"===e&&rr()}function ir(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Xn(Yn)}function lr(e,t){if("click"===e)return Xn(t)}function sr(e,t){if("input"===e||"change"===e)return Xn(t)}var ur="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},cr=Object.prototype.hasOwnProperty;function dr(e,t){if(ur(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++)if(!cr.call(t,n[r])||!ur(e[n[r]],t[n[r]]))return!1;return!0}function fr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function pr(e,t){var n,r=fr(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=fr(r)}}function mr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?mr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function hr(){for(var e=window,t=Z();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=Z((e=t.contentWindow).document)}return t}function gr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var br=d&&"documentMode"in document&&11>=document.documentMode,vr=null,yr=null,wr=null,Er=!1;function kr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;Er||null==vr||vr!==Z(r)||("selectionStart"in(r=vr)&&gr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},wr&&dr(wr,r)||(wr=r,0<(r=Dr(yr,"onSelect")).length&&(t=new fn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=vr)))}It("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),It("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),It(Rt,2);for(var Sr="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),xr=0;xr<Sr.length;xr++)Pt.set(Sr[xr],0);c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),u("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),u("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),u("onBeforeInput",["compositionend","keypress","textInput","paste"]),u("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),u("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),u("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var _r="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Ar=new Set("cancel close invalid load scroll toggle".split(" ").concat(_r));function Cr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,a,o,l,s,u){if(Ke.apply(this,arguments),He){if(!He)throw Error(i(198));var c=Ve;He=!1,Ve=null,Ge||(Ge=!0,We=c)}}(r,t,void 0,e),e.currentTarget=null}function Tr(e,t){t=!!(4&t);for(var n=0;n<e.length;n++){var r=e[n],a=r.event;r=r.listeners;e:{var o=void 0;if(t)for(var i=r.length-1;0<=i;i--){var l=r[i],s=l.instance,u=l.currentTarget;if(l=l.listener,s!==o&&a.isPropagationStopped())break e;Cr(a,l,u),o=s}else for(i=0;i<r.length;i++){if(s=(l=r[i]).instance,u=l.currentTarget,l=l.listener,s!==o&&a.isPropagationStopped())break e;Cr(a,l,u),o=s}}}if(Ge)throw e=We,Ge=!1,We=null,e}function Or(e,t){var n=oa(t),r=e+"__bubble";n.has(r)||(Rr(t,e,2,!1),n.add(r))}var Lr="_reactListening"+Math.random().toString(36).slice(2);function Nr(e){e[Lr]||(e[Lr]=!0,l.forEach((function(t){Ar.has(t)||Pr(t,!1,e,null),Pr(t,!0,e,null)})))}function Pr(e,t,n,r){var a=4<arguments.length&&void 0!==arguments[4]?arguments[4]:0,o=n;if("selectionchange"===e&&9!==n.nodeType&&(o=n.ownerDocument),null!==r&&!t&&Ar.has(e)){if("scroll"!==e)return;a|=2,o=r}var i=oa(o),l=e+"__"+(t?"capture":"bubble");i.has(l)||(t&&(a|=4),Rr(o,e,a,t),i.add(l))}function Rr(e,t,n,r){var a=Pt.get(t);switch(void 0===a?2:a){case 0:a=Yt;break;case 1:a=Qt;break;default:a=Xt}n=a.bind(null,t,n,e),a=void 0,!ze||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(a=!0),r?void 0!==a?e.addEventListener(t,n,{capture:!0,passive:a}):e.addEventListener(t,n,!0):void 0!==a?e.addEventListener(t,n,{passive:a}):e.addEventListener(t,n,!1)}function Ir(e,t,n,r,a){var o=r;if(!(1&t||2&t||null===r))e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var l=r.stateNode.containerInfo;if(l===a||8===l.nodeType&&l.parentNode===a)break;if(4===i)for(i=r.return;null!==i;){var s=i.tag;if((3===s||4===s)&&((s=i.stateNode.containerInfo)===a||8===s.nodeType&&s.parentNode===a))return;i=i.return}for(;null!==l;){if(null===(i=ta(l)))return;if(5===(s=i.tag)||6===s){r=o=i;continue e}l=l.parentNode}}r=r.return}!function(e,t,n){if(Be)return e(t,n);Be=!0;try{return Me(e,t,n)}finally{Be=!1,Fe()}}((function(){var r=o,a=_e(n),i=[];e:{var l=Nt.get(e);if(void 0!==l){var s=fn,u=e;switch(e){case"keypress":if(0===rn(n))break e;case"keydown":case"keyup":s=On;break;case"focusin":u="focus",s=vn;break;case"focusout":u="blur",s=vn;break;case"beforeblur":case"afterblur":s=vn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":s=gn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":s=bn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":s=Nn;break;case Ct:case Tt:case Ot:s=yn;break;case Lt:s=Pn;break;case"scroll":s=mn;break;case"wheel":s=In;break;case"copy":case"cut":case"paste":s=En;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":s=Ln}var c=!!(4&t),d=!c&&"scroll"===e,f=c?null!==l?l+"Capture":null:l;c=[];for(var p,m=r;null!==m;){var h=(p=m).stateNode;if(5===p.tag&&null!==h&&(p=h,null!==f&&(null!=(h=$e(m,f))&&c.push(Mr(m,h,p)))),d)break;m=m.return}0<c.length&&(l=new s(l,u,null,n,a),i.push({event:l,listeners:c}))}}if(!(7&t)){if(s="mouseout"===e||"pointerout"===e,(!(l="mouseover"===e||"pointerover"===e)||16&t||!(u=n.relatedTarget||n.fromElement)||!ta(u)&&!u[Jr])&&(s||l)&&(l=a.window===a?a:(l=a.ownerDocument)?l.defaultView||l.parentWindow:window,s?(s=r,null!==(u=(u=n.relatedTarget||n.toElement)?ta(u):null)&&(u!==(d=Ye(u))||5!==u.tag&&6!==u.tag)&&(u=null)):(s=null,u=r),s!==u)){if(c=gn,h="onMouseLeave",f="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(c=Ln,h="onPointerLeave",f="onPointerEnter",m="pointer"),d=null==s?l:ra(s),p=null==u?l:ra(u),(l=new c(h,m+"leave",s,n,a)).target=d,l.relatedTarget=p,h=null,ta(a)===r&&((c=new c(f,m+"enter",u,n,a)).target=p,c.relatedTarget=d,h=c),d=h,s&&u)e:{for(f=u,m=0,p=c=s;p;p=Br(p))m++;for(p=0,h=f;h;h=Br(h))p++;for(;0<m-p;)c=Br(c),m--;for(;0<p-m;)f=Br(f),p--;for(;m--;){if(c===f||null!==f&&c===f.alternate)break e;c=Br(c),f=Br(f)}c=null}else c=null;null!==s&&Fr(i,l,s,c,!1),null!==u&&null!==d&&Fr(i,d,u,c,!0)}if("select"===(s=(l=r?ra(r):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var g=Zn;else if(Wn(l))if(Jn)g=sr;else{g=ir;var b=or}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(g=lr);switch(g&&(g=g(e,r))?qn(i,g,n,a):(b&&b(e,l,r),"focusout"===e&&(b=l._wrapperState)&&b.controlled&&"number"===l.type&&ae(l,"number",l.value)),b=r?ra(r):window,e){case"focusin":(Wn(b)||"true"===b.contentEditable)&&(vr=b,yr=r,wr=null);break;case"focusout":wr=yr=vr=null;break;case"mousedown":Er=!0;break;case"contextmenu":case"mouseup":case"dragend":Er=!1,kr(i,n,a);break;case"selectionchange":if(br)break;case"keydown":case"keyup":kr(i,n,a)}var v;if(Dn)e:{switch(e){case"compositionstart":var y="onCompositionStart";break e;case"compositionend":y="onCompositionEnd";break e;case"compositionupdate":y="onCompositionUpdate";break e}y=void 0}else Vn?jn(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&($n&&"ko"!==n.locale&&(Vn||"onCompositionStart"!==y?"onCompositionEnd"===y&&Vn&&(v=nn()):(en="value"in(Jt=a)?Jt.value:Jt.textContent,Vn=!0)),0<(b=Dr(r,y)).length&&(y=new kn(y,e,null,n,a),i.push({event:y,listeners:b}),v?y.data=v:null!==(v=Hn(n))&&(y.data=v))),(v=Fn?function(e,t){switch(e){case"compositionend":return Hn(t);case"keypress":return 32!==t.which?null:(Un=!0,zn);case"textInput":return(e=t.data)===zn&&Un?null:e;default:return null}}(e,n):function(e,t){if(Vn)return"compositionend"===e||!Dn&&jn(e,t)?(e=nn(),tn=en=Jt=null,Vn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return $n&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Dr(r,"onBeforeInput")).length&&(a=new kn("onBeforeInput","beforeinput",null,n,a),i.push({event:a,listeners:r}),a.data=v))}Tr(i,t)}))}function Mr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Dr(e,t){for(var n=t+"Capture",r=[];null!==e;){var a=e,o=a.stateNode;5===a.tag&&null!==o&&(a=o,null!=(o=$e(e,n))&&r.unshift(Mr(e,o,a)),null!=(o=$e(e,t))&&r.push(Mr(e,o,a))),e=e.return}return r}function Br(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Fr(e,t,n,r,a){for(var o=t._reactName,i=[];null!==n&&n!==r;){var l=n,s=l.alternate,u=l.stateNode;if(null!==s&&s===r)break;5===l.tag&&null!==u&&(l=u,a?null!=(s=$e(n,o))&&i.unshift(Mr(n,s,l)):a||null!=(s=$e(n,o))&&i.push(Mr(n,s,l))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}function $r(){}var zr=null,Ur=null;function jr(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function Hr(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var Vr="function"==typeof setTimeout?setTimeout:void 0,Gr="function"==typeof clearTimeout?clearTimeout:void 0;function Wr(e){1===e.nodeType?e.textContent="":9===e.nodeType&&(null!=(e=e.body)&&(e.textContent=""))}function qr(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function Kr(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var Yr=0;var Qr=Math.random().toString(36).slice(2),Xr="__reactFiber$"+Qr,Zr="__reactProps$"+Qr,Jr="__reactContainer$"+Qr,ea="__reactEvents$"+Qr;function ta(e){var t=e[Xr];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Jr]||n[Xr]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=Kr(e);null!==e;){if(n=e[Xr])return n;e=Kr(e)}return t}n=(e=n).parentNode}return null}function na(e){return!(e=e[Xr]||e[Jr])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function ra(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(i(33))}function aa(e){return e[Zr]||null}function oa(e){var t=e[ea];return void 0===t&&(t=e[ea]=new Set),t}var ia=[],la=-1;function sa(e){return{current:e}}function ua(e){0>la||(e.current=ia[la],ia[la]=null,la--)}function ca(e,t){la++,ia[la]=e.current,e.current=t}var da={},fa=sa(da),pa=sa(!1),ma=da;function ha(e,t){var n=e.type.contextTypes;if(!n)return da;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var a,o={};for(a in n)o[a]=t[a];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function ga(e){return null!=(e=e.childContextTypes)}function ba(){ua(pa),ua(fa)}function va(e,t,n){if(fa.current!==da)throw Error(i(168));ca(fa,t),ca(pa,n)}function ya(e,t,n){var r=e.stateNode;if(e=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in e))throw Error(i(108,q(t)||"Unknown",o));return a({},n,r)}function wa(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||da,ma=fa.current,ca(fa,e),ca(pa,pa.current),!0}function Ea(e,t,n){var r=e.stateNode;if(!r)throw Error(i(169));n?(e=ya(e,t,ma),r.__reactInternalMemoizedMergedChildContext=e,ua(pa),ua(fa),ca(fa,e)):ua(pa),ca(pa,n)}var ka=null,Sa=null,xa=o.unstable_runWithPriority,_a=o.unstable_scheduleCallback,Aa=o.unstable_cancelCallback,Ca=o.unstable_shouldYield,Ta=o.unstable_requestPaint,Oa=o.unstable_now,La=o.unstable_getCurrentPriorityLevel,Na=o.unstable_ImmediatePriority,Pa=o.unstable_UserBlockingPriority,Ra=o.unstable_NormalPriority,Ia=o.unstable_LowPriority,Ma=o.unstable_IdlePriority,Da={},Ba=void 0!==Ta?Ta:function(){},Fa=null,$a=null,za=!1,Ua=Oa(),ja=1e4>Ua?Oa:function(){return Oa()-Ua};function Ha(){switch(La()){case Na:return 99;case Pa:return 98;case Ra:return 97;case Ia:return 96;case Ma:return 95;default:throw Error(i(332))}}function Va(e){switch(e){case 99:return Na;case 98:return Pa;case 97:return Ra;case 96:return Ia;case 95:return Ma;default:throw Error(i(332))}}function Ga(e,t){return e=Va(e),xa(e,t)}function Wa(e,t,n){return e=Va(e),_a(e,t,n)}function qa(){if(null!==$a){var e=$a;$a=null,Aa(e)}Ka()}function Ka(){if(!za&&null!==Fa){za=!0;var e=0;try{var t=Fa;Ga(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),Fa=null}catch(n){throw null!==Fa&&(Fa=Fa.slice(e+1)),_a(Na,qa),n}finally{za=!1}}}var Ya=E.ReactCurrentBatchConfig;function Qa(e,t){if(e&&e.defaultProps){for(var n in t=a({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var Xa=sa(null),Za=null,Ja=null,eo=null;function to(){eo=Ja=Za=null}function no(e){var t=Xa.current;ua(Xa),e.type._context._currentValue=t}function ro(e,t){for(;null!==e;){var n=e.alternate;if((e.childLanes&t)===t){if(null===n||(n.childLanes&t)===t)break;n.childLanes|=t}else e.childLanes|=t,null!==n&&(n.childLanes|=t);e=e.return}}function ao(e,t){Za=e,eo=Ja=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(!!(e.lanes&t)&&(Di=!0),e.firstContext=null)}function oo(e,t){if(eo!==e&&!1!==t&&0!==t)if("number"==typeof t&&1073741823!==t||(eo=e,t=1073741823),t={context:e,observedBits:t,next:null},null===Ja){if(null===Za)throw Error(i(308));Ja=t,Za.dependencies={lanes:0,firstContext:t,responders:null}}else Ja=Ja.next=t;return e._currentValue}var io=!1;function lo(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function so(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function uo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function co(e,t){if(null!==(e=e.updateQueue)){var n=(e=e.shared).pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}}function fo(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var a=null,o=null;if(null!==(n=n.firstBaseUpdate)){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===o?a=o=i:o=o.next=i,n=n.next}while(null!==n);null===o?a=o=t:o=o.next=t}else a=o=t;return n={baseState:r.baseState,firstBaseUpdate:a,lastBaseUpdate:o,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function po(e,t,n,r){var o=e.updateQueue;io=!1;var i=o.firstBaseUpdate,l=o.lastBaseUpdate,s=o.shared.pending;if(null!==s){o.shared.pending=null;var u=s,c=u.next;u.next=null,null===l?i=c:l.next=c,l=u;var d=e.alternate;if(null!==d){var f=(d=d.updateQueue).lastBaseUpdate;f!==l&&(null===f?d.firstBaseUpdate=c:f.next=c,d.lastBaseUpdate=u)}}if(null!==i){for(f=o.baseState,l=0,d=c=u=null;;){s=i.lane;var p=i.eventTime;if((r&s)===s){null!==d&&(d=d.next={eventTime:p,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var m=e,h=i;switch(s=t,p=n,h.tag){case 1:if("function"==typeof(m=h.payload)){f=m.call(p,f,s);break e}f=m;break e;case 3:m.flags=-4097&m.flags|64;case 0:if(null==(s="function"==typeof(m=h.payload)?m.call(p,f,s):m))break e;f=a({},f,s);break e;case 2:io=!0}}null!==i.callback&&(e.flags|=32,null===(s=o.effects)?o.effects=[i]:s.push(i))}else p={eventTime:p,lane:s,tag:i.tag,payload:i.payload,callback:i.callback,next:null},null===d?(c=d=p,u=f):d=d.next=p,l|=s;if(null===(i=i.next)){if(null===(s=o.shared.pending))break;i=s.next,s.next=null,o.lastBaseUpdate=s,o.shared.pending=null}}null===d&&(u=f),o.baseState=u,o.firstBaseUpdate=c,o.lastBaseUpdate=d,Ul|=l,e.lanes=l,e.memoizedState=f}}function mo(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],a=r.callback;if(null!==a){if(r.callback=null,r=n,"function"!=typeof a)throw Error(i(191,a));a.call(r)}}}var ho=(new r.Component).refs;function go(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:a({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var bo={isMounted:function(e){return!!(e=e._reactInternals)&&Ye(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=fs(),a=ps(e),o=uo(r,a);o.payload=t,null!=n&&(o.callback=n),co(e,o),ms(e,a,r)},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=fs(),a=ps(e),o=uo(r,a);o.tag=1,o.payload=t,null!=n&&(o.callback=n),co(e,o),ms(e,a,r)},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=fs(),r=ps(e),a=uo(n,r);a.tag=2,null!=t&&(a.callback=t),co(e,a),ms(e,r,n)}};function vo(e,t,n,r,a,o,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,o,i):!t.prototype||!t.prototype.isPureReactComponent||(!dr(n,r)||!dr(a,o))}function yo(e,t,n){var r=!1,a=da,o=t.contextType;return"object"==typeof o&&null!==o?o=oo(o):(a=ga(t)?ma:fa.current,o=(r=null!=(r=t.contextTypes))?ha(e,a):da),t=new t(n,o),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=bo,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=a,e.__reactInternalMemoizedMaskedChildContext=o),t}function wo(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&bo.enqueueReplaceState(t,t.state,null)}function Eo(e,t,n,r){var a=e.stateNode;a.props=n,a.state=e.memoizedState,a.refs=ho,lo(e);var o=t.contextType;"object"==typeof o&&null!==o?a.context=oo(o):(o=ga(t)?ma:fa.current,a.context=ha(e,o)),po(e,n,a,r),a.state=e.memoizedState,"function"==typeof(o=t.getDerivedStateFromProps)&&(go(e,t,o,n),a.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof a.getSnapshotBeforeUpdate||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||(t=a.state,"function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount(),t!==a.state&&bo.enqueueReplaceState(a,a.state,null),po(e,n,a,r),a.state=e.memoizedState),"function"==typeof a.componentDidMount&&(e.flags|=4)}var ko=Array.isArray;function So(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(i(309));var r=n.stateNode}if(!r)throw Error(i(147,e));var a=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===a?t.ref:(t=function(e){var t=r.refs;t===ho&&(t=r.refs={}),null===e?delete t[a]:t[a]=e},t._stringRef=a,t)}if("string"!=typeof e)throw Error(i(284));if(!n._owner)throw Error(i(290,e))}return e}function xo(e,t){if("textarea"!==e.type)throw Error(i(31,"[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t))}function _o(e){function t(t,n){if(e){var r=t.lastEffect;null!==r?(r.nextEffect=n,t.lastEffect=n):t.firstEffect=t.lastEffect=n,n.nextEffect=null,n.flags=8}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function a(e,t){return(e=Ws(e,t)).index=0,e.sibling=null,e}function o(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags=2,n):r:(t.flags=2,n):n}function l(t){return e&&null===t.alternate&&(t.flags=2),t}function s(e,t,n,r){return null===t||6!==t.tag?((t=Qs(n,e.mode,r)).return=e,t):((t=a(t,n)).return=e,t)}function u(e,t,n,r){return null!==t&&t.elementType===n.type?((r=a(t,n.props)).ref=So(e,t,n),r.return=e,r):((r=qs(n.type,n.key,n.props,null,e.mode,r)).ref=So(e,t,n),r.return=e,r)}function c(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Xs(n,e.mode,r)).return=e,t):((t=a(t,n.children||[])).return=e,t)}function d(e,t,n,r,o){return null===t||7!==t.tag?((t=Ks(n,e.mode,r,o)).return=e,t):((t=a(t,n)).return=e,t)}function f(e,t,n){if("string"==typeof t||"number"==typeof t)return(t=Qs(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case k:return(n=qs(t.type,t.key,t.props,null,e.mode,n)).ref=So(e,null,t),n.return=e,n;case S:return(t=Xs(t,e.mode,n)).return=e,t}if(ko(t)||j(t))return(t=Ks(t,e.mode,n,null)).return=e,t;xo(e,t)}return null}function p(e,t,n,r){var a=null!==t?t.key:null;if("string"==typeof n||"number"==typeof n)return null!==a?null:s(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case k:return n.key===a?n.type===x?d(e,t,n.props.children,r,a):u(e,t,n,r):null;case S:return n.key===a?c(e,t,n,r):null}if(ko(n)||j(n))return null!==a?null:d(e,t,n,r,null);xo(e,n)}return null}function m(e,t,n,r,a){if("string"==typeof r||"number"==typeof r)return s(t,e=e.get(n)||null,""+r,a);if("object"==typeof r&&null!==r){switch(r.$$typeof){case k:return e=e.get(null===r.key?n:r.key)||null,r.type===x?d(t,e,r.props.children,a,r.key):u(t,e,r,a);case S:return c(t,e=e.get(null===r.key?n:r.key)||null,r,a)}if(ko(r)||j(r))return d(t,e=e.get(n)||null,r,a,null);xo(t,r)}return null}function h(a,i,l,s){for(var u=null,c=null,d=i,h=i=0,g=null;null!==d&&h<l.length;h++){d.index>h?(g=d,d=null):g=d.sibling;var b=p(a,d,l[h],s);if(null===b){null===d&&(d=g);break}e&&d&&null===b.alternate&&t(a,d),i=o(b,i,h),null===c?u=b:c.sibling=b,c=b,d=g}if(h===l.length)return n(a,d),u;if(null===d){for(;h<l.length;h++)null!==(d=f(a,l[h],s))&&(i=o(d,i,h),null===c?u=d:c.sibling=d,c=d);return u}for(d=r(a,d);h<l.length;h++)null!==(g=m(d,a,h,l[h],s))&&(e&&null!==g.alternate&&d.delete(null===g.key?h:g.key),i=o(g,i,h),null===c?u=g:c.sibling=g,c=g);return e&&d.forEach((function(e){return t(a,e)})),u}function g(a,l,s,u){var c=j(s);if("function"!=typeof c)throw Error(i(150));if(null==(s=c.call(s)))throw Error(i(151));for(var d=c=null,h=l,g=l=0,b=null,v=s.next();null!==h&&!v.done;g++,v=s.next()){h.index>g?(b=h,h=null):b=h.sibling;var y=p(a,h,v.value,u);if(null===y){null===h&&(h=b);break}e&&h&&null===y.alternate&&t(a,h),l=o(y,l,g),null===d?c=y:d.sibling=y,d=y,h=b}if(v.done)return n(a,h),c;if(null===h){for(;!v.done;g++,v=s.next())null!==(v=f(a,v.value,u))&&(l=o(v,l,g),null===d?c=v:d.sibling=v,d=v);return c}for(h=r(a,h);!v.done;g++,v=s.next())null!==(v=m(h,a,g,v.value,u))&&(e&&null!==v.alternate&&h.delete(null===v.key?g:v.key),l=o(v,l,g),null===d?c=v:d.sibling=v,d=v);return e&&h.forEach((function(e){return t(a,e)})),c}return function(e,r,o,s){var u="object"==typeof o&&null!==o&&o.type===x&&null===o.key;u&&(o=o.props.children);var c="object"==typeof o&&null!==o;if(c)switch(o.$$typeof){case k:e:{for(c=o.key,u=r;null!==u;){if(u.key===c){if(7===u.tag){if(o.type===x){n(e,u.sibling),(r=a(u,o.props.children)).return=e,e=r;break e}}else if(u.elementType===o.type){n(e,u.sibling),(r=a(u,o.props)).ref=So(e,u,o),r.return=e,e=r;break e}n(e,u);break}t(e,u),u=u.sibling}o.type===x?((r=Ks(o.props.children,e.mode,s,o.key)).return=e,e=r):((s=qs(o.type,o.key,o.props,null,e.mode,s)).ref=So(e,r,o),s.return=e,e=s)}return l(e);case S:e:{for(u=o.key;null!==r;){if(r.key===u){if(4===r.tag&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),(r=a(r,o.children||[])).return=e,e=r;break e}n(e,r);break}t(e,r),r=r.sibling}(r=Xs(o,e.mode,s)).return=e,e=r}return l(e)}if("string"==typeof o||"number"==typeof o)return o=""+o,null!==r&&6===r.tag?(n(e,r.sibling),(r=a(r,o)).return=e,e=r):(n(e,r),(r=Qs(o,e.mode,s)).return=e,e=r),l(e);if(ko(o))return h(e,r,o,s);if(j(o))return g(e,r,o,s);if(c&&xo(e,o),void 0===o&&!u)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(i(152,q(e.type)||"Component"))}return n(e,r)}}var Ao=_o(!0),Co=_o(!1),To={},Oo=sa(To),Lo=sa(To),No=sa(To);function Po(e){if(e===To)throw Error(i(174));return e}function Ro(e,t){switch(ca(No,t),ca(Lo,e),ca(Oo,To),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:pe(null,"");break;default:t=pe(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}ua(Oo),ca(Oo,t)}function Io(){ua(Oo),ua(Lo),ua(No)}function Mo(e){Po(No.current);var t=Po(Oo.current),n=pe(t,e.type);t!==n&&(ca(Lo,e),ca(Oo,n))}function Do(e){Lo.current===e&&(ua(Oo),ua(Lo))}var Bo=sa(0);function Fo(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(64&t.flags)return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var $o=null,zo=null,Uo=!1;function jo(e,t){var n=Vs(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.flags=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function Ho(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,!0);default:return!1}}function Vo(e){if(Uo){var t=zo;if(t){var n=t;if(!Ho(e,t)){if(!(t=qr(n.nextSibling))||!Ho(e,t))return e.flags=-1025&e.flags|2,Uo=!1,void($o=e);jo($o,n)}$o=e,zo=qr(t.firstChild)}else e.flags=-1025&e.flags|2,Uo=!1,$o=e}}function Go(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;$o=e}function Wo(e){if(e!==$o)return!1;if(!Uo)return Go(e),Uo=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!Hr(t,e.memoizedProps))for(t=zo;t;)jo(e,t),t=qr(t.nextSibling);if(Go(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(i(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){zo=qr(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}zo=null}}else zo=$o?qr(e.stateNode.nextSibling):null;return!0}function qo(){zo=$o=null,Uo=!1}var Ko=[];function Yo(){for(var e=0;e<Ko.length;e++)Ko[e]._workInProgressVersionPrimary=null;Ko.length=0}var Qo=E.ReactCurrentDispatcher,Xo=E.ReactCurrentBatchConfig,Zo=0,Jo=null,ei=null,ti=null,ni=!1,ri=!1;function ai(){throw Error(i(321))}function oi(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!ur(e[n],t[n]))return!1;return!0}function ii(e,t,n,r,a,o){if(Zo=o,Jo=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Qo.current=null===e||null===e.memoizedState?Pi:Ri,e=n(r,a),ri){o=0;do{if(ri=!1,!(25>o))throw Error(i(301));o+=1,ti=ei=null,t.updateQueue=null,Qo.current=Ii,e=n(r,a)}while(ri)}if(Qo.current=Ni,t=null!==ei&&null!==ei.next,Zo=0,ti=ei=Jo=null,ni=!1,t)throw Error(i(300));return e}function li(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ti?Jo.memoizedState=ti=e:ti=ti.next=e,ti}function si(){if(null===ei){var e=Jo.alternate;e=null!==e?e.memoizedState:null}else e=ei.next;var t=null===ti?Jo.memoizedState:ti.next;if(null!==t)ti=t,ei=e;else{if(null===e)throw Error(i(310));e={memoizedState:(ei=e).memoizedState,baseState:ei.baseState,baseQueue:ei.baseQueue,queue:ei.queue,next:null},null===ti?Jo.memoizedState=ti=e:ti=ti.next=e}return ti}function ui(e,t){return"function"==typeof t?t(e):t}function ci(e){var t=si(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=ei,a=r.baseQueue,o=n.pending;if(null!==o){if(null!==a){var l=a.next;a.next=o.next,o.next=l}r.baseQueue=a=o,n.pending=null}if(null!==a){a=a.next,r=r.baseState;var s=l=o=null,u=a;do{var c=u.lane;if((Zo&c)===c)null!==s&&(s=s.next={lane:0,action:u.action,eagerReducer:u.eagerReducer,eagerState:u.eagerState,next:null}),r=u.eagerReducer===e?u.eagerState:e(r,u.action);else{var d={lane:c,action:u.action,eagerReducer:u.eagerReducer,eagerState:u.eagerState,next:null};null===s?(l=s=d,o=r):s=s.next=d,Jo.lanes|=c,Ul|=c}u=u.next}while(null!==u&&u!==a);null===s?o=r:s.next=l,ur(r,t.memoizedState)||(Di=!0),t.memoizedState=r,t.baseState=o,t.baseQueue=s,n.lastRenderedState=r}return[t.memoizedState,n.dispatch]}function di(e){var t=si(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=n.dispatch,a=n.pending,o=t.memoizedState;if(null!==a){n.pending=null;var l=a=a.next;do{o=e(o,l.action),l=l.next}while(l!==a);ur(o,t.memoizedState)||(Di=!0),t.memoizedState=o,null===t.baseQueue&&(t.baseState=o),n.lastRenderedState=o}return[o,r]}function fi(e,t,n){var r=t._getVersion;r=r(t._source);var a=t._workInProgressVersionPrimary;if(null!==a?e=a===r:(e=e.mutableReadLanes,(e=(Zo&e)===e)&&(t._workInProgressVersionPrimary=r,Ko.push(t))),e)return n(t._source);throw Ko.push(t),Error(i(350))}function pi(e,t,n,r){var a=Rl;if(null===a)throw Error(i(349));var o=t._getVersion,l=o(t._source),s=Qo.current,u=s.useState((function(){return fi(a,t,n)})),c=u[1],d=u[0];u=ti;var f=e.memoizedState,p=f.refs,m=p.getSnapshot,h=f.source;f=f.subscribe;var g=Jo;return e.memoizedState={refs:p,source:t,subscribe:r},s.useEffect((function(){p.getSnapshot=n,p.setSnapshot=c;var e=o(t._source);if(!ur(l,e)){e=n(t._source),ur(d,e)||(c(e),e=ps(g),a.mutableReadLanes|=e&a.pendingLanes),e=a.mutableReadLanes,a.entangledLanes|=e;for(var r=a.entanglements,i=e;0<i;){var s=31-Ht(i),u=1<<s;r[s]|=e,i&=~u}}}),[n,t,r]),s.useEffect((function(){return r(t._source,(function(){var e=p.getSnapshot,n=p.setSnapshot;try{n(e(t._source));var r=ps(g);a.mutableReadLanes|=r&a.pendingLanes}catch(o){n((function(){throw o}))}}))}),[t,r]),ur(m,n)&&ur(h,t)&&ur(f,r)||((e={pending:null,dispatch:null,lastRenderedReducer:ui,lastRenderedState:d}).dispatch=c=Li.bind(null,Jo,e),u.queue=e,u.baseQueue=null,d=fi(a,t,n),u.memoizedState=u.baseState=d),d}function mi(e,t,n){return pi(si(),e,t,n)}function hi(e){var t=li();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:ui,lastRenderedState:e}).dispatch=Li.bind(null,Jo,e),[t.memoizedState,e]}function gi(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=Jo.updateQueue)?(t={lastEffect:null},Jo.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function bi(e){return e={current:e},li().memoizedState=e}function vi(){return si().memoizedState}function yi(e,t,n,r){var a=li();Jo.flags|=e,a.memoizedState=gi(1|t,n,void 0,void 0===r?null:r)}function wi(e,t,n,r){var a=si();r=void 0===r?null:r;var o=void 0;if(null!==ei){var i=ei.memoizedState;if(o=i.destroy,null!==r&&oi(r,i.deps))return void gi(t,n,o,r)}Jo.flags|=e,a.memoizedState=gi(1|t,n,o,r)}function Ei(e,t){return yi(516,4,e,t)}function ki(e,t){return wi(516,4,e,t)}function Si(e,t){return wi(4,2,e,t)}function xi(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function _i(e,t,n){return n=null!=n?n.concat([e]):null,wi(4,2,xi.bind(null,t,e),n)}function Ai(){}function Ci(e,t){var n=si();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&oi(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Ti(e,t){var n=si();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&oi(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Oi(e,t){var n=Ha();Ga(98>n?98:n,(function(){e(!0)})),Ga(97<n?97:n,(function(){var n=Xo.transition;Xo.transition=1;try{e(!1),t()}finally{Xo.transition=n}}))}function Li(e,t,n){var r=fs(),a=ps(e),o={lane:a,action:n,eagerReducer:null,eagerState:null,next:null},i=t.pending;if(null===i?o.next=o:(o.next=i.next,i.next=o),t.pending=o,i=e.alternate,e===Jo||null!==i&&i===Jo)ri=ni=!0;else{if(0===e.lanes&&(null===i||0===i.lanes)&&null!==(i=t.lastRenderedReducer))try{var l=t.lastRenderedState,s=i(l,n);if(o.eagerReducer=i,o.eagerState=s,ur(s,l))return}catch(u){}ms(e,a,r)}}var Ni={readContext:oo,useCallback:ai,useContext:ai,useEffect:ai,useImperativeHandle:ai,useLayoutEffect:ai,useMemo:ai,useReducer:ai,useRef:ai,useState:ai,useDebugValue:ai,useDeferredValue:ai,useTransition:ai,useMutableSource:ai,useOpaqueIdentifier:ai,unstable_isNewReconciler:!1},Pi={readContext:oo,useCallback:function(e,t){return li().memoizedState=[e,void 0===t?null:t],e},useContext:oo,useEffect:Ei,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,yi(4,2,xi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return yi(4,2,e,t)},useMemo:function(e,t){var n=li();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=li();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e=(e=r.queue={pending:null,dispatch:null,lastRenderedReducer:e,lastRenderedState:t}).dispatch=Li.bind(null,Jo,e),[r.memoizedState,e]},useRef:bi,useState:hi,useDebugValue:Ai,useDeferredValue:function(e){var t=hi(e),n=t[0],r=t[1];return Ei((function(){var t=Xo.transition;Xo.transition=1;try{r(e)}finally{Xo.transition=t}}),[e]),n},useTransition:function(){var e=hi(!1),t=e[0];return bi(e=Oi.bind(null,e[1])),[e,t]},useMutableSource:function(e,t,n){var r=li();return r.memoizedState={refs:{getSnapshot:t,setSnapshot:null},source:e,subscribe:n},pi(r,e,t,n)},useOpaqueIdentifier:function(){if(Uo){var e=!1,t=function(e){return{$$typeof:M,toString:e,valueOf:e}}((function(){throw e||(e=!0,n("r:"+(Yr++).toString(36))),Error(i(355))})),n=hi(t)[1];return!(2&Jo.mode)&&(Jo.flags|=516,gi(5,(function(){n("r:"+(Yr++).toString(36))}),void 0,null)),t}return hi(t="r:"+(Yr++).toString(36)),t},unstable_isNewReconciler:!1},Ri={readContext:oo,useCallback:Ci,useContext:oo,useEffect:ki,useImperativeHandle:_i,useLayoutEffect:Si,useMemo:Ti,useReducer:ci,useRef:vi,useState:function(){return ci(ui)},useDebugValue:Ai,useDeferredValue:function(e){var t=ci(ui),n=t[0],r=t[1];return ki((function(){var t=Xo.transition;Xo.transition=1;try{r(e)}finally{Xo.transition=t}}),[e]),n},useTransition:function(){var e=ci(ui)[0];return[vi().current,e]},useMutableSource:mi,useOpaqueIdentifier:function(){return ci(ui)[0]},unstable_isNewReconciler:!1},Ii={readContext:oo,useCallback:Ci,useContext:oo,useEffect:ki,useImperativeHandle:_i,useLayoutEffect:Si,useMemo:Ti,useReducer:di,useRef:vi,useState:function(){return di(ui)},useDebugValue:Ai,useDeferredValue:function(e){var t=di(ui),n=t[0],r=t[1];return ki((function(){var t=Xo.transition;Xo.transition=1;try{r(e)}finally{Xo.transition=t}}),[e]),n},useTransition:function(){var e=di(ui)[0];return[vi().current,e]},useMutableSource:mi,useOpaqueIdentifier:function(){return di(ui)[0]},unstable_isNewReconciler:!1},Mi=E.ReactCurrentOwner,Di=!1;function Bi(e,t,n,r){t.child=null===e?Co(t,null,n,r):Ao(t,e.child,n,r)}function Fi(e,t,n,r,a){n=n.render;var o=t.ref;return ao(t,a),r=ii(e,t,n,r,o,a),null===e||Di?(t.flags|=1,Bi(e,t,r,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~a,ol(e,t,a))}function $i(e,t,n,r,a,o){if(null===e){var i=n.type;return"function"!=typeof i||Gs(i)||void 0!==i.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=qs(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=i,zi(e,t,i,r,a,o))}return i=e.child,a&o||(a=i.memoizedProps,!(n=null!==(n=n.compare)?n:dr)(a,r)||e.ref!==t.ref)?(t.flags|=1,(e=Ws(i,r)).ref=t.ref,e.return=t,t.child=e):ol(e,t,o)}function zi(e,t,n,r,a,o){if(null!==e&&dr(e.memoizedProps,r)&&e.ref===t.ref){if(Di=!1,!(o&a))return t.lanes=e.lanes,ol(e,t,o);16384&e.flags&&(Di=!0)}return Hi(e,t,n,r,o)}function Ui(e,t,n){var r=t.pendingProps,a=r.children,o=null!==e?e.memoizedState:null;if("hidden"===r.mode||"unstable-defer-without-hiding"===r.mode)if(4&t.mode){if(!(1073741824&n))return e=null!==o?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e},ks(t,e),null;t.memoizedState={baseLanes:0},ks(t,null!==o?o.baseLanes:n)}else t.memoizedState={baseLanes:0},ks(t,n);else null!==o?(r=o.baseLanes|n,t.memoizedState=null):r=n,ks(t,r);return Bi(e,t,a,n),t.child}function ji(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=128)}function Hi(e,t,n,r,a){var o=ga(n)?ma:fa.current;return o=ha(t,o),ao(t,a),n=ii(e,t,n,r,o,a),null===e||Di?(t.flags|=1,Bi(e,t,n,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~a,ol(e,t,a))}function Vi(e,t,n,r,a){if(ga(n)){var o=!0;wa(t)}else o=!1;if(ao(t,a),null===t.stateNode)null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),yo(t,n,r),Eo(t,n,r,a),r=!0;else if(null===e){var i=t.stateNode,l=t.memoizedProps;i.props=l;var s=i.context,u=n.contextType;"object"==typeof u&&null!==u?u=oo(u):u=ha(t,u=ga(n)?ma:fa.current);var c=n.getDerivedStateFromProps,d="function"==typeof c||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==r||s!==u)&&wo(t,i,r,u),io=!1;var f=t.memoizedState;i.state=f,po(t,r,i,a),s=t.memoizedState,l!==r||f!==s||pa.current||io?("function"==typeof c&&(go(t,n,c,r),s=t.memoizedState),(l=io||vo(t,n,l,r,f,s,u))?(d||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.flags|=4)):("function"==typeof i.componentDidMount&&(t.flags|=4),t.memoizedProps=r,t.memoizedState=s),i.props=r,i.state=s,i.context=u,r=l):("function"==typeof i.componentDidMount&&(t.flags|=4),r=!1)}else{i=t.stateNode,so(e,t),l=t.memoizedProps,u=t.type===t.elementType?l:Qa(t.type,l),i.props=u,d=t.pendingProps,f=i.context,"object"==typeof(s=n.contextType)&&null!==s?s=oo(s):s=ha(t,s=ga(n)?ma:fa.current);var p=n.getDerivedStateFromProps;(c="function"==typeof p||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==d||f!==s)&&wo(t,i,r,s),io=!1,f=t.memoizedState,i.state=f,po(t,r,i,a);var m=t.memoizedState;l!==d||f!==m||pa.current||io?("function"==typeof p&&(go(t,n,p,r),m=t.memoizedState),(u=io||vo(t,n,u,r,f,m,s))?(c||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,m,s),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,m,s)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=256)):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),t.memoizedProps=r,t.memoizedState=m),i.props=r,i.state=m,i.context=s,r=u):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),r=!1)}return Gi(e,t,n,r,o,a)}function Gi(e,t,n,r,a,o){ji(e,t);var i=!!(64&t.flags);if(!r&&!i)return a&&Ea(t,n,!1),ol(e,t,o);r=t.stateNode,Mi.current=t;var l=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=Ao(t,e.child,null,o),t.child=Ao(t,null,l,o)):Bi(e,t,l,o),t.memoizedState=r.state,a&&Ea(t,n,!0),t.child}function Wi(e){var t=e.stateNode;t.pendingContext?va(0,t.pendingContext,t.pendingContext!==t.context):t.context&&va(0,t.context,!1),Ro(e,t.containerInfo)}var qi,Ki,Yi,Qi,Xi={dehydrated:null,retryLane:0};function Zi(e,t,n){var r,a=t.pendingProps,o=Bo.current,i=!1;return(r=!!(64&t.flags))||(r=(null===e||null!==e.memoizedState)&&!!(2&o)),r?(i=!0,t.flags&=-65):null!==e&&null===e.memoizedState||void 0===a.fallback||!0===a.unstable_avoidThisFallback||(o|=1),ca(Bo,1&o),null===e?(void 0!==a.fallback&&Vo(t),e=a.children,o=a.fallback,i?(e=Ji(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xi,e):"number"==typeof a.unstable_expectedLoadTime?(e=Ji(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xi,t.lanes=33554432,e):((n=Ys({mode:"visible",children:e},t.mode,n,null)).return=t,t.child=n)):(e.memoizedState,i?(a=tl(e,t,a.children,a.fallback,n),i=t.child,o=e.child.memoizedState,i.memoizedState=null===o?{baseLanes:n}:{baseLanes:o.baseLanes|n},i.childLanes=e.childLanes&~n,t.memoizedState=Xi,a):(n=el(e,t,a.children,n),t.memoizedState=null,n))}function Ji(e,t,n,r){var a=e.mode,o=e.child;return t={mode:"hidden",children:t},2&a||null===o?o=Ys(t,a,0,null):(o.childLanes=0,o.pendingProps=t),n=Ks(n,a,r,null),o.return=e,n.return=e,o.sibling=n,e.child=o,n}function el(e,t,n,r){var a=e.child;return e=a.sibling,n=Ws(a,{mode:"visible",children:n}),!(2&t.mode)&&(n.lanes=r),n.return=t,n.sibling=null,null!==e&&(e.nextEffect=null,e.flags=8,t.firstEffect=t.lastEffect=e),t.child=n}function tl(e,t,n,r,a){var o=t.mode,i=e.child;e=i.sibling;var l={mode:"hidden",children:n};return 2&o||t.child===i?n=Ws(i,l):((n=t.child).childLanes=0,n.pendingProps=l,null!==(i=n.lastEffect)?(t.firstEffect=n.firstEffect,t.lastEffect=i,i.nextEffect=null):t.firstEffect=t.lastEffect=null),null!==e?r=Ws(e,r):(r=Ks(r,o,a,null)).flags|=2,r.return=t,n.return=t,n.sibling=r,t.child=n,r}function nl(e,t){e.lanes|=t;var n=e.alternate;null!==n&&(n.lanes|=t),ro(e.return,t)}function rl(e,t,n,r,a,o){var i=e.memoizedState;null===i?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:a,lastEffect:o}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=r,i.tail=n,i.tailMode=a,i.lastEffect=o)}function al(e,t,n){var r=t.pendingProps,a=r.revealOrder,o=r.tail;if(Bi(e,t,r.children,n),2&(r=Bo.current))r=1&r|2,t.flags|=64;else{if(null!==e&&64&e.flags)e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&nl(e,n);else if(19===e.tag)nl(e,n);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(ca(Bo,r),2&t.mode)switch(a){case"forwards":for(n=t.child,a=null;null!==n;)null!==(e=n.alternate)&&null===Fo(e)&&(a=n),n=n.sibling;null===(n=a)?(a=t.child,t.child=null):(a=n.sibling,n.sibling=null),rl(t,!1,a,n,o,t.lastEffect);break;case"backwards":for(n=null,a=t.child,t.child=null;null!==a;){if(null!==(e=a.alternate)&&null===Fo(e)){t.child=a;break}e=a.sibling,a.sibling=n,n=a,a=e}rl(t,!0,n,null,o,t.lastEffect);break;case"together":rl(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}else t.memoizedState=null;return t.child}function ol(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Ul|=t.lanes,n&t.childLanes){if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Ws(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Ws(e,e.pendingProps)).return=t;n.sibling=null}return t.child}return null}function il(e,t){if(!Uo)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function ll(e,t,n){var r=t.pendingProps;switch(t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:case 17:return ga(t.type)&&ba(),null;case 3:return Io(),ua(pa),ua(fa),Yo(),(r=t.stateNode).pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(Wo(t)?t.flags|=4:r.hydrate||(t.flags|=256)),Ki(t),null;case 5:Do(t);var o=Po(No.current);if(n=t.type,null!==e&&null!=t.stateNode)Yi(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=128);else{if(!r){if(null===t.stateNode)throw Error(i(166));return null}if(e=Po(Oo.current),Wo(t)){r=t.stateNode,n=t.type;var l=t.memoizedProps;switch(r[Xr]=t,r[Zr]=l,n){case"dialog":Or("cancel",r),Or("close",r);break;case"iframe":case"object":case"embed":Or("load",r);break;case"video":case"audio":for(e=0;e<_r.length;e++)Or(_r[e],r);break;case"source":Or("error",r);break;case"img":case"image":case"link":Or("error",r),Or("load",r);break;case"details":Or("toggle",r);break;case"input":ee(r,l),Or("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!l.multiple},Or("invalid",r);break;case"textarea":se(r,l),Or("invalid",r)}for(var u in Se(n,l),e=null,l)l.hasOwnProperty(u)&&(o=l[u],"children"===u?"string"==typeof o?r.textContent!==o&&(e=["children",o]):"number"==typeof o&&r.textContent!==""+o&&(e=["children",""+o]):s.hasOwnProperty(u)&&null!=o&&"onScroll"===u&&Or("scroll",r));switch(n){case"input":Q(r),re(r,l,!0);break;case"textarea":Q(r),ce(r);break;case"select":case"option":break;default:"function"==typeof l.onClick&&(r.onclick=$r)}r=e,t.updateQueue=r,null!==r&&(t.flags|=4)}else{switch(u=9===o.nodeType?o:o.ownerDocument,e===de.html&&(e=fe(n)),e===de.html?"script"===n?((e=u.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=u.createElement(n,{is:r.is}):(e=u.createElement(n),"select"===n&&(u=e,r.multiple?u.multiple=!0:r.size&&(u.size=r.size))):e=u.createElementNS(e,n),e[Xr]=t,e[Zr]=r,qi(e,t,!1,!1),t.stateNode=e,u=xe(n,r),n){case"dialog":Or("cancel",e),Or("close",e),o=r;break;case"iframe":case"object":case"embed":Or("load",e),o=r;break;case"video":case"audio":for(o=0;o<_r.length;o++)Or(_r[o],e);o=r;break;case"source":Or("error",e),o=r;break;case"img":case"image":case"link":Or("error",e),Or("load",e),o=r;break;case"details":Or("toggle",e),o=r;break;case"input":ee(e,r),o=J(e,r),Or("invalid",e);break;case"option":o=oe(e,r);break;case"select":e._wrapperState={wasMultiple:!!r.multiple},o=a({},r,{value:void 0}),Or("invalid",e);break;case"textarea":se(e,r),o=le(e,r),Or("invalid",e);break;default:o=r}Se(n,o);var c=o;for(l in c)if(c.hasOwnProperty(l)){var d=c[l];"style"===l?Ee(e,d):"dangerouslySetInnerHTML"===l?null!=(d=d?d.__html:void 0)&&ge(e,d):"children"===l?"string"==typeof d?("textarea"!==n||""!==d)&&be(e,d):"number"==typeof d&&be(e,""+d):"suppressContentEditableWarning"!==l&&"suppressHydrationWarning"!==l&&"autoFocus"!==l&&(s.hasOwnProperty(l)?null!=d&&"onScroll"===l&&Or("scroll",e):null!=d&&w(e,l,d,u))}switch(n){case"input":Q(e),re(e,r,!1);break;case"textarea":Q(e),ce(e);break;case"option":null!=r.value&&e.setAttribute("value",""+K(r.value));break;case"select":e.multiple=!!r.multiple,null!=(l=r.value)?ie(e,!!r.multiple,l,!1):null!=r.defaultValue&&ie(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=$r)}jr(n,r)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Qi(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(i(166));n=Po(No.current),Po(Oo.current),Wo(t)?(r=t.stateNode,n=t.memoizedProps,r[Xr]=t,r.nodeValue!==n&&(t.flags|=4)):((r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[Xr]=t,t.stateNode=r)}return null;case 13:return ua(Bo),r=t.memoizedState,64&t.flags?(t.lanes=n,t):(r=null!==r,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Wo(t):n=null!==e.memoizedState,r&&!n&&2&t.mode&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||1&Bo.current?0===Fl&&(Fl=3):(0!==Fl&&3!==Fl||(Fl=4),null===Rl||!(134217727&Ul)&&!(134217727&jl)||vs(Rl,Ml))),(r||n)&&(t.flags|=4),null);case 4:return Io(),Ki(t),null===e&&Nr(t.stateNode.containerInfo),null;case 10:return no(t),null;case 19:if(ua(Bo),null===(r=t.memoizedState))return null;if(l=!!(64&t.flags),null===(u=r.rendering))if(l)il(r,!1);else{if(0!==Fl||null!==e&&64&e.flags)for(e=t.child;null!==e;){if(null!==(u=Fo(e))){for(t.flags|=64,il(r,!1),null!==(l=u.updateQueue)&&(t.updateQueue=l,t.flags|=4),null===r.lastEffect&&(t.firstEffect=null),t.lastEffect=r.lastEffect,r=n,n=t.child;null!==n;)e=r,(l=n).flags&=2,l.nextEffect=null,l.firstEffect=null,l.lastEffect=null,null===(u=l.alternate)?(l.childLanes=0,l.lanes=e,l.child=null,l.memoizedProps=null,l.memoizedState=null,l.updateQueue=null,l.dependencies=null,l.stateNode=null):(l.childLanes=u.childLanes,l.lanes=u.lanes,l.child=u.child,l.memoizedProps=u.memoizedProps,l.memoizedState=u.memoizedState,l.updateQueue=u.updateQueue,l.type=u.type,e=u.dependencies,l.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return ca(Bo,1&Bo.current|2),t.child}e=e.sibling}null!==r.tail&&ja()>Wl&&(t.flags|=64,l=!0,il(r,!1),t.lanes=33554432)}else{if(!l)if(null!==(e=Fo(u))){if(t.flags|=64,l=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),il(r,!0),null===r.tail&&"hidden"===r.tailMode&&!u.alternate&&!Uo)return null!==(t=t.lastEffect=r.lastEffect)&&(t.nextEffect=null),null}else 2*ja()-r.renderingStartTime>Wl&&1073741824!==n&&(t.flags|=64,l=!0,il(r,!1),t.lanes=33554432);r.isBackwards?(u.sibling=t.child,t.child=u):(null!==(n=r.last)?n.sibling=u:t.child=u,r.last=u)}return null!==r.tail?(n=r.tail,r.rendering=n,r.tail=n.sibling,r.lastEffect=t.lastEffect,r.renderingStartTime=ja(),n.sibling=null,t=Bo.current,ca(Bo,l?1&t|2:1&t),n):null;case 23:case 24:return Ss(),null!==e&&null!==e.memoizedState!=(null!==t.memoizedState)&&"unstable-defer-without-hiding"!==r.mode&&(t.flags|=4),null}throw Error(i(156,t.tag))}function sl(e){switch(e.tag){case 1:ga(e.type)&&ba();var t=e.flags;return 4096&t?(e.flags=-4097&t|64,e):null;case 3:if(Io(),ua(pa),ua(fa),Yo(),64&(t=e.flags))throw Error(i(285));return e.flags=-4097&t|64,e;case 5:return Do(e),null;case 13:return ua(Bo),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return ua(Bo),null;case 4:return Io(),null;case 10:return no(e),null;case 23:case 24:return Ss(),null;default:return null}}function ul(e,t){try{var n="",r=t;do{n+=W(r),r=r.return}while(r);var a=n}catch(o){a="\nError generating stack: "+o.message+"\n"+o.stack}return{value:e,source:t,stack:a}}function cl(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}qi=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Ki=function(){},Yi=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,Po(Oo.current);var i,l=null;switch(n){case"input":o=J(e,o),r=J(e,r),l=[];break;case"option":o=oe(e,o),r=oe(e,r),l=[];break;case"select":o=a({},o,{value:void 0}),r=a({},r,{value:void 0}),l=[];break;case"textarea":o=le(e,o),r=le(e,r),l=[];break;default:"function"!=typeof o.onClick&&"function"==typeof r.onClick&&(e.onclick=$r)}for(d in Se(n,r),n=null,o)if(!r.hasOwnProperty(d)&&o.hasOwnProperty(d)&&null!=o[d])if("style"===d){var u=o[d];for(i in u)u.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else"dangerouslySetInnerHTML"!==d&&"children"!==d&&"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&"autoFocus"!==d&&(s.hasOwnProperty(d)?l||(l=[]):(l=l||[]).push(d,null));for(d in r){var c=r[d];if(u=null!=o?o[d]:void 0,r.hasOwnProperty(d)&&c!==u&&(null!=c||null!=u))if("style"===d)if(u){for(i in u)!u.hasOwnProperty(i)||c&&c.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in c)c.hasOwnProperty(i)&&u[i]!==c[i]&&(n||(n={}),n[i]=c[i])}else n||(l||(l=[]),l.push(d,n)),n=c;else"dangerouslySetInnerHTML"===d?(c=c?c.__html:void 0,u=u?u.__html:void 0,null!=c&&u!==c&&(l=l||[]).push(d,c)):"children"===d?"string"!=typeof c&&"number"!=typeof c||(l=l||[]).push(d,""+c):"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&(s.hasOwnProperty(d)?(null!=c&&"onScroll"===d&&Or("scroll",e),l||u===c||(l=[])):"object"==typeof c&&null!==c&&c.$$typeof===M?c.toString():(l=l||[]).push(d,c))}n&&(l=l||[]).push("style",n);var d=l;(t.updateQueue=d)&&(t.flags|=4)}},Qi=function(e,t,n,r){n!==r&&(t.flags|=4)};var dl="function"==typeof WeakMap?WeakMap:Map;function fl(e,t,n){(n=uo(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Ql||(Ql=!0,Xl=r),cl(0,t)},n}function pl(e,t,n){(n=uo(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var a=t.value;n.payload=function(){return cl(0,t),r(a)}}var o=e.stateNode;return null!==o&&"function"==typeof o.componentDidCatch&&(n.callback=function(){"function"!=typeof r&&(null===Zl?Zl=new Set([this]):Zl.add(this),cl(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var ml="function"==typeof WeakSet?WeakSet:Set;function hl(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(n){zs(e,n)}else t.current=null}function gl(e,t){switch(t.tag){case 0:case 11:case 15:case 22:case 5:case 6:case 4:case 17:return;case 1:if(256&t.flags&&null!==e){var n=e.memoizedProps,r=e.memoizedState;t=(e=t.stateNode).getSnapshotBeforeUpdate(t.elementType===t.type?n:Qa(t.type,n),r),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Wr(t.stateNode.containerInfo))}throw Error(i(163))}function bl(e,t,n){switch(n.tag){case 0:case 11:case 15:case 22:if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{if(!(3&~e.tag)){var r=e.create;e.destroy=r()}e=e.next}while(e!==t)}if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{var a=e;r=a.next,4&(a=a.tag)&&1&a&&(Bs(n,e),Ds(n,e)),e=r}while(e!==t)}return;case 1:return e=n.stateNode,4&n.flags&&(null===t?e.componentDidMount():(r=n.elementType===n.type?t.memoizedProps:Qa(n.type,t.memoizedProps),e.componentDidUpdate(r,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&mo(n,t,e));case 3:if(null!==(t=n.updateQueue)){if(e=null,null!==n.child)switch(n.child.tag){case 5:case 1:e=n.child.stateNode}mo(n,t,e)}return;case 5:return e=n.stateNode,void(null===t&&4&n.flags&&jr(n.type,n.memoizedProps)&&e.focus());case 6:case 4:case 12:case 19:case 17:case 20:case 21:case 23:case 24:return;case 13:return void(null===n.memoizedState&&(n=n.alternate,null!==n&&(n=n.memoizedState,null!==n&&(n=n.dehydrated,null!==n&&Et(n)))))}throw Error(i(163))}function vl(e,t){for(var n=e;;){if(5===n.tag){var r=n.stateNode;if(t)"function"==typeof(r=r.style).setProperty?r.setProperty("display","none","important"):r.display="none";else{r=n.stateNode;var a=n.memoizedProps.style;a=null!=a&&a.hasOwnProperty("display")?a.display:null,r.style.display=we("display",a)}}else if(6===n.tag)n.stateNode.nodeValue=t?"":n.memoizedProps;else if((23!==n.tag&&24!==n.tag||null===n.memoizedState||n===e)&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===e)break;for(;null===n.sibling;){if(null===n.return||n.return===e)return;n=n.return}n.sibling.return=n.return,n=n.sibling}}function yl(e,t){if(Sa&&"function"==typeof Sa.onCommitFiberUnmount)try{Sa.onCommitFiberUnmount(ka,t)}catch(o){}switch(t.tag){case 0:case 11:case 14:case 15:case 22:if(null!==(e=t.updateQueue)&&null!==(e=e.lastEffect)){var n=e=e.next;do{var r=n,a=r.destroy;if(r=r.tag,void 0!==a)if(4&r)Bs(t,n);else{r=t;try{a()}catch(o){zs(r,o)}}n=n.next}while(n!==e)}break;case 1:if(hl(t),"function"==typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(o){zs(t,o)}break;case 5:hl(t);break;case 4:_l(e,t)}}function wl(e){e.alternate=null,e.child=null,e.dependencies=null,e.firstEffect=null,e.lastEffect=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.return=null,e.updateQueue=null}function El(e){return 5===e.tag||3===e.tag||4===e.tag}function kl(e){e:{for(var t=e.return;null!==t;){if(El(t))break e;t=t.return}throw Error(i(160))}var n=t;switch(t=n.stateNode,n.tag){case 5:var r=!1;break;case 3:case 4:t=t.containerInfo,r=!0;break;default:throw Error(i(161))}16&n.flags&&(be(t,""),n.flags&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||El(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag&&18!==n.tag;){if(2&n.flags)continue t;if(null===n.child||4===n.tag)continue t;n.child.return=n,n=n.child}if(!(2&n.flags)){n=n.stateNode;break e}}r?Sl(e,n,t):xl(e,n,t)}function Sl(e,t,n){var r=e.tag,a=5===r||6===r;if(a)e=a?e.stateNode:e.stateNode.instance,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=$r));else if(4!==r&&null!==(e=e.child))for(Sl(e,t,n),e=e.sibling;null!==e;)Sl(e,t,n),e=e.sibling}function xl(e,t,n){var r=e.tag,a=5===r||6===r;if(a)e=a?e.stateNode:e.stateNode.instance,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(xl(e,t,n),e=e.sibling;null!==e;)xl(e,t,n),e=e.sibling}function _l(e,t){for(var n,r,a=t,o=!1;;){if(!o){o=a.return;e:for(;;){if(null===o)throw Error(i(160));switch(n=o.stateNode,o.tag){case 5:r=!1;break e;case 3:case 4:n=n.containerInfo,r=!0;break e}o=o.return}o=!0}if(5===a.tag||6===a.tag){e:for(var l=e,s=a,u=s;;)if(yl(l,u),null!==u.child&&4!==u.tag)u.child.return=u,u=u.child;else{if(u===s)break e;for(;null===u.sibling;){if(null===u.return||u.return===s)break e;u=u.return}u.sibling.return=u.return,u=u.sibling}r?(l=n,s=a.stateNode,8===l.nodeType?l.parentNode.removeChild(s):l.removeChild(s)):n.removeChild(a.stateNode)}else if(4===a.tag){if(null!==a.child){n=a.stateNode.containerInfo,r=!0,a.child.return=a,a=a.child;continue}}else if(yl(e,a),null!==a.child){a.child.return=a,a=a.child;continue}if(a===t)break;for(;null===a.sibling;){if(null===a.return||a.return===t)return;4===(a=a.return).tag&&(o=!1)}a.sibling.return=a.return,a=a.sibling}}function Al(e,t){switch(t.tag){case 0:case 11:case 14:case 15:case 22:var n=t.updateQueue;if(null!==(n=null!==n?n.lastEffect:null)){var r=n=n.next;do{!(3&~r.tag)&&(e=r.destroy,r.destroy=void 0,void 0!==e&&e()),r=r.next}while(r!==n)}return;case 1:case 12:case 17:return;case 5:if(null!=(n=t.stateNode)){r=t.memoizedProps;var a=null!==e?e.memoizedProps:r;e=t.type;var o=t.updateQueue;if(t.updateQueue=null,null!==o){for(n[Zr]=r,"input"===e&&"radio"===r.type&&null!=r.name&&te(n,r),xe(e,a),t=xe(e,r),a=0;a<o.length;a+=2){var l=o[a],s=o[a+1];"style"===l?Ee(n,s):"dangerouslySetInnerHTML"===l?ge(n,s):"children"===l?be(n,s):w(n,l,s,t)}switch(e){case"input":ne(n,r);break;case"textarea":ue(n,r);break;case"select":e=n._wrapperState.wasMultiple,n._wrapperState.wasMultiple=!!r.multiple,null!=(o=r.value)?ie(n,!!r.multiple,o,!1):e!==!!r.multiple&&(null!=r.defaultValue?ie(n,!!r.multiple,r.defaultValue,!0):ie(n,!!r.multiple,r.multiple?[]:"",!1))}}}return;case 6:if(null===t.stateNode)throw Error(i(162));return void(t.stateNode.nodeValue=t.memoizedProps);case 3:return void((n=t.stateNode).hydrate&&(n.hydrate=!1,Et(n.containerInfo)));case 13:return null!==t.memoizedState&&(Gl=ja(),vl(t.child,!0)),void Cl(t);case 19:return void Cl(t);case 23:case 24:return void vl(t,null!==t.memoizedState)}throw Error(i(163))}function Cl(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new ml),t.forEach((function(t){var r=js.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function Tl(e,t){return null!==e&&(null===(e=e.memoizedState)||null!==e.dehydrated)&&(null!==(t=t.memoizedState)&&null===t.dehydrated)}var Ol=Math.ceil,Ll=E.ReactCurrentDispatcher,Nl=E.ReactCurrentOwner,Pl=0,Rl=null,Il=null,Ml=0,Dl=0,Bl=sa(0),Fl=0,$l=null,zl=0,Ul=0,jl=0,Hl=0,Vl=null,Gl=0,Wl=1/0;function ql(){Wl=ja()+500}var Kl,Yl=null,Ql=!1,Xl=null,Zl=null,Jl=!1,es=null,ts=90,ns=[],rs=[],as=null,os=0,is=null,ls=-1,ss=0,us=0,cs=null,ds=!1;function fs(){return 48&Pl?ja():-1!==ls?ls:ls=ja()}function ps(e){if(!(2&(e=e.mode)))return 1;if(!(4&e))return 99===Ha()?1:2;if(0===ss&&(ss=zl),0!==Ya.transition){0!==us&&(us=null!==Vl?Vl.pendingLanes:0),e=ss;var t=4186112&~us;return 0===(t&=-t)&&(0===(t=(e=4186112&~e)&-e)&&(t=8192)),t}return e=Ha(),4&Pl&&98===e?e=$t(12,ss):e=$t(e=function(e){switch(e){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}(e),ss),e}function ms(e,t,n){if(50<os)throw os=0,is=null,Error(i(185));if(null===(e=hs(e,t)))return null;jt(e,t,n),e===Rl&&(jl|=t,4===Fl&&vs(e,Ml));var r=Ha();1===t?8&Pl&&!(48&Pl)?ys(e):(gs(e,n),0===Pl&&(ql(),qa())):(!(4&Pl)||98!==r&&99!==r||(null===as?as=new Set([e]):as.add(e)),gs(e,n)),Vl=e}function hs(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}function gs(e,t){for(var n=e.callbackNode,r=e.suspendedLanes,a=e.pingedLanes,o=e.expirationTimes,l=e.pendingLanes;0<l;){var s=31-Ht(l),u=1<<s,c=o[s];if(-1===c){if(!(u&r)||u&a){c=t,Dt(u);var d=Mt;o[s]=10<=d?c+250:6<=d?c+5e3:-1}}else c<=t&&(e.expiredLanes|=u);l&=~u}if(r=Bt(e,e===Rl?Ml:0),t=Mt,0===r)null!==n&&(n!==Da&&Aa(n),e.callbackNode=null,e.callbackPriority=0);else{if(null!==n){if(e.callbackPriority===t)return;n!==Da&&Aa(n)}15===t?(n=ys.bind(null,e),null===Fa?(Fa=[n],$a=_a(Na,Ka)):Fa.push(n),n=Da):14===t?n=Wa(99,ys.bind(null,e)):(n=function(e){switch(e){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(i(358,e))}}(t),n=Wa(n,bs.bind(null,e))),e.callbackPriority=t,e.callbackNode=n}}function bs(e){if(ls=-1,us=ss=0,48&Pl)throw Error(i(327));var t=e.callbackNode;if(Ms()&&e.callbackNode!==t)return null;var n=Bt(e,e===Rl?Ml:0);if(0===n)return null;var r=n,a=Pl;Pl|=16;var o=As();for(Rl===e&&Ml===r||(ql(),xs(e,r));;)try{Os();break}catch(s){_s(e,s)}if(to(),Ll.current=o,Pl=a,null!==Il?r=0:(Rl=null,Ml=0,r=Fl),zl&jl)xs(e,0);else if(0!==r){if(2===r&&(Pl|=64,e.hydrate&&(e.hydrate=!1,Wr(e.containerInfo)),0!==(n=Ft(e))&&(r=Cs(e,n))),1===r)throw t=$l,xs(e,0),vs(e,n),gs(e,ja()),t;switch(e.finishedWork=e.current.alternate,e.finishedLanes=n,r){case 0:case 1:throw Error(i(345));case 2:case 5:Ps(e);break;case 3:if(vs(e,n),(62914560&n)===n&&10<(r=Gl+500-ja())){if(0!==Bt(e,0))break;if(((a=e.suspendedLanes)&n)!==n){fs(),e.pingedLanes|=e.suspendedLanes&a;break}e.timeoutHandle=Vr(Ps.bind(null,e),r);break}Ps(e);break;case 4:if(vs(e,n),(4186112&n)===n)break;for(r=e.eventTimes,a=-1;0<n;){var l=31-Ht(n);o=1<<l,(l=r[l])>a&&(a=l),n&=~o}if(n=a,10<(n=(120>(n=ja()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Ol(n/1960))-n)){e.timeoutHandle=Vr(Ps.bind(null,e),n);break}Ps(e);break;default:throw Error(i(329))}}return gs(e,ja()),e.callbackNode===t?bs.bind(null,e):null}function vs(e,t){for(t&=~Hl,t&=~jl,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-Ht(t),r=1<<n;e[n]=-1,t&=~r}}function ys(e){if(48&Pl)throw Error(i(327));if(Ms(),e===Rl&&e.expiredLanes&Ml){var t=Ml,n=Cs(e,t);zl&jl&&(n=Cs(e,t=Bt(e,t)))}else n=Cs(e,t=Bt(e,0));if(0!==e.tag&&2===n&&(Pl|=64,e.hydrate&&(e.hydrate=!1,Wr(e.containerInfo)),0!==(t=Ft(e))&&(n=Cs(e,t))),1===n)throw n=$l,xs(e,0),vs(e,t),gs(e,ja()),n;return e.finishedWork=e.current.alternate,e.finishedLanes=t,Ps(e),gs(e,ja()),null}function ws(e,t){var n=Pl;Pl|=1;try{return e(t)}finally{0===(Pl=n)&&(ql(),qa())}}function Es(e,t){var n=Pl;Pl&=-2,Pl|=8;try{return e(t)}finally{0===(Pl=n)&&(ql(),qa())}}function ks(e,t){ca(Bl,Dl),Dl|=t,zl|=t}function Ss(){Dl=Bl.current,ua(Bl)}function xs(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Gr(n)),null!==Il)for(n=Il.return;null!==n;){var r=n;switch(r.tag){case 1:null!=(r=r.type.childContextTypes)&&ba();break;case 3:Io(),ua(pa),ua(fa),Yo();break;case 5:Do(r);break;case 4:Io();break;case 13:case 19:ua(Bo);break;case 10:no(r);break;case 23:case 24:Ss()}n=n.return}Rl=e,Il=Ws(e.current,null),Ml=Dl=zl=t,Fl=0,$l=null,Hl=jl=Ul=0}function _s(e,t){for(;;){var n=Il;try{if(to(),Qo.current=Ni,ni){for(var r=Jo.memoizedState;null!==r;){var a=r.queue;null!==a&&(a.pending=null),r=r.next}ni=!1}if(Zo=0,ti=ei=Jo=null,ri=!1,Nl.current=null,null===n||null===n.return){Fl=1,$l=t,Il=null;break}e:{var o=e,i=n.return,l=n,s=t;if(t=Ml,l.flags|=2048,l.firstEffect=l.lastEffect=null,null!==s&&"object"==typeof s&&"function"==typeof s.then){var u=s;if(!(2&l.mode)){var c=l.alternate;c?(l.updateQueue=c.updateQueue,l.memoizedState=c.memoizedState,l.lanes=c.lanes):(l.updateQueue=null,l.memoizedState=null)}var d=!!(1&Bo.current),f=i;do{var p;if(p=13===f.tag){var m=f.memoizedState;if(null!==m)p=null!==m.dehydrated;else{var h=f.memoizedProps;p=void 0!==h.fallback&&(!0!==h.unstable_avoidThisFallback||!d)}}if(p){var g=f.updateQueue;if(null===g){var b=new Set;b.add(u),f.updateQueue=b}else g.add(u);if(!(2&f.mode)){if(f.flags|=64,l.flags|=16384,l.flags&=-2981,1===l.tag)if(null===l.alternate)l.tag=17;else{var v=uo(-1,1);v.tag=2,co(l,v)}l.lanes|=1;break e}s=void 0,l=t;var y=o.pingCache;if(null===y?(y=o.pingCache=new dl,s=new Set,y.set(u,s)):void 0===(s=y.get(u))&&(s=new Set,y.set(u,s)),!s.has(l)){s.add(l);var w=Us.bind(null,o,u,l);u.then(w,w)}f.flags|=4096,f.lanes=t;break e}f=f.return}while(null!==f);s=Error((q(l.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.")}5!==Fl&&(Fl=2),s=ul(s,l),f=i;do{switch(f.tag){case 3:o=s,f.flags|=4096,t&=-t,f.lanes|=t,fo(f,fl(0,o,t));break e;case 1:o=s;var E=f.type,k=f.stateNode;if(!(64&f.flags||"function"!=typeof E.getDerivedStateFromError&&(null===k||"function"!=typeof k.componentDidCatch||null!==Zl&&Zl.has(k)))){f.flags|=4096,t&=-t,f.lanes|=t,fo(f,pl(f,o,t));break e}}f=f.return}while(null!==f)}Ns(n)}catch(S){t=S,Il===n&&null!==n&&(Il=n=n.return);continue}break}}function As(){var e=Ll.current;return Ll.current=Ni,null===e?Ni:e}function Cs(e,t){var n=Pl;Pl|=16;var r=As();for(Rl===e&&Ml===t||xs(e,t);;)try{Ts();break}catch(a){_s(e,a)}if(to(),Pl=n,Ll.current=r,null!==Il)throw Error(i(261));return Rl=null,Ml=0,Fl}function Ts(){for(;null!==Il;)Ls(Il)}function Os(){for(;null!==Il&&!Ca();)Ls(Il)}function Ls(e){var t=Kl(e.alternate,e,Dl);e.memoizedProps=e.pendingProps,null===t?Ns(e):Il=t,Nl.current=null}function Ns(e){var t=e;do{var n=t.alternate;if(e=t.return,2048&t.flags){if(null!==(n=sl(t)))return n.flags&=2047,void(Il=n);null!==e&&(e.firstEffect=e.lastEffect=null,e.flags|=2048)}else{if(null!==(n=ll(n,t,Dl)))return void(Il=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||1073741824&Dl||!(4&n.mode)){for(var r=0,a=n.child;null!==a;)r|=a.lanes|a.childLanes,a=a.sibling;n.childLanes=r}null!==e&&!(2048&e.flags)&&(null===e.firstEffect&&(e.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=t.firstEffect),e.lastEffect=t.lastEffect),1<t.flags&&(null!==e.lastEffect?e.lastEffect.nextEffect=t:e.firstEffect=t,e.lastEffect=t))}if(null!==(t=t.sibling))return void(Il=t);Il=t=e}while(null!==t);0===Fl&&(Fl=5)}function Ps(e){var t=Ha();return Ga(99,Rs.bind(null,e,t)),null}function Rs(e,t){do{Ms()}while(null!==es);if(48&Pl)throw Error(i(327));var n=e.finishedWork;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(i(177));e.callbackNode=null;var r=n.lanes|n.childLanes,a=r,o=e.pendingLanes&~a;e.pendingLanes=a,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=a,e.mutableReadLanes&=a,e.entangledLanes&=a,a=e.entanglements;for(var l=e.eventTimes,s=e.expirationTimes;0<o;){var u=31-Ht(o),c=1<<u;a[u]=0,l[u]=-1,s[u]=-1,o&=~c}if(null!==as&&!(24&r)&&as.has(e)&&as.delete(e),e===Rl&&(Il=Rl=null,Ml=0),1<n.flags?null!==n.lastEffect?(n.lastEffect.nextEffect=n,r=n.firstEffect):r=n:r=n.firstEffect,null!==r){if(a=Pl,Pl|=32,Nl.current=null,zr=Kt,gr(l=hr())){if("selectionStart"in l)s={start:l.selectionStart,end:l.selectionEnd};else e:if(s=(s=l.ownerDocument)&&s.defaultView||window,(c=s.getSelection&&s.getSelection())&&0!==c.rangeCount){s=c.anchorNode,o=c.anchorOffset,u=c.focusNode,c=c.focusOffset;try{s.nodeType,u.nodeType}catch(A){s=null;break e}var d=0,f=-1,p=-1,m=0,h=0,g=l,b=null;t:for(;;){for(var v;g!==s||0!==o&&3!==g.nodeType||(f=d+o),g!==u||0!==c&&3!==g.nodeType||(p=d+c),3===g.nodeType&&(d+=g.nodeValue.length),null!==(v=g.firstChild);)b=g,g=v;for(;;){if(g===l)break t;if(b===s&&++m===o&&(f=d),b===u&&++h===c&&(p=d),null!==(v=g.nextSibling))break;b=(g=b).parentNode}g=v}s=-1===f||-1===p?null:{start:f,end:p}}else s=null;s=s||{start:0,end:0}}else s=null;Ur={focusedElem:l,selectionRange:s},Kt=!1,cs=null,ds=!1,Yl=r;do{try{Is()}catch(A){if(null===Yl)throw Error(i(330));zs(Yl,A),Yl=Yl.nextEffect}}while(null!==Yl);cs=null,Yl=r;do{try{for(l=e;null!==Yl;){var y=Yl.flags;if(16&y&&be(Yl.stateNode,""),128&y){var w=Yl.alternate;if(null!==w){var E=w.ref;null!==E&&("function"==typeof E?E(null):E.current=null)}}switch(1038&y){case 2:kl(Yl),Yl.flags&=-3;break;case 6:kl(Yl),Yl.flags&=-3,Al(Yl.alternate,Yl);break;case 1024:Yl.flags&=-1025;break;case 1028:Yl.flags&=-1025,Al(Yl.alternate,Yl);break;case 4:Al(Yl.alternate,Yl);break;case 8:_l(l,s=Yl);var k=s.alternate;wl(s),null!==k&&wl(k)}Yl=Yl.nextEffect}}catch(A){if(null===Yl)throw Error(i(330));zs(Yl,A),Yl=Yl.nextEffect}}while(null!==Yl);if(E=Ur,w=hr(),y=E.focusedElem,l=E.selectionRange,w!==y&&y&&y.ownerDocument&&mr(y.ownerDocument.documentElement,y)){null!==l&&gr(y)&&(w=l.start,void 0===(E=l.end)&&(E=w),"selectionStart"in y?(y.selectionStart=w,y.selectionEnd=Math.min(E,y.value.length)):(E=(w=y.ownerDocument||document)&&w.defaultView||window).getSelection&&(E=E.getSelection(),s=y.textContent.length,k=Math.min(l.start,s),l=void 0===l.end?k:Math.min(l.end,s),!E.extend&&k>l&&(s=l,l=k,k=s),s=pr(y,k),o=pr(y,l),s&&o&&(1!==E.rangeCount||E.anchorNode!==s.node||E.anchorOffset!==s.offset||E.focusNode!==o.node||E.focusOffset!==o.offset)&&((w=w.createRange()).setStart(s.node,s.offset),E.removeAllRanges(),k>l?(E.addRange(w),E.extend(o.node,o.offset)):(w.setEnd(o.node,o.offset),E.addRange(w))))),w=[];for(E=y;E=E.parentNode;)1===E.nodeType&&w.push({element:E,left:E.scrollLeft,top:E.scrollTop});for("function"==typeof y.focus&&y.focus(),y=0;y<w.length;y++)(E=w[y]).element.scrollLeft=E.left,E.element.scrollTop=E.top}Kt=!!zr,Ur=zr=null,e.current=n,Yl=r;do{try{for(y=e;null!==Yl;){var S=Yl.flags;if(36&S&&bl(y,Yl.alternate,Yl),128&S){w=void 0;var x=Yl.ref;if(null!==x){var _=Yl.stateNode;Yl.tag,w=_,"function"==typeof x?x(w):x.current=w}}Yl=Yl.nextEffect}}catch(A){if(null===Yl)throw Error(i(330));zs(Yl,A),Yl=Yl.nextEffect}}while(null!==Yl);Yl=null,Ba(),Pl=a}else e.current=n;if(Jl)Jl=!1,es=e,ts=t;else for(Yl=r;null!==Yl;)t=Yl.nextEffect,Yl.nextEffect=null,8&Yl.flags&&((S=Yl).sibling=null,S.stateNode=null),Yl=t;if(0===(r=e.pendingLanes)&&(Zl=null),1===r?e===is?os++:(os=0,is=e):os=0,n=n.stateNode,Sa&&"function"==typeof Sa.onCommitFiberRoot)try{Sa.onCommitFiberRoot(ka,n,void 0,!(64&~n.current.flags))}catch(A){}if(gs(e,ja()),Ql)throw Ql=!1,e=Xl,Xl=null,e;return 8&Pl||qa(),null}function Is(){for(;null!==Yl;){var e=Yl.alternate;ds||null===cs||(8&Yl.flags?Je(Yl,cs)&&(ds=!0):13===Yl.tag&&Tl(e,Yl)&&Je(Yl,cs)&&(ds=!0));var t=Yl.flags;256&t&&gl(e,Yl),!(512&t)||Jl||(Jl=!0,Wa(97,(function(){return Ms(),null}))),Yl=Yl.nextEffect}}function Ms(){if(90!==ts){var e=97<ts?97:ts;return ts=90,Ga(e,Fs)}return!1}function Ds(e,t){ns.push(t,e),Jl||(Jl=!0,Wa(97,(function(){return Ms(),null})))}function Bs(e,t){rs.push(t,e),Jl||(Jl=!0,Wa(97,(function(){return Ms(),null})))}function Fs(){if(null===es)return!1;var e=es;if(es=null,48&Pl)throw Error(i(331));var t=Pl;Pl|=32;var n=rs;rs=[];for(var r=0;r<n.length;r+=2){var a=n[r],o=n[r+1],l=a.destroy;if(a.destroy=void 0,"function"==typeof l)try{l()}catch(u){if(null===o)throw Error(i(330));zs(o,u)}}for(n=ns,ns=[],r=0;r<n.length;r+=2){a=n[r],o=n[r+1];try{var s=a.create;a.destroy=s()}catch(u){if(null===o)throw Error(i(330));zs(o,u)}}for(s=e.current.firstEffect;null!==s;)e=s.nextEffect,s.nextEffect=null,8&s.flags&&(s.sibling=null,s.stateNode=null),s=e;return Pl=t,qa(),!0}function $s(e,t,n){co(e,t=fl(0,t=ul(n,t),1)),t=fs(),null!==(e=hs(e,1))&&(jt(e,1,t),gs(e,t))}function zs(e,t){if(3===e.tag)$s(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){$s(n,e,t);break}if(1===n.tag){var r=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Zl||!Zl.has(r))){var a=pl(n,e=ul(t,e),1);if(co(n,a),a=fs(),null!==(n=hs(n,1)))jt(n,1,a),gs(n,a);else if("function"==typeof r.componentDidCatch&&(null===Zl||!Zl.has(r)))try{r.componentDidCatch(t,e)}catch(o){}break}}n=n.return}}function Us(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=fs(),e.pingedLanes|=e.suspendedLanes&n,Rl===e&&(Ml&n)===n&&(4===Fl||3===Fl&&(62914560&Ml)===Ml&&500>ja()-Gl?xs(e,0):Hl|=n),gs(e,t)}function js(e,t){var n=e.stateNode;null!==n&&n.delete(t),0===(t=0)&&(2&(t=e.mode)?4&t?(0===ss&&(ss=zl),0===(t=zt(62914560&~ss))&&(t=4194304)):t=99===Ha()?1:2:t=1),n=fs(),null!==(e=hs(e,t))&&(jt(e,t,n),gs(e,n))}function Hs(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.flags=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childLanes=this.lanes=0,this.alternate=null}function Vs(e,t,n,r){return new Hs(e,t,n,r)}function Gs(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Ws(e,t){var n=e.alternate;return null===n?((n=Vs(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function qs(e,t,n,r,a,o){var l=2;if(r=e,"function"==typeof e)Gs(e)&&(l=1);else if("string"==typeof e)l=5;else e:switch(e){case x:return Ks(n.children,a,o,t);case D:l=8,a|=16;break;case _:l=8,a|=1;break;case A:return(e=Vs(12,n,t,8|a)).elementType=A,e.type=A,e.lanes=o,e;case L:return(e=Vs(13,n,t,a)).type=L,e.elementType=L,e.lanes=o,e;case N:return(e=Vs(19,n,t,a)).elementType=N,e.lanes=o,e;case B:return Ys(n,a,o,t);case F:return(e=Vs(24,n,t,a)).elementType=F,e.lanes=o,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case C:l=10;break e;case T:l=9;break e;case O:l=11;break e;case P:l=14;break e;case R:l=16,r=null;break e;case I:l=22;break e}throw Error(i(130,null==e?e:typeof e,""))}return(t=Vs(l,n,t,a)).elementType=e,t.type=r,t.lanes=o,t}function Ks(e,t,n,r){return(e=Vs(7,e,r,t)).lanes=n,e}function Ys(e,t,n,r){return(e=Vs(23,e,r,t)).elementType=B,e.lanes=n,e}function Qs(e,t,n){return(e=Vs(6,e,null,t)).lanes=n,e}function Xs(e,t,n){return(t=Vs(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Zs(e,t,n){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=n,this.callbackNode=null,this.callbackPriority=0,this.eventTimes=Ut(0),this.expirationTimes=Ut(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ut(0),this.mutableSourceEagerHydrationData=null}function Js(e,t,n,r){var a=t.current,o=fs(),l=ps(a);e:if(n){t:{if(Ye(n=n._reactInternals)!==n||1!==n.tag)throw Error(i(170));var s=n;do{switch(s.tag){case 3:s=s.stateNode.context;break t;case 1:if(ga(s.type)){s=s.stateNode.__reactInternalMemoizedMergedChildContext;break t}}s=s.return}while(null!==s);throw Error(i(171))}if(1===n.tag){var u=n.type;if(ga(u)){n=ya(n,u,s);break e}}n=s}else n=da;return null===t.context?t.context=n:t.pendingContext=n,(t=uo(o,l)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),co(a,t),ms(a,l,o),l}function eu(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function tu(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function nu(e,t){tu(e,t),(e=e.alternate)&&tu(e,t)}function ru(e,t,n){var r=null!=n&&null!=n.hydrationOptions&&n.hydrationOptions.mutableSources||null;if(n=new Zs(e,t,null!=n&&!0===n.hydrate),t=Vs(3,null,null,2===t?7:1===t?3:0),n.current=t,t.stateNode=n,lo(t),e[Jr]=n.current,Nr(8===e.nodeType?e.parentNode:e),r)for(e=0;e<r.length;e++){var a=(t=r[e])._getVersion;a=a(t._source),null==n.mutableSourceEagerHydrationData?n.mutableSourceEagerHydrationData=[t,a]:n.mutableSourceEagerHydrationData.push(t,a)}this._internalRoot=n}function au(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function ou(e,t,n,r,a){var o=n._reactRootContainer;if(o){var i=o._internalRoot;if("function"==typeof a){var l=a;a=function(){var e=eu(i);l.call(e)}}Js(t,i,e,a)}else{if(o=n._reactRootContainer=function(e,t){if(t||(t=!(!(t=e?9===e.nodeType?e.documentElement:e.firstChild:null)||1!==t.nodeType||!t.hasAttribute("data-reactroot"))),!t)for(var n;n=e.lastChild;)e.removeChild(n);return new ru(e,0,t?{hydrate:!0}:void 0)}(n,r),i=o._internalRoot,"function"==typeof a){var s=a;a=function(){var e=eu(i);s.call(e)}}Es((function(){Js(t,i,e,a)}))}return eu(i)}function iu(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!au(t))throw Error(i(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:S,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)}Kl=function(e,t,n){var r=t.lanes;if(null!==e)if(e.memoizedProps!==t.pendingProps||pa.current)Di=!0;else{if(!(n&r)){switch(Di=!1,t.tag){case 3:Wi(t),qo();break;case 5:Mo(t);break;case 1:ga(t.type)&&wa(t);break;case 4:Ro(t,t.stateNode.containerInfo);break;case 10:r=t.memoizedProps.value;var a=t.type._context;ca(Xa,a._currentValue),a._currentValue=r;break;case 13:if(null!==t.memoizedState)return n&t.child.childLanes?Zi(e,t,n):(ca(Bo,1&Bo.current),null!==(t=ol(e,t,n))?t.sibling:null);ca(Bo,1&Bo.current);break;case 19:if(r=!!(n&t.childLanes),64&e.flags){if(r)return al(e,t,n);t.flags|=64}if(null!==(a=t.memoizedState)&&(a.rendering=null,a.tail=null,a.lastEffect=null),ca(Bo,Bo.current),r)break;return null;case 23:case 24:return t.lanes=0,Ui(e,t,n)}return ol(e,t,n)}Di=!!(16384&e.flags)}else Di=!1;switch(t.lanes=0,t.tag){case 2:if(r=t.type,null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,a=ha(t,fa.current),ao(t,n),a=ii(null,t,r,e,a,n),t.flags|=1,"object"==typeof a&&null!==a&&"function"==typeof a.render&&void 0===a.$$typeof){if(t.tag=1,t.memoizedState=null,t.updateQueue=null,ga(r)){var o=!0;wa(t)}else o=!1;t.memoizedState=null!==a.state&&void 0!==a.state?a.state:null,lo(t);var l=r.getDerivedStateFromProps;"function"==typeof l&&go(t,r,l,e),a.updater=bo,t.stateNode=a,a._reactInternals=t,Eo(t,r,e,n),t=Gi(null,t,r,!0,o,n)}else t.tag=0,Bi(null,t,a,n),t=t.child;return t;case 16:a=t.elementType;e:{switch(null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,a=(o=a._init)(a._payload),t.type=a,o=t.tag=function(e){if("function"==typeof e)return Gs(e)?1:0;if(null!=e){if((e=e.$$typeof)===O)return 11;if(e===P)return 14}return 2}(a),e=Qa(a,e),o){case 0:t=Hi(null,t,a,e,n);break e;case 1:t=Vi(null,t,a,e,n);break e;case 11:t=Fi(null,t,a,e,n);break e;case 14:t=$i(null,t,a,Qa(a.type,e),r,n);break e}throw Error(i(306,a,""))}return t;case 0:return r=t.type,a=t.pendingProps,Hi(e,t,r,a=t.elementType===r?a:Qa(r,a),n);case 1:return r=t.type,a=t.pendingProps,Vi(e,t,r,a=t.elementType===r?a:Qa(r,a),n);case 3:if(Wi(t),r=t.updateQueue,null===e||null===r)throw Error(i(282));if(r=t.pendingProps,a=null!==(a=t.memoizedState)?a.element:null,so(e,t),po(t,r,null,n),(r=t.memoizedState.element)===a)qo(),t=ol(e,t,n);else{if((o=(a=t.stateNode).hydrate)&&(zo=qr(t.stateNode.containerInfo.firstChild),$o=t,o=Uo=!0),o){if(null!=(e=a.mutableSourceEagerHydrationData))for(a=0;a<e.length;a+=2)(o=e[a])._workInProgressVersionPrimary=e[a+1],Ko.push(o);for(n=Co(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|1024,n=n.sibling}else Bi(e,t,r,n),qo();t=t.child}return t;case 5:return Mo(t),null===e&&Vo(t),r=t.type,a=t.pendingProps,o=null!==e?e.memoizedProps:null,l=a.children,Hr(r,a)?l=null:null!==o&&Hr(r,o)&&(t.flags|=16),ji(e,t),Bi(e,t,l,n),t.child;case 6:return null===e&&Vo(t),null;case 13:return Zi(e,t,n);case 4:return Ro(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Ao(t,null,r,n):Bi(e,t,r,n),t.child;case 11:return r=t.type,a=t.pendingProps,Fi(e,t,r,a=t.elementType===r?a:Qa(r,a),n);case 7:return Bi(e,t,t.pendingProps,n),t.child;case 8:case 12:return Bi(e,t,t.pendingProps.children,n),t.child;case 10:e:{r=t.type._context,a=t.pendingProps,l=t.memoizedProps,o=a.value;var s=t.type._context;if(ca(Xa,s._currentValue),s._currentValue=o,null!==l)if(s=l.value,0===(o=ur(s,o)?0:0|("function"==typeof r._calculateChangedBits?r._calculateChangedBits(s,o):1073741823))){if(l.children===a.children&&!pa.current){t=ol(e,t,n);break e}}else for(null!==(s=t.child)&&(s.return=t);null!==s;){var u=s.dependencies;if(null!==u){l=s.child;for(var c=u.firstContext;null!==c;){if(c.context===r&&c.observedBits&o){1===s.tag&&((c=uo(-1,n&-n)).tag=2,co(s,c)),s.lanes|=n,null!==(c=s.alternate)&&(c.lanes|=n),ro(s.return,n),u.lanes|=n;break}c=c.next}}else l=10===s.tag&&s.type===t.type?null:s.child;if(null!==l)l.return=s;else for(l=s;null!==l;){if(l===t){l=null;break}if(null!==(s=l.sibling)){s.return=l.return,l=s;break}l=l.return}s=l}Bi(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,r=(o=t.pendingProps).children,ao(t,n),r=r(a=oo(a,o.unstable_observedBits)),t.flags|=1,Bi(e,t,r,n),t.child;case 14:return o=Qa(a=t.type,t.pendingProps),$i(e,t,a,o=Qa(a.type,o),r,n);case 15:return zi(e,t,t.type,t.pendingProps,r,n);case 17:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:Qa(r,a),null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),t.tag=1,ga(r)?(e=!0,wa(t)):e=!1,ao(t,n),yo(t,r,a),Eo(t,r,a,n),Gi(null,t,r,!0,e,n);case 19:return al(e,t,n);case 23:case 24:return Ui(e,t,n)}throw Error(i(156,t.tag))},ru.prototype.render=function(e){Js(e,this._internalRoot,null,null)},ru.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;Js(null,e,null,(function(){t[Jr]=null}))},et=function(e){13===e.tag&&(ms(e,4,fs()),nu(e,4))},tt=function(e){13===e.tag&&(ms(e,67108864,fs()),nu(e,67108864))},nt=function(e){if(13===e.tag){var t=fs(),n=ps(e);ms(e,n,t),nu(e,n)}},rt=function(e,t){return t()},Ae=function(e,t,n){switch(t){case"input":if(ne(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var a=aa(r);if(!a)throw Error(i(90));X(r),ne(r,a)}}}break;case"textarea":ue(e,n);break;case"select":null!=(t=n.value)&&ie(e,!!n.multiple,t,!1)}},Pe=ws,Re=function(e,t,n,r,a){var o=Pl;Pl|=4;try{return Ga(98,e.bind(null,t,n,r,a))}finally{0===(Pl=o)&&(ql(),qa())}},Ie=function(){!(49&Pl)&&(function(){if(null!==as){var e=as;as=null,e.forEach((function(e){e.expiredLanes|=24&e.pendingLanes,gs(e,ja())}))}qa()}(),Ms())},Me=function(e,t){var n=Pl;Pl|=2;try{return e(t)}finally{0===(Pl=n)&&(ql(),qa())}};var lu={Events:[na,ra,aa,Le,Ne,Ms,{current:!1}]},su={findFiberByHostInstance:ta,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},uu={bundleType:su.bundleType,version:su.version,rendererPackageName:su.rendererPackageName,rendererConfig:su.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:E.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Ze(e))?null:e.stateNode},findFiberByHostInstance:su.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var cu=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!cu.isDisabled&&cu.supportsFiber)try{ka=cu.inject(uu),Sa=cu}catch(he){}}t.createPortal=iu,t.hydrate=function(e,t,n){if(!au(t))throw Error(i(200));return ou(null,e,t,!0,n)}},961:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(2551)},115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,a="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function o(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var l,s,u,c;if(Array.isArray(e)){if((l=e.length)!=i.length)return!1;for(s=l;0!=s--;)if(!o(e[s],i[s]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(c=e.entries();!(s=c.next()).done;)if(!i.has(s.value[0]))return!1;for(c=e.entries();!(s=c.next()).done;)if(!o(s.value[1],i.get(s.value[0])))return!1;return!0}if(r&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(c=e.entries();!(s=c.next()).done;)if(!i.has(s.value[0]))return!1;return!0}if(a&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((l=e.length)!=i.length)return!1;for(s=l;0!=s--;)if(e[s]!==i[s])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof i.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof i.toString)return e.toString()===i.toString();if((l=(u=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(s=l;0!=s--;)if(!Object.prototype.hasOwnProperty.call(i,u[s]))return!1;if(t&&e instanceof Element)return!1;for(s=l;0!=s--;)if(("_owner"!==u[s]&&"__v"!==u[s]&&"__o"!==u[s]||!e.$$typeof)&&!o(e[u[s]],i[u[s]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return o(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},545:(e,t,n)=>{"use strict";n.d(t,{mg:()=>J,vd:()=>G});var r=n(6540),a=n(5556),o=n.n(a),i=n(115),l=n.n(i),s=n(311),u=n.n(s),c=n(2833),d=n.n(c);function f(){return f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},f.apply(this,arguments)}function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,m(e,t)}function m(e,t){return m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},m(e,t)}function h(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)t.indexOf(n=o[r])>=0||(a[n]=e[n]);return a}var g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},v={type:["application/ld+json"]},y={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},w=Object.keys(g).map((function(e){return g[e]})),E={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},k=Object.keys(E).reduce((function(e,t){return e[E[t]]=t,e}),{}),S=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},x=function(e){var t=S(e,g.TITLE),n=S(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=S(e,"defaultTitle");return t||r||void 0},_=function(e){return S(e,"onChangeClientState")||function(){}},A=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return f({},e,t)}),{})},C=function(e,t){return t.filter((function(e){return void 0!==e[g.BASE]})).map((function(e){return e[g.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),a=0;a<r.length;a+=1){var o=r[a].toLowerCase();if(-1!==e.indexOf(o)&&n[o])return t.concat(n)}return t}),[])},T=function(e,t,n){var r={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var a={};n.filter((function(e){for(var n,o=Object.keys(e),i=0;i<o.length;i+=1){var l=o[i],s=l.toLowerCase();-1===t.indexOf(s)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===s&&"stylesheet"===e[s].toLowerCase()||(n=s),-1===t.indexOf(l)||"innerHTML"!==l&&"cssText"!==l&&"itemprop"!==l||(n=l)}if(!n||!e[n])return!1;var u=e[n].toLowerCase();return r[n]||(r[n]={}),a[n]||(a[n]={}),!r[n][u]&&(a[n][u]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var o=Object.keys(a),i=0;i<o.length;i+=1){var l=o[i],s=f({},r[l],a[l]);r[l]=s}return e}),[]).reverse()},O=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},L=function(e){return Array.isArray(e)?e.join(""):e},N=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},P=function(e,t){var n;return f({},e,((n={})[t]=void 0,n))},R=[g.NOSCRIPT,g.SCRIPT,g.STYLE],I=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},M=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},D=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[E[n]||n]=e[n],t}),t)},B=function(e,t){return t.map((function(t,n){var a,o=((a={key:n})["data-rh"]=!0,a);return Object.keys(t).forEach((function(e){var n=E[e]||e;"innerHTML"===n||"cssText"===n?o.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:o[n]=t[e]})),r.createElement(e,o)}))},F=function(e,t,n){switch(e){case g.TITLE:return{toComponent:function(){return n=t.titleAttributes,(a={key:e=t.title})["data-rh"]=!0,o=D(n,a),[r.createElement(g.TITLE,o,e)];var e,n,a,o},toString:function(){return function(e,t,n,r){var a=M(n),o=L(t);return a?"<"+e+' data-rh="true" '+a+">"+I(o,r)+"</"+e+">":"<"+e+' data-rh="true">'+I(o,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return D(t)},toString:function(){return M(t)}};default:return{toComponent:function(){return B(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var a=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var a=void 0===r[t]?t:t+'="'+I(r[t],n)+'"';return e?e+" "+a:a}),""),o=r.innerHTML||r.cssText||"",i=-1===R.indexOf(e);return t+"<"+e+' data-rh="true" '+a+(i?"/>":">"+o+"</"+e+">")}),"")}(e,t,n)}}}},$=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,a=e.htmlAttributes,o=e.noscriptTags,i=e.styleTags,l=e.title,s=void 0===l?"":l,u=e.titleAttributes,c=e.linkTags,d=e.metaTags,f=e.scriptTags,p={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var m=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,a=N(e.metaTags,y),o=N(t,b),i=N(n,v);return{priorityMethods:{toComponent:function(){return[].concat(B(g.META,a.priority),B(g.LINK,o.priority),B(g.SCRIPT,i.priority))},toString:function(){return F(g.META,a.priority,r)+" "+F(g.LINK,o.priority,r)+" "+F(g.SCRIPT,i.priority,r)}},metaTags:a.default,linkTags:o.default,scriptTags:i.default}}(e);p=m.priorityMethods,c=m.linkTags,d=m.metaTags,f=m.scriptTags}return{priority:p,base:F(g.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",a,r),link:F(g.LINK,c,r),meta:F(g.META,d,r),noscript:F(g.NOSCRIPT,o,r),script:F(g.SCRIPT,f,r),style:F(g.STYLE,i,r),title:F(g.TITLE,{title:s,titleAttributes:u},r)}},z=[],U=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?z:n.instances},add:function(e){(n.canUseDOM?z:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?z:n.instances).indexOf(e);(n.canUseDOM?z:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=$({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},j=r.createContext({}),H=o().shape({setHelmet:o().func,helmetInstances:o().shape({get:o().func,add:o().func,remove:o().func})}),V="undefined"!=typeof document,G=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new U(r.props.context,t.canUseDOM),r}return p(t,e),t.prototype.render=function(){return r.createElement(j.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);G.canUseDOM=V,G.propTypes={context:o().shape({helmet:o().shape()}),children:o().node.isRequired},G.defaultProps={context:{}},G.displayName="HelmetProvider";var W=function(e,t){var n,r=document.head||document.querySelector(g.HEAD),a=r.querySelectorAll(e+"[data-rh]"),o=[].slice.call(a),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&("innerHTML"===a?r.innerHTML=t.innerHTML:"cssText"===a?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(a,void 0===t[a]?"":t[a]));r.setAttribute("data-rh","true"),o.some((function(e,t){return n=t,r.isEqualNode(e)}))?o.splice(n,1):i.push(r)})),o.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:o,newTags:i}},q=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),a=r?r.split(","):[],o=[].concat(a),i=Object.keys(t),l=0;l<i.length;l+=1){var s=i[l],u=t[s]||"";n.getAttribute(s)!==u&&n.setAttribute(s,u),-1===a.indexOf(s)&&a.push(s);var c=o.indexOf(s);-1!==c&&o.splice(c,1)}for(var d=o.length-1;d>=0;d-=1)n.removeAttribute(o[d]);a.length===o.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},K=function(e,t){var n=e.baseTag,r=e.htmlAttributes,a=e.linkTags,o=e.metaTags,i=e.noscriptTags,l=e.onChangeClientState,s=e.scriptTags,u=e.styleTags,c=e.title,d=e.titleAttributes;q(g.BODY,e.bodyAttributes),q(g.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=L(e)),q(g.TITLE,t)}(c,d);var f={baseTag:W(g.BASE,n),linkTags:W(g.LINK,a),metaTags:W(g.META,o),noscriptTags:W(g.NOSCRIPT,i),scriptTags:W(g.SCRIPT,s),styleTags:W(g.STYLE,u)},p={},m={};Object.keys(f).forEach((function(e){var t=f[e],n=t.newTags,r=t.oldTags;n.length&&(p[e]=n),r.length&&(m[e]=f[e].oldTags)})),t&&t(),l(e,p,m)},Y=null,Q=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,r=n.setHelmet,a=null,o=(e=n.helmetInstances.get().map((function(e){var t=f({},e.props);return delete t.context,t})),{baseTag:C(["href"],e),bodyAttributes:A("bodyAttributes",e),defer:S(e,"defer"),encode:S(e,"encodeSpecialCharacters"),htmlAttributes:A("htmlAttributes",e),linkTags:T(g.LINK,["rel","href"],e),metaTags:T(g.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:T(g.NOSCRIPT,["innerHTML"],e),onChangeClientState:_(e),scriptTags:T(g.SCRIPT,["src","innerHTML"],e),styleTags:T(g.STYLE,["cssText"],e),title:x(e),titleAttributes:A("titleAttributes",e),prioritizeSeoTags:O(e,"prioritizeSeoTags")});G.canUseDOM?(t=o,Y&&cancelAnimationFrame(Y),t.defer?Y=requestAnimationFrame((function(){K(t,(function(){Y=null}))})):(K(t),Y=null)):$&&(a=$(o)),r(a)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(r.Component);Q.propTypes={context:H.isRequired},Q.displayName="HelmetDispatcher";var X=["children"],Z=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!l()(P(this.props,"helmetData"),P(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:t};case g.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return f({},r,((t={})[n.type]=[].concat(r[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,a=e.newProps,o=e.newChildProps,i=e.nestedChildren;switch(r.type){case g.TITLE:return f({},a,((t={})[r.type]=i,t.titleAttributes=f({},o),t));case g.BODY:return f({},a,{bodyAttributes:f({},o)});case g.HTML:return f({},a,{htmlAttributes:f({},o)});default:return f({},a,((n={})[r.type]=f({},o),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach((function(t){var r;n=f({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return u()(w.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+w.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),u()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,a={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,o=r.children,i=h(r,X),l=Object.keys(i).reduce((function(e,t){return e[k[t]||t]=i[t],e}),{}),s=e.type;switch("symbol"==typeof s?s=s.toString():n.warnOnInvalidChildren(e,o),s){case g.FRAGMENT:t=n.mapChildrenToProps(o,t);break;case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:a=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:a,newChildProps:l,nestedChildren:o});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:l,nestedChildren:o})}}})),this.mapArrayTypeChildrenToProps(a,t)},n.render=function(){var e=this.props,t=e.children,n=h(e,Z),a=f({},n),o=n.helmetData;return t&&(a=this.mapChildrenToProps(t,a)),!o||o instanceof U||(o=new U(o.context,o.instances)),o?r.createElement(Q,f({},a,{context:o.value,helmetData:void 0})):r.createElement(j.Consumer,null,(function(e){return r.createElement(Q,f({},a,{context:e}))}))},t}(r.Component);J.propTypes={base:o().object,bodyAttributes:o().object,children:o().oneOfType([o().arrayOf(o().node),o().node]),defaultTitle:o().string,defer:o().bool,encodeSpecialCharacters:o().bool,htmlAttributes:o().object,link:o().arrayOf(o().object),meta:o().arrayOf(o().object),noscript:o().arrayOf(o().object),onChangeClientState:o().func,script:o().arrayOf(o().object),style:o().arrayOf(o().object),title:o().string,titleAttributes:o().object,titleTemplate:o().string,prioritizeSeoTags:o().bool,helmetData:o().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},2799:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,a=n?Symbol.for("react.portal"):60106,o=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,l=n?Symbol.for("react.profiler"):60114,s=n?Symbol.for("react.provider"):60109,u=n?Symbol.for("react.context"):60110,c=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,f=n?Symbol.for("react.forward_ref"):60112,p=n?Symbol.for("react.suspense"):60113,m=n?Symbol.for("react.suspense_list"):60120,h=n?Symbol.for("react.memo"):60115,g=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,v=n?Symbol.for("react.fundamental"):60117,y=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function E(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case c:case d:case o:case l:case i:case p:return e;default:switch(e=e&&e.$$typeof){case u:case f:case g:case h:case s:return e;default:return t}}case a:return t}}}function k(e){return E(e)===d}t.AsyncMode=c,t.ConcurrentMode=d,t.ContextConsumer=u,t.ContextProvider=s,t.Element=r,t.ForwardRef=f,t.Fragment=o,t.Lazy=g,t.Memo=h,t.Portal=a,t.Profiler=l,t.StrictMode=i,t.Suspense=p,t.isAsyncMode=function(e){return k(e)||E(e)===c},t.isConcurrentMode=k,t.isContextConsumer=function(e){return E(e)===u},t.isContextProvider=function(e){return E(e)===s},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return E(e)===f},t.isFragment=function(e){return E(e)===o},t.isLazy=function(e){return E(e)===g},t.isMemo=function(e){return E(e)===h},t.isPortal=function(e){return E(e)===a},t.isProfiler=function(e){return E(e)===l},t.isStrictMode=function(e){return E(e)===i},t.isSuspense=function(e){return E(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===d||e===l||e===i||e===p||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===g||e.$$typeof===h||e.$$typeof===s||e.$$typeof===u||e.$$typeof===f||e.$$typeof===v||e.$$typeof===y||e.$$typeof===w||e.$$typeof===b)},t.typeOf=E},4363:(e,t,n)=>{"use strict";e.exports=n(2799)},3259:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function a(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(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<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i.apply(this,arguments)}var l=n(6540),s=n(5556),u=[],c=[];function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function f(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var a=d(e[r]);a.loading?t.loading=!0:(t.loaded[r]=a.loaded,t.error=a.error),n.push(a.promise),a.promise.then((function(e){t.loaded[r]=e})).catch((function(e){t.error=e}))}))}catch(r){t.error=r}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function p(e,t){return l.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function m(e,t){var d,f;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var m=i({loader:null,loading:null,delay:200,timeout:null,render:p,webpack:null,modules:null},t),h=null;function g(){return h||(h=e(m.loader)),h.promise}return u.push(g),"function"==typeof m.webpack&&c.push((function(){if((0,m.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return g()})),f=d=function(t){function n(n){var r;return o(a(a(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),h=e(m.loader),r._loadModule()})),g(),r.state={error:h.error,pastDelay:!1,timedOut:!1,loading:h.loading,loaded:h.loaded},r}r(n,t),n.preload=function(){return g()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(m.modules)&&m.modules.forEach((function(t){e.context.loadable.report(t)})),h.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof m.delay&&(0===m.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),m.delay)),"number"==typeof m.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),m.timeout));var n=function(){t({error:h.error,loaded:h.loaded,loading:h.loading}),e._clearTimeouts()};h.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?l.createElement(m.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?m.render(this.state.loaded,this.props):null},n}(l.Component),o(d,"contextTypes",{loadable:s.shape({report:s.func.isRequired})}),f}function h(e){return m(d,e)}h.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return m(f,e)};var g=function(e){function t(){return e.apply(this,arguments)||this}r(t,e);var n=t.prototype;return n.getChildContext=function(){return{loadable:{report:this.props.report}}},n.render=function(){return l.Children.only(this.props.children)},t}(l.Component);function b(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return b(e)}))}o(g,"propTypes",{report:s.func.isRequired}),o(g,"childContextTypes",{loadable:s.shape({report:s.func.isRequired}).isRequired}),h.Capture=g,h.preloadAll=function(){return new Promise((function(e,t){b(u).then(e,t)}))},h.preloadReady=function(){return new Promise((function(e,t){b(c).then(e,e)}))},e.exports=h},2831:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,v:()=>l});var r=n(6347),a=n(8168),o=n(6540);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var a=e.path?(0,r.B6)(t,e):n.length?n[n.length-1].match:r.Ix.computeRootMatch(t);return a&&(n.push({route:e,match:a}),e.routes&&i(e.routes,t,n)),a})),n}function l(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?o.createElement(r.dO,n,e.map((function(e,n){return o.createElement(r.qh,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,a.A)({},n,{},t,{route:e})):o.createElement(e.component,(0,a.A)({},n,t,{route:e}))}})}))):null}},4625:(e,t,n)=>{"use strict";n.d(t,{Kd:()=>c,N_:()=>g,k2:()=>y});var r=n(6347),a=n(2892),o=n(6540),i=n(9231),l=n(8168),s=n(8587),u=n(1561),c=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.zR)(t.props),t}return(0,a.A)(t,e),t.prototype.render=function(){return o.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(o.Component);o.Component;var d=function(e,t){return"function"==typeof e?e(t):e},f=function(e,t){return"string"==typeof e?(0,i.yJ)(e,null,null,t):e},p=function(e){return e},m=o.forwardRef;void 0===m&&(m=p);var h=m((function(e,t){var n=e.innerRef,r=e.navigate,a=e.onClick,i=(0,s.A)(e,["innerRef","navigate","onClick"]),u=i.target,c=(0,l.A)({},i,{onClick:function(e){try{a&&a(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||u&&"_self"!==u||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return c.ref=p!==m&&t||n,o.createElement("a",c)}));var g=m((function(e,t){var n=e.component,a=void 0===n?h:n,c=e.replace,g=e.to,b=e.innerRef,v=(0,s.A)(e,["component","replace","to","innerRef"]);return o.createElement(r.XZ.Consumer,null,(function(e){e||(0,u.A)(!1);var n=e.history,r=f(d(g,e.location),e.location),s=r?n.createHref(r):"",h=(0,l.A)({},v,{href:s,navigate:function(){var t=d(g,e.location),r=(0,i.AO)(e.location)===(0,i.AO)(f(t));(c||r?n.replace:n.push)(t)}});return p!==m?h.ref=t||b:h.innerRef=b,o.createElement(a,h)}))})),b=function(e){return e},v=o.forwardRef;void 0===v&&(v=b);var y=v((function(e,t){var n=e["aria-current"],a=void 0===n?"page":n,i=e.activeClassName,c=void 0===i?"active":i,p=e.activeStyle,m=e.className,h=e.exact,y=e.isActive,w=e.location,E=e.sensitive,k=e.strict,S=e.style,x=e.to,_=e.innerRef,A=(0,s.A)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return o.createElement(r.XZ.Consumer,null,(function(e){e||(0,u.A)(!1);var n=w||e.location,i=f(d(x,n),n),s=i.pathname,C=s&&s.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),T=C?(0,r.B6)(n.pathname,{path:C,exact:h,sensitive:E,strict:k}):null,O=!!(y?y(T,n):T),L="function"==typeof m?m(O):m,N="function"==typeof S?S(O):S;O&&(L=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(L,c),N=(0,l.A)({},N,p));var P=(0,l.A)({"aria-current":O&&a||null,className:L,style:N,to:i},A);return b!==v?P.ref=t||_:P.innerRef=_,o.createElement(g,P)}))}))},6347:(e,t,n)=>{"use strict";n.d(t,{B6:()=>O,Ix:()=>y,W6:()=>F,XZ:()=>v,dO:()=>D,qh:()=>L,rd:()=>_,zy:()=>$});var r=n(2892),a=n(6540),o=n(5556),i=n.n(o),l=n(9231),s=n(1561),u=n(8168),c=n(5302),d=n.n(c),f=(n(4363),n(8587)),p=(n(4146),1073741823),m="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var h=a.createContext||function(e,t){var n,o,l="__create-react-context-"+function(){var e="__global_unique_id__";return m[e]=(m[e]||0)+1}()+"__",s=function(e){function n(){for(var t,n,r,a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return(t=e.call.apply(e,[this].concat(o))||this).emitter=(n=t.props.value,r=[],{on:function(e){r.push(e)},off:function(e){r=r.filter((function(t){return t!==e}))},get:function(){return n},set:function(e,t){n=e,r.forEach((function(e){return e(n,t)}))}}),t}(0,r.A)(n,e);var a=n.prototype;return a.getChildContext=function(){var e;return(e={})[l]=this.emitter,e},a.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,a=e.value;((o=r)===(i=a)?0!==o||1/o==1/i:o!=o&&i!=i)?n=0:(n="function"==typeof t?t(r,a):p,0!==(n|=0)&&this.emitter.set(e.value,n))}var o,i},a.render=function(){return this.props.children},n}(a.Component);s.childContextTypes=((n={})[l]=i().object.isRequired,n);var u=function(t){function n(){for(var e,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(e=t.call.apply(t,[this].concat(r))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){(0|e.observedBits)&n&&e.setState({value:e.getValue()})},e}(0,r.A)(n,t);var a=n.prototype;return a.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?p:t},a.componentDidMount=function(){this.context[l]&&this.context[l].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?p:e},a.componentWillUnmount=function(){this.context[l]&&this.context[l].off(this.onUpdate)},a.getValue=function(){return this.context[l]?this.context[l].get():e},a.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(a.Component);return u.contextTypes=((o={})[l]=i().object,o),{Provider:s,Consumer:u}},g=function(e){var t=h();return t.displayName=e,t},b=g("Router-History"),v=g("Router"),y=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,r.A)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return a.createElement(v.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},a.createElement(b.Provider,{children:this.props.children||null,value:this.props.history}))},t}(a.Component);a.Component;var w=function(e){function t(){return e.apply(this,arguments)||this}(0,r.A)(t,e);var n=t.prototype;return n.componentDidMount=function(){this.props.onMount&&this.props.onMount.call(this,this)},n.componentDidUpdate=function(e){this.props.onUpdate&&this.props.onUpdate.call(this,this,e)},n.componentWillUnmount=function(){this.props.onUnmount&&this.props.onUnmount.call(this,this)},n.render=function(){return null},t}(a.Component);var E={},k=1e4,S=0;function x(e,t){return void 0===e&&(e="/"),void 0===t&&(t={}),"/"===e?e:function(e){if(E[e])return E[e];var t=d().compile(e);return S<k&&(E[e]=t,S++),t}(e)(t,{pretty:!0})}function _(e){var t=e.computedMatch,n=e.to,r=e.push,o=void 0!==r&&r;return a.createElement(v.Consumer,null,(function(e){e||(0,s.A)(!1);var r=e.history,i=e.staticContext,c=o?r.push:r.replace,d=(0,l.yJ)(t?"string"==typeof n?x(n,t.params):(0,u.A)({},n,{pathname:x(n.pathname,t.params)}):n);return i?(c(d),null):a.createElement(w,{onMount:function(){c(d)},onUpdate:function(e,t){var n=(0,l.yJ)(t.to);(0,l.Fu)(n,(0,u.A)({},d,{key:n.key}))||c(d)},to:n})}))}var A={},C=1e4,T=0;function O(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,a=n.exact,o=void 0!==a&&a,i=n.strict,l=void 0!==i&&i,s=n.sensitive,u=void 0!==s&&s;return[].concat(r).reduce((function(t,n){if(!n&&""!==n)return null;if(t)return t;var r=function(e,t){var n=""+t.end+t.strict+t.sensitive,r=A[n]||(A[n]={});if(r[e])return r[e];var a=[],o={regexp:d()(e,a,t),keys:a};return T<C&&(r[e]=o,T++),o}(n,{end:o,strict:l,sensitive:u}),a=r.regexp,i=r.keys,s=a.exec(e);if(!s)return null;var c=s[0],f=s.slice(1),p=e===c;return o&&!p?null:{path:n,url:"/"===n&&""===c?"/":c,isExact:p,params:i.reduce((function(e,t,n){return e[t.name]=f[n],e}),{})}}),null)}var L=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return a.createElement(v.Consumer,null,(function(t){t||(0,s.A)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?O(n.pathname,e.props):t.match,o=(0,u.A)({},t,{location:n,match:r}),i=e.props,l=i.children,c=i.component,d=i.render;return Array.isArray(l)&&function(e){return 0===a.Children.count(e)}(l)&&(l=null),a.createElement(v.Provider,{value:o},o.match?l?"function"==typeof l?l(o):l:c?a.createElement(c,o):d?d(o):null:"function"==typeof l?l(o):null)}))},t}(a.Component);function N(e){return"/"===e.charAt(0)?e:"/"+e}function P(e,t){if(!e)return t;var n=N(e);return 0!==t.pathname.indexOf(n)?t:(0,u.A)({},t,{pathname:t.pathname.substr(n.length)})}function R(e){return"string"==typeof e?e:(0,l.AO)(e)}function I(e){return function(){(0,s.A)(!1)}}function M(){}a.Component;var D=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return a.createElement(v.Consumer,null,(function(t){t||(0,s.A)(!1);var n,r,o=e.props.location||t.location;return a.Children.forEach(e.props.children,(function(e){if(null==r&&a.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?O(o.pathname,(0,u.A)({},e.props,{path:i})):t.match}})),r?a.cloneElement(n,{location:o,computedMatch:r}):null}))},t}(a.Component);var B=a.useContext;function F(){return B(b)}function $(){return B(v).location}},5287:(e,t,n)=>{"use strict";var r=n(5228),a=60103,o=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var i=60109,l=60110,s=60112;t.Suspense=60113;var u=60115,c=60116;if("function"==typeof Symbol&&Symbol.for){var d=Symbol.for;a=d("react.element"),o=d("react.portal"),t.Fragment=d("react.fragment"),t.StrictMode=d("react.strict_mode"),t.Profiler=d("react.profiler"),i=d("react.provider"),l=d("react.context"),s=d("react.forward_ref"),t.Suspense=d("react.suspense"),u=d("react.memo"),c=d("react.lazy")}var f="function"==typeof Symbol&&Symbol.iterator;function p(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h={};function g(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||m}function b(){}function v(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||m}g.prototype.isReactComponent={},g.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error(p(85));this.updater.enqueueSetState(this,e,t,"setState")},g.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},b.prototype=g.prototype;var y=v.prototype=new b;y.constructor=v,r(y,g.prototype),y.isPureReactComponent=!0;var w={current:null},E=Object.prototype.hasOwnProperty,k={key:!0,ref:!0,__self:!0,__source:!0};function S(e,t,n){var r,o={},i=null,l=null;if(null!=t)for(r in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(i=""+t.key),t)E.call(t,r)&&!k.hasOwnProperty(r)&&(o[r]=t[r]);var s=arguments.length-2;if(1===s)o.children=n;else if(1<s){for(var u=Array(s),c=0;c<s;c++)u[c]=arguments[c+2];o.children=u}if(e&&e.defaultProps)for(r in s=e.defaultProps)void 0===o[r]&&(o[r]=s[r]);return{$$typeof:a,type:e,key:i,ref:l,props:o,_owner:w.current}}function x(e){return"object"==typeof e&&null!==e&&e.$$typeof===a}var _=/\/+/g;function A(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function C(e,t,n,r,i){var l=typeof e;"undefined"!==l&&"boolean"!==l||(e=null);var s=!1;if(null===e)s=!0;else switch(l){case"string":case"number":s=!0;break;case"object":switch(e.$$typeof){case a:case o:s=!0}}if(s)return i=i(s=e),e=""===r?"."+A(s,0):r,Array.isArray(i)?(n="",null!=e&&(n=e.replace(_,"$&/")+"/"),C(i,t,n,"",(function(e){return e}))):null!=i&&(x(i)&&(i=function(e,t){return{$$typeof:a,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,n+(!i.key||s&&s.key===i.key?"":(""+i.key).replace(_,"$&/")+"/")+e)),t.push(i)),1;if(s=0,r=""===r?".":r+":",Array.isArray(e))for(var u=0;u<e.length;u++){var c=r+A(l=e[u],u);s+=C(l,t,n,c,i)}else if(c=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=f&&e[f]||e["@@iterator"])?e:null}(e),"function"==typeof c)for(e=c.call(e),u=0;!(l=e.next()).done;)s+=C(l=l.value,t,n,c=r+A(l,u++),i);else if("object"===l)throw t=""+e,Error(p(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return s}function T(e,t,n){if(null==e)return e;var r=[],a=0;return C(e,r,"","",(function(e){return t.call(n,e,a++)})),r}function O(e){if(-1===e._status){var t=e._result;t=t(),e._status=0,e._result=t,t.then((function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)}),(function(t){0===e._status&&(e._status=2,e._result=t)}))}if(1===e._status)return e._result;throw e._result}var L={current:null};function N(){var e=L.current;if(null===e)throw Error(p(321));return e}var P={ReactCurrentDispatcher:L,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:w,IsSomeRendererActing:{current:!1},assign:r};t.Children={map:T,forEach:function(e,t,n){T(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return T(e,(function(){t++})),t},toArray:function(e){return T(e,(function(e){return e}))||[]},only:function(e){if(!x(e))throw Error(p(143));return e}},t.Component=g,t.PureComponent=v,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=P,t.cloneElement=function(e,t,n){if(null==e)throw Error(p(267,e));var o=r({},e.props),i=e.key,l=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(l=t.ref,s=w.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var u=e.type.defaultProps;for(c in t)E.call(t,c)&&!k.hasOwnProperty(c)&&(o[c]=void 0===t[c]&&void 0!==u?u[c]:t[c])}var c=arguments.length-2;if(1===c)o.children=n;else if(1<c){u=Array(c);for(var d=0;d<c;d++)u[d]=arguments[d+2];o.children=u}return{$$typeof:a,type:e.type,key:i,ref:l,props:o,_owner:s}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:l,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=S,t.createFactory=function(e){var t=S.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:s,render:e}},t.isValidElement=x,t.lazy=function(e){return{$$typeof:c,_payload:{_status:-1,_result:e},_init:O}},t.memo=function(e,t){return{$$typeof:u,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return N().useCallback(e,t)},t.useContext=function(e,t){return N().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return N().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return N().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return N().useLayoutEffect(e,t)},t.useMemo=function(e,t){return N().useMemo(e,t)},t.useReducer=function(e,t,n){return N().useReducer(e,t,n)},t.useRef=function(e){return N().useRef(e)},t.useState=function(e){return N().useState(e)},t.version="17.0.2"},6540:(e,t,n)=>{"use strict";e.exports=n(5287)},7463:(e,t)=>{"use strict";var n,r,a,o;if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var l=Date,s=l.now();t.unstable_now=function(){return l.now()-s}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var u=null,c=null,d=function(){if(null!==u)try{var e=t.unstable_now();u(!0,e),u=null}catch(n){throw setTimeout(d,0),n}};n=function(e){null!==u?setTimeout(n,0,e):(u=e,setTimeout(d,0))},r=function(e,t){c=setTimeout(e,t)},a=function(){clearTimeout(c)},t.unstable_shouldYield=function(){return!1},o=t.unstable_forceFrameRate=function(){}}else{var f=window.setTimeout,p=window.clearTimeout;if("undefined"!=typeof console){var m=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof m&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var h=!1,g=null,b=-1,v=5,y=0;t.unstable_shouldYield=function(){return t.unstable_now()>=y},o=function(){},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):v=0<e?Math.floor(1e3/e):5};var w=new MessageChannel,E=w.port2;w.port1.onmessage=function(){if(null!==g){var e=t.unstable_now();y=e+v;try{g(!0,e)?E.postMessage(null):(h=!1,g=null)}catch(n){throw E.postMessage(null),n}}else h=!1},n=function(e){g=e,h||(h=!0,E.postMessage(null))},r=function(e,n){b=f((function(){e(t.unstable_now())}),n)},a=function(){p(b),b=-1}}function k(e,t){var n=e.length;e.push(t);e:for(;;){var r=n-1>>>1,a=e[r];if(!(void 0!==a&&0<_(a,t)))break e;e[r]=t,e[n]=a,n=r}}function S(e){return void 0===(e=e[0])?null:e}function x(e){var t=e[0];if(void 0!==t){var n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,a=e.length;r<a;){var o=2*(r+1)-1,i=e[o],l=o+1,s=e[l];if(void 0!==i&&0>_(i,n))void 0!==s&&0>_(s,i)?(e[r]=s,e[l]=n,r=l):(e[r]=i,e[o]=n,r=o);else{if(!(void 0!==s&&0>_(s,n)))break e;e[r]=s,e[l]=n,r=l}}}return t}return null}function _(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var A=[],C=[],T=1,O=null,L=3,N=!1,P=!1,R=!1;function I(e){for(var t=S(C);null!==t;){if(null===t.callback)x(C);else{if(!(t.startTime<=e))break;x(C),t.sortIndex=t.expirationTime,k(A,t)}t=S(C)}}function M(e){if(R=!1,I(e),!P)if(null!==S(A))P=!0,n(D);else{var t=S(C);null!==t&&r(M,t.startTime-e)}}function D(e,n){P=!1,R&&(R=!1,a()),N=!0;var o=L;try{for(I(n),O=S(A);null!==O&&(!(O.expirationTime>n)||e&&!t.unstable_shouldYield());){var i=O.callback;if("function"==typeof i){O.callback=null,L=O.priorityLevel;var l=i(O.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?O.callback=l:O===S(A)&&x(A),I(n)}else x(A);O=S(A)}if(null!==O)var s=!0;else{var u=S(C);null!==u&&r(M,u.startTime-n),s=!1}return s}finally{O=null,L=o,N=!1}}var B=o;t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){P||N||(P=!0,n(D))},t.unstable_getCurrentPriorityLevel=function(){return L},t.unstable_getFirstCallbackNode=function(){return S(A)},t.unstable_next=function(e){switch(L){case 1:case 2:case 3:var t=3;break;default:t=L}var n=L;L=t;try{return e()}finally{L=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=B,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=L;L=e;try{return t()}finally{L=n}},t.unstable_scheduleCallback=function(e,o,i){var l=t.unstable_now();switch("object"==typeof i&&null!==i?i="number"==typeof(i=i.delay)&&0<i?l+i:l:i=l,e){case 1:var s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;default:s=5e3}return e={id:T++,callback:o,priorityLevel:e,startTime:i,expirationTime:s=i+s,sortIndex:-1},i>l?(e.sortIndex=i,k(C,e),null===S(A)&&e===S(C)&&(R?a():R=!0,r(M,i-l))):(e.sortIndex=s,k(A,e),P||N||(P=!0,n(D))),e},t.unstable_wrapCallback=function(e){var t=L;return function(){var n=L;L=t;try{return e.apply(this,arguments)}finally{L=n}}}},9982:(e,t,n)=>{"use strict";e.exports=n(7463)},2833:e=>{e.exports=function(e,t,n,r){var a=n?n.call(r,e,t):void 0;if(void 0!==a)return!!a;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(t),s=0;s<o.length;s++){var u=o[s];if(!l(u))return!1;var c=e[u],d=t[u];if(!1===(a=n?n.call(r,c,d,u):void 0)||void 0===a&&c!==d)return!1}return!0}},1063:(e,t,n)=>{"use strict";var r=n(6540);var a="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=r.useState,i=r.useEffect,l=r.useLayoutEffect,s=r.useDebugValue;function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!a(e,n)}catch(r){return!0}}var c="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(e,t){var n=t(),r=o({inst:{value:n,getSnapshot:t}}),a=r[0].inst,c=r[1];return l((function(){a.value=n,a.getSnapshot=t,u(a)&&c({inst:a})}),[e,n,t]),i((function(){return u(a)&&c({inst:a}),e((function(){u(a)&&c({inst:a})}))}),[e]),s(n),n};t.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:c},9888:(e,t,n)=>{"use strict";e.exports=n(1063)},4784:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"Cosmos Hub",tagline:"",favicon:"/img/hub.svg",url:"https://hub.cosmos.network",baseUrl:"/",organizationName:"Cosmos",projectName:"Gaia",onBrokenLinks:"warn",onBrokenMarkdownLinks:"warn",trailingSlash:!1,i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},scripts:[{src:"https://kit.fontawesome.com/401fb1e734.js",crossorigin:"anonymous"}],presets:[["classic",{docs:{routeBasePath:"/",sidebarPath:"/home/runner/work/gaia/gaia/docs/sidebars.js",versions:{current:{path:"main",label:"Latest",banner:"none"}}},sitemap:{changefreq:"weekly",priority:.5,ignorePatterns:["/tags/**"],filename:"sitemap.xml"},blog:!1,theme:{customCss:"/home/runner/work/gaia/gaia/docs/src/css/custom.css"},gtag:{trackingID:"G-EB7MEE3TJ1",anonymizeIP:!0}}]],themeConfig:{image:"img/banner.jpg",docs:{sidebar:{autoCollapseCategories:!0,hideable:!0},versionPersistence:"localStorage"},navbar:{title:"Cosmos Hub",hideOnScroll:!1,logo:{alt:"Cosmos Hub Logo",src:"img/hub.svg",href:"/",target:"_self"},items:[{type:"dropdown",label:"Community",position:"right",items:[{href:"https://github.com/cosmos/gaia",html:'<i class="fa-fw fa-brands fa-github"></i> Github'},{href:"https://twitter.com/cosmoshub",html:'<i class="fa-fw fa-brands fa-twitter"></i> Twitter'},{href:"https://discord.gg/interchain",html:'<i class="fa-fw fa-brands fa-discord"></i> Discord'},{href:"https://forum.cosmos.network/",html:'<i class="fa-fw fa-regular fa-comments"></i> Forum'},{href:"https://reddit.com/r/cosmosnetwork",html:'<i class="fa-fw fa-brands fa-reddit"></i> Reddit'},{href:"https://www.youtube.com/c/CosmosProject",html:'<i class="fa-fw fa-brands fa-youtube"></i> YouTube'}]},{type:"docsVersionDropdown",position:"left",dropdownItemsAfter:[{href:"https://github.com/cosmos/gaia/tree/legacy-docs",label:"Archive",target:"_blank"}],dropdownItemsBefore:[]}]},footer:{style:"dark",links:[{items:[{html:'<a href="https://cosmos.network"><img src="/img/logo-bw-inverse.svg" alt="Cosmos Logo"></a>'}],title:null},{title:"Documentation",items:[{label:"Cosmos SDK",href:"https://docs.cosmos.network/"},{label:"CometBFT",href:"https://docs.cometbft.com/"},{label:"IBC-Go",href:"https://ibc.cosmos.network/"},{label:"Interchain Security",href:"https://cosmos.github.io/interchain-security/"}]},{title:"Community",items:[{label:"Forum",href:"https://forum.cosmos.network/"},{label:"Discord",href:"https://discord.gg/interchain"},{label:"Reddit",href:"https://reddit.com/r/cosmosnetwork"},{label:"Blog",href:"https://blog.cosmos.network/"}]},{title:"Social",items:[{label:"Twitter",href:"https://twitter.com/cosmoshub"},{label:"Youtube",href:"https://www.youtube.com/c/CosmosProject"},{label:"Telegram",href:"https://t.me/cosmosproject"}]}],copyright:"This website is maintained by Interchain Foundation & Informal Systems. The contents and opinions of this website are those of Interchain Foundation & Informal Systems."},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:["protobuf","go-module"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},algolia:{appId:"9AHLYCX3HA",apiKey:"976ab1e596812cf4fbe21a3d4d1c9830",indexName:"cosmos_network",contextualSearch:!1,searchParameters:{},searchPagePath:"search"},colorMode:{defaultMode:"light",disableSwitch:!1,respectPrefersColorScheme:!1},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},themes:["@you54f/theme-github-codeblock"],plugins:[null,["@docusaurus/plugin-client-redirects",{fromExtensions:["html"],toExtensions:["html"],redirects:[{from:["/"],to:"/main"}]}]],baseUrlIssueBanner:!0,onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{mermaid:!1}}},8168:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(this,arguments)}n.d(t,{A:()=>r})},2892:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function a(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{A:()=>a})},8587:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}n.d(t,{A:()=>r})},1561:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=!0,a="Invariant failed";function o(e,t){if(!e){if(r)throw new Error(a);var n="function"==typeof t?t():t,o=n?"".concat(a,": ").concat(n):a;throw new Error(o)}}},2654:e=>{"use strict";e.exports={}},4054:e=>{"use strict";e.exports=JSON.parse('{"/search-6a9":{"__comp":"1a4e3797","__context":{"plugin":"5d489d3c"}},"/main-ed7":{"__comp":"1be78505","__context":{"plugin":"1ca1b9c8"},"versionMetadata":"935f2afb"},"/main-87c":{"__comp":"17896441","content":"c377a04b"},"/main/architecture-df6":{"__comp":"17896441","content":"4b7d5026"},"/main/architecture/adr-174":{"__comp":"17896441","content":"8c40170f"},"/main/architecture/adr/adr-001-interchain-accounts-bcd":{"__comp":"17896441","content":"4e1cbcac"},"/main/architecture/adr/adr-002-globalfee-8da":{"__comp":"17896441","content":"0b65cac9"},"/main/architecture/adr/adr-003-ica-controller-47f":{"__comp":"17896441","content":"3de875ef"},"/main/architecture/adr/PROCESS-229":{"__comp":"17896441","content":"d3580699"},"/main/architecture/PROCESS-939":{"__comp":"17896441","content":"0ce6bca3"},"/main/architecture/templates/adr-template-112":{"__comp":"17896441","content":"25a82047"},"/main/delegators-715":{"__comp":"17896441","content":"62b775bc"},"/main/delegators/delegator-faq-e43":{"__comp":"17896441","content":"68580c81"},"/main/delegators/delegator-guide-cli-ec4":{"__comp":"17896441","content":"b78d3fc1"},"/main/delegators/delegator-security-c39":{"__comp":"17896441","content":"8bdc3bda"},"/main/getting-started-df2":{"__comp":"17896441","content":"a2135033"},"/main/getting-started/installation-218":{"__comp":"17896441","content":"54f44165"},"/main/getting-started/quickstart-42f":{"__comp":"17896441","content":"fbd7a87c"},"/main/getting-started/system-requirements-fc6":{"__comp":"17896441","content":"69e61f52"},"/main/getting-started/what-is-gaia-c86":{"__comp":"17896441","content":"f5cf8579"},"/main/governance-d66":{"__comp":"17896441","content":"d56e8623"},"/main/governance/best-practices-9f1":{"__comp":"17896441","content":"fb286465"},"/main/governance/formatting-b14":{"__comp":"17896441","content":"1094a517"},"/main/governance/process-ab8":{"__comp":"17896441","content":"43353076"},"/main/governance/proposal-types-3da":{"__comp":"17896441","content":"edd0fe92"},"/main/governance/proposal-types/community-pool-spend-184":{"__comp":"17896441","content":"f165f987"},"/main/governance/proposal-types/param-change-514":{"__comp":"17896441","content":"efb78e80"},"/main/governance/proposal-types/software-upgrade-e15":{"__comp":"17896441","content":"f2660785"},"/main/governance/proposal-types/text-prop-ee4":{"__comp":"17896441","content":"a56f5018"},"/main/governance/submitting-e5f":{"__comp":"17896441","content":"41f2894c"},"/main/hub-tutorials-f75":{"__comp":"17896441","content":"4bf737c3"},"/main/hub-tutorials/gaiad-d7b":{"__comp":"17896441","content":"2dd09b7f"},"/main/hub-tutorials/join-mainnet-a68":{"__comp":"17896441","content":"f4352eb0"},"/main/hub-tutorials/join-testnet-938":{"__comp":"17896441","content":"fb13cd97"},"/main/hub-tutorials/live-upgrade-tutorial-57e":{"__comp":"17896441","content":"5fd51807"},"/main/hub-tutorials/upgrade-node-ee3":{"__comp":"17896441","content":"62f354e1"},"/main/interchain-security-028":{"__comp":"17896441","content":"66cfa501"},"/main/modules-cfc":{"__comp":"17896441","content":"6e233af6"},"/main/modules/lsm-staking-c2b":{"__comp":"17896441","content":"12e4c223"},"/main/modules/metaprotocols-bf0":{"__comp":"17896441","content":"9ade351a"},"/main/resources-280":{"__comp":"17896441","content":"9157a56f"},"/main/resources/archives-919":{"__comp":"17896441","content":"446bc915"},"/main/resources/genesis-036":{"__comp":"17896441","content":"7b940702"},"/main/resources/hd-wallets-67c":{"__comp":"17896441","content":"b6d5a092"},"/main/resources/ledger-f4a":{"__comp":"17896441","content":"7b876406"},"/main/resources/reproducible-builds-7ef":{"__comp":"17896441","content":"2222b3a9"},"/main/resources/service-providers-c0f":{"__comp":"17896441","content":"6294a1b0"},"/main/validators-145":{"__comp":"17896441","content":"3a859fe7"},"/main/validators/kms-b91":{"__comp":"17896441","content":"2d8dbdf9"},"/main/validators/kms/kms_ledger-090":{"__comp":"17896441","content":"c5a35911"},"/main/validators/overview-c52":{"__comp":"17896441","content":"f6addb2b"},"/main/validators/security-3fb":{"__comp":"17896441","content":"bcd9d779"},"/main/validators/validator-faq-d18":{"__comp":"17896441","content":"e48b7f5f"},"/main/validators/validator-setup-6e6":{"__comp":"17896441","content":"781312e5"},"/-62b":{"__comp":"c4f5d8e4","__context":{"plugin":"8e6759d2"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[1869],(()=>{return t=8536,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.6b3d2fac.js.LICENSE.txt b/assets/js/main.6b3d2fac.js.LICENSE.txt new file mode 100644 index 00000000000..eb75d69107c --- /dev/null +++ b/assets/js/main.6b3d2fac.js.LICENSE.txt @@ -0,0 +1,63 @@ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + +/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT */ + +/** + * @license React + * use-sync-external-store-shim.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT <https://opensource.org/licenses/MIT> + * @author Lea Verou <https://lea.verou.me> + * @namespace + * @public + */ + +/** @license React v0.20.2 + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.1 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v17.0.2 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v17.0.2 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/assets/js/runtime~main.84ea1227.js b/assets/js/runtime~main.84ea1227.js new file mode 100644 index 00000000000..31a9ad5b6a1 --- /dev/null +++ b/assets/js/runtime~main.84ea1227.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,f,a,c,d,t={},r={};function b(e){var f=r[e];if(void 0!==f)return f.exports;var a=r[e]={exports:{}};return t[e].call(a.exports,a,a.exports,b),a.exports}b.m=t,e=[],b.O=(f,a,c,d)=>{if(!a){var t=1/0;for(i=0;i<e.length;i++){a=e[i][0],c=e[i][1],d=e[i][2];for(var r=!0,o=0;o<a.length;o++)(!1&d||t>=d)&&Object.keys(b.O).every((e=>b.O[e](a[o])))?a.splice(o--,1):(r=!1,d<t&&(t=d));if(r){e.splice(i--,1);var n=c();void 0!==n&&(f=n)}}return f}d=d||0;for(var i=e.length;i>0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[a,c,d]},b.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return b.d(f,{a:f}),f},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,b.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var d=Object.create(null);b.r(d);var t={};f=f||[null,a({}),a([]),a(a)];for(var r=2&c&&e;"object"==typeof r&&!~f.indexOf(r);r=a(r))Object.getOwnPropertyNames(r).forEach((f=>t[f]=()=>e[f]));return t.default=()=>e,b.d(d,t),d},b.d=(e,f)=>{for(var a in f)b.o(f,a)&&!b.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:f[a]})},b.f={},b.e=e=>Promise.all(Object.keys(b.f).reduce(((f,a)=>(b.f[a](e,f),f)),[])),b.u=e=>"assets/js/"+({35:"66cfa501",253:"efb78e80",587:"62f354e1",791:"4e1cbcac",960:"b6d5a092",1046:"7b940702",1236:"2d8dbdf9",1361:"fbd7a87c",1424:"2222b3a9",1671:"d3580699",2045:"69e61f52",2138:"1a4e3797",2424:"68580c81",2472:"f4352eb0",2634:"c4f5d8e4",2644:"bcd9d779",2650:"8c40170f",3032:"3de875ef",3295:"3a859fe7",3350:"f5cf8579",3684:"41f2894c",3818:"f6addb2b",3819:"1ca1b9c8",4036:"0ce6bca3",4163:"a2135033",4165:"b78d3fc1",4704:"4bf737c3",4731:"2dd09b7f",4986:"9ade351a",5098:"25a82047",5159:"8e6759d2",5608:"8bdc3bda",5643:"9157a56f",5742:"c377a04b",5967:"c5a35911",6112:"fb286465",6331:"5fd51807",6542:"d56e8623",6708:"e48b7f5f",6745:"446bc915",6840:"6294a1b0",7169:"6e233af6",7335:"62b775bc",7669:"a56f5018",7799:"7b876406",7826:"fb13cd97",7870:"edd0fe92",7915:"4b7d5026",7924:"54f44165",7999:"12e4c223",8070:"0b65cac9",8257:"5d489d3c",8401:"17896441",8581:"935f2afb",8606:"43353076",8637:"1094a517",8714:"1be78505",9053:"781312e5",9737:"f2660785",9743:"f165f987"}[e]||e)+"."+{35:"abec7ff9",253:"cc101548",416:"e12d54c2",587:"feac769b",791:"8af50437",960:"f0ffe981",1046:"cc2454a5",1236:"a6290c53",1361:"bcce9ca2",1424:"4211f90b",1671:"eba85ceb",1774:"97f6cb51",2045:"b4811c42",2138:"08548001",2424:"58bea881",2472:"22438c82",2634:"fcc81489",2644:"78ddfd17",2650:"b074362e",3032:"6f15223f",3295:"099eea37",3350:"3d0f96c8",3684:"8e130019",3818:"f6296bc3",3819:"c508c078",4036:"7f4755fc",4163:"5ee0f453",4165:"fbebe30c",4704:"30a03efb",4731:"cbaaf380",4986:"168bdbfb",5098:"7d108c6b",5159:"7651f18b",5608:"45ad097f",5643:"5c072d3b",5742:"731fd0c6",5967:"9436f1cc",6112:"db999e83",6331:"8fef9132",6542:"c789244d",6708:"5b620ce3",6745:"c89b5aa8",6840:"1ce4e36d",7169:"35cb3878",7335:"4dabb2fb",7669:"9552f7c6",7799:"be75b00c",7826:"67cc25d5",7870:"15df109d",7915:"a025ab50",7924:"2dc69c8d",7999:"ed97c2bf",8070:"f1102805",8257:"f34e6f03",8401:"c0ae458d",8581:"0e1a73cd",8606:"6fe88653",8637:"78d19757",8714:"78a5a7fc",8913:"41732d83",9053:"32264991",9462:"9ef19974",9737:"03184e19",9743:"176e879b"}[e]+".js",b.miniCssF=e=>{},b.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),b.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),c={},d="cosmos-hub-docs-site:",b.l=(e,f,a,t)=>{if(c[e])c[e].push(f);else{var r,o;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==d+a){r=u;break}}r||(o=!0,(r=document.createElement("script")).charset="utf-8",r.timeout=120,b.nc&&r.setAttribute("nonce",b.nc),r.setAttribute("data-webpack",d+a),r.src=e),c[e]=[f];var s=(f,a)=>{r.onerror=r.onload=null,clearTimeout(l);var d=c[e];if(delete c[e],r.parentNode&&r.parentNode.removeChild(r),d&&d.forEach((e=>e(a))),f)return f(a)},l=setTimeout(s.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=s.bind(null,r.onerror),r.onload=s.bind(null,r.onload),o&&document.head.appendChild(r)}},b.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},b.p="/",b.gca=function(e){return e={17896441:"8401",43353076:"8606","66cfa501":"35",efb78e80:"253","62f354e1":"587","4e1cbcac":"791",b6d5a092:"960","7b940702":"1046","2d8dbdf9":"1236",fbd7a87c:"1361","2222b3a9":"1424",d3580699:"1671","69e61f52":"2045","1a4e3797":"2138","68580c81":"2424",f4352eb0:"2472",c4f5d8e4:"2634",bcd9d779:"2644","8c40170f":"2650","3de875ef":"3032","3a859fe7":"3295",f5cf8579:"3350","41f2894c":"3684",f6addb2b:"3818","1ca1b9c8":"3819","0ce6bca3":"4036",a2135033:"4163",b78d3fc1:"4165","4bf737c3":"4704","2dd09b7f":"4731","9ade351a":"4986","25a82047":"5098","8e6759d2":"5159","8bdc3bda":"5608","9157a56f":"5643",c377a04b:"5742",c5a35911:"5967",fb286465:"6112","5fd51807":"6331",d56e8623:"6542",e48b7f5f:"6708","446bc915":"6745","6294a1b0":"6840","6e233af6":"7169","62b775bc":"7335",a56f5018:"7669","7b876406":"7799",fb13cd97:"7826",edd0fe92:"7870","4b7d5026":"7915","54f44165":"7924","12e4c223":"7999","0b65cac9":"8070","5d489d3c":"8257","935f2afb":"8581","1094a517":"8637","1be78505":"8714","781312e5":"9053",f2660785:"9737",f165f987:"9743"}[e]||e,b.p+b.u(e)},(()=>{var e={5354:0,1869:0};b.f.j=(f,a)=>{var c=b.o(e,f)?e[f]:void 0;if(0!==c)if(c)a.push(c[2]);else if(/^(1869|5354)$/.test(f))e[f]=0;else{var d=new Promise(((a,d)=>c=e[f]=[a,d]));a.push(c[2]=d);var t=b.p+b.u(f),r=new Error;b.l(t,(a=>{if(b.o(e,f)&&(0!==(c=e[f])&&(e[f]=void 0),c)){var d=a&&("load"===a.type?"missing":a.type),t=a&&a.target&&a.target.src;r.message="Loading chunk "+f+" failed.\n("+d+": "+t+")",r.name="ChunkLoadError",r.type=d,r.request=t,c[1](r)}}),"chunk-"+f,f)}},b.O.j=f=>0===e[f];var f=(f,a)=>{var c,d,t=a[0],r=a[1],o=a[2],n=0;if(t.some((f=>0!==e[f]))){for(c in r)b.o(r,c)&&(b.m[c]=r[c]);if(o)var i=o(b)}for(f&&f(a);n<t.length;n++)d=t[n],b.o(e,d)&&e[d]&&e[d][0](),e[d]=0;return b.O(i)},a=self.webpackChunkcosmos_hub_docs_site=self.webpackChunkcosmos_hub_docs_site||[];a.forEach(f.bind(null,0)),a.push=f.bind(null,a.push.bind(a))})()})(); \ No newline at end of file diff --git a/fonts/inter/Inter-Black.woff b/fonts/inter/Inter-Black.woff new file mode 100644 index 00000000000..a18593a096e Binary files /dev/null and b/fonts/inter/Inter-Black.woff differ diff --git a/fonts/inter/Inter-Black.woff2 b/fonts/inter/Inter-Black.woff2 new file mode 100644 index 00000000000..68f64c9ed98 Binary files /dev/null and b/fonts/inter/Inter-Black.woff2 differ diff --git a/fonts/inter/Inter-BlackItalic.woff b/fonts/inter/Inter-BlackItalic.woff new file mode 100644 index 00000000000..b6b01943d9f Binary files /dev/null and b/fonts/inter/Inter-BlackItalic.woff differ diff --git a/fonts/inter/Inter-BlackItalic.woff2 b/fonts/inter/Inter-BlackItalic.woff2 new file mode 100644 index 00000000000..1c9c7ca8b04 Binary files /dev/null and b/fonts/inter/Inter-BlackItalic.woff2 differ diff --git a/fonts/inter/Inter-Bold.woff b/fonts/inter/Inter-Bold.woff new file mode 100644 index 00000000000..eaf3d4bfd7d Binary files /dev/null and b/fonts/inter/Inter-Bold.woff differ diff --git a/fonts/inter/Inter-Bold.woff2 b/fonts/inter/Inter-Bold.woff2 new file mode 100644 index 00000000000..2846f29cc8a Binary files /dev/null and b/fonts/inter/Inter-Bold.woff2 differ diff --git a/fonts/inter/Inter-BoldItalic.woff b/fonts/inter/Inter-BoldItalic.woff new file mode 100644 index 00000000000..32750761640 Binary files /dev/null and b/fonts/inter/Inter-BoldItalic.woff differ diff --git a/fonts/inter/Inter-BoldItalic.woff2 b/fonts/inter/Inter-BoldItalic.woff2 new file mode 100644 index 00000000000..0b1fe8e1255 Binary files /dev/null and b/fonts/inter/Inter-BoldItalic.woff2 differ diff --git a/fonts/inter/Inter-ExtraBold.woff b/fonts/inter/Inter-ExtraBold.woff new file mode 100644 index 00000000000..c2c17edead6 Binary files /dev/null and b/fonts/inter/Inter-ExtraBold.woff differ diff --git a/fonts/inter/Inter-ExtraBold.woff2 b/fonts/inter/Inter-ExtraBold.woff2 new file mode 100644 index 00000000000..c24c2bdc2f0 Binary files /dev/null and b/fonts/inter/Inter-ExtraBold.woff2 differ diff --git a/fonts/inter/Inter-ExtraBoldItalic.woff b/fonts/inter/Inter-ExtraBoldItalic.woff new file mode 100644 index 00000000000..c42f70526c8 Binary files /dev/null and b/fonts/inter/Inter-ExtraBoldItalic.woff differ diff --git a/fonts/inter/Inter-ExtraBoldItalic.woff2 b/fonts/inter/Inter-ExtraBoldItalic.woff2 new file mode 100644 index 00000000000..4a81dc79826 Binary files /dev/null and b/fonts/inter/Inter-ExtraBoldItalic.woff2 differ diff --git a/fonts/inter/Inter-ExtraLight.woff b/fonts/inter/Inter-ExtraLight.woff new file mode 100644 index 00000000000..d0de5f3973e Binary files /dev/null and b/fonts/inter/Inter-ExtraLight.woff differ diff --git a/fonts/inter/Inter-ExtraLight.woff2 b/fonts/inter/Inter-ExtraLight.woff2 new file mode 100644 index 00000000000..f2ea706fafa Binary files /dev/null and b/fonts/inter/Inter-ExtraLight.woff2 differ diff --git a/fonts/inter/Inter-ExtraLightItalic.woff b/fonts/inter/Inter-ExtraLightItalic.woff new file mode 100644 index 00000000000..81f1a28ef55 Binary files /dev/null and b/fonts/inter/Inter-ExtraLightItalic.woff differ diff --git a/fonts/inter/Inter-ExtraLightItalic.woff2 b/fonts/inter/Inter-ExtraLightItalic.woff2 new file mode 100644 index 00000000000..9af717ba91b Binary files /dev/null and b/fonts/inter/Inter-ExtraLightItalic.woff2 differ diff --git a/fonts/inter/Inter-Italic.woff b/fonts/inter/Inter-Italic.woff new file mode 100644 index 00000000000..a806b382012 Binary files /dev/null and b/fonts/inter/Inter-Italic.woff differ diff --git a/fonts/inter/Inter-Italic.woff2 b/fonts/inter/Inter-Italic.woff2 new file mode 100644 index 00000000000..a619fc54861 Binary files /dev/null and b/fonts/inter/Inter-Italic.woff2 differ diff --git a/fonts/inter/Inter-Light.woff b/fonts/inter/Inter-Light.woff new file mode 100644 index 00000000000..c496464d02d Binary files /dev/null and b/fonts/inter/Inter-Light.woff differ diff --git a/fonts/inter/Inter-Light.woff2 b/fonts/inter/Inter-Light.woff2 new file mode 100644 index 00000000000..bc4be6658b0 Binary files /dev/null and b/fonts/inter/Inter-Light.woff2 differ diff --git a/fonts/inter/Inter-LightItalic.woff b/fonts/inter/Inter-LightItalic.woff new file mode 100644 index 00000000000..f84a9de35e8 Binary files /dev/null and b/fonts/inter/Inter-LightItalic.woff differ diff --git a/fonts/inter/Inter-LightItalic.woff2 b/fonts/inter/Inter-LightItalic.woff2 new file mode 100644 index 00000000000..842b2dfcb77 Binary files /dev/null and b/fonts/inter/Inter-LightItalic.woff2 differ diff --git a/fonts/inter/Inter-Medium.woff b/fonts/inter/Inter-Medium.woff new file mode 100644 index 00000000000..d546843f283 Binary files /dev/null and b/fonts/inter/Inter-Medium.woff differ diff --git a/fonts/inter/Inter-Medium.woff2 b/fonts/inter/Inter-Medium.woff2 new file mode 100644 index 00000000000..f92498a2ecf Binary files /dev/null and b/fonts/inter/Inter-Medium.woff2 differ diff --git a/fonts/inter/Inter-MediumItalic.woff b/fonts/inter/Inter-MediumItalic.woff new file mode 100644 index 00000000000..459a6568898 Binary files /dev/null and b/fonts/inter/Inter-MediumItalic.woff differ diff --git a/fonts/inter/Inter-MediumItalic.woff2 b/fonts/inter/Inter-MediumItalic.woff2 new file mode 100644 index 00000000000..0e3019f4ae7 Binary files /dev/null and b/fonts/inter/Inter-MediumItalic.woff2 differ diff --git a/fonts/inter/Inter-Regular.woff b/fonts/inter/Inter-Regular.woff new file mode 100644 index 00000000000..62d3a618710 Binary files /dev/null and b/fonts/inter/Inter-Regular.woff differ diff --git a/fonts/inter/Inter-Regular.woff2 b/fonts/inter/Inter-Regular.woff2 new file mode 100644 index 00000000000..6c2b6893d59 Binary files /dev/null and b/fonts/inter/Inter-Regular.woff2 differ diff --git a/fonts/inter/Inter-SemiBold.woff b/fonts/inter/Inter-SemiBold.woff new file mode 100644 index 00000000000..a815f43a91f Binary files /dev/null and b/fonts/inter/Inter-SemiBold.woff differ diff --git a/fonts/inter/Inter-SemiBold.woff2 b/fonts/inter/Inter-SemiBold.woff2 new file mode 100644 index 00000000000..611e90c958f Binary files /dev/null and b/fonts/inter/Inter-SemiBold.woff2 differ diff --git a/fonts/inter/Inter-SemiBoldItalic.woff b/fonts/inter/Inter-SemiBoldItalic.woff new file mode 100644 index 00000000000..909e43a97d8 Binary files /dev/null and b/fonts/inter/Inter-SemiBoldItalic.woff differ diff --git a/fonts/inter/Inter-SemiBoldItalic.woff2 b/fonts/inter/Inter-SemiBoldItalic.woff2 new file mode 100644 index 00000000000..545685bd2c6 Binary files /dev/null and b/fonts/inter/Inter-SemiBoldItalic.woff2 differ diff --git a/fonts/inter/Inter-Thin.woff b/fonts/inter/Inter-Thin.woff new file mode 100644 index 00000000000..62bc58cd141 Binary files /dev/null and b/fonts/inter/Inter-Thin.woff differ diff --git a/fonts/inter/Inter-Thin.woff2 b/fonts/inter/Inter-Thin.woff2 new file mode 100644 index 00000000000..abbc3a5c962 Binary files /dev/null and b/fonts/inter/Inter-Thin.woff2 differ diff --git a/fonts/inter/Inter-ThinItalic.woff b/fonts/inter/Inter-ThinItalic.woff new file mode 100644 index 00000000000..700a7f069b9 Binary files /dev/null and b/fonts/inter/Inter-ThinItalic.woff differ diff --git a/fonts/inter/Inter-ThinItalic.woff2 b/fonts/inter/Inter-ThinItalic.woff2 new file mode 100644 index 00000000000..ab0b2002a3a Binary files /dev/null and b/fonts/inter/Inter-ThinItalic.woff2 differ diff --git a/fonts/inter/Inter-italic.var.woff2 b/fonts/inter/Inter-italic.var.woff2 new file mode 100644 index 00000000000..b826d5af84b Binary files /dev/null and b/fonts/inter/Inter-italic.var.woff2 differ diff --git a/fonts/inter/Inter-roman.var.woff2 b/fonts/inter/Inter-roman.var.woff2 new file mode 100644 index 00000000000..6a256a068f0 Binary files /dev/null and b/fonts/inter/Inter-roman.var.woff2 differ diff --git a/fonts/intervar/Inter.var.woff2 b/fonts/intervar/Inter.var.woff2 new file mode 100644 index 00000000000..365eedc50cd Binary files /dev/null and b/fonts/intervar/Inter.var.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-Bold.woff2 b/fonts/jetbrainsmono/JetBrainsMono-Bold.woff2 new file mode 100644 index 00000000000..023512c051e Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-Bold.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-BoldItalic.woff2 b/fonts/jetbrainsmono/JetBrainsMono-BoldItalic.woff2 new file mode 100644 index 00000000000..f3e87a35abb Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-BoldItalic.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-ExtraBold.woff2 b/fonts/jetbrainsmono/JetBrainsMono-ExtraBold.woff2 new file mode 100644 index 00000000000..a8b78a9c176 Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-ExtraBold.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-ExtraBoldItalic.woff2 b/fonts/jetbrainsmono/JetBrainsMono-ExtraBoldItalic.woff2 new file mode 100644 index 00000000000..b54a2d5beba Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-ExtraBoldItalic.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-ExtraLight.woff2 b/fonts/jetbrainsmono/JetBrainsMono-ExtraLight.woff2 new file mode 100644 index 00000000000..edd6a68c06d Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-ExtraLight.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-ExtraLightItalic.woff2 b/fonts/jetbrainsmono/JetBrainsMono-ExtraLightItalic.woff2 new file mode 100644 index 00000000000..2a02a18e64c Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-ExtraLightItalic.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-Italic.woff2 b/fonts/jetbrainsmono/JetBrainsMono-Italic.woff2 new file mode 100644 index 00000000000..e8eeb4b8e85 Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-Italic.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-Light.woff2 b/fonts/jetbrainsmono/JetBrainsMono-Light.woff2 new file mode 100644 index 00000000000..459bacf4989 Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-Light.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-LightItalic.woff2 b/fonts/jetbrainsmono/JetBrainsMono-LightItalic.woff2 new file mode 100644 index 00000000000..352f5d95a6a Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-LightItalic.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-Medium.woff2 b/fonts/jetbrainsmono/JetBrainsMono-Medium.woff2 new file mode 100644 index 00000000000..484c9e64152 Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-Medium.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-MediumItalic.woff2 b/fonts/jetbrainsmono/JetBrainsMono-MediumItalic.woff2 new file mode 100644 index 00000000000..e1279949e07 Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-MediumItalic.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-Regular.woff2 b/fonts/jetbrainsmono/JetBrainsMono-Regular.woff2 new file mode 100644 index 00000000000..8c862e334da Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-Regular.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-SemiBold.woff2 b/fonts/jetbrainsmono/JetBrainsMono-SemiBold.woff2 new file mode 100644 index 00000000000..fce8cd8053c Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-SemiBold.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-SemiBoldItalic.woff2 b/fonts/jetbrainsmono/JetBrainsMono-SemiBoldItalic.woff2 new file mode 100644 index 00000000000..a14851f6bbe Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-SemiBoldItalic.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-Thin.woff2 b/fonts/jetbrainsmono/JetBrainsMono-Thin.woff2 new file mode 100644 index 00000000000..7c6127875f5 Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-Thin.woff2 differ diff --git a/fonts/jetbrainsmono/JetBrainsMono-ThinItalic.woff2 b/fonts/jetbrainsmono/JetBrainsMono-ThinItalic.woff2 new file mode 100644 index 00000000000..0676ba8a56a Binary files /dev/null and b/fonts/jetbrainsmono/JetBrainsMono-ThinItalic.woff2 differ diff --git a/img/android-chrome-192x192.png b/img/android-chrome-192x192.png new file mode 100644 index 00000000000..6d04cf4c085 Binary files /dev/null and b/img/android-chrome-192x192.png differ diff --git a/img/android-chrome-256x256.png b/img/android-chrome-256x256.png new file mode 100644 index 00000000000..1c30cc02678 Binary files /dev/null and b/img/android-chrome-256x256.png differ diff --git a/img/apple-touch-icon.png b/img/apple-touch-icon.png new file mode 100644 index 00000000000..397e21af2a5 Binary files /dev/null and b/img/apple-touch-icon.png differ diff --git a/img/banner.jpg b/img/banner.jpg new file mode 100644 index 00000000000..2c3cb5cf7c9 Binary files /dev/null and b/img/banner.jpg differ diff --git a/img/favicon copy.svg b/img/favicon copy.svg new file mode 100644 index 00000000000..3f30c396789 --- /dev/null +++ b/img/favicon copy.svg @@ -0,0 +1,21 @@ +<svg width="240" height="240" viewBox="0 0 240 240" xmlns="http://www.w3.org/2000/svg"> + <style> + path { + fill: black; <!-- set icon color for light mode --> + } + + @media (prefers-color-scheme: dark) { + path { + fill: #F8F8FD; <!-- set icon color for dark mode --> + } + } + </style> +<g clip-path="url(#clip0)"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M161.69 76.4992L77.7047 160.372C76.6218 158.273 75.6441 156.087 74.7683 153.819C71.8353 146.198 70.3688 138.113 70.3688 129.573C70.3688 121.027 71.8353 112.945 74.7683 105.324C77.7047 97.7003 81.7716 91.0864 86.9723 85.4725C92.1729 79.8621 98.4226 75.4245 105.718 72.1566C113.016 68.892 121.024 67.258 129.745 67.258C138.47 67.258 146.522 68.9326 153.899 72.2854C156.642 73.5295 159.239 74.933 161.69 76.4992ZM154.279 187.488C146.98 190.756 138.972 192.387 130.251 192.387C121.527 192.387 113.475 190.712 106.094 187.363C103.355 186.115 100.758 184.712 98.3104 183.142L182.292 99.2765C183.375 101.372 184.353 103.555 185.228 105.826C188.161 113.447 189.628 121.532 189.628 130.075C189.628 138.618 188.161 146.699 185.228 154.324C182.292 161.944 178.225 168.558 173.024 174.169C167.824 179.779 161.577 184.22 154.279 187.488ZM166.985 213.493C178.225 208.635 187.954 202.062 196.173 193.767C204.391 185.478 210.763 175.803 215.292 164.748C219.824 153.693 222.088 141.967 222.088 129.573C222.088 117.176 219.824 105.45 215.292 94.3916C212.607 87.8353 209.3 81.7808 205.376 76.2245L260 21.6758L238.294 -2.28882e-05L183.504 54.7149C178.585 51.3655 173.245 48.4705 167.488 46.0262C156.248 41.2531 143.837 38.8631 130.251 38.8631C116.662 38.8631 104.251 41.2938 93.0114 46.1517C81.7715 51.0096 72.0423 57.5828 63.8237 65.8748C55.6052 74.1668 49.2299 83.8419 44.7014 94.8967C40.1729 105.952 37.9086 117.678 37.9086 130.075C37.9086 142.469 40.1729 154.192 44.7014 165.25C47.39 171.809 50.6964 177.864 54.6207 183.424L0 237.966L21.7057 259.641L76.4928 204.93C81.4117 208.279 86.7515 211.174 92.509 213.619C103.749 218.392 116.16 220.778 129.745 220.778C143.334 220.778 155.745 218.348 166.985 213.493V213.493Z" fill="black"/> +</g> +<defs> +<clipPath id="clip0"> +<rect width="240" height="240" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/img/favicon-16x16.png b/img/favicon-16x16.png new file mode 100644 index 00000000000..5f15c3b0af3 Binary files /dev/null and b/img/favicon-16x16.png differ diff --git a/img/favicon-32x32.png b/img/favicon-32x32.png new file mode 100644 index 00000000000..9433c807fd0 Binary files /dev/null and b/img/favicon-32x32.png differ diff --git a/img/favicon-dark.svg b/img/favicon-dark.svg new file mode 100644 index 00000000000..a4f0fac9595 --- /dev/null +++ b/img/favicon-dark.svg @@ -0,0 +1,15 @@ +<svg width="260" height="260" viewBox="0 0 260 260" fill="none" xmlns="http://www.w3.org/2000/svg"> + <style> + path { + fill: #F8F8FD; + } + </style> + <g clip-path="url(#clip0)"> + <path fill-rule="evenodd" clip-rule="evenodd" d="M161.69 76.4992L77.7047 160.372C76.6218 158.273 75.6441 156.087 74.7683 153.819C71.8353 146.198 70.3688 138.113 70.3688 129.573C70.3688 121.027 71.8353 112.945 74.7683 105.324C77.7047 97.7003 81.7716 91.0864 86.9723 85.4725C92.1729 79.8621 98.4226 75.4245 105.718 72.1566C113.016 68.892 121.024 67.258 129.745 67.258C138.47 67.258 146.522 68.9326 153.899 72.2854C156.642 73.5295 159.239 74.933 161.69 76.4992ZM154.279 187.488C146.98 190.756 138.972 192.387 130.251 192.387C121.527 192.387 113.475 190.712 106.094 187.363C103.355 186.115 100.758 184.712 98.3104 183.142L182.292 99.2765C183.375 101.372 184.353 103.555 185.228 105.826C188.161 113.447 189.628 121.532 189.628 130.075C189.628 138.618 188.161 146.699 185.228 154.324C182.292 161.944 178.225 168.558 173.024 174.169C167.824 179.779 161.577 184.22 154.279 187.488ZM166.985 213.493C178.225 208.635 187.954 202.062 196.173 193.767C204.391 185.478 210.763 175.803 215.292 164.748C219.824 153.693 222.088 141.967 222.088 129.573C222.088 117.176 219.824 105.45 215.292 94.3916C212.607 87.8353 209.3 81.7808 205.376 76.2245L260 21.6758L238.294 -2.28882e-05L183.504 54.7149C178.585 51.3655 173.245 48.4705 167.488 46.0262C156.248 41.2531 143.837 38.8631 130.251 38.8631C116.662 38.8631 104.251 41.2938 93.0114 46.1517C81.7715 51.0096 72.0423 57.5828 63.8237 65.8748C55.6052 74.1668 49.2299 83.8419 44.7014 94.8967C40.1729 105.952 37.9086 117.678 37.9086 130.075C37.9086 142.469 40.1729 154.192 44.7014 165.25C47.39 171.809 50.6964 177.864 54.6207 183.424L0 237.966L21.7057 259.641L76.4928 204.93C81.4117 208.279 86.7515 211.174 92.509 213.619C103.749 218.392 116.16 220.778 129.745 220.778C143.334 220.778 155.745 218.348 166.985 213.493V213.493Z" fill="black" /> + </g> + <defs> + <clipPath id="clip0"> + <rect width="260" height="260" fill="white" /> + </clipPath> + </defs> +</svg> \ No newline at end of file diff --git a/img/favicon.svg b/img/favicon.svg new file mode 100644 index 00000000000..dbefbad9f4f --- /dev/null +++ b/img/favicon.svg @@ -0,0 +1,21 @@ +<svg width="260" height="260" viewBox="0 0 260 260" fill="none" xmlns="http://www.w3.org/2000/svg"> + <style> + path { + fill: black; <!-- set icon color for light mode --> + } + + @media (prefers-color-scheme: dark) { + path { + fill: #F8F8FD; <!-- set icon color for dark mode --> + } + } + </style> +<g clip-path="url(#clip0)"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M161.69 76.4992L77.7047 160.372C76.6218 158.273 75.6441 156.087 74.7683 153.819C71.8353 146.198 70.3688 138.113 70.3688 129.573C70.3688 121.027 71.8353 112.945 74.7683 105.324C77.7047 97.7003 81.7716 91.0864 86.9723 85.4725C92.1729 79.8621 98.4226 75.4245 105.718 72.1566C113.016 68.892 121.024 67.258 129.745 67.258C138.47 67.258 146.522 68.9326 153.899 72.2854C156.642 73.5295 159.239 74.933 161.69 76.4992ZM154.279 187.488C146.98 190.756 138.972 192.387 130.251 192.387C121.527 192.387 113.475 190.712 106.094 187.363C103.355 186.115 100.758 184.712 98.3104 183.142L182.292 99.2765C183.375 101.372 184.353 103.555 185.228 105.826C188.161 113.447 189.628 121.532 189.628 130.075C189.628 138.618 188.161 146.699 185.228 154.324C182.292 161.944 178.225 168.558 173.024 174.169C167.824 179.779 161.577 184.22 154.279 187.488ZM166.985 213.493C178.225 208.635 187.954 202.062 196.173 193.767C204.391 185.478 210.763 175.803 215.292 164.748C219.824 153.693 222.088 141.967 222.088 129.573C222.088 117.176 219.824 105.45 215.292 94.3916C212.607 87.8353 209.3 81.7808 205.376 76.2245L260 21.6758L238.294 -2.28882e-05L183.504 54.7149C178.585 51.3655 173.245 48.4705 167.488 46.0262C156.248 41.2531 143.837 38.8631 130.251 38.8631C116.662 38.8631 104.251 41.2938 93.0114 46.1517C81.7715 51.0096 72.0423 57.5828 63.8237 65.8748C55.6052 74.1668 49.2299 83.8419 44.7014 94.8967C40.1729 105.952 37.9086 117.678 37.9086 130.075C37.9086 142.469 40.1729 154.192 44.7014 165.25C47.39 171.809 50.6964 177.864 54.6207 183.424L0 237.966L21.7057 259.641L76.4928 204.93C81.4117 208.279 86.7515 211.174 92.509 213.619C103.749 218.392 116.16 220.778 129.745 220.778C143.334 220.778 155.745 218.348 166.985 213.493V213.493Z" fill="black"/> +</g> +<defs> +<clipPath id="clip0"> +<rect width="260" height="260" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/img/hub.svg b/img/hub.svg new file mode 100644 index 00000000000..46ace9e4abd --- /dev/null +++ b/img/hub.svg @@ -0,0 +1 @@ +<svg width="100%" height="100%" viewBox="0 0 174 200" fill="none" xmlns="http://www.w3.org/2000/svg" data-v-609154e0=""><path fill-rule="evenodd" clip-rule="evenodd" d="M87 6.9282L6.39746 53.4641V146.536L87 193.072L167.603 146.536V53.4641L87 6.9282ZM173.603 50L87 0L0.397461 50V150L87 200L173.603 150V50Z" fill="#BA3FD9"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M86.9655 64.135C80.7752 64.135 75.7396 59.0957 75.7396 52.9009C75.7396 46.7063 80.7752 41.6667 86.9655 41.6667C93.1557 41.6667 98.1919 46.7063 98.1919 52.9009C98.1919 59.0957 93.1557 64.135 86.9655 64.135ZM86.9655 47.7878C84.1479 47.7878 81.8562 50.0816 81.8562 52.9009C81.8562 55.7202 84.1479 58.0139 86.9655 58.0139C89.783 58.0139 92.0753 55.7202 92.0753 52.9009C92.0753 50.0816 89.783 47.7878 86.9655 47.7878Z" fill="#BA3FD9"></path> <path d="M84.0729 65.9932C85.0373 66.2158 86.0415 66.3334 87.0726 66.3334C88.1039 66.3334 89.1082 66.2157 90.0729 65.9931V87.0071C89.1082 86.7845 88.1039 86.6668 87.0725 86.6668C86.0415 86.6668 85.0373 86.7844 84.0729 87.007V65.9932Z" fill="#BA3FD9"></path> <path d="M77.3273 90.9094L59.122 80.3985C58.8325 81.3453 58.4322 82.2739 57.9165 83.167C57.401 84.06 56.7971 84.8708 56.1221 85.5947L74.3207 96.1017C74.9211 94.1416 75.9619 92.3722 77.3273 90.9094Z" fill="#BA3FD9"></path> <path d="M74.3207 103.898L56.122 114.406C56.7971 115.13 57.4012 115.941 57.9169 116.834C58.4324 117.727 58.8326 118.655 59.1221 119.602L77.3272 109.091C75.9618 107.628 74.921 105.859 74.3207 103.898Z" fill="#BA3FD9"></path> <path d="M84.0729 112.993V134.007C85.0375 133.784 86.0419 133.667 87.0732 133.667C88.1043 133.667 89.1085 133.784 90.0729 134.007V112.993C89.1082 113.216 88.1039 113.333 87.0725 113.333C86.0415 113.333 85.0373 113.216 84.0729 112.993Z" fill="#BA3FD9"></path> <path d="M96.8183 109.091L115.024 119.602C115.313 118.655 115.714 117.726 116.229 116.833C116.745 115.94 117.349 115.129 118.024 114.405L99.825 103.898C99.2246 105.859 98.1838 107.628 96.8183 109.091Z" fill="#BA3FD9"></path> <path d="M99.825 96.1018L118.024 85.5947C117.349 84.8706 116.745 84.0597 116.229 83.1665C115.713 82.2735 115.313 81.3451 115.024 80.3986L96.8183 90.9095C98.1837 92.3723 99.2246 94.1417 99.825 96.1018Z" fill="#BA3FD9"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M55.9591 82.1606C52.864 87.5215 45.982 89.3628 40.6171 86.2654C35.2525 83.1682 33.4059 76.2874 36.501 70.9265C39.5962 65.5655 46.4787 63.7239 51.8433 66.8211C57.2081 69.9185 59.0542 76.7997 55.9591 82.1606ZM41.802 73.987C40.3933 76.4271 41.2338 79.5587 43.6754 80.9683C46.117 82.378 49.2493 81.5401 50.6581 79.1001C52.0668 76.66 51.2266 73.5279 48.785 72.1183C46.3434 70.7086 43.2108 71.547 41.802 73.987Z" fill="#BA3FD9"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M56.0665 118.026C59.1617 123.387 57.3153 130.267 51.9504 133.365C46.5858 136.462 39.7036 134.621 36.6085 129.26C33.5133 123.899 35.3597 117.018 40.7243 113.92C46.0891 110.823 52.9714 112.665 56.0665 118.026ZM41.9095 126.199C43.3182 128.639 46.4506 129.477 48.8921 128.068C51.3337 126.658 52.1743 123.526 50.7655 121.086C49.3568 118.646 46.2242 117.808 43.7826 119.217C41.341 120.627 40.5007 123.759 41.9095 126.199Z" fill="#BA3FD9"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M87.1803 135.865C93.3706 135.865 98.4062 140.905 98.4062 147.099C98.4062 153.294 93.3706 158.333 87.1803 158.333C80.9901 158.333 75.9539 153.294 75.9539 147.099C75.9539 140.905 80.9901 135.865 87.1803 135.865ZM87.1803 152.212C89.9979 152.212 92.2896 149.919 92.2896 147.099C92.2896 144.28 89.9979 141.986 87.1803 141.986C84.3628 141.986 82.0705 144.28 82.0705 147.099C82.0705 149.919 84.3628 152.212 87.1803 152.212Z" fill="#BA3FD9"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M118.187 117.84C121.282 112.479 128.164 110.637 133.529 113.735C138.893 116.832 140.74 123.713 137.645 129.074C134.55 134.435 127.667 136.276 122.303 133.179C116.938 130.082 115.092 123.201 118.187 117.84ZM132.344 126.013C133.753 123.573 132.912 120.442 130.47 119.032C128.029 117.622 124.896 118.46 123.488 120.9C122.079 123.34 122.919 126.472 125.361 127.882C127.802 129.292 130.935 128.453 132.344 126.013Z" fill="#BA3FD9"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M118.079 81.9745C114.984 76.6136 116.83 69.7329 122.195 66.6355C127.56 63.5383 134.442 65.3795 137.537 70.7404C140.632 76.1013 138.786 82.9826 133.422 86.0799C128.057 89.1773 121.174 87.3355 118.079 81.9745ZM132.236 73.8009C130.828 71.3609 127.695 70.523 125.254 71.9327C122.812 73.3423 121.972 76.4739 123.38 78.914C124.789 81.354 127.922 82.1924 130.363 80.7827C132.805 79.3731 133.645 76.241 132.236 73.8009Z" fill="#BA3FD9"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M86.9654 94.7879C84.1479 94.7879 81.8561 97.0816 81.8561 99.9009C81.8561 102.72 84.1479 105.014 86.9654 105.014C89.783 105.014 92.0753 102.72 92.0753 99.9009C92.0753 97.0816 89.783 94.7879 86.9654 94.7879ZM86.9654 111.135C80.7752 111.135 75.7395 106.096 75.7395 99.9009C75.7395 93.7064 80.7752 88.6668 86.9654 88.6668C93.1557 88.6668 98.1919 93.7064 98.1919 99.9009C98.1919 106.096 93.1557 111.135 86.9654 111.135Z" fill="#BA3FD9"></path></svg> \ No newline at end of file diff --git a/img/ico-chevron.svg b/img/ico-chevron.svg new file mode 100644 index 00000000000..3f8e8fac11a --- /dev/null +++ b/img/ico-chevron.svg @@ -0,0 +1,3 @@ +<svg width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M1 1L5 5L9 1" stroke="black" stroke-opacity="0.667" stroke-linecap="square"/> +</svg> diff --git a/img/ico-github.svg b/img/ico-github.svg new file mode 100644 index 00000000000..a74bee5aed9 --- /dev/null +++ b/img/ico-github.svg @@ -0,0 +1,3 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M12 0.300049C5.4 0.300049 0 5.70005 0 12.3001C0 17.6001 3.4 22.1001 8.2 23.7001C8.8 23.8001 9 23.4001 9 23.1001C9 22.8001 9 22.1001 9 21.1001C5.7 21.8001 5 19.5001 5 19.5001C4.5 18.1001 3.7 17.7001 3.7 17.7001C2.5 17.0001 3.7 17.0001 3.7 17.0001C4.9 17.1001 5.5 18.2001 5.5 18.2001C6.6 20.0001 8.3 19.5001 9 19.2001C9.1 18.4001 9.4 17.9001 9.8 17.6001C7.1 17.3001 4.3 16.3001 4.3 11.7001C4.3 10.4001 4.8 9.30005 5.5 8.50005C5.5 8.10005 5 6.90005 5.7 5.30005C5.7 5.30005 6.7 5.00005 9 6.50005C10 6.20005 11 6.10005 12 6.10005C13 6.10005 14 6.20005 15 6.50005C17.3 4.90005 18.3 5.30005 18.3 5.30005C19 7.00005 18.5 8.20005 18.4 8.50005C19.2 9.30005 19.6 10.4001 19.6 11.7001C19.6 16.3001 16.8 17.3001 14.1 17.6001C14.5 18.0001 14.9 18.7001 14.9 19.8001C14.9 21.4001 14.9 22.7001 14.9 23.1001C14.9 23.4001 15.1 23.8001 15.7 23.7001C20.5 22.1001 23.9 17.6001 23.9 12.3001C24 5.70005 18.6 0.300049 12 0.300049Z" fill="black" fill-opacity="0.667"/> +</svg> diff --git a/img/logo-bw-inverse.svg b/img/logo-bw-inverse.svg new file mode 100644 index 00000000000..678a648863f --- /dev/null +++ b/img/logo-bw-inverse.svg @@ -0,0 +1,8 @@ +<svg width="144" height="28" viewBox="0 0 144 28" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" clip-rule="evenodd" d="M16 20.0202L14.0251 18.0202C13.275 18.72 12.5167 19.2745 11.7497 19.6829C10.9834 20.091 10.0666 20.2951 9.00008 20.2951C8.16662 20.2951 7.3959 20.1329 6.68758 19.8077C5.97926 19.4826 5.36673 19.0371 4.84999 18.4701C4.33325 17.9035 3.93355 17.2411 3.64989 16.4829C3.36656 15.7247 3.22523 14.9118 3.22523 14.0457C3.22523 13.1789 3.36656 12.3705 3.64989 11.6204C3.93355 10.8706 4.33325 10.2166 4.84999 9.65808C5.36673 9.09989 5.97926 8.6584 6.68758 8.33326C7.3959 8.00846 8.16662 7.8459 9.00008 7.8459C9.99983 7.8459 10.8916 8.0459 11.6748 8.44591C12.4584 8.84558 13.2001 9.37072 13.8997 10.0207L15.8749 7.74606C15.4583 7.34605 15.0168 6.97944 14.55 6.64587C14.0835 6.31264 13.5752 6.02494 13.025 5.78345C12.4749 5.54163 11.8708 5.35444 11.2124 5.22122C10.554 5.08765 9.82477 5.02087 9.02504 5.02087C7.69171 5.02087 6.47508 5.25865 5.37516 5.73354C4.2749 6.20842 3.32507 6.85835 2.525 7.68333C1.72493 8.50831 1.10431 9.47056 0.66245 10.5707C0.220592 11.6706 0 12.8457 0 14.0956C0 15.3621 0.224977 16.5453 0.67493 17.6455C1.12488 18.745 1.74585 19.6991 2.53748 20.5076C3.32912 21.3157 4.26646 21.9531 5.34986 22.4199C6.43326 22.8867 7.61683 23.1198 8.89991 23.1198C9.71684 23.1198 10.4626 23.0489 11.1375 22.9073C11.8125 22.7656 12.4334 22.5575 13.0001 22.2827C13.5667 22.0074 14.096 21.6823 14.5877 21.3076C15.0792 20.9325 15.55 20.5032 16 20.0202" fill="#FFFFFF" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M55.6691 9.97591C55.6691 9.39376 55.9177 8.8991 56.4152 8.49193C56.9123 8.08409 57.6087 7.88051 58.5037 7.88051C59.2995 7.88051 60.0868 8.03462 60.8657 8.34219C61.645 8.64975 62.4323 9.09461 63.2277 9.67642L64.8688 7.35691C63.9741 6.64184 63.0167 6.09737 61.9972 5.72352C60.9774 5.34933 59.8298 5.16223 58.5534 5.16223C57.6916 5.16223 56.8959 5.2827 56.1706 5.52397C55.4413 5.76491 54.82 6.10982 54.3018 6.55872C53.7838 7.00795 53.3776 7.544 53.0793 8.16754C52.7851 8.79108 52.6359 9.48529 52.6359 10.2502C52.6359 11.0648 52.7643 11.755 53.0213 12.3203C53.2783 12.8857 53.6553 13.3679 54.1444 13.767C54.6332 14.1661 55.2424 14.4985 55.9633 14.7647C56.6886 15.0309 57.5135 15.2715 58.4457 15.4878C59.2582 15.6874 59.9167 15.8785 60.4266 16.0612C60.9322 16.2443 61.33 16.4398 61.6242 16.6474C61.914 16.8554 62.1133 17.0839 62.221 17.3332C62.3287 17.5829 62.3824 17.8652 62.3824 18.1812C62.3824 18.8633 62.1049 19.4037 61.5497 19.8025C60.9942 20.2019 60.2441 20.4011 59.2995 20.4011C58.2055 20.4011 57.2273 20.2056 56.3655 19.8149C55.5034 19.4243 54.65 18.8633 53.8043 18.1314L51.9646 20.3264C53.0089 21.274 54.1444 21.9766 55.3709 22.4339C56.5977 22.8912 57.8821 23.1197 59.2247 23.1197C60.1364 23.1197 60.9738 23.0033 61.7363 22.7708C62.4944 22.5376 63.1492 22.1967 63.688 21.7478C64.2307 21.2989 64.6534 20.7504 64.96 20.102C65.2626 19.4535 65.4159 18.7136 65.4159 17.8821C65.4159 17.1505 65.2958 16.5145 65.0553 15.9741C64.8148 15.4337 64.4585 14.9602 63.9946 14.5524C63.5303 14.1452 62.9419 13.7999 62.2374 13.5173C61.5333 13.2349 60.7208 12.9772 59.809 12.7443C58.9761 12.5448 58.2924 12.3533 57.7496 12.1706C57.2109 11.9879 56.7882 11.7883 56.4772 11.5719C56.1706 11.3559 55.9596 11.1231 55.8432 10.8737C55.7275 10.624 55.6691 10.3249 55.6691 9.97591" fill="#FFFFFF" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M89.7054 10.223V22.6955H92.7433V5.30359H89.4809L84.1768 13.5276L78.8726 5.30359H75.6106V22.6955H78.6485V10.2726L84.1019 18.4221H84.2017L89.7054 10.223Z" fill="#FFFFFF" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M118.268 14.0956C118.268 14.9455 118.122 15.7496 117.831 16.5081C117.54 17.2663 117.137 17.9244 116.621 18.4825C116.105 19.0407 115.486 19.4826 114.762 19.8077C114.038 20.1328 113.244 20.2951 112.379 20.2951C111.514 20.2951 110.715 20.1284 109.983 19.7952C109.252 19.4617 108.623 19.0117 108.099 18.4454C107.576 17.8785 107.168 17.2161 106.877 16.4579C106.586 15.6997 106.44 14.8953 106.44 14.0457C106.44 13.1954 106.586 12.3913 106.877 11.6331C107.168 10.8746 107.571 10.2166 108.087 9.65806C108.603 9.09986 109.223 8.65837 109.946 8.33324C110.67 8.00844 111.464 7.84587 112.329 7.84587C113.194 7.84587 113.993 8.01249 114.725 8.34605C115.456 8.67928 116.085 9.12921 116.608 9.69583C117.133 10.2621 117.54 10.9249 117.831 11.6831C118.122 12.4413 118.268 13.2457 118.268 14.0956ZM121.487 14.0457C121.487 12.8123 121.262 11.6456 120.813 10.5455C120.364 9.44593 119.74 8.4874 118.942 7.67085C118.143 6.85397 117.187 6.20842 116.072 5.73354C114.957 5.25865 113.727 5.02087 112.379 5.02087C111.032 5.02087 109.801 5.2627 108.686 5.74602C107.571 6.22933 106.606 6.88331 105.791 7.70829C104.976 8.53327 104.344 9.49585 103.895 10.5957C103.446 11.6956 103.221 12.8622 103.221 14.0956C103.221 15.3287 103.446 16.495 103.895 17.5952C104.344 18.6954 104.968 19.6536 105.766 20.4701C106.565 21.2867 107.521 21.9326 108.636 22.4074C109.75 22.8823 110.981 23.1198 112.329 23.1198C113.676 23.1198 114.908 22.8779 116.022 22.395C117.137 21.9117 118.101 21.2577 118.917 20.4324C119.732 19.6077 120.364 18.6451 120.813 17.5453C121.262 16.4454 121.487 15.2788 121.487 14.0457V14.0457Z" fill="#FFFFFF" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M134.253 9.97591C134.253 9.39376 134.502 8.8991 134.999 8.49193C135.496 8.08409 136.192 7.88051 137.088 7.88051C137.883 7.88051 138.671 8.03462 139.45 8.34219C140.229 8.64975 141.016 9.09461 141.812 9.67642L143.453 7.35691C142.558 6.64184 141.6 6.09737 140.581 5.72352C139.562 5.34933 138.414 5.16223 137.137 5.16223C136.276 5.16223 135.48 5.2827 134.755 5.52397C134.025 5.76491 133.404 6.10982 132.886 6.55872C132.368 7.00795 131.962 7.544 131.663 8.16754C131.369 8.79108 131.22 9.48529 131.22 10.2502C131.22 11.0648 131.348 11.755 131.605 12.3203C131.862 12.8857 132.239 13.3679 132.728 13.767C133.217 14.1661 133.826 14.4985 134.548 14.7647C135.273 15.0309 136.097 15.2715 137.03 15.4878C137.842 15.6874 138.501 15.8785 139.011 16.0612C139.516 16.2443 139.914 16.4398 140.208 16.6474C140.498 16.8554 140.697 17.0839 140.805 17.3332C140.913 17.5829 140.967 17.8652 140.967 18.1812C140.967 18.8633 140.689 19.4037 140.134 19.8025C139.578 20.2019 138.828 20.4011 137.883 20.4011C136.789 20.4011 135.811 20.2056 134.949 19.8149C134.088 19.4243 133.234 18.8633 132.388 18.1314L130.549 20.3264C131.593 21.274 132.728 21.9766 133.955 22.4339C135.181 22.8912 136.466 23.1197 137.809 23.1197C138.72 23.1197 139.557 23.0033 140.32 22.7708C141.078 22.5376 141.733 22.1967 142.272 21.7478C142.815 21.2989 143.237 20.7504 143.544 20.102C143.846 19.4535 144 18.7136 144 17.8821C144 17.1505 143.879 16.5145 143.639 15.9741C143.399 15.4337 143.043 14.9602 142.578 14.5524C142.114 14.1452 141.526 13.7999 140.821 13.5173C140.117 13.2349 139.304 12.9772 138.393 12.7443C137.56 12.5448 136.876 12.3533 136.334 12.1706C135.795 11.9879 135.372 11.7883 135.061 11.5719C134.755 11.3559 134.543 11.1231 134.427 10.8737C134.311 10.624 134.253 10.3249 134.253 9.97591" fill="#FFFFFF" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M36.8401 8.78536L28.5159 17.0984C28.4086 16.8904 28.3117 16.6737 28.2249 16.4489C27.9342 15.6936 27.7888 14.8922 27.7888 14.0458C27.7888 13.1987 27.9342 12.3977 28.2249 11.6424C28.5159 10.8867 28.919 10.2312 29.4345 9.67476C29.9499 9.11868 30.5694 8.67885 31.2924 8.35495C32.0158 8.03138 32.8095 7.86942 33.6739 7.86942C34.5386 7.86942 35.3367 8.03541 36.0679 8.36771C36.3397 8.49103 36.5971 8.63013 36.8401 8.78536ZM36.1056 19.786C35.3822 20.1099 34.5884 20.2715 33.7241 20.2715C32.8593 20.2715 32.0613 20.1055 31.3298 19.7736C31.0582 19.6499 30.8008 19.5108 30.5583 19.3552L38.8821 11.0429C38.9894 11.2505 39.0863 11.4669 39.1731 11.692C39.4638 12.4474 39.6092 13.2487 39.6092 14.0955C39.6092 14.9422 39.4638 15.7432 39.1731 16.4989C38.8821 17.2542 38.479 17.9098 37.9635 18.4658C37.4481 19.0219 36.829 19.4621 36.1056 19.786ZM37.365 22.3635C38.479 21.882 39.4433 21.2305 40.2579 20.4083C41.0725 19.5868 41.704 18.6278 42.1529 17.5321C42.602 16.4364 42.8265 15.2742 42.8265 14.0458C42.8265 12.817 42.602 11.6548 42.1529 10.5588C41.8867 9.90893 41.559 9.30883 41.17 8.75813L46.5841 3.35152L44.4328 1.20312L39.0022 6.62619C38.5147 6.29422 37.9854 6.00728 37.4148 5.76502C36.3007 5.29193 35.0706 5.05505 33.7241 5.05505C32.3772 5.05505 31.1471 5.29596 30.033 5.77745C28.919 6.25894 27.9547 6.91045 27.1401 7.73231C26.3255 8.55417 25.6936 9.51312 25.2448 10.6088C24.7959 11.7045 24.5715 12.8668 24.5715 14.0955C24.5715 15.3239 24.7959 16.4858 25.2448 17.5819C25.5113 18.232 25.839 18.8321 26.2279 19.3832L20.8142 24.7891L22.9656 26.9375L28.3958 21.5148C28.8833 21.8467 29.4126 22.1337 29.9832 22.3759C31.0973 22.849 32.3274 23.0856 33.6739 23.0856C35.0208 23.0856 36.2509 22.8447 37.365 22.3635V22.3635Z" fill="#FFFFFF" /> +</svg> diff --git a/img/logo-bw.svg b/img/logo-bw.svg new file mode 100644 index 00000000000..f2575260a76 --- /dev/null +++ b/img/logo-bw.svg @@ -0,0 +1,8 @@ +<svg width="144" height="28" viewBox="0 0 144 28" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" clip-rule="evenodd" d="M16 20.0202L14.0251 18.0202C13.275 18.72 12.5167 19.2745 11.7497 19.6829C10.9834 20.091 10.0666 20.2951 9.00008 20.2951C8.16662 20.2951 7.3959 20.1329 6.68758 19.8077C5.97926 19.4826 5.36673 19.0371 4.84999 18.4701C4.33325 17.9035 3.93355 17.2411 3.64989 16.4829C3.36656 15.7247 3.22523 14.9118 3.22523 14.0457C3.22523 13.1789 3.36656 12.3705 3.64989 11.6204C3.93355 10.8706 4.33325 10.2166 4.84999 9.65808C5.36673 9.09989 5.97926 8.6584 6.68758 8.33326C7.3959 8.00846 8.16662 7.8459 9.00008 7.8459C9.99983 7.8459 10.8916 8.0459 11.6748 8.44591C12.4584 8.84558 13.2001 9.37072 13.8997 10.0207L15.8749 7.74606C15.4583 7.34605 15.0168 6.97944 14.55 6.64587C14.0835 6.31264 13.5752 6.02494 13.025 5.78345C12.4749 5.54163 11.8708 5.35444 11.2124 5.22122C10.554 5.08765 9.82477 5.02087 9.02504 5.02087C7.69171 5.02087 6.47508 5.25865 5.37516 5.73354C4.2749 6.20842 3.32507 6.85835 2.525 7.68333C1.72493 8.50831 1.10431 9.47056 0.66245 10.5707C0.220592 11.6706 0 12.8457 0 14.0956C0 15.3621 0.224977 16.5453 0.67493 17.6455C1.12488 18.745 1.74585 19.6991 2.53748 20.5076C3.32912 21.3157 4.26646 21.9531 5.34986 22.4199C6.43326 22.8867 7.61683 23.1198 8.89991 23.1198C9.71684 23.1198 10.4626 23.0489 11.1375 22.9073C11.8125 22.7656 12.4334 22.5575 13.0001 22.2827C13.5667 22.0074 14.096 21.6823 14.5877 21.3076C15.0792 20.9325 15.55 20.5032 16 20.0202" fill="#2E3148" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M55.6691 9.97591C55.6691 9.39376 55.9177 8.8991 56.4152 8.49193C56.9123 8.08409 57.6087 7.88051 58.5037 7.88051C59.2995 7.88051 60.0868 8.03462 60.8657 8.34219C61.645 8.64975 62.4323 9.09461 63.2277 9.67642L64.8688 7.35691C63.9741 6.64184 63.0167 6.09737 61.9972 5.72352C60.9774 5.34933 59.8298 5.16223 58.5534 5.16223C57.6916 5.16223 56.8959 5.2827 56.1706 5.52397C55.4413 5.76491 54.82 6.10982 54.3018 6.55872C53.7838 7.00795 53.3776 7.544 53.0793 8.16754C52.7851 8.79108 52.6359 9.48529 52.6359 10.2502C52.6359 11.0648 52.7643 11.755 53.0213 12.3203C53.2783 12.8857 53.6553 13.3679 54.1444 13.767C54.6332 14.1661 55.2424 14.4985 55.9633 14.7647C56.6886 15.0309 57.5135 15.2715 58.4457 15.4878C59.2582 15.6874 59.9167 15.8785 60.4266 16.0612C60.9322 16.2443 61.33 16.4398 61.6242 16.6474C61.914 16.8554 62.1133 17.0839 62.221 17.3332C62.3287 17.5829 62.3824 17.8652 62.3824 18.1812C62.3824 18.8633 62.1049 19.4037 61.5497 19.8025C60.9942 20.2019 60.2441 20.4011 59.2995 20.4011C58.2055 20.4011 57.2273 20.2056 56.3655 19.8149C55.5034 19.4243 54.65 18.8633 53.8043 18.1314L51.9646 20.3264C53.0089 21.274 54.1444 21.9766 55.3709 22.4339C56.5977 22.8912 57.8821 23.1197 59.2247 23.1197C60.1364 23.1197 60.9738 23.0033 61.7363 22.7708C62.4944 22.5376 63.1492 22.1967 63.688 21.7478C64.2307 21.2989 64.6534 20.7504 64.96 20.102C65.2626 19.4535 65.4159 18.7136 65.4159 17.8821C65.4159 17.1505 65.2958 16.5145 65.0553 15.9741C64.8148 15.4337 64.4585 14.9602 63.9946 14.5524C63.5303 14.1452 62.9419 13.7999 62.2374 13.5173C61.5333 13.2349 60.7208 12.9772 59.809 12.7443C58.9761 12.5448 58.2924 12.3533 57.7496 12.1706C57.2109 11.9879 56.7882 11.7883 56.4772 11.5719C56.1706 11.3559 55.9596 11.1231 55.8432 10.8737C55.7275 10.624 55.6691 10.3249 55.6691 9.97591" fill="#2E3148" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M89.7054 10.223V22.6955H92.7433V5.30359H89.4809L84.1768 13.5276L78.8726 5.30359H75.6106V22.6955H78.6485V10.2726L84.1019 18.4221H84.2017L89.7054 10.223Z" fill="#2E3148" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M118.268 14.0956C118.268 14.9455 118.122 15.7496 117.831 16.5081C117.54 17.2663 117.137 17.9244 116.621 18.4825C116.105 19.0407 115.486 19.4826 114.762 19.8077C114.038 20.1328 113.244 20.2951 112.379 20.2951C111.514 20.2951 110.715 20.1284 109.983 19.7952C109.252 19.4617 108.623 19.0117 108.099 18.4454C107.576 17.8785 107.168 17.2161 106.877 16.4579C106.586 15.6997 106.44 14.8953 106.44 14.0457C106.44 13.1954 106.586 12.3913 106.877 11.6331C107.168 10.8746 107.571 10.2166 108.087 9.65806C108.603 9.09986 109.223 8.65837 109.946 8.33324C110.67 8.00844 111.464 7.84587 112.329 7.84587C113.194 7.84587 113.993 8.01249 114.725 8.34605C115.456 8.67928 116.085 9.12921 116.608 9.69583C117.133 10.2621 117.54 10.9249 117.831 11.6831C118.122 12.4413 118.268 13.2457 118.268 14.0956ZM121.487 14.0457C121.487 12.8123 121.262 11.6456 120.813 10.5455C120.364 9.44593 119.74 8.4874 118.942 7.67085C118.143 6.85397 117.187 6.20842 116.072 5.73354C114.957 5.25865 113.727 5.02087 112.379 5.02087C111.032 5.02087 109.801 5.2627 108.686 5.74602C107.571 6.22933 106.606 6.88331 105.791 7.70829C104.976 8.53327 104.344 9.49585 103.895 10.5957C103.446 11.6956 103.221 12.8622 103.221 14.0956C103.221 15.3287 103.446 16.495 103.895 17.5952C104.344 18.6954 104.968 19.6536 105.766 20.4701C106.565 21.2867 107.521 21.9326 108.636 22.4074C109.75 22.8823 110.981 23.1198 112.329 23.1198C113.676 23.1198 114.908 22.8779 116.022 22.395C117.137 21.9117 118.101 21.2577 118.917 20.4324C119.732 19.6077 120.364 18.6451 120.813 17.5453C121.262 16.4454 121.487 15.2788 121.487 14.0457V14.0457Z" fill="#2E3148" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M134.253 9.97591C134.253 9.39376 134.502 8.8991 134.999 8.49193C135.496 8.08409 136.192 7.88051 137.088 7.88051C137.883 7.88051 138.671 8.03462 139.45 8.34219C140.229 8.64975 141.016 9.09461 141.812 9.67642L143.453 7.35691C142.558 6.64184 141.6 6.09737 140.581 5.72352C139.562 5.34933 138.414 5.16223 137.137 5.16223C136.276 5.16223 135.48 5.2827 134.755 5.52397C134.025 5.76491 133.404 6.10982 132.886 6.55872C132.368 7.00795 131.962 7.544 131.663 8.16754C131.369 8.79108 131.22 9.48529 131.22 10.2502C131.22 11.0648 131.348 11.755 131.605 12.3203C131.862 12.8857 132.239 13.3679 132.728 13.767C133.217 14.1661 133.826 14.4985 134.548 14.7647C135.273 15.0309 136.097 15.2715 137.03 15.4878C137.842 15.6874 138.501 15.8785 139.011 16.0612C139.516 16.2443 139.914 16.4398 140.208 16.6474C140.498 16.8554 140.697 17.0839 140.805 17.3332C140.913 17.5829 140.967 17.8652 140.967 18.1812C140.967 18.8633 140.689 19.4037 140.134 19.8025C139.578 20.2019 138.828 20.4011 137.883 20.4011C136.789 20.4011 135.811 20.2056 134.949 19.8149C134.088 19.4243 133.234 18.8633 132.388 18.1314L130.549 20.3264C131.593 21.274 132.728 21.9766 133.955 22.4339C135.181 22.8912 136.466 23.1197 137.809 23.1197C138.72 23.1197 139.557 23.0033 140.32 22.7708C141.078 22.5376 141.733 22.1967 142.272 21.7478C142.815 21.2989 143.237 20.7504 143.544 20.102C143.846 19.4535 144 18.7136 144 17.8821C144 17.1505 143.879 16.5145 143.639 15.9741C143.399 15.4337 143.043 14.9602 142.578 14.5524C142.114 14.1452 141.526 13.7999 140.821 13.5173C140.117 13.2349 139.304 12.9772 138.393 12.7443C137.56 12.5448 136.876 12.3533 136.334 12.1706C135.795 11.9879 135.372 11.7883 135.061 11.5719C134.755 11.3559 134.543 11.1231 134.427 10.8737C134.311 10.624 134.253 10.3249 134.253 9.97591" fill="#2E3148" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M36.8401 8.78536L28.5159 17.0984C28.4086 16.8904 28.3117 16.6737 28.2249 16.4489C27.9342 15.6936 27.7888 14.8922 27.7888 14.0458C27.7888 13.1987 27.9342 12.3977 28.2249 11.6424C28.5159 10.8867 28.919 10.2312 29.4345 9.67476C29.9499 9.11868 30.5694 8.67885 31.2924 8.35495C32.0158 8.03138 32.8095 7.86942 33.6739 7.86942C34.5386 7.86942 35.3367 8.03541 36.0679 8.36771C36.3397 8.49103 36.5971 8.63013 36.8401 8.78536ZM36.1056 19.786C35.3822 20.1099 34.5884 20.2715 33.7241 20.2715C32.8593 20.2715 32.0613 20.1055 31.3298 19.7736C31.0582 19.6499 30.8008 19.5108 30.5583 19.3552L38.8821 11.0429C38.9894 11.2505 39.0863 11.4669 39.1731 11.692C39.4638 12.4474 39.6092 13.2487 39.6092 14.0955C39.6092 14.9422 39.4638 15.7432 39.1731 16.4989C38.8821 17.2542 38.479 17.9098 37.9635 18.4658C37.4481 19.0219 36.829 19.4621 36.1056 19.786ZM37.365 22.3635C38.479 21.882 39.4433 21.2305 40.2579 20.4083C41.0725 19.5868 41.704 18.6278 42.1529 17.5321C42.602 16.4364 42.8265 15.2742 42.8265 14.0458C42.8265 12.817 42.602 11.6548 42.1529 10.5588C41.8867 9.90893 41.559 9.30883 41.17 8.75813L46.5841 3.35152L44.4328 1.20312L39.0022 6.62619C38.5147 6.29422 37.9854 6.00728 37.4148 5.76502C36.3007 5.29193 35.0706 5.05505 33.7241 5.05505C32.3772 5.05505 31.1471 5.29596 30.033 5.77745C28.919 6.25894 27.9547 6.91045 27.1401 7.73231C26.3255 8.55417 25.6936 9.51312 25.2448 10.6088C24.7959 11.7045 24.5715 12.8668 24.5715 14.0955C24.5715 15.3239 24.7959 16.4858 25.2448 17.5819C25.5113 18.232 25.839 18.8321 26.2279 19.3832L20.8142 24.7891L22.9656 26.9375L28.3958 21.5148C28.8833 21.8467 29.4126 22.1337 29.9832 22.3759C31.0973 22.849 32.3274 23.0856 33.6739 23.0856C35.0208 23.0856 36.2509 22.8447 37.365 22.3635V22.3635Z" fill="#2E3148" /> +</svg> diff --git a/img/logo-sdk.svg b/img/logo-sdk.svg new file mode 100644 index 00000000000..444eff2ab36 --- /dev/null +++ b/img/logo-sdk.svg @@ -0,0 +1,10 @@ +<svg width="100%" height="100%" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg" data-v-25cba946=""> + <path fill-rule="evenodd" clip-rule="evenodd" d="M100 6.9282L19.3975 53.4641V146.536L100 193.072L180.603 146.536V53.4641L100 6.9282ZM186.603 50L100 0L13.3975 50V150L100 200L186.603 150V50Z" fill="#5064FB"></path> + <path fill-rule="evenodd" clip-rule="evenodd" d="M100 86.5949L88.6795 93.1308V106.203L100 112.739L111.321 106.203V93.1308L100 86.5949ZM117.321 89.6667L100 79.6667L82.6795 89.6667V109.667L100 119.667L117.321 109.667V89.6667Z" fill="#5064FB"></path> + <path fill-rule="evenodd" clip-rule="evenodd" d="M119.333 120.262L108.013 126.798V139.869L119.333 146.405L130.654 139.869V126.798L119.333 120.262ZM136.654 123.333L119.333 113.333L102.013 123.333V143.333L119.333 153.333L136.654 143.333V123.333Z" fill="#5064FB"></path> + <path fill-rule="evenodd" clip-rule="evenodd" d="M138.667 86.5949L127.346 93.1308V106.203L138.667 112.739L149.987 106.203V93.1308L138.667 86.5949ZM155.987 89.6667L138.667 79.6667L121.346 89.6667V109.667L138.667 119.667L155.987 109.667V89.6667Z" fill="#5064FB"></path> + <path fill-rule="evenodd" clip-rule="evenodd" d="M61.3333 86.5949L50.0128 93.1308V106.203L61.3333 112.739L72.6538 106.203V93.1308L61.3333 86.5949ZM78.6538 89.6667L61.3333 79.6667L44.0128 89.6667V109.667L61.3333 119.667L78.6538 109.667V89.6667Z" fill="#5064FB"></path> + <path fill-rule="evenodd" clip-rule="evenodd" d="M80.6667 120.262L69.3462 126.798V139.869L80.6667 146.405L91.9872 139.869V126.798L80.6667 120.262ZM97.9872 123.333L80.6667 113.333L63.3462 123.333V143.333L80.6667 153.333L97.9872 143.333V123.333Z" fill="#5064FB"></path> + <path fill-rule="evenodd" clip-rule="evenodd" d="M119.333 53.595L108.013 60.1308V73.2026L119.333 79.7385L130.654 73.2026V60.1308L119.333 53.595ZM136.654 56.6667L119.333 46.6667L102.013 56.6667V76.6667L119.333 86.6667L136.654 76.6667V56.6667Z" fill="#5064FB"></path> + <path fill-rule="evenodd" clip-rule="evenodd" d="M80.6667 53.595L69.3462 60.1308V73.2026L80.6667 79.7385L91.9872 73.2026V60.1308L80.6667 53.595ZM97.9872 56.6667L80.6667 46.6667L63.3462 56.6667V76.6667L80.6667 86.6667L97.9872 76.6667V56.6667Z" fill="#5064FB"></path> +</svg> \ No newline at end of file diff --git a/img/logo.svg b/img/logo.svg new file mode 100644 index 00000000000..95ca6d30da5 --- /dev/null +++ b/img/logo.svg @@ -0,0 +1,18 @@ +<svg width="168" height="66" viewBox="0 0 168 66" fill="#2E3148" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" clip-rule="evenodd" d="M40 0V31.5004V54V54.5004L20 66.0004L0 54.5004V54V31.5004V0H40Z" fill="#5064FB" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M20 28.1085L7.10355 35.5543V50.4457L20 57.8915L32.8964 50.4457V35.5543L20 28.1085ZM33.8564 35L20 27L6.14355 35V51L20 59L33.8564 51V35Z" fill="#2E3148" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M20.0001 40.8553L18.1888 41.9011V43.9925L20.0001 45.0383L21.8113 43.9925V41.9011L20.0001 40.8553ZM22.7713 41.3468L20.0001 39.7468L17.2288 41.3468V44.5468L20.0001 46.1468L22.7713 44.5468V41.3468Z" fill="#2E3148" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M23.0934 46.242L21.2821 47.2877V49.3792L23.0934 50.425L24.9047 49.3792V47.2877L23.0934 46.242ZM25.8647 46.7335L23.0934 45.1335L20.3221 46.7335V49.9335L23.0934 51.5335L25.8647 49.9335V46.7335Z" fill="#2E3148" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M26.1867 40.8553L24.3754 41.9011V43.9925L26.1867 45.0383L27.998 43.9925V41.9011L26.1867 40.8553ZM28.958 41.3468L26.1867 39.7468L23.4154 41.3468V44.5468L26.1867 46.1468L28.958 44.5468V41.3468Z" fill="#2E3148" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M13.8134 40.8553L12.0021 41.9011V43.9925L13.8134 45.0383L15.6247 43.9925V41.9011L13.8134 40.8553ZM16.5847 41.3468L13.8134 39.7468L11.0421 41.3468V44.5468L13.8134 46.1468L16.5847 44.5468V41.3468Z" fill="#2E3148" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M16.9067 46.242L15.0954 47.2877V49.3792L16.9067 50.425L18.718 49.3792V47.2877L16.9067 46.242ZM19.678 46.7335L16.9067 45.1335L14.1354 46.7335V49.9335L16.9067 51.5335L19.678 49.9335V46.7335Z" fill="#2E3148" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M23.0934 35.5753L21.2821 36.6211V38.7125L23.0934 39.7583L24.9047 38.7125V36.6211L23.0934 35.5753ZM25.8647 36.0668L23.0934 34.4668L20.3221 36.0668V39.2668L23.0934 40.8668L25.8647 39.2668V36.0668Z" fill="#2E3148" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M16.9067 35.5753L15.0954 36.6211V38.7125L16.9067 39.7583L18.718 38.7125V36.6211L16.9067 35.5753ZM19.678 36.0668L16.9067 34.4668L14.1354 36.0668V39.2668L16.9067 40.8668L19.678 39.2668V36.0668Z" fill="#2E3148" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M62.6667 38.0132L61.3501 36.6799C60.85 37.1464 60.3445 37.5161 59.8332 37.7884C59.3223 38.0604 58.7111 38.1965 58.0001 38.1965C57.4444 38.1965 56.9306 38.0883 56.4584 37.8716C55.9862 37.6548 55.5778 37.3578 55.2333 36.9798C54.8888 36.6021 54.6224 36.1605 54.4333 35.655C54.2444 35.1495 54.1502 34.6076 54.1502 34.0302C54.1502 33.4524 54.2444 32.9134 54.4333 32.4133C54.6224 31.9135 54.8888 31.4775 55.2333 31.1051C55.5778 30.733 55.9862 30.4387 56.4584 30.2219C56.9306 30.0054 57.4444 29.897 58.0001 29.897C58.6666 29.897 59.2611 30.0304 59.7832 30.297C60.3056 30.5635 60.8001 30.9136 61.2664 31.3469L62.5832 29.8305C62.3055 29.5638 62.0112 29.3194 61.7 29.097C61.389 28.8748 61.0501 28.6831 60.6834 28.5221C60.3166 28.3608 59.9139 28.236 59.4749 28.1472C59.036 28.0582 58.5498 28.0137 58.0167 28.0137C57.1278 28.0137 56.3167 28.1722 55.5834 28.4888C54.8499 28.8054 54.2167 29.2387 53.6833 29.7886C53.15 30.3386 52.7362 30.9801 52.4416 31.7136C52.1471 32.4468 52 33.2302 52 34.0635C52 34.9078 52.15 35.6966 52.45 36.4301C52.7499 37.1631 53.1639 37.7992 53.6917 38.3381C54.2194 38.8769 54.8443 39.3018 55.5666 39.613C56.2888 39.9242 57.0779 40.0796 57.9333 40.0796C58.4779 40.0796 58.9751 40.0324 59.425 39.938C59.875 39.8435 60.289 39.7048 60.6667 39.5215C61.0445 39.338 61.3973 39.1213 61.7252 38.8715C62.0528 38.6214 62.3667 38.3352 62.6667 38.0132Z" fill="#161931" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M89.1127 31.3175C89.1127 30.9294 89.2785 30.5996 89.6101 30.3282C89.9415 30.0563 90.4058 29.9206 91.0025 29.9206C91.533 29.9206 92.0579 30.0233 92.5772 30.2284C93.0967 30.4334 93.6216 30.73 94.1518 31.1179L95.2459 29.5715C94.6494 29.0948 94.0111 28.7318 93.3315 28.4826C92.6516 28.2331 91.8866 28.1084 91.0356 28.1084C90.4611 28.1084 89.9306 28.1887 89.4471 28.3496C88.9609 28.5102 88.5467 28.7401 88.2012 29.0394C87.8559 29.3389 87.585 29.6962 87.3862 30.1119C87.1901 30.5276 87.0906 30.9904 87.0906 31.5004C87.0906 32.0435 87.1762 32.5036 87.3475 32.8805C87.5188 33.2573 87.7702 33.5788 88.0963 33.8449C88.4221 34.1109 88.8283 34.3326 89.3089 34.51C89.7924 34.6875 90.3423 34.8479 90.9638 34.9921C91.5055 35.1252 91.9445 35.2526 92.2844 35.3744C92.6214 35.4964 92.8867 35.6268 93.0828 35.7652C93.276 35.9038 93.4089 36.0562 93.4807 36.2224C93.5525 36.3888 93.5882 36.5771 93.5882 36.7877C93.5882 37.2424 93.4033 37.6027 93.0332 37.8686C92.6628 38.1349 92.1627 38.2677 91.533 38.2677C90.8037 38.2677 90.1515 38.1373 89.577 37.8769C89.0023 37.6164 88.4333 37.2424 87.8695 36.7545L86.6431 38.2179C87.3393 38.8496 88.0963 39.318 88.9139 39.6229C89.7318 39.9277 90.5881 40.0801 91.4831 40.0801C92.091 40.0801 92.6492 40.0024 93.1575 39.8474C93.6629 39.692 94.0995 39.4647 94.4586 39.1655C94.8205 38.8662 95.1023 38.5005 95.3067 38.0682C95.5084 37.6359 95.6106 37.1426 95.6106 36.5883C95.6106 36.1006 95.5306 35.6766 95.3702 35.3163C95.2099 34.956 94.9724 34.6404 94.6631 34.3685C94.3535 34.097 93.9613 33.8669 93.4916 33.6784C93.0222 33.4902 92.4805 33.3184 91.8727 33.1631C91.3174 33.0301 90.8616 32.9025 90.4998 32.7806C90.1406 32.6588 89.8588 32.5258 89.6515 32.3815C89.4471 32.2375 89.3064 32.0823 89.2288 31.916C89.1516 31.7496 89.1127 31.5502 89.1127 31.3175Z" fill="#161931" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M111.804 31.4822V39.7972H113.829V28.2026H111.654L108.118 33.6853L104.582 28.2026H102.407V39.7972H104.432V31.5153L108.068 36.9483H108.134L111.804 31.4822Z" fill="#161931" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M130.845 34.0635C130.845 34.6301 130.748 35.1662 130.554 35.6718C130.36 36.1773 130.091 36.616 129.747 36.9881C129.404 37.3602 128.99 37.6548 128.508 37.8716C128.026 38.0883 127.496 38.1965 126.92 38.1965C126.343 38.1965 125.81 38.0854 125.322 37.8632C124.834 37.6409 124.416 37.3409 124.066 36.9634C123.717 36.5854 123.445 36.1438 123.251 35.6383C123.057 35.1329 122.96 34.5966 122.96 34.0302C122.96 33.4634 123.057 32.9273 123.251 32.4219C123.445 31.9162 123.714 31.4775 124.058 31.1051C124.402 30.733 124.815 30.4387 125.297 30.2219C125.78 30.0054 126.309 29.897 126.886 29.897C127.463 29.897 127.995 30.0081 128.483 30.2305C128.971 30.4526 129.39 30.7526 129.739 31.1303C130.088 31.5078 130.36 31.9497 130.554 32.4551C130.748 32.9606 130.845 33.4969 130.845 34.0635ZM132.991 34.0302C132.991 33.2079 132.841 32.4302 132.542 31.6967C132.243 30.9637 131.827 30.3247 131.295 29.7803C130.762 29.2357 130.125 28.8054 129.381 28.4888C128.638 28.1722 127.818 28.0137 126.92 28.0137C126.021 28.0137 125.201 28.1749 124.457 28.4971C123.714 28.8193 123.071 29.2553 122.528 29.8053C121.984 30.3553 121.563 30.997 121.263 31.7302C120.964 32.4635 120.814 33.2412 120.814 34.0635C120.814 34.8856 120.964 35.6631 121.263 36.3966C121.563 37.13 121.979 37.7688 122.511 38.3132C123.043 38.8575 123.681 39.2881 124.424 39.6047C125.167 39.9213 125.988 40.0796 126.886 40.0796C127.784 40.0796 128.605 39.9184 129.348 39.5964C130.091 39.2742 130.734 38.8382 131.278 38.288C131.821 37.7382 132.243 37.0965 132.542 36.3633C132.841 35.63 132.991 34.8523 132.991 34.0302Z" fill="#161931" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M141.502 31.3175C141.502 30.9294 141.668 30.5996 141.999 30.3282C142.331 30.0563 142.795 29.9206 143.392 29.9206C143.922 29.9206 144.447 30.0233 144.967 30.2284C145.486 30.4334 146.011 30.73 146.541 31.1179L147.635 29.5715C147.039 29.0948 146.4 28.7318 145.721 28.4826C145.041 28.2331 144.276 28.1084 143.425 28.1084C142.85 28.1084 142.32 28.1887 141.836 28.3496C141.35 28.5102 140.936 28.7401 140.591 29.0394C140.245 29.3389 139.975 29.6962 139.775 30.1119C139.579 30.5276 139.48 30.9904 139.48 31.5004C139.48 32.0435 139.566 32.5036 139.737 32.8805C139.908 33.2573 140.16 33.5788 140.485 33.8449C140.812 34.1109 141.218 34.3326 141.698 34.51C142.182 34.6875 142.732 34.8479 143.353 34.9921C143.895 35.1252 144.334 35.2526 144.674 35.3744C145.011 35.4964 145.276 35.6268 145.472 35.7652C145.665 35.9038 145.798 36.0562 145.87 36.2224C145.942 36.3888 145.978 36.5771 145.978 36.7877C145.978 37.2424 145.792 37.6027 145.423 37.8686C145.052 38.1349 144.552 38.2677 143.922 38.2677C143.193 38.2677 142.541 38.1373 141.966 37.8769C141.392 37.6164 140.823 37.2424 140.259 36.7545L139.032 38.2179C139.728 38.8496 140.485 39.318 141.303 39.6229C142.121 39.9277 142.977 40.0801 143.873 40.0801C144.48 40.0801 145.038 40.0024 145.547 39.8474C146.052 39.692 146.489 39.4647 146.848 39.1655C147.21 38.8662 147.492 38.5005 147.696 38.0682C147.898 37.6359 148 37.1426 148 36.5883C148 36.1006 147.92 35.6766 147.76 35.3163C147.599 34.956 147.362 34.6404 147.052 34.3685C146.743 34.097 146.351 33.8669 145.881 33.6784C145.411 33.4902 144.87 33.3184 144.262 33.1631C143.707 33.0301 143.251 32.9025 142.889 32.7806C142.53 32.6588 142.248 32.5258 142.041 32.3815C141.836 32.2375 141.696 32.0823 141.618 31.916C141.541 31.7496 141.502 31.5502 141.502 31.3175Z" fill="#161931" /> + <path fill-rule="evenodd" clip-rule="evenodd" d="M76.56 30.5236L71.0106 36.0656C70.939 35.9269 70.8744 35.7824 70.8165 35.6326C70.6227 35.129 70.5258 34.5948 70.5258 34.0305C70.5258 33.4658 70.6227 32.9318 70.8165 32.4283C71.0106 31.9245 71.2793 31.4875 71.6229 31.1165C71.9666 30.7458 72.3795 30.4526 72.8616 30.2366C73.3438 30.0209 73.873 29.9129 74.4492 29.9129C75.0257 29.9129 75.5578 30.0236 76.0452 30.2451C76.2265 30.3274 76.3981 30.4201 76.56 30.5236ZM76.0703 37.8573C75.5881 38.0733 75.0589 38.181 74.4827 38.181C73.9062 38.181 73.3741 38.0704 72.8865 37.849C72.7055 37.7666 72.5339 37.6739 72.3721 37.5702L77.9214 32.0286C77.9929 32.167 78.0575 32.3113 78.1154 32.4614C78.3092 32.9649 78.4061 33.4992 78.4061 34.0636C78.4061 34.6281 78.3092 35.1621 78.1154 35.6659C77.9214 36.1695 77.6526 36.6065 77.309 36.9772C76.9653 37.348 76.5526 37.6414 76.0703 37.8573ZM76.9099 39.5757C77.6526 39.2547 78.2955 38.8203 78.8385 38.2722C79.3816 37.7245 79.8026 37.0852 80.1019 36.3548C80.4013 35.6243 80.5509 34.8495 80.5509 34.0305C80.5509 33.2114 80.4013 32.4365 80.1019 31.7058C79.9244 31.2726 79.706 30.8726 79.4467 30.5054L83.056 26.901L81.6218 25.4688L78.0014 29.0841C77.6764 28.8628 77.3236 28.6715 76.9431 28.51C76.2004 28.1946 75.3804 28.0367 74.4827 28.0367C73.5848 28.0367 72.7647 28.1973 72.022 28.5183C71.2793 28.8393 70.6364 29.2736 70.0934 29.8215C69.5503 30.3694 69.129 31.0087 68.8298 31.7392C68.5306 32.4697 68.381 33.2445 68.381 34.0637C68.381 34.8826 68.5306 35.6572 68.8298 36.3879C69.0075 36.8214 69.226 37.2214 69.4853 37.5888L65.8761 41.1927L67.3103 42.625L70.9305 39.0098C71.2555 39.2312 71.6084 39.4225 71.9888 39.584C72.7315 39.8994 73.5516 40.0571 74.4492 40.0571C75.3472 40.0571 76.1672 39.8964 76.9099 39.5757Z" fill="#161931" /> + <path d="M55.685 60.11C57.302 60.11 58.435 59.252 58.435 57.811V57.789C58.435 56.513 57.599 55.93 55.971 55.534C54.486 55.182 54.134 54.918 54.134 54.324V54.302C54.134 53.796 54.596 53.389 55.388 53.389C56.092 53.389 56.785 53.664 57.478 54.181L58.204 53.158C57.423 52.531 56.532 52.19 55.41 52.19C53.881 52.19 52.781 53.103 52.781 54.423V54.445C52.781 55.864 53.705 56.348 55.344 56.744C56.774 57.074 57.082 57.371 57.082 57.921V57.943C57.082 58.515 56.554 58.911 55.718 58.911C54.772 58.911 54.024 58.548 53.287 57.91L52.473 58.878C53.397 59.703 54.508 60.11 55.685 60.11ZM60.2461 60H63.1171C65.5371 60 67.2091 58.317 67.2091 56.15V56.128C67.2091 53.961 65.5371 52.3 63.1171 52.3H60.2461V60ZM63.1171 53.532C64.7341 53.532 65.7901 54.643 65.7901 56.15V56.172C65.7901 57.679 64.7341 58.768 63.1171 58.768H61.5991V53.532H63.1171ZM69.0706 60H70.4236V57.767L71.6226 56.535L74.2516 60H75.9016L72.5466 55.611L75.7586 52.3H74.0756L70.4236 56.172V52.3H69.0706V60ZM80.7899 60H83.6609C86.0809 60 87.7529 58.317 87.7529 56.15V56.128C87.7529 53.961 86.0809 52.3 83.6609 52.3H80.7899V60ZM83.6609 53.532C85.2779 53.532 86.3339 54.643 86.3339 56.15V56.172C86.3339 57.679 85.2779 58.768 83.6609 58.768H82.1429V53.532H83.6609ZM92.2214 60.132C94.0144 60.132 95.3344 58.757 95.3344 57.107V57.085C95.3344 55.424 94.0254 54.071 92.2434 54.071C90.4614 54.071 89.1414 55.446 89.1414 57.107V57.129C89.1414 58.779 90.4504 60.132 92.2214 60.132ZM92.2434 58.966C91.2094 58.966 90.4724 58.119 90.4724 57.107V57.085C90.4724 56.073 91.1544 55.237 92.2214 55.237C93.2664 55.237 94.0034 56.084 94.0034 57.107V57.129C94.0034 58.13 93.3214 58.966 92.2434 58.966ZM99.5939 60.132C100.727 60.132 101.398 59.681 101.97 59.043L101.167 58.251C100.738 58.68 100.287 58.966 99.6599 58.966C98.6369 58.966 97.9219 58.141 97.9219 57.107V57.085C97.9219 56.073 98.6369 55.237 99.6049 55.237C100.265 55.237 100.694 55.545 101.101 55.963L101.937 55.072C101.387 54.478 100.705 54.071 99.6159 54.071C97.8669 54.071 96.5909 55.457 96.5909 57.107V57.129C96.5909 58.779 97.8669 60.132 99.5939 60.132ZM105.405 60.121C106.307 60.121 106.846 59.648 107.22 59.098V60H108.562V54.192H107.22V57.47C107.22 58.372 106.681 58.9 105.911 58.9C105.119 58.9 104.668 58.394 104.668 57.492V54.192H103.337V57.888C103.337 59.241 104.096 60.121 105.405 60.121ZM110.434 60H111.776V56.722C111.776 55.831 112.282 55.281 113.019 55.281C113.756 55.281 114.196 55.787 114.196 56.689V60H115.527V56.722C115.527 55.787 116.044 55.281 116.77 55.281C117.518 55.281 117.947 55.776 117.947 56.7V60H119.278V56.293C119.278 54.874 118.508 54.071 117.243 54.071C116.363 54.071 115.747 54.478 115.285 55.094C114.977 54.478 114.383 54.071 113.547 54.071C112.656 54.071 112.15 54.555 111.776 55.072V54.192H110.434V60ZM123.768 60.132C124.835 60.132 125.594 59.703 126.144 59.043L125.363 58.35C124.901 58.801 124.439 59.043 123.79 59.043C122.932 59.043 122.261 58.515 122.118 57.569H126.386C126.397 57.437 126.408 57.316 126.408 57.195C126.408 55.523 125.473 54.071 123.625 54.071C121.964 54.071 120.787 55.435 120.787 57.096V57.118C120.787 58.911 122.085 60.132 123.768 60.132ZM122.107 56.689C122.228 55.787 122.8 55.16 123.614 55.16C124.494 55.16 125 55.831 125.088 56.689H122.107ZM127.954 60H129.296V56.722C129.296 55.82 129.835 55.281 130.605 55.281C131.397 55.281 131.848 55.798 131.848 56.7V60H133.179V56.293C133.179 54.951 132.42 54.071 131.111 54.071C130.209 54.071 129.67 54.544 129.296 55.083V54.192H127.954V60ZM136.953 60.099C137.459 60.099 137.822 59.989 138.152 59.802V58.713C137.888 58.845 137.624 58.911 137.327 58.911C136.876 58.911 136.612 58.702 136.612 58.185V55.336H138.174V54.192H136.612V52.597H135.281V54.192H134.544V55.336H135.281V58.394C135.281 59.67 135.974 60.099 136.953 60.099ZM141.42 60.121C142.311 60.121 142.916 59.747 143.312 59.274V60H144.61V56.557C144.61 55.798 144.412 55.182 143.983 54.764C143.576 54.346 142.927 54.115 142.058 54.115C141.134 54.115 140.507 54.302 139.858 54.588L140.221 55.633C140.749 55.413 141.233 55.27 141.882 55.27C142.817 55.27 143.323 55.71 143.323 56.535V56.678C142.872 56.535 142.41 56.436 141.761 56.436C140.342 56.436 139.352 57.052 139.352 58.306V58.328C139.352 59.494 140.331 60.121 141.42 60.121ZM141.794 59.153C141.156 59.153 140.661 58.834 140.661 58.273V58.251C140.661 57.646 141.167 57.283 142.025 57.283C142.553 57.283 143.004 57.382 143.345 57.514V57.91C143.345 58.647 142.674 59.153 141.794 59.153ZM148.318 60.099C148.824 60.099 149.187 59.989 149.517 59.802V58.713C149.253 58.845 148.989 58.911 148.692 58.911C148.241 58.911 147.977 58.702 147.977 58.185V55.336H149.539V54.192H147.977V52.597H146.646V54.192H145.909V55.336H146.646V58.394C146.646 59.67 147.339 60.099 148.318 60.099ZM151.135 53.301H152.565V52.036H151.135V53.301ZM151.179 60H152.521V54.192H151.179V60ZM157.242 60.132C159.035 60.132 160.355 58.757 160.355 57.107V57.085C160.355 55.424 159.046 54.071 157.264 54.071C155.482 54.071 154.162 55.446 154.162 57.107V57.129C154.162 58.779 155.471 60.132 157.242 60.132ZM157.264 58.966C156.23 58.966 155.493 58.119 155.493 57.107V57.085C155.493 56.073 156.175 55.237 157.242 55.237C158.287 55.237 159.024 56.084 159.024 57.107V57.129C159.024 58.13 158.342 58.966 157.264 58.966ZM161.919 60H163.261V56.722C163.261 55.82 163.8 55.281 164.57 55.281C165.362 55.281 165.813 55.798 165.813 56.7V60H167.144V56.293C167.144 54.951 166.385 54.071 165.076 54.071C164.174 54.071 163.635 54.544 163.261 55.083V54.192H161.919V60Z" fill="#5064FB" /> +</svg> diff --git a/index.html b/index.html new file mode 100644 index 00000000000..1f7da4cd630 --- /dev/null +++ b/index.html @@ -0,0 +1,26 @@ +<!doctype html> +<html lang="en" dir="ltr" data-has-hydrated="false"> +<head> +<meta charset="UTF-8"> +<meta name="generator" content="Docusaurus v2.4.3"> +<title data-rh="true">Cosmos Hub + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/main.html b/main.html new file mode 100644 index 00000000000..efad159393e --- /dev/null +++ b/main.html @@ -0,0 +1,28 @@ + + + + + +Introduction | Cosmos Hub + + + + + + + + + + + + + + +
+

Introduction

Welcome to the Cosmos Hub

Introduction

The Cosmos Hub is the first of thousands of interconnected blockchains that will eventually comprise the Cosmos Network. The primary token of the Cosmos Hub is the ATOM, but the Hub will support many tokens in the future.

The ATOM

Do you have ATOM tokens? With ATOM, you have the superpower to contribute to the security and governance of the Cosmos Hub. Delegate your ATOM to one or more of the validators on the Cosmos Hub blockchain to earn more ATOM through Proof-of-Stake. You can also vote with your ATOM to influence the future of the Cosmos Hub through on-chain governance proposals.

Learn more about being a delegator, learn about the security risks, and start participating with one of the following wallets.

Cosmos Hub Wallets

tip

Do your own research and take precautions in regards to wallet security. Maintaining proper security practices is solely your responsibility when using third party wallets.

These community-maintained web and mobile wallets allow you to store & transfer ATOM, delegate ATOM to validators, and vote on on-chain governance proposals. Note that we do not endorse any of the wallets, they are listed for your convenience.

Metamask Snaps

Cosmos Hub Explorers

These block explorers allow you to search, view and analyze Cosmos Hub datalike blocks, transactions, validators, etc.

Cosmos Hub CLI

gaiad is a command-line interface that lets you interact with the Cosmos Hub. gaiad is the only tool that supports 100% of the Cosmos Hub features, including accounts, transfers, delegation, and governance. Learn more about gaiad with the delegator's CLI guide.

Running a full-node on the Cosmos Hub Mainnet

In order to run a full-node for the Cosmos Hub mainnet, you must first install gaiad. Then, follow the guide. +If you are looking to run a validator node, follow the [validator setup guide](./validators/valid +ator-setup).

Join the Community

Have questions, comments, or new ideas? Participate in the Cosmos community through one of the following channels.

To learn more about the Cosmos Hub and how it fits within the Cosmos Network, visit cosmos.network.

+ + + + \ No newline at end of file diff --git a/main.html.html b/main.html.html new file mode 100644 index 00000000000..e9fbad1c343 --- /dev/null +++ b/main.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/architecture.html b/main/architecture.html new file mode 100644 index 00000000000..bac83b98205 --- /dev/null +++ b/main/architecture.html @@ -0,0 +1,35 @@ + + + + + +Architecture Decision Records (ADR) | Cosmos Hub + + + + + + + + + + + + + + +
+

Architecture Decision Records (ADR)

This is a location to record all high-level architecture decisions for new feature and module proposals in the Cosmos Hub.

An Architectural Decision (AD) is a software design choice that addresses a functional or non-functional requirement that is architecturally significant. +An Architecturally Significant Requirement (ASR) is a requirement that has a measurable effect on a software system’s architecture and quality. +An Architectural Decision Record (ADR) captures a single AD, such as often done when writing personal notes or meeting minutes; the collection of ADRs created and maintained in a project constitute its decision log. All these are within the topic of Architectural Knowledge Management (AKM).

You can read more about the ADR concept here.

Rationale

ADRs are intended to be the primary mechanism for proposing new feature designs and new processes, for collecting community input on an issue, and for documenting the design decisions. +An ADR should provide:

  • Context on the relevant goals and the current state
  • Proposed changes to achieve the goals
  • Summary of pros and cons
  • Discarded solution spaces and why they were discarded
  • References
  • Changelog

Note the distinction between an ADR and a spec. The ADR provides the context, intuition, reasoning, and +justification for a change in architecture, or for the architecture of something +new. The spec is much more compressed and streamlined summary of everything as +it stands today.

If recorded decisions turn out to be lacking, convene a discussion, record the new decisions here, and then modify the code to match.

Creating new ADR

Read about the PROCESS.

Use RFC 2119 Keywords

When writing ADRs, follow the same best practices for writing RFCs. +When writing RFCs, key words are used to signify the requirements in the specification. +These words are often capitalized: "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL. +They are to be interpreted as described in RFC 2119.

ADR Table of Contents

Accepted

  • n/a

Proposed

  • n/a

Draft

  • n/a

Rejected

Deprecated

+ + + + \ No newline at end of file diff --git a/main/architecture.html.html b/main/architecture.html.html new file mode 100644 index 00000000000..d6a8e3b1ac0 --- /dev/null +++ b/main/architecture.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/architecture/PROCESS.html b/main/architecture/PROCESS.html new file mode 100644 index 00000000000..3dfe76bb3b4 --- /dev/null +++ b/main/architecture/PROCESS.html @@ -0,0 +1,26 @@ + + + + + +ADR Creation Process | Cosmos Hub + + + + + + + + + + + + + + +
+

ADR Creation Process

  1. Copy the adr-template.md file. Use the following filename pattern: adr-next_number-title.md
  2. Create a draft Pull Request and solicit input from the stewarding team, if you want to get an early feedback.
  3. Make sure that the problem, the context and a recommended solution is clear and well documented. Be sure to document alternate solution spaces and give reasons why they have been discarded.
  4. Add an entry to a list in the README file Table of Contents.
  5. Create a Pull Request to propose a new ADR.

ADR life cycle

ADR creation is an iterative process. Instead of trying to solve all decisions in a single ADR pull request, we MUST firstly understand the problem and collect feedback through a GitHub Issue.

  1. Every proposal SHOULD start with a new GitHub Issue or be a result of existing Issues. The Issue should contain just a brief proposal summary.

  2. Once the motivation is validated, a GitHub Pull Request (PR) is created with a new document based on the adr-template.md.

  3. An ADR doesn't have to arrive to main with an accepted status in a single PR. If the motivation is clear and the solution is sound, we SHOULD be able to merge it and keep a proposed status. It's preferable to have an iterative approach rather than long, not merged Pull Requests.

  4. If a proposed ADR is merged, then it should clearly document outstanding issues either in ADR document notes or in a GitHub Issue.

  5. The PR SHOULD always be merged. In the case of a faulty ADR, we still prefer to merge it with a rejected status. The only time the ADR SHOULD NOT be merged is if the author abandons it.

  6. Merged ADRs SHOULD NOT be deleted.

ADR status

Status has two components:

{CONSENSUS STATUS} {IMPLEMENTATION STATUS}

IMPLEMENTATION STATUS is either Implemented or Not Implemented.

Consensus Status

flowchart TD
A[DRAFT] --> B[PROPOSED]
B --> C[LAST CALL YYYY-MM-DD]
B --> D[ABANDONED]
C --> E[ACCEPTED or REJECTED]
E --> F[SUPERSEDED by ADR-xxx]
  • DRAFT: [optional] an ADR which is work in progress, not being ready for a general review. This is to present an early work and get an early feedback in a Draft Pull Request form.
  • PROPOSED: an ADR covering a full solution architecture and still in the review - project stakeholders haven't reached an agreement yet.
  • LAST CALL <date for the last call>: [optional] clear notify that we are close to accept updates. Changing a status to LAST CALL means that social consensus (of Cosmos SDK maintainers) has been reached and we still want to give it a time to let the community react or analyze.
  • ACCEPTED: ADR which will represent a currently implemented or to be implemented architecture design.
  • REJECTED: ADR can go from PROPOSED or ACCEPTED to rejected if the consensus among project stakeholders will decide so.
  • SUPERSEEDED by ADR-xxx: ADR which has been superseded by a new ADR.
  • ABANDONED: the ADR is no longer pursued by the original authors.

Language used in ADR

  • The context/background should be written in the present tense.
  • Avoid using a first, personal form.
+ + + + \ No newline at end of file diff --git a/main/architecture/PROCESS.html.html b/main/architecture/PROCESS.html.html new file mode 100644 index 00000000000..7bcff1709dd --- /dev/null +++ b/main/architecture/PROCESS.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/architecture/adr.html b/main/architecture/adr.html new file mode 100644 index 00000000000..e4b79d4cc44 --- /dev/null +++ b/main/architecture/adr.html @@ -0,0 +1,35 @@ + + + + + +README | Cosmos Hub + + + + + + + + + + + + + + +
+

README

Architecture Decision Records (ADR)

This is a location to record all high-level architecture decisions for new feature and module proposals in the Cosmos Hub.

An Architectural Decision (AD) is a software design choice that addresses a functional or non-functional requirement that is architecturally significant. +An Architecturally Significant Requirement (ASR) is a requirement that has a measurable effect on a software system’s architecture and quality. +An Architectural Decision Record (ADR) captures a single AD, such as often done when writing personal notes or meeting minutes; the collection of ADRs created and maintained in a project constitute its decision log. All these are within the topic of Architectural Knowledge Management (AKM).

You can read more about the ADR concept here.

Rationale

ADRs are intended to be the primary mechanism for proposing new feature designs and new processes, for collecting community input on an issue, and for documenting the design decisions. +An ADR should provide:

  • Context on the relevant goals and the current state
  • Proposed changes to achieve the goals
  • Summary of pros and cons
  • Discarded solution spaces and why they were discarded
  • References
  • Changelog

Note the distinction between an ADR and a spec. The ADR provides the context, intuition, reasoning, and +justification for a change in architecture, or for the architecture of something +new. The spec is much more compressed and streamlined summary of everything as +it stands today.

If recorded decisions turn out to be lacking, convene a discussion, record the new decisions here, and then modify the code to match.

Creating new ADR

Read about the PROCESS.

Use RFC 2119 Keywords

When writing ADRs, follow the same best practices for writing RFCs. +When writing RFCs, key words are used to signify the requirements in the specification. +These words are often capitalized: "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL. +They are to be interpreted as described in RFC 2119.

ADR Table of Contents

Accepted

  • n/a

Proposed

Draft

  • n/a

Rejected

Deprecated

+ + + + \ No newline at end of file diff --git a/main/architecture/adr.html.html b/main/architecture/adr.html.html new file mode 100644 index 00000000000..383eae33b78 --- /dev/null +++ b/main/architecture/adr.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/architecture/adr/PROCESS.html b/main/architecture/adr/PROCESS.html new file mode 100644 index 00000000000..f5a8f2e140b --- /dev/null +++ b/main/architecture/adr/PROCESS.html @@ -0,0 +1,26 @@ + + + + + +ADR Creation Process | Cosmos Hub + + + + + + + + + + + + + + +
+

ADR Creation Process

  1. Copy the adr-template.md file. Use the following filename pattern: adr-next_number-title.md
  2. Create a draft Pull Request and solicit input from the stewarding team, if you want to get an early feedback.
  3. Make sure that the problem, the context and a recommended solution is clear and well documented. Be sure to document alternate solution spaces and give reasons why they have been discarded.
  4. Add an entry to a list in the README file Table of Contents.
  5. Create a Pull Request to propose a new ADR.

ADR life cycle

ADR creation is an iterative process. Instead of trying to solve all decisions in a single ADR pull request, we MUST firstly understand the problem and collect feedback through a GitHub Issue.

  1. Every proposal SHOULD start with a new GitHub Issue or be a result of existing Issues. The Issue should contain just a brief proposal summary.

  2. Once the motivation is validated, a GitHub Pull Request (PR) is created with a new document based on the adr-template.md.

  3. An ADR doesn't have to arrive to main with an accepted status in a single PR. If the motivation is clear and the solution is sound, we SHOULD be able to merge it and keep a proposed status. It's preferable to have an iterative approach rather than long, not merged Pull Requests.

  4. If a proposed ADR is merged, then it should clearly document outstanding issues either in ADR document notes or in a GitHub Issue.

  5. The PR SHOULD always be merged. In the case of a faulty ADR, we still prefer to merge it with a rejected status. The only time the ADR SHOULD NOT be merged is if the author abandons it.

  6. Merged ADRs SHOULD NOT be deleted.

ADR status

Status has two components:

{CONSENSUS STATUS} {IMPLEMENTATION STATUS}

IMPLEMENTATION STATUS is either Implemented or Not Implemented.

Consensus Status

flowchart TD
A[DRAFT] --> B[PROPOSED]
B --> C[LAST CALL YYYY-MM-DD]
B --> D[ABANDONED]
C --> E[ACCEPTED or REJECTED]
E --> F[SUPERSEDED by ADR-xxx]
  • DRAFT: [optional] an ADR which is work in progress, not being ready for a general review. This is to present an early work and get an early feedback in a Draft Pull Request form.
  • PROPOSED: an ADR covering a full solution architecture and still in the review - project stakeholders haven't reached an agreement yet.
  • LAST CALL <date for the last call>: [optional] clear notify that we are close to accept updates. Changing a status to LAST CALL means that social consensus (of Cosmos SDK maintainers) has been reached and we still want to give it a time to let the community react or analyze.
  • ACCEPTED: ADR which will represent a currently implemented or to be implemented architecture design.
  • REJECTED: ADR can go from PROPOSED or ACCEPTED to rejected if the consensus among project stakeholders will decide so.
  • SUPERSEEDED by ADR-xxx: ADR which has been superseded by a new ADR.
  • ABANDONED: the ADR is no longer pursued by the original authors.

Language used in ADR

  • The context/background should be written in the present tense.
  • Avoid using a first, personal form.
+ + + + \ No newline at end of file diff --git a/main/architecture/adr/PROCESS.html.html b/main/architecture/adr/PROCESS.html.html new file mode 100644 index 00000000000..f22e5429c6a --- /dev/null +++ b/main/architecture/adr/PROCESS.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/architecture/adr/adr-001-interchain-accounts.html b/main/architecture/adr/adr-001-interchain-accounts.html new file mode 100644 index 00000000000..72a6e693d12 --- /dev/null +++ b/main/architecture/adr/adr-001-interchain-accounts.html @@ -0,0 +1,26 @@ + + + + + +adr-001-interchain-accounts | Cosmos Hub + + + + + + + + + + + + + + +
+

adr-001-interchain-accounts

ADR 001: Interchain Accounts

Changelog

  • 2022-02-04: added content
  • 2022-01-19: init
  • 2023-06-28: mark as rejected

Status

REJECTED Not Implemented

Reason: The IBC team decided to integrate this functionality directly into their codebase and maintain it, because multiple users require it.

Abstract

This is the Core Interchain Accounts Module. It allows the Cosmos Hub to act as a host chain with interchain accounts that are controlled by external IBC connected "Controller" blockchains. Candidate chains include Umee, Quicksilver, Sommelier. It is also a necessary component for a Authentication Module that allows the Cosmos Hub to act as a Controller chain as well. This will be recorded in a separate ADR.

Rationale

This allows the Hub to participate in advanced cross-chain defi operations, like Liquid Staking and various protocol controlled value applications.

Desired Outcome

The hub can be used trustlessly as a host chain in the configuration of Interchain Accounts.

Consequences

There has been preliminary work done to understand if this increases any security feature of the Cosmos Hub. One thought was that this capability is similar to contract to contract interactions which are possible on virtual machine blockchains like EVM chains. Those interactions introduced a new attack vector, called a re-entrancy bug, which was the culprit of "The DAO hack on Ethereum". We believe there is no risk of these kinds of attacks with Interchain Accounts because they require the interactions to be atomic and Interchain Accounts are asynchronous.

Backwards Compatibility

This is the first of its kind.

Forward Compatibility

There are future releases of Interchain Accounts which are expected to be backwards compatible.

Technical Specification

ICS-27 Spec

Development

  • Integration requirements
    • Development has occurred in IBC-go and progress tracked on the project board there.
  • Testing (Simulations, Core Team Testing, Partner Testing)
    • Simulations and Core Team tested this module
  • Audits (Internal Dev review, Third-party review, Bug Bounty)
    • An internal audit, an audit from Informal Systems, and an audit from Trail of Bits all took place with fixes made to all findings.
  • Networks (Testnets, Productionnets, Mainnets)
    • Testnets

Governance [optional]

  • Needs Signaling Proposal
  • Core Community Governance
    • N/A
  • Steering Community
    • N/A. Possibly Aditya Srinpal, Sean King, Bez?
  • Timelines & Roadmap
    • Expected to be released as part of IBC 3.0 in Feb 2022 (currently in beta release)

Project Integrations [optional]

  • Gaia Integrations
  • Integration Partner
    • IBC Team

Downstream User Impact Report

(Needs to be created)

Upstream Partner Impact Report

(Needs to be created)

Inter-module Dependence Report

(Needs to be created)

Support

Documentation

Additional Research & References

+ + + + \ No newline at end of file diff --git a/main/architecture/adr/adr-001-interchain-accounts.html.html b/main/architecture/adr/adr-001-interchain-accounts.html.html new file mode 100644 index 00000000000..2d568dace00 --- /dev/null +++ b/main/architecture/adr/adr-001-interchain-accounts.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/architecture/adr/adr-002-globalfee.html b/main/architecture/adr/adr-002-globalfee.html new file mode 100644 index 00000000000..35e3c60d3cc --- /dev/null +++ b/main/architecture/adr/adr-002-globalfee.html @@ -0,0 +1,34 @@ + + + + + +ADR 002: Globalfee Module | Cosmos Hub + + + + + + + + + + + + + + +
+

ADR 002: Globalfee Module

Changelog

  • 2023-06-12: Initial Draft
  • 2024-06-06: Change status to deprecated

Status

Deprecated

Context

The globalfee module was created to manage a parameter called MinimumGasPricesParam, which sets a network-wide minimum fee requirement. The intention was to stop random denominations from entering fee collections and to reduce the time validators take to check a long list of transaction fees. To address scenarios where no fee payment is required but the denominations for volunteered paid fees are still restricted, the zero coins was introduced to serve as a means of limiting the denoms. Nevertheless, the initial version of the globalfee module had some issues:

  • In the globalfee module, several Cosmos SDK coins methods were redefined because of the allowance of zero-value coins in the MinimumGasPricesParam. The MinimumGasPricesParam is of sdk.DecCoins type. In the Cosmos SDK, sdk.DecCoins are sanitized to remove zero-value coins. As a result, several methods from sdk.Coins were redefined in the Gaia fee antehandler.

  • BypassMinFeeMsgTypes exists in app.toml, which means each node can define its own value. Thus, it's not clear whether a transaction containing bypass-messages will be exempted from paying a fee.

  • The fee check logic is only executed in CheckTx. This could enable malicious validators to change the fee check code and propose transactions that do not meet the fee requirement.

Decision

To fix these problems, the following changes are added to the globalfee module:

  • ZeroCoins in MinimumGasPricesParam:\ +Refactor the fee check logics, in order to use the Cosmos SDK coins' methods instead of the redefined methods.
  • Bypass Message Types:\ +BypassMinFeeMsgTypes is refactored to be a param of the globalfee module, in order to make the bypass messages deterministic.
  • Check Fees in DeliverTx:\ +The fee check is factored to executed in both DeliverTx and CheckTx. This is to prevent malicious validators from changing the fee check logic and allowing any transactions to pass fee check. As a consequence, MinimumGasPricesParam is introduced as a globalfee param.

ZeroCoins in MinimumGasPricesParam

Coins Split

CombinedFeeRequirement refers to the fee requirement that takes into account both globalFees (MinimumGasPricesParam in the globalfee module) and localFees (minimum-gas-prices in app.toml). This requirement is calculated as the maximum value between globalFees and localFees for denomination exists globalFees. +The allowance of zero coins in the MinimumGasPricesParam within the globalfee module implies that CombinedFeeRequirement(globalFees, localFees) also permits zero coins. Therefore, the CombinedFeeRequirement doesn't meet the requirements of certain sdk.Coins methods. For instance, the DenomsSubsetOf method requires coins that do not contain zero coins.

To address this issue, the CombinedFeeRequirement and feeCoins are split as shown in the chart below.

---
title: Fee Requirements and Fee Splits
---
flowchart TD
subgraph feeReq
A[CombinedFeeRequirement]-->B[/Split zero/nonzero coins/]
B-->|zero coins| C[zeroCoinFeesDenomReq];
B-->|nonzero coins| D[nonzeroCoinFeesDenomReq];

end

subgraph feeCoin
E[feeCoins]-->F[/Split by the denoms in zero/nonzero CoinFeesDenomReq/]
F-->|denoms in zeroCoinFeesDenomReq set| G[feeCoinsZeroDenom]
F-->|denoms in nonzeroCoinFeesDenomReq set| H[feeCoinsNonZeroDenom]
end

The CombinedFeeRequirement is split into zero and non-zero coins, forming nonZeroCoinFeesReq and zeroCoinFeesDenomReq. Similarly, the paid fees (feeCoins) are split into feeCoinsNonZeroDenom and feeCoinsZeroDenom, based on the denominations of nonZeroCoinFeesReq and zeroCoinFeesDenomReq as shown in the following code snippet.

    nonZeroCoinFeesReq, zeroCoinFeesDenomReq := getNonZeroFees(feeRequired)

// feeCoinsNonZeroDenom contains non-zero denominations from the feeRequired
// feeCoinsNonZeroDenom is used to check if the fees meets the requirement imposed by nonZeroCoinFeesReq
// when feeCoins does not contain zero coins' denoms in feeRequired
feeCoinsNonZeroDenom, feeCoinsZeroDenom := splitCoinsByDenoms(feeCoins, zeroCoinFeesDenomReq)

Fee Checks

The Workflow of feeCheck is shown below:

---
title: Fee Check
---
flowchart TD

A[feeCoinsNonZeroDenom]-->B[/DenomsSubsetOf_nonZeroCoinFeesReq/];
B-->|yes|C[is_bypass_msg];
B-->|no|D((reject));

C-->|yes|pass1((pass));
C-->|no|D[/contain_zeroCoinFeesDenomReq_denom/];

D-->|yes|pass2((pass));
D-->|no|E[/feeCoinsZeroDenom_nonEmpty/];


E-->|yes|pass3((pass));
E-->|no|F[/IsAnyGTE_nonZeroCoinFeesDenomReq/];

F-->|yes|pass4((pass));
F-->|no|reject2((reject));

The split enable checking feeCoinsNonZeroDenom against nonZeroCoinFeesReq, and feeCoinsZeroDenom against +zeroCoinFeesDenomReq (as shown in the following code snippet). In the check of feeCoinsNonZeroDenom against nonZeroCoinFeesReq, the Cosmos SDK coins' methods can be used since zero coins are removed from the nonZeroCoinFeesReq, while in the check feeCoinsZeroDenom against zeroCoinFeesDenomReq, only denoms need to be checked.

Checking feeCoinsNonZeroDenom against nonZeroCoinFeesReq:

    if !feeCoinsNonZeroDenom.IsAnyGTE(nonZeroCoinFeesReq) {
return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "insufficient fees; got: %s required: %s", feeCoins.String(), feeRequired.String())
}

Here is an example of how the coins split and checked in fee antehandler:

assumption:

globalfee=[1photon, 0uatom, 1stake] and local min-gas-prices=[0.5stake]

fee requirement:

combinedFeeRequirement=[1photon, 0uatom, 1stake]

split fee requirement:

the combinedFeeRequirement into nonZeroCoinFeesReq=[0uatom], and nonZeroCoinFeesReq=[1photon, 1stake]

split the paid fees:

if paidFee=[1uatom, 0.5photon], +the splitCoinsByDenoms splits the paidFee into feeCoinsZeroDenom=[1uatom] (the same denom as zero coins in combinedFeeRequirement), and feeCoinsNonZeroDenom=[0.5stake] +then feeCoinsZeroDenom=[1uatom] is checked by nonZeroCoinFeesReq=[1photon, 1stake].

Please note that feeCoins does not contain zero coins. The fee coins are split according to the denoms in zeroCoinFeesDenomReq or nonZeroCoinFeesDenomReq. If feeCoins contains coins not in both zeroCoinFeesDenomReq and nonZeroCoinFeesDenomReq, the transaction should be rejected. On the contrary, if feeCoins' denoms are in either zeroCoinFeesDenomReq or nonZeroCoinFeesDenomReq, and len(zeroCoinFeesDenomReq)!=0, the transaction can directly pass, otherwise, the fee amount need to be checked.

Bypass Message Types

BypassMinFeeMsgTypes was a setup in config/app.toml before the refactor. BypassMinFeeMsgTypes is refactored to be a param of the globalfee module to get a network level agreement. Correspondingly,MaxTotalBypassMinFeeMsgGasUsage is also introduced as a globalfee param.

Fee Checks in DeliverTx

Implementing fee checks within the DeliverTx function introduces a few requirements:

  • Deterministic Minimum Fee Requirement: For the DeliverTx process, it is essential to have a deterministic minimum fee requirement. In CheckTx, fee is checked by the CombinedFeeRequirement(globalFees, localFees), which considers both minimum-gas-prices from config/app.toml and MinimumGasPricesParam from the globalfee Params (For more details, see globalfee). CombinedFeeRequirement contains non-deterministic part: minimum-gas-prices from app.toml. Therefore, CombinedFeeRequirement cannot be used in DeliverTx. In DeliverTx, only MinimumGasPricesParam in globalfee Params is used for fee verification. The code implementation is shown below.
func (mfd FeeDecorator) GetTxFeeRequired(ctx sdk.Context, tx sdk.FeeTx) (sdk.Coins, error) {
// Get required global fee min gas prices
// Note that it should never be empty since its default value is set to coin={"StakingBondDenom", 0}
globalFees, err := mfd.GetGlobalFee(ctx, tx)
if err != nil {
return sdk.Coins{}, err
}

// In DeliverTx, the global fee min gas prices are the only tx fee requirements.
if !ctx.IsCheckTx() {
return globalFees, nil
}

// In CheckTx mode, the local and global fee min gas prices are combined
// to form the tx fee requirements

// Get local minimum-gas-prices
localFees := GetMinGasPrice(ctx, int64(tx.GetGas()))

// Return combined fee requirements
return CombinedFeeRequirement(globalFees, localFees)
}
  • Deterministic Bypass Parameters: The decision of whether a message can bypass the minimum fee has to be deterministic as well. To ensure this, BypassMinFeeMsgTypes and MaxTotalBypassMinFeeMsgGasUsage parameters are moved to a persistent store.

  • Module Initialization Order: The genutils module must be initialized before the globalfee module. This is due to the DeliverGenTxs in the genutils module, is called during initGenesis. This function executes DeliverTx, which subsequently calls the AnteHandle in FeeDecorator, triggering the fee check in DeliverTx. +To prevent the DeliverGenTxs go through a fee check, the initialization of the globalfee module should occur after the genutils module. This sequencing ensures that all necessary components are in place when the fee check occurs. See Gaia Issue #2489 for more context.

Consequences

Positive

This refactor results in code that is easier to maintain. It prevents malicious validators from escaping fee checks and make the bypass messages work at network level.

Negative

The introduction of FeeDecorator has replaced the usage of MempoolFeeDecorator in the Cosmos SDK. Currently, if both FeeDecorator and MempoolFeeDecorator are added to the AnteDecorator chain, it will result in redundant checks. However, there's potential for FeeDecorator and MempoolFeeDecorator to become incompatible in the future, depending on updates to the Cosmos SDK.

References

+ + + + \ No newline at end of file diff --git a/main/architecture/adr/adr-002-globalfee.html.html b/main/architecture/adr/adr-002-globalfee.html.html new file mode 100644 index 00000000000..c27dfbfc143 --- /dev/null +++ b/main/architecture/adr/adr-002-globalfee.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/architecture/adr/adr-003-ica-controller.html b/main/architecture/adr/adr-003-ica-controller.html new file mode 100644 index 00000000000..ddd1435d56d --- /dev/null +++ b/main/architecture/adr/adr-003-ica-controller.html @@ -0,0 +1,26 @@ + + + + + +ADR 003: Interchain Accounts Controller Module | Cosmos Hub + + + + + + + + + + + + + + +
+

ADR 003: Interchain Accounts Controller Module

Changelog

  • 2024-03-08: Initial Draft

Status

Proposed

Abstract

The Interchain Accounts Controller IBC module allows users of one chain to create and control accounts on other chains. The Hub currently doesn't have ICA Controller module enabled, so it is not possible to create accounts on other chains from the Hub chain.

Context

Enabling the ICA Controller module on the Hub would support various use cases. One such case could be the provider-based governance that would allow the ATOM stakers to participate in a governance on consumer chains.

Decision

The ICA Controller module will be included in the application, so the Hub will have both ICA Host and Controller modules. The implementation will use the Controller module's built-in authentication mechanism, since we don't have a need for custom authentication logic. According to this, users will directly use MsgRegisterInterchainAccount and MsgSendTx messages defined by the Controller module. The possibility provided by the Controller module to define underlying application to have custom processing of IBC messages exchanged by the Controller module (e.g. OnChanOpenInit, OnAcknowledgementPacket, etc.) will not be used, since there is currently no need for this.

// ICA Controller keeper
appKeepers.ICAControllerKeeper = icacontrollerkeeper.NewKeeper(
appCodec,
appKeepers.keys[icacontrollertypes.StoreKey],
appKeepers.GetSubspace(icacontrollertypes.SubModuleName),
appKeepers.IBCKeeper.ChannelKeeper, // ICS4Wrapper
appKeepers.IBCKeeper.ChannelKeeper,
&appKeepers.IBCKeeper.PortKeeper,
appKeepers.ScopedICAControllerKeeper,
bApp.MsgServiceRouter(),
)

// Create ICA module
appKeepers.ICAModule = ica.NewAppModule(&appKeepers.ICAControllerKeeper, &appKeepers.ICAHostKeeper)

// Create Interchain Accounts Controller Stack
var icaControllerStack porttypes.IBCModule = icacontroller.NewIBCMiddleware(nil, appKeepers.ICAControllerKeeper)

// Add Interchain Accounts Controller IBC route
ibcRouter.AddRoute(icacontrollertypes.SubModuleName, icaControllerStack)

Consequences

Positive

  • Users of the Hub will have a possibility to create and utilize Interchain Accounts on other IBC connected chains.

Negative

Neutral

  • Since we don't need to implement a custom authentication mechanism, we can rely on the one defined by the Controller module itself, implemented through the MsgRegisterInterchainAccount and MsgSendTx messages.

References

https://github.com/cosmos/gaia/issues/2869

+ + + + \ No newline at end of file diff --git a/main/architecture/adr/adr-003-ica-controller.html.html b/main/architecture/adr/adr-003-ica-controller.html.html new file mode 100644 index 00000000000..51123d0ac93 --- /dev/null +++ b/main/architecture/adr/adr-003-ica-controller.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/architecture/templates/adr-template.html b/main/architecture/templates/adr-template.html new file mode 100644 index 00000000000..7ce13a591ff --- /dev/null +++ b/main/architecture/templates/adr-template.html @@ -0,0 +1,35 @@ + + + + + +adr-template | Cosmos Hub + + + + + + + + + + + + + + +
+

adr-template

ADR {ADR-NUMBER}: {TITLE}

Changelog

  • {date}: {changelog}

Status

{DRAFT | PROPOSED} Not Implemented

Please have a look at the PROCESS page. +Use DRAFT if the ADR is in a draft stage (draft PR) or PROPOSED if it's in review.

Abstract

"If you can't explain it simply, you don't understand it well enough." Provide +a simplified and layman-accessible explanation of the ADR. +A short (~200 word) description of the issue being addressed.

Context

This section contains all the context one needs to understand the current state, and why there is a problem. +It should be as succinct as possible and introduce the high level idea behind the solution. +The language in this section is value-neutral. It is simply describing facts.

Decision

This section explains all of the details of the proposed solution, including implementation details. +It should also describe affects / corollary items that may need to be changed as a part of this. +If the proposed change will be large, please also indicate a way to do the change to maximize ease of review. +(e.g. the optimal split of things to do between separate PR's)

Consequences

This section describes the consequences, after applying the decision. +All consequences should be summarized here, not just the "positive" ones.

Positive

{positive consequences}

Negative

{negative consequences}

Neutral

{neutral consequences}

References

Are there any relevant PR comments, issues that led up to this, or articles referenced for why we made the given design choice? If so link them here!

  • {reference link}
+ + + + \ No newline at end of file diff --git a/main/architecture/templates/adr-template.html.html b/main/architecture/templates/adr-template.html.html new file mode 100644 index 00000000000..bc49598bb51 --- /dev/null +++ b/main/architecture/templates/adr-template.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/delegators.html b/main/delegators.html new file mode 100644 index 00000000000..f327d3ac97b --- /dev/null +++ b/main/delegators.html @@ -0,0 +1,26 @@ + + + + + +Delegators | Cosmos Hub + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/main/delegators.html.html b/main/delegators.html.html new file mode 100644 index 00000000000..f873494c6e2 --- /dev/null +++ b/main/delegators.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/delegators/delegator-faq.html b/main/delegators/delegator-faq.html new file mode 100644 index 00000000000..cb46db03c8f --- /dev/null +++ b/main/delegators/delegator-faq.html @@ -0,0 +1,26 @@ + + + + + +Delegator FAQ | Cosmos Hub + + + + + + + + + + + + + + +
+

Delegator FAQ

What is a delegator?

People who cannot or do not want to operate validator nodes can still participate in the staking process as delegators. Indeed, validators are not chosen based on their self-delegated stake but based on their total stake, which is the sum of their self-delegated stake and of the stake that is delegated to them. This is an important property, as it makes delegators a safeguard against validators that exhibit bad behavior. If a validator misbehaves, their delegators will move their Atoms away from them, thereby reducing their stake. Eventually, if a validator's stake falls under the top 180 addresses with highest stake, they will exit the validator set.

Delegators share the revenue of their validators, but they also share the risks. In terms of revenue, validators and delegators differ in that validators can apply a commission on the revenue that goes to their delegator before it is distributed. This commission is known to delegators beforehand and can only change according to predefined constraints (see section below). In terms of risk, delegators' Atoms can be slashed if their validator misbehaves. For more, see Risks section.

To become delegators, Atom holders need to send a "Delegate transaction" where they specify how many Atoms they want to bond and to which validator. A list of validator candidates will be displayed in Cosmos Hub explorers. Later, if a delegator wants to unbond part or all of their stake, they need to send an "Unbond transaction". From there, the delegator will have to wait 3 weeks to retrieve their Atoms. Delegators can also send a "Rebond Transaction" to switch from one validator to another, without having to go through the 3 weeks waiting period.

For a practical guide on how to become a delegator, click here.

Choosing a validator

In order to choose their validators, delegators have access to a range of information directly in Lunie or other Cosmos block explorers.

  • Validator's moniker: Name of the validator candidate.
  • Validator's description: Description provided by the validator operator.
  • Validator's website: Link to the validator's website.
  • Initial commission rate: The commission rate on revenue charged to any delegator by the validator (see below for more detail).
  • Commission max change rate: The maximum daily increase of the validator's commission. This parameter cannot be changed by the validator operator.
  • Maximum commission: The maximum commission rate this validator candidate can charge. This parameter cannot be changed by the validator operator.
  • Validator self-bond amount: A validator with a high amount of self-delegated Atoms has more skin-in-the-game than a validator with a low amount.

Directives of delegators

Being a delegator is not a passive task. Here are the main directives of a delegator:

  • Perform careful due diligence on validators before delegating. If a validator misbehaves, part of their total stake, which includes the stake of their delegators, can be slashed. Delegators should therefore carefully select validators they think will behave correctly.
  • Actively monitor their validator after having delegated. Delegators should ensure that the validators they delegate to behave correctly, meaning that they have good uptime, do not double sign or get compromised, and participate in governance. They should also monitor the commission rate that is applied. If a delegator is not satisfied with its validator, they can unbond or switch to another validator (Note: Delegators do not have to wait for the unbonding period to switch validators. Rebonding takes effect immediately).
  • Participate in governance. Delegators can and are expected to actively participate in governance. A delegator's voting power is proportional to the size of their bonded stake. If a delegator does not vote, they will inherit the vote of their validator(s). If they do vote, they override the vote of their validator(s). Delegators therefore act as a counterbalance to their validators.

Revenue

Validators and delegators earn revenue in exchange for their services. This revenue is given in three forms:

  • Block provisions (Atoms): They are paid in newly created Atoms. Block provisions exist to incentivize Atom holders to stake. The yearly inflation rate is calculated to target 2/3 bonded stake. If the total bonded stake in the network is less than 2/3 of the total Atom supply, inflation increases until it reaches 20%. If the total bonded stake is more than 2/3 of the Atom supply, inflation decreases until it reaches 7%. This means that if total bonded stake stays less than 2/3 of the total Atom supply for a prolonged period of time, unbonded Atom holders can expect their Atom value to deflate by 20% (compounded) per year.
  • Transaction fees (various tokens): Each transfer on the Cosmos Hub comes with transactions fees. These fees can be paid in any currency that is whitelisted by the Hub's governance. Fees are distributed to bonded Atom holders in proportion to their stake. The first whitelisted token at launch is the ATOM.

Validator Commission

Each validator receives revenue based on their total stake. Before this revenue is distributed to delegators, the validator can apply a commission. In other words, delegators have to pay a commission to their validators on the revenue they earn. Let us look at a concrete example:

We consider a validator whose stake (i.e. self-delegated stake + delegated stake) is 10% of the total stake of all validators. This validator has 20% self-delegated stake and applies a commission of 10%. Now let us consider a block with the following revenue:

  • 990 Atoms in block provisions
  • 10 Atoms in transaction fees.

This amounts to a total of 1000 Atoms and 100 Photons to be distributed among all staking pools.

Our validator's staking pool represents 10% of the total stake, which means the pool obtains 100 Atoms and 10 Photons. Now let us look at the internal distribution of revenue:

  • Commission = 10% * 80% * 100 Atoms = 8 Atoms
  • Validator's revenue = 20% * 100 Atoms + Commission = 28 Atoms
  • Delegators' total revenue = 80% * 100 Atoms - Commission = 72 Atoms

Then, each delegator in the staking pool can claim their portion of the delegators' total revenue.

Liquid Staking

The Liquid Staking module enacts a safety framework and associated governance-controlled parameters to regulate the adoption of liquid staking.

The LSM mitigates liquid staking risks by limiting the total amount of ATOM that can be liquid staked to a percentage of all staked ATOM. As an additional risk-mitigation feature, the LSM introduces a requirement that validators self-bond ATOM to be eligible for delegations from liquid staking providers or to be eligible to mint LSM tokens. This mechanism is called the “validator bond”, and is technically distinct from the current self-bond mechanism, but functions similarly.

At the same time, the LSM introduces the ability for staked ATOM to be instantly liquid staked, without having to wait for the unbonding period.

The LSM enables users to instantly liquid stake their staked ATOM, without having to wait the twenty-one day unbonding period. This is important, because a very large portion of the ATOM supply is currently staked. Liquid staking ATOM that is already staked incurs a switching cost in the form of three weeks’ forfeited staking rewards. The LSM eliminates this switching cost.

A user would be able to visit any liquid staking provider that has integrated with the LSM and click a button to convert her staked ATOM to liquid staked ATOM. It would be as easy as liquid staking unstaked ATOM.

Technically speaking, this is accomplished by using something called an “LSM share.” Using the liquid staking module, a user can tokenize their staked ATOM and turn it into LSM shares. LSM shares can be redeemed for underlying staked tokens and are transferable. After staked ATOM is tokenized it can be immediately transferred to a liquid staking provider in exchange for liquid staking tokens - without having to wait for the unbonding period.

Toggling the ability to tokenize shares

Currently the liquid staking module facilitates the immediate conversion of staked assets into liquid staked tokens. Despite the many benefits that come with this capability, it does inadvertently negate a protective measure available via traditional staking, where an account can stake their tokens to render them illiquid in the event that their wallet is compromised (the attacker would first need to unbond, then transfer out the tokens).

Tokenization obviates this potential recovery measure, as an attacker could tokenize and immediately transfer staked tokens to another wallet. So, as an additional protective measure, the staking module permit accounts to selectively disable the tokenization of their stake with the DisableTokenizeShares message.

The DisableTokenizeShares message is exposed by the staking module and can be executed as follows:

gaiad tx staking disable-tokenize-shares --from mykey  

When tokenization is disabled, a lock is placed on the account, effectively preventing the tokenization of any delegations. Re-enabling tokenization would initiate the removal of the lock, but the process is not immediate. The lock removal is queued, with the lock itself persisting throughout the unbonding period. Following the completion of the unbonding period, the lock would be completely removed, restoring the account's ability to tokenize. For liquid staking protocols that enable the lock, this delay better positions the base layer to coordinate a recovery in the event of an exploit.

Risks

Staking Atoms is not free of risk. First, staked Atoms are locked up, and retrieving them requires a 3 week waiting period called unbonding period. Additionally, if a validator misbehaves, a portion of their total stake can be slashed (i.e. destroyed). This includes the stake of their delegators.

There is one main slashing condition:

  • Double signing: If someone reports on that a validator signed two different blocks with the same chain ID at the same height, this validator will get slashed.

This is why Atom holders should perform careful due diligence on validators before delegating. It is also important that delegators actively monitor the activity of their validators. If a validator behaves suspiciously or is too often offline, delegators can choose to unbond from them or switch to another validator. Delegators can also mitigate risk by distributing their stake across multiple validators.s

+ + + + \ No newline at end of file diff --git a/main/delegators/delegator-faq.html.html b/main/delegators/delegator-faq.html.html new file mode 100644 index 00000000000..51fa78cc071 --- /dev/null +++ b/main/delegators/delegator-faq.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/delegators/delegator-guide-cli.html b/main/delegators/delegator-guide-cli.html new file mode 100644 index 00000000000..0ce30d82adb --- /dev/null +++ b/main/delegators/delegator-guide-cli.html @@ -0,0 +1,53 @@ + + + + + +Delegator Guide (CLI) | Cosmos Hub + + + + + + + + + + + + + + +
+

Delegator Guide (CLI)

This document contains all the necessary information for delegators to interact with the Cosmos Hub through the Command-Line Interface (CLI).

It also contains instructions on how to manage accounts, restore accounts from the fundraiser and use a ledger nano device.

tip

Very Important: Please assure that you follow the steps described hereinafter +carefully, as negligence in this significant process could lead to an indefinite +loss of your Atoms. Therefore, read through the following instructions in their +entirety prior to proceeding and reach out to us in case you need support.

Please also note that you are about to interact with the Cosmos Hub, a +blockchain technology containing highly experimental software. While the +blockchain has been developed in accordance to the state of the art and audited +with utmost care, we can nevertheless expect to have issues, updates and bugs. +Furthermore, interaction with blockchain technology requires +advanced technical skills and always entails risks that are outside our control. +By using the software, you confirm that you understand the inherent risks +associated with cryptographic software (see also risk section of the +Interchain Cosmos Contribution terms) and that the Interchain Foundation and/or +the Tendermint Team may not be held liable for potential damages arising out of the use of the +software. Any use of this open source software released under the Apache 2.0 license is +done at your own risk and on a "AS IS" basis, without warranties or conditions +of any kind.

Please exercise extreme caution!

Table of Contents

Installing gaiad

gaiad: This is the command-line interface to interact with a gaiad full-node.

danger

Please check that you download the latest stable release of gaiad that is available

[Download the binaries] +Not available yet.

Install from source

tip

gaiad is used from a terminal. To open the terminal, follow these steps:

  • Windows: Start > All Programs > Accessories > Command Prompt
  • MacOS: Finder > Applications > Utilities > Terminal
  • Linux: Ctrl + Alt + T

Cosmos Accounts

At the core of every Cosmos account, there is a seed, which takes the form of a 12 or 24-words mnemonic. From this mnemonic, it is possible to create any number of Cosmos accounts, i.e. pairs of private key/public key. This is called an HD wallet (see BIP32 for more information on the HD wallet specification).

     Account 0                         Account 1                         Account 2

+------------------+ +------------------+ +------------------+
| | | | | |
| Address 0 | | Address 1 | | Address 2 |
| ^ | | ^ | | ^ |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| + | | + | | + |
| Public key 0 | | Public key 1 | | Public key 2 |
| ^ | | ^ | | ^ |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| + | | + | | + |
| Private key 0 | | Private key 1 | | Private key 2 |
| ^ | | ^ | | ^ |
+------------------+ +------------------+ +------------------+
| | |
| | |
| | |
+--------------------------------------------------------------------+
|
|
+---------+---------+
| |
| Mnemonic (Seed) |
| |
+-------------------+

The funds stored in an account are controlled by the private key. This private key is generated using a one-way function from the mnemonic. If you lose the private key, you can retrieve it using the mnemonic. However, if you lose the mnemonic, you will lose access to all the derived private keys. Likewise, if someone gains access to your mnemonic, they gain access to all the associated accounts.

danger

Do not lose or share your 12 words with anyone. To prevent theft or loss of funds, it is best to ensure that you keep multiple copies of your mnemonic, and store it in a safe, secure place and that only you know how to access. If someone is able to gain access to your mnemonic, they will be able to gain access to your private keys and control the accounts associated with them.

The address is a public string with a human-readable prefix (e.g. cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg) that identifies your account. When someone wants to send you funds, they send it to your address. It is computationally infeasible to find the private key associated with a given address.

Restoring an Account from the Fundraiser

tip

NOTE: This section only concerns fundraiser participants

If you participated in the fundraiser, you should be in possession of a 12-words mnemonic. Newly generated mnemonics use 24 words, but 12-word mnemonics are also compatible with all the Cosmos tools.

On a Ledger Device

At the core of a ledger device, there is a mnemonic used to generate accounts on multiple blockchains (including the Cosmos Hub). Usually, you will create a new mnemonic when you initialize your ledger device. However, it is possible to tell the ledger device to use a mnemonic provided by the user instead. Let us go ahead and see how you can input the mnemonic you obtained during the fundraiser as the seed of your ledger device.

danger

*NOTE: To do this, it is preferable to use a brand new ledger device.. Indeed, there can be only one mnemonic per ledger device. If, however, you want to use a ledger that is already initialized with a seed, you can reset it by going in Settings>Device>Reset All. Please note that this will wipe out the seed currently stored on the device. If you have not properly secured the associated mnemonic, you could lose your funds!!!*

The following steps need to be performed on an un-initialized ledger device:

  1. Connect your ledger device to the computer via USB
  2. Press both buttons
  3. Do NOT choose the "Config as a new device" option. Instead, choose "Restore Configuration"
  4. Choose a PIN
  5. Choose the 12 words option
  6. Input each of the words you got during the fundraiser, in the correct order.

Your ledger is now correctly set up with your fundraiser mnemonic! Do not lose this mnemonic! If your ledger is compromised, you can always restore a new device again using the same mnemonic.

Next, click here to learn how to generate an account.

On a Computer

danger

NOTE: It is more secure to perform this action on an offline computer

To restore an account using a fundraiser mnemonic and store the associated encrypted private key on a computer, use the following command:

gaiad keys add <yourKeyName> --recover
  • <yourKeyName> is the name of the account. It is a reference to the account number used to derive the key pair from the mnemonic. You will use this name to identify your account when you want to send a transaction.
  • You can add the optional --account flag to specify the path (0, 1, 2, ...) you want to use to generate your account. By default, account 0 is generated.

The private key of account 0 will be saved in your operating system's credentials storage. +Each time you want to send a transaction, you will need to unlock your system's credentials store. +If you lose access to your credentials storage, you can always recover the private key with the +mnemonic.

tip

You may not be prompted for password each time you send a transaction since most operating systems +unlock user's credentials store upon login by default. If you want to change your credentials +store security policies please refer to your operating system manual.

Creating an Account

To create an account, you just need to have gaiad installed. Before creating it, you need to know where you intend to store and interact with your private keys. The best options are to store them in an offline dedicated computer or a ledger device. Storing them on your regular online computer involves more risk, since anyone who infiltrates your computer through the internet could exfiltrate your private keys and steal your funds.

Using a Ledger Device

danger

Only use Ledger devices that you bought factory new or trust fully

When you initialize your ledger, a 24-word mnemonic is generated and stored in the device. This mnemonic is compatible with Cosmos and Cosmos accounts can be derived from it. Therefore, all you have to do is make your ledger compatible with gaiad. To do so, you need to go through the following steps:

  1. Download the Ledger Live app here.
  2. Connect your ledger via USB and update to the latest firmware
  3. Go to the ledger live app store, and download the "Cosmos" application (this can take a while). Note: You may have to enable Dev Mode in the Settings of Ledger Live to be able to download the "Cosmos" application.
  4. Navigate to the Cosmos app on your ledger device

Then, to create an account, use the following command:

gaiad keys add <yourAccountName> --ledger
danger

This command will only work while the Ledger is plugged in and unlocked

  • <yourKeyName> is the name of the account. It is a reference to the account number used to derive the key pair from the mnemonic. You will use this name to identify your account when you want to send a transaction.
  • You can add the optional --account flag to specify the path (0, 1, 2, ...) you want to use to generate your account. By default, account 0 is generated.

Using a Computer

danger

NOTE: It is more secure to perform this action on an offline computer

To generate an account, just use the following command:

gaiad keys add <yourKeyName>

The command will generate a 24-words mnemonic and save the private and public keys for account 0 +at the same time. +Each time you want to send a transaction, you will need to unlock your system's credentials store. +If you lose access to your credentials storage, you can always recover the private key with the +mnemonic.

tip

You may not be prompted for password each time you send a transaction since most operating systems +unlock user's credentials store upon login by default. If you want to change your credentials +store security policies please refer to your operating system manual.

danger

Do not lose or share your 12 words with anyone. To prevent theft or loss of funds, it is best to ensure that you keep multiple copies of your mnemonic, and store it in a safe, secure place and that only you know how to access. If someone is able to gain access to your mnemonic, they will be able to gain access to your private keys and control the accounts associated with them.

danger

After you have secured your mnemonic (triple check!), you can delete bash history to ensure no one can retrieve it:

history -c
rm ~/.bash_history
  • <yourKeyName> is the name of the account. It is a reference to the account number used to derive the key pair from the mnemonic. You will use this name to identify your account when you want to send a transaction.
  • You can add the optional --account flag to specify the path (0, 1, 2, ...) you want to use to generate your account. By default, account 0 is generated.

You can generate more accounts from the same mnemonic using the following command:

gaiad keys add <yourKeyName> --recover --account 1

This command will prompt you to input a passphrase as well as your mnemonic. Change the account number to generate a different account.

Accessing the Cosmos Hub Network

In order to query the state and send transactions, you need a way to access the network. To do so, you can either run your own full-node, or connect to someone else's.

danger

NOTE: Do not share your mnemonic (12 or 24 words) with anyone. The only person who should ever need to know it is you. This is especially important if you are ever approached via email or direct message by someone requesting that you share your mnemonic for any kind of blockchain services or support. No one from Cosmos, the Tendermint team or the Interchain Foundation will ever send an email that asks for you to share any kind of account credentials or your mnemonic.".

Running Your Own Full-Node

This is the most secure option, but comes with relatively high resource requirements. In order to run your own full-node, you need good bandwidth and at least 1TB of disk space.

You will find the tutorial on how to install gaiad here, and the guide to run a full-node here.

Connecting to a Remote Full-Node

If you do not want or cannot run your own node, you can connect to someone else's full-node. You should pick an operator you trust, because a malicious operator could return incorrect query results or censor your transactions. However, they will never be able to steal your funds, as your private keys are stored locally on your computer or ledger device. Possible options of full-node operators include validators, wallet providers or exchanges.

In order to connect to the full-node, you will need an address of the following form: https://77.87.106.33:26657 (Note: This is a placeholder). This address has to be communicated by the full-node operator you choose to trust. You will use this address in the following section.

Setting Up gaiad

tip

Before setting up gaiad, make sure you have set up a way to access the Cosmos Hub network

danger

Please check that you are always using the latest stable release of gaiad

gaiad is the tool that enables you to interact with the node that runs on the Cosmos Hub network, whether you run it yourself or not. Let us set it up properly.

In order to set up gaiad, use the following command:

gaiad config <flag> <value>

It allows you to set a default value for each given flag.

First, set up the address of the full-node you want to connect to:

gaiad config node <host>:<port

// example: gaiad config node https://77.87.106.33:26657 (note: this is a placeholder)

If you run your own full-node, just use tcp://localhost:26657 as the address.

Finally, let us set the chain-id of the blockchain we want to interact with:

gaiad config chain-id cosmoshub-4

Querying the State

tip

Before you can bond atoms and withdraw rewards, you need to set up gaiad

gaiad lets you query all relevant information from the blockchain, like account balances, amount of bonded tokens, outstanding rewards, governance proposals and more. Next is a list of the most useful commands for delegator.

// query account balances and other account-related information
gaiad query account <yourAddress>

// query the list of validators
gaiad query staking validators

// query the information of a validator given their address (e.g. cosmosvaloper1n5pepvmgsfd3p2tqqgvt505jvymmstf6s9gw27)
gaiad query staking validator <validatorAddress>

// query all delegations made from a delegator given their address (e.g. cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg)
gaiad query staking delegations <delegatorAddress>

// query a specific delegation made from a delegator (e.g. cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg) to a validator (e.g. cosmosvaloper1n5pepvmgsfd3p2tqqgvt505jvymmstf6s9gw27) given their addresses
gaiad query staking delegation <delegatorAddress> <validatorAddress>

// query the rewards of a delegator given a delegator address (e.g. cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg)
gaiad query distribution rewards <delegatorAddress>

// query all proposals currently open for depositing
gaiad query gov proposals --status deposit_period

// query all proposals currently open for voting
gaiad query gov proposals --status voting_period

// query a proposal given its proposalID
gaiad query gov proposal <proposalID>

For more commands, just type:

gaiad query

For each command, you can use the -h or --help flag to get more information.

Sending Transactions

danger

On Cosmos Hub mainnet, the accepted denom is uatom, where 1atom = 1,000,000uatom

A Note on Gas and Fees

Transactions on the Cosmos Hub network need to include a transaction fee in order to be processed. This fee pays for the gas required to run the transaction. The formula is the following:

fees = ceil(gas * gasPrices)

The gas is dependent on the transaction. Different transaction require different amount of gas. The gas amount for a transaction is calculated as it is being processed, but there is a way to estimate it beforehand by using the auto value for the gas flag. Of course, this only gives an estimate. You can adjust this estimate with the flag --gas-adjustment (default 1.0) if you want to be sure you provide enough gas for the transaction. For the remainder of this tutorial, we will use a --gas-adjustment of 1.5.

The gasPrice is the price of each unit of gas. Each validator sets a min-gas-price value, and will only include transactions that have a gasPrice greater than their min-gas-price.

The transaction fees are the product of gas and gasPrice. As a user, you have to input 2 out of 3. The higher the gasPrice/fees, the higher the chance that your transaction will get included in a block.

tip

For mainnet, the recommended gas-prices is 0.0025uatom.

Sending Tokens

tip

Before you can bond atoms and withdraw rewards, you need to set up gaiad and create an account

danger

Note: These commands need to be run on an online computer. It is more secure to perform them commands using a Ledger Nano S device. For the offline procedure, click here.

// Send a certain amount of tokens to an address
// Ex value for parameters (do not actually use these values in your tx!!): <to_address>=cosmos16m93fezfiezhvnjajzrfyszml8qm92a0w67ntjhd3d0 <amount>=1000000uatom
// Ex value for flags: <gasPrice>=0.0025uatom

gaiad tx bank send [from_key_or_address] [to_address] [amount] [flags]

Bonding Atoms and Withdrawing Rewards

tip

Before you can bond atoms and withdraw rewards, you need to set up gaiad and create an account

danger

Before bonding Atoms, please read the delegator faq to understand the risk and responsibilities involved with delegating

danger

Note: These commands need to be run on an online computer. It is more secure to perform them commands using a ledger device. For the offline procedure, click here.

// Bond a certain amount of Atoms to a given validator
// ex value for flags: <validatorAddress>=cosmosvaloper18thamkhnj9wz8pa4nhnp9rldprgant57pk2m8s, <amountToBound>=10000000uatom, <gasPrice>=0.0025uatom

gaiad tx staking delegate <validatorAddress> <amountToBond> --from <delegatorKeyName> --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice>


// Redelegate a certain amount of Atoms from a validator to another
// Can only be used if already bonded to a validator
// Redelegation takes effect immediately, there is no waiting period to redelegate
// After a redelegation, no other redelegation can be made from the account for the next 3 weeks
// ex value for flags: <stcValidatorAddress>=cosmosvaloper18thamkhnj9wz8pa4nhnp9rldprgant57pk2m8s, <amountToRedelegate>=100000000uatom, <gasPrice>=0.0025uatom

gaiad tx staking redelegate <srcValidatorAddress> <destValidatorAddress> <amountToRedelegate> --from <delegatorKeyName> --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice>

// Withdraw all rewards
// ex value for flag: <gasPrice>=0.0025uatom

gaiad tx distribution withdraw-all-rewards --from <delegatorKeyName> --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice>


// Unbond a certain amount of Atoms from a given validator
// You will have to wait 3 weeks before your Atoms are fully unbonded and transferrable
// ex value for flags: <validatorAddress>=cosmosvaloper18thamkhnj9wz8pa4nhnp9rldprgant57pk2m8s, <amountToUnbound>=10000000uatom, <gasPrice>=0.0025uatom

gaiad tx staking unbond <validatorAddress> <amountToUnbond> --from <delegatorKeyName> --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice>
danger

If you use a connected Ledger, you will be asked to confirm the transaction on the device before it is signed and broadcast to the network. Note that the command will only work while the Ledger is plugged in and unlocked.

To confirm that your transaction went through, you can use the following queries:

// your balance should change after you bond Atoms or withdraw rewards
gaiad query account

// you should have delegations after you bond Atom
gaiad query staking delegations <delegatorAddress>

// this returns your tx if it has been included
// use the tx hash that was displayed when you created the tx
gaiad query tx <txHash>

Double check with a block explorer if you interact with the network through a trusted full-node.

Participating in Governance

Primer on Governance

The Cosmos Hub has a built-in governance system that lets bonded Atom holders vote on proposals. There are three types of proposal:

  • Text Proposals: These are the most basic type of proposals. They can be used to get the opinion of the network on a given topic.
  • Parameter Proposals: These are used to update the value of an existing parameter.
  • Software Upgrade Proposal: These are used to propose an upgrade of the Hub's software.

Any Atom holder can submit a proposal. In order for the proposal to be open for voting, it needs to come with a deposit that is greater than a parameter called minDeposit. The deposit need not be provided in its entirety by the submitter. If the initial proposer's deposit is not sufficient, the proposal enters the deposit_period status. Then, any Atom holder can increase the deposit by sending a depositTx.

Once the deposit reaches minDeposit, the proposal enters the voting_period, which lasts 2 weeks. Any bonded Atom holder can then cast a vote on this proposal. The options are Yes, No, NoWithVeto and Abstain. The weight of the vote is based on the amount of bonded Atoms of the sender. If they don't vote, delegator inherit the vote of their validator. However, delegators can override their validator's vote by sending a vote themselves.

At the end of the voting period, the proposal is accepted if there are more than 50% Yes votes (excluding Abstain votes) and less than 33.33% of NoWithVeto votes (excluding Abstain votes).

In Practice

tip

Before you can bond atoms and withdraw rewards, you need to bond Atoms

danger

Note: These commands need to be run on an online computer. It is more secure to perform them commands using a ledger device. For the offline procedure, click here.

// Submit a Proposal
// <type>=text/parameter_change/software_upgrade
// ex value for flag: <gasPrice>=0.0025uatom

// the proposal must meet the minimum deposit amount - please check the current chain params
gaiad tx gov submit-legacy-proposal --title "Test Text Proposal" --description "My awesome proposal" --type "text" --deposit=10000000uatom --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice> --from <delegatorKeyName>

// Increase deposit of a proposal
// Retrieve proposalID from $gaiad query gov proposals --status deposit_period
// ex value for parameter: <deposit>=10000000uatom

gaiad tx gov deposit <proposalID> <deposit> --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice> --from <delegatorKeyName>

// Vote on a proposal
// Retrieve proposalID from $gaiad query gov proposals --status voting_period
// <option>=yes/no/no_with_veto/abstain

gaiad tx gov vote <proposalID> <option> --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice> --from <delegatorKeyName>

Signing Transactions From an Offline Computer

If you do not have a ledger device and want to interact with your private key on an offline computer, you can use the following procedure. First, generate an unsigned transaction on an online computer with the following command (example with a bonding transaction):

// Bond Atoms
// ex value for flags: <amountToBound>=10000000uatom, <bech32AddressOfValidator>=cosmosvaloper18thamkhnj9wz8pa4nhnp9rldprgant57pk2m8s, <gasPrice>=0.0025uatom, <delegatorAddress>=cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg

gaiad tx staking delegate <validatorAddress> <amountToBond> --from <delegatorAddress> --gas auto --gas-adjustment 1.5 --gas-prices <gasPrice> --generate-only > unsignedTX.json

In order to sign, you will also need the chain-id, account-number and sequence. The chain-id is a unique identifier for the blockchain on which you are submitting the transaction. The account-number is an identifier generated when your account first receives funds. The sequence number is used to keep track of the number of transactions you have sent and prevent replay attacks.

Get the chain-id from the genesis file (4), and the two other fields using the account query:

gaiad query account <yourAddress> --chain-id cosmoshub-4

Then, copy unsignedTx.json and transfer it (e.g. via USB) to the offline computer. If it is not done already, create an account on the offline computer. For additional security, you can double check the parameters of your transaction before signing it using the following command:

cat unsignedTx.json

Now, sign the transaction using the following command. You will need the chain-id, sequence and account-number obtained earlier:

gaiad tx sign unsignedTx.json --from <delegatorKeyName> --offline --chain-id cosmoshub-4 --sequence <sequence> --account-number <account-number> > signedTx.json

Copy signedTx.json and transfer it back to the online computer. Finally, use the following command to broadcast the transaction:

gaiad tx broadcast signedTx.json
+ + + + \ No newline at end of file diff --git a/main/delegators/delegator-guide-cli.html.html b/main/delegators/delegator-guide-cli.html.html new file mode 100644 index 00000000000..cefa737eeee --- /dev/null +++ b/main/delegators/delegator-guide-cli.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/delegators/delegator-security.html b/main/delegators/delegator-security.html new file mode 100644 index 00000000000..4caf0bbd2a9 --- /dev/null +++ b/main/delegators/delegator-security.html @@ -0,0 +1,26 @@ + + + + + +Delegator Security | Cosmos Hub + + + + + + + + + + + + + + +
+

Delegator Security

The launch of any public blockchain is an incredibly exciting time, and it's definitely one that malicious actors may try to take advantage of for their own personal gain. Owning and having access to cryptocurrency can make you a valuable target for an attacker, but there are many things you can do to improve your personal security and reduce or eliminate security risks.

Social Engineering

Social engineering has existed for about as long as human beings have been on the planet, and in the technical era, it usually takes in the form of phishing or spearphishing . Both of these attacks are wildly successful forms of trickery that are responsible for over 95% of account security breaches, and they don't just happen via email: these days, opportunistic and targeted phishing attempts take place anywhere that you have an inbox . It doesn't matter if you're using Signal, Telegram, SMS, Twitter, or just checking your DMs on forums or social networks, attackers have a plethora of opportunities to gain foothold in your digital life in effort to separate you from valuable information and assets that you most definitely don't want to lose. If a deal pops up that sounds too good to be true , or a message shows up asking for information that should never, ever be shared with someone else, you can always verify it before engaging with it by navigating to our official website or an official Cosmos communication channel on your own.

  • Be skeptical of unexpected attachments, or emails that ask you to visit a suspicious or unfamiliar website in the context of blockchains or cryptocurrency. An attacker may attempt to lure you to a compromised site designed to steal sensitive information from your computer. If you're a Gmail user, test your resilience against the latest email-based phishing tactics here .

  • Do your due diligence before purchasing ATOM. Neither the Tendermint team nor the Interchain Foundation will be selling ATOM at launch, so if you see social media posts or emails advertising a token sale from us, they're not real and should be dismissed immediately. If you're on the hunt for ATOM, make sure that you've researched the seller or exchange to confirm that the tokens are coming from a trustworthy source.

  • No one from Cosmos, the Tendermint team or the Interchain Foundation will ever send an email that asks for you to share any kind of account credentials or your 12 words with us, and we will always use our official Twitter, Medium, and Github accounts to communicate important news directly to the Cosmos community.

If you receive an email or tweet that sounds too good to be true, is likely to be a scam.

Key Management

The best way to minimize the risk of theft or loss of ATOM is to have a strong storage and backup strategy for your private keys. The safest way to store your keys is offline, either in a cryptocurrency wallet or on a device that you never connect to the internet. The best backup strategy for your k yes is to ensure that you have multiple copies of them stored in safe places, and to take specific measures to protect at least one copy of your keys from any kind of natural disaster that is a likely possibility in your part of the world.

To protect your ATOM, do not share your 12 words with anyone. The only person who should ever need to know them is you. You do not need to share your private keys if you're delegating ATOM to a validator on the network or to use custodial services. If anyone asks for your key material,

Software Vulnerabilities

To protect yourself and ensure you're using the safest code is to use the latest version of software available, and to update immediately (or as soon as you can) after a security advisory is released. This is important for your laptops, mobile devices, cryptocurrency wallets, and anything else that may be linked to your identity or your cryptocurrency.

To protect your ATOM, you should only download software directly from official sources, and make sure that you're always using the latest, most secure version of gaiad when you're doing anything that involves your 12 words. The latest versions of Tendermint, the Cosmos-SDK, and gaiad will always be available from our official Github repositories.

No one from Cosmos, the Tendermint team or the Interchain Foundation will ever send an email that asks for you to download a software attachment after sending out a security advisory or making a patch available.

Verifying Transactions

Be skeptical of technical advice, especially advice that comes from people you do not know in forums and on group chat channels. Familiarize yourself with important commands, especially those that will help you carry out high-risk actions, and consult our official documentation to make sure that you're not being tricked into doing something that will harm you or your validator.

When sending transactions or doing anything that may spend coins, you should always verify those transactions before hitting send. While address strings are long, it is important to visually comparing them in blocks of 4 characters at a time to ensure that you are sending them to the right place rather than into oblivion.

Account Security

One of the most important things you can do to protect your cryptocurrency and eliminate risk is to harden all of your critical online accounts. Attackers will try to gain foothold wherever they can, and will use that foothold to pivot from one place to another. Unprotected accounts like email, social media, your Github account, the Cosmos Forum and anything in between could give an attacker an opportunities to gain foothold in your online life.

For people who hold cryptocurrency, there are two specific account security actions that can be taken to eliminate specific risks that come with being part of the blockchain world.

  • First, it is important to enable 2-factor authentication everywhere you can, and to make sure that you are using a code generator or U2F hardware key as a second factor.

  • Second, be mindful of account recovery methods used to regain access to your most important accounts and make sure that you do not use SMS as a recovery method. If you haven't done so yet, start using an authenticator app or a hardware key immediately for your personal email account and wherever else you manage your tokens, especially if you use online exchanges.

Supply Chain Attacks

Whether you're buying a hardware or a hardware wallet, it is important to purchase whatever you need directly from the supplier or from a trusted source. This is the only way to completely eliminate the risk of a compromised device or chip from stealing your private keys, especially since there are reports of compromised wallets being sold on Amazon and through other popular online marketplaces.

Disclaimer

Please note that this is highly experimental software. In these early days, we can expect to have issues, updates, and bugs. The existing tools require advanced technical skills and involve risks which are outside of the control of the Interchain Foundation and/or the Tendermint team (see also the risk section in the Interchain Cosmos Contribution Terms). Any use of this open source Apache 2.0 licensed software is done at your own risk and on a "AS IS" basis, without warranties or conditions of any kind, and any and all liability of the Interchain Foundation and/or the Tendermint team for damages arising in connection to the software is excluded. Please exercise extreme caution!`

+ + + + \ No newline at end of file diff --git a/main/delegators/delegator-security.html.html b/main/delegators/delegator-security.html.html new file mode 100644 index 00000000000..7351529a1b2 --- /dev/null +++ b/main/delegators/delegator-security.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/getting-started.html b/main/getting-started.html new file mode 100644 index 00000000000..c8536d08cf0 --- /dev/null +++ b/main/getting-started.html @@ -0,0 +1,26 @@ + + + + + +Getting Started | Cosmos Hub + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main/getting-started.html.html b/main/getting-started.html.html new file mode 100644 index 00000000000..206d332947a --- /dev/null +++ b/main/getting-started.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/getting-started/installation.html b/main/getting-started/installation.html new file mode 100644 index 00000000000..bced4807eb9 --- /dev/null +++ b/main/getting-started/installation.html @@ -0,0 +1,29 @@ + + + + + +Installing Gaia | Cosmos Hub + + + + + + + + + + + + + + +
+

Installing Gaia

This guide will explain how to install the gaiad binary and run the cli. With this binary installed on a server, you can participate on the mainnet as either a Full Node or a Validator.

Build Requirements

At present, the SDK fully supports installation on linux distributions. For the purpose of this instruction set, we'll be using Ubuntu 22.04 LTS. It is also possible to install gaiad on Unix, while Windows may require additional unsupported third party installation. All steps are listed below for a clean install.

  1. Update & install build tools
  2. Install Go
  3. Install Gaiad binaries

Build Tools

Install make and gcc.

Ubuntu:

sudo apt update

sudo apt install -y make gcc build-essential

Install Go

tip

Go 1.22+ is required.

We suggest the following two ways to install Go. Check out the official docs and Go installer for the correct download for your operating system. Alternatively, you can install Go yourself from the command line. Detailed below are standard default installation locations, but feel free to customize.

Since the introduction of CosmWasm in Gaia v18 it is recommended to build the binaries with CGO enabled - simply set CGO_ENABLED=1 in your terminal before building the binary.

Building the gaiad binary on Windows is not supported due to dependency issues.

Go Binary Downloads

Ubuntu:

At the time of this writing, the latest release is 1.22.3. We're going to download the tarball, extract it to /usr/local, and export GOROOT to our $PATH

curl -OL https://go.dev/dl/go1.22.3.darwin-amd64.tar.gz

sudo tar -C /usr/local -xvf https://go.dev/dl/go1.22.3.darwin-amd64.tar.gz


export PATH=$PATH:/usr/local/go/bin

Remember to add GOPATH to your $PATH environment variable. If you're not sure where that is, run go env GOPATH. This will allow us to run the gaiad binary in the next step. If you're not sure how to set your $PATH take a look at these instructions.

export PATH=$PATH:$(go env GOPATH)/bin

Install the binaries

Next, let's install the latest version of Gaia. Make sure you git checkout the +correct released version.

git clone -b <latest-release-tag> https://github.com/cosmos/gaia.git
cd gaia && make install

If this command fails due to the following error message, you might have already set LDFLAGS prior to running this step.

# github.com/cosmos/gaia/cmd/gaiad
flag provided but not defined: -L
usage: link [options] main.o
...
make: *** [install] Error 2

Unset this environment variable and try again.

LDFLAGS="" make install

NOTE: If you still have issues at this step, please check that you have the latest stable version of GO installed.

That will install the gaiad binary. Verify that everything installed successfully by running:

gaiad version --long

You should see something similar to the following:

name: gaia
server_name: gaiad
version: v18.0.0
commit: 682770f2410ab0d33ac7f0c7203519d7a99fa2b6
build_tags: netgo,ledger,muslc
go: go version go1.22.3 linux/amd64

Docker

Dockerfile is available in the gaia repo.

Building:

git clone -b <latest-release-tag> https://github.com/cosmos/gaia.git
cd gaia
docker build -t cosmos-ics:local -f Dockerfile ./

Static linking

In case you need to build a binary with all dependencies statically linked please check our Dockerfile.

You must have libwasmvm available on your machine. +Choose the build that matches your platform and OS:

For more information, please check wasmvm documentation.

Build Tags

Build tags indicate special features that have been enabled in the binary.

Build TagDescription
netgoName resolution will use pure Go code
ledgerLedger devices are supported (hardware wallets)
static_wasm/muslcUsed for statically linked wasmd dependencies

Work with a Cosmos SDK Clone

To work with your own modifications of the Cosmos SDK, make a fork of this repo, and add a replace clause to the go.mod file. +The replace clause you add to go.mod must provide the correct import path.

go mod edit -replace github.com/cosmos/cosmos-sdk=../cosmos-sdk
go mod tidy
make install # or make build

Next

Now you can join the mainnet, the public testnet.

+ + + + \ No newline at end of file diff --git a/main/getting-started/installation.html.html b/main/getting-started/installation.html.html new file mode 100644 index 00000000000..e0d8e3f4763 --- /dev/null +++ b/main/getting-started/installation.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/getting-started/quickstart.html b/main/getting-started/quickstart.html new file mode 100644 index 00000000000..ded36ada59b --- /dev/null +++ b/main/getting-started/quickstart.html @@ -0,0 +1,26 @@ + + + + + +Quick Start - Join Mainnet | Cosmos Hub + + + + + + + + + + + + + + +
+

Quick Start - Join Mainnet

Bootstrap a cosmoshub-4 mainnet node

Prerequisites

Note: Make sure the Gaia CLI is installed.

Sync Options

To quickly get started, node operators can choose to sync via State Sync or by downloading a snapshot from Quicksync. State Sync works by replaying larger chunks of application state directly rather than replaying individual blocks or consensus rounds. Quicksync is a service provided courtesy of ChainLayer, and offers historical state of the chain available for download every 24 hours. For more advanced information on setting up a node, see the Sync Options section of the full Joining Mainnet Tutorial

State Sync

To enable state sync, visit an explorer to get a recent block height and corresponding hash. A node operator can choose any height/hash in the current bonding period, but as the recommended snapshot period is 1000 blocks, it is advised to choose something close to current height - 1000. Set these parameters in the code snippet below <BLOCK_HEIGHT> and <BLOCK_HASH>

For reference, the list of rpc_servers and persistent peers can be found in the cosmos hub chain-registry repo.

# Build gaiad binary and initialize chain
cd $HOME
git clone -b v18.0.0 https://github.com/cosmos/gaia --depth=1
cd gaiad
make install
gaiad init CUSTOM_MONIKER --chain-id cosmoshub-4

#Set minimum gas price & peers
sed -i'' 's/minimum-gas-prices = ""/minimum-gas-prices = "0.0025uatom"/' $HOME/.gaia/config/app.toml
sed -i'' 's/persistent_peers = ""/persistent_peers = '"\"$(curl -s https://raw.githubusercontent.com/cosmos/chain-registry/master/cosmoshub/chain.json | jq -r '[foreach .peers.seeds[] as $item (""; "\($item.id)@\($item.address)")] | join(",")')\""'/' $HOME/.gaia/config/config.toml

# Configure State sync
sed -i'' 's/enable = false/enable = true/' $HOME/.gaia/config/config.toml
sed -i'' 's/trust_height = 0/trust_height = <BLOCK_HEIGHT>/' $HOME/.gaia/config/config.toml
sed -i'' 's/trust_hash = ""/trust_hash = "<BLOCK_HASH>"/' $HOME/.gaia/config/config.toml
sed -i'' 's/rpc_servers = ""/rpc_servers = "https:\/\/cosmos-rpc.polkachu.com:443,https:\/\/rpc-cosmoshub-ia.cosmosia.notional.ventures:443,https:\/\/rpc.cosmos.network:443"/' $HOME/.gaia/config/config.toml

#Start Gaia
gaiad start --x-crisis-skip-assert-invariants

Quick Sync

Note: Make sure to set the --home flag when initializing and starting gaiad if mounting quicksync data externally.

Create Gaia Home & Config
mkdir $HOME/.gaia/config -p
Start Quicksync Download

Node Operators can decide how much of historical state they want to preserve by choosing between Pruned, Default, and Archive. See the Quicksync.io downloads for up-to-date snapshot sizes.

Default
sudo apt-get install wget liblz4-tool aria2 jq -y

export URL=`curl -L https://quicksync.io/cosmos.json|jq -r '.[] |select(.file=="cosmoshub-4-default")|.url'`

echo $URL

cd $HOME/.gaia

aria2c -x5 $URL
Pruned
sudo apt-get install wget liblz4-tool aria2 jq -y

export URL=`curl -L https://quicksync.io/cosmos.json|jq -r '.[] |select(.file=="cosmoshub-4-pruned")|.url'`

echo $URL

cd $HOME/.gaia

aria2c -x5 $URL
Archive
sudo apt-get install wget liblz4-tool aria2 jq -y

export URL=`curl -L https://quicksync.io/cosmos.json|jq -r '.[] |select(.file=="cosmoshub-4-archive")|.url'`

echo $URL

cd $HOME/.gaia

aria2c -x5 $URL

The download logs should look like the following

01/11 07:48:17 [NOTICE] Downloading 1 item(s)
[#7cca5a 484MiB/271GiB(0%) CN:5 DL:108MiB ETA:42m41s]

Completed Download Process:

[#7cca5a 271GiB/271GiB(99%) CN:1 DL:77MiB]
01/11 08:32:19 [NOTICE] Download complete: /mnt/quicksync_01/cosmoshub-4-pruned.20220111.0310.tar.lz4

Download Results:
gid |stat|avg speed |path/URI
======+====+===========+=======================================================
7cca5a|OK | 105MiB/s|/mnt/quicksync_01/cosmoshub-4-pruned.20220111.0310.tar.lz4

Status Legend:
(OK):download completed.
Unzip
lz4 -c -d `basename $URL` | tar xf -
Copy Address Book Quicksync
curl https://quicksync.io/addrbook.cosmos.json > $HOME/.gaia/config/addrbook.json
Start Gaia
gaiad start --x-crisis-skip-assert-invariants

+ + + + \ No newline at end of file diff --git a/main/getting-started/quickstart.html.html b/main/getting-started/quickstart.html.html new file mode 100644 index 00000000000..431a10a7957 --- /dev/null +++ b/main/getting-started/quickstart.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/getting-started/system-requirements.html b/main/getting-started/system-requirements.html new file mode 100644 index 00000000000..473d89b4cd8 --- /dev/null +++ b/main/getting-started/system-requirements.html @@ -0,0 +1,26 @@ + + + + + +System requirements | Cosmos Hub + + + + + + + + + + + + + + +
+

System requirements

Gaia Upgrades

The Gaia application typically needs at least 32GB RAM, for smooth operation for upgrade, as there may be lengthy migrations to perform.

If you have less than 32GB RAM, you might try creating a swapfile to swap an idle program onto the hard disk to free up memory. This can allow your machine to run the binary than it could run in RAM alone.

# Linux instructions
sudo fallocate -l 16G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
+ + + + \ No newline at end of file diff --git a/main/getting-started/system-requirements.html.html b/main/getting-started/system-requirements.html.html new file mode 100644 index 00000000000..8d1c8d736fd --- /dev/null +++ b/main/getting-started/system-requirements.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/getting-started/what-is-gaia.html b/main/getting-started/what-is-gaia.html new file mode 100644 index 00000000000..f9047f6e60c --- /dev/null +++ b/main/getting-started/what-is-gaia.html @@ -0,0 +1,26 @@ + + + + + +What is Gaia? | Cosmos Hub + + + + + + + + + + + + + + +
+

What is Gaia?

The Cosmos Hub is a public Proof-of-Stake chain that uses ATOM as its native staking token. It is the first blockchain launched in the Cosmos Network and developed using the cosmos-sdk development framework and ibc-go.

Cosmos hub is also the first security aggregation platform that leverages the interchain-security protocol (ICS-28) to facilitate the launch of cosmos-sdk blockchain projects.

tip

Interchain security features deployed on the Cosmos Hub blockchain allow anyone to launch a blockchain using a subset, or even the entire validator set of the Cosmos Hub blockchain.

info
  • gaia is the name of the Cosmos SDK application for the Cosmos Hub.

  • gaiad is the daemon and command-line interface (CLI) that operates the gaia blockchain application.

For a full list of modules used on the Cosmos Hub follow this link.

Next, learn how to install Gaia.

+ + + + \ No newline at end of file diff --git a/main/getting-started/what-is-gaia.html.html b/main/getting-started/what-is-gaia.html.html new file mode 100644 index 00000000000..013e015f0bb --- /dev/null +++ b/main/getting-started/what-is-gaia.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/governance.html b/main/governance.html new file mode 100644 index 00000000000..490d646065d --- /dev/null +++ b/main/governance.html @@ -0,0 +1,28 @@ + + + + + +Governance Overview | Cosmos Hub + + + + + + + + + + + + + + +
+

Governance Overview

The Cosmos Hub ("Gaia") has an on-chain governance mechanism for signaling, changing consensus parameters, and spending funds from the community pool.

This repository provides background information on these different kinds of proposals and best-practices for drafting them and proposing them on-chain.

Community

Cosmos governance is driven by the Cosmos community, and much of the documentation in this repo was funded by the community fund itself in +Proposal 23 and Proposal 63. +Governance discussions happen in a number of places moderated by diverse community members, including:

+ + + + \ No newline at end of file diff --git a/main/governance.html.html b/main/governance.html.html new file mode 100644 index 00000000000..a3897b3f813 --- /dev/null +++ b/main/governance.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/governance/best-practices.html b/main/governance/best-practices.html new file mode 100644 index 00000000000..2dc3e2d59d0 --- /dev/null +++ b/main/governance/best-practices.html @@ -0,0 +1,26 @@ + + + + + +Off-Chain Proposal Process | Cosmos Hub + + + + + + + + + + + + + + +
+

Off-Chain Proposal Process

Once a proposal is on-chain, it cannot be changed to reflect feedback or new information. It's very important to give a proposal time off-chain to receive feedback, input, and edits before going on-chain and asking for votes.

The process of passing a proposal starts long before it goes on-chain!

There are currently several types of proposals supported by the Cosmos Hub:

  • Text - Proposal to agree to a certain strategy, plan, commitment, future upgrade or other statement. Text proposals do not directly cause any changes, but they can be used to take a record of the community's opinion or commitment to a future idea.
  • Community Pool Spend - Proposal to spend funds from the community pool on a project.
  • Parameter Change - Proposal to change a core on-chain parameter.
  • Software Upgrade - Proposal to upgrade the chain version.
  • IBC Client Update - Proposal to update an IBC client.

You'll first want to determine which kind of proposal you are making. Be sure to review all details of your specific proposal type.

Engage directly with the voting community and seek feedback

Engagement is likely to be critical to the success of a proposal. The degree to which you engage with the Cosmos Hub community should be relative to the potential impact that your proposal may have on the stakeholders. This guide does not cover all ways of engaging but here are some suggestions:

  • Post your idea to the Cosmos Hub Forum

  • Mention the idea in a community call (often hosted on Twitter)

  • Host an AMA on Reddit

    We encourage you to experiment and use your strengths to introduce proposal ideas and gather feedback.

There are many different ways to engage. One strategy involves a few stages of engagement before and after submitting a proposal on chain.

Why do it in stages? It's a more conservative approach to save resources. The idea is to check in with key stakeholders at each stage before investing more resources into developing your proposal.

In the first stage of this strategy, you should engage people (ideally experts) informally about your idea. You'll want to start with the minimal, critical components (name, value to Cosmos Hub, timeline, any funding needs) and check:

  • Does it make sense?
  • Are there critical flaws?
  • How will this affect other projects or properties of the Hub?

You should be engaging with key stakeholders (e.g., a large validator operator) with a few short sentences to measure their support. Here's an example:

"We are considering a proposal for funding to work on project. We think it will help the Hub to outcome. Timeline is x, and we're asking for y amount. Do you think that this is a proposal that large validator may support?"

Why a large validator? They tend to be the de facto decision-makers on the Cosmos Hub, since their delegators also delegate their voting power. If you can establish a base layer of off-chain support, you can be more confident that it's worth proceeding to the next stage.

Note: Many validators will likely hesitate to commit support, and that's okay. It will be important to reassure these stakeholders that this isn't a binding commitment. You're just canvasing the community to get a feel for whether it's worthwhile to proceed. It's also an opportunity to connect with new people and to answer their questions about what it is you're working on. It will be important for them to clearly understand why you think what you're proposing will be valuable to the Cosmos Hub, and if possible, why it will be valuable to them as long-term stakeholders.

If you're already confident about your idea, skip to Stage 2.

Stage 1: Your Idea

Not yet confident about your idea?

Great! Governance proposals potentially impact many stakeholders. Introduce your idea with known members of the community before investing resources into drafting a proposal. Don't let negative feedback dissuade you from exploring your idea if you think that it's still important.

If you know people who are very involved with the Cosmos Hub, send them a private message with a concise overview of what you think will result from your idea or proposed changes. Wait for them to ask questions before providing details. Do the same in semi-private channels where people tend to be respectful (and hopefully supportive).

Confident with your idea?

Great! However, remember that governance proposals potentially impact many stakeholders, which can happen in unexpected ways. Introduce your idea with members of the community before investing resources into drafting a proposal. At this point you should seek out and carefully consider critical feedback in order to protect yourself from confirmation bias. This is the ideal time to see a critical flaw, because submitting a flawed proposal on-chain will waste resources and have reputational costs.

Posting your idea to the Cosmos Hub Forum is a great way to get broad feedback and perspective even if you don't have personal connections to any stakeholders or involved parties.

Are you ready to draft a governance proposal?

There will likely be differences of opinion about the value of what you're proposing to do and the strategy by which you're planning to do it. If you've considered feedback from broad perspectives and think that what you're doing is valuable and that your strategy should work, and you believe that others feel this way as well, it's likely worth drafting a proposal. However, remember that the largest ATOM stakers have the biggest vote, so a vocal minority isn't necessarily representative or predictive of the outcome of an on-chain vote.

You could choose to take a conservative approach and wait until you have some confidence that you roughly have initial support from a majority of the voting power before proceeding to drafting the details of your proposal. Or you could propose the idea, or define the problem statement and let the community participate freely in drafting competing solutions to solve the issue.

Stage 2: Your Draft Proposal

The next major section outlines and describes some potential elements of drafting a proposal. Ensure that you have considered your proposal and anticipated questions that the community will likely ask. Once your proposal is on-chain, you will not be able to change it.

Proposal Elements

It will be important to balance two things: being detailed and being concise. You'll want to be concise so that people can assess your proposal quickly. You'll want to be detailed so that voters will have a clear, meaningful understanding of what the changes are and how they are likely to be impacted.

Each major proposal type has a rough template available on the forum: Text, community pool spend, parameter change, software upgrade.

Each proposal should contain a summary with key details about what the proposal hopes to change. If you were viewing only the summary with no other context, it should be a good start to being able to make a decision.

Assume that many people will stop reading at this point. However it is important to provide in-depth information. The on-chain proposal text should also include a link to an un-editable version of the text, such as an IPFS pin, and a link to where discussion about the idea is happening.

A few more pointers for Parameter-change and Community Spend proposals are below.

Parameter-Change

An example of a successful parameter change proposal is Proposal #66. Note that this proposal went on-chain without the recommended IPFS pin.

  1. Problem/Value - The problem or value that's motivating the parameter change(s).
  2. Solution - How changing the parameter(s) will address the problem or improve the network.
  3. Risks & Benefits - How making this/these change(s) may expose stakeholders to new benefits and/or risks.
    • The beneficiaries of the change(s) (ie. who will these changes impact and how?)
    • Voters should understand the importance of the change(s) in a simple way
  4. Supplementary materials - Optional materials eg. models, graphs, tables, research, signed petition, etc

Community-Spend Proposal

An example of a successful community spend proposal is Proposal #63.

  1. Applicant(s) - The profile of the person(s)/entity making the proposal.
    • Who you are and your involvement in Cosmos and/or other blockchain networks.
    • An overview of team members involved and their relevant experience.
  2. Problem - What you're solving and/or opportunity you're addressing.
    • Past, present (and possibly a prediction of the future without this work being done).
  3. Solution - How you're proposing to deliver the solution.
    • Your plan to fix the problem or deliver value.
    • The beneficiaries of this plan (ie. who will your plan impact and how?).
    • Your reasons for selecting this plan.
    • Your motivation for delivering this solution/value.
  4. Funding - amount and denomination proposed eg. 5000 ATOM.
    • The entity controlling the account receiving the funding.
    • Consider an itemized breakdown of funding per major deliverable.
    • Note that the 'budget' of a spend proposal is generally the easiest thing to criticize. If your budget is vague, consider explaining the reasons you're unable to give a detailed breakdown and be clear about what happens if you do not meet your budget.
  5. Deliverables and timeline - the specifics of what you're delivering and how, and what to expect.
    • What are the specific deliverables? (be detailed).
    • When will each of these be delivered?
    • How will each of these be delivered?
    • What will happen if you do not deliver on time?
    • Do you have a plan to return the funds if you're under-budget or the project fails?
    • How will you be accountable to the Cosmos Hub stakeholders?
      • How will you communicate updates and how often?
      • How can the community observe your progress?
      • How can the community provide feedback?
    • How should the quality of deliverables be assessed? eg. metrics.
  6. Relationships and disclosures.
    • Have you received or applied for grants or funding? for similar work? eg. from the Interchain Foundation.
    • How will you and/or your organization benefit?
    • Do you see this work continuing in the future and is there a plan?
    • What are the risks involved with this work?
    • Do you have conflicts of interest to declare?

Begin with a well-considered draft proposal

Ideally, a proposal is first sent to the forum in Markdown format so that it can be further edited and available for comments. A changelog is a great tool so that people can see how the idea has developed over time and in response to feedback.

This Markdown-formatted post can eventually become the description text in a proposal sent on-chain.

Engage the community with your draft proposal

  1. Post a draft of your proposal as a topic in the appropriate category of the forum. Hub Proposals is a catch-all if you are not sure where to post, but there are categories for all types of proposals.

  2. Directly engage key members of the community for feedback. These could be large contributors, those likely to be most impacted by the proposal, and entities with high stake-backing (eg. high-ranked validators; large stakers).

  1. Alert the entire community to the draft proposal on other platforms such as Twitter, tagging accounts such as the Cosmos Hub account, the Cosmos Governance account, and other governance-focused groups.

Submit your proposal to the testnet

Before going on mainnet, you can test your proposal on the testnet.

This is a great way to make sure your proposal looks the way you want and refine it before heading to mainnet.

Stage 3: Your On-Chain Proposal

A majority of the voting community should probably be aware of the proposal and have considered it before the proposal goes live on-chain. If you're taking a conservative approach, you should have reasonable confidence that your proposal will pass before risking deposit contributions. Make revisions to your draft proposal after each stage of engagement.

See the submitting guide for more on submitting proposals.

The Deposit Period

The deposit period currently lasts 14 days. If you submitted your transaction with the minimum deposit (250 ATOM), your proposal will immediately enter the voting period. If you didn't submit the minimum deposit amount (currently 250 ATOM), then this may be an opportunity for others to show their support by contributing (and risking) their ATOMs as a bond for your proposal. You can request contributions openly and also contact stakeholders directly (particularly stakeholders who are enthusiastic about your proposal). Remember that each contributor is risking their funds, and you can read more about the conditions for burning deposits here.

This is a stage where proposals may begin to get broader attention. Some block explorers display proposals in the deposit period, while others don't show them until they hit voting period.

A large cross-section of the blockchain/cryptocurrency community exists on Twitter. Having your proposal in the deposit period is a good time to engage the so-called 'crypto Twitter' Cosmos community to prepare validators to vote (eg. tag @cosmosvalidator) and ATOM-holders that are staking (eg. tag @cosmoshub, @CosmosGov).

The Voting Period

At this point you'll want to track which validator has voted and which has not. You'll want to re-engage directly with top stake-holders, ie. the highest-ranking validator operators, to ensure that:

  1. they are aware of your proposal;
  2. they can ask you any questions about your proposal; and
  3. they are prepared to vote.

Remember that any voter may change their vote at any time before the voting period ends. That historically doesn't happen often, but there may be an opportunity to convince a voter to change their vote. The biggest risk is that stakeholders won't vote at all (for a number of reasons). Validator operators tend to need multiple reminders to vote. How you choose to contact validator operators, how often, and what you say is up to you--remember that no validator is obligated to vote, and that operators are likely occupied by competing demands for their attention. Take care not to stress any potential relationship with validator operators.

+ + + + \ No newline at end of file diff --git a/main/governance/best-practices.html.html b/main/governance/best-practices.html.html new file mode 100644 index 00000000000..369ed484a9e --- /dev/null +++ b/main/governance/best-practices.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/governance/formatting.html b/main/governance/formatting.html new file mode 100644 index 00000000000..70b26ed1065 --- /dev/null +++ b/main/governance/formatting.html @@ -0,0 +1,27 @@ + + + + + +Formatting a Proposal | Cosmos Hub + + + + + + + + + + + + + + +
+

Formatting a Proposal

Many proposals allow for long form text to be included, usually under the key description. These provide the opportunity to include markdown if formatted correctly, as well as line breaks with \n.

Beware, however, that if you are using the CLI to create a proposal, and setting description using a flag, the text will be escaped which may have undesired effects.

Formatting a proposal can be a trial-and-error process, which is why first submitting to the testnet is recommended.

The examples shown below are of the text in a json file packaged into a submit-proposal transaction sent on-chain. More details about how to submit a proposal are in the Submitting a Governance Proposal section, but for now just be aware that the examples are the contents of a file separate from the transaction. As a general rule, any flags specific to a proposal (e.g., Title, description, deposit, parameters, recipient) can be placed in a json file, while flags general to a transaction of any kind (e.g., chain-id, node-id, gas, fees) can remain in the CLI.

Text

Text proposals are used by delegators to agree to a certain strategy, plan, commitment, future upgrade, or any other statement in the form of text. Aside from having a record of the proposal outcome on the Cosmos Hub chain, a text proposal has no direct effect on the change Cosmos Hub.

There are four components:

  1. Title - the distinguishing name of the proposal, typically the way that explorers list proposals
  2. Summary - the body of the proposal that further describes what is being proposed and details surrounding the proposal
  3. Deposit - the amount that will be contributed to the deposit (in micro-ATOMs "uatom") from the account submitting the proposal
  4. Metadata - usually a link to an off-chain resource

Real example

Proposal 12 asked if the Cosmos Hub community of validators charging 0% commission was harmful to the success of the Cosmos Hub.

You can use gaiad tx gov draft-proposal and choose text to create the proposal file.

You must submit the proposal using gaiad tx gov submit-proposal <path_to_text_proposal.json>.

{
"title": "Are Validators Charging 0% Commission Harmful to the Success of the Cosmos Hub?",
"summary": "This governance proposal is intended to act purely as a signalling proposal. Throughout this history of the Cosmos Hub, there has been much debate about the impact that validators charging 0% commission has on the Cosmos Hub, particularly with respect to the decentralization of the Cosmos Hub and the sustainability for validator operations. Discussion around this topic has taken place in many places including numerous threads on the Cosmos Forum, public Telegram channels, and in-person meetups. Because this has been one of the primary discussion points in off-chain Cosmos governance discussions, we believe it is important to get a signal on the matter from the on-chain governance process of the Cosmos Hub. There have been past discussions on the Cosmos Forum about placing an in-protocol restriction on validators from charging 0% commission. https://forum.cosmos.network/t/governance-limit-validators-from-0-commission-fee/2182 This proposal is NOT proposing a protocol-enforced minimum. It is merely a signalling proposal to query the viewpoint of the bonded Atom holders as a whole. We encourage people to discuss the question behind this governance proposal in the associated Cosmos Hub forum post here: https://forum.cosmos.network/t/proposal-are-validators-charging-0-commission-harmful-to-the-success-of-the-cosmos-hub/2505 Also, for voters who believe that 0% commission rates are harmful to the network, we encourage optionally sharing your belief on what a healthy minimum commission rate for the network using the memo field of their vote transaction on this governance proposal or linking to a longer written explanation such as a Forum or blog post. The question on this proposal is “Are validators charging 0% commission harmful to the success of the Cosmos Hub?”. A Yes vote is stating that they ARE harmful to the network's success, and a No vote is a statement that they are NOT harmful.",
"deposit": "100000uatom",
"metadata": "ipfs://CID",
}

Community Pool Spend

There are five (5) components:

  1. Title - the distinguishing name of the proposal, typically the way that explorers list proposals
  2. Summary - the body of the proposal that further describes what is being proposed and details surrounding the proposal
  3. Recipient - the Cosmos Hub (bech32-based) address that will receive funding from the Community Pool
  4. Amount - the amount of funding that the recipient will receive in micro-ATOMs (uatom)
  5. Deposit - the amount that will be contributed to the deposit (in micro-ATOMs "uatom") from the account submitting the proposal

If the description says that a certain address will receive a certain number of ATOMs, it should also be programmed to do that, but it's possible that that's not the case (accidentally or otherwise). Check that the description aligns with the 'recipient' address.

Real example

The amount is 1000000000uatom. 1,000,000 micro-ATOM is equal to 1 ATOM, so recipient address cosmos1xf2qwf6g6xvuttpf37xwrgp08qq984244952ze will receive 1000 ATOM if this proposal is passed.

The deposit": "1000000uatom results in 1 ATOM being used from the proposal submitter's account.

You can use the gaiad tx gov draft-proposal utility and choose /cosmos.distribution.v1beta1.MsgCommunityPoolSpend to create a draft proposal file.

You must use gaiad tx gov submit-proposal <path_to_proposal_file.json> to submit the proposal. The proposal cannot be submitted using submit-legacy-proposal.

{
"messages":[
{
"@type": "/cosmos.distribution.v1beta1.MsgCommunityPoolSpend",
"authority": "cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn",
"recipient": "cosmos00af8sd0a9dfansdfoiasf0a9ssd9fa09i99990",
"amount": [{
"denom": "uatom",
"amount": "10000000000"
}]
}
],
"deposit": "100000uatom",
"proposer": "cosmos12xpdapokdfpsodf32das75sokdaadapsokd1sa",
"metadata": "Community Pool Spend Proposal Example",
"title": "Activate governance discussions on the Discourse forum using community pool funds",
"summary": "## Summary\nProposal to request for 1000 ATOM from the community spending pool to be sent to a multisig who will put funds towards stewardship of the Discourse forum to make it an authoritative record of governance decisions as well as a vibrant space to draft and discuss proposals.\n## Details\nWe are requesting 1000 ATOM from the community spending pool to activate and steward the Cosmos Hub (Discourse) forum for the next six months.\n\nOff-chain governance conversations are currently highly fragmented, with no shared public venue for discussing proposals as they proceed through the process of being drafted and voted on. It means there is no record of discussion that voters can confidently point to for context, potentially leading to governance decisions becoming delegitimized by stakeholders.\n\nThe requested amount will be sent to a multisig comprising individuals (members listed below) who can ensure that the tokens are spent judiciously. We believe stewardship of the forum requires:\n\n* **Moderation**: Format, edit, and categorize posts; Standardize titles and tags; Monitor and approve new posts; Archive posts.\n* **Facilitation**: Ask clarifying questions in post threads; Summarize discussions; Provide historical precedence to discussions.\n* **Engagement**: Circulate important posts on other social channels to increase community participation; Solicit input from key stakeholders.\n* **Guidance**: Orient and assist newcomers; Guide proposers through governance process; Answer questions regarding the forum or Cosmos ecosystem.\nThe work to steward the forum will be carried out by members of [Hypha Worker Co-op](https://hypha.coop/) and individuals selected from the community to carry out scoped tasks in exchange for ATOM from this budget.\n## Multisig Members\n* Hypha: Mai Ishikawa Sutton (Hypha Co-op)\n* Validator: Daniel Hwang (Stakefish)\n* Cosmos Hub developer: Lauren Gallinaro (Interchain Berlin)\n\nWe feel the membership of the multisig should be rotated following the six-month pilot period to preserve insight from the distinct specializations (i.e., Cosmos Hub validators and developers).\n## Timeline and Deliverables\nWe estimate the total work to take 250-300 hours over six months where we hope to produce:\n* **Moving summaries:** Provide succinct summaries of the proposals and include all publicly stated reasons why various entities are choosing to vote for/against a given proposal. These summaries will be written objectively, not siding with any one entity.\n* **Validator platforms:** Create a section of the Forum where we collate all validators' visions for Cosmos Hub governance to allow them to state their positions publicly. We will work with the smaller validators to ensure they are equally represented.\n* **Regular check-ins with the Cosmonaut DAO:** Collaborate with the future Cosmonaut DAO to ensure maximal accessibility and engagement. Community management is a critical, complementary aspect of increasing participation in governance.\n* **Announcement channel:** Create a read-only announcement channel in the Cosmos Community Discord, so that new proposals and major discussions can be easily followed.\n* **Tooling friendly posts:** Tag and categorize posts so that they can be easily ingested into existing tooling that validators have setup.\n* **Neutral moderation framework:** Document and follow transparent standards for how the forum is moderated.\n\nAt the end of the period, we will produce a report reflecting on our successes and failures, and recommendations for how the work of maintaining a governance venue can be continuously sustained (e.g., through a DAO). We see this initiative as a process of discovery, where we are learning by doing.\n\nFor more context, you can read through the discussions on this [proposal on the Discourse forum](https://forum.cosmos.network/t/proposal-draft-activate-governance-discussions-on-the-discourse-forum-using-community-pool-funds/5833).\n\n## Governance Votes\nThe following items summarize the voting options and what it means for this proposal:\n**YES** - You approve this community spend proposal to deposit 1000 ATOM to a multisig that will spend them to improve governance discussions in the Discourse forum.\n**NO** - You disapprove of this community spend proposal in its current form (please indicate why in the Cosmos Forum).\n**NO WITH VETO** - You are strongly opposed to this change and will exit the network if passed.\n**ABSTAIN** - You are impartial to the outcome of the proposal.\n## Recipient\ncosmos1xf2qwf6g6xvuttpf37xwrgp08qq984244952ze\n## Amount\n1000 ATOM\n\n***Disclosure**: Hypha has an existing contract with the Interchain Foundation focused on the testnet program and improving documentation. This work is beyond the scope of that contract and is focused on engaging the community in governance.*\n\nIPFS pin of proposal on-forum: (https://ipfs.io/ipfs/Qmaq7ftqWccgYCo8U1KZfEnjvjUDzSEGpMxcRy61u8gf2Y)",
}

Legacy Param Change

tip

Legacy parameter change proposals are not available for cosmos-sdk modules.

You can update these CosmosHub modules using submit-legacy-proposal:

  • ibc (transfer, interchain-accounts)
  • provider

Note: The changes outlined here must be submitted using submit-legacy-proposal.

For param-change proposals, there are arguably seven (7) components, though three are nested beneath 'Changes':

  1. Title - the distinguishing name of the proposal, typically the way that explorers list proposals
  2. Description - the body of the proposal that further describes what is being proposed and details surrounding the proposal
  3. Changes - a component containing
  4. Subspace - the Cosmos Hub module with the parameter that is being changed
  5. Key - the parameter that will be changed
  6. Value - the value of the parameter that will be changed by the governance mechanism
  7. Deposit - the amount that will be contributed to the deposit (in micro-ATOMs "uatom") from the account submitting the proposal

The components must be presented as shown in the example.

info

To update any of the cosmos-sdk modules you must use gaiad tx gov submit-proposal with a correctly formatted proposal file containing a MsgUpdateParams.

When using MsgUpdateParams please note that all fields must always be specified (PUT semantics). Please be careful to not accidentally submit a proposal +that changes more parameters than was intended. The parameters that you do not want to change you can simply copy from existing module params.

Real example

This example is 'real', because it was put on-chain using the Theta testnet and can be seen in the block explorer here.

Not all explorers will show the proposed parameter changes that are coded into the proposal, so ensure that you verify that the description aligns with what the governance proposal is programmed to enact. If the description says that a certain parameter will be increased, it should also be programmed to do that, but it's possible that that's not the case (accidentally or otherwise).

 {
"title": "Doc update test: Param change for transfer/SendEnabled",
"description": "Testing the proposal format for enabling IBC transfers on our chain",
"changes": [
{
"subspace": "transfer",
"key": "transfer",
"value": true
}
],
"deposit": "100000uatom"
}
+ + + + \ No newline at end of file diff --git a/main/governance/formatting.html.html b/main/governance/formatting.html.html new file mode 100644 index 00000000000..dfdf3b62a51 --- /dev/null +++ b/main/governance/formatting.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/governance/process.html b/main/governance/process.html new file mode 100644 index 00000000000..51dd68de2e1 --- /dev/null +++ b/main/governance/process.html @@ -0,0 +1,26 @@ + + + + + +On-Chain Proposal Process | Cosmos Hub + + + + + + + + + + + + + + +
+

On-Chain Proposal Process

Governance Parameters

Several of the numbers involved in governance are parameters and can thus be changed by passing a parameter change proposal.

  • Minimum deposit: 250 ATOM
  • Maximum deposit period: 14 days
  • Voting period: 14 days
  • Quorum: 40% of participating voting power
  • Pass threshold: 50% of participating voting power
  • Veto threshold: 33.40% of participating voting power

1. Deposit Period

The deposit period lasts either 14 days or until the proposal deposit totals 250 ATOMs, whichever happens first.

Deposits

Prior to a governance proposal entering the voting period (i.e., for the proposal to be voted upon), there must be at least a minimum number of ATOMs deposited (250). Anyone may contribute to this deposit, though it is usually filled by the proposal maker. Deposits of passed and failed proposals are returned to the contributors.

In the past, different people have considered contributions amounts differently. There is some consensus that this should be a personal choice. There is also some consensus that this can be an opportunity for supporters to signal their support by adding to the deposit amount, so a proposer may choose to leave contribution room (i.e., a deposit below 250 ATOMs) so that others may participate. It is important to remember that any contributed ATOMs are at risk of being burned.

Burned deposits

Deposits are burned only when proposals are vetoed as documented in the Cosmos SDK gov module spec. Deposits are not burned for failing to meet quorum or for being rejected.

2. Voting Period

The voting period is currently a fixed 14-day period. During the voting period, participants may select a vote of either 'Yes', 'No', 'Abstain', or 'NoWithVeto'. Voters may change their vote at any time before the voting period ends.

What do the voting options mean?

  1. Abstain: The voter wishes to contribute to quorum without voting for or against a proposal.
  2. Yes: Approval of the proposal in its current form.
  3. No: Disapproval of the proposal in its current form.
  4. NoWithVeto: A ‘NoWithVeto’ vote indicates a proposal either (1) is deemed to be spam, i.e., irrelevant to Cosmos Hub, (2) disproportionately infringes on minority interests, or (3) violates or encourages violation of the rules of engagement as currently set out by Cosmos Hub governance.

As accepted by the community in Proposal 75, voters are expected to vote 'NoWithVeto' for proposals that are spam, infringe on minority interests, or violate the rules of engagement (i.e., Social protocols which have passed governance and thus been accepted as rules on the Hub). This proposal was an extension of the ideas put forward in Proposal 6.

Voting 'NoWithVeto' has no immediate additional financial cost to the voter - you do not directly risk your ATOM by using this option.

What determines whether or not a governance proposal passes?

There are four criteria:

  1. Deposit is filled: A minimum deposit of 250 ATOM is required for the proposal to enter the voting period
    • anyone may contribute to this deposit
    • the deposit must be reached within 14 days (this is the deposit period)
  2. Quorum is reached: A minimum of 40% of the network's total voting power (staked ATOM) is required to participate
  3. Simple majority of 'Yes' votes: Greater than 50% of the participating voting power must back the 'Yes' vote by the end of the 14-day voting period
  4. Not vetoed: Less than 33.4% of participating voting power must have backed 'NoWithVeto' by the end of the 14-day voting period

Currently, the criteria for submitting and passing/failing all proposal types is the same.

How is quorum determined?

Voting power, whether backing a vote of 'Yes', 'Abstain', 'No', or 'NoWithVeto', counts toward quorum. Quorum is required for the outcome of a governance proposal vote to be considered valid and for deposit contributors to recover their deposit amounts.

How is voting tallied?

  • Total voting power refers to all staked ATOM at the end of the 14-day voting period. Liquid ATOMs are not part of the total voting power and thus cannot participate in voting.
  • Participating voting power refers to only the ATOM which have been used to cast a vote on a particular proposal. Quorum is set to 40% of the participating voting power.

Validators not in the active set can cast a vote, but their voting power (including the backing of their delegators) will not count toward the vote if they are not in the active set when the voting period ends. That means that if ATOM is delegated to a validator that is jailed, tombstoned, or outside of the active set at the time that the voting period ends, that ATOM's stake-weight will not count in the vote.

Though a simple majority 'Yes' vote (ie. 50% of participating voting power) is required for a governance proposal vote to pass, a 'NoWithVeto' vote of 33.4% of participating voting power or greater can override this outcome and cause the proposal to fail. This enables a minority group representing greater than 1/3 of participating voting power to fail a proposal that would otherwise pass.

+ + + + \ No newline at end of file diff --git a/main/governance/process.html.html b/main/governance/process.html.html new file mode 100644 index 00000000000..9505a44843f --- /dev/null +++ b/main/governance/process.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/governance/proposal-types.html b/main/governance/proposal-types.html new file mode 100644 index 00000000000..176c27203f9 --- /dev/null +++ b/main/governance/proposal-types.html @@ -0,0 +1,26 @@ + + + + + +Proposal Types | Cosmos Hub + + + + + + + + + + + + + + +
+

Proposal Types

Drafting a Proposal

Drafting and submitting a proposal is a process that takes time, attention, and involves risk. The objective of this documentation is to make this process easier by preparing participants for what to pay attention to, the information that should be considered in a proposal, and how to reduce the risk of losing deposits.

Ideally, a proposal should only fail to pass because voters are aware, engaged, and have made an informed decision to vote down the proposal.

If you are considering drafting a proposal, you should first review the general background on drafting and submitting a proposal:

  1. How the voting process and governance mechanism works
  2. How to draft your proposal and engage with the Cosmos community about it
  3. How to format proposals
  4. How to submit your proposal

You should also review details specific to each kind of proposal, listed in this section.

+ + + + \ No newline at end of file diff --git a/main/governance/proposal-types.html.html b/main/governance/proposal-types.html.html new file mode 100644 index 00000000000..b4405e3b2af --- /dev/null +++ b/main/governance/proposal-types.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/governance/proposal-types/community-pool-spend.html b/main/governance/proposal-types/community-pool-spend.html new file mode 100644 index 00000000000..eda97714239 --- /dev/null +++ b/main/governance/proposal-types/community-pool-spend.html @@ -0,0 +1,26 @@ + + + + + +Community Pool Spend | Cosmos Hub + + + + + + + + + + + + + + +
+

Community Pool Spend

Cosmos Hub launched with community-spend capabilities on December 11, 2019, effectively unlocking the potential for token-holders to vote to approve spending from the Community Pool.

🇪🇸 Esta página también está disponible en español.

Learn About the Community Pool

How is the Community Pool funded?

2% of all staking rewards generated (via block rewards & transaction fees) are continually transferred to and accrue within the Community Pool. For example, from Dec 19, 2019 until Jan 20, 2020 (32 days), 28,726 ATOM were generated and added to the pool.

How can funding for the Community Pool change?

Though the rate of funding is currently fixed at 2% of staking rewards, the effective rate is dependent upon the Cosmos Hub's staking rewards, which can change with inflation and block times.

The current parameter Community Tax parameter of 2% may be modified with a governance proposal and enacted immediately after the proposal passes.

How much money is in the Community Pool?

You may directly query the Cosmos Hub 4 for the balance of the Community Pool:

gaiad q distribution community-pool --chain-id cosmoshub-4 --node <rpc-node-address>

Alternatively, popular Cosmos explorers such as Big Dipper and Mintscan display the ongoing Community Pool balance.

How can funds from the Community Pool be spent?

Funds from the Cosmos Community Pool may be spent via successful governance proposal.

How should funds from the Community Pool be spent?

We don't know 🤷

The prevailing assumption is that funds should be spent in a way that brings value to the Cosmos Hub. However, there is debate about how to keep the fund sustainable. There is also some debate about who should receive funding. For example, part of the community believes that the funds should only be used for those who need funding most. Other topics of concern include:

  • retroactive grants
  • price negotiation
  • fund disbursal (eg. payments in stages; payments pegged to reduce volatility)
  • radical overhaul of how the community-spend mechanism functions

We can expect this to take shape as proposals are discussed, accepted, and rejected by the Cosmos Hub community.

How are funds disbursed after a community-spend proposal is passed?

If a community-spend proposal passes successfully, the number of ATOM encoded in the proposal will be transferred from the community pool to the address encoded in the proposal, and this will happen immediately after the voting period ends.

Why create a proposal to use Community Pool funds?

There are other funding options, most notably the Interchain Foundation's grant program. Why create a community-spend proposal?

As a strategy: you can do both. You can submit your proposal to the Interchain Foundation, but also consider submitting your proposal publicly on-chain. If the Hub votes in favour, you can withdraw your Interchain Foundation application.

As a strategy: funding is fast. Besides the time it takes to push your proposal on-chain, the only other limiting factor is a fixed 14-day voting period. As soon as the proposal passes, your account will be credited the full amount of your proposal request.

To build rapport. Engaging publicly with the community is the opportunity to develop relationships with stakeholders and to educate them about the importance of your work. Unforeseen partnerships could arise, and overall the community may value your work more if they are involved as stakeholders.

To be more independent. The Interchain Foundation (ICF) may not always be able to fund work. Having a more consistently funded source and having a report with its stakeholders means you can use your rapport to have confidence in your ability to secure funding without having to be dependent upon the ICF alone.

+ + + + \ No newline at end of file diff --git a/main/governance/proposal-types/community-pool-spend.html.html b/main/governance/proposal-types/community-pool-spend.html.html new file mode 100644 index 00000000000..406b6626b3f --- /dev/null +++ b/main/governance/proposal-types/community-pool-spend.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/governance/proposal-types/param-change.html b/main/governance/proposal-types/param-change.html new file mode 100644 index 00000000000..ee14463a312 --- /dev/null +++ b/main/governance/proposal-types/param-change.html @@ -0,0 +1,26 @@ + + + + + +Parameter Changes | Cosmos Hub + + + + + + + + + + + + + + +
+

Parameter Changes

This documentation aims to provide guidelines for creating and assessing parameter-change proposals.

Drafting and submitting a parameter-change governance proposal involves two kinds of risk: losing proposal deposit amounts and the potential to alter the function of the Cosmos Hub network in an undesirable way.

What parameters can be changed?

The complete parameters of the Cosmos Hub are split up into different modules, each of which has its own set of parameters. Most parameters can be updated by submitting a governance proposal.

List of modules whose parameters can be changed via governance:

  • x/auth
  • x/bank
  • x/distribution
  • x/evidence
  • x/feegrant
  • x/gov
  • x/mint
  • x/slashing
  • x/staking
  • ibc-go/transfer
  • interchain-security/provider

Each cosmos-sdk module uses MsgUpdateParams for providing parameter changes. You can learn more about it in the cosmos-sdk documentation of each module (e.g. https://docs.cosmos.network/v0.47/build/modules/staking#msgupdateparams)

What are the current parameter values?

There are ways to query the current settings for each module's parameter(s). Some can be queried with the command line program gaiad.

You can begin by using the command gaiad q [module] -h to get help about the subcommands for the module you want to query. For example, gaiad q staking params returns the settings of relevant parameters:

bond_denom: uatom
historical_entries: 10000
max_entries: 7
max_validators: 180
unbonding_time: 1814400s

If a parameter-change proposal is successful, the change takes effect immediately upon completion of the voting period.

Note: You cannot currently query the bank module's parameter, which is sendenabled. You also cannot query the crisis module's parameters.

Why create a parameter change proposal?

Parameters are what govern many aspects of the chain's behaviour. As circumstances and attitudes change, sometimes you might want to change a parameter to bring the chain's behaviour in line with community opinion. For example, the Cosmos Hub launched with 100 active validators and there have been 4 proposals to date that have increased the MaxValidators parameter. At the time of writing, the active set contains 180 validators.

The Cosmos Hub has been viewed as a slow-moving, highly secure chain and that is reflected in some of its other parameters, such as a 21 day unbonding period and 14 day voting period. These are quite long compared to other chains in the Cosmos Ecosystem

Risks in parameter change proposals

Because parameters dictate some of the ways in which the chain operates, changing them can have an impact beyond what is immediately obvious.

For example, reducing the unbonding period might seem like the only effect is in how quickly delegators can liquidate their assets. It might also have a much greater impact on the overall security of the network that would be hard to realize at first glance.

This is one of the reasons that having a thorough discussion before going on-chain is so important - talking through the impacts of a proposal is a great way to avoid unintended effects.

+ + + + \ No newline at end of file diff --git a/main/governance/proposal-types/param-change.html.html b/main/governance/proposal-types/param-change.html.html new file mode 100644 index 00000000000..94a6b48c7c8 --- /dev/null +++ b/main/governance/proposal-types/param-change.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/governance/proposal-types/software-upgrade.html b/main/governance/proposal-types/software-upgrade.html new file mode 100644 index 00000000000..ff391a5552a --- /dev/null +++ b/main/governance/proposal-types/software-upgrade.html @@ -0,0 +1,26 @@ + + + + + +Software Upgrade | Cosmos Hub + + + + + + + + + + + + + + +
+

Software Upgrade

Software upgrade proposals are submitted to signal that a Cosmos Hub release with new features, bugfixes and various other improvements is available and ready for production deployment.

Software upgrade proposals should be submitted by the development teams tasked with stewarding the Cosmos Hub development.

Procedure

Use draft-proposal command to create a draft proposal and populate it with required information.

✗ gaiad tx gov draft-proposal
Use the arrow keys to navigate: ↓ ↑ → ←
? Select proposal type:
text
community-pool-spend
▸ software-upgrade # choose this
cancel-software-upgrade
other

# populate all steps (displaying all for demonstration purposes)
Enter proposal title: Upgrade v15
Enter proposal authors: Stewards
Enter proposal summary: Upgrade to v15
Enter proposal details: <v15 upgrade changelog details>
Enter proposal proposal forum url: /
Enter proposal vote option context: Vote YES to support running this binary on the Cosmos Hub mainnet.
Enter proposal deposit: 100001uatom
Enter msg authority: cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn

In your draft_proposal.json populate the height with your desired upgrade height and populate the info field with additional information (must be a valid JSON string):

{
"binaries": {
"darwin/amd64": "https://github.com/cosmos/gaia/releases/download/v15.0.0/gaiad-v15.0.0-darwin-amd64?checksum=sha256:7157f03fbad4f53a4c73cde4e75454f4a40a9b09619d3295232341fec99ad138",
"darwin/arm64": "https://github.com/cosmos/gaia/releases/download/v15.0.0/gaiad-v15.0.0-darwin-arm64?checksum=sha256:09e2420151dd22920304dafea47af4aa5ff4ab0ddbe056bb91797e33ff6df274",
"linux/amd64": "https://github.com/cosmos/gaia/releases/download/v15.0.0/gaiad-v15.0.0-linux-amd64?checksum=sha256:236b5b83a7674e0e63ba286739c4670d15d7d6b3dcd810031ff83bdec2c0c2af",
"linux/arm64": "https://github.com/cosmos/gaia/releases/download/v15.0.0/gaiad-v15.0.0-linux-arm64?checksum=sha256:b055fb7011e99d16a3ccae06443b0dcfd745b36480af6b3e569e88c94f3134d3",
"windows/armd64": "https://github.com/cosmos/gaia/releases/download/v15.0.0/gaiad-v15.0.0-windows-amd64.exe?checksum=sha256:f0224ba914cad46dc27d6a9facd8179aec8a70727f0b1e509f0c6171c97ccf76",
"windows/arm64": "https://github.com/cosmos/gaia/releases/download/v15.0.0/gaiad-v15.0.0-windows-arm64.exe?checksum=sha256:cbbce5933d501b4d54dcced9b097c052bffdef3fa8e1dfd75f29b34c3ee7de86"
}
}

Upload your draft_metadata.json to a distribution platform of your choice. draft_proposal.json is used to submit a governance proposal using submit-proposal.

gaiad tx gov submit-proposal <path_to_proposal.json>
--from <submitter address> \
--chain-id cosmoshub-4 \
--gas <max gas allocated> \
--fees <fees allocated> \
--node <node address> \

Using x/upgrading

Software upgrade proposals can be submitted using the x/upgrade module. The end effect will be the same since the x/gov module routes the message to x/upgrade module.

Additional information

Additional instructions with debugging information is available on the submitting page.

+ + + + \ No newline at end of file diff --git a/main/governance/proposal-types/software-upgrade.html.html b/main/governance/proposal-types/software-upgrade.html.html new file mode 100644 index 00000000000..c6b0092d0e9 --- /dev/null +++ b/main/governance/proposal-types/software-upgrade.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/governance/proposal-types/text-prop.html b/main/governance/proposal-types/text-prop.html new file mode 100644 index 00000000000..f04730cf920 --- /dev/null +++ b/main/governance/proposal-types/text-prop.html @@ -0,0 +1,26 @@ + + + + + +Text (Signaling) | Cosmos Hub + + + + + + + + + + + + + + +
+

Text (Signaling)

What are signaling proposals currently used for?

Signaling proposals are used to make an on-chain record of support or agreement on a certain topic or ideas. Text proposals do not contain any code. That is, they do not directly cause any changes to the Hub once passed.

Past signalling proposals have been used for a variety of reasons:

  • Agreement to adopt (or not adopt) a feature in a future release (7, 31, 38, 49, 69)
  • A high-signal alert to validators (8)
  • On-chain record of community opinion (12)
  • Ratification of a social norm (75)

A note on historical text proposals

In the early days of the Cosmos Hub, 'text' was the only proposal type. If you read old proposals, you will find 'text' proposals being used for things we use other proposal types now, such as changing a parameter (10) or upgrading the software (19).

The process for these historical proposals was that an on-chain signal was used to give permission for development or changes to be made off-chain and included in the Cosmos Hub code. With the addition of new proposal types, these development or spending choices can now be executed by the Gaia code immediately after the vote is tallied.

Why make a signaling proposal?

Signaling proposals are a great way to take an official, public poll of community sentiment before investing more resources into a project. The most common way for text proposals to be used is to confirm that the community is actually interested in what the proposer wants to develop, without asking for money to fund development that might not be concrete enough to have a budget yet.

Because the results of signaling proposals remain on-chain and are easily accessible to anyone, they are also a good way to formalize community opinions. Information contained in documentation or Github repos can be hard to find for new community members but signaling proposals in a block explorer or wallet is very accessible.

You might make a signaling proposal to gather opinions for work you want to do for the Hub, or because you think it's important to have a record of some perspective held by the community at large.

What happens when a signaling proposal passes?

Technically, nothing happens on-chain. No code executes, and this 'unenforceable' property of text proposals is one of the biggest criticisms of the format. Regardless of whether the results of a signaling proposal are enforced by code, there can still be value from having a proposal on-chain and subject to discussion. Whether a proposal passes or fails, we all get information from it having been considered.

  • The community might have had a thorough, thoughtful discussion about a topic that they otherwise wouldn't have had.
  • A dev team interested in a feature might have a better idea of how their work will be received by the community.
  • The community might be more informed about a topic than they previously were.
  • The community might feel confident that we are aligned on a particular definition or social norm.

Submitting a text proposal

Follow the instructions below to create a text proposal and submit it to the blockchain.

➜ gaiad tx gov draft-proposal

Use the arrow keys to navigate: ↓ ↑ → ←
? Select proposal type:
▸ text # choose this
community-pool-spend
software-upgrade
cancel-software-upgrade
other

Choose text from the draft-proposal menu and populate all the available fields.

✔ text
Enter proposal title: Title
Enter proposal authors: Author
Enter proposal summary: Proposal summary
Enter proposal details: Details, all the details
Enter proposal proposal forum url: /
Enter proposal vote option context: Vote yes if <...>
Enter proposal deposit: 100001uatom

Check draft_proposal.json, your result should be similar to this:

{
"metadata": "ipfs://CID",
"deposit": "100001uatom",
"title": "Title",
"summary": "Proposal summary"
}

Upload your draft_metadata.json to a distribution platform of your choice. draft_proposal.json is used to submit a governance proposal using submit-proposal.

gaiad tx gov submit-proposal <path_to_proposal.json>
--from <submitter address> \
--chain-id cosmoshub-4 \
--gas <max gas allocated> \
--fees <fees allocated> \
--node <node address> \

Additional instructions with debugging information is available on the submitting page.

+ + + + \ No newline at end of file diff --git a/main/governance/proposal-types/text-prop.html.html b/main/governance/proposal-types/text-prop.html.html new file mode 100644 index 00000000000..ca52a4514b7 --- /dev/null +++ b/main/governance/proposal-types/text-prop.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/governance/submitting.html b/main/governance/submitting.html new file mode 100644 index 00000000000..1a98b0431b1 --- /dev/null +++ b/main/governance/submitting.html @@ -0,0 +1,31 @@ + + + + + +Submitting a Proposal | Cosmos Hub + + + + + + + + + + + + + + +
+

Submitting a Proposal

If you have a final draft of your proposal ready to submit, you may want to push your proposal live on the testnet first. These are the three primary steps to getting your proposal live on-chain.

Interacting with the Cosmos Hub via the command line in order to run queries or submit proposals has several prerequisites:

  • You will need to compile gaiad from source into a binary file executable by your operating system eg. MacOS, Windows, Linux
  • You will need to indicate which chain you are querying, and currently this is --chain-id cosmoshub-4
  • You will need to connect to a full node. You can find a list of available Cosmos Hub endpoints under the API section in the Chain Registry.
  • More info is in the Walkthrough Example section.

Running a full node can be difficult for those not technically-inclined, so you may choose to use a third-party's full node. In this case, the primary security risk is that of censorship: it's the single place where you have a single gateway to the network, and any messages submitted through an untrusted node could be censored.

Hosting supplementary materials

In general we try to minimize the amount of data pushed to the blockchain. Hence, detailed documentation about a proposal is usually hosted on a separate censorship resistant data-hosting platform, like IPFS.

Once you have drafted your proposal, ideally as a Markdown file, you +can upload it to the IPFS network:

  1. By running an IPFS node and the IPFS software, or
  2. By using a service such as https://pinata.cloud

Ensure that you "pin" the file so that it continues to be available on the network. You should get a URL like this: https://ipfs.io/ipfs/QmbkQNtCAdR1CNbFE8ujub2jcpwUcmSRpSCg8gVWrTHSWD

The value QmbkQNtCAdR1CNbFE8ujub2jcpwUcmSRpSCg8gVWrTHSWD is called the CID of your file - it is effectively the file's hash.

If you uploaded a markdown file, you can use the IPFS markdown viewer to render the document for better viewing. Links for the markdown viewer look like https://ipfs.io/ipfs/QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/example#/ipfs/<CID>, where <CID> is your CID. For instance the link above would be: https://ipfs.io/ipfs/QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/example#/ipfs/QmbkQNtCAdR1CNbFE8ujub2jcpwUcmSRpSCg8gVWrTHSWD

Share the URL with others and verify that your file is publicly accessible.

The reason we use IPFS is that it is a decentralized means of storage, making it resistant to censorship or single points of failure. This increases the likelihood that the file will remain available in the future.

Formatting the JSON file for the governance proposal

Prior to sending the transaction that submits your proposal on-chain, you must create a JSON file. This file will contain the information that will be stored on-chain as the governance proposal. Begin by creating a new text (.txt) file to enter this information. Use these best practices as a guide for the contents of your proposal. When you're done, save the file as a .json file.

Each proposal type is unique in how the JSON should be formatted. +See the relevant section for the type of proposal you are drafting:

Once on-chain, most people will rely upon block explorers to interpret this information with a graphical user interface (GUI).

Sending the transaction that submits your governance proposal

For information on how to use gaiad (the command line interface) to submit an on-chain proposal through the governance module, please refer to the gaiad CLI tutorials for the Cosmos Hub documentation.

Proposal types

There are 2 proposal types that can be submitted to the CosmosHub governance module.

Legacy proposals (cosmos-sdk < v0.47)

These proposals can be submitted using gaiad tx gov submit-legacy-proposal.

Available proposals that can be submitted using this Tx are:

  • cancel-software-upgrade
  • change-reward-denoms
  • consumer-addition
  • consumer-removal
  • ibc-upgrade
  • param-change (does not work for standard cosmos-sdk modules, works on IBC and ICS modules)
  • software-upgrade
  • update-client

You can read more about submitting a legacy proposal in the cosmos-sdk docs

Proposals (cosmos-sdk >= v0.47)

These proposals can be submitted using gaiad tx gov submit-proposal.

Using gaiad tx gov draft-proposal can help prepare a proposal. The tool will create a file containing the specified proposal message and it also helps with populating all the required proposal fields. +You can always edit the file after you create it using draft-proposal

Most cosmos-sdk modules allow changing their governance gated parameters using a MsgUpdateParams which is a new way of updating governance parameters. It is important to note that MsgUpdateParams requires all parameters to be specified in the proposal message.

You can read more about submitting a proposal in the cosmos-sdk docs

Minimal Deposit amount

tip

Please note that cosmoshub-4 uses a minimum initial deposit amount.

Proposals cannot be submitted successfully without providing a minimum initial deposit. In practice, this means that the deposit field in your proposal has to meet the min_initial_deposit governance parameter. +The minimum deposit is equal to min_deposit * min_initial_deposit_ratio. Only uatom is supported as deposit denom.

// checking the min_initial_deposit
gaiad q gov params -o json
{
...
"params": {
...
"min_deposit": [
{
"denom": "stake",
"amount": "10000000"
}
],
"min_initial_deposit_ratio": "0.000000000000000000"
}

Walkthrough example (changing x/staking params)

Let's illustrate how to change the x/staking parameters.

The module has the following parameters (values don't reflect actual on-chain values):

gaiad q staking params -o json
{
"unbonding_time": "86400s",
"max_validators": 100,
"max_entries": 7,
"historical_entries": 10000,
"bond_denom": "stake",
"min_commission_rate": "0.000000000000000000",
"validator_bond_factor": "-1.000000000000000000",
"global_liquid_staking_cap": "1.000000000000000000",
"validator_liquid_staking_cap": "1.000000000000000000"
}

We will use draft-proposal to help us create a proposal file that we will later submit.

gaiad tx gov draft-proposal
// running the command will start a terminal applet allowing you to choose the proposal type

// 1st screen
Use the arrow keys to navigate: ↓ ↑ → ←
? Select proposal type:
text
community-pool-spend
software-upgrade
cancel-software-upgrade
▸ other // choose this

// 2nd screen
✔ other
Use the arrow keys to navigate: ↓ ↑ → ←
? Select proposal message type::
↑ /cosmos.staking.v1beta1.MsgUndelegate
▸ /cosmos.staking.v1beta1.MsgUpdateParams // choose this option
/cosmos.staking.v1beta1.MsgValidatorBond
/cosmos.upgrade.v1beta1.MsgCancelUpgrade
↓ /cosmos.upgrade.v1beta1.MsgSoftwareUpgrade

After choosing the /cosmos.staking.v1beta1.MsgUpdateParams message, the applet will allow you to set the message fields and some other proposal details. +Upon completion, the proposal will be available in the directory where you called the gaiad command inside the draft_proposal.json file.

Here is an example of the draft_proposal.json file:

{
"messages": [
{
"@type": "/cosmos.staking.v1beta1.MsgUpdateParams",
"authority": "cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn",
"params": {
"unbonding_time": "86400s",
"max_validators": 100,
"max_entries": 7,
"historical_entries": 10000,
"bond_denom": "uatom",
"min_commission_rate": "0.050000000000000000", // we are changing this from 0.000000000000000000
"validator_bond_factor": "-1.000000000000000000",
"global_liquid_staking_cap": "1.000000000000000000",
"validator_liquid_staking_cap": "1.000000000000000000"
}
}
],
"metadata": "ipfs://CID",
"deposit": "1000000uatom",
"title": "Updating the staking params (min_comission_rate)",
"summary": "This proposal will attempt to update the min_commission_rate staking parameter. During proposal creation and submission **all** proposal fields must be specified. Pay attention that you don't unintentionally specify different values for fields that you did not intend to change."
}

Finally, we submit the proposal:

gaiad tx gov submit-proposal <path_to_proposal.json>
--from <submitter address> \
--chain-id cosmoshub-4 \
--gas <max gas allocated> \
--fees <fees allocated> \
--node <node address> \

Use gaiad tx gov --help to get more info about the CLI options, we will explain some options below:

  1. --from is the account key that pays the transaction fee and deposit amount. This account key must be already saved in the keyring on your device and it must be an address you control (e.g. --from hypha-dev-wallet).
  2. --gas is the maximum amount of gas permitted to be used to process the transaction (e.g. --gas 500000).
    • The more content there is in the description of your proposal, the more gas your transaction will consume
    • If this number isn't high enough and there isn't enough gas to process your transaction, the transaction will fail.
    • The transaction will only use the amount of gas needed to process the transaction.
  3. --fees is a flat-rate incentive for a validator to process your transaction.
    • Many nodes use a minimum fee to disincentivize transaction spamming.
    • 7500uatom is equal to 0.0075 ATOM.
  4. --node is using an established node to send the transaction to the Cosmos Hub 4 network. For available nodes, please look at the Chain Registry.

Note: be careful what you use for --fees. A mistake here could result in spending hundreds or thousands of ATOMs accidentally, which cannot be recovered.

Verifying your transaction

After posting your transaction, your command line interface (gaiad) will provide you with the transaction's hash, which you can either query using gaiad or by searching the transaction hash using Mintscan. The hash should look something like this: 0506447AE8C7495DE970736474451CF23536DF8EA837FAF1CF6286565589AB57.

Alternatively, you can check your Tx status and information using:

gaiad q tx <hash>

Troubleshooting a failed transaction

There are a number of reasons why a transaction may fail. Here are two examples:

  1. Running out of gas - The more data there is in a transaction, the more gas it will need to be processed. If you don't specify enough gas, the transaction will fail.

  2. Incorrect denomination - You may have specified an amount in 'utom' or 'atom' instead of 'uatom', causing the transaction to fail.

If you encounter a problem, try to troubleshoot it first, and then ask for help on the Cosmos Hub forum: https://forum.cosmos.network. We can learn from failed attempts and use them to improve upon this guide.

Depositing funds after a proposal has been submitted

Sometimes a proposal is submitted without having the minimum token amount deposited yet. In these cases you would want to be able to deposit more tokens to get the proposal into the voting stage. In order to deposit tokens, you'll need to know what your proposal ID is after you've submitted your proposal. You can query all proposals by the following command:

gaiad q gov proposals

If there are a lot of proposals on the chain already, you can also filter by your own address. For the proposal above, that would be:

gaiad q gov proposals --depositor cosmos1hxv7mpztvln45eghez6evw2ypcw4vjmsmr8cdx

Once you have the proposal ID, this is the command to deposit extra tokens:

gaiad tx gov deposit <proposal-id> <deposit_amount> --from <name>

The amount per deposit is equal to min_deposit * min_deposit_ratio. Only uatom is supported as deposit denom. Transactions where deposit_amount < (min_deposit * min_deposit_ratio) will be rejected.

Submitting your proposal to the testnet

Submitting to the testnet is identical to mainnet submissions aside from a few changes:

  1. The chain-id is theta-testnet-001.
  2. The list of usable endpoints can be found here.
  3. You will need testnet tokens, not ATOM. There is a faucet available in the Developer Discord.

You may want to submit your proposal to the testnet chain before the mainnet for a number of reasons:

  1. To see what the proposal description will look like.
  2. To signal that your proposal is about to go live on the mainnet.
  3. To share what the proposal will look like in advance with stakeholders.
  4. To test the functionality of the governance features.
+ + + + \ No newline at end of file diff --git a/main/governance/submitting.html.html b/main/governance/submitting.html.html new file mode 100644 index 00000000000..29a529d3830 --- /dev/null +++ b/main/governance/submitting.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/hub-tutorials.html b/main/hub-tutorials.html new file mode 100644 index 00000000000..89b4bdfd6b9 --- /dev/null +++ b/main/hub-tutorials.html @@ -0,0 +1,26 @@ + + + + + +Gaia Tutorials | Cosmos Hub + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main/hub-tutorials.html.html b/main/hub-tutorials.html.html new file mode 100644 index 00000000000..bc67984e8c9 --- /dev/null +++ b/main/hub-tutorials.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/hub-tutorials/gaiad.html b/main/hub-tutorials/gaiad.html new file mode 100644 index 00000000000..d1be6626149 --- /dev/null +++ b/main/hub-tutorials/gaiad.html @@ -0,0 +1,85 @@ + + + + + +Interacting with Gaiad (CLI) | Cosmos Hub + + + + + + + + + + + + + + +
+

Interacting with Gaiad (CLI)

Gaia Daemon

gaiad is the tool that enables you to interact with the node that runs on the Cosmos Hub network, whether you run it yourself or not. Let us set it up properly. In order to install it, follow the installation procedure.

Setting up gaiad

The main command used to set up gaiad is the following:

gaiad config <flag> <value>

It allows you to set a default value for each given flag.

First, set up the address of the full-node you want to connect to:

gaiad config node <host>:<port>

# example: gaiad config node https://77.87.106.33:26657

If you run your own full-node, just use tcp://localhost:26657 as the address.

Finally, let us set the chain-id of the blockchain we want to interact with:

gaiad config chain-id cosmoshub-2

Keys

Keyring

The keyring holds the private/public keypairs used to interact with a node. For instance, a validator key needs to be set up before running the blockchain node, so that blocks can be correctly signed. The private key can be stored in different locations, called "backends", such as a file or the operating system's own key storage.

Headless environments are recommended to use either the file or pass backends. More information is available at the SDK documentation page.

Key Types

There are three types of key representations that are used:

  • cosmos

    • Derived from account keys generated by gaiad keys add
    • Used to receive funds
    • e.g. cosmos15h6vd5f0wqps26zjlwrc6chah08ryu4hzzdwhc
  • cosmosvaloper

    • Used to associate a validator to its operator
    • Used to invoke staking commands
    • e.g. cosmosvaloper1carzvgq3e6y3z5kz5y6gxp3wpy3qdrv928vyah
  • cosmospub

    • Derived from account keys generated by gaiad keys add
    • e.g. cosmospub1zcjduc3q7fu03jnlu2xpl75s2nkt7krm6grh4cc5aqth73v0zwmea25wj2hsqhlqzm
  • cosmosvalconspub

    • Generated when the node is created with gaiad init.
    • Get this value with gaiad tendermint show-validator
    • e.g. cosmosvalconspub1zcjduepq0ms2738680y72v44tfyqm3c9ppduku8fs6sr73fx7m666sjztznqzp2emf

Migrate Keys From Legacy On-Disk Keybase To OS Built-in Secret Store

Older versions of gaiad used store keys in the user's home directory. If you are migrating +from an old version of gaiad you will need to migrate your old keys into your operating system's +credentials storage by running the following command:

gaiad keys migrate

The command will prompt for every passphrase. If a passphrase is incorrect, it will skip the +respective key.

Generate Keys

You'll need an account private and public key pair (a.k.a. sk, pk respectively) to be able to receive funds, send txs, bond tx, etc.

To generate a new secp256k1 key:

gaiad keys add <account_name>

The output of the above command will contain a seed phrase. It is recommended to save the seed +phrase in a safe place so that in case you forget the password of the operating system's +credentials store, you could eventually regenerate the key from the seed phrase with the +following command:

gaiad keys add --recover

If you check your private keys, you'll now see <account_name>:

gaiad keys show <account_name>

View the validator operator's address via:

gaiad keys show <account_name> --bech=val

You can see all your available keys by typing:

gaiad keys list

View the validator pubkey for your node by typing:

gaiad tendermint show-validator

Note that this is the Tendermint signing key, not the operator key you will use in delegation transactions.

Generate Multisig Public Keys

You can generate and print a multisig public key by typing:

gaiad keys add --multisig=name1,name2,name3[...] --multisig-threshold=K new_key_name

K is the minimum number of private keys that must have signed the +transactions that carry the public key's address as signer.

The --multisig flag must contain the name of public keys that will be combined into a +public key that will be generated and stored as new_key_name in the local database. +All names supplied through --multisig must already exist in the local database. Unless +the flag --nosort is set, the order in which the keys are supplied on the command line +does not matter, i.e. the following commands generate two identical keys:

gaiad keys add --multisig=foo,bar,baz --multisig-threshold=2 multisig_address
gaiad keys add --multisig=baz,foo,bar --multisig-threshold=2 multisig_address

Multisig addresses can also be generated on-the-fly and printed through the which command:

gaiad keys show --multisig-threshold K name1 name2 name3 [...]

For more information regarding how to generate, sign and broadcast transactions with a +multi signature account see Multisig Transactions.

Tx Broadcasting

When broadcasting transactions, gaiad accepts a --broadcast-mode flag. This +flag can have a value of sync (default), async, or block, where sync makes +the client return a CheckTx response, async makes the client return immediately, +and block makes the client wait for the tx to be committed (or timing out).

It is important to note that the block mode should not be used in most +circumstances. This is because broadcasting can timeout but the tx may still be +included in a block. This can result in many undesirable situations. Therefore, it +is best to use sync or async and query by tx hash to determine when the tx +is included in a block.

Fees & Gas

The Cosmos Hub uses the x/feemarket module to +dynamically vary the gas price based on demand.

You need to specify a sufficient gas price or total fees +to ensure that your transaction is included in a block, +e.g.

gaiad tx bank send ... --fees=50000uatom

or

gaiad tx bank send ... --gas-prices=0.0025uatom

To find out more about the current minimal gas price, you can query the feemarket module:

gaiad q feemarket gas-prices

or

gaiad q feemarket gas-prices uatom

which will output the current gas price similar to this:

price:  
amount: "0.005"
denom: uatom

For more information, check out how to query the feemarket, +or check out the feemarket integration guide.

Account

Get Tokens

On a testnet, getting tokens is usually done via a faucet.

Query Account Balance

After receiving tokens to your address, you can view your account's balance by typing:

gaiad query account account_cosmos
Note

When you query an account balance with zero tokens, you will get this error: No account with address <account_cosmos> was found in the state. This can also happen if you fund the account before your node has fully synced with the chain. These are both normal.

Send Tokens

The following command could be used to send coins from one account to another:

gaiad tx bank send sender_key_name_or_address recipient_address 10faucetToken \
--chain-id=chain_id
You may want to cap the maximum gas that can be consumed by the transaction via the `--gas` flag. If you pass `--gas=auto`, the gas supply will be automatically estimated before executing the transaction. Gas estimate might be inaccurate as state changes could occur in between the end of the simulation and the actual execution of a transaction, thus an adjustment is applied on top of the original estimate in order to ensure the transaction is broadcasted successfully. The adjustment can be controlled via the `--gas-adjustment` flag, whose default value is 1.0.

Now, view the updated balances of the origin and destination accounts:

gaiad query account account_cosmos
gaiad query account destination_cosmos

You can also check your balance at a given block by using the --block flag:

gaiad query account account_cosmos --block=<block_height>

You can simulate a transaction without actually broadcasting it by appending the +--dry-run flag to the command line:

gaiad tx bank send <sender_key_name_or_address> <destination_cosmosaccaddr> 10faucetToken \
--chain-id=<chain_id> \
--dry-run

Furthermore, you can build a transaction and print its JSON format to STDOUT by +appending --generate-only to the list of the command line arguments:

gaiad tx bank send <sender_address> <recipient_address> 10faucetToken \
--chain-id=<chain_id> \
--generate-only > unsignedSendTx.json
gaiad tx sign \
--chain-id=<chain_id> \
--from=<key_name> \
unsignedSendTx.json > signedSendTx.json
The `--generate-only` flag prevents `gaiad` from accessing the local keybase. Thus when such flag is supplied `sender_key_name_or_address` must be an address.

You can validate the transaction's signatures by typing the following:

gaiad tx sign --validate-signatures signedSendTx.json

You can broadcast the signed transaction to a node by providing the JSON file to the following command:

gaiad tx broadcast --node=<node> signedSendTx.json

Query Transactions

Matching a Set of Events

You can use the transaction search command to query for transactions that match a +specific set of events, which are added on every transaction.

Each event is composed by a key-value pair in the form of {eventType}.{eventAttribute}={value}. +Events can also be combined to query for a more specific result using the & symbol.

You can query transactions by events as follows:

gaiad query txs --events='message.sender=cosmos1...'

And for using multiple events:

gaiad query txs --events='message.sender=cosmos1...&message.action=withdraw_delegator_reward'

The pagination is supported as well via page and limit:

gaiad query txs --events='message.sender=cosmos1...' --page=1 --limit=20
The action tag always equals the message type returned by the `Type()` function of the relevant message.

You can find a list of available events on each of the SDK modules:

Matching a Transaction's Hash

You can also query a single transaction by its hash using the following command:

gaiad query tx [hash]

Slashing

Unjailing

To unjail your jailed validator

gaiad tx slashing unjail --from <validator-operator-addr>

Signing Info

To retrieve a validator's signing info:

gaiad query slashing signing-info <validator-pubkey>

Query Parameters

You can get the current slashing parameters via:

gaiad query slashing params

Minting

You can query for the minting/inflation parameters via:

gaiad query mint params

To query for the current inflation value:

gaiad query mint inflation

To query for the current annual provisions value:

gaiad query mint annual-provisions

Staking

Set up a Validator

Please refer to the Validator Setup section for a more complete guide on how to set up a validator-candidate.

Delegate to a Validator

On the upcoming mainnet, you can delegate atom to a validator. These delegators can receive part of the validator's fee revenue. Read more about the Cosmos Token Model.

Query Validators

You can query the list of all validators of a specific chain:

gaiad query staking validators

If you want to get the information of a single validator you can check it with:

gaiad query staking validator <account_cosmosval>

Bond Tokens

On the Cosmos Hub mainnet, we delegate uatom, where 1atom = 1000000uatom. Here's how you can bond tokens to a testnet validator (i.e. delegate):

gaiad tx staking delegate \
--amount=10000000uatom \
--validator=<validator> \
--from=<key_name> \
--chain-id=<chain_id>

<validator> is the operator address of the validator to which you intend to delegate. If you are running a local testnet, you can find this with:

gaiad keys show [name] --bech val

where [name] is the name of the key you specified when you initialized gaiad.

While tokens are bonded, they are pooled with all the other bonded tokens in the network. Validators and delegators obtain a percentage of shares that equal their stake in this pool.

Query Delegations

Once submitted a delegation to a validator, you can see its information by using the following command:

gaiad query staking delegation <delegator_addr> <validator_addr>

Or if you want to check all your current delegations with distinct validators:

gaiad query staking delegations <delegator_addr>

Unbond Tokens

If for any reason the validator misbehaves, or you just want to unbond a certain +amount of tokens, use the following command.

gaiad tx staking unbond \
<validator_addr> \
10atom \
--from=<key_name> \
--chain-id=<chain_id>

The unbonding will be automatically completed when the unbonding period has passed.

Query Unbonding-Delegations

Once you begin an unbonding-delegation, you can see it's information by using the following command:

gaiad query staking unbonding-delegation <delegator_addr> <validator_addr>

Or if you want to check all your current unbonding-delegations with distinct validators:

gaiad query staking unbonding-delegations <account_cosmos>

Additionally, as you can get all the unbonding-delegations from a particular validator:

gaiad query staking unbonding-delegations-from <account_cosmosval>

Redelegate Tokens

A redelegation is a type delegation that allows you to bond illiquid tokens from one validator to another:

gaiad tx staking redelegate \
<src-validator-operator-addr> \
<dst-validator-operator-addr> \
10atom \
--from=<key_name> \
--chain-id=<chain_id>

Here you can also redelegate a specific shares-amount or a shares-fraction with the corresponding flags.

The redelegation will be automatically completed when the unbonding period has passed.

Query Redelegations

Once you begin a redelegation, you can see its information by using the following command:

gaiad query staking redelegation <delegator_addr> <src_val_addr> <dst_val_addr>

Or if you want to check all your current unbonding-delegations with distinct validators:

gaiad query staking redelegations <account_cosmos>

Additionally, as you can get all the outgoing redelegations from a particular validator:

  gaiad query staking redelegations-from <account_cosmosval>

Query Parameters

Parameters define high level settings for staking. You can get the current values by using:

gaiad query staking params

With the above command you will get the values for:

  • Unbonding time
  • Maximum numbers of validators
  • Coin denomination for staking

All these values will be subject to updates through a governance process by ParameterChange proposals.

Query Pool

A staking Pool defines the dynamic parameters of the current state. You can query them with the following command:

gaiad query staking pool

With the pool command you will get the values for:

  • Not-bonded and bonded tokens
  • Token supply
  • Current annual inflation and the block in which the last inflation was processed
  • Last recorded bonded shares
Query Delegations To Validator

You can also query all of the delegations to a particular validator:

  gaiad query delegations-to <account_cosmosval>

Governance

Governance is the process from which users in the Cosmos Hub can come to consensus +on software upgrades, parameters of the mainnet or signaling mechanisms through +text proposals. This is done through voting on proposals, which will be submitted +by ATOM holders on the mainnet.

Some considerations about the voting process:

  • Voting is done by bonded ATOM holders on a 1 bonded ATOM 1 vote basis
  • Delegators inherit the vote of their validator if they don't vote
  • Votes are tallied at the end of the voting period (2 weeks on mainnet) where +each address can vote multiple times to update its Option value (paying the transaction fee each time), +only the most recently cast vote will count as valid
  • Voters can choose between options Yes, No, NoWithVeto and Abstain
  • At the end of the voting period, a proposal is accepted iff:
    • (YesVotes / (YesVotes+NoVotes+NoWithVetoVotes)) > 1/2
    • (NoWithVetoVotes / (YesVotes+NoVotes+NoWithVetoVotes)) < 1/3
    • ((YesVotes+NoVotes+NoWithVetoVotes) / totalBondedStake) >= quorum

For more information about the governance process and how it works, please check +out the Governance module specification.

Create a Governance Proposal

In order to create a governance proposal, you must submit an initial deposit +along with a title and description. Various modules outside of governance may +implement their own proposal types and handlers (eg. parameter changes), where +the governance module itself supports Text proposals. Any module +outside of governance has its command mounted on top of submit-proposal.

To submit a Text proposal:

gaiad tx gov submit-proposal \
--title=<title> \
--description=<description> \
--type="Text" \
--deposit="1000000uatom" \
--from=<name> \
--chain-id=<chain_id>

You may also provide the proposal directly through the --proposal flag which +points to a JSON file containing the proposal.

To submit a parameter change proposal, you must provide a proposal file as its +contents are less friendly to CLI input:

gaiad tx gov submit-proposal param-change <path/to/proposal.json> \
--from=<name> \
--chain-id=<chain_id>

Where proposal.json contains the following:

{
"title": "Param Change",
"description": "Update max validators",
"changes": [
{
"subspace": "staking",
"key": "MaxValidators",
"value": 105
}
],
"deposit": [
{
"denom": "stake",
"amount": "10000000"
}
]
}
Currently parameter changes are _evaluated_ but not _validated_, so it is very important that any `value` change is valid (ie. correct type and within bounds) for its respective parameter, eg. `MaxValidators` should be an integer and not a decimal.

Proper vetting of a parameter change proposal should prevent this from happening +(no deposits should occur during the governance process), but it should be noted +regardless.

The `SoftwareUpgrade` is currently not supported as it's not implemented and currently does not differ from the semantics of a `Text` proposal.
Query Proposals

Once created, you can now query information of the proposal:

gaiad query gov proposal <proposal_id>

Or query all available proposals:

gaiad query gov proposals

You can also query proposals filtered by voter or depositor by using the corresponding flags.

To query for the proposer of a given governance proposal:

gaiad query gov proposer <proposal_id>

Increase Deposit

In order for a proposal to be broadcasted to the network, the amount deposited must be above a minDeposit value (initial value: 512000000uatom). If the proposal you previously created didn't meet this requirement, you can still increase the total amount deposited to activate it. Once the minimum deposit is reached, the proposal enters voting period:

gaiad tx gov deposit <proposal_id> "10000000uatom" \
--from=<name> \
--chain-id=<chain_id>

NOTE: Proposals that don't meet this requirement will be deleted after MaxDepositPeriod is reached.

Query Deposits

Once a new proposal is created, you can query all the deposits submitted to it:

gaiad query gov deposits <proposal_id>

You can also query a deposit submitted by a specific address:

gaiad query gov deposit <proposal_id> <depositor_address>

Vote on a Proposal

After a proposal's deposit reaches the MinDeposit value, the voting period opens. Bonded Atom holders can then cast vote on it:

gaiad tx gov vote <proposal_id> <Yes/No/NoWithVeto/Abstain> \
--from=<name> \
--chain-id=<chain_id>
Query Votes

Check the vote with the option you just submitted:

gaiad query gov vote <proposal_id> <voter_address>

You can also get all the previous votes submitted to the proposal with:

gaiad query gov votes <proposal_id>

Query proposal tally results

To check the current tally of a given proposal you can use the tally command:

gaiad query gov tally <proposal_id>

Query Governance Parameters

To check the current governance parameters run:

gaiad query gov params

To query subsets of the governance parameters run:

gaiad query gov param voting
gaiad query gov param tallying
gaiad query gov param deposit

Fee Distribution

Query Distribution Parameters

To check the current distribution parameters, run:

gaiad query distribution params

Query distribution Community Pool

To query all coins in the community pool which is under Governance control:

gaiad query distribution community-pool

Query outstanding rewards

To check the current outstanding (un-withdrawn) rewards, run:

gaiad query distribution outstanding-rewards

Query Validator Commission

To check the current outstanding commission for a validator, run:

gaiad query distribution commission <validator_address>

Query Validator Slashes

To check historical slashes for a validator, run:

gaiad query distribution slashes <validator_address> <start_height> <end_height>

Query Delegator Rewards

To check current rewards for a delegation (were they to be withdrawn), run:

gaiad query distribution rewards <delegator_address> <validator_address>

Query All Delegator Rewards

To check all current rewards for a delegation (were they to be withdrawn), run:

gaiad query distribution rewards <delegator_address>

Multisig Transactions

Multisig transactions require signatures of multiple private keys. Thus, generating and signing +a transaction from a multisig account involve cooperation among the parties involved. A multisig +transaction can be initiated by any of the key holders, and at least one of them would need to +import other parties' public keys into their Keybase and generate a multisig public key +in order to finalize and broadcast the transaction.

For example, given a multisig key comprising the keys p1, p2, and p3, each of which is held +by a distinct party, the user holding p1 would require to import both p2 and p3 in order to +generate the multisig account public key:

gaiad keys add \
p2 \
--pubkey=cosmospub1addwnpepqtd28uwa0yxtwal5223qqr5aqf5y57tc7kk7z8qd4zplrdlk5ez5kdnlrj4

gaiad keys add \
p3 \
--pubkey=cosmospub1addwnpepqgj04jpm9wrdml5qnss9kjxkmxzywuklnkj0g3a3f8l5wx9z4ennz84ym5t

gaiad keys add \
p1p2p3 \
--multisig-threshold=2 \
--multisig=p1,p2,p3

A new multisig public key p1p2p3 has been stored, and its address will be +used as signer of multisig transactions:

gaiad keys show --address p1p2p3

You may also view multisig threshold, pubkey constituents and respective weights +by viewing the JSON output of the key or passing the --show-multisig flag:

gaiad keys show p1p2p3 -o json

gaiad keys show p1p2p3 --show-multisig

The first step to create a multisig transaction is to initiate it on behalf +of the multisig address created above:

gaiad tx bank send cosmos1570v2fq3twt0f0x02vhxpuzc9jc4yl30q2qned 1000000uatom \
--from=<multisig_address> \
--generate-only > unsignedTx.json

The file unsignedTx.json contains the unsigned transaction encoded in JSON. +p1 can now sign the transaction with its own private key:

gaiad tx sign \
unsignedTx.json \
--multisig=<multisig_address> \
--from=p1 \
--output-document=p1signature.json

Once the signature is generated, p1 transmits both unsignedTx.json and +p1signature.json to p2 or p3, which in turn will generate their +respective signature:

gaiad tx sign \
unsignedTx.json \
--multisig=<multisig_address> \
--from=p2 \
--output-document=p2signature.json

p1p2p3 is a 2-of-3 multisig key, therefore one additional signature +is sufficient. Any the key holders can now generate the multisig +transaction by combining the required signature files:

gaiad tx multisign \
unsignedTx.json \
p1p2p3 \
p1signature.json p2signature.json > signedTx.json

The transaction can now be sent to the node:

gaiad tx broadcast signedTx.json

Shells Completion Scripts

Completion scripts for popular UNIX shell interpreters such as Bash and Zsh +can be generated through the completion command, which is available for both +gaiad and gaiad.

If you want to generate Bash completion scripts run the following command:

gaiad completion > gaiad_completion
gaiad completion > gaiacli_completion

If you want to generate Zsh completion scripts run the following command:

gaiad completion --zsh > gaiad_completion
gaiad completion --zsh > gaiacli_completion
On most UNIX systems, such scripts may be loaded in `.bashrc` or `.bash_profile` to enable Bash autocompletion:
echo '. gaiad_completion' >> ~/.bashrc
echo '. gaiacli_completion' >> ~/.bashrc

Refer to the user's manual of your interpreter provided by your +operating system for information on how to enable shell autocompletion.

+ + + + \ No newline at end of file diff --git a/main/hub-tutorials/gaiad.html.html b/main/hub-tutorials/gaiad.html.html new file mode 100644 index 00000000000..b873ef8e2f7 --- /dev/null +++ b/main/hub-tutorials/gaiad.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/hub-tutorials/join-mainnet.html b/main/hub-tutorials/join-mainnet.html new file mode 100644 index 00000000000..8db08d14653 --- /dev/null +++ b/main/hub-tutorials/join-mainnet.html @@ -0,0 +1,30 @@ + + + + + +Joining Mainnet | Cosmos Hub + + + + + + + + + + + + + + +
+

Join the Cosmos Hub Mainnet

info

The chain-id of Cosmos Hub mainnet is cosmoshub-4.

Release History

  • use gaia v5.0.x (Delta) for queries of state between height 6,910,000 and 8,695,000
  • use gaia v6.0.x (Vega) between 8,695,000 and 10,085,397
  • use gaia v7.0.x (Theta) between 10,085,397 and 14,099,412
  • use gaia v8.0.x (Rho) between 14,099,412 and 14,470,501
  • use gaia v9.0.x (Lambda) between 14,470,501 and 15,213,800
  • use gaia v9.1.x between 15,213,800 and 15,816,200
  • use gaia v10.0.x between 15,816,200 and 16,596,000
  • use gaia v11.x between 16,596,000 and 16,985,500
  • use gaia v12.x between 16,985,500 and 17,380,000
  • use gaia v13.x between 17,380,000 and 18,262,000
  • use gaia v14.1.x between 18,262,000 and 19,639,600
  • use gaia v15.1.x between 19,639,600 and 19,939,000
  • use gaia v15.2.x between 19,939,000 and 20,440,500
  • use gaia v16.x from 20,440,500 and 20,739,800
  • use gaia v17.1.x from 20,739,800

This guide includes full instructions for joining the mainnet either as an archive/full node or a pruned node.

For instructions to bootstrap a node via Quicksync or State Sync, see the Quickstart Guide

For instructions to join as a validator, please also see the Validator Guide.

Overview

Explorers

There are many explorers for the Cosmos Hub. For reference while setting up a node, here are a few recommendations:

Getting Started

Make sure the following prerequisites are completed:

Hardware

Running a full archive node can be resource intensive as the full current cosmoshub-4 state is over 1.4TB. For those who wish to run state sync or use quicksync, the following hardware configuration is recommended:

Node TypeRAMStorage
Validator32GB500GB-2TB*
Full16GB2TB
Default16GB1TB

* Storage size for validators will depend on level of pruning.

General Configuration

Make sure to walk through the basic setup and configuration. Operators will need to initialize gaiad, download the genesis file for cosmoshub-4, and set persistent peers and/or seeds for startup.

Initialize Chain

Choose a custom moniker for the node and initialize. By default, the init command creates the ~/.gaia directory with subfolders config and data. In the /config directory, the most important files for configuration are app.toml and config.toml.

gaiad init <custom-moniker>

Note: Monikers can contain only ASCII characters. Using Unicode characters is not supported and renders the node unreachable.

The moniker can be edited in the ~/.gaia/config/config.toml file:

# A custom human readable name for this node
moniker = "<custom_moniker>"

Genesis File

Once the node is initialized, download the genesis file and move to the /config directory of the Gaia home directory.

wget https://raw.githubusercontent.com/cosmos/mainnet/master/genesis/genesis.cosmoshub-4.json.gz
gzip -d genesis.cosmoshub-4.json.gz
mv genesis.cosmoshub-4.json ~/.gaia/config/genesis.json

Seeds & Peers

Upon startup the node will need to connect to peers. If there are specific nodes a node operator is interested in setting as seeds or as persistent peers, this can be configured in ~/.gaia/config/config.toml

# Comma separated list of seed nodes to connect to
seeds = "<seed node id 1>@<seed node address 1>:26656,<seed node id 2>@<seed node address 2>:26656"

# Comma separated list of nodes to keep persistent connections to
persistent_peers = "<node id 1>@<node address 1>:26656,<node id 2>@<node address 2>:26656"

Node operators can optionally download the Quicksync address book. Make sure to move this to ~/.gaia/config/addrbook.json.

Gas & Fees

On Cosmos Hub mainnet, the accepted denom is uatom, where 1atom = 1.000.000uatom

Transactions on the Cosmos Hub network need to include a transaction fee in order to be processed. This fee pays for the gas required to run the transaction. The formula is the following:

fees = ceil(gas * gasPrices)

Gas is the smallest unit or pricing value required to perform a transaction. Different transactions require different amounts of gas. The gas amount for a transaction is calculated as it is being processed, but it can be estimated beforehand by using the auto value for the gas flag. The gas estimate can be adjusted with the flag --gas-adjustment (default 1.0) to ensure enough gas is provided for the transaction.

The gasPrice is the price of each unit of gas. Each validator sets a min-gas-price value, and will only include transactions that have a gasPrice greater than their min-gas-price.

The transaction fees are the product of gas and gasPrice. The higher the gasPrice/fees, the higher the chance that a transaction will get included in a block.

For mainnet, the recommended gas-prices is 0.0025uatom.

A full-node keeps unconfirmed transactions in its mempool. In order to protect it from spam, it is better to set a minimum-gas-prices that the transaction must meet in order to be accepted in the node's mempool. This parameter can be set in ~/.gaia/config/app.toml.

# The minimum gas prices a validator is willing to accept for processing a
# transaction. A transaction's fees must meet the minimum of any denomination
# specified in this config (e.g. 0.25token1;0.0001token2).
minimum-gas-prices = "0.0025uatom"

The initial recommended min-gas-prices is 0.0025uatom, but this can be changed later.

Pruning of State

Note: This is an optional configuration.

There are four strategies for pruning state. These strategies apply only to state and do not apply to block storage. A node operator may want to consider custom pruning if node storage is a concern or there is an interest in running an archive node.

To set pruning, adjust the pruning parameter in the ~/.gaia/config/app.toml file. +The following pruning state settings are available:

  1. everything: Prune all saved states other than the current state.
  2. nothing: Save all states and delete nothing.
  3. default: Save the last 100 states and the state of every 10,000th block.
  4. custom: Specify pruning settings with the pruning-keep-recent, pruning-keep-every, and pruning-interval parameters.

By default, every node is in default mode which is the recommended setting for most environments. +If a node operator wants to change their node's pruning strategy then this must be done before the node is initialized.

In ~/.gaia/config/app.toml

# default: the last 100 states are kept in addition to every 500th state; pruning at 10 block intervals
# nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node)
# everything: all saved states will be deleted, storing only the current state; pruning at 10 block intervals
# custom: allow pruning options to be manually specified through 'pruning-keep-recent', 'pruning-keep-every', and 'pruning-interval'
pruning = "custom"

# These are applied if and only if the pruning strategy is custom.
pruning-keep-recent = "10"
pruning-keep-every = "1000"
pruning-interval = "10"

Passing a flag when starting gaia will always override settings in the app.toml file. To change the node's pruning setting to everything mode then pass the ---pruning everything flag when running gaiad start.

Note: If running the node with pruned state, it will not be possible to query the heights that are not in the node's store.

REST API

Note: This is an optional configuration.

By default, the REST API is disabled. To enable the REST API, edit the ~/.gaia/config/app.toml file, and set enable to true in the [api] section.

###############################################################################
### API Configuration ###
###############################################################################
[api]
# Enable defines if the API server should be enabled.
enable = true
# Swagger defines if swagger documentation should automatically be registered.
swagger = false
# Address defines the API server to listen on.
address = "tcp://0.0.0.0:1317"

Optionally activate swagger by setting swagger to true or change the port of the REST API in the parameter address. +After restarting the application, access the REST API on <NODE IP>:1317.

GRPC

Note: This is an optional configuration.

By default, gRPC is enabled on port 9090. The ~/.gaia/config/app.toml file is where changes can be made in the gRPC section. To disable the gRPC endpoint, set enable to false. To change the port, use the address parameter.

###############################################################################
### gRPC Configuration ###
###############################################################################
[grpc]
# Enable defines if the gRPC server should be enabled.
enable = true
# Address defines the gRPC server address to bind to.
address = "0.0.0.0:9090"

Sync Options

There are three main ways to sync a node on the Cosmos Hub; Blocksync, State Sync, and Quicksync. See the matrix below for the Hub's recommended setup configuration. This guide will focus on syncing two types of common nodes; full and pruned. For further information on syncing to run a validator node, see the section on Validators.

There are two types of concerns when deciding which sync option is right. Data integrity refers to how reliable the data provided by a subset of network participants is. Historical data refers to how robust and inclusive the chain’s history is.

Low Data IntegrityHigh Data Integrity
Minimal Historical DataQuicksync - PrunedState Sync
Moderate Historical DataQuicksync - Default
Full Historical DataQuicksync - ArchiveBlocksync

If a node operator wishes to run a full node, it is possible to start from scratch but will take a significant amount of time to catch up. Node operators not concerned with rebuilding original state from the beginning of cosmoshub-4 can also leverage Quicksync's available archive history.

For operators interested in bootstrapping a pruned node, either Quicksync or State Sync would be sufficient.

Make sure to consult the hardware section for guidance on the best configuration for the type of node operating.

Blocksync

Blocksync is faster than traditional consensus and syncs the chain from genesis by downloading blocks and verifying against the merkle tree of validators. For more information see CometBFT's Blocksync Docs

When syncing via Blocksync, node operators will either need to manually upgrade the chain or set up Cosmovisor to upgrade automatically.

For more information on performing the manual upgrades, see Releases & Upgrades.

It is possible to sync from previous versions of the Cosmos Hub. See the matrix below for the correct gaia version. See the mainnet archive for historical genesis files.

Chain IdGaia Version
cosmoshub-4v4.2.1
cosmoshub-3v2.0.x
cosmoshub-2v1.0.x
cosmoshub-1v0.0.x
Getting Started

Start Gaia to begin syncing with the skip-invariants flag. For more information on this see Verify Mainnet.

gaiad start --x-crisis-skip-assert-invariants

The node will begin rebuilding state until it hits the first upgrade height at block 6910000. If Cosmovisor is set up then there's nothing else to do besides wait, otherwise the node operator will need to perform the manual upgrade twice.

State Sync

State Sync is an efficient and fast way to bootstrap a new node, and it works by replaying larger chunks of application state directly rather than replaying individual blocks or consensus rounds. For more information, see CometBFT's State Sync docs.

To enable state sync, visit an explorer to get a recent block height and corresponding hash. A node operator can choose any height/hash in the current bonding period, but as the recommended snapshot period is 1000 blocks, it is advised to choose something close to current height - 1000.

With the block height and hash selected, update the configuration in ~/.gaia/config/config.toml to set enable = true, and populate the trust_height and trust_hash. Node operators can configure the rpc servers to a preferred provider, but there must be at least two entries. It is important that these are two rpc servers the node operator trusts to verify component parts of the chain state. While not recommended, uniqueness is not currently enforced, so it is possible to duplicate the same server in the list and still sync successfully.

Note: In the future, the RPC server requirement will be deprecated as state sync is moved to the p2p layer in Tendermint 0.38.

#######################################################
### State Sync Configuration Options ###
#######################################################
[statesync]
# State sync rapidly bootstraps a new node by discovering, fetching, and restoring a state machine
# snapshot from peers instead of fetching and replaying historical blocks. Requires some peers in
# the network to take and serve state machine snapshots. State sync is not attempted if the node
# has any local state (LastBlockHeight > 0). The node will have a truncated block history,
# starting from the height of the snapshot.
enable = true

# RPC servers (comma-separated) for light client verification of the synced state machine and
# retrieval of state data for node bootstrapping. Also needs a trusted height and corresponding
# header hash obtained from a trusted source, and a period during which validators can be trusted.
#
# For Cosmos SDK-based chains, trust_period should usually be about 2/3 of the unbonding time (~2
# weeks) during which they can be financially punished (slashed) for misbehavior.
rpc_servers = "https://cosmos-rpc.polkachu.com:443,https://rpc-cosmoshub-ia.cosmosia.notional.ventures:443"
trust_height = 8959784
trust_hash = "3D8F12EA302AEDA66E80939F7FC785206692F8B6EE6F727F1655F1AFB6A873A5"
trust_period = "168h0m0s"

Start Gaia to begin state sync. It may take some time for the node to acquire a snapshot, but the command and output should look similar to the following:

$ gaiad start --x-crisis-skip-assert-invariants

...

> INF Discovered new snapshot format=1 hash="0x000..." height=8967000 module=statesync

...

> INF Fetching snapshot chunk chunk=4 format=1 height=8967000 module=statesync total=45
> INF Applied snapshot chunk to ABCI app chunk=0 format=1 height=8967000 module=statesync total=45

Once state sync successfully completes, the node will begin to process blocks normally. If state sync fails and the node operator encounters the following error: State sync failed err="state sync aborted", either try restarting gaiad or running gaiad unsafe-reset-all (make sure to backup any configuration and history before doing this).

Quicksync

Quicksync.io offers several daily snapshots of the Cosmos Hub with varying levels of pruning (archive 1.4TB, default 540GB, and pruned 265GB). For downloads and installation instructions, visit the Cosmos Quicksync guide.

Snapshots

Saving and serving snapshots helps nodes rapidly join the network. Snapshots are now enabled by default effective 1/20/21.

While not advised, if a node operator needs to customize this feature, it can be configured in ~/.gaia/config/app.toml. The Cosmos Hub recommends setting this value to match pruning-keep-every in config.toml.

Note: It is highly recommended that node operators use the same value for snapshot-interval in order to aid snapshot discovery. Discovery is easier when more nodes are serving the same snapshots.

In app.toml

###############################################################################
### State Sync Configuration ###
###############################################################################

# State sync snapshots allow other nodes to rapidly join the network without replaying historical
# blocks, instead downloading and applying a snapshot of the application state at a given height.
[state-sync]

# snapshot-interval specifies the block interval at which local state sync snapshots are
# taken (0 to disable). Must be a multiple of pruning-keep-every.
snapshot-interval = 1000

# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all).
snapshot-keep-recent = 10

Cosmovisor

Cosmovisor is a process manager developed to relieve node operators of having to manually intervene every time there is an upgrade. Cosmovisor monitors the governance module for upgrade proposals; it will take care of downloading the new binary, stopping the old one, switching to the new one, and restarting.

For more information on how to run a node via Cosmovisor, check out the docs.

Running via Background Process

To run the node in a background process with automatic restarts, it's recommended to use a service manager like systemd. To set this up run the following:

sudo tee /etc/systemd/system/<service name>.service > /dev/null <<EOF  
[Unit]
Description=Gaia Daemon
After=network-online.target

[Service]
User=$USER
ExecStart=$(which gaiad) start
Restart=always
RestartSec=3
LimitNOFILE=4096

[Install]
WantedBy=multi-user.target
EOF

If using Cosmovisor then make sure to add the following:

Environment="DAEMON_HOME=$HOME/.gaia"
Environment="DAEMON_NAME=gaiad"
Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"

After the LimitNOFILE line and replace $(which gaiad) with $(which cosmovisor).

Run the following to setup the daemon:

sudo -S systemctl daemon-reload
sudo -S systemctl enable <service name>

Then start the process and confirm that it's running.

sudo -S systemctl start <service name>

sudo service <service name> status

Exporting State

Gaia can dump the entire application state into a JSON file. This application state dump is useful for manual analysis and can also be used as the genesis file of a new network.

Note: The node can't be running while exporting state, otherwise the operator can expect a resource temporarily unavailable error.

Export state with:

gaiad export > [filename].json

It is also possible to export state from a particular height (at the end of processing the block of that height):

gaiad export --height [height] > [filename].json

If planning to start a new network from the exported state, export with the --for-zero-height flag:

gaiad export --height [height] --for-zero-height > [filename].json

Verify Mainnet

Help to prevent a catastrophe by running invariants on each block on your full +node. In essence, by running invariants the node operator ensures that the state of mainnet is the correct expected state. One vital invariant check is that no atoms are being created or destroyed outside of expected protocol, however there are many other invariant checks each unique to their respective module. Because invariant checks are computationally expensive, they are not enabled by default. To run a node with these checks start your node without the --x-crisis-skip-assert-invariants flag:

gaiad start

If an invariant is broken on the node, it will panic and prompt the operator to send a transaction which will halt mainnet. For example the provided message may look like:

invariant broken:
loose token invariance:
pool.NotBondedTokens: 100
sum of account tokens: 101
CRITICAL please submit the following transaction:
gaiad tx crisis invariant-broken staking supply

+ + + + \ No newline at end of file diff --git a/main/hub-tutorials/join-mainnet.html.html b/main/hub-tutorials/join-mainnet.html.html new file mode 100644 index 00000000000..4160a45ec3a --- /dev/null +++ b/main/hub-tutorials/join-mainnet.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/hub-tutorials/join-testnet.html b/main/hub-tutorials/join-testnet.html new file mode 100644 index 00000000000..a50b690faa5 --- /dev/null +++ b/main/hub-tutorials/join-testnet.html @@ -0,0 +1,26 @@ + + + + + +Joining Testnet | Cosmos Hub + + + + + + + + + + + + + + +
+

Joining Testnet

Visit the testnets repo for the most up-to-date information on the currently available public testnets:

How to Join

You can set up a testnet node with a single command using one of the options below:

Create a Validator (Optional)

If you want to create a validator in either testnet, request tokens through the faucet Discord channel and follow the this guide. If you are creating a validator in the Release Testnet, you can disregard the instructions about joining live consumer chains.

Upgrading Your Node

Follow these instructions if you have a node that is already synced and wish to participate in a scheduled testnet software upgrade.

When the chain reaches the upgrade block height specified by a software upgrade proposal, the chain binary will halt and expect the new binary to be run (the system log will show ERR UPGRADE "<Upgrade name>" NEEDED at height: XXXX or something similar).

There are three ways you can update the binary:

  1. Without Cosmovisor: You must build or download the new binary ahead of the upgrade. When the chain binary halts at the upgrade height:
  • Stop the gaiad service with systemctl stop gaiad.service.
  • Build or download the new binary, replacing the existing ~/go/bin one.
  • Start the gaiad service with systemctl start gaiad.service.
  1. With Cosmovisor: You must build or download the new binary and copy it to the appropriate folder ahead of the upgrade.
  2. With Cosmovisor: Using the auto-download feature, assuming the proposal includes the binaries for your system architecture.

The instructions below are for option 2. For more information on auto-download with Cosmovisor, see the relevant documentation in the Cosmos SDK repo.

If the environment variable DAEMON_ALLOW_DOWNLOAD_BINARIES is set to false, Cosmovisor will look for the new binary in a folder that matches the name of the upgrade specified in the software upgrade proposal.

Cosmovisor Upgrade Example

Using the v17 upgrade as an example, the expected folder structure would look as follows:

.gaia
└── cosmovisor
├── current
├── genesis
│ └── bin
| └── gaiad
└── upgrades
└── v17
└── bin
└── gaiad

Prepare the upgrade directory

mkdir -p ~/.gaia/cosmovisor/upgrades/v17/bin

Download and install the new binary version.

cd $HOME/gaia
git pull
git checkout v17.0.0-rc0
make install

# Copy the new binary to the v17 upgrade directory
cp ~/go/bin/gaiad ~/.gaia/cosmovisor/upgrades/v17/bin/gaiad

When the upgrade height is reached, Cosmovisor will stop the gaiad binary, update the symlink from current to the relevant upgrade folder, and restart. After a few minutes, the node should start syncing blocks using the new binary.

+ + + + \ No newline at end of file diff --git a/main/hub-tutorials/join-testnet.html.html b/main/hub-tutorials/join-testnet.html.html new file mode 100644 index 00000000000..0990a6227bd --- /dev/null +++ b/main/hub-tutorials/join-testnet.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/hub-tutorials/live-upgrade-tutorial.html b/main/hub-tutorials/live-upgrade-tutorial.html new file mode 100644 index 00000000000..2e64308c532 --- /dev/null +++ b/main/hub-tutorials/live-upgrade-tutorial.html @@ -0,0 +1,32 @@ + + + + + +Upgrading the Chain | Cosmos Hub + + + + + + + + + + + + + + +
+

Upgrading the Chain

This document demonstrates how a live upgrade can be performed on-chain through a +governance process.

  1. Start the network and trigger upgrade

    # start a gaia application full-node
    $ gaiad start

    # set up the cli config
    $ gaiad config chain-id testing

    # create an upgrade governance proposal
    $ gaiad tx gov submit-proposal <path-to-proposal-json> --from <name-or-key>

    Where proposal json file contains MsgSoftwareUpgrade e.g.
    `{
    "messages": [
    {
    "@type": "/cosmos.upgrade.v1beta1.MsgSoftwareUpgrade",
    "authority":"cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn" ,
    "plan": {
    "name": "plan name",
    "height": "1000" ,
    "info": "proposal info" ,
    "upgraded_client_state": null
    }
    }
    ],
    "metadata": "ipfs://CID",
    "deposit": "10000000stake",
    "title": "proposal title",
    "summary": "proposal summary"
    }`

once the proposal passes you can query the pending plan

$ gaiad query upgrade plan


2. Performing an upgrade

Assuming the proposal passes the chain will stop at given upgrade height.

You can stop and start the original binary all you want, but **it will refuse to
run after the upgrade height**.

We need a new binary with the upgrade handler installed. The logs should look
something like:

```bash
E[2019-11-05|12:44:18.913] UPGRADE "<plan-name>" NEEDED at height: <desired-upgrade-height>: module=main
E[2019-11-05|12:44:18.914] CONSENSUS FAILURE!!!
...

Note that the process will hang indefinitely (doesn't exit to avoid restart loops). So, you must +manually kill the process and replace it with a new binary. Do so now with Ctrl+C or killall gaiad.

In gaia/app/app.go, after upgrade.Keeper is initialized and set in the app, set the +corresponding upgrade Handler with the correct <plan-name>:

    app.upgradeKeeper.SetUpgradeHandler("<plan-name>", func(ctx sdk.Context, plan upgrade.Plan) {
// custom logic after the network upgrade has been executed
})

Note that we panic on any error - this would cause the upgrade to fail if the +migration could not be run, and no node would advance - allowing a manual recovery. +If we ignored the errors, then we would proceed with an incomplete upgrade and +have a very difficult time every recovering the proper state.

Now, compile the new binary and run the upgraded code to complete the upgrade:

# create a new binary of gaia with the added upgrade handler
$ make install

# Restart the chain using the new binary. You should see the chain resume from
# the upgrade height:
# `I[2019-11-05|12:48:15.184] applying upgrade <plan-name> at height: <desired-upgrade-height> module=main`
$ gaiad start

# verify there is no pending plan
$ gaiad query upgrade plan

# verify you can query the block header of the completed upgrade
$ gaiad query upgrade applied <plan-name>
+ + + + \ No newline at end of file diff --git a/main/hub-tutorials/live-upgrade-tutorial.html.html b/main/hub-tutorials/live-upgrade-tutorial.html.html new file mode 100644 index 00000000000..83e571e3575 --- /dev/null +++ b/main/hub-tutorials/live-upgrade-tutorial.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/hub-tutorials/upgrade-node.html b/main/hub-tutorials/upgrade-node.html new file mode 100644 index 00000000000..c4d12c0ee5f --- /dev/null +++ b/main/hub-tutorials/upgrade-node.html @@ -0,0 +1,28 @@ + + + + + +Upgrading Your Node | Cosmos Hub + + + + + + + + + + + + + + +
+

Upgrade Your Node

This document describes the upgrade procedure of a gaiad full-node to a new version.

Cosmovisor

The Cosmos SDK provides a convenient process manager that wraps around the gaiad binary and can automatically swap in new binaries upon a successful governance upgrade proposal. Cosmovisor is entirely optional but recommended. More information can be found in cosmos.network docs and cosmos-sdk/cosmovisor/readme.

Setup

To get started with Cosmovisor first download it

go install github.com/cosmos/cosmos-sdk/cosmovisor/cmd/cosmovisor

Set up the environment variables

echo "# Setup Cosmovisor" >> ~/.profile
echo "export DAEMON_NAME=gaiad" >> ~/.profile
echo "export DAEMON_HOME=$HOME/.gaia" >> ~/.profile
source ~/.profile

Create the appropriate directories

mkdir -p ~/.gaia/cosmovisor/upgrades
mkdir -p ~/.gaia/cosmovisor/genesis/bin/
cp $(which gaiad) ~/.gaia/cosmovisor/genesis/bin/

# verify the setup.
# It should return the same version as gaiad
cosmovisor version

Now gaiad can start by running

cosmovisor start

Preparing an Upgrade

Cosmovisor will continually poll the $DAEMON_HOME/data/upgrade-info.json for new upgrade instructions. When an upgrade is ready, node operators can download the new binary and place it under $DAEMON_HOME/cosmovisor/upgrades/<name>/bin where <name> is the URI-encoded name of the upgrade as specified in the upgrade module plan.

It is possible to have Cosmovisor automatically download the new binary. To do this set the following environment variable.

export DAEMON_ALLOW_DOWNLOAD_BINARIES=true

Manual Software Upgrade

First, stop your instance of gaiad. Next, upgrade the software:

cd gaia
git fetch --all && git checkout <new_version>
make install
tip

NOTE: If you have issues at this step, please check that you have the latest stable version of GO installed.

See the testnet repo for details on which version is needed for which public testnet, and the Gaia release page for details on each release.

Your full node has been cleanly upgraded! If there are no breaking changes then you can simply restart the node by running:

gaiad start

Upgrade Genesis File

danger

If the new version you are upgrading to has breaking changes, you will have to restart your chain. If it is not breaking, you can skip to Restart

To upgrade the genesis file, you can either fetch it from a trusted source or export it locally.

Fetching from a Trusted Source

If you are joining the mainnet, fetch the genesis from the mainnet repo. If you are joining a public testnet, fetch the genesis from the appropriate testnet in the testnet repo. Otherwise, fetch it from your trusted source.

Save the new genesis as new_genesis.json. Then replace the old genesis.json with new_genesis.json

cd $HOME/.gaia/config
cp -f genesis.json new_genesis.json
mv new_genesis.json genesis.json

Then, go to the reset data section.

Exporting State to a New Genesis Locally

If you were running a node in the previous version of the network and want to build your new genesis locally from a state of this previous network, use the following command:

cd $HOME/.gaia/config
gaiad export --for-zero-height --height=<export-height> > new_genesis.json

The command above take a state at a certain height <export-height> and turns it into a new genesis file that can be used to start a new network.

Then, replace the old genesis.json with new_genesis.json.

cp -f genesis.json new_genesis.json
mv new_genesis.json genesis.json

At this point, you might want to run a script to update the exported genesis into a genesis that is compatible with your new version. For example, the attributes of the Account type changed, a script should query encoded account from the account store, unmarshal them, update their type, re-marshal and re-store them. You can find an example of such script here.

Reset Data

danger

If the version <new_version> you are upgrading to is not breaking from the previous one, you should not reset the data. If it is not breaking, you can skip to Restart

danger

If you are running a validator node on the mainnet, always be careful when doing gaiad unsafe-reset-all. You should never use this command if you are not switching chain-id.

::: danger IMPORTANT +Make sure that every node has a unique priv_validator.json. Do not copy the priv_validator.json from an old node to multiple new nodes. Running two nodes with the same priv_validator.json will cause you to get slashed due to double signing! +:::

First, remove the outdated files and reset the data. If you are running a validator node, make sure you understand what you are doing before resetting.

gaiad unsafe-reset-all

Your node is now in a pristine state while keeping the original priv_validator.json and config.toml. If you had any sentry nodes or full nodes setup before, your node will still try to connect to them, but may fail if they haven't also been upgraded.

Restart

If there are no breaking changes then you can simply restart the node by running:

gaiad start
+ + + + \ No newline at end of file diff --git a/main/hub-tutorials/upgrade-node.html.html b/main/hub-tutorials/upgrade-node.html.html new file mode 100644 index 00000000000..1fe22cdf637 --- /dev/null +++ b/main/hub-tutorials/upgrade-node.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/interchain-security.html b/main/interchain-security.html new file mode 100644 index 00000000000..9ccf1a84f95 --- /dev/null +++ b/main/interchain-security.html @@ -0,0 +1,28 @@ + + + + + +Interchain Security | Cosmos Hub + + + + + + + + + + + + + + +
+

Interchain Security

The Interchain Security feature brings to the Cosmos Hub a shared security model, where the Cosmos Hub validators, also validate consumer chains. This is valuable for consumer chains, as consumer chains can focus on product-market fit, rather than business and operational agreements in bringing together a validator set. As part of this agreement, consumer chains pay for the security by distributing a portion of the consumer chain revenue to Hub token holders.

All potential chains are onboarded as consumer chains, via Hub Governance, with the feedback from the Hub community.

ICS features

Partial Set Security and Power Shaping bring benefits for both the consumer chains and validators:

Top-N consumer chains

Validators inside the top-N percent of voting power are required to validate the consumer chain.

e.g. top-95 means that the 95% of the validators (by voting power) are required to run the consumer chain binary

Opt-in consumer chains

Only validators that opt to running a consumer chains are required to run the chain binary and become eligible for consumer chain rewards distribution.

Parameter customization

Consumer chains gain the ability to customize the validator set to their needs:

  • define allow/denylists
  • set maximum number of validators
  • set validator power cap

Notable consumer chains

Currently the Cosmos Hub has the following two Consumer Chains.

Neutron

Neutron, is a smart contracting platform, that was the first consumer chain onboarded.
+Neutron was onboarded as a consumer chain in May 2023, see Hub proposal 792 for more details.

Stride

Stride, is a liquid staking provider, which aims to unlock liquidity for Cosmos Hub token holders.
+Stride was onboarded as a consumer chain in July 2023, see Hub proposal 799 for more details.

Resources

For more information visit:

+ + + + \ No newline at end of file diff --git a/main/interchain-security.html.html b/main/interchain-security.html.html new file mode 100644 index 00000000000..21fe8fa45c4 --- /dev/null +++ b/main/interchain-security.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/modules.html b/main/modules.html new file mode 100644 index 00000000000..0abd6ec274c --- /dev/null +++ b/main/modules.html @@ -0,0 +1,27 @@ + + + + + +Gaia Modules | Cosmos Hub + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main/modules.html.html b/main/modules.html.html new file mode 100644 index 00000000000..11e8e2a34f0 --- /dev/null +++ b/main/modules.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/modules/lsm-staking.html b/main/modules/lsm-staking.html new file mode 100644 index 00000000000..68a98a6b1e1 --- /dev/null +++ b/main/modules/lsm-staking.html @@ -0,0 +1,28 @@ + + + + + +LSM Staking | Cosmos Hub + + + + + + + + + + + + + + +
+

LSM Staking

The x/staking module used by the Hub includes extensions that enable liquid staking +You can read more about it in our LSM documentation.

What are LSM shares

LSM shares are derivatives of the delegation shares. They are tied to a delegator and a validator pair and they represent the underlying delegation shares. +By issuing LSM shares, the underlying staked ATOM can become "liquid" while still being slashable. The LSM shares are tokens that can be used in various DeFi protocols and transferred between users or between chains via IBC.

LSM shares are not fungible (as they are tied to a delegator/validator pair) and are issued by the Hub directly and thus don't depend on the security of any entity other than the Cosmos Hub itself.

Benefits

By tokenizing your staked ATOM into LSM shares, you maintain the benefits of staking while gaining flexibility in using these shares in DeFi protcols and platforms.

The LSM shares issued by the Hub are powering liquid staking derivatives like stATOM or dATOM and they are the backbone of the Hydro plaftorm.

+ + + + \ No newline at end of file diff --git a/main/modules/lsm-staking.html.html b/main/modules/lsm-staking.html.html new file mode 100644 index 00000000000..4361c5849cb --- /dev/null +++ b/main/modules/lsm-staking.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/modules/metaprotocols.html b/main/modules/metaprotocols.html new file mode 100644 index 00000000000..810854fb6aa --- /dev/null +++ b/main/modules/metaprotocols.html @@ -0,0 +1,26 @@ + + + + + +Metaprotocol | Cosmos Hub + + + + + + + + + + + + + + +
+

Metaprotocol

The x/metaprotocol module adds support for encoding and decoding additional fields attached to transactions.

extension_options and non_critical_extension_options are optional fields that can be used to attach data to valid transactions. The fields are validated by the blockchain, but they are not used in any way. The fields pass validation if they are provided as empty lists ([ ]) or they use a list of ExtensionData types.

The application does not use the attached data but it does ensure that the correct type is provided and that it can be successfully unmarshalled. The attached data will be part of a block.

tip

Txs where extension_options or non_critical_extension_options are populated with a type other than /gaia.metaprotocols.ExtensionData are considered invalid and will be rejected.

Here is an example of a correctly formed non_critical_extension_options field:

{
"@type": "/gaia.metaprotocols.ExtensionData", // must be this exact string
"protocol_id": "some-protocol",
"protocol_version": "1",
"data": "<base64 encoded bytes>"
}

Here is an example of a correctly populated non_critical_extension_options on a bank.MsgSend transaction:

{
"body": {
"messages": [
{
"@type": "/cosmos.bank.v1beta1.MsgSend",
"from_address": "cosmos1ehpqg9sj09037uhe56sqktk30asn47asthyr22",
"to_address": "cosmos1ehpqg9sj09037uhe56sqktk30asn47asthyr22",
"amount": [
{
"denom": "uatom",
"amount": "100"
}
]
}
],
"memo": "memo_smaller_than_512_bytes",
"timeout_height": "0",
"extension_options": [],
"non_critical_extension_options": [
{
"@type": "/gaia.metaprotocols.ExtensionData",
"protocol_id": "some-protocol",
"protocol_version": "1",
"data": "<base64 encoded bytes>"
}
]
},
"auth_info": {
"signer_infos": [],
"fee": {
"amount": [],
"gas_limit": "200000",
"payer": "",
"granter": ""
},
"tip": null
},
"signatures": []
}
+ + + + \ No newline at end of file diff --git a/main/modules/metaprotocols.html.html b/main/modules/metaprotocols.html.html new file mode 100644 index 00000000000..96af9dbd3a0 --- /dev/null +++ b/main/modules/metaprotocols.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/resources.html b/main/resources.html new file mode 100644 index 00000000000..4485c321fca --- /dev/null +++ b/main/resources.html @@ -0,0 +1,26 @@ + + + + + +Resources | Cosmos Hub + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main/resources.html.html b/main/resources.html.html new file mode 100644 index 00000000000..eccd4465cf0 --- /dev/null +++ b/main/resources.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/resources/archives.html b/main/resources/archives.html new file mode 100644 index 00000000000..790382d07cc --- /dev/null +++ b/main/resources/archives.html @@ -0,0 +1,26 @@ + + + + + +Cosmos Hub Archives | Cosmos Hub + + + + + + + + + + + + + + +
+

Cosmos Hub Archives

With each breaking upgrade of the Cosmos Hub, the network is restarted at height 0. During this process, an export of the last state of the previous network is made to produce the genesis state of the new one.

As a result, the blocks of the previous networks are not downloaded by new clients (as they sync from the new genesis state), and may be deleted by existing full-nodes.

In an effort to maintain transparency, the interchain hosts archives of the previous versions of the Cosmos Hub network. These archives can be found here.

If you would like to search explorers for previous hub data, these are some links where you can find the information:

Big Dipper

If you want to make archives available to the community, feel free to open a PR to this file and add them.

+ + + + \ No newline at end of file diff --git a/main/resources/archives.html.html b/main/resources/archives.html.html new file mode 100644 index 00000000000..c05bb3d9a60 --- /dev/null +++ b/main/resources/archives.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/resources/genesis.html b/main/resources/genesis.html new file mode 100644 index 00000000000..0a36b9a0969 --- /dev/null +++ b/main/resources/genesis.html @@ -0,0 +1,26 @@ + + + + + +The Genesis File | Cosmos Hub + + + + + + + + + + + + + + +
+

The Genesis File

This document explains how the genesis file of the Cosmos Hub mainnet is structured. It also explains how you can build a genesis file for your own gaia testnet.

Note that you can generate a default genesis file for your own testnet by running the following command:

gaiad init <moniker> --chain-id <chain-id>

The genesis file is stored in ~/.gaia/config/genesis.toml.

What is a Genesis File

A genesis file is a JSON file which defines the initial state of your blockchain. It can be seen as height 0 of your blockchain. The first block, at height 1, will reference the genesis file as its parent.

The state defined in the genesis file contains all the necessary information, like initial token allocation, genesis time, default parameters, and more. Let us break down this information.

Genesis Time and Chain_id

The genesis_time is defined at the top of the genesis file. It is a UTC timestamp that specifies when the blockchain is due to start. At this time, genesis validators are supposed to come online and start participating in the consensus process. The blockchain starts when more than 2/3rd of the genesis validators (weighted by voting power) are online.

"genesis_time": "2019-03-13T17:00:00.000000000Z",

The chain_id is a unique identifier for your chain. It helps differentiate between different chains using the same version of the software.

"chain_id": "cosmoshub-2",

Consensus Parameters

Next, the genesis file defines consensus parameters. Consensus parameters regroup all the parameters that are related to the consensus layer, which is Tendermint in the case of gaia. Let us look at these parameters:

  • block
    • max_bytes: Maximum number of bytes per block.
    • max_gas: Gas limit per block. Each transaction included in the block will consume some gas. The total gas used by transactions included in a block cannot exceed this limit.
  • evidence
    • max_age: An evidence is a proof that a validator signed two different blocks at the same height (and round). This is an explicitly malicious behaviour that is punished at the state-machine level. The max_age defines the maximum number of blocks after which an evidence is not valid anymore.
  • validator
    • pub_key_types: The types of pubkey (ed25519, secp256k1, ...) that are accepted for validators. Currently only ed25519 is accepted.
"consensus_params": {
"block_size": {
"max_bytes": "150000",
"max_gas": "1500000"
},
"evidence": {
"max_age": "1000000"
},
"validator": {
"pub_key_types": [
"ed25519"
]
}
},

Application State

The application state defines the initial state of the state-machine.

Genesis Accounts

In this section, the initial allocation of tokens is defined. It is possible to add accounts manually by directly editing the genesis file, but it is also possible to use the following command:

// Example: gaiad add-genesis-account cosmos1qs8tnw2t8l6amtzvdemnnsq9dzk0ag0z37gh3h 10000000uatom

gaiad genesis add-genesis-account <account-address> <amount><denom>

This command creates an item in the accounts list, under the app_state section.

"accounts": [
{
"address": "cosmos1qs8tnw2t8l6amtzvdemnnsq9dzk0ag0z37gh3h",
"coins": [
{
"denom": "uatom",
"amount": "10000000"
}
],
"sequence_number": "0",
"account_number": "0",
"original_vesting": [
{
"denom": "uatom",
"amount": "26306000000"
}
],
"delegated_free": null,
"delegated_vesting": null,
"start_time": "0",
"end_time": "10000"
}
]

Let us break down the parameters:

  • sequence_number: This number is used to count the number of transactions sent by this account. It is incremented each time a transaction is included in a block, and used to prevent replay attacks. Initial value is 0.
  • account_number: Unique identifier for the account. It is generated the first time a transaction including this account is included in a block.
  • original_vesting: Vesting is natively supported by gaia. You can define an amount of token owned by the account that needs to be vested for a period of time before they can be transferred. Vested tokens can be delegated. Default value is null.
  • delegated_free: Amount of delegated tokens that can be transferred after they've been vested. Most of the time, will be null in genesis.
  • delegated_vesting: Amount of delegated tokens that are still vesting. Most of the time, will be null in genesis.
  • start_time: Timestamp at which the vesting period starts. 0 most of the time in genesis.
  • end_time: Timestamp at which the vesting period ends. 0 if no vesting for this account.

Bank

The bank module handles tokens. The only parameter that needs to be defined in this section is whether transfers are enabled at genesis or not.

"bank": {
"send_enabled": false
}

Staking

The staking module handles the bulk of the Proof-of-Stake logic of the state-machine. This section should look like the following:

"staking": {
"pool": {
"not_bonded_tokens": "10000000",
"bonded_tokens": "0"
},
"params": {
"unbonding_time": "1814400000000000",
"max_validators": 100,
"max_entries": 7,
"bond_denom": "uatom"
},
"last_total_power": "0",
"last_validator_powers": null,
"validators": null,
"bonds": null,
"unbonding_delegations": null,
"redelegations": null,
"exported": false
}

Let us break down the parameters:

  • pool
    • not_bonded_tokens: Defines the amount of tokens not bonded (i.e. delegated) in genesis. Generally, it equals the total supply of the staking token (uatom in this example).
    • bonded_tokens: Amount of bonded tokens in genesis. Generally 0.
  • params
    • unbonding_time: Time in nanosecond it takes for tokens to complete unbonding.
    • max_validators: Maximum number of active validators.
    • max_entries: Maximum unbonding delegations and redelegations between a particular pair of delegator / validator.
    • bond_denom: Denomination of the staking token.
  • last_total_power: Total amount of voting power. Generally 0 in genesis (except if genesis was generated using a previous state).
  • last_validator_powers: Power of each validator in last known state. Generally null in genesis (except if genesis was generated using a previous state).
  • validators: List of last known validators. Generally null in genesis (except if genesis was generated using a previous state).
  • bonds: List of last known delegation. Generally null in genesis (except if genesis was generated using a previous state).
  • unbonding_delegations: List of last known unbonding delegations. Generally null in genesis (except if genesis was generated using a previous state).
  • redelegations: List of last known redelegations. Generally null in genesis (except if genesis was generated using a previous state).
  • exported: Whether this genesis was generated using the export of a previous state.

Mint

The mint module governs the logic of inflating the supply of token. The mint section in the genesis file looks like the following:

"mint": {
"minter": {
"inflation": "0.070000000000000000",
"annual_provisions": "0.000000000000000000"
},
"params": {
"mint_denom": "uatom",
"inflation_rate_change": "0.130000000000000000",
"inflation_max": "0.200000000000000000",
"inflation_min": "0.070000000000000000",
"goal_bonded": "0.670000000000000000",
"blocks_per_year": "6311520"
}
}

Let us break down the parameters:

  • minter
    • inflation: Initial yearly percentage of increase in the total supply of staking token, compounded weekly. A 0.070000000000000000 value means the target is 7% yearly inflation, compounded weekly.
    • annual_provisions: Calculated each block. Initialize at 0.000000000000000000.
  • params
    • mint_denom: Denom of the staking token that is inflated.
    • inflation_rate_change: Max yearly change in inflation.
    • inflation_max: Maximum level of inflation.
    • inflation_min: Minimum level of inflation.
    • goal_bonded: Percentage of the total supply that is targeted to be bonded. If the percentage of bonded staking tokens is below this target, the inflation increases (following inflation_rate_change) until it reaches inflation_max. If the percentage of bonded staking tokens is above this target, the inflation decreases (following inflation_rate_change) until it reaches inflation_min.
    • blocks_per_year: Estimation of the amount of blocks per year. Used to compute the block reward coming from inflated staking token (called block provisions).

Distribution

The distribution module handles the logic of distribution block provisions and fees to validators and delegators. The distribution section in the genesis file looks like the following:

    "distribution": {
"fee_pool": {
"community_pool": null
},
"community_tax": "0.020000000000000000",
"base_proposer_reward": "0.010000000000000000",
"bonus_proposer_reward": "0.040000000000000000",
"withdraw_addr_enabled": false,
"delegator_withdraw_infos": null,
"previous_proposer": "",
"outstanding_rewards": null,
"validator_accumulated_commissions": null,
"validator_historical_rewards": null,
"validator_current_rewards": null,
"delegator_starting_infos": null,
"validator_slash_events": null
}

Let us break down the parameters:

  • fee_pool
    • community_pool: The community pool is a pool of tokens that can be used to pay for bounties. It is allocated via governance proposals. Generally null in genesis.
  • community_tax: The tax percentage on fees and block rewards that goes to the community pool.
  • base_proposer_reward: Base bonus on transaction fees collected in a valid block that goes to the proposer of block. If value is 0.010000000000000000, 1% of the fees go to the proposer.
  • bonus_proposer_reward: Max bonus on transaction fees collected in a valid block that goes to the proposer of block. The bonus depends on the number of precommits the proposer includes. If the proposer includes 2/3rd precommits weighted by voting power (minimum for the block to be valid), they get a bonus of base_proposer_reward. This bonus increases linearly up to bonus_proposer_reward if the proposer includes 100% of precommits.
  • withdraw_addr_enabled: If true, delegators can set a different address to withdraw their rewards. Set to false if you want to disable transfers at genesis, as it can be used as a way to get around the restriction.
  • delegator_withdraw_infos: List of delegators withdraw address. Generally null if genesis was not exported from previous state.
  • previous_proposer: Proposer of the previous block. Set to "" if genesis was not exported from previous state.
  • outstanding_rewards: Outstanding (un-withdrawn) rewards. Set to null if genesis was not exported from previous state.
  • validator_accumulated_commission: Outstanding (un-withdrawn) commission of validators. Set to null if genesis was not exported from previous state.
  • validator_historical_rewards: Set of information related to the historical rewards of validators and used by the distribution module for various computation. Set to null if genesis was not exported from previous state.
  • validators_current_rewards: Set of information related to the current rewards of validators and used by the distribution module for various computation. Set to null if genesis was not exported from previous state.
  • delegator_starting_infos: Tracks the previous validator period, the delegation's amount of staking token, and the creation height (to check later on if any slashes have occurred). Set to null if genesis was not exported from previous state.
  • validator_slash_events: Set of information related to the past slashing of validators. Set to null if genesis was not exported from previous state.

Governance

The gov module handles all governance-related transactions. The initial state of the gov section looks like the following:

"gov": {
"starting_proposal_id": "1",
"deposits": null,
"votes": null,
"proposals": null,
"deposit_params": {
"min_deposit": [
{
"denom": "uatom",
"amount": "512000000"
}
],
"max_deposit_period": "1209600000000000"
},
"voting_params": {
"voting_period": "1209600000000000"
},
"tally_params": {
"quorum": "0.4",
"threshold": "0.5",
"veto": "0.334",
"governance_penalty": "0.0"
}
}

Let us break down the parameters:

  • starting_proposal_id: This parameter defines the ID of the first proposal. Each proposal is identified by a unique ID.
  • deposits: List of deposits for each proposal ID. Set to null if genesis was not exported from previous state.
  • votes: List of votes for each proposal ID. Set to null if genesis was not exported from previous state.
  • proposals: List of proposals for each proposal ID: Set to null if genesis was not exported from previous state.
  • deposit_params
    • min_deposit: The minimum deposit required for the proposal to enter Voting Period. If multiple denoms are provided, the OR operator applies.
    • max_deposit_period: The maximum period (in nanoseconds) after which it is not possible to deposit on the proposal anymore.
  • voting_params
    • voting_period: Length of the voting period in nanoseconds.
  • tally_params
    • quorum: Minimum percentage of bonded staking tokens that needs to vote for the result to be valid.
    • threshold: Minimum percentage of votes that need to be YES for the result to be valid.
    • veto: Maximum percentage NO_WITH_VETO votes for the result to be valid.
    • governance_penalty: Penalty for validators that do not vote on a given proposal.

Slashing

The slashing module handles the logic to slash delegators if their validator misbehaves. The slashing section in genesis looks as follows:

"slashing": {
"params": {
"max_evidence_age": "1814400000000000",
"signed_blocks_window": "10000",
"min_signed_per_window": "0.050000000000000000",
"downtime_jail_duration": "600000000000",
"slash_fraction_double_sign": "0.050000000000000000",
"slash_fraction_downtime": "0.000100000000000000"
},
"signing_infos": {},
"missed_blocks": {}
}

Let us break down the parameters:

  • params
    • max_evidence_age: Maximum age of the evidence in nanoseconds.
    • signed_blocks_window: Moving window of blocks to figure out offline validators.
    • min_signed_per_window: Minimum percentage of precommitsthat must be present in the block window for the validator to be considered online.
    • downtime_jail_duration: Duration in nanoseconds for which a validator is jailed after they get slashed for downtime.
    • slash_fraction_double_sign: Percentage of delegators bonded stake slashed when their validator double signs.
    • slash_fraction_downtime: Percentage of delegators bonded stake slashed when their validator is down.
  • signing_infos: Various infos per validator needed by the slashing module. Set to {} if genesis was not exported from previous state.
  • missed_blocks: Various infos related to missed blocks needed by the slashing module. Set to {} if genesis was not exported from previous state.

Genesis Transactions

By default, the genesis file do not contain any gentxs. A gentx is a transaction that bonds staking token present in the genesis file under accounts to a validator, essentially creating a validator at genesis. The chain will start as soon as more than 2/3rds of the validators (weighted by voting power) that are the recipient of a valid gentx come online after genesis_time.

A gentx can be added manually to the genesis file, or via the following command:

gaiad collect-gentxs

This command will add all the gentxs stored in ~/.gaia/config/gentx to the genesis file. In order to create a genesis transaction, click here.

+ + + + \ No newline at end of file diff --git a/main/resources/genesis.html.html b/main/resources/genesis.html.html new file mode 100644 index 00000000000..2848ca8c028 --- /dev/null +++ b/main/resources/genesis.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/resources/hd-wallets.html b/main/resources/hd-wallets.html new file mode 100644 index 00000000000..140fe04baf3 --- /dev/null +++ b/main/resources/hd-wallets.html @@ -0,0 +1,26 @@ + + + + + +HD Wallets | Cosmos Hub + + + + + + + + + + + + + + +
+

HD Wallets

Accounts in Cosmos are Hierarchical Deterministic (HD) Wallets. Originally specified in Bitcoin's BIP32, HD wallets are a special kind of wallet that let users derive any number of accounts from a single seed. To understand what that means, let us first define some terminology:

  • Wallet: Set of accounts obtained from a given seed.
  • Account: A pair of public key/private key.
  • Private Key: A private key is a secret piece of information used to sign messages. In the blockchain context, a private key identifies the owner of an account. The private key of a user should never be revealed to others.
  • Public Key: A public key is a piece of information obtained by applying a one-way mathematical function on a private key. From it, an address can be derived. A private key cannot be found from a public key.
  • Address: An address is a public string with a human-readable prefix that identifies an account. It is obtained by applying mathematical transformations to a public key.
  • Digital Signature: A digital signature is a piece of cryptographic information that proves the owner of a given private key approved of a given message without revealing the private key.
  • Seed: Same as Mnemonic.
  • Mnemonic: A mnemonic is a sequence of words that is used as seed to derive private keys. The mnemonic is at the core of each wallet. NEVER LOSE YOUR MNEMONIC. WRITE IT DOWN ON A PIECE OF PAPER AND STORE IT SOMEWHERE SAFE. IF YOU LOSE IT, THERE IS NO WAY TO RETRIEVE IT. IF SOMEONE GAINS ACCESS TO IT, THEY GAIN ACCESS TO ALL THE ASSOCIATED ACCOUNTS.

At the core of a HD wallet, there is a seed. From this seed, users can deterministically generate accounts. To generate an account from a seed, one-way mathematical transformations are applied. To decide which account to generate, the user specifies a path, generally an integer (0, 1, 2, ...).

By specifying path to be 0 for example, the Wallet will generate Private Key 0 from the seed. Then, Public Key 0 can be generated from Private Key 0. Finally, Address 0 can be generated from Public Key 0. All these steps are one way only, meaning the Public Key cannot be found from the Address, the Private Key cannot be found from the Public Key, ...

     Account 0                         Account 1                         Account 2

+------------------+ +------------------+ +------------------+
| | | | | |
| Address 0 | | Address 1 | | Address 2 |
| ^ | | ^ | | ^ |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| + | | + | | + |
| Public key 0 | | Public key 1 | | Public key 2 |
| ^ | | ^ | | ^ |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| + | | + | | + |
| Private key 0 | | Private key 1 | | Private key 2 |
| ^ | | ^ | | ^ |
+------------------+ +------------------+ +------------------+
| | |
| | |
| | |
+--------------------------------------------------------------------+
|
|
+---------+---------+
| |
| Mnemonic (Seed) |
| |
+-------------------+

The process of derivating accounts from the seed is deterministic. This means that given the same path, the derived private key will always be the same.

The funds stored in an account are controlled by the private key. This private key is generated using a one-way function from the mnemonic. If you lose the private key, you can retrieve it using the mnemonic. However, if you lose the mnemonic, you will lose access to all the derived private keys. Likewise, if someone gains access to your mnemonic, they gain access to all the associated accounts.

danger

Do not lose or share your 24 words with anyone. To prevent theft or loss of funds, it is best to keep multiple copies of your mnemonic stored in safe, secure places. If someone is able to gain access to your mnemonic, they will fully control the accounts associated with them.

+ + + + \ No newline at end of file diff --git a/main/resources/hd-wallets.html.html b/main/resources/hd-wallets.html.html new file mode 100644 index 00000000000..4ff662aa71a --- /dev/null +++ b/main/resources/hd-wallets.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/resources/ledger.html b/main/resources/ledger.html new file mode 100644 index 00000000000..fa159495399 --- /dev/null +++ b/main/resources/ledger.html @@ -0,0 +1,28 @@ + + + + + +Ledger Nano Support | Cosmos Hub + + + + + + + + + + + + + + +
+

Ledger Nano Support

Using a hardware wallet to store your keys greatly improves the security of your crypto assets. The Ledger device acts as an enclave of the seed and private keys, and the process of signing transactions takes place within it. No private information ever leaves the Ledger device. The following is a short tutorial on using the Cosmos Ledger app with the Gaia CLI or the Keplr wallet extension.

At the core of a Ledger device there is a mnemonic seed phrase that is used to generate private keys. This phrase is generated when you initialize your Ledger. The mnemonic is compatible with Cosmos and can be used to seed new accounts.

danger

Do not lose or share your 24 words with anyone. To prevent theft or loss of funds, it is best to keep multiple copies of your mnemonic stored in safe, secure places. If someone is able to gain access to your mnemonic, they will fully control the accounts associated with them.

Install the Cosmos Ledger application

Installing the Cosmos application on your ledger device is required before you can use either Keplr or gaiad. To do so, you need to:

  1. Install Ledger Live on your machine.
  2. Using Ledger Live, update your Ledger Nano S with the latest firmware.
  3. On the Ledger Live application, navigate to the Manager menu . +manager
  4. Connect your Ledger Nano device and allow Ledger Manager from it.
  5. On the Ledger Live application, Search for Cosmos. +search
  6. Install the Cosmos application by clicking on Install.
tip

To see the Cosmos application when you search for it, you might need to activate the Developer Mode, located in the Experimental features tab of the Ledger Live application.

Devmode

Keplr + Ledger Nano

Note: You need to install the Cosmos app on your Ledger Nano before following this section

  1. Connect your Ledger device to your computer, unlock it with the PIN and open the Cosmos app.
  2. Install the Keplr browser extension.
  3. Click on the Keplr extension icon and select Import Ledger and choose an account name and password.
  4. Make sure your Ledger device is unlocked and has the Cosmos app open and then follow the instructions on the Keplr pop-up.

That's it! You can now use Keplr with your Ledger Nano S. You can use the Keplr web app to get a more detailed overview of your Cosmos account.

Note: Each time you will send a transaction, you will need to confirm it on your Ledger device. Indication will be prompted from the Keplr interface

(Optional) Confirm your address

You can double check that Keplr is displaying the correct address directly on your Ledger Nano device. To do so:

  1. Connect your Ledger to your computer and open the Cosmos application on the device.
  2. Once the Cosmos app is open, click on the right button to access the Show Address option.
  3. Click on both button, then select Account 0 and Index 0.

You should now see the same address that is displayed on the Keplr extension.

To learn more about using Keplr, we suggest you have a look at their support documentation.

You can also have a look at the Ledger support page for more details.

Gaia CLI + Ledger Nano

Note: You need to install the Cosmos app on your Ledger Nano before following this section

The tool used to generate addresses and transactions on the Cosmos Hub network is gaiad. Here is how to get started. If using a CLI tool is unfamiliar to you, scroll down and follow instructions for using the Keplr wallet instead.

Before you Begin

Verify that gaiad is installed correctly with the following command

gaiad version --long

➜ cosmos-sdk: 0.34.3
git commit: 67ab0b1e1d1e5b898c8cbdede35ad5196dba01b2
vendor hash: 0341b356ad7168074391ca7507f40b050e667722
build tags: netgo ledger
go version go1.11.5 darwin/amd64

Add your Ledger key

  • Connect and unlock your Ledger device.
  • Open the Cosmos app on your Ledger.
  • Create an account in gaiad from your ledger key.
tip

Be sure to change the keyName parameter to be a meaningful name. The ledger flag tells gaiad to use your Ledger to seed the account.

gaiad keys add <keyName> --ledger

➜ NAME: TYPE: ADDRESS: PUBKEY:
<keyName> ledger cosmos1... cosmospub1...

Cosmos uses HD Wallets. This means you can setup many accounts using the same Ledger seed. To create another account from your Ledger device, run (change the integer i to some value >= 0 to choose the account for HD derivation):

gaiad keys add <secondKeyName> --ledger --account <i>

Confirm your address

Run this command to display your address on the device. Use the keyName you gave your ledger key. The -d flag is supported in version 1.5.0 and higher.

gaiad keys show <keyName> -d

Confirm that the address displayed on the device matches that displayed when you added the key.

Connect to a full node

Next, you need to configure gaiad with the URL of a Cosmos full node and the appropriate chain_id. In this example we connect to the public load balanced full node operated by Chorus One on the cosmoshub-2 chain. But you can point your gaiad to any Cosmos full node. Be sure that the chain-id is set to the same chain as the full node.

gaiad config node https://cosmos.chorus.one:26657
gaiad config chain_id cosmoshub-2

Test your connection with a query such as:

gaiad query staking validators
tip

To run your own full node locally read more here..

Sign a transaction

You are now ready to start signing and sending transactions. Send a transaction with gaiad using the tx send command.

gaiad tx bank send --help # to see all available options.
tip

Be sure to unlock your device with the PIN and open the Cosmos app before trying to run these commands

Use the keyName you set for your Ledger key and gaia will connect with the Cosmos Ledger app to then sign your transaction.

gaiad tx bank send <keyName> <destinationAddress> <amount><denomination>

When prompted with confirm transaction before signing, Answer Y.

Next you will be prompted to review and approve the transaction on your Ledger device. Be sure to inspect the transaction JSON displayed on the screen. You can scroll through each field and each message. Scroll down to read more about the data fields of a standard transaction object.

Now, you are all set to start sending transactions on the network.

Receive funds

To receive funds to the Cosmos account on your Ledger device, retrieve the address for your Ledger account (the ones with TYPE ledger) with this command:

gaiad keys list

➜ NAME: TYPE: ADDRESS: PUBKEY:
<keyName> ledger cosmos1... cosmospub1...

Further documentation

Not sure what gaiad can do? Simply run the command without arguments to output documentation for the commands in supports.

tip

The gaiad help commands are nested. So $ gaiad will output docs for the top level commands (status, config, query, and tx). You can access documentation for sub commands with further help commands.

For example, to print the query commands:

gaiad query --help

Or to print the tx (transaction) commands:

gaiad tx --help

The Cosmos Standard Transaction

Transactions in Cosmos embed the Standard Transaction type from the Cosmos SDK. The Ledger device displays a serialized JSON representation of this object for you to review before signing the transaction. Here are the fields and what they mean:

  • chain-id: The chain to which you are broadcasting the tx, such as the gaia-13003 testnet or cosmoshub-2: mainnet.
  • account_number: The global id of the sending account assigned when the account receives funds for the first time.
  • sequence: The nonce for this account, incremented with each transaction.
  • fee: JSON object describing the transaction fee, its gas amount and coin denomination
  • memo: optional text field used in various ways to tag transactions.
  • msgs_<index>/<field>: The array of messages included in the transaction. Double click to drill down into nested fields of the JSON.

Support

For further support, start by looking over the posts in our forum

Feel welcome to reach out in our Telegram channel to ask for help.

Here are a few relevant and helpful tutorials from the wonderful Cosmos community:

+ + + + \ No newline at end of file diff --git a/main/resources/ledger.html.html b/main/resources/ledger.html.html new file mode 100644 index 00000000000..e9134f6f31a --- /dev/null +++ b/main/resources/ledger.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/resources/reproducible-builds.html b/main/resources/reproducible-builds.html new file mode 100644 index 00000000000..c19bcf66959 --- /dev/null +++ b/main/resources/reproducible-builds.html @@ -0,0 +1,28 @@ + + + + + +Building Gaia Deterministically | Cosmos Hub + + + + + + + + + + + + + + +
+

Building Gaia Deterministically

The Tendermint rbuilder Docker image provides a deterministic build environment that is used to build Cosmos SDK applications. It provides a way to be reasonably sure that the executables are really built from the git source. It also makes sure that the same, tested dependencies are used and statically built into the executable.

Prerequisites

Make sure you have Docker installed on your system.

All the following instructions have been tested on Ubuntu 18.04.2 LTS with docker 20.10.2.

Build

Clone gaia:

git clone https://github.com/cosmos/gaia.git

Checkout the commit, branch, or release tag you want to build:

cd gaia/
git checkout v4.2.1

The buildsystem supports and produces binaries for the following architectures:

  • darwin/amd64
  • linux/amd64
  • linux/arm64
  • windows/amd64

Run the following command to launch a build for all supported architectures:

make distclean build-reproducible

The build system generates both the binaries and deterministic build report in the artifacts directory. +The artifacts/build_report file contains the list of the build artifacts and their respective checksums, and can be used to verify +build sanity. An example of its contents follows:

App: gaiad
Version: v4.2.1
Commit: dbd8a6fb522c571debf958837f9113c56d418f6b
Files:
29d219b0b120b3188bd7cd7249fc96b9 gaiad-v4.2.1-darwin-amd64
80338d9f0e55ea8f6c93f2ec7d4e18d6 gaiad-v4.2.1-linux-amd64
9bc77a512acca673ca1769ae67b4d6c7 gaiad-v4.2.1-linux-arm64
c84387860f52178e2bffee08897564bb gaiad-v4.2.1-windows-amd64.exe
c25cca8ccceec06a6fabae90f671fab1 gaiad-v4.2.1.tar.gz
Checksums-Sha256:
05e5b9064bac4e71f0162c4c3c3bff55def22ca016d34205a5520fef89fd2776 gaiad-v4.2.1-darwin-amd64
ccda422cbda29c723aaf27653bcf0f6412e138eec33fba2b49de131f9ffbe2d2 gaiad-v4.2.1-linux-amd64
95f89e8213cb758d12e1b0b631285938de822d04d2e25f399e99c0b798173cfd gaiad-v4.2.1-linux-arm64
7ef98f0041f1573f0a8601abad4a14b1c163f47481c7ba1954fd81ed423a6408 gaiad-v4.2.1-windows-amd64.exe
422883ba43c96a6ea5ef9512d39321dd1356633c6a9505517b9c651788df4a7f gaiad-v4.2.1.tar.gz
+ + + + \ No newline at end of file diff --git a/main/resources/reproducible-builds.html.html b/main/resources/reproducible-builds.html.html new file mode 100644 index 00000000000..e1c19742e0e --- /dev/null +++ b/main/resources/reproducible-builds.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/resources/service-providers.html b/main/resources/service-providers.html new file mode 100644 index 00000000000..94e17f566f5 --- /dev/null +++ b/main/resources/service-providers.html @@ -0,0 +1,31 @@ + + + + + +Service Providers | Cosmos Hub + + + + + + + + + + + + + + +
+

Service Providers

'Service Providers' are defined as entities that provide services for end-users that involve some form of interaction with the Cosmos Hub. More specifically, this document is focused on interactions with tokens.

Service Providers are expected to act as trusted points of contact to the blockchain for their end-users. This Service Providers section does not apply to wallet builders that want to provide Light Client functionalities.

This document describes:

Connection Options

There are four main technologies to consider to connect to the Cosmos Hub:

  • Full Nodes: Interact with the blockchain.
  • REST Server: Serves for HTTP calls.
  • REST API: Use available endpoints for the REST Server.
  • GRPC: Connect to the Cosmos Hub using gRPC.

Running a Full Node

What is a Full Node?

A Full Node is a network node that syncs up with the state of the blockchain. It provides blockchain data to others by using RESTful APIs, a replica of the database by exposing data with interfaces. A Full Node keeps in syncs with the rest of the blockchain nodes and stores the state on disk. If the full node does not have the queried block on disk the full node can go find the blockchain where the queried data lives.

Installation and Configuration

This section describes the steps to run and interact with a full node for the Cosmos Hub.

First, you need to install the software.

Consider running your own Cosmos Hub Full Node.

Command-Line Interface

The command-line interface (CLI) is the most powerful tool to access the Cosmos Hub and use gaia. +To use the CLI, you must install the latest version of gaia on your machine.

Compare your version with the latest release version

gaiad version --long

Available Commands

All available CLI commands are shown when you run the gaiad command:

gaiad
Stargate Cosmos Hub App

Usage:
gaiad [command]

Available Commands:


add-genesis-account Add a genesis account to genesis.json
collect-gentxs Collect genesis txs and output a genesis.json file
debug Tool for helping with debugging your application
export Export state to JSON
gentx Generate a genesis tx carrying a self delegation
help Help about any command
init Initialize private validator, p2p, genesis, and application configuration files
keys Manage your application's keys
migrate Migrate genesis to a specified target version
query Querying subcommands
start Run the full node
status Query remote node for status
tendermint Tendermint subcommands
testnet Initialize files for a simapp testnet
tx Transactions subcommands
unsafe-reset-all Resets the blockchain database, removes address book files, and resets data/priv_validator_state.json to the genesis state
validate-genesis validates the genesis file at the default location or at the location passed as an arg
version Print the application binary version information

Flags:
-h, --help help for gaiad
--home string directory for config and data (default "/Users/tobias/.gaia")
--log_format string The logging format (json|plain) (default "plain")
--log_level string The logging level (trace|debug|info|warn|error|fatal|panic) (default "info")
--trace print out full stack trace on errors

Use "gaiad [command] --help" for more information about a command.

For each displayed command, you can use the --help flag to get further information.

gaiad query --help
Usage:
gaiad query [flags]
gaiad query [command]

Aliases:
query, q

Available Commands:
account Query for account by address
auth Querying commands for the auth module
bank Querying commands for the bank module
block Get verified data for a the block at given height
distribution Querying commands for the distribution module
evidence Query for evidence by hash or for all (paginated) submitted evidence
gov Querying commands for the governance module
ibc Querying commands for the IBC module
ibc-transfer IBC fungible token transfer query subcommands
mint Querying commands for the minting module
params Querying commands for the params module
slashing Querying commands for the slashing module
staking Querying commands for the staking module
tendermint-validator-set Get the full tendermint validator set at given height
tx Query for a transaction by hash in a committed block
txs Query for paginated transactions that match a set of events
upgrade Querying commands for the upgrade module

Flags:
--chain-id string The network chain ID
-h, --help help for query

Global Flags:
--home string directory for config and data (default "/Users/tobias/.gaia")
--log_format string The logging format (json|plain) (default "plain")
--log_level string The logging level (trace|debug|info|warn|error|fatal|panic) (default "info")
--trace print out full stack trace on errors

Use "gaiad query [command] --help" for more information about a command.

Remote Access to gaiad

When choosing to remote access a Full Node and gaiad, you need a Full Node running and gaia installed on your local machine.

gaiad is the tool that enables you to interact with the node that runs on the Cosmos Hub network, whether you run it yourself or not.

To set up gaiad on a local machine and connect to an existing full node, use the following command:

gaiad config <flag> <value>

First, set up the address of the full node you want to connect to:

gaiad config node <host>:<port

// example: gaiad config node https://77.87.106.33:26657 (note: this is a placeholder)

If you run your own full node locally, use tcp://localhost:26657 as the address.

Finally, set the chain-id of the blockchain you want to interact with:

gaiad config chain-id cosmoshub-4

Next, learn to use CLI commands to interact with the full node. +You can run these commands as remote control or when you are running it on your local machine.

Create a Key Pair

The default key is secp256k1 elliptic curve. Use the gaiad keys command to list the keys and generate a new key.

gaiad keys add <your_key_name>

You will be asked to create a password (at least 8 characters) for this key-pair. This will return the information listed below:

  • NAME: Name of your key
  • TYPE: Type of your key, always local.
  • ADDRESS: Your address. Used to receive funds.
  • PUBKEY: Your public key. Useful for validators.
  • MNEMONIC: 24-word phrase. Save this mnemonic somewhere safe. This phrase is required to recover your private key in case you forget the password. The mnemonic is displayed at the end of the output.

You can see all available keys by typing:

gaiad keys list

Use the --recover flag to add a key that imports a mnemonic to your keyring.

gaiad keys add <your_key_name> --recover

Check your Account

You can view your account by using the query account command.

gaiad query account <YOUR_ADDRESS>

It will display your account type, account number, public key and current account sequence.

'@type': /cosmos.auth.v1beta1.BaseAccount
account_number: "xxxx"
address: cosmosxxxx
pub_key:
'@type': /cosmos.crypto.secp256k1.PubKey
key: xxx
sequence: "x"

Check your Balance

Query the account balance with the command:

gaiad query bank balances <YOUR_ADDRESS>

The response contains keys balances and pagination. +Each balances entry contains an amount held, connected to a denom identifier. +The typical $ATOM token is identified by the denom uatom. Where 1 uatom is 0.000001 ATOM.

balances:
- amount: "12345678"
denom: uatom
pagination:
next_key: null
total: "0"

When you query an account that has not received any token yet, the balances entry is shown as an empty array.

balances: []
pagination:
next_key: null
total: "0"

Send Coins Using the CLI

To send coins using the CLI:

gaiad tx bank send [from_key_or_address] [to_address] [amount] [flags]

Parameters:

  • <from_key_or_address>: Key name or address of sending account.
  • <to_address>: Address of the recipient.
  • <amount>: This parameter accepts the format <value|coinName>, such as 1000000uatom.

Flags:

  • --chain-id: This flag allows you to specify the id of the chain. There are different ids for different testnet chains and mainnet chains.
  • --gas-prices: This flag allows you to specify the gas prices you pay for the transaction. The format is used as 0.0025uatom

REST API

The REST API documents list all the available endpoints that you can use to interact +with your full node. Learn how to enable the REST API on your full node.

Listen for Incoming Transactions

The recommended way to listen for incoming transactions is to periodically query the blockchain by using the following HTTP endpoint:

/cosmos/bank/v1beta1/balances/{address}

+ + + + \ No newline at end of file diff --git a/main/resources/service-providers.html.html b/main/resources/service-providers.html.html new file mode 100644 index 00000000000..a9c7fcd9466 --- /dev/null +++ b/main/resources/service-providers.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/validators.html b/main/validators.html new file mode 100644 index 00000000000..830b54afcf9 --- /dev/null +++ b/main/validators.html @@ -0,0 +1,26 @@ + + + + + +Validators | Cosmos Hub + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main/validators.html.html b/main/validators.html.html new file mode 100644 index 00000000000..a6009260b1e --- /dev/null +++ b/main/validators.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/validators/kms.html b/main/validators/kms.html new file mode 100644 index 00000000000..1870ed8b02f --- /dev/null +++ b/main/validators/kms.html @@ -0,0 +1,26 @@ + + + + + +KMS - Key Management System | Cosmos Hub + + + + + + + + + + + + + + +
+

KMS - Key Management System

Tendermint KMS is a key management service that allows separating key management from Tendermint nodes. In addition it provides other advantages such as:

  • Improved security and risk management policies
  • Unified API and support for various HSM (hardware security modules)
  • Double signing protection (software or hardware based)

It is recommended that the KMS service runs in a separate physical hosts.

Building

Detailed build instructions can be found here.

tip

When compiling the KMS, ensure you have enabled the applicable features:

BackendRecommended Command line
YubiHSMcargo build --features yubihsm
Ledger+Tendermint Appcargo build --features ledgertm

Configuration

A KMS can be configured in various ways:

Using a YubiHSM

Detailed information on how to setup a KMS with YubiHSM2 can be found here

Using a Ledger device running the Tendermint app

Detailed information on how to setup a KMS with Ledger Tendermint App can be found here

+ + + + \ No newline at end of file diff --git a/main/validators/kms.html.html b/main/validators/kms.html.html new file mode 100644 index 00000000000..c74d7c84402 --- /dev/null +++ b/main/validators/kms.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/validators/kms/kms_ledger.html b/main/validators/kms/kms_ledger.html new file mode 100644 index 00000000000..03b4415e04e --- /dev/null +++ b/main/validators/kms/kms_ledger.html @@ -0,0 +1,26 @@ + + + + + +Setting up Tendermint KMS + Ledger | Cosmos Hub + + + + + + + + + + + + + + +
+

Setting up Tendermint KMS + Ledger

danger

The following instructions are a brief walkthrough and not a comprehensive guideline. You should consider and research more about the security implications of activating an external KMS.

danger

KMS and Ledger Tendermint app are currently work in progress. Details may vary. Use with care under your own risk.

Tendermint Validator app (for Ledger devices)

You should be able to find the Tendermint app in Ledger Live.

Note: at the moment, you might need to enable developer mode in Ledger Live settings

KMS configuration

In this section, we will configure a KMS to use a Ledger device running the Tendermint Validator App.

Config file

You can find other configuration examples here

  • Create a ~/.tmkms/tmkms.toml file with the following content (use an adequate chain_id)
# Example KMS configuration file
[[validator]]
addr = "tcp://localhost:26658" # or "unix:///path/to/socket"
chain_id = "gaia-11001"
reconnect = true # true is the default
secret_key = "~/.tmkms/secret_connection.key"

[[providers.ledgertm]]
chain_ids = ["gaia-11001"]
  • Edit addr to point to your gaiad instance.
  • Adjust chain-id to match your .gaia/config/config.toml settings.
  • provider.ledgertm has no additional parameters at the moment, however, it is important that you keep that header to enable the feature.

Plug your Ledger device and open the Tendermint validator app.

Generate secret key

Now you need to generate secret_key:

tmkms keygen ~/.tmkms/secret_connection.key

Retrieve validator key

The last step is to retrieve the validator key that you will use in gaiad.

Start the KMS:

tmkms start -c ~/.tmkms/tmkms.toml

The output should look similar to:

07:28:24 [INFO] tmkms 0.3.0 starting up...
07:28:24 [INFO] [keyring:ledgertm:ledgertm] added validator key cosmosvalconspub1zcjduepqy53m39prgp9dz3nz96kaav3el5e0th8ltwcf8cpavqdvpxgr5slsd6wz6f
07:28:24 [INFO] KMS node ID: 1BC12314E2E1C29015B66017A397F170C6ECDE4A

The KMS may complain that it cannot connect to gaiad. That is fine, we will fix it in the next section.

This output indicates the validator key linked to this particular device is: cosmosvalconspub1zcjduepqy53m39prgp9dz3nz96kaav3el5e0th8ltwcf8cpavqdvpxgr5slsd6wz6f

Take note of the validator pubkey that appears in your screen. We will use it in the next section.

Gaia configuration

You need to enable KMS access by editing .gaia/config/config.toml. In this file, modify priv_validator_laddr to create a listening address/port or a unix socket in gaiad.

For example:

...
# TCP or UNIX socket address for Tendermint to listen on for
# connections from an external PrivValidator process
priv_validator_laddr = "tcp://127.0.0.1:26658"
...

Let's assume that you have set up your validator account and called it kmsval. You can tell gaiad the key that we've got in the previous section.

gaiad gentx --name kmsval --pubkey {.ValidatorKey} 

Now start gaiad. You should see that the KMS connects and receives a signature request.

Once the ledger receives the first message, it will ask for confirmation that the values are adequate.

Click the right button, if the height and round are correct.

After that, you will see that the KMS will start forwarding all signature requests to the ledger:

danger

The word TEST in the second picture, second line appears because they were taken on a pre-release version.

Once the app as been released in Ledger's app store, this word should NOT appear.

+ + + + \ No newline at end of file diff --git a/main/validators/kms/kms_ledger.html.html b/main/validators/kms/kms_ledger.html.html new file mode 100644 index 00000000000..11d0a0277e1 --- /dev/null +++ b/main/validators/kms/kms_ledger.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/validators/overview.html b/main/validators/overview.html new file mode 100644 index 00000000000..2dd67db7764 --- /dev/null +++ b/main/validators/overview.html @@ -0,0 +1,26 @@ + + + + + +Validator Overview | Cosmos Hub + + + + + + + + + + + + + + +
+

Validator Overview

Introduction

The Cosmos Hub is based on CometBFT that relies on a set of validators that are responsible for committing new blocks in the blockchain. These validators participate in the consensus protocol by broadcasting votes that contain cryptographic signatures signed by each validator's private key.

Validator candidates can bond their own ATOM and have ATOM "delegated", or staked, to them by token holders. The Cosmos Hub has 180 active validators, but over time the number of validators can be changed through governance (MaxValidators parameter). Validator voting power is determined by the total number of ATOM tokens delegated to them. Validators that do not have enough voting power to be in the top 180 are considered inactive. Inactive validators can become active if their staked amount increases so that they fall into the top 180 validators.

Validators and their delegators earn ATOM as block provisions and tokens as transaction fees through execution of the Tendermint consensus protocol. Note that validators can set a commission percentage on the fees their delegators receive as additional incentive. You can find an overview of all current validators and their voting power on Mintscan.

If validators double sign or are offline for an extended period, their staked ATOM (including ATOM of users that delegated to them) can be slashed. The penalty depends on the severity of the violation.

Hardware

For validator key management, validators must set up a physical operation that is secured with restricted access. A good starting place, for example, would be co-locating in secure data centers.

Validators are expected to equip their datacenter location with redundant power, connectivity, and storage backups. Expect to have several redundant networking boxes for fiber, firewall, and switching and then small servers with redundant hard drive and failover.

You can find the minimum hardware requirements on the instructions for joining the Cosmos Hub mainnet. As the network grows, bandwidth, CPU, and memory requirements rise. Large hard drives are recommended for storing years of blockchain history, as well as significant RAM to process the increasing amount of transactions.

Create a Validator Website

To get started as a validator, create your dedicated validator website and signal your intention to become a validator in the Interchain Discord. Posting your validator website is essential because delegators want to have information about the entity they are delegating their ATOM to.

As always, do your own research and seek legal advice if you intend to run a validator node.

Community

Discuss the finer details of being a validator on our community Discord and sign up for the Cosmos newsletter to get regular updates:

+ + + + \ No newline at end of file diff --git a/main/validators/overview.html.html b/main/validators/overview.html.html new file mode 100644 index 00000000000..9c6f4938c5f --- /dev/null +++ b/main/validators/overview.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/validators/security.html b/main/validators/security.html new file mode 100644 index 00000000000..62854378bd6 --- /dev/null +++ b/main/validators/security.html @@ -0,0 +1,26 @@ + + + + + +Validator Security | Cosmos Hub + + + + + + + + + + + + + + +
+

Validator Security

Each validator candidate is encouraged to run its operations independently, as diverse setups increase the resilience of the network. Validator candidates should commence their setup phase now in order to be on time for launch.

Key Management - HSM

It is mission critical that an attacker cannot steal a validator's key. If this is possible, it puts the entire stake delegated to the compromised validator at risk. Hardware security modules are an important strategy for mitigating this risk.

HSM modules must support ed25519 signatures for the hub. The YubiHSM2 supports ed25519 and this yubikey library is available. The YubiHSM can protect a private key but cannot ensure in a secure setting that it won't sign the same block twice.

The CometBFT team is also working on extending our Ledger Nano S application to support validator signing. This app can store recent blocks and mitigate double signing attacks.

We will update this page when more key storage solutions become available.

Sentry Nodes (DDOS Protection)

Validators are responsible for ensuring that the network can sustain denial of service attacks.

One recommended way to mitigate these risks is for validators to carefully structure their network topology in a so-called sentry node architecture.

Validator nodes should only connect to full-nodes they trust because they operate them themselves or are run by other validators they know socially. A validator node will typically run in a data center. Most data centers provide direct links to the networks of major cloud providers. The validator can use those links to connect to sentry nodes in the cloud. This shifts the burden of denial-of-service from the validator's node directly to its sentry nodes, and may require new sentry nodes be spun up or activated to mitigate attacks on existing ones.

Sentry nodes can be quickly spun up or change their IP addresses. Because the links to the sentry nodes are in private IP space, an internet based attack cannot disturb them directly. This will ensure validator block proposals and votes always make it to the rest of the network.

To setup your sentry node architecture you can follow the instructions below:

Validators nodes should edit their config.toml:

# Comma separated list of nodes to keep persistent connections to
# Do not add private peers to this list if you don't want them advertised
persistent_peers =[list of sentry nodes]

# Set true to enable the peer-exchange reactor
pex = false

Sentry Nodes should edit their config.toml:

# Comma separated list of peer IDs to keep private (will not be gossiped to other peers)
# Example ID: 3e16af0cead27979e1fc3dac57d03df3c7a77acc@3.87.179.235:26656

private_peer_ids = "node_ids_of_private_peers"

Environment Variables

By default, uppercase environment variables with the following prefixes will replace lowercase command-line flags:

  • GA (for Gaia flags)
  • TM (for Tendermint/CometBFT flags)
  • BC (for democli or basecli flags)

For example, the environment variable GA_CHAIN_ID will map to the command line flag --chain-id. Note that while explicit command-line flags will take precedence over environment variables, environment variables will take precedence over any of your configuration files. For this reason, it's imperative that you lock down your environment such that any critical parameters are defined as flags on the CLI or prevent modification of any environment variables.

+ + + + \ No newline at end of file diff --git a/main/validators/security.html.html b/main/validators/security.html.html new file mode 100644 index 00000000000..d172e872fae --- /dev/null +++ b/main/validators/security.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/validators/validator-faq.html b/main/validators/validator-faq.html new file mode 100644 index 00000000000..1ea825718b3 --- /dev/null +++ b/main/validators/validator-faq.html @@ -0,0 +1,26 @@ + + + + + +Validator FAQ | Cosmos Hub + + + + + + + + + + + + + + +
+

Validator FAQ

danger

Disclaimer

This is work in progress. Mechanisms and values are susceptible to change.

General Concepts

What is a Cosmos validator?

The Cosmos Hub is based on CometBFT that relies on a set of validators to secure the network. The role of validators is to run a full node and participate in consensus by broadcasting votes that contain cryptographic signatures signed by the validator's private key. Validators commit new blocks in the blockchain and receive revenue in exchange for their work. Validators must also participate in governance by voting on proposals. Validators are weighted according to their total stake.

What is staking?

The Cosmos Hub is a public Proof-Of-Stake (PoS) blockchain, meaning that the weight of validators is determined by the amount of staking tokens (ATOM) bonded as collateral. These ATOM tokens can be self-delegated directly by the validator or delegated to the validator by other ATOM holders.

Any user in the system can declare their intention to become a validator by sending a create-validator transaction to become validator candidates.

The weight (i.e. voting power) of a validator determines whether they are an active validator. The active validator set is limited to an amount that changes over time.

What is a full node?

A full node is a server running a chain's binary (its software) that fully validates transactions and blocks of a blockchain and keeps a full record of all historic activity. A full node is distinct from a pruned node that processes only block headers and a small subset of transactions. Running a full node requires more resources than a pruned node. Validators can decide to run either a full node or a pruned node, but they need to make sure they retain enough blocks to be able to validate new blocks.

Of course, it is possible and encouraged for users to run full nodes even if they do not plan to be validators.

You can find more details about the requirements in the Joining Mainnet Tutorial.

What is a delegator?

Delegators are ATOM holders who cannot, or do not want to, run a validator themselves. ATOM holders can delegate ATOM to a validator and obtain a part of their revenue in exchange. For details on how revenue is distributed, see What is the incentive to stake? and What are validators commission? in this document.

Because delegators share revenue with their validators, they also share risks. If a validator misbehaves, each of their delegators are partially slashed in proportion to their delegated stake. This penalty is one of the reasons why delegators must perform due diligence on validators before delegating. Spreading their stake over multiple validators is another layer of protection.

Delegators play a critical role in the system, as they are responsible for choosing validators. Being a delegator is not a passive role. Delegators must actively monitor the actions of their validators and participate in governance. For details on being a delegator, read the Delegator FAQ.

Becoming a Validator

How to become a validator?

Any participant in the network can signal that they want to become a validator by sending a create-validator transaction, where they must fill out the following parameters:

  • Validator's PubKey: The private key associated with this Tendermint/CometBFT PubKey is used to sign prevotes and precommits.
  • Validator's Address: Application level address that is used to publicly identify your validator. The private key associated with this address is used to delegate, unbond, claim rewards, and participate in governance.
  • Validator's name (moniker)
  • Validator's website (Optional)
  • Validator's description (Optional)
  • Initial commission rate: The commission rate on block rewards and fees charged to delegators.
  • Maximum commission: The maximum commission rate that this validator can charge. This parameter is fixed and cannot be changed after the create-validator transaction is processed.
  • Commission max change rate: The maximum daily increase of the validator commission. This parameter is fixed cannot be changed after the create-validator transaction is processed.

After a validator is created, ATOM holders can delegate ATOM to them, effectively adding stake to the validator's pool. The total stake of an address is the combination of ATOM bonded by delegators and ATOM self-bonded by the validator.

From all validator candidates that signaled themselves, the 180 validators with the most total stake are the designated validators. If a validator's total stake falls below the top 180, then that validator loses its validator privileges. The validator cannot participate in consensus or generate rewards until the stake is high enough to be in the top 180. Over time, the maximum number of validators may be increased via on-chain governance proposal.

Testnet

How can I join the testnet?

The testnet is a great environment to test your validator setup before launch.

Testnet participation is a great way to signal to the community that you are ready and able to operate a validator. For details, see Join the Public Testnet documentation.

Additional Concepts

What are the different types of keys?

There are two types of keys:

  • Tendermint/CometBFT key: A unique key that is used to sign consensus votes.
    • It is associated with a public key cosmosvalconspub (To get this value, run gaiad tendermint show-validator)
    • It is generated when the node is created with gaiad init.
  • Application key: This key is created from the gaiad binary and is used to sign transactions. Application keys are associated with a public key that is prefixed by cosmospub and an address that is prefixed by cosmos.

The Tendermint/CometBFT key and the application key are derived from account keys that are generated by the gaiad keys add command.

Note: A validator's operator key is directly tied to an application key and uses the cosmosvaloper and cosmosvaloperpub prefixes that are reserved solely for this purpose.

What are the different states a validator can be in?

After a validator is created with a create-validator transaction, the validator is in one of three states:

  • in validator set: Validator is in the active set and participates in consensus. The validator is earning rewards and can be slashed for misbehavior.

  • jailed: Validator misbehaved and is in jail, i.e. outside of the validator set.

    • If the jailing is due to being offline for too long (i.e. having missed more than 95% out of the last 10,000 blocks), the validator can send an unjail transaction in order to re-enter the validator set.
    • If the jailing is due to double signing, the validator cannot unjail.
  • unbonded: Validator is not in the active set, and therefore not signing blocks. The validator cannot be slashed and does not earn any reward. It is still possible to delegate ATOM to an unbonded validator. Undelegating from an unbonded validator is immediate, meaning that the tokens are not subject to the unbonding period.

What is self-delegation? How can I increase my self-delegation?

Self-delegation is a delegation of ATOM from a validator to themselves. The delegated amount can be increased by sending a delegate transaction from your validator's application application key.

What is validator bond? How can I increase my validator bond?

Validator bond is a delegation of ATOM from a delegator to a validator. Validator operators can validator bond to themselves. The validator bond amount can be increased by sending a ValidatorBond transaction from any account delegated to your validator. Validator bond is required before a validator can accept delegations from liquid staking providers. As such it forces validators to put “skin in the game” in order to be entrusted with delegations from liquid staking providers. This disincentivizes malicious behavior and enables the validator to negotiate its relationship with liquid staking providers.

Is there a minimum amount of ATOM that must be delegated to be an active (bonded) validator?

The minimum is 1 ATOM. But the network is currently secured by much higher values. You can check the minimum required ATOM to become part of the active validator set on the Mintscan validator page.

How do delegators choose their validators?

Delegators are free to choose validators according to their own subjective criteria. Selection criteria includes:

  • Amount of validator-bonded ATOM: Number of ATOM a validator validator-bonded to themselves. A validator with a higher amount of self-delegated ATOM indicates that the validator is sharing the risk and consequences for their actions, or has enough goodwill from the community so that others post validator bond on the validator's behalf.
  • Amount of delegated ATOM: Total number of ATOM delegated to a validator. A high voting power shows that the community trusts this validator. Larger validators also decrease the decentralization of the network, so delegators are suggested to consider delegating to smaller validators.
  • Commission rate: Commission applied on revenue by validators before the revenue is distributed to their delegators.
  • Track record: Delegators review the track record of the validators they plan to delegate to. This track record includes past votes on proposals and historical average uptime.
  • Community contributions: Another (more subjective) criteria is the work that validators have contributed to the community, such as educational content, participation in the community channels, contributions to open source software, etc.

Apart from these criteria, validators send a create-validator transaction to signal a website address to complete their resume. Validators must build reputation one way or another to attract delegators. For example, a good practice for validators is to have a third party audit their setup. Note though, that the CometBFT team does not approve or conduct any audits themselves. For more information on due diligence, see the A Delegator’s Guide to Staking blog post.

Responsibilities

Do validators need to be publicly identified?

No, they do not. Each delegator can value validators based on their own criteria. Validators are able to register a website address when they nominate themselves so that they can advertise their operation as they see fit. Some delegators prefer a website that clearly displays the team operating the validator and their resume, while other validators might prefer to be anonymous validators with positive track records.

What are the responsibilities of a validator?

Validators have two main responsibilities:

  • Be able to constantly run a correct version of the software: Validators must ensure that their servers are always online and their private keys are not compromised.

  • Actively participate in governance: Validators are required to vote on every proposal.

Additionally, validators are expected to be active members of the community. Validators must always be up-to-date with the current state of the ecosystem so that they can easily adapt to any change.

What does 'participate in governance' entail?

Validators and delegators on the Cosmos Hub can vote on proposals to change operational parameters (such as the block gas limit), coordinate upgrades, or make a decision on any given matter.

Validators play a special role in the governance system. As pillars of the system, validators are required to vote on every proposal. It is especially important since delegators who do not vote inherit the vote of their validator.

What does staking imply?

Staking ATOM can be thought of as a safety deposit on validation activities. When a validator or a delegator wants to retrieve part or all of their deposit, they send an unbonding transaction. Then, ATOM undergoes a 3-week unbonding period during which they are liable to being slashed for potential misbehaviors committed by the validator before the unbonding process started.

Validators, and by association delegators, receive block rewards, fees, and have the right to participate in governance. If a validator misbehaves, a certain portion of their total stake is slashed. This means that every delegator that bonded ATOM to this validator gets penalized in proportion to their bonded stake. Delegators are therefore incentivized to delegate to validators that they anticipate will function safely.

Can a validator run away with their delegators' ATOM?

By delegating to a validator, a user delegates voting power. The more voting power a validator have, the more weight they have in the consensus and governance processes. This does not mean that the validator has custody of their delegators' ATOM. A validator cannot run away with its delegator's funds.

Even though delegated funds cannot be stolen by their validators, delegators' tokens can still be slashed by a small percentage if their validator suffers a slashing event, which is why we encourage due diligence when selecting a validator.

How often is a validator chosen to propose the next block? Does frequency increase with the quantity of bonded ATOM?

The validator that is selected to propose the next block is called the proposer. Each proposer is selected deterministically. The frequency of being chosen is proportional to the voting power (i.e. amount of bonded ATOM) of the validator. For example, if the total bonded stake across all validators is 100 ATOM and a validator's total stake is 10 ATOM, then this validator is the proposer ~10% of the blocks.

Are validators of the Cosmos Hub required to validate other zones in the Cosmos ecosystem?

This depends, currently no validators are required to validate other blockchains. But when the first version of Interchain Security is launched on the Cosmos Hub, delegators can vote to have certain blockchains secured via Interchain Security. In those cases, validators are required to validate on these chains as well.

How can a validator safely quit validating on the Cosmos Hub?

If a validator simply shuts down their node, this would result in the validator and their delegators getting slashed for being offline. The only way to safely exit a validator node running on the Cosmos Hub is by unbonding the validator with the UnbondValidator message. As a result, the validator gets jailed and kicked out of the active set of validators, without getting slashed. They can then proceed to shut down their node without risking their tokens.

It's highly advised to inform your delegators when doing this, as they will still be bonded to your validator after it got jailed. They will need to manually unbond and they might not have been made aware of this via their preferred wallet application.

Incentives

What is the incentive to stake?

Each member of a validator's staking pool earns different types of revenue:

  • Block rewards: Native tokens of applications (e.g. ATOM on the Cosmos Hub) run by validators are inflated to produce block provisions. These provisions exist to incentivize ATOM holders to bond their stake. Non-bonded ATOM are diluted over time.
  • Transaction fees: The Cosmos Hub maintains an allow list of tokens that are accepted as fee payment. The initial fee token is the atom.

This total revenue is divided among validators' staking pools according to each validator's weight. Then, within each validator's staking pool the revenue is divided among delegators in proportion to each delegator's stake. A commission on delegators' revenue is applied by the validator before it is distributed.

What is a validator commission?

Revenue received by a validator's pool is split between the validator and their delegators. The validator can apply a commission on the part of the revenue that goes to their delegators. This commission is set as a percentage. Each validator is free to set their initial commission, maximum daily commission change rate, and maximum commission. The Cosmos Hub enforces the parameter that each validator sets. The maximum commission rate is fixed and cannot be changed. However, the commission rate itself can be changed after the validator is created as long as it does not exceed the maximum commission.

What is the incentive to run a validator?

Validators earn proportionally more revenue than their delegators because of the commission they take on the staking rewards from their delegators.

Validators also play a major role in governance. If a delegator does not vote, they inherit the vote from their validator. This voting inheritance gives validators a major responsibility in the ecosystem.

How are block rewards distributed?

Block rewards are distributed proportionally to all validators relative to their voting power. This means that even though each validator gains ATOM with each reward, all validators maintain equal weight over time.

For example, 10 validators have equal voting power and a commission rate of 1%. For this example, the reward for a block is 1000 ATOM and each validator has 20% of self-bonded ATOM. These tokens do not go directly to the proposer. Instead, the tokens are evenly spread among validators. So now each validator's pool has 100 ATOM. These 100 ATOM are distributed according to each participant's stake:

  • Commission: 100*80%*1% = 0.8 ATOM
  • Validator gets: 100\*20% + Commission = 20.8 ATOM
  • All delegators get: 100\*80% - Commission = 79.2 ATOM

Then, each delegator can claim their part of the 79.2 ATOM in proportion to their stake in the validator's staking pool.

How are fees distributed?

Fees are similarly distributed with the exception that the block proposer can get a bonus on the fees of the block they propose if the proposer includes more than the strict minimum of required precommits.

When a validator is selected to propose the next block, the validator must include at least 2/3 precommits of the previous block. However, an incentive to include more than 2/3 precommits is a bonus. The bonus is linear: it ranges from 1% if the proposer includes 2/3rd precommits (minimum for the block to be valid) to 5% if the proposer includes 100% precommits. Of course the proposer must not wait too long or other validators may timeout and move on to the next proposer. As such, validators have to find a balance between wait-time to get the most signatures and risk of losing out on proposing the next block. This mechanism aims to incentivize non-empty block proposals, better networking between validators, and mitigates censorship.

For a concrete example to illustrate the aforementioned concept, there are 10 validators with equal stake. Each validator applies a 1% commission rate and has 20% of self-delegated ATOM. Now comes a successful block that collects a total of 1025.51020408 ATOM in fees.

First, a 2% tax is applied. The corresponding ATOM go to the reserve pool. The reserve pool's funds can be allocated through governance to fund bounties and upgrades.

  • 2% * 1025.51020408 = 20.51020408 ATOM go to the reserve pool.

1005 ATOM now remain. For this example, the proposer included 100% of the signatures in its block so the proposer obtains the full bonus of 5%.

To solve this simple equation to find the reward R for each validator:

9*R + R + R*5% = 1005 ⇔ R = 1005/10.05 = 100

  • For the proposer validator:
    • The pool obtains R + R * 5%: 105 ATOM
    • Commission: 105 * 80% * 1% = 0.84 ATOM
    • Validator's reward: 105 * 20% + Commission = 21.84 ATOM
    • Delegators' rewards: 105 * 80% - Commission = 83.16 ATOM (each delegator is able to claim its portion of these rewards in proportion to their stake)
  • For each non-proposer validator:
    • The pool obtains R: 100 ATOM
    • Commission: 100 * 80% * 1% = 0.8 ATOM
    • Validator's reward: 100 * 20% + Commission = 20.8 ATOM
    • Delegators' rewards: 100 * 80% - Commission = 79.2 ATOM (each delegator is able to claim their portion of these rewards in proportion to their stake)

What are the slashing conditions?

If a validator misbehaves, their delegated stake is partially slashed. Two faults can result in slashing of funds for a validator and their delegators:

  • Double signing: If someone reports on chain A that a validator signed two blocks at the same height on chain A and chain B, and if chain A and chain B share a common ancestor, then this validator gets slashed by 5% on chain A.
  • Downtime: If a validator misses more than 95% of the last 10,000 blocks (roughly ~19 hours), they are slashed by 0.01%.

Are validators required to self-delegate ATOM?

No, they do not need to self-delegate. Even though there is no obligation for validators to self-delegate, delegators may want their validator to have self-delegated ATOM in their staking pool. In other words, validators share the risk.

Note however that it's possible that some validators decide to self-delegate via a different address for security reasons.

How to prevent concentration of stake in the hands of a few top validators?

The community is expected to behave in a smart and self-preserving way. When a mining pool in Bitcoin gets too much mining power the community usually stops contributing to that pool. The Cosmos Hub relies on the same effect. Additionally, when delegators switch to another validator, they are not subject to the unbonding period, which removes any barrier to quickly redelegating tokens in service of improving decentralization.

Liquid Staking Module

What is the liquid staking module?

The Liquid Staking Module is a set of safety features that mitigate liquid staking risks by:

  • limiting the total amount of tokens that can be liquid staked to X% of all staked tokens.
  • introducing a requirement that validators validator-bond tokens to be eligible for delegations from liquid staking providers.
  • limiting the portion of validators's shares that can be liquid staked to X% of their total shares.

The Liquid Staking Module also improves liquid staking UX by making delegations transferable under limited scenarios, to allow delegators to convert their delegations into liquid staking positions without having to wait the unbonding period.

For a detailed and technical description, please see ADR-061 in the Cosmos SDK or the Liquid Staking Module Cosmos Hub forum post.

Who can validator bond?

The validator themselves, but also any other address delegated to the validator.

How can I validator bond?

Once delegated to a validator, a delegator (or validator operator) can convert their delegation to a validator into Validator Bond by signing a ValidatorBond message.

The ValidatorBond message is exposed by the staking module and can be executed as follows:

gaiad tx staking validator-bond cosmosvaloper13h5xdxhsdaugwdrkusf8lkgu406h8t62jkqv3h <delegator> --from mykey  

There are no partial Validator Bonds: when a delegator or validator converts their shares to a particular validator into Validator Bond, their entire delegation to that validator is converted to Validator Bond. If a validator or delegator wishes to convert only some of their delegation to Validator Bond, they should transfer those funds to a separate address and Validator Bond from that address, or redelegate the funds that they do not wish to validator bond to another validator before converting their delegation to validator bond.

To convert Validator Bond back into a standard delegation, simply unbond the shares.

How does a delegator or validator mark their delegation as a validator bond?

Once delegated to a validator, sign a ValidatorBond message.

Are validator bonds subject to additional slashing conditions?

No, in the event of a slash, a validator bond is slashed at the same rate as a regular bond.

Can I unbond my validator bond?

If all the liquid staking capacity made available by a validator’s validator bond is utilized, validator bond delegated to that validator cannot be unbonded. If new capacity becomes available (either by redemption of liquid staking tokens or addition or new validator bond), then existing validator bond can be undelegated.

Example: Suppose the validator bond factor is 250 and Validator V bonds 2 ATOM, then liquid staking providers delegate 500 ATOM to Validator V. Now Validator V cannot remove any of their validator bond because the full liquid staking capacity made available by Validator V’s validator bond is consumed.

If liquid staking providers undelegate 250 ATOM from Validator V, Validator V can now remove 1 ATOM of validator bond.

If, instead, the ICF or a community member validator bonds 1 additional ATOM to Validator V, Validator V can now remove 1 ATOM of validator bond.

Can I validator bond some of my tokens and delegate the remaining portion normally?

The ValidatorBond message converts the full balance delegated to a validator into validator bond. To validator bond some tokens and delegate the remaining portion normally, use two addresses: the first will delegate + ValidatorBond, and the second will just delegate.

Technical Requirements

What are hardware requirements?

A modest level of hardware specifications is initially required and rises as network use increases. Participating in the testnet is the best way to learn more. You can find the current hardware recommendations in the Joining Mainnet documentation.

Validators are recommended to set up sentry nodes to protect your validator node from DDoS attacks.

What are software requirements?

In addition to running a Cosmos Hub node, validators are expected to implement monitoring, alerting, and management solutions. There are several tools that you can use.

What are bandwidth requirements?

The Cosmos network has the capacity for very high throughput relative to chains like Ethereum or Bitcoin.

We recommend that the data center nodes connect only to trusted full nodes in the cloud or other validators that know each other socially. This connection strategy relieves the data center node from the burden of mitigating denial-of-service attacks.

Ultimately, as the network becomes more heavily used, multigigabyte per day bandwidth is very realistic.

How to handle key management?

Validators are expected to run an HSM that supports ed25519 keys. Here are potential options:

  • YubiHSM 2
  • Ledger Nano S
  • Ledger BOLOS SGX enclave
  • Thales nShield support

The Interchain Foundation does not recommend one solution above the other. The community is encouraged to bolster the effort to improve HSMs and the security of key management.

What can validators expect in terms of operations?

Running an effective operation is key to avoiding unexpected unbonding or slashing. Operations must be able to respond to attacks and outages, as well as maintain security and isolation in the data center.

What are the maintenance requirements?

Validators are expected to perform regular software updates to accommodate chain upgrades and bug fixes. It is suggested to consider using Cosmovisor to partially automate this process.

During an chain upgrade, progress is discussed in a private channel in the Interchain Discord. If your validator is in the active set we encourage you to request access to that channel by contacting a moderator.

How can validators protect themselves from denial-of-service attacks?

Denial-of-service attacks occur when an attacker sends a flood of internet traffic to an IP address to prevent the server at the IP address from connecting to the internet.

An attacker scans the network, tries to learn the IP address of various validator nodes, and disconnects them from communication by flooding them with traffic.

One recommended way to mitigate these risks is for validators to carefully structure their network topology using a sentry node architecture.

Validator nodes are expected to connect only to full nodes they trust because they operate the full nodes themselves or the trust full nodes are run by other validators they know socially. A validator node is typically run in a data center. Most data centers provide direct links to the networks of major cloud providers. The validator can use those links to connect to sentry nodes in the cloud. This mitigation shifts the burden of denial-of-service from the validator's node directly to its sentry nodes, and can require that new sentry nodes are spun up or activated to mitigate attacks on existing ones.

Sentry nodes can be quickly spun up or change their IP addresses. Because the links to the sentry nodes are in private IP space, an internet-based attack cannot disturb them directly. This strategy ensures that validator block proposals and votes have a much higher chance to make it to the rest of the network.

For more sentry node details, see the CometBFT Documentation or the Sentry Node Architecture Overview on the forum.

+ + + + \ No newline at end of file diff --git a/main/validators/validator-faq.html.html b/main/validators/validator-faq.html.html new file mode 100644 index 00000000000..53390afeb3e --- /dev/null +++ b/main/validators/validator-faq.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/validators/validator-setup.html b/main/validators/validator-setup.html new file mode 100644 index 00000000000..e8157a02d2c --- /dev/null +++ b/main/validators/validator-setup.html @@ -0,0 +1,29 @@ + + + + + +Running a Validator | Cosmos Hub + + + + + + + + + + + + + + +
+

Running a Validator

tip

We suggest you try out joining a public testnet first. Information on how to join the most recent testnet can be found here.

Before setting up a validator node, make sure to have completed the Joining Mainnet guide.

If you plan to use a KMS (key management system), you should go through these steps first: Using a KMS.

What is a Validator?

Validators are responsible for committing new blocks to the blockchain through an automated voting process. A validator's stake is slashed if they become unavailable or sign blocks at the same height. Because there is a chance of slashing, we suggest you read about Sentry Node Architecture to protect your node from DDOS attacks and to ensure high-availability.

danger

If you want to become a validator for the Hub's mainnet, you should learn more about security.

The following instructions assume you have already set up a full-node and are synchronised to the latest blockheight.

Create Your Validator

Your cosmosvalconspub can be used to create a new validator by staking tokens. You can find your validator pubkey by running:

gaiad tendermint show-validator

To create your validator, just use the following command:

danger

Don't use more uatom than you have!

gaiad tx staking create-validator \
--amount=1000000uatom \
--pubkey=$(gaiad tendermint show-validator) \
--moniker="choose a moniker" \
--chain-id=<chain_id> \
--commission-rate="0.10" \
--commission-max-rate="0.20" \
--commission-max-change-rate="0.01" \
--gas="auto" \
--gas-prices="0.0025uatom" \
--from=<key_name>
tip

When specifying commission parameters, the commission-max-change-rate is used to measure % point change over the commission-rate. E.g. 1% to 2% is a 100% rate increase, but only 1 percentage point.

It's possible that you won't have enough ATOM to be part of the active set of validators in the beginning. Users are able to delegate to inactive validators (those outside of the active set) using the Keplr web app. You can confirm that you are in the validator set by using a third party explorer like Mintscan.

Edit Validator Description

You can edit your validator's public description. This info is to identify your validator, and will be relied on by delegators to decide which validators to stake to. Make sure to provide input for every flag below. If a flag is not included in the command the field will default to empty (--moniker defaults to the machine name) if the field has never been set or remain the same if it has been set in the past.

The <key_name> specifies which validator you are editing. If you choose to not include some of the flags below, remember that the --from flag must be included to identify the validator to update.

The --identity can be used as to verify identity with systems like Keybase or UPort. When using Keybase, --identity should be populated with a 16-digit string that is generated with a keybase.io account. It's a cryptographically secure method of verifying your identity across multiple online networks. The Keybase API allows us to retrieve your Keybase avatar. This is how you can add a logo to your validator profile.

gaiad tx staking edit-validator
--moniker="choose a moniker" \
--website="https://cosmos.network" \
--identity=6A0D65E29A4CBC8E \
--details="To infinity and beyond!" \
--chain-id=<chain_id> \
--gas="auto" \
--gas-prices="0.0025uatom" \
--from=<key_name> \
--commission-rate="0.10"
danger

Please note that some parameters such as commission-max-rate and commission-max-change-rate cannot be changed once your validator is up and running.

Note: The commission-rate value must adhere to the following rules:

  • Must be between 0 and the validator's commission-max-rate
  • Must not exceed the validator's commission-max-change-rate which is maximum +% point change rate per day. In other words, a validator can only change +its commission once per day and within commission-max-change-rate bounds.

View Validator Description

View the validator's information with this command:

gaiad query staking validator <account_cosmos>

Track Validator Signing Information

In order to keep track of a validator's signatures in the past you can do so by using the signing-info command:

gaiad query slashing signing-info <validator-pubkey>\
--chain-id=<chain_id>

Unjail Validator

When a validator is "jailed" for downtime, you must submit an Unjail transaction from the operator account in order to be able to get block proposer rewards again (depends on the zone fee distribution).

gaiad tx slashing unjail \
--from=<key_name> \
--chain-id=<chain_id>

Confirm Your Validator is Running

Your validator is active if the following command returns anything:

gaiad query tendermint-validator-set | grep "$(gaiad tendermint show-address)"

You should now see your validator in one of the Cosmos Hub explorers. You are looking for the bech32 encoded address in the ~/.gaia/config/priv_validator.json file.

Halting Your Validator

When attempting to perform routine maintenance or planning for an upcoming coordinated upgrade, it can be useful to have your validator systematically and gracefully halt. You can achieve this by either setting the halt-height to the height at which you want your node to shutdown or by passing the --halt-height flag to gaiad. The node will shutdown with a zero exit code at that given height after committing +the block.

Advanced configuration

You can find more advanced information about running a node or a validator on the CometBFT Core documentation.

Common Problems

Problem #1: My validator has voting_power: 0

Your validator has become jailed. Validators get jailed, i.e. get removed from the active validator set, if they do not vote on at least 500 of the last 10,000 blocks, or if they double sign.

If you got jailed for downtime, you can get your voting power back to your validator. First, if you're not using Cosmovisor and gaiad is not running, start it up again:

gaiad start

Wait for your full node to catch up to the latest block. Then, you can unjail your validator

After you have submitted the unjail transaction, check your validator again to see if your voting power is back.

gaiad status

You may notice that your voting power is less than it used to be. That's because you got slashed for downtime!

Problem #2: My gaiad crashes because of too many open files

The default number of files Linux can open (per-process) is 1024. gaiad is known to open more than 1024 files. This causes the process to crash. A quick fix is to run ulimit -n 4096 (increase the number of open files allowed) and then restarting the process with gaiad start. If you are using systemd or another process manager to launch gaiad (such as Cosmovisor) this may require some configuration at that level. A sample systemd file to fix this issue is below:

# /etc/systemd/system/gaiad.service
[Unit]
Description=Cosmos Gaia Node
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu
ExecStart=/home/ubuntu/go/bin/gaiad start
Restart=on-failure
RestartSec=3
LimitNOFILE=4096

[Install]
WantedBy=multi-user.target
+ + + + \ No newline at end of file diff --git a/main/validators/validator-setup.html.html b/main/validators/validator-setup.html.html new file mode 100644 index 00000000000..0da534b8b05 --- /dev/null +++ b/main/validators/validator-setup.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/opensearch.xml b/opensearch.xml new file mode 100644 index 00000000000..976f6446a56 --- /dev/null +++ b/opensearch.xml @@ -0,0 +1,11 @@ + + + Cosmos Hub + Search Cosmos Hub + UTF-8 + https://hub.cosmos.network/img/hub.svg + + + https://hub.cosmos.network/ + \ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 00000000000..c791c74c8a9 --- /dev/null +++ b/search.html @@ -0,0 +1,26 @@ + + + + + +Search the documentation | Cosmos Hub + + + + + + + + + + + + + + +
+

Search the documentation

+ + + + \ No newline at end of file diff --git a/search.html.html b/search.html.html new file mode 100644 index 00000000000..dd7e08a80cd --- /dev/null +++ b/search.html.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000000..b2777ef3d46 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1 @@ +https://hub.cosmos.network/searchweekly0.5https://hub.cosmos.network/mainweekly0.5https://hub.cosmos.network/main/architectureweekly0.5https://hub.cosmos.network/main/architecture/adrweekly0.5https://hub.cosmos.network/main/architecture/adr/adr-001-interchain-accountsweekly0.5https://hub.cosmos.network/main/architecture/adr/adr-002-globalfeeweekly0.5https://hub.cosmos.network/main/architecture/adr/adr-003-ica-controllerweekly0.5https://hub.cosmos.network/main/architecture/adr/PROCESSweekly0.5https://hub.cosmos.network/main/architecture/PROCESSweekly0.5https://hub.cosmos.network/main/architecture/templates/adr-templateweekly0.5https://hub.cosmos.network/main/delegatorsweekly0.5https://hub.cosmos.network/main/delegators/delegator-faqweekly0.5https://hub.cosmos.network/main/delegators/delegator-guide-cliweekly0.5https://hub.cosmos.network/main/delegators/delegator-securityweekly0.5https://hub.cosmos.network/main/getting-startedweekly0.5https://hub.cosmos.network/main/getting-started/installationweekly0.5https://hub.cosmos.network/main/getting-started/quickstartweekly0.5https://hub.cosmos.network/main/getting-started/system-requirementsweekly0.5https://hub.cosmos.network/main/getting-started/what-is-gaiaweekly0.5https://hub.cosmos.network/main/governanceweekly0.5https://hub.cosmos.network/main/governance/best-practicesweekly0.5https://hub.cosmos.network/main/governance/formattingweekly0.5https://hub.cosmos.network/main/governance/processweekly0.5https://hub.cosmos.network/main/governance/proposal-typesweekly0.5https://hub.cosmos.network/main/governance/proposal-types/community-pool-spendweekly0.5https://hub.cosmos.network/main/governance/proposal-types/param-changeweekly0.5https://hub.cosmos.network/main/governance/proposal-types/software-upgradeweekly0.5https://hub.cosmos.network/main/governance/proposal-types/text-propweekly0.5https://hub.cosmos.network/main/governance/submittingweekly0.5https://hub.cosmos.network/main/hub-tutorialsweekly0.5https://hub.cosmos.network/main/hub-tutorials/gaiadweekly0.5https://hub.cosmos.network/main/hub-tutorials/join-mainnetweekly0.5https://hub.cosmos.network/main/hub-tutorials/join-testnetweekly0.5https://hub.cosmos.network/main/hub-tutorials/live-upgrade-tutorialweekly0.5https://hub.cosmos.network/main/hub-tutorials/upgrade-nodeweekly0.5https://hub.cosmos.network/main/interchain-securityweekly0.5https://hub.cosmos.network/main/modulesweekly0.5https://hub.cosmos.network/main/modules/lsm-stakingweekly0.5https://hub.cosmos.network/main/modules/metaprotocolsweekly0.5https://hub.cosmos.network/main/resourcesweekly0.5https://hub.cosmos.network/main/resources/archivesweekly0.5https://hub.cosmos.network/main/resources/genesisweekly0.5https://hub.cosmos.network/main/resources/hd-walletsweekly0.5https://hub.cosmos.network/main/resources/ledgerweekly0.5https://hub.cosmos.network/main/resources/reproducible-buildsweekly0.5https://hub.cosmos.network/main/resources/service-providersweekly0.5https://hub.cosmos.network/main/validatorsweekly0.5https://hub.cosmos.network/main/validators/kmsweekly0.5https://hub.cosmos.network/main/validators/kms/kms_ledgerweekly0.5https://hub.cosmos.network/main/validators/overviewweekly0.5https://hub.cosmos.network/main/validators/securityweekly0.5https://hub.cosmos.network/main/validators/validator-faqweekly0.5https://hub.cosmos.network/main/validators/validator-setupweekly0.5https://hub.cosmos.network/weekly0.5 \ No newline at end of file